1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <lib.h>
#define assert(x) \ do { \ if (!(x)) { \ user_panic("assertion failed: %s", #x); \ } \ } while (0)
void sigint_handler(int sig) { debugf("sth unexpected happened\n"); exit(); }
int main() { sigset_t st1, st2, st3, st4; u_int _st1 = 0x289ca9ed, _st2 = 0xab3cfe27; assert(sigemptyset(&st1) == 0); assert(sigemptyset(&st2) == 0); for(int i = 0; i <= 10; i++) { if (i != SIG_BLOCK && i != SIG_UNBLOCK && i != SIG_SETMASK) { assert(sigprocmask(i, &st1, &st2) == -1); } } assert(sigaddset(&st1, 0) == -1); assert(sigdelset(&st1, 33) == -1); assert(sigismember(&st1, 321) == -1); assert(sigisemptyset(&st1) == 1); assert(sigfillset(&st1) == 0); for(int i = 0; i < 32; i++) { if (!(_st1 >> i & 1)) { assert(sigdelset(&st1, i + 1) == 0); } if (_st2 >> i & 1) { assert(sigaddset(&st2, i + 1) == 0); } } for(int i = 0; i < 32; i++) { assert(sigismember(&st1, i + 1) == (_st1 >> i & 1)); assert(sigismember(&st2, i + 1) == (_st2 >> i & 1)); } assert(sigandset(&st3, &st1, &st2) == 0); for(int i = 0; i < 32; i++) { assert(sigismember(&st3, i + 1) == ((_st1 & _st2) >> i & 1)); } assert(sigorset(&st3, &st1, &st2) == 0); for(int i = 0; i < 32; i++) { assert(sigismember(&st3, i + 1) == ((_st1 | _st2) >> i & 1)); } assert(sigprocmask(SIG_BLOCK, NULL, NULL) == 0); assert(sigprocmask(SIG_BLOCK, &st3, &st4) == 0); for(int i = 0; i < 32; i++) { assert(sigismember(&st4, i + 1) == 0); } assert(sigprocmask(SIG_UNBLOCK, &st1, &st4) == 0); for(int i = 0; i < 32; i++) { assert(sigismember(&st4, i + 1) == ((_st2 | _st1) >> i & 1)); } assert(sigprocmask(SIG_SETMASK, &st1, &st4) == 0); for(int i = 0; i < 32; i++) { assert(sigismember(&st4, i + 1) == ((_st2 & ~_st1) >> i & 1)); } assert(sigprocmask(SIG_SETMASK, NULL, &st4) == 0); for(int i = 0; i < 32; i++) { assert(sigismember(&st4, i + 1) == (_st1 >> i & 1)); } struct sigaction sa, sa2; sa.sa_handler = sigint_handler; assert(sigemptyset(&sa.sa_mask) == 0); assert(sigaction(SIGSEGV, &sa, NULL) == 0); assert(sigaction(SIGSEGV, NULL, &sa2) == 0); assert(sa2.sa_handler == sa.sa_handler); assert(sigaction(0, &sa, NULL) == -1); assert(sigaction(33, &sa, NULL) == -1); assert(sigaction(32, NULL, NULL) == 0); debugf("Congratulations!\n"); debugf("Congratulations!\n"); debugf("Congratulations!\n"); debugf("Congratulations!\n"); debugf("Congratulations!\n"); debugf("Congratulations!\n"); return 0; }
|