/*
* Copyright (C) Igor Sysoev
* Copyright (C) NGINX, Inc.
*/
#ifndef _NXT_UNIX_TEST_BUILD_H_INCLUDED_
#define _NXT_UNIX_TEST_BUILD_H_INCLUDED_
#if (NXT_TEST_BUILD_EPOLL)
#define NXT_HAVE_EPOLL 1
#define NXT_HAVE_EPOLL_EDGE 1
#define NXT_HAVE_EVENTFD 1
#define NXT_HAVE_SIGNALFD 1
#define NXT_HAVE_ACCEPT4 1
/* Linux epoll declarations */
#define EPOLLIN 0x00000001
#define EPOLLPRI 0x00000002
#define EPOLLOUT 0x00000004
#define EPOLLERR 0x00000008
#define EPOLLHUP 0x00000010
#define EPOLLRDNORM 0x00000040
#define EPOLLRDBAND 0x00000080
#define EPOLLWRNORM 00000x0100
#define EPOLLWRBAND 0x00000200
#define EPOLLMSG 0x00000400
#define EPOLLRDHUP 0x00002000
#define EPOLLET 0x80000000
#define EPOLLONESHOT 0x40000000
#define EPOLL_CTL_ADD 1
#define EPOLL_CTL_DEL 2
#define EPOLL_CTL_MOD 3
#define EFD_SEMAPHORE 1
#define EFD_NONBLOCK 04000
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events;
epoll_data_t data;
};
struct signalfd_siginfo {
uint32_t ssi_signo; /* Signal number */
int32_t ssi_errno; /* Error number (unused) */
int32_t ssi_code; /* Signal code */
uint32_t ssi_pid; /* PID of sender */
uint32_t ssi_uid; /* Real UID of sender */
int32_t ssi_fd; /* File descriptor (SIGIO) */
uint32_t ssi_tid; /* Kernel timer ID (POSIX timers) */
uint32_t ssi_band; /* Band event (SIGIO) */
uint32_t ssi_overrun; /* POSIX timer overrun count */
uint32_t ssi_trapno; /* Trap number that caused signal */
int32_t ssi_status; /* Exit status or signal (SIGCHLD) */
int32_t ssi_int; /* Integer sent by sigqueue(2) */
uint64_t ssi_ptr; /* Pointer sent by sigqueue(2) */
uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */
uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */
uint64_t ssi_addr; /* Address that generated signal
(for hardware-generated signals) */
uint8_t pad[8]; /* Pad size to 128 bytes (allow for
additional fields in the future) */
};
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout);
int eventfd(u_int initval, int flags);
int signalfd(int fd, const sigset_t *mask, int flags);
#define SOCK_NONBLOCK 04000
int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
#endif
#if (NXT_TEST_BUILD_EVENTPORT)
#include <poll.h>
#define NXT_HAVE_EVENTPORT 1
#define ushort_t u_short
#define uint_t u_int
/* Solaris eventport declarations */
#define PORT_SOURCE_AIO 1
#define PORT_SOURCE_TIMER 2
#define PORT_SOURCE_USER 3
#define PORT_SOURCE_FD 4
#define PORT_SOURCE_ALERT 5
#define PORT_SOURCE_MQ 6
#define PORT_SOURCE_FILE 7
#ifndef ETIME
#define ETIME 62
#endif
typedef struct {
int portev_events; /* event data is source specific */
ushort_t portev_source; /* event source */
ushort_t portev_pad; /* port internal use */
uintptr_t portev_object; /* source specific object */
void *portev_user; /* user cookie */
} port_event_t;
typedef struct timespec timespec_t;
typedef struct timespec timestruc_t;
typedef struct file_obj {
timestruc_t fo_atime; /* Access time from stat(2) */
timestruc_t fo_mtime; /* Modification time from stat(2) */
timestruc_t fo_ctime; /* Change time from stat(2) */
uintptr_t fo_pad[3]; /* For future expansion */
char *fo_name; /* Null terminated file name */
} file_obj_t;
int port_create(void);
int port_associate(int port, int source, uintptr_t object, int events,
void *user);
int port_dissociate(int port, int source, uintptr_t object);
int port_send(int port, int events, void *user);
int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget,
const timespec_t *timeout);
#endif
#if (NXT_TEST_BUILD_DEVPOLL)
#define NXT_HAVE_DEVPOLL 1
#include <poll.h>
#include <sys/ioctl.h>
/* Solaris /dev/poll declarations */
#define POLLREMOVE 0x0800
#define DP_POLL 0xD001
#define DP_ISPOLLED 0xD002
struct dvpoll {
struct pollfd *dp_fds;
int dp_nfds;
int dp_timeout;
};
#endif
#if (NXT_TEST_BUILD_POLLSET)
#define NXT_HAVE_POLLSET 1
#include <poll.h>
/* AIX pollset declarations */
#define PS_ADD 0x0
#define PS_MOD 0x1
#define PS_DELETE 0x2
typedef int pollset_t;
struct poll_ctl {
short cmd;
short events;
int fd;
};
pollset_t pollset_create(int maxfd);
int pollset_destroy(pollset_t ps);
int pollset_query(pollset_t ps, struct pollfd *pollfd_query);
int pollset_ctl(pollset_t ps, struct poll_ctl *pollctl_array, int array_length);
int pollset_poll(pollset_t ps, struct pollfd *polldata_array, int array_length,
int timeout);
#endif
#if (NXT_TEST_BUILD_FREEBSD_SENDFILE || NXT_TEST_BUILD_MACOSX_SENDFILE)
#if !(NXT_FREEBSD) && !(NXT_MACOSX)
struct sf_hdtr {
struct iovec *headers;
int hdr_cnt;
struct iovec *trailers;
int trl_cnt;
};
#endif
#endif
#if (NXT_TEST_BUILD_SOLARIS_SENDFILEV)
/* Solaris declarations */
typedef struct sendfilevec {
int sfv_fd;
u_int sfv_flag;
off_t sfv_off;
size_t sfv_len;
} sendfilevec_t;
#define SFV_FD_SELF -2
ssize_t sendfilev(int fd, const struct sendfilevec *vec, int sfvcnt,
size_t *xferred);
#endif
#if (NXT_TEST_BUILD_AIX_SEND_FILE)
#ifndef uint_t
#define uint_t u_int
#endif
struct sf_parms {
void *header_data;
uint_t header_length;
int file_descriptor;
uint64_t file_size;
uint64_t file_offset;
int64_t file_bytes;
void *trailer_data;
uint_t trailer_length;
uint64_t bytes_sent;
};
#define SF_CLOSE 0x00000001 /* close the socket after completion */
#define SF_REUSE 0x00000002 /* reuse socket. not supported */
#define SF_DONT_CACHE 0x00000004 /* don't apply network buffer cache */
#define SF_SYNC_CACHE 0x00000008 /* sync/update network buffer cache */
ssize_t send_file(int *s, struct sf_parms *sf_iobuf, uint_t flags);
#endif
#endif /* _NXT_UNIX_TEST_BUILD_H_INCLUDED_ */