41static gboolean sigpipe_read_signal_cb(GIOChannel *channel, GIOCondition condition, gpointer data);
42static void sigpipe_trap_signal_cb(
int sig);
43static bool sigpipe_crate_pipe (
void);
44static void sigpipe_trap_signals (
void);
52static int sigpipe_fd = -1;
63sigpipe_read_signal_cb(GIOChannel *channel,
64 GIOCondition condition,
69 gboolean keep_watch = FALSE;
77 if( condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
80 if( (fd = g_io_channel_unix_get_fd(channel)) == -1 )
84 rc = TEMP_FAILURE_RETRY(read(fd, &sig,
sizeof sig));
85 if( rc != (
int)
sizeof sig )
89 usbmoded_handle_signal(sig);
95 log_crit(
"disabled signal handler io watch\n");
105sigpipe_trap_signal_cb(
int sig)
107 LOG_REGISTER_CONTEXT;
111 static volatile int exit_tries = 0;
116 signal(sig, sigpipe_trap_signal_cb);
126 if( ++exit_tries >= 2 )
135 rc = TEMP_FAILURE_RETRY(write(sigpipe_fd, &sig,
sizeof sig));
138 if( rc != (
int)
sizeof sig )
147sigpipe_crate_pipe(
void)
149 LOG_REGISTER_CONTEXT;
153 int pfd[2] = { -1, -1 };
155 if( pipe2(pfd, O_CLOEXEC) == -1 )
158 if( (chn = g_io_channel_unix_new(pfd[0])) == 0 )
161 if( !g_io_add_watch(chn, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
162 sigpipe_read_signal_cb, 0) )
165 g_io_channel_set_close_on_unref(chn,
true), pfd[0] = -1;
166 sigpipe_fd = pfd[1], pfd[1] = -1;
171 if( chn ) g_io_channel_unref(chn);
172 if( pfd[0] != -1 ) close(pfd[0]);
173 if( pfd[1] != -1 ) close(pfd[1]);
181sigpipe_trap_signals(
void)
183 LOG_REGISTER_CONTEXT;
185 static const int sig[] =
194 for(
size_t i = 0; sig[i] != -1; ++i )
196 signal(sig[i], sigpipe_trap_signal_cb);
207 LOG_REGISTER_CONTEXT;
209 bool success =
false;
211 if( !sigpipe_crate_pipe() )
214 sigpipe_trap_signals();