Correctly exit sway on errors.
Calling `exit` in sway_terminate prevents sway from correctly shutting down (freeing data, cleanly terminating the ipc server, etc.). A better way is to exit straight away if the failure occurs before `wlc_run` and use sway_abort as usual if it occur when wlc is running.
This commit is contained in:
parent
40b3215444
commit
5e253fdd9a
|
@ -58,7 +58,7 @@ void sway_abort(const char *format, ...) {
|
||||||
vfprintf(stderr, format, args);
|
vfprintf(stderr, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
sway_terminate();
|
sway_terminate(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef _SWAY_SWAY_H
|
#ifndef _SWAY_SWAY_H
|
||||||
#define _SWAY_SWAY_H
|
#define _SWAY_SWAY_H
|
||||||
|
|
||||||
void sway_terminate(void);
|
void sway_terminate(int exit_code);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -450,7 +450,7 @@ static struct cmd_results *cmd_exit(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
// Close all views
|
// Close all views
|
||||||
close_views(&root_container);
|
close_views(&root_container);
|
||||||
sway_terminate();
|
sway_terminate(EXIT_SUCCESS);
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
18
sway/main.c
18
sway/main.c
|
@ -21,16 +21,17 @@
|
||||||
#include "sway.h"
|
#include "sway.h"
|
||||||
|
|
||||||
static bool terminate_request = false;
|
static bool terminate_request = false;
|
||||||
|
static int exit_value = 0;
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void sway_terminate(int exit_code) {
|
||||||
terminate_request = true;
|
terminate_request = true;
|
||||||
|
exit_value = exit_code;
|
||||||
wlc_terminate();
|
wlc_terminate();
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sig_handler(int signal) {
|
void sig_handler(int signal) {
|
||||||
close_views(&root_container);
|
close_views(&root_container);
|
||||||
sway_terminate();
|
sway_terminate(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wlc_log_handler(enum wlc_log_type type, const char *str) {
|
static void wlc_log_handler(enum wlc_log_type type, const char *str) {
|
||||||
|
@ -150,16 +151,19 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
if (optind < argc) { // Behave as IPC client
|
if (optind < argc) { // Behave as IPC client
|
||||||
if(optind != 1) {
|
if(optind != 1) {
|
||||||
sway_abort("Don't use options with the IPC client");
|
sway_log(L_ERROR, "Don't use options with the IPC client");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
if (getuid() != geteuid() || getgid() != getegid()) {
|
if (getuid() != geteuid() || getgid() != getegid()) {
|
||||||
if (setgid(getgid()) != 0 || setuid(getuid()) != 0) {
|
if (setgid(getgid()) != 0 || setuid(getuid()) != 0) {
|
||||||
sway_abort("Unable to drop root");
|
sway_log(L_ERROR, "Unable to drop root");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
char *socket_path = getenv("SWAYSOCK");
|
char *socket_path = getenv("SWAYSOCK");
|
||||||
if (!socket_path) {
|
if (!socket_path) {
|
||||||
sway_abort("Unable to retrieve socket path");
|
sway_log(L_ERROR, "Unable to retrieve socket path");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
char *command = join_args(argv + optind, argc - optind);
|
char *command = join_args(argv + optind, argc - optind);
|
||||||
run_as_ipc_client(command, socket_path);
|
run_as_ipc_client(command, socket_path);
|
||||||
|
@ -224,6 +228,6 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
ipc_terminate();
|
ipc_terminate();
|
||||||
|
|
||||||
return 0;
|
return exit_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
/* global bar state */
|
/* global bar state */
|
||||||
struct bar swaybar;
|
struct bar swaybar;
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void sway_terminate(int exit_code) {
|
||||||
bar_teardown(&swaybar);
|
bar_teardown(&swaybar);
|
||||||
exit(EXIT_FAILURE);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sig_handler(int signal) {
|
void sig_handler(int signal) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ enum scaling_mode {
|
||||||
SCALING_MODE_TILE,
|
SCALING_MODE_TILE,
|
||||||
};
|
};
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void sway_terminate(int exit_code) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < surfaces->length; ++i) {
|
for (i = 0; i < surfaces->length; ++i) {
|
||||||
struct window *window = surfaces->items[i];
|
struct window *window = surfaces->items[i];
|
||||||
|
@ -29,7 +29,7 @@ void sway_terminate(void) {
|
||||||
}
|
}
|
||||||
list_free(surfaces);
|
list_free(surfaces);
|
||||||
registry_teardown(registry);
|
registry_teardown(registry);
|
||||||
exit(EXIT_FAILURE);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv) {
|
int main(int argc, const char **argv) {
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
#include "ipc-client.h"
|
#include "ipc-client.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void sway_terminate(int exit_code) {
|
||||||
exit(EXIT_FAILURE);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void grab_and_apply_magick(const char *file, const char *output,
|
void grab_and_apply_magick(const char *file, const char *output,
|
||||||
|
|
|
@ -24,7 +24,7 @@ enum scaling_mode {
|
||||||
SCALING_MODE_TILE,
|
SCALING_MODE_TILE,
|
||||||
};
|
};
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void sway_terminate(int exit_code) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < surfaces->length; ++i) {
|
for (i = 0; i < surfaces->length; ++i) {
|
||||||
struct window *window = surfaces->items[i];
|
struct window *window = surfaces->items[i];
|
||||||
|
@ -32,7 +32,7 @@ void sway_terminate(void) {
|
||||||
}
|
}
|
||||||
list_free(surfaces);
|
list_free(surfaces);
|
||||||
registry_teardown(registry);
|
registry_teardown(registry);
|
||||||
exit(EXIT_FAILURE);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *password;
|
char *password;
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
#include "readline.h"
|
#include "readline.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void sway_terminate(int exit_code) {
|
||||||
exit(EXIT_FAILURE);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
Loading…
Reference in a new issue