From: Max Kellermann Date: Sun, 19 Mar 2017 10:18:16 +0000 (+0100) Subject: main: move signal handlers to signals.c X-Git-Tag: v0.26~27 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=b59430bcbb26fe16f67ebec69a5d062762278ef0;p=ncmpc.git main: move signal handlers to signals.c --- diff --git a/Makefile.am b/Makefile.am index 5793efb..cc8431b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -73,6 +73,8 @@ noinst_DATA = src/win/ncmpc_win32_rc.rc src_ncmpc_DEPENDENCIES = src/win/ncmpc_win32_rc.$(OBJEXT) src_ncmpc_LDFLAGS = -Wl,src/win/ncmpc_win32_rc.$(OBJEXT) +else +src_ncmpc_SOURCES += src/signals.c src/signals.h endif if NCMPC_MINI diff --git a/src/main.c b/src/main.c index 214478e..c242da9 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ #include "player_command.h" #include "keyboard.h" #include "lirc.h" +#include "signals.h" #ifndef NCMPC_MINI #include "conf.h" @@ -44,10 +45,6 @@ #include -#ifndef WIN32 -#include -#endif - #include #include #include @@ -66,7 +63,6 @@ static const guint update_interval = 500; static struct mpdclient *mpd = NULL; static GMainLoop *main_loop; static guint reconnect_source_id, update_source_id; -static int sigwinch_pipes[2]; #ifndef NCMPC_MINI static guint check_key_bindings_source_id; @@ -92,37 +88,6 @@ update_xterm_title(void) } #endif -#ifndef WIN32 -static gboolean -handle_quit_signal(gcc_unused gpointer data) -{ - g_main_loop_quit(main_loop); - return false; -} - -static gboolean -sigwinch_event(gcc_unused GIOChannel *source, - gcc_unused GIOCondition condition, gcc_unused gpointer data) -{ - char ignoreme[64]; - if (1 > read(sigwinch_pipes[0], ignoreme, 64)) - exit(EXIT_FAILURE); - - endwin(); - refresh(); - screen_resize(mpd); - - return TRUE; -} - -static void -catch_sigwinch(gcc_unused int sig) -{ - if (1 != write(sigwinch_pipes[1], "", 1)) - exit(EXIT_FAILURE); -} -#endif /* WIN32 */ - static gboolean timer_mpd_update(gpointer data); @@ -451,42 +416,6 @@ main(int argc, const char *argv[]) /* parse command line options - 2 pass */ options_parse(argc, argv); -#ifndef WIN32 - /* setup quit signals */ - g_unix_signal_add(SIGTERM, handle_quit_signal, NULL); - g_unix_signal_add(SIGINT, handle_quit_signal, NULL); - g_unix_signal_add(SIGHUP, handle_quit_signal, NULL); - - /* setup signal behavior - SIGCONT */ - - struct sigaction act; - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - - act.sa_handler = catch_sigwinch; - if (sigaction(SIGCONT, &act, NULL) < 0) { - perror("sigaction(SIGCONT)"); - exit(EXIT_FAILURE); - } - - /* setup SIGWINCH */ - - act.sa_flags = SA_RESTART; - act.sa_handler = catch_sigwinch; - if (sigaction(SIGWINCH, &act, NULL) < 0) { - perror("sigaction(SIGWINCH)"); - exit(EXIT_FAILURE); - } - - /* ignore SIGPIPE */ - - act.sa_handler = SIG_IGN; - if (sigaction(SIGPIPE, &act, NULL) < 0) { - perror("sigaction(SIGPIPE)"); - exit(EXIT_FAILURE); - } -#endif - ncu_init(); #ifdef ENABLE_LYRICS_SCREEN @@ -508,18 +437,7 @@ main(int argc, const char *argv[]) /* watch out for lirc input */ ncmpc_lirc_init(); -#ifndef WIN32 - if (!pipe(sigwinch_pipes) && - !fcntl(sigwinch_pipes[1], F_SETFL, O_NONBLOCK)) { - GIOChannel *sigwinch_channel = g_io_channel_unix_new(sigwinch_pipes[0]); - g_io_add_watch(sigwinch_channel, G_IO_IN, sigwinch_event, NULL); - g_io_channel_unref(sigwinch_channel); - } - else { - perror("sigwinch pipe creation failed"); - exit(EXIT_FAILURE); - } -#endif + signals_init(main_loop, mpd); /* attempt to connect */ reconnect_source_id = g_timeout_add(1, timer_reconnect, NULL); @@ -549,9 +467,7 @@ main(int argc, const char *argv[]) g_source_remove(check_key_bindings_source_id); #endif - close(sigwinch_pipes[0]); - close(sigwinch_pipes[1]); - + signals_deinit(); ncmpc_lirc_deinit(); screen_exit(); diff --git a/src/signals.c b/src/signals.c new file mode 100644 index 0000000..cc24e7d --- /dev/null +++ b/src/signals.c @@ -0,0 +1,119 @@ +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2017 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "signals.h" +#include "screen.h" +#include "Compiler.h" + +#include + +#include + +static int sigwinch_pipes[2]; + +static gboolean +handle_quit_signal(gpointer data) +{ + GMainLoop *main_loop = data; + + g_main_loop_quit(main_loop); + return false; +} + +static gboolean +sigwinch_event(gcc_unused GIOChannel *source, + gcc_unused GIOCondition condition, gpointer data) +{ + struct mpdclient *c = data; + + char ignoreme[64]; + if (1 > read(sigwinch_pipes[0], ignoreme, 64)) + exit(EXIT_FAILURE); + + endwin(); + refresh(); + screen_resize(c); + + return TRUE; +} + +static void +catch_sigwinch(gcc_unused int sig) +{ + if (1 != write(sigwinch_pipes[1], "", 1)) + exit(EXIT_FAILURE); +} + +void +signals_init(GMainLoop *main_loop, struct mpdclient *c) +{ + /* setup quit signals */ + g_unix_signal_add(SIGTERM, handle_quit_signal, main_loop); + g_unix_signal_add(SIGINT, handle_quit_signal, main_loop); + g_unix_signal_add(SIGHUP, handle_quit_signal, main_loop); + + /* setup signal behavior - SIGCONT */ + + struct sigaction act; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + + act.sa_handler = catch_sigwinch; + if (sigaction(SIGCONT, &act, NULL) < 0) { + perror("sigaction(SIGCONT)"); + exit(EXIT_FAILURE); + } + + /* setup SIGWINCH */ + + act.sa_flags = SA_RESTART; + act.sa_handler = catch_sigwinch; + if (sigaction(SIGWINCH, &act, NULL) < 0) { + perror("sigaction(SIGWINCH)"); + exit(EXIT_FAILURE); + } + +#ifndef WIN32 + if (!pipe(sigwinch_pipes) && + !fcntl(sigwinch_pipes[1], F_SETFL, O_NONBLOCK)) { + GIOChannel *sigwinch_channel = g_io_channel_unix_new(sigwinch_pipes[0]); + g_io_add_watch(sigwinch_channel, G_IO_IN, sigwinch_event, c); + g_io_channel_unref(sigwinch_channel); + } + else { + perror("sigwinch pipe creation failed"); + exit(EXIT_FAILURE); + } +#endif + + /* ignore SIGPIPE */ + + act.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &act, NULL) < 0) { + perror("sigaction(SIGPIPE)"); + exit(EXIT_FAILURE); + } +} + +void +signals_deinit(void) +{ + close(sigwinch_pipes[0]); + close(sigwinch_pipes[1]); +} diff --git a/src/signals.h b/src/signals.h new file mode 100644 index 0000000..a8499a1 --- /dev/null +++ b/src/signals.h @@ -0,0 +1,49 @@ +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2017 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef SIGNALS_H +#define SIGNALS_H + +#include + +struct mpdclient; + +#ifdef WIN32 + +static inline void +signals_init(GMainLoop *main_loop, struct mpdclient *c) +{ + (void)main_loop; + (void)c; +} + +static inline void +signals_deinit(void) {} + +#else + +void +signals_init(GMainLoop *main_loop, struct mpdclient *c); + +void +signals_deinit(void); + +#endif + +#endif