Merge branch 'custom-exit-code'

Closes #466
This commit is contained in:
Daniel Eklöf 2021-05-04 10:44:34 +02:00
commit c7a149a7ea
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
6 changed files with 57 additions and 21 deletions

View file

@ -51,6 +51,12 @@
* Point values in `line-height`, `letter-spacing`, * Point values in `line-height`, `letter-spacing`,
`horizontal-letter-offset` and `vertical-letter-offset` are now `horizontal-letter-offset` and `vertical-letter-offset` are now
rounded, not truncated, when translated to pixel values. rounded, not truncated, when translated to pixel values.
* Foots exit code is now -26/230 when foot itself failed to launch
(due to invalid command line options, client application/shell not
found etc). Footclients exit code is -36/220 when it itself fails
to launch (e.g. bad command line option) and -26/230 when the foot
server failed to instantiate a new window
(https://codeberg.org/dnkl/foot/issues/466).
### Deprecated ### Deprecated

View file

@ -69,7 +69,10 @@ print_usage(const char *prog_name)
int int
main(int argc, char *const *argv) main(int argc, char *const *argv)
{ {
int ret = EXIT_FAILURE; /* Custom exit code, to enable users to differentiate between foot
* itself failing, and the client application failiing */
static const int foot_exit_failure = -36;
int ret = foot_exit_failure;
const char *const prog_name = argv[0]; const char *const prog_name = argv[0];
@ -135,7 +138,7 @@ main(int argc, char *const *argv)
struct stat st; struct stat st;
if (stat(optarg, &st) < 0 || !(st.st_mode & S_IFDIR)) { if (stat(optarg, &st) < 0 || !(st.st_mode & S_IFDIR)) {
fprintf(stderr, "error: %s: not a directory\n", optarg); fprintf(stderr, "error: %s: not a directory\n", optarg);
return EXIT_FAILURE; return ret;
} }
custom_cwd = optarg; custom_cwd = optarg;
break; break;
@ -144,7 +147,7 @@ main(int argc, char *const *argv)
case 'w': case 'w':
if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) {
fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg); fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg);
return EXIT_FAILURE; return ret;
} }
size_type = 0; // CONF_SIZE_PX size_type = 0; // CONF_SIZE_PX
break; break;
@ -152,7 +155,7 @@ main(int argc, char *const *argv)
case 'W': case 'W':
if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) {
fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg); fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg);
return EXIT_FAILURE; return ret;
} }
size_type = 1; // CONF_SIZE_CELLS size_type = 1; // CONF_SIZE_CELLS
break; break;
@ -187,7 +190,7 @@ main(int argc, char *const *argv)
"-d,--log-level: %s: argument must be one of %s\n", "-d,--log-level: %s: argument must be one of %s\n",
optarg, optarg,
log_level_string_hint()); log_level_string_hint());
return EXIT_FAILURE; return ret;
} }
log_level = lvl; log_level = lvl;
break; break;
@ -202,7 +205,7 @@ main(int argc, char *const *argv)
log_colorize = LOG_COLORIZE_ALWAYS; log_colorize = LOG_COLORIZE_ALWAYS;
else { else {
fprintf(stderr, "%s: argument must be one of 'never', 'always' or 'auto'\n", optarg); fprintf(stderr, "%s: argument must be one of 'never', 'always' or 'auto'\n", optarg);
return EXIT_FAILURE; return ret;
} }
break; break;
@ -215,7 +218,7 @@ main(int argc, char *const *argv)
return EXIT_SUCCESS; return EXIT_SUCCESS;
case '?': case '?':
return EXIT_FAILURE; return ret;
} }
} }
@ -373,6 +376,8 @@ main(int argc, char *const *argv)
int exit_code; int exit_code;
ssize_t rcvd = recv(fd, &exit_code, sizeof(exit_code), 0); ssize_t rcvd = recv(fd, &exit_code, sizeof(exit_code), 0);
LOG_INFO("exit-code=%d", exit_code);
if (rcvd == -1 && errno == EINTR) if (rcvd == -1 && errno == EINTR)
xassert(aborted); xassert(aborted);
else if (rcvd != sizeof(exit_code)) else if (rcvd != sizeof(exit_code))

View file

