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:
Mikkel Oscar Lyderik 2016-02-26 09:08:05 +01:00
parent 40b3215444
commit 5e253fdd9a
9 changed files with 24 additions and 20 deletions

View file

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

View file

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

View file

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

View file

@ -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;
} }

View file

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

View file

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

View file

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

View file

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

View file

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