Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • unix.c

    rc467adc r5535a47  
    4848global_t global;        /* Against global namespace pollution */
    4949
    50 static struct {
    51         int fd[2];
    52         int tag;
    53 } shutdown_pipe = {{-1 , -1}, 0};
    54 
     50static int signal_shutdown_pipe[2] = { -1, -1 };
    5551static void sighandler_shutdown(int signal);
    5652static void sighandler_crash(int signal);
     
    160156        sigaction(SIGSEGV, &sig, &old);
    161157
    162         sighandler_shutdown_setup();
    163 
    164         sig.sa_handler = sighandler_shutdown;
    165         sigaction(SIGINT, &sig, &old);
    166         sigaction(SIGTERM, &sig, &old);
     158        /* Use a pipe for SIGTERM/SIGINT so the actual signal handler doesn't do anything unsafe */
     159        if (pipe(signal_shutdown_pipe) == 0) {
     160                b_input_add(signal_shutdown_pipe[0], B_EV_IO_READ, bitlbee_shutdown, NULL);
     161                sig.sa_handler = sighandler_shutdown;
     162                sigaction(SIGINT, &sig, &old);
     163                sigaction(SIGTERM, &sig, &old);
     164        }
    167165
    168166        if (!getuid() || !geteuid()) {
     
    258256}
    259257
    260 /* Set up a pipe for SIGTERM/SIGINT so the actual signal handler doesn't do anything unsafe */
    261 void sighandler_shutdown_setup()
    262 {
    263         if (shutdown_pipe.fd[0] != -1) {
    264                 /* called again from a forked process, clean up to avoid propagating the signal */
    265                 b_event_remove(shutdown_pipe.tag);
    266                 close(shutdown_pipe.fd[0]);
    267                 close(shutdown_pipe.fd[1]);
    268         }
    269 
    270         if (pipe(shutdown_pipe.fd) == 0) {
    271                 shutdown_pipe.tag = b_input_add(shutdown_pipe.fd[0], B_EV_IO_READ, bitlbee_shutdown, NULL);
    272         }
    273 }
    274 
    275258/* Signal handler for SIGTERM and SIGINT */
    276259static void sighandler_shutdown(int signal)
     
    278261        /* Write a single null byte to the pipe, just to send a message to the main loop.
    279262         * This gets handled by bitlbee_shutdown (the b_input_add callback for this pipe) */
    280         write(shutdown_pipe.fd[1], "", 1);
     263        write(signal_shutdown_pipe[1], "", 1);
    281264}
    282265
     
    292275        for (l = irc_connection_list; l; l = l->next) {
    293276                irc_t *irc = l->data;
    294                 sock_make_blocking(irc->fd);
    295277                write(irc->fd, message, len);
    296278        }
Note: See TracChangeset for help on using the changeset viewer.