static int use_async;
static int verify;
static int flags = MSG_DONTWAIT;
+static int poll_timeout = 0;
static int custom;
static int iterations = 1;
static int transfer_size = 1000;
return 0;
}
+static int do_poll(struct pollfd *fds)
+{
+ int ret;
+
+ do {
+ ret = rs_poll(fds, 1, poll_timeout);
+ } while (!ret);
+
+ return ret == 1 ? 0 : ret;
+}
+
static int send_xfer(int rs, int size)
{
struct pollfd fds;
for (offset = 0; offset < size; ) {
if (use_async) {
- ret = rs_poll(&fds, 1, -1);
- if (ret != 1)
+ ret = do_poll(&fds);
+ if (ret)
return ret;
}
for (offset = 0; offset < size; ) {
if (use_async) {
- ret = rs_poll(&fds, 1, -1);
- if (ret != 1)
+ ret = do_poll(&fds);
+ if (ret)
return ret;
}
break;
}
- rs_setsockopt(rs, IPPROTO_TCP, TCP_NODELAY,
- (void *) &no_delay, sizeof(no_delay));
+ val = 1;
+ rs_setsockopt(rs, IPPROTO_TCP, TCP_NODELAY, (void *) &val, sizeof(val));
if (flags & MSG_DONTWAIT) {
rs_fcntl(rs, F_SETFL, O_NONBLOCK);
fds.fd = lrs;
fds.events = POLLIN;
- ret = rs_poll(&fds, 1, -1);
- if (ret != 1) {
+ ret = do_poll(&fds);
+ if (ret) {
perror("rpoll");
goto close;
}
ret = rs_connect(rs, res->ai_addr, res->ai_addrlen);
if (ret && (errno != EINPROGRESS)) {
perror("rconnect");
- rs_close(rs);
- rs = ret;
+ goto err;
}
if (errno == EINPROGRESS) {
fds.fd = rs;
fds.events = POLLOUT;
- do {
- ret = rs_poll(&fds, 1, -1);
- } while (!ret);
+ ret = do_poll(&fds);
+ if (ret)
+ goto err;
}
free:
freeaddrinfo(res);
return rs;
+err:
+ freeaddrinfo(res);
+ rs_close(rs);
+ return ret;
}
static int run(void)
}
}
+ if (!(flags & MSG_DONTWAIT))
+ poll_timeout = -1;
+
ret = run();
return ret;
}