1/* $OpenBSD: recvmsg.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/uio.h> 7#include <sys/socket.h> 8#include <netinet/in.h> 9#include <pthread.h> 10#include <signal.h> 11#include <unistd.h> 12#include "test.h" 13 14volatile sig_atomic_t hits = 0; 15 16void 17handler(int sig) 18{ 19 hits++; 20} 21 22void * 23thr_recvmsg(void *arg) 24{ 25 struct sockaddr_in sa; 26 struct msghdr msg; 27 struct iovec iov; 28 char buf; 29 int s; 30 31 CHECKe(s = socket(AF_INET, SOCK_DGRAM, 0)); 32 bzero(&sa, sizeof(sa)); 33 sa.sin_family = AF_INET; 34 sa.sin_port = htons(6543); 35 CHECKe(bind(s, (const void*)&sa, sizeof(sa))); 36 bzero(&msg, sizeof(msg)); 37 iov.iov_base = &buf; 38 iov.iov_len = 1; 39 msg.msg_iov = &iov; 40 msg.msg_iovlen = 1; 41 ASSERT(recvmsg(s, &msg, 0) == -1); 42 return ((caddr_t)NULL + errno); 43} 44 45int 46main(int argc, char **argv) 47{ 48 struct sigaction sa; 49 pthread_t tid; 50 void *retval; 51 52 bzero(&sa, sizeof(sa)); 53 sa.sa_handler = handler; 54 sa.sa_flags = SA_RESTART; 55 CHECKe(sigaction(SIGUSR1, &sa, NULL)); 56 sa.sa_flags = 0; 57 CHECKe(sigaction(SIGUSR2, &sa, NULL)); 58 59 CHECKr(pthread_create(&tid, NULL, thr_recvmsg, NULL)); 60 sleep(2); 61 62 /* Should restart it. */ 63 CHECKr(pthread_kill(tid, SIGUSR1)); 64 sleep(1); 65 66 /* Should interrupt it. */ 67 CHECKr(pthread_kill(tid, SIGUSR2)); 68 sleep(1); 69 70 CHECKr(pthread_join(tid, &retval)); 71 ASSERT(retval == (void *)EINTR); 72 ASSERT(hits == 2); 73 SUCCEED; 74} 75