X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=e45231f56a3dd21eba074192ca3facc0d4012ae8;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=8d3c6a885d442b736a56a202d267f5989ace6541;hpb=a4f0e3fbc3ff6e65601cf305b952199172387ba3;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 8d3c6a885..e45231f56 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -1,19 +1,13 @@ /* - * Copyright (c) 1987-2011 by the citadel.org team + * Copyright (c) 1987-2012 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * + * it under the terms of the GNU General Public License, version 3. + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* @@ -21,11 +15,9 @@ #define SERV_TRACE 1 */ - #include "webcit.h" #include "webserver.h" -extern int DisableGzip; long MaxRead = -1; /* should we do READ scattered or all at once? */ /* @@ -52,7 +44,7 @@ int uds_connectsock(char *sockpath) s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { - syslog(1, "Can't create socket[%s]: %s\n", sockpath, strerror(errno)); + syslog(1, "Can't create socket [%s]: %s\n", sockpath, strerror(errno)); return(-1); } @@ -173,6 +165,9 @@ int StrBuf_ServGetln(StrBuf *buf) const char *ErrStr = NULL; int rc; + if (!WCC->connected) + return -1; + FlushStrBuf(buf); rc = StrBufTCP_read_buffered_line_fast(buf, WCC->ReadBuf, @@ -185,6 +180,7 @@ int StrBuf_ServGetln(StrBuf *buf) syslog(1, "StrBuf_ServGetln(): Server connection broken: %s\n", (ErrStr)?ErrStr:""); wc_backtrace(); + if (WCC->serv_sock > 0) close(WCC->serv_sock); WCC->serv_sock = (-1); WCC->connected = 0; WCC->logged_in = 0; @@ -220,6 +216,7 @@ int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize) syslog(1, "StrBuf_ServGetBLOBBuffered(): Server connection broken: %s\n", (ErrStr)?ErrStr:""); wc_backtrace(); + if (WCC->serv_sock > 0) close(WCC->serv_sock); WCC->serv_sock = (-1); WCC->connected = 0; WCC->logged_in = 0; @@ -245,6 +242,7 @@ int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) syslog(1, "StrBuf_ServGetBLOB(): Server connection broken: %s\n", (ErrStr)?ErrStr:""); wc_backtrace(); + if (WCC->serv_sock > 0) close(WCC->serv_sock); WCC->serv_sock = (-1); WCC->connected = 0; WCC->logged_in = 0; @@ -275,8 +273,11 @@ void FlushReadBuf (void) pche = pch + len; if (WCC->ReadPos != pche) { - syslog(1, "ERROR: somebody didn't eat his soup! Remaing Chars: %ld [%s]\n", - pche - WCC->ReadPos, pche); + syslog(1, + "ERROR: somebody didn't eat his soup! Remaing Chars: %ld [%s]\n", + (long)(pche - WCC->ReadPos), + pche + ); syslog(1, "--------------------------------------------------------------------------------\n" "Whole buf: [%s]\n" @@ -312,7 +313,7 @@ int serv_write(const char *buf, int nbytes) const char *ErrStr = strerror(errno); syslog(1, "serv_write(): Server connection broken: %s\n", (ErrStr)?ErrStr:""); - close(WCC->serv_sock); + if (WCC->serv_sock > 0) close(WCC->serv_sock); WCC->serv_sock = (-1); WCC->connected = 0; WCC->logged_in = 0; @@ -419,6 +420,7 @@ int serv_read_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf) if (rc < 0) { syslog(1, "Server connection broken during download\n"); wc_backtrace(); + if (WCC->serv_sock > 0) close(WCC->serv_sock); WCC->serv_sock = (-1); WCC->connected = 0; WCC->logged_in = 0; @@ -441,7 +443,8 @@ int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target) if (is_https) { int ntries = 0; - if (StrLength(Hdr->ReadBuf) > 0) { + if (StrLength(Hdr->ReadBuf) > 0) + { pchs = ChrPtr(Hdr->ReadBuf); pch = strchr(pchs, '\n'); if (pch != NULL) { @@ -464,6 +467,8 @@ int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target) retval = client_read_sslbuffer(Hdr->ReadBuf, SLEEPING); pchs = ChrPtr(Hdr->ReadBuf); pch = strchr(pchs, '\n'); + if (pch == NULL) + retval = 0; } if (retval == 0) { sleeeeeeeeeep(1); @@ -574,11 +579,13 @@ int webcit_tcp_server(char *ip_addr, int port_number, int queue_len) if (b < 0) { syslog(1, "Can't bind: %s\n", strerror(errno)); + close(s); return (-WC_EXIT_BIND); } if (listen(s, queue_len) < 0) { syslog(1, "Can't listen: %s\n", strerror(errno)); + close(s); return (-WC_EXIT_BIND); } return (s); @@ -618,14 +625,14 @@ int webcit_uds_server(char *sockpath, int queue_len) } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - syslog(1, "webcit: Can't bind: %s\n", - strerror(errno)); + syslog(1, "webcit: Can't bind: %s\n", strerror(errno)); + close(s); return (-WC_EXIT_BIND); } if (listen(s, actual_queue_len) < 0) { - syslog(1, "webcit: Can't listen: %s\n", - strerror(errno)); + syslog(1, "webcit: Can't listen: %s\n", strerror(errno)); + close(s); return (-WC_EXIT_BIND); } @@ -681,11 +688,6 @@ int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) 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); -#endif return 1; } else { @@ -713,11 +715,6 @@ int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) return retval; } -#ifdef HTTP_TRACING - write(2, "\033[32m", 5); - write(2, buf, bytes); - write(2, "\033[30m", 5); -#endif return 1; } @@ -776,13 +773,6 @@ long end_burst(void) } #endif - -#ifdef HTTP_TRACING - - write(2, "\033[34m", 5); - 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); @@ -813,13 +803,6 @@ long end_burst(void) count = StrLength(WCC->WBuf); eptr = ptr + count; -#ifdef HTTP_TRACING - - write(2, "\033[34m", 5); - write(2, ptr, StrLength(WCC->WBuf)); - write(2, "\033[30m", 5); -#endif - while ((ptr < eptr) && (WCC->Hdr->http_sock != -1)) { if ((fdflags & O_NONBLOCK) == O_NONBLOCK) { FD_ZERO(&wset); @@ -924,10 +907,12 @@ SessionDestroyModule_TCPSOCKETS { FreeStrBuf(&sess->CLineBuf); FreeStrBuf(&sess->ReadBuf); + sess->connected = 0; sess->ReadPos = NULL; FreeStrBuf(&sess->MigrateReadLineBuf); if (sess->serv_sock > 0) { syslog(LOG_DEBUG, "Closing socket %d", sess->serv_sock); close(sess->serv_sock); } + sess->serv_sock = -1; }