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