From a1b41bd186147f3f028030e9079821d0bfa7b3f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 30 Apr 2021 22:47:16 +0200 Subject: [PATCH 1/3] foot/footclient: use a custom exit code when foot/footclient fail to run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Normally, foot and footclient uses the exit code from the client application (i.e. the shell). However, foot (or footclient) itself may fail to run; if run outside of a Wayland session, or no fonts are installed, or the client application/shell cannot be found (“foot lsdjfldsjf”) etc. Up until now, there has been no way to differentiate these kind of failures from the client application exiting with code 1. This patch changes foot’s failure exit code to -27/229, and footclient’s to -28/228. Note that footclient will exit with foot’s -27/229 if footclient ran successfully, but the foot server failed to instantiate a new window. Closes #466. --- CHANGELOG.md | 6 ++++++ client.c | 19 ++++++++++++------- main.c | 22 +++++++++++++--------- server.c | 4 ++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fce1af5..5dbe40e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,12 @@ * Point values in `line-height`, `letter-spacing`, `horizontal-letter-offset` and `vertical-letter-offset` are now rounded, not truncated, when translated to pixel values. +* Foot’s exit code is now -27/229 when foot itself failed to launch + (due to invalid command line options, client application/shell not + found etc). Footclient’s exit code is -28/228 when it itself fails + to launch (e.g. bad command line option) and -27/229 when the foot + server failed to instantiate a new window + (https://codeberg.org/dnkl/foot/issues/466). ### Deprecated diff --git a/client.c b/client.c index 93dcc666..388f816e 100644 --- a/client.c +++ b/client.c @@ -69,7 +69,10 @@ print_usage(const char *prog_name) int 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 = -28; + int ret = foot_exit_failure; const char *const prog_name = argv[0]; @@ -135,7 +138,7 @@ main(int argc, char *const *argv) struct stat st; if (stat(optarg, &st) < 0 || !(st.st_mode & S_IFDIR)) { fprintf(stderr, "error: %s: not a directory\n", optarg); - return EXIT_FAILURE; + return ret; } custom_cwd = optarg; break; @@ -144,7 +147,7 @@ main(int argc, char *const *argv) case 'w': if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg); - return EXIT_FAILURE; + return ret; } size_type = 0; // CONF_SIZE_PX break; @@ -152,7 +155,7 @@ main(int argc, char *const *argv) case 'W': if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg); - return EXIT_FAILURE; + return ret; } size_type = 1; // CONF_SIZE_CELLS break; @@ -187,7 +190,7 @@ main(int argc, char *const *argv) "-d,--log-level: %s: argument must be one of %s\n", optarg, log_level_string_hint()); - return EXIT_FAILURE; + return ret; } log_level = lvl; break; @@ -202,7 +205,7 @@ main(int argc, char *const *argv) log_colorize = LOG_COLORIZE_ALWAYS; else { fprintf(stderr, "%s: argument must be one of 'never', 'always' or 'auto'\n", optarg); - return EXIT_FAILURE; + return ret; } break; @@ -215,7 +218,7 @@ main(int argc, char *const *argv) return EXIT_SUCCESS; case '?': - return EXIT_FAILURE; + return ret; } } @@ -373,6 +376,8 @@ main(int argc, char *const *argv) int exit_code; ssize_t rcvd = recv(fd, &exit_code, sizeof(exit_code), 0); + LOG_INFO("exit-code=%d", exit_code); + if (rcvd == -1 && errno == EINTR) xassert(aborted); else if (rcvd != sizeof(exit_code)) diff --git a/main.c b/main.c index 19c1904b..573cb0a1 100644 --- a/main.c +++ b/main.c @@ -151,7 +151,10 @@ print_pid(const char *pid_file, bool *unlink_at_exit) int 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 = -27; + int ret = foot_exit_failure; /* Startup notifications; we don't support it, but must ensure we * don't pass this on to programs launched by us */ @@ -242,7 +245,7 @@ main(int argc, char *const *argv) struct stat st; if (stat(optarg, &st) < 0 || !(st.st_mode & S_IFDIR)) { fprintf(stderr, "error: %s: not a directory\n", optarg); - return EXIT_FAILURE; + return ret; } custom_cwd = optarg; break; @@ -274,7 +277,7 @@ main(int argc, char *const *argv) unsigned width, height; if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg); - return EXIT_FAILURE; + return ret; } conf_size_type = CONF_SIZE_PX; @@ -287,7 +290,7 @@ main(int argc, char *const *argv) unsigned width, height; if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg); - return EXIT_FAILURE; + return ret; } 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", optarg, log_level_string_hint()); - return EXIT_FAILURE; + return ret; } log_level = lvl; break; @@ -347,7 +350,7 @@ main(int argc, char *const *argv) log_colorize = LOG_COLORIZE_ALWAYS; else { fprintf(stderr, "%s: argument must be one of 'never', 'always' or 'auto'\n", optarg); - return EXIT_FAILURE; + return ret; } break; @@ -364,7 +367,7 @@ main(int argc, char *const *argv) return EXIT_SUCCESS; case '?': - return EXIT_FAILURE; + return ret; } } @@ -464,7 +467,7 @@ main(int argc, char *const *argv) struct renderer *renderer = NULL; struct terminal *term = 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; char *_cwd = NULL; @@ -533,7 +536,8 @@ main(int argc, char *const *argv) break; } - ret = aborted || tll_length(wayl->terms) == 0 ? EXIT_SUCCESS : EXIT_FAILURE; + if (aborted || tll_length(wayl->terms) == 0) + ret = EXIT_SUCCESS; out: free(_cwd); diff --git a/server.c b/server.c index 2d813ab2..6a86bae2 100644 --- a/server.c +++ b/server.c @@ -312,7 +312,7 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data) if (instance->terminal == NULL) { LOG_ERR("failed to instantiate new terminal"); - client_send_exit_code(client, -1); + client_send_exit_code(client, -27); instance_destroy(instance, -1); goto shutdown; } @@ -497,7 +497,7 @@ server_destroy(struct server *server) tll_length(server->clients)); tll_foreach(server->clients, it) { - client_send_exit_code(it->item, 1); + client_send_exit_code(it->item, -27); client_destroy(it->item); } From da923100cad1000252c87b02a4132ce5878a28ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 1 May 2021 10:46:40 +0200 Subject: [PATCH 2/3] main/client: change exit code * foot exits with -26/230 * footclient exits with -36/220 This is to give each application a range of exit codes. Currently unused, but we may want to change this in the future. --- CHANGELOG.md | 6 +++--- client.c | 2 +- main.c | 2 +- server.c | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dbe40e3..7ec26157 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,10 +51,10 @@ * Point values in `line-height`, `letter-spacing`, `horizontal-letter-offset` and `vertical-letter-offset` are now rounded, not truncated, when translated to pixel values. -* Foot’s exit code is now -27/229 when foot itself failed to launch +* Foot’s exit code is now -26/230 when foot itself failed to launch (due to invalid command line options, client application/shell not - found etc). Footclient’s exit code is -28/228 when it itself fails - to launch (e.g. bad command line option) and -27/229 when the foot + found etc). Footclient’s 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). diff --git a/client.c b/client.c index 388f816e..1445146c 100644 --- a/client.c +++ b/client.c @@ -71,7 +71,7 @@ main(int argc, char *const *argv) { /* Custom exit code, to enable users to differentiate between foot * itself failing, and the client application failiing */ - static const int foot_exit_failure = -28; + static const int foot_exit_failure = -36; int ret = foot_exit_failure; const char *const prog_name = argv[0]; diff --git a/main.c b/main.c index 573cb0a1..82795424 100644 --- a/main.c +++ b/main.c @@ -153,7 +153,7 @@ main(int argc, char *const *argv) { /* Custom exit code, to enable users to differentiate between foot * itself failing, and the client application failiing */ - static const int foot_exit_failure = -27; + static const int foot_exit_failure = -26; int ret = foot_exit_failure; /* Startup notifications; we don't support it, but must ensure we diff --git a/server.c b/server.c index 6a86bae2..1b33ee23 100644 --- a/server.c +++ b/server.c @@ -312,7 +312,7 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data) if (instance->terminal == NULL) { LOG_ERR("failed to instantiate new terminal"); - client_send_exit_code(client, -27); + client_send_exit_code(client, -26); instance_destroy(instance, -1); goto shutdown; } @@ -497,7 +497,7 @@ server_destroy(struct server *server) tll_length(server->clients)); tll_foreach(server->clients, it) { - client_send_exit_code(it->item, -27); + client_send_exit_code(it->item, -26); client_destroy(it->item); } From 1cbbb62da04d8d600292166818e6356a38cc765c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 1 May 2021 10:58:35 +0200 Subject: [PATCH 3/3] doc: foot.1 footclient.1: document exit status --- doc/foot.1.scd | 9 ++++++++- doc/footclient.1.scd | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/doc/foot.1.scd b/doc/foot.1.scd index 9b5079b8..8c7bf901 100644 --- a/doc/foot.1.scd +++ b/doc/foot.1.scd @@ -28,7 +28,7 @@ the foot command line *-C*,*--check-config* Verify configuration and then exit with 0 if ok, otherwise exit - with 1. + with 230 (see *EXIT STATUS*). *-f*,*--font*=_FONT_ Comma separated list of fonts to use, in fontconfig format (see @@ -136,6 +136,13 @@ the foot command line *-v*,*--version* 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 The following keyboard shortcuts are available. diff --git a/doc/footclient.1.scd b/doc/footclient.1.scd index 900668a2..fcd2f5d1 100644 --- a/doc/footclient.1.scd +++ b/doc/footclient.1.scd @@ -17,8 +17,8 @@ mode. Running it without arguments will open a new terminal window (hosted in the foot server), with your default shell. The exit code will be -that of the terminal (thus, *footclient* does not exit until the -terminal has terminated). +that of the terminal. I.e *footclient* does not exit until the +terminal has terminated. # OPTIONS @@ -74,6 +74,20 @@ terminal has terminated). *-v*,*--version* 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 *foot*(1)