#include #include #include #include #include #include #include #include static int set_int_opt(int fd, int opt, int val) { return setsockopt(fd, SOL_SOCKET, opt, &val, sizeof(val)); } static int get_int_opt(int fd, int opt) { int ret, rc; socklen_t optlen = sizeof(ret); rc = getsockopt(fd, SOL_SOCKET, opt, &ret, &optlen); if (rc < 0) return rc; return ret; } static int set_nonblock(int fd) { int flags; flags = fcntl(fd, F_GETFL); if (flags < 0) return flags; flags |= O_NONBLOCK; return fcntl(fd, F_SETFL, flags); } static int run_test_socketpair(int tx_buf) { int rc, sd[2]; uint8_t buf[1024*1024]; memset(buf, 0, sizeof(buf)); rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sd); if (rc < 0) return rc; /* set the lowest possible transmit socket buffer */ set_int_opt(sd[0], SO_SNDBUF, tx_buf); set_nonblock(sd[0]); rc = write(sd[0], buf, sizeof(buf)); printf("socketpair: tx_buf %7d: written %7d of %ld\n", tx_buf, rc, sizeof(buf)); close(sd[0]); close(sd[1]); return 0; } static int run_test_pipe(int tx_buf) { int rc, sd[2]; uint8_t buf[1024*1024]; memset(buf, 0, sizeof(buf)); rc = pipe(sd); if (rc < 0) return rc; set_nonblock(sd[1]); rc = write(sd[1], buf, sizeof(buf)); printf("pipe: tx_buf %7d: written %7d of %ld\n", tx_buf, rc, sizeof(buf)); close(sd[0]); close(sd[1]); return 0; } int main(int argc, char **argv) { int i; for (i = 0; i < 20; i++) { run_test_socketpair(1<