X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=15a1c1c6998200697a708adcc23c62fb3e68abfc;hb=f5230462e264c0ec4d2a01a2a8e7074f5a37934b;hp=00f7a273ce9cf29517ff758ef3481f731307782a;hpb=016d4c328531362f6af77193507daec7e3c70de3;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 00f7a273c..15a1c1c69 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -14,9 +14,7 @@ extern int DisableGzip; /* - * register the timeout - * signum signalhandler number - * \return signals + * register the timeout */ RETSIGTYPE timeout(int signum) { @@ -398,6 +396,7 @@ int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target) */ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) { + struct protoent *p; struct sockaddr_in sin; int s, i; @@ -419,7 +418,9 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) } sin.sin_port = htons((u_short) port_number); - s = socket(PF_INET, SOCK_STREAM, (getprotobyname("tcp")->p_proto)); + p = getprotobyname("tcp"); + + s = socket(PF_INET, SOCK_STREAM, (p->p_proto)); if (s < 0) { lprintf(1, "Can't create a socket: %s\n", strerror(errno)); exit(WC_EXIT_BIND); @@ -520,27 +521,38 @@ int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) #ifdef HAVE_OPENSSL if (is_https) { - long bufremain = StrLength(Hdr->ReadBuf) - (Hdr->Pos - ChrPtr(Hdr->ReadBuf)); + long bufremain; + + if (Hdr->Pos == NULL) + Hdr->Pos = ChrPtr(Hdr->ReadBuf); + bufremain = StrLength(Hdr->ReadBuf) - (Hdr->Pos - ChrPtr(Hdr->ReadBuf)); + + if (bytes < bufremain) + bufremain = bytes; StrBufAppendBufPlain(Target, Hdr->Pos, bufremain, 0); - Hdr->Pos = NULL; - FlushStrBuf(Hdr->ReadBuf); - - while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes) && - (retval >= 0)) - retval = client_read_sslbuffer(Hdr->ReadBuf, timeout); - if (retval >= 0) { - StrBufAppendBuf(Target, Hdr->ReadBuf, 0); /* todo: Buf > bytes? */ + StrBufCutLeft(Hdr->ReadBuf, bufremain); + + if (bytes > bufremain) + { + while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes) && + (retval >= 0)) + retval = client_read_sslbuffer(Hdr->ReadBuf, timeout); + if (retval >= 0) { + StrBufAppendBuf(Target, Hdr->ReadBuf, 0); /* todo: Buf > bytes? */ #ifdef HTTP_TRACING - write(2, "\033[32m", 5); - write(2, buf, bytes); - write(2, "\033[30m", 5); + write(2, "\033[32m", 5); + write(2, buf, bytes); + write(2, "\033[30m", 5); #endif - return 1; - } - else { - lprintf(2, "client_read_ssl() failed\n"); - return -1; + return 1; + } + else { + lprintf(2, "client_read_ssl() failed\n"); + return -1; + } } + else + return 1; } #endif @@ -586,7 +598,7 @@ long end_burst(void) wcsession *WCC = WC; const char *ptr, *eptr; long count; - ssize_t res; + ssize_t res = 0; fd_set wset; int fdflags; @@ -618,9 +630,11 @@ long end_burst(void) write(2, ptr, StrLength(WCC->WBuf)); write(2, "\033[30m", 5); #endif + if (WCC->Hdr->http_sock == -1) + return -1; fdflags = fcntl(WC->Hdr->http_sock, F_GETFL); - while (ptr < eptr) { + while ((ptr < eptr) && (WCC->Hdr->http_sock != -1)){ if ((fdflags & O_NONBLOCK) == O_NONBLOCK) { FD_ZERO(&wset); FD_SET(WCC->Hdr->http_sock, &wset); @@ -630,7 +644,8 @@ long end_burst(void) } } - if ((res = write(WCC->Hdr->http_sock, + if ((WCC->Hdr->http_sock == -1) || + (res = write(WCC->Hdr->http_sock, ptr, count)) == -1) { lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno)); @@ -652,7 +667,7 @@ long end_burst(void) write(2, "\033[30m", 5); #endif - while (ptr < eptr) { + while ((ptr < eptr) && (WCC->Hdr->http_sock != -1)) { if ((fdflags & O_NONBLOCK) == O_NONBLOCK) { FD_ZERO(&wset); FD_SET(WCC->Hdr->http_sock, &wset); @@ -662,7 +677,8 @@ long end_burst(void) } } - if ((res = write(WCC->Hdr->http_sock, + if ((WCC->Hdr->http_sock == -1) || + (res = write(WCC->Hdr->http_sock, ptr, count)) == -1) { lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno)); @@ -689,6 +705,8 @@ int lingering_close(int fd) struct timeval tv, start; gettimeofday(&start, NULL); + if (fd == -1) + return -1; shutdown(fd, 1); do { do {