40 static gboolean sigpipe_read_signal_cb(GIOChannel *channel, GIOCondition condition, gpointer data);
41 static void sigpipe_trap_signal_cb(
int sig);
42 static bool sigpipe_crate_pipe (
void);
43 static void sigpipe_trap_signals (
void);
51 static int sigpipe_fd = -1;
62 sigpipe_read_signal_cb(GIOChannel *channel,
63 GIOCondition condition,
68 gboolean keep_watch = FALSE;
76 if( condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
79 if( (fd = g_io_channel_unix_get_fd(channel)) == -1 )
83 rc = TEMP_FAILURE_RETRY(read(fd, &sig,
sizeof sig));
84 if( rc != (
int)
sizeof sig )
88 usbmoded_handle_signal(sig);
94 log_crit(
"disabled signal handler io watch\n");
104 sigpipe_trap_signal_cb(
int sig)
106 LOG_REGISTER_CONTEXT;
110 static volatile int exit_tries = 0;
115 signal(sig, sigpipe_trap_signal_cb);
125 if( ++exit_tries >= 2 )
134 rc = TEMP_FAILURE_RETRY(write(sigpipe_fd, &sig,
sizeof sig));
137 if( rc != (
int)
sizeof sig )
146 sigpipe_crate_pipe(
void)
148 LOG_REGISTER_CONTEXT;
152 int pfd[2] = { -1, -1 };
154 if( pipe2(pfd, O_CLOEXEC) == -1 )
157 if( (chn = g_io_channel_unix_new(pfd[0])) == 0 )
160 if( !g_io_add_watch(chn, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
161 sigpipe_read_signal_cb, 0) )
164 g_io_channel_set_close_on_unref(chn,
true), pfd[0] = -1;
165 sigpipe_fd = pfd[1], pfd[1] = -1;
170 if( chn ) g_io_channel_unref(chn);
171 if( pfd[0] != -1 ) close(pfd[0]);
172 if( pfd[1] != -1 ) close(pfd[1]);
180 sigpipe_trap_signals(
void)
182 LOG_REGISTER_CONTEXT;
184 static const int sig[] =
193 for(
size_t i = 0; sig[i] != -1; ++i )
195 signal(sig[i], sigpipe_trap_signal_cb);
206 LOG_REGISTER_CONTEXT;
208 bool success =
false;
210 if( !sigpipe_crate_pipe() )
213 sigpipe_trap_signals();