@ -28,7 +28,7 @@ the foot command line
*-C*,*--check-config* *-C*,*--check-config*
Verify configuration and then exit with 0 if ok, otherwise exit Verify configuration and then exit with 0 if ok, otherwise exit
with 1. with 230 (see *EXIT STATUS*).
*-f*,*--font*=_FONT_ *-f*,*--font*=_FONT_
Comma separated list of fonts to use, in fontconfig format (see Comma separated list of fonts to use, in fontconfig format (see
@ -136,6 +136,13 @@ the foot command line
*-v*,*--version* *-v*,*--version*
Show the version number and quit. Show the version number and quit.
# EXIT STATUS
Foot will exit with code 230 if there is a failure in foot itself.
In all other cases, the exit code is that of the client application
(i.e. the shell).
# KEYBOARD SHORTCUTS # KEYBOARD SHORTCUTS
The following keyboard shortcuts are available. The following keyboard shortcuts are available.

View file

@ -17,8 +17,8 @@ mode.
Running it without arguments will open a new terminal window (hosted Running it without arguments will open a new terminal window (hosted
in the foot server), with your default shell. The exit code will be in the foot server), with your default shell. The exit code will be
that of the terminal (thus, *footclient* does not exit until the that of the terminal. I.e *footclient* does not exit until the
terminal has terminated). terminal has terminated.
# OPTIONS # OPTIONS
@ -74,6 +74,20 @@ terminal has terminated).
*-v*,*--version* *-v*,*--version*
Show the version number and quit Show the version number and quit
# EXIT STATUS
Footlient will exit with code 220 if there is a failure in footclient
itself (for example, the server socket does not exist).
If *-N*,*--no-wait* is used, footclient exits with code 0 as soon as
the foot server has been instructed to open a new window.
If not, footclient may also exit with code 230. This indicates a
failure in the foot server.
In all other cases the exit code is that of the client application
(i.e. the shell).
# SEE ALSO # SEE ALSO
*foot*(1) *foot*(1)

22
main.c
View file

@ -151,7 +151,10 @@ print_pid(const char *pid_file, bool *unlink_at_exit)
int int
main(int argc, char *const *argv) main(int argc, char *const *argv)
{ {
int ret = EXIT_FAILURE; /* Custom exit code, to enable users to differentiate between foot
* itself failing, and the client application failiing */
static const int foot_exit_failure = -26;
int ret = foot_exit_failure;
/* Startup notifications; we don't support it, but must ensure we /* Startup notifications; we don't support it, but must ensure we
* don't pass this on to programs launched by us */ * don't pass this on to programs launched by us */
@ -242,7 +245,7 @@ main(int argc, char *const *argv)
struct stat st; struct stat st;
if (stat(optarg, &st) < 0 || !(st.st_mode & S_IFDIR)) { if (stat(optarg, &st) < 0 || !(st.st_mode & S_IFDIR)) {
fprintf(stderr, "error: %s: not a directory\n", optarg); fprintf(stderr, "error: %s: not a directory\n", optarg);
return EXIT_FAILURE; return ret;
} }
custom_cwd = optarg; custom_cwd = optarg;
break; break;
@ -274,7 +277,7 @@ main(int argc, char *const *argv)
unsigned width, height; unsigned width, height;
if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) {
fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg); fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg);
return EXIT_FAILURE; return ret;
} }
conf_size_type = CONF_SIZE_PX; conf_size_type = CONF_SIZE_PX;
@ -287,7 +290,7 @@ main(int argc, char *const *argv)
unsigned width, height; unsigned width, height;
if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) {
fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg); fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg);
return EXIT_FAILURE; return ret;
} }
conf_size_type = CONF_SIZE_CELLS; conf_size_type = CONF_SIZE_CELLS;
@ -332,7 +335,7 @@ main(int argc, char *const *argv)
"-d,--log-level: %s: argument must be one of %s\n", "-d,--log-level: %s: argument must be one of %s\n",
optarg, optarg,
log_level_string_hint()); log_level_string_hint());
return EXIT_FAILURE; return ret;
} }
log_level = lvl; log_level = lvl;
break; break;
@ -347,7 +350,7 @@ main(int argc, char *const *argv)
log_colorize = LOG_COLORIZE_ALWAYS; log_colorize = LOG_COLORIZE_ALWAYS;
else { else {
fprintf(stderr, "%s: argument must be one of 'never', 'always' or 'auto'\n", optarg); fprintf(stderr, "%s: argument must be one of 'never', 'always' or 'auto'\n", optarg);
return EXIT_FAILURE; return ret;
} }
break; break;
@ -364,7 +367,7 @@ main(int argc, char *const *argv)
return EXIT_SUCCESS; return EXIT_SUCCESS;
case '?': case '?':
return EXIT_FAILURE; return ret;
} }
} }
@ -464,7 +467,7 @@ main(int argc, char *const *argv)
struct renderer *renderer = NULL; struct renderer *renderer = NULL;
struct terminal *term = NULL; struct terminal *term = NULL;
struct server *server = NULL; struct server *server = NULL;
struct shutdown_context shutdown_ctx = {.term = &term, .exit_code = EXIT_FAILURE}; struct shutdown_context shutdown_ctx = {.term = &term, .exit_code = foot_exit_failure};
const char *cwd = custom_cwd; const char *cwd = custom_cwd;
char *_cwd = NULL; char *_cwd = NULL;
@ -533,7 +536,8 @@ main(int argc, char *const *argv)
break; break;
} }
ret = aborted || tll_length(wayl->terms) == 0 ? EXIT_SUCCESS : EXIT_FAILURE; if (aborted || tll_length(wayl->terms) == 0)
ret = EXIT_SUCCESS;
out: out:
free(_cwd); free(_cwd);

View file

@ -312,7 +312,7 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
if (instance->terminal == NULL) { if (instance->terminal == NULL) {
LOG_ERR("failed to instantiate new terminal"); LOG_ERR("failed to instantiate new terminal");
client_send_exit_code(client, -1); client_send_exit_code(client, -26);
instance_destroy(instance, -1); instance_destroy(instance, -1);
goto shutdown; goto shutdown;
} }
@ -497,7 +497,7 @@ server_destroy(struct server *server)
tll_length(server->clients)); tll_length(server->clients));
tll_foreach(server->clients, it) { tll_foreach(server->clients, it) {
client_send_exit_code(it->item, 1); client_send_exit_code(it->item, -26);
client_destroy(it->item); client_destroy(it->item);
} }