95 lines
1.5 KiB
C
95 lines
1.5 KiB
C
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
|
|
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<<i);
|
|
}
|
|
run_test_pipe(0);
|
|
}
|