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`,
`horizontal-letter-offset` and `vertical-letter-offset` are now
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

View file

@ -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 = -36;
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))

View file

@ -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.

View file

@ -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)

22
main.c
View file

@ -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 = -26;
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);

View file

@ -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, -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, 1);
client_send_exit_code(it->item, -26);
client_destroy(it->item);
}