#define DEBUG 0 /* buffer for send/recv */ #define BUFSIZE (128) /* macro to display information about a failed test and increment the errct */ void test_fail_fl(char *msg, char *file, int line); #define test_fail(msg) test_fail_fl(msg, __FILE__, __LINE__) #if DEBUG == 1 /* macros to display debugging information */ void debug_fl(char *msg, char *file, int line); #define debug(msg) debug_fl(msg, __FILE__, __LINE__) #else #define debug(msg) #endif #define SOCKET(sd,domain,type,protocol) \ do { \ errno = 0; \ sd = socket(domain, type, protocol); \ if (sd == -1) { \ test_fail("sd = socket(domain, type, protocol) failed");\ } \ } while (0) #define UNLINK(path) \ do { \ int rc; \ errno = 0; \ rc = unlink(path); \ if (rc == -1 && errno != ENOENT) { \ test_fail("unlink(path) failed"); \ } \ } while(0) #define SYMLINK(oldpath,newpath) \ do { \ int rc; \ errno = 0; \ rc = symlink(oldpath,newpath); \ if (rc == -1) { \ test_fail("symlink(oldpath,newpath) failed"); \ } \ } while(0) #define CLOSE(sd) \ do { \ int rc; \ errno = 0; \ rc = close(sd); \ if (rc == -1) { \ test_fail("close(sd) failed"); \ } \ } while (0) extern int server_ready; void test_xfer_sighdlr(int sig); struct socket_test_info { const struct sockaddr *clientaddr; socklen_t clientaddrlen; const struct sockaddr *clientaddr2; socklen_t clientaddr2len; const struct sockaddr *clientaddrsym; socklen_t clientaddrsymlen; int domain; int expected_rcvbuf; int expected_sndbuf; const struct sockaddr *serveraddr; socklen_t serveraddrlen; const struct sockaddr *serveraddr2; socklen_t serveraddr2len; int type; const int *types; size_t typecount; int buf_accept_intr; /* accept can return success when interrupted */ int bug_bind_in_use; /* bind does not return EADDRINUSE */ int bug_bind_null; /* bind segfaults with NULL pointer */ int bug_connect_after_close; /* connect succeeds after server closed */ int bug_select_nonblock; /* select unexpected results for nb sockets */ int bug_shutdown; /* shutdown not supported */ int bug_shutdown_not_conn; /* shutdown does not return ENOTCONN */ int bug_shutdown_read; /* shutdown does not support SHUT_RD */ int bug_sockopt_rcvbuf; /* get/setsockopt does not support SO_RCVBUF */ int bug_sockopt_sndbuf; /* get/setsockopt does not support SO_SNDBUF */ int ignore_accept_delay; /* success from accept after aborted connect */ int ignore_connect_delay; /* nb connect not instant */ int ignore_connect_unaccepted; /* connect succeeds without accept */ int ignore_read_conn_reset; /* read does not guarantee ECONNRESET */ int ignore_select_delay; /* select delay reflecting other side nb op */ int ignore_send_waiting; /* can send while waiting for nb recv */ int ignore_write_conn_reset; /* write does not guarantee ECONNRESET */ void (* callback_check_sockaddr)(const struct sockaddr *sockaddr, socklen_t sockaddrlen, const char *callname, int addridx); void (* callback_cleanup)(void); void (* callback_xfer_peercred)(int sd); /* can be NULL */ void (* callback_xfer_prepclient)(void); /* can be NULL */ }; void test_abort_client_server(const struct socket_test_info *info, int abort_type); void test_bind(const struct socket_test_info *info); void test_close(const struct socket_test_info *info); void test_connect_close(const struct socket_test_info *info); void test_connect_nb(const struct socket_test_info *info); void test_dup(const struct socket_test_info *info); void test_dup2(const struct socket_test_info *info); void test_getsockname(const struct socket_test_info *info); void test_intr(const struct socket_test_info *info); void test_listen(const struct socket_test_info *info); void test_listen_close(const struct socket_test_info *info); void test_listen_close_nb(const struct socket_test_info *info); void test_msg_dgram(const struct socket_test_info *info); void test_nonblock(const struct socket_test_info *info); void test_read(const struct socket_test_info *info); void test_shutdown(const struct socket_test_info *info); void test_simple_client_server(const struct socket_test_info *info, int type); void test_sockopts(const struct socket_test_info *info); void test_socket(const struct socket_test_info *info); void test_write(const struct socket_test_info *info); void test_xfer(const struct socket_test_info *info);