From f2e4a5f9b0919dc16ea83a8826e8d52b02178b38 Mon Sep 17 00:00:00 2001 From: Jakub Sławiński Date: Sun, 3 Jul 2005 23:15:19 +0200 Subject: v0.7.1 - Added: afserver certificate storing and checking - Modified: generating keys and certificate - Fixed: creating apf directory - Fixed: some bugs in proxy tunnel initialization --- src/server_get.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 8 deletions(-) (limited to 'src/server_get.c') diff --git a/src/server_get.c b/src/server_get.c index 7ada39c..5066f54 100644 --- a/src/server_get.c +++ b/src/server_get.c @@ -22,28 +22,79 @@ #include "server_get.h" #include +#include int get_new_socket(int sockfd, char type, struct sockaddr *addr, socklen_t *addrlen, char* tunneltype) { int tmp; + int n, i; switch (type) { case 0: { return accept(sockfd, addr, addrlen); break; } case 1: { - if (read(sockfd, &tmp, 4) != 4) { - return -1; + i = 0; + while (i < 4) { + if ((n = read(sockfd, &tmp+i, 4-i)) != (4-i)) { + sleep(2); + if ((n > 0) && (n < 4)) { + i += n; + continue; + } + if ((n == -1) && (errno == EAGAIN)) { + continue; + } + return -1; + } + else { + break; + } } - if (read(sockfd, tunneltype, 1) != 1) { - return -1; + i = 0; + while (i < 1) { + if ((n = read(sockfd, tunneltype+i, 1-i)) != (1-i)) { + if ((n == -1) && (errno == EAGAIN)) { + continue; + } + return -1; + } + else { + break; + } } - if (read(sockfd, addrlen, 4) != 4) { - return -1; + i = 0; + while (i < 4) { + if ((n = read(sockfd, addrlen+i, 4-i)) != (4-i)) { + if ((n > 0) && (n < 4)) { + i += n; + continue; + } + if ((n == -1) && (errno == EAGAIN)) { + continue; + } + return -1; + } + else { + break; + } } - if (read(sockfd, addr, *addrlen) != *addrlen) { - return -1; + i = 0; + while (i < *addrlen) { + if ((n = read(sockfd, addr+i, (*addrlen)-i)) != ((*addrlen)-i)) { + if ((n > 0) && (n < *addrlen)) { + i += n; + continue; + } + if ((n == -1) && (errno == EAGAIN)) { + continue; + } + return -1; + } + else { + break; + } } return tmp; break; -- cgit v1.1