Merge branch 'master' of ssh://gapil.gnulinux.it/srv/git/gapil
[gapil.git] / listati / sleep_defect.c
1 static jmp_buff alarm_return;
2 unsigned int sleep(unsigned int seconds)
3 {
4     signandler_t prev_handler;
5     if ((prev_handler = signal(SIGALRM, alarm_hand)) == SIG_ERR) {
6         printf("Cannot set handler for alarm\n");
7         exit(1);
8     }
9     if (setjmp(alarm_return) == 0) { /* if not returning from handler */
10         alarm(second);      /* call alarm */
11         pause();            /* then wait */
12     }
13     /* restore previous signal handler */
14     signal(SIGALRM, prev_handler);
15     /* remove alarm, return remaining time */
16     return alarm(0);
17 }
18 void alarm_hand(int sig) 
19 {
20     /* check if the signal is the right one */
21     if (sig != SIGALRM) { /* if not exit with error */
22         printf("Something wrong, handler for SIGALRM\n");
23         exit(1);
24     } else {    /* return in main after the call to pause */
25         longjump(alarm_return, 1);
26     }
27 }