1 /* $OpenBSD: accept.c,v 1.2 2016/01/27 01:20:10 jca Exp $ */ 2 /* 3 * Federico G. Schwindt <fgsch@openbsd.org>, 2011. Public Domain. 4 */ 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 #include <netinet/in.h> 8 #include <pthread.h> 9 #include <signal.h> 10 #include <unistd.h> 11 #include "test.h" 12 13 volatile sig_atomic_t hits = 0; 14 15 void 16 handler(int sig) 17 { 18 hits++; 19 } 20 21 void * 22 thr_accept(void *arg) 23 { 24 struct sockaddr_in sa; 25 socklen_t salen; 26 int s; 27 28 CHECKe(s = socket(AF_INET, SOCK_STREAM, 0)); 29 bzero(&sa, sizeof(sa)); 30 sa.sin_family = AF_INET; 31 sa.sin_port = htons(6543); 32 CHECKe(bind(s, (const void*)&sa, sizeof(sa))); 33 CHECKe(listen(s, 10)); 34 salen = sizeof(sa); 35 ASSERT(accept(s, (struct sockaddr *)&sa, &salen) == -1); 36 return ((caddr_t)NULL + errno); 37 } 38 39 int 40 main(int argc, char **argv) 41 { 42 struct sigaction sa; 43 pthread_t tid; 44 void *retval; 45 46 bzero(&sa, sizeof(sa)); 47 sa.sa_handler = handler; 48 sa.sa_flags = SA_RESTART; 49 CHECKe(sigaction(SIGUSR1, &sa, NULL)); 50 sa.sa_flags = 0; 51 CHECKe(sigaction(SIGUSR2, &sa, NULL)); 52 53 CHECKr(pthread_create(&tid, NULL, thr_accept, NULL)); 54 sleep(2); 55 56 /* Should restart it. */ 57 CHECKr(pthread_kill(tid, SIGUSR1)); 58 sleep(1); 59 60 /* Should interrupt it. */ 61 CHECKr(pthread_kill(tid, SIGUSR2)); 62 sleep(1); 63 64 CHECKr(pthread_join(tid, &retval)); 65 ASSERT(retval == (void *)EINTR); 66 ASSERT(hits == 2); 67 SUCCEED; 68 } 69