1294d1590SErik van der Kouwe #define DEBUG 0 2294d1590SErik van der Kouwe 3294d1590SErik van der Kouwe /* buffer for send/recv */ 4294d1590SErik van der Kouwe #define BUFSIZE (128) 5294d1590SErik van der Kouwe 6294d1590SErik van der Kouwe /* macro to display information about a failed test and increment the errct */ 7294d1590SErik van der Kouwe void test_fail_fl(char *msg, char *file, int line); 8294d1590SErik van der Kouwe #define test_fail(msg) test_fail_fl(msg, __FILE__, __LINE__) 9294d1590SErik van der Kouwe 10294d1590SErik van der Kouwe #if DEBUG == 1 11294d1590SErik van der Kouwe /* macros to display debugging information */ 12294d1590SErik van der Kouwe void debug_fl(char *msg, char *file, int line); 13294d1590SErik van der Kouwe #define debug(msg) debug_fl(msg, __FILE__, __LINE__) 14294d1590SErik van der Kouwe #else 15294d1590SErik van der Kouwe #define debug(msg) 16294d1590SErik van der Kouwe #endif 17294d1590SErik van der Kouwe 18294d1590SErik van der Kouwe #define SOCKET(sd,domain,type,protocol) \ 19294d1590SErik van der Kouwe do { \ 20294d1590SErik van der Kouwe errno = 0; \ 21294d1590SErik van der Kouwe sd = socket(domain, type, protocol); \ 22294d1590SErik van der Kouwe if (sd == -1) { \ 23294d1590SErik van der Kouwe test_fail("sd = socket(domain, type, protocol) failed");\ 24294d1590SErik van der Kouwe } \ 25294d1590SErik van der Kouwe } while (0) 26294d1590SErik van der Kouwe 27294d1590SErik van der Kouwe #define UNLINK(path) \ 28294d1590SErik van der Kouwe do { \ 29294d1590SErik van der Kouwe int rc; \ 30294d1590SErik van der Kouwe errno = 0; \ 31294d1590SErik van der Kouwe rc = unlink(path); \ 32294d1590SErik van der Kouwe if (rc == -1 && errno != ENOENT) { \ 33294d1590SErik van der Kouwe test_fail("unlink(path) failed"); \ 34294d1590SErik van der Kouwe } \ 35294d1590SErik van der Kouwe } while(0) 36294d1590SErik van der Kouwe 37294d1590SErik van der Kouwe #define SYMLINK(oldpath,newpath) \ 38294d1590SErik van der Kouwe do { \ 39294d1590SErik van der Kouwe int rc; \ 40294d1590SErik van der Kouwe errno = 0; \ 41294d1590SErik van der Kouwe rc = symlink(oldpath,newpath); \ 42294d1590SErik van der Kouwe if (rc == -1) { \ 43294d1590SErik van der Kouwe test_fail("symlink(oldpath,newpath) failed"); \ 44294d1590SErik van der Kouwe } \ 45294d1590SErik van der Kouwe } while(0) 46294d1590SErik van der Kouwe 47294d1590SErik van der Kouwe #define CLOSE(sd) \ 48294d1590SErik van der Kouwe do { \ 49294d1590SErik van der Kouwe int rc; \ 50294d1590SErik van der Kouwe errno = 0; \ 51294d1590SErik van der Kouwe rc = close(sd); \ 52294d1590SErik van der Kouwe if (rc == -1) { \ 53294d1590SErik van der Kouwe test_fail("close(sd) failed"); \ 54294d1590SErik van der Kouwe } \ 55294d1590SErik van der Kouwe } while (0) 56294d1590SErik van der Kouwe 57294d1590SErik van der Kouwe extern int server_ready; 58294d1590SErik van der Kouwe void test_xfer_sighdlr(int sig); 59294d1590SErik van der Kouwe 60294d1590SErik van der Kouwe struct socket_test_info { 61294d1590SErik van der Kouwe const struct sockaddr *clientaddr; 62294d1590SErik van der Kouwe socklen_t clientaddrlen; 63294d1590SErik van der Kouwe const struct sockaddr *clientaddr2; 64294d1590SErik van der Kouwe socklen_t clientaddr2len; 65294d1590SErik van der Kouwe const struct sockaddr *clientaddrsym; 66294d1590SErik van der Kouwe socklen_t clientaddrsymlen; 67294d1590SErik van der Kouwe int domain; 68294d1590SErik van der Kouwe int expected_rcvbuf; 69294d1590SErik van der Kouwe int expected_sndbuf; 70294d1590SErik van der Kouwe const struct sockaddr *serveraddr; 71294d1590SErik van der Kouwe socklen_t serveraddrlen; 72294d1590SErik van der Kouwe const struct sockaddr *serveraddr2; 73294d1590SErik van der Kouwe socklen_t serveraddr2len; 74294d1590SErik van der Kouwe int type; 75294d1590SErik van der Kouwe const int *types; 76294d1590SErik van der Kouwe size_t typecount; 77294d1590SErik van der Kouwe 78294d1590SErik van der Kouwe int ignore_accept_delay; /* success from accept after aborted connect */ 79294d1590SErik van der Kouwe int ignore_connect_delay; /* nb connect not instant */ 80294d1590SErik van der Kouwe int ignore_connect_unaccepted; /* connect succeeds without accept */ 81294d1590SErik van der Kouwe int ignore_select_delay; /* select delay reflecting other side nb op */ 82294d1590SErik van der Kouwe int ignore_send_waiting; /* can send while waiting for nb recv */ 83294d1590SErik van der Kouwe int ignore_write_conn_reset; /* write does not guarantee ECONNRESET */ 84294d1590SErik van der Kouwe 85294d1590SErik van der Kouwe void (* callback_check_sockaddr)(const struct sockaddr *sockaddr, 86294d1590SErik van der Kouwe socklen_t sockaddrlen, const char *callname, int addridx); 87294d1590SErik van der Kouwe void (* callback_cleanup)(void); 88294d1590SErik van der Kouwe void (* callback_xfer_peercred)(int sd); /* can be NULL */ 89294d1590SErik van der Kouwe void (* callback_xfer_prepclient)(void); /* can be NULL */ 90*27852ebeSDavid van Moolenbroek void (* callback_set_listen_opt)(int sd); /* can be NULL */ 91294d1590SErik van der Kouwe }; 92294d1590SErik van der Kouwe 93294d1590SErik van der Kouwe void test_abort_client_server(const struct socket_test_info *info, 94294d1590SErik van der Kouwe int abort_type); 95294d1590SErik van der Kouwe void test_bind(const struct socket_test_info *info); 96294d1590SErik van der Kouwe void test_close(const struct socket_test_info *info); 97294d1590SErik van der Kouwe void test_connect_close(const struct socket_test_info *info); 98294d1590SErik van der Kouwe void test_connect_nb(const struct socket_test_info *info); 99294d1590SErik van der Kouwe void test_dup(const struct socket_test_info *info); 100294d1590SErik van der Kouwe void test_dup2(const struct socket_test_info *info); 101294d1590SErik van der Kouwe void test_getsockname(const struct socket_test_info *info); 102294d1590SErik van der Kouwe void test_intr(const struct socket_test_info *info); 103294d1590SErik van der Kouwe void test_listen(const struct socket_test_info *info); 104294d1590SErik van der Kouwe void test_listen_close(const struct socket_test_info *info); 105294d1590SErik van der Kouwe void test_listen_close_nb(const struct socket_test_info *info); 106294d1590SErik van der Kouwe void test_msg_dgram(const struct socket_test_info *info); 107294d1590SErik van der Kouwe void test_nonblock(const struct socket_test_info *info); 108294d1590SErik van der Kouwe void test_read(const struct socket_test_info *info); 109294d1590SErik van der Kouwe void test_shutdown(const struct socket_test_info *info); 110294d1590SErik van der Kouwe void test_simple_client_server(const struct socket_test_info *info, int type); 111294d1590SErik van der Kouwe void test_sockopts(const struct socket_test_info *info); 112294d1590SErik van der Kouwe void test_socket(const struct socket_test_info *info); 113294d1590SErik van der Kouwe void test_write(const struct socket_test_info *info); 114294d1590SErik van der Kouwe void test_xfer(const struct socket_test_info *info); 115