Keep last return from fd_{read,write} in netio
This commit is contained in:
48
glorytun.c
48
glorytun.c
@@ -28,8 +28,10 @@ struct option {
|
|||||||
|
|
||||||
struct netio {
|
struct netio {
|
||||||
int fd;
|
int fd;
|
||||||
buffer_t recv;
|
struct {
|
||||||
buffer_t send; // TODO
|
buffer_t buf;
|
||||||
|
ssize_t ret;
|
||||||
|
} write, read;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct crypto_ctx {
|
struct crypto_ctx {
|
||||||
@@ -634,8 +636,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
fd_set_nonblock(tun.fd);
|
fd_set_nonblock(tun.fd);
|
||||||
|
|
||||||
buffer_setup(&tun.recv, NULL, GT_BUFFER_SIZE);
|
buffer_setup(&sock.write.buf, NULL, GT_BUFFER_SIZE);
|
||||||
buffer_setup(&sock.recv, NULL, GT_BUFFER_SIZE);
|
buffer_setup(&sock.read.buf, NULL, GT_BUFFER_SIZE);
|
||||||
|
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
||||||
@@ -687,11 +689,11 @@ int main (int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_shift(&tun.recv);
|
buffer_shift(&sock.write.buf);
|
||||||
|
|
||||||
if (fds[0].revents & POLLIN) {
|
if (fds[0].revents & POLLIN) {
|
||||||
while (1) {
|
while (1) {
|
||||||
if (buffer_write_size(&tun.recv)<sizeof(tunr.buf)+16)
|
if (buffer_write_size(&sock.write.buf)<sizeof(tunr.buf)+16)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ssize_t r = fd_read(fds[0].fd, tunr.buf, sizeof(tunr.buf));
|
ssize_t r = fd_read(fds[0].fd, tunr.buf, sizeof(tunr.buf));
|
||||||
@@ -710,36 +712,36 @@ int main (int argc, char **argv)
|
|||||||
if (r<ip_size)
|
if (r<ip_size)
|
||||||
set_ip_size(tunr.buf, r);
|
set_ip_size(tunr.buf, r);
|
||||||
|
|
||||||
encrypt_packet(&ctx, tunr.buf, r, &tun.recv);
|
encrypt_packet(&ctx, tunr.buf, r, &sock.write.buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fds[1].revents & POLLOUT)
|
if (fds[1].revents & POLLOUT)
|
||||||
fds[1].events = POLLIN;
|
fds[1].events = POLLIN;
|
||||||
|
|
||||||
if (buffer_read_size(&tun.recv)) {
|
if (buffer_read_size(&sock.write.buf)) {
|
||||||
ssize_t r = fd_write(fds[1].fd, tun.recv.read, buffer_read_size(&tun.recv));
|
sock.write.ret = fd_write(fds[1].fd, sock.write.buf.read, buffer_read_size(&sock.write.buf));
|
||||||
|
|
||||||
if (!r)
|
if (!sock.write.ret)
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
||||||
if (r==-1)
|
if (sock.write.ret==-1)
|
||||||
fds[1].events = POLLIN|POLLOUT;
|
fds[1].events = POLLIN|POLLOUT;
|
||||||
|
|
||||||
if (r>0)
|
if (sock.write.ret>0)
|
||||||
tun.recv.read += r;
|
sock.write.buf.read += sock.write.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_shift(&sock.recv);
|
buffer_shift(&sock.read.buf);
|
||||||
|
|
||||||
if (fds[1].revents & POLLIN) {
|
if (fds[1].revents & POLLIN) {
|
||||||
ssize_t r = fd_read(fds[1].fd, sock.recv.write, buffer_write_size(&sock.recv));
|
sock.read.ret = fd_read(fds[1].fd, sock.read.buf.write, buffer_write_size(&sock.read.buf));
|
||||||
|
|
||||||
if (!r)
|
if (!sock.read.ret)
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
||||||
if (r>0)
|
if (sock.read.ret>0)
|
||||||
sock.recv.write += r;
|
sock.read.buf.write += sock.read.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fds[0].revents & POLLOUT)
|
if (fds[0].revents & POLLOUT)
|
||||||
@@ -747,8 +749,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!tunw.size) {
|
if (!tunw.size) {
|
||||||
size_t size = buffer_read_size(&sock.recv);
|
size_t size = buffer_read_size(&sock.read.buf);
|
||||||
ssize_t ip_size = get_ip_size(sock.recv.read, size);
|
ssize_t ip_size = get_ip_size(sock.read.buf.read, size);
|
||||||
|
|
||||||
if (!ip_size)
|
if (!ip_size)
|
||||||
goto restart;
|
goto restart;
|
||||||
@@ -756,7 +758,7 @@ int main (int argc, char **argv)
|
|||||||
if (ip_size<0 || (size_t)ip_size+16>size)
|
if (ip_size<0 || (size_t)ip_size+16>size)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (decrypt_packet(&ctx, tunw.buf, ip_size, &sock.recv)) {
|
if (decrypt_packet(&ctx, tunw.buf, ip_size, &sock.read.buf)) {
|
||||||
fprintf(stderr, "%s: message could not be verified!\n", sockname);
|
fprintf(stderr, "%s: message could not be verified!\n", sockname);
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
@@ -792,8 +794,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
freeaddrinfo(ai);
|
freeaddrinfo(ai);
|
||||||
|
|
||||||
free(tun.recv.data);
|
free(sock.write.buf.data);
|
||||||
free(sock.recv.data);
|
free(sock.read.buf.data);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user