00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "xmmspriv/xmms_signal.h"
00026 #include "xmmspriv/xmms_thread_name.h"
00027 #include "xmms/xmms_log.h"
00028 #include "xmms/xmms_object.h"
00029
00030 #include <stdlib.h>
00031 #include <string.h>
00032 #include <signal.h>
00033 #include <string.h>
00034 #include <glib.h>
00035 #include <unistd.h>
00036
00037 static sigset_t osignals;
00038
00039 static gpointer
00040 sigwaiter (gpointer data)
00041 {
00042 xmms_object_t *obj = (xmms_object_t *) data;
00043 xmms_object_cmd_arg_t arg;
00044 sigset_t signals;
00045 int caught;
00046
00047 xmms_set_thread_name ("x2 sig waiter");
00048
00049 sigemptyset(&signals);
00050 sigaddset (&signals, SIGINT);
00051 sigaddset (&signals, SIGTERM);
00052
00053 while (1337) {
00054 sigwait (&signals, &caught);
00055
00056 switch (caught){
00057 case SIGINT:
00058 case SIGTERM:
00059 pthread_sigmask (SIG_UNBLOCK, &signals, NULL);
00060
00061 xmms_log_info ("Bye!");
00062
00063 xmms_object_cmd_arg_init (&arg);
00064 memset (&arg, 0, sizeof (arg));
00065 arg.args = xmmsv_new_list ();
00066 xmms_error_reset (&arg.error);
00067 xmms_object_cmd_call (obj, XMMS_IPC_CMD_QUIT, &arg);
00068 xmmsv_unref (arg.args);
00069 break;
00070 }
00071 }
00072
00073 return 0;
00074 }
00075
00076 void
00077 xmms_signal_block (void)
00078 {
00079 sigset_t signals;
00080
00081 sigemptyset(&signals);
00082
00083 sigaddset (&signals, SIGHUP);
00084 sigaddset (&signals, SIGTERM);
00085 sigaddset (&signals, SIGINT);
00086
00087 pthread_sigmask (SIG_BLOCK, &signals, &osignals);
00088
00089
00090
00091
00092
00093
00094
00095 signal (SIGPIPE, SIG_IGN);
00096 }
00097
00098 void
00099 xmms_signal_restore (void)
00100 {
00101 pthread_sigmask (SIG_SETMASK, &osignals, NULL);
00102 }
00103
00104 void
00105 xmms_signal_init (xmms_object_t *obj)
00106 {
00107 g_thread_create (sigwaiter, obj, FALSE, NULL);
00108 }