1*0Sigor@sysoev.ru 2*0Sigor@sysoev.ru /* 3*0Sigor@sysoev.ru * Copyright (C) Igor Sysoev 4*0Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 5*0Sigor@sysoev.ru */ 6*0Sigor@sysoev.ru 7*0Sigor@sysoev.ru 8*0Sigor@sysoev.ru #ifndef _NXT_UNIX_TEST_BUILD_H_INCLUDED_ 9*0Sigor@sysoev.ru #define _NXT_UNIX_TEST_BUILD_H_INCLUDED_ 10*0Sigor@sysoev.ru 11*0Sigor@sysoev.ru 12*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_EPOLL) 13*0Sigor@sysoev.ru 14*0Sigor@sysoev.ru #define NXT_HAVE_EPOLL 1 15*0Sigor@sysoev.ru #define NXT_HAVE_EPOLL_EDGE 1 16*0Sigor@sysoev.ru #define NXT_HAVE_EVENTFD 1 17*0Sigor@sysoev.ru #define NXT_HAVE_SIGNALFD 1 18*0Sigor@sysoev.ru #define NXT_HAVE_ACCEPT4 1 19*0Sigor@sysoev.ru 20*0Sigor@sysoev.ru /* Linux epoll declarations */ 21*0Sigor@sysoev.ru 22*0Sigor@sysoev.ru #define EPOLLIN 0x00000001 23*0Sigor@sysoev.ru #define EPOLLPRI 0x00000002 24*0Sigor@sysoev.ru #define EPOLLOUT 0x00000004 25*0Sigor@sysoev.ru #define EPOLLERR 0x00000008 26*0Sigor@sysoev.ru #define EPOLLHUP 0x00000010 27*0Sigor@sysoev.ru #define EPOLLRDNORM 0x00000040 28*0Sigor@sysoev.ru #define EPOLLRDBAND 0x00000080 29*0Sigor@sysoev.ru #define EPOLLWRNORM 00000x0100 30*0Sigor@sysoev.ru #define EPOLLWRBAND 0x00000200 31*0Sigor@sysoev.ru #define EPOLLMSG 0x00000400 32*0Sigor@sysoev.ru #define EPOLLRDHUP 0x00002000 33*0Sigor@sysoev.ru 34*0Sigor@sysoev.ru #define EPOLLET 0x80000000 35*0Sigor@sysoev.ru #define EPOLLONESHOT 0x40000000 36*0Sigor@sysoev.ru 37*0Sigor@sysoev.ru #define EPOLL_CTL_ADD 1 38*0Sigor@sysoev.ru #define EPOLL_CTL_DEL 2 39*0Sigor@sysoev.ru #define EPOLL_CTL_MOD 3 40*0Sigor@sysoev.ru 41*0Sigor@sysoev.ru #define EFD_SEMAPHORE 1 42*0Sigor@sysoev.ru #define EFD_NONBLOCK 04000 43*0Sigor@sysoev.ru 44*0Sigor@sysoev.ru 45*0Sigor@sysoev.ru typedef union epoll_data { 46*0Sigor@sysoev.ru void *ptr; 47*0Sigor@sysoev.ru int fd; 48*0Sigor@sysoev.ru uint32_t u32; 49*0Sigor@sysoev.ru uint64_t u64; 50*0Sigor@sysoev.ru } epoll_data_t; 51*0Sigor@sysoev.ru 52*0Sigor@sysoev.ru 53*0Sigor@sysoev.ru struct epoll_event { 54*0Sigor@sysoev.ru uint32_t events; 55*0Sigor@sysoev.ru epoll_data_t data; 56*0Sigor@sysoev.ru }; 57*0Sigor@sysoev.ru 58*0Sigor@sysoev.ru 59*0Sigor@sysoev.ru struct signalfd_siginfo { 60*0Sigor@sysoev.ru uint32_t ssi_signo; /* Signal number */ 61*0Sigor@sysoev.ru int32_t ssi_errno; /* Error number (unused) */ 62*0Sigor@sysoev.ru int32_t ssi_code; /* Signal code */ 63*0Sigor@sysoev.ru uint32_t ssi_pid; /* PID of sender */ 64*0Sigor@sysoev.ru uint32_t ssi_uid; /* Real UID of sender */ 65*0Sigor@sysoev.ru int32_t ssi_fd; /* File descriptor (SIGIO) */ 66*0Sigor@sysoev.ru uint32_t ssi_tid; /* Kernel timer ID (POSIX timers) */ 67*0Sigor@sysoev.ru uint32_t ssi_band; /* Band event (SIGIO) */ 68*0Sigor@sysoev.ru uint32_t ssi_overrun; /* POSIX timer overrun count */ 69*0Sigor@sysoev.ru uint32_t ssi_trapno; /* Trap number that caused signal */ 70*0Sigor@sysoev.ru int32_t ssi_status; /* Exit status or signal (SIGCHLD) */ 71*0Sigor@sysoev.ru int32_t ssi_int; /* Integer sent by sigqueue(2) */ 72*0Sigor@sysoev.ru uint64_t ssi_ptr; /* Pointer sent by sigqueue(2) */ 73*0Sigor@sysoev.ru uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */ 74*0Sigor@sysoev.ru uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */ 75*0Sigor@sysoev.ru uint64_t ssi_addr; /* Address that generated signal 76*0Sigor@sysoev.ru (for hardware-generated signals) */ 77*0Sigor@sysoev.ru uint8_t pad[8]; /* Pad size to 128 bytes (allow for 78*0Sigor@sysoev.ru additional fields in the future) */ 79*0Sigor@sysoev.ru }; 80*0Sigor@sysoev.ru 81*0Sigor@sysoev.ru 82*0Sigor@sysoev.ru int epoll_create(int size); 83*0Sigor@sysoev.ru int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 84*0Sigor@sysoev.ru int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout); 85*0Sigor@sysoev.ru 86*0Sigor@sysoev.ru int eventfd(u_int initval, int flags); 87*0Sigor@sysoev.ru int signalfd(int fd, const sigset_t *mask, int flags); 88*0Sigor@sysoev.ru 89*0Sigor@sysoev.ru #define SOCK_NONBLOCK 04000 90*0Sigor@sysoev.ru 91*0Sigor@sysoev.ru int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); 92*0Sigor@sysoev.ru 93*0Sigor@sysoev.ru #endif 94*0Sigor@sysoev.ru 95*0Sigor@sysoev.ru 96*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_EVENTPORT) 97*0Sigor@sysoev.ru 98*0Sigor@sysoev.ru #include <poll.h> 99*0Sigor@sysoev.ru 100*0Sigor@sysoev.ru #define NXT_HAVE_EVENTPORT 1 101*0Sigor@sysoev.ru 102*0Sigor@sysoev.ru #define ushort_t u_short 103*0Sigor@sysoev.ru #define uint_t u_int 104*0Sigor@sysoev.ru 105*0Sigor@sysoev.ru /* Solaris eventport declarations */ 106*0Sigor@sysoev.ru 107*0Sigor@sysoev.ru #define PORT_SOURCE_AIO 1 108*0Sigor@sysoev.ru #define PORT_SOURCE_TIMER 2 109*0Sigor@sysoev.ru #define PORT_SOURCE_USER 3 110*0Sigor@sysoev.ru #define PORT_SOURCE_FD 4 111*0Sigor@sysoev.ru #define PORT_SOURCE_ALERT 5 112*0Sigor@sysoev.ru #define PORT_SOURCE_MQ 6 113*0Sigor@sysoev.ru #define PORT_SOURCE_FILE 7 114*0Sigor@sysoev.ru 115*0Sigor@sysoev.ru #ifndef ETIME 116*0Sigor@sysoev.ru #define ETIME 62 117*0Sigor@sysoev.ru #endif 118*0Sigor@sysoev.ru 119*0Sigor@sysoev.ru 120*0Sigor@sysoev.ru typedef struct { 121*0Sigor@sysoev.ru int portev_events; /* event data is source specific */ 122*0Sigor@sysoev.ru ushort_t portev_source; /* event source */ 123*0Sigor@sysoev.ru ushort_t portev_pad; /* port internal use */ 124*0Sigor@sysoev.ru uintptr_t portev_object; /* source specific object */ 125*0Sigor@sysoev.ru void *portev_user; /* user cookie */ 126*0Sigor@sysoev.ru } port_event_t; 127*0Sigor@sysoev.ru 128*0Sigor@sysoev.ru 129*0Sigor@sysoev.ru typedef struct timespec timespec_t; 130*0Sigor@sysoev.ru typedef struct timespec timestruc_t; 131*0Sigor@sysoev.ru 132*0Sigor@sysoev.ru 133*0Sigor@sysoev.ru typedef struct file_obj { 134*0Sigor@sysoev.ru timestruc_t fo_atime; /* Access time from stat(2) */ 135*0Sigor@sysoev.ru timestruc_t fo_mtime; /* Modification time from stat(2) */ 136*0Sigor@sysoev.ru timestruc_t fo_ctime; /* Change time from stat(2) */ 137*0Sigor@sysoev.ru uintptr_t fo_pad[3]; /* For future expansion */ 138*0Sigor@sysoev.ru char *fo_name; /* Null terminated file name */ 139*0Sigor@sysoev.ru } file_obj_t; 140*0Sigor@sysoev.ru 141*0Sigor@sysoev.ru 142*0Sigor@sysoev.ru int port_create(void); 143*0Sigor@sysoev.ru int port_associate(int port, int source, uintptr_t object, int events, 144*0Sigor@sysoev.ru void *user); 145*0Sigor@sysoev.ru int port_dissociate(int port, int source, uintptr_t object); 146*0Sigor@sysoev.ru int port_send(int port, int events, void *user); 147*0Sigor@sysoev.ru int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget, 148*0Sigor@sysoev.ru const timespec_t *timeout); 149*0Sigor@sysoev.ru 150*0Sigor@sysoev.ru #endif 151*0Sigor@sysoev.ru 152*0Sigor@sysoev.ru 153*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_DEVPOLL) 154*0Sigor@sysoev.ru 155*0Sigor@sysoev.ru #define NXT_HAVE_DEVPOLL 1 156*0Sigor@sysoev.ru 157*0Sigor@sysoev.ru #include <poll.h> 158*0Sigor@sysoev.ru #include <sys/ioctl.h> 159*0Sigor@sysoev.ru 160*0Sigor@sysoev.ru /* Solaris /dev/poll declarations */ 161*0Sigor@sysoev.ru 162*0Sigor@sysoev.ru #define POLLREMOVE 0x0800 163*0Sigor@sysoev.ru #define DP_POLL 0xD001 164*0Sigor@sysoev.ru #define DP_ISPOLLED 0xD002 165*0Sigor@sysoev.ru 166*0Sigor@sysoev.ru 167*0Sigor@sysoev.ru struct dvpoll { 168*0Sigor@sysoev.ru struct pollfd *dp_fds; 169*0Sigor@sysoev.ru int dp_nfds; 170*0Sigor@sysoev.ru int dp_timeout; 171*0Sigor@sysoev.ru }; 172*0Sigor@sysoev.ru 173*0Sigor@sysoev.ru #endif 174*0Sigor@sysoev.ru 175*0Sigor@sysoev.ru 176*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_POLLSET) 177*0Sigor@sysoev.ru 178*0Sigor@sysoev.ru #define NXT_HAVE_POLLSET 1 179*0Sigor@sysoev.ru 180*0Sigor@sysoev.ru #include <poll.h> 181*0Sigor@sysoev.ru 182*0Sigor@sysoev.ru /* AIX pollset declarations */ 183*0Sigor@sysoev.ru 184*0Sigor@sysoev.ru #define PS_ADD 0x0 185*0Sigor@sysoev.ru #define PS_MOD 0x1 186*0Sigor@sysoev.ru #define PS_DELETE 0x2 187*0Sigor@sysoev.ru 188*0Sigor@sysoev.ru 189*0Sigor@sysoev.ru typedef int pollset_t; 190*0Sigor@sysoev.ru 191*0Sigor@sysoev.ru struct poll_ctl { 192*0Sigor@sysoev.ru short cmd; 193*0Sigor@sysoev.ru short events; 194*0Sigor@sysoev.ru int fd; 195*0Sigor@sysoev.ru }; 196*0Sigor@sysoev.ru 197*0Sigor@sysoev.ru 198*0Sigor@sysoev.ru pollset_t pollset_create(int maxfd); 199*0Sigor@sysoev.ru int pollset_destroy(pollset_t ps); 200*0Sigor@sysoev.ru int pollset_query(pollset_t ps, struct pollfd *pollfd_query); 201*0Sigor@sysoev.ru int pollset_ctl(pollset_t ps, struct poll_ctl *pollctl_array, int array_length); 202*0Sigor@sysoev.ru int pollset_poll(pollset_t ps, struct pollfd *polldata_array, int array_length, 203*0Sigor@sysoev.ru int timeout); 204*0Sigor@sysoev.ru 205*0Sigor@sysoev.ru #endif 206*0Sigor@sysoev.ru 207*0Sigor@sysoev.ru 208*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_FREEBSD_SENDFILE || NXT_TEST_BUILD_MACOSX_SENDFILE) 209*0Sigor@sysoev.ru 210*0Sigor@sysoev.ru #if !(NXT_FREEBSD) && !(NXT_MACOSX) 211*0Sigor@sysoev.ru 212*0Sigor@sysoev.ru struct sf_hdtr { 213*0Sigor@sysoev.ru struct iovec *headers; 214*0Sigor@sysoev.ru int hdr_cnt; 215*0Sigor@sysoev.ru struct iovec *trailers; 216*0Sigor@sysoev.ru int trl_cnt; 217*0Sigor@sysoev.ru }; 218*0Sigor@sysoev.ru 219*0Sigor@sysoev.ru #endif 220*0Sigor@sysoev.ru 221*0Sigor@sysoev.ru #endif 222*0Sigor@sysoev.ru 223*0Sigor@sysoev.ru 224*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_SOLARIS_SENDFILEV) 225*0Sigor@sysoev.ru 226*0Sigor@sysoev.ru /* Solaris declarations */ 227*0Sigor@sysoev.ru 228*0Sigor@sysoev.ru typedef struct sendfilevec { 229*0Sigor@sysoev.ru int sfv_fd; 230*0Sigor@sysoev.ru u_int sfv_flag; 231*0Sigor@sysoev.ru off_t sfv_off; 232*0Sigor@sysoev.ru size_t sfv_len; 233*0Sigor@sysoev.ru } sendfilevec_t; 234*0Sigor@sysoev.ru 235*0Sigor@sysoev.ru #define SFV_FD_SELF -2 236*0Sigor@sysoev.ru 237*0Sigor@sysoev.ru ssize_t sendfilev(int fd, const struct sendfilevec *vec, int sfvcnt, 238*0Sigor@sysoev.ru size_t *xferred); 239*0Sigor@sysoev.ru 240*0Sigor@sysoev.ru #endif 241*0Sigor@sysoev.ru 242*0Sigor@sysoev.ru 243*0Sigor@sysoev.ru #if (NXT_TEST_BUILD_AIX_SEND_FILE) 244*0Sigor@sysoev.ru 245*0Sigor@sysoev.ru #ifndef uint_t 246*0Sigor@sysoev.ru #define uint_t u_int 247*0Sigor@sysoev.ru #endif 248*0Sigor@sysoev.ru 249*0Sigor@sysoev.ru struct sf_parms { 250*0Sigor@sysoev.ru void *header_data; 251*0Sigor@sysoev.ru uint_t header_length; 252*0Sigor@sysoev.ru 253*0Sigor@sysoev.ru int file_descriptor; 254*0Sigor@sysoev.ru uint64_t file_size; 255*0Sigor@sysoev.ru uint64_t file_offset; 256*0Sigor@sysoev.ru int64_t file_bytes; 257*0Sigor@sysoev.ru 258*0Sigor@sysoev.ru void *trailer_data; 259*0Sigor@sysoev.ru uint_t trailer_length; 260*0Sigor@sysoev.ru 261*0Sigor@sysoev.ru uint64_t bytes_sent; 262*0Sigor@sysoev.ru }; 263*0Sigor@sysoev.ru 264*0Sigor@sysoev.ru #define SF_CLOSE 0x00000001 /* close the socket after completion */ 265*0Sigor@sysoev.ru #define SF_REUSE 0x00000002 /* reuse socket. not supported */ 266*0Sigor@sysoev.ru #define SF_DONT_CACHE 0x00000004 /* don't apply network buffer cache */ 267*0Sigor@sysoev.ru #define SF_SYNC_CACHE 0x00000008 /* sync/update network buffer cache */ 268*0Sigor@sysoev.ru 269*0Sigor@sysoev.ru ssize_t send_file(int *s, struct sf_parms *sf_iobuf, uint_t flags); 270*0Sigor@sysoev.ru 271*0Sigor@sysoev.ru #endif 272*0Sigor@sysoev.ru 273*0Sigor@sysoev.ru 274*0Sigor@sysoev.ru #endif /* _NXT_UNIX_TEST_BUILD_H_INCLUDED_ */ 275