| 98 | | signal( SIGINT, SigHandler ); |
|---|
| 99 | | signal( SIGHUP, SigHandler ); |
|---|
| 100 | | signal( SIGQUIT, SigHandler ); |
|---|
| 101 | | |
|---|
| 102 | | /* Other signals */ |
|---|
| 103 | | signal( SIGALRM, SIG_IGN ); |
|---|
| 104 | | signal( SIGPIPE, SIG_IGN ); |
|---|
| | 101 | static const int sigs[] = { SIGINT, SIGHUP, SIGQUIT, SIGTERM }; |
|---|
| | 102 | /* Ignored signals */ |
|---|
| | 103 | static const int ignored[] = { SIGALRM, SIGPIPE }; |
|---|
| | 104 | |
|---|
| | 105 | sigset_t set; |
|---|
| | 106 | pthread_t sigth; |
|---|
| | 107 | |
|---|
| | 108 | sigemptyset (&set); |
|---|
| | 109 | for (unsigned i = 0; i < sizeof (sigs) / sizeof (sigs[0]); i++) |
|---|
| | 110 | sigaddset (&set, sigs[i]); |
|---|
| | 111 | for (unsigned i = 0; i < sizeof (ignored) / sizeof (ignored[0]); i++) |
|---|
| | 112 | sigaddset (&set, ignored[i]); |
|---|
| | 113 | |
|---|
| | 114 | /* Block all these signals */ |
|---|
| | 115 | pthread_sigmask (SIG_BLOCK, &set, NULL); |
|---|
| | 116 | |
|---|
| | 117 | for (unsigned i = 0; i < sizeof (ignored) / sizeof (ignored[0]); i++) |
|---|
| | 118 | sigdelset (&set, ignored[i]); |
|---|
| | 119 | |
|---|
| | 120 | pthread_create (&sigth, NULL, SigHandler, &set); |
|---|
| 176 | | static time_t abort_time = 0; |
|---|
| 177 | | static volatile vlc_bool_t b_die = VLC_FALSE; |
|---|
| 178 | | |
|---|
| 179 | | /* Once a signal has been trapped, the termination sequence will be |
|---|
| 180 | | * armed and subsequent signals will be ignored to avoid sending signals |
|---|
| 181 | | * to a libvlc structure having been destroyed */ |
|---|
| 182 | | |
|---|
| 183 | | if( !b_die ) |
|---|
| 184 | | { |
|---|
| 185 | | b_die = VLC_TRUE; |
|---|
| 186 | | abort_time = time( NULL ); |
|---|
| 187 | | |
|---|
| 188 | | fprintf( stderr, "signal %d received, terminating vlc - do it " |
|---|
| 189 | | "again in case it gets stuck\n", i_signal ); |
|---|
| 190 | | |
|---|
| 191 | | /* Acknowledge the signal received */ |
|---|
| 192 | | VLC_Die( 0 ); |
|---|
| 193 | | } |
|---|
| 194 | | else if( time( NULL ) > abort_time + 2 ) |
|---|
| 195 | | { |
|---|
| 196 | | /* If user asks again 1 or 2 seconds later, die badly */ |
|---|
| 197 | | signal( SIGINT, SIG_DFL ); |
|---|
| 198 | | signal( SIGHUP, SIG_DFL ); |
|---|
| 199 | | signal( SIGQUIT, SIG_DFL ); |
|---|
| 200 | | signal( SIGALRM, SIG_DFL ); |
|---|
| 201 | | signal( SIGPIPE, SIG_DFL ); |
|---|
| 202 | | |
|---|
| 203 | | fprintf( stderr, "user insisted too much, dying badly\n" ); |
|---|
| 204 | | |
|---|
| 205 | | abort(); |
|---|
| 206 | | } |
|---|
| | 197 | const sigset_t *set = (sigset_t *)data; |
|---|
| | 198 | time_t abort_time = 0; |
|---|
| | 199 | vlc_bool_t b_die = VLC_FALSE; |
|---|
| | 200 | |
|---|
| | 201 | for (;;) |
|---|
| | 202 | { |
|---|
| | 203 | int i_signal, state; |
|---|
| | 204 | (void)sigwait (set, &i_signal); |
|---|
| | 205 | |
|---|
| | 206 | /* Once a signal has been trapped, the termination sequence will be |
|---|
| | 207 | * armed and subsequent signals will be ignored to avoid sending |
|---|
| | 208 | * signals to a libvlc structure having been destroyed */ |
|---|
| | 209 | |
|---|
| | 210 | pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); |
|---|
| | 211 | if( !b_die ) |
|---|
| | 212 | { |
|---|
| | 213 | b_die = VLC_TRUE; |
|---|
| | 214 | abort_time = time( NULL ); |
|---|
| | 215 | |
|---|
| | 216 | fprintf( stderr, "signal %d received, terminating vlc - do it " |
|---|
| | 217 | "again in case it gets stuck\n", i_signal ); |
|---|
| | 218 | |
|---|
| | 219 | /* Acknowledge the signal received */ |
|---|
| | 220 | VLC_Die( 0 ); |
|---|
| | 221 | } |
|---|
| | 222 | else if( time( NULL ) > abort_time + 2 ) |
|---|
| | 223 | { |
|---|
| | 224 | /* If user asks again 1 or 2 seconds later, die badly */ |
|---|
| | 225 | pthread_sigmask (SIG_UNBLOCK, set, NULL); |
|---|
| | 226 | fprintf( stderr, "user insisted too much, dying badly\n" ); |
|---|
| | 227 | abort(); |
|---|
| | 228 | } |
|---|
| | 229 | pthread_setcancelstate (state, NULL); |
|---|
| | 230 | } |
|---|
| | 231 | /* Never reached */ |
|---|