/*
- * $Id$
- *
- * Copyright (c) 1987-2010 by the citadel.org team
- *
- * This program is free 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.
+ * 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, 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
*/
/*
#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? */
/*
*/
RETSIGTYPE timeout(int signum)
{
- lprintf(1, "Connection timed out; unable to reach citserver\n");
+ syslog(1, "Connection timed out; unable to reach citserver\n");
/* no exit here, since we need to server the connection unreachable thing. exit(3); */
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
- lprintf(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);
}
if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- lprintf(1, "Can't connect [%s]: %s\n", sockpath, strerror(errno));
+ syslog(1, "Can't connect [%s]: %s\n", sockpath, strerror(errno));
close(s);
return(-1);
}
/*
- * TCP client - connect to a host/port (FIXME this needs to be IPv6 enabled)
+ * TCP client - connect to a host/port
*/
-int tcp_connectsock(char *host, int port)
+int tcp_connectsock(char *host, char *service)
{
- struct sockaddr_in stSockAddr;
- int rv;
- int sock;
-
- sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock < 0) {
- lprintf(1, "Can't create socket: %s\n", strerror(errno));
+ struct in6_addr serveraddr;
+ struct addrinfo hints;
+ struct addrinfo *res = NULL;
+ struct addrinfo *ai = NULL;
+ int rc = (-1);
+ int s = (-1);
+
+ if ((host == NULL) || IsEmptyStr(host))
+ return (-1);
+ if ((service == NULL) || IsEmptyStr(service))
return (-1);
+
+ syslog(9, "tcp_connectsock(%s,%s)\n", host, service);
+
+ memset(&hints, 0x00, sizeof(hints));
+ hints.ai_flags = AI_NUMERICSERV;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+
+ /*
+ * Handle numeric IPv4 and IPv6 addresses
+ */
+ rc = inet_pton(AF_INET, host, &serveraddr);
+ if (rc == 1) { /* dotted quad */
+ hints.ai_family = AF_INET;
+ hints.ai_flags |= AI_NUMERICHOST;
+ } else {
+ rc = inet_pton(AF_INET6, host, &serveraddr);
+ if (rc == 1) { /* IPv6 address */
+ hints.ai_family = AF_INET6;
+ hints.ai_flags |= AI_NUMERICHOST;
+ }
}
- memset(&stSockAddr, 0, sizeof(struct sockaddr_in));
- stSockAddr.sin_family = AF_INET;
- stSockAddr.sin_port = htons(port);
- rv = inet_pton(AF_INET, host, &stSockAddr.sin_addr);
+ /* Begin the connection process */
- if (rv <= 0) {
- lprintf(1, "Can't grok %s: %s\n", host, strerror(errno));
- return (-1);
+ rc = getaddrinfo(host, service, &hints, &res);
+ if (rc != 0) {
+ syslog(1, "%s: %s\n", host, gai_strerror(rc));
+ freeaddrinfo(res);
+ return(-1);
}
- if (connect(sock, (const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in)) != 0) {
- lprintf(1, "Can't connect to %s.%d: %s\n", host, port, strerror(errno));
- close(sock);
- return (-1);
- }
+ /*
+ * Try all available addresses until we connect to one or until we run out.
+ */
+ for (ai = res; ai != NULL; ai = ai->ai_next) {
- return (sock);
-}
+ if (ai->ai_family == AF_INET) syslog(9, "Trying IPv4\n");
+ else if (ai->ai_family == AF_INET6) syslog(9, "Trying IPv6\n");
+ else syslog(9, "This is going to fail.\n");
+ s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (s < 0) {
+ syslog(1, "socket() failed: %s\n", strerror(errno));
+ freeaddrinfo(res);
+ return(-1);
+ }
+ rc = connect(s, ai->ai_addr, ai->ai_addrlen);
+ if (rc >= 0) {
+ freeaddrinfo(res);
+ return(s);
+ }
+ else {
+ syslog(1, "connect() failed: %s\n", strerror(errno));
+ close(s);
+ }
+ }
+ freeaddrinfo(res);
+ return(-1);
+}
/*
FlushStrBuf(WCC->MigrateReadLineBuf);
strbuf[len] = '\0';
#ifdef SERV_TRACE
- lprintf(9, "%3d<<<%s\n", WC->serv_sock, strbuf);
+ syslog(9, "%3d<<<%s\n", WC->serv_sock, strbuf);
#endif
return len;
}
const char *ErrStr = NULL;
int rc;
+ if (!WCC->connected)
+ return -1;
+
FlushStrBuf(buf);
rc = StrBufTCP_read_buffered_line_fast(buf,
WCC->ReadBuf,
&ErrStr);
if (rc < 0)
{
- lprintf(1, "Server connection broken: %s\n",
+ 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;
#ifdef SERV_TRACE
else
{
- long pos=0;
+ long pos = 0;
if (WCC->ReadPos != NULL)
- pos = WCC->ReadPos - ChrPtr(buf);
- lprintf(9, "%3d<<<[%ld]%s\n", WC->serv_sock, pos, ChrPtr(buf));
+ pos = WCC->ReadPos - ChrPtr(WCC->ReadBuf);
+ syslog(9, "%3d<<<[%ld]%s\n", WC->serv_sock, pos, ChrPtr(buf));
}
#endif
return rc;
&ErrStr);
if (rc < 0)
{
- lprintf(1, "Server connection broken: %s\n",
+ 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;
}
#ifdef SERV_TRACE
else
- lprintf(9, "%3d<<<BLOB: %ld bytes\n", WC->serv_sock, StrLength(buf));
+ syslog(9, "%3d<<<BLOB: %d bytes\n", WC->serv_sock, StrLength(buf));
#endif
return rc;
rc = StrBufReadBLOB(buf, &WCC->serv_sock, 1, BlobSize, &ErrStr);
if (rc < 0)
{
- lprintf(1, "Server connection broken: %s\n",
+ 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;
}
#ifdef SERV_TRACE
else
- lprintf(9, "%3d<<<BLOB: %ld bytes\n", WC->serv_sock, StrLength(buf));
+ syslog(9, "%3d<<<BLOB: %d bytes\n", WC->serv_sock, StrLength(buf));
#endif
return rc;
}
+
+void FlushReadBuf (void)
+{
+ long len;
+ const char *pch;
+ const char *pche;
+ wcsession *WCC = WC;
+
+ len = StrLength(WCC->ReadBuf);
+ if ((len > 0) &&
+ (WCC->ReadPos != NULL) &&
+ (WCC->ReadPos != StrBufNOTNULL))
+
+ {
+ pch = ChrPtr(WCC->ReadBuf);
+ pche = pch + len;
+ if (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"
+ "--------------------------------------------------------------------------------\n",
+ pch);
+ AppendImportantMessage(HKEY("Suppenkasper alert! watch your webcit logfile and get connected to your favourite opensource Crew."));
+ }
+ }
+
+ FlushStrBuf(WCC->ReadBuf);
+ WCC->ReadPos = NULL;
+
+
+}
+
+
/*
* send binary to server
* buf the buffer to write to citadel server
* nbytes how many bytes to send to citadel server
*/
-void serv_write(const char *buf, int nbytes)
+int serv_write(const char *buf, int nbytes)
{
wcsession *WCC = WC;
int bytes_written = 0;
int retval;
- FlushStrBuf(WCC->ReadBuf);
- WCC->ReadPos = NULL;
+ FlushReadBuf();
while (bytes_written < nbytes) {
retval = write(WCC->serv_sock, &buf[bytes_written],
nbytes - bytes_written);
if (retval < 1) {
const char *ErrStr = strerror(errno);
- lprintf(1, "Server connection broken: %s\n",
+ 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;
- return;
+ return 0;
}
bytes_written = bytes_written + retval;
}
+ return 1;
}
* send line to server
* string the line to send to the citadel server
*/
-void serv_puts(const char *string)
+int serv_puts(const char *string)
{
- wcsession *WCC = WC;
#ifdef SERV_TRACE
- lprintf(9, "%3d>>>%s\n", WC->serv_sock, string);
+ syslog(9, "%3d>>>%s\n", WC->serv_sock, string);
#endif
- FlushStrBuf(WCC->ReadBuf);
- WCC->ReadPos = NULL;
+ FlushReadBuf();
- serv_write(string, strlen(string));
- serv_write("\n", 1);
+ if (!serv_write(string, strlen(string)))
+ return 0;
+ return serv_write("\n", 1);
}
/*
* send line to server
* string the line to send to the citadel server
*/
-void serv_putbuf(const StrBuf *string)
+int serv_putbuf(const StrBuf *string)
{
- wcsession *WCC = WC;
#ifdef SERV_TRACE
- lprintf(9, "%3d>>>%s\n", WC->serv_sock, ChrPtr(string));
+ syslog(9, "%3d>>>%s\n", WC->serv_sock, ChrPtr(string));
#endif
- FlushStrBuf(WCC->ReadBuf);
- WCC->ReadPos = NULL;
+ FlushReadBuf();
- serv_write(ChrPtr(string), StrLength(string));
- serv_write("\n", 1);
+ if (!serv_write(ChrPtr(string), StrLength(string)))
+ return 0;
+ return serv_write("\n", 1);
}
* format the formatstring
* ... the entities to insert into format
*/
-void serv_printf(const char *format,...)
+int serv_printf(const char *format,...)
{
- wcsession *WCC = WC;
va_list arg_ptr;
char buf[SIZ];
size_t len;
+ int rc;
- FlushStrBuf(WCC->ReadBuf);
- WCC->ReadPos = NULL;
+ FlushReadBuf();
va_start(arg_ptr, format);
vsnprintf(buf, sizeof buf, format, arg_ptr);
len = strlen(buf);
buf[len++] = '\n';
buf[len] = '\0';
- serv_write(buf, len);
+ rc = serv_write(buf, len);
#ifdef SERV_TRACE
- lprintf(9, ">>>%s", buf);
+ syslog(9, ">>>%s", buf);
#endif
+ return rc;
}
-
-/**
- * Read binary data from server into memory using a series of
- * server READ commands.
- * \return the read content as StrBuf
+/*
+ * Read binary data from server into memory using a series of server READ commands.
+ * returns the read content as StrBuf
*/
int serv_read_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf)
{
wcsession *WCC = WC;
- size_t bytes = 0;
- size_t thisblock = 0;
-
- if (Ret == NULL)
- return -1;
+ size_t bytes_read = 0;
+ size_t this_block = 0;
+ int rc = 6;
+ int ServerRc = 6;
- if (MaxRead == -1)
- {
- serv_printf("READ %d|"SIZE_T_FMT, 0, total_len);
- if (StrBuf_ServGetln(Buf) > 0)
- {
- long YetRead;
- const char *ErrStr;
- const char *pch;
- int rc;
-
- if (GetServerStatus(Buf, NULL) == 6)
- {
- StrBufCutLeft(Buf, 4);
- thisblock = StrTol(Buf);
- if (WCC->serv_sock==-1) {
- FlushStrBuf(Ret);
- return -1;
- }
-
- if (WCC->ReadPos != NULL) {
- pch = ChrPtr(WCC->ReadBuf);
-
- YetRead = WCC->ReadPos - pch;
- if (YetRead > 0)
- {
- long StillThere;
-
- StillThere = StrLength(WCC->ReadBuf) -
- YetRead;
-
- StrBufPlain(Ret,
- WCC->ReadPos,
- StillThere);
- total_len -= StillThere;
- }
- FlushStrBuf(WCC->ReadBuf);
- WCC->ReadPos = NULL;
- }
- if (total_len > 0)
- {
- rc = StrBufReadBLOB(Ret,
- &WCC->serv_sock,
- 1,
- total_len,
- &ErrStr);
- if (rc < 0)
- {
- lprintf(1, "Server connection broken: %s\n",
- (ErrStr)?ErrStr:"");
- wc_backtrace();
- WCC->serv_sock = (-1);
- WCC->connected = 0;
- WCC->logged_in = 0;
- return rc;
- }
- else
- return StrLength(Ret);
- }
- else
- return StrLength(Ret);
- }
- }
- else
- return -1;
+ if (Ret == NULL) {
+ return -1;
}
- else while ((WCC->serv_sock!=-1) &&
- (bytes < total_len)) {
- thisblock = MaxRead;
- if ((total_len - bytes) < thisblock) {
- thisblock = total_len - bytes;
- if (thisblock == 0) {
- FlushStrBuf(Ret);
- return -1;
- }
+
+ while ((bytes_read < total_len) && (ServerRc == 6)) {
+
+ if (WCC->serv_sock==-1) {
+ FlushStrBuf(Ret);
+ return -1;
}
- serv_printf("READ %d|%d", (int)bytes, (int)thisblock);
- if (StrBuf_ServGetln(Buf) > 0)
+
+ serv_printf("READ "SIZE_T_FMT"|"SIZE_T_FMT, bytes_read, total_len-bytes_read);
+ if ( (rc = StrBuf_ServGetln(Buf) > 0) &&
+ (ServerRc = GetServerStatus(Buf, NULL), ServerRc == 6) )
{
- if (GetServerStatus(Buf, NULL) == 6)
- {
- StrBufCutLeft(Buf, 4);
- thisblock = StrTol(Buf);
- if (WCC->serv_sock==-1) {
- FlushStrBuf(Ret);
- return -1;
- }
- StrBuf_ServGetBLOBBuffered(Ret, thisblock);
- bytes += thisblock;
- }
- else {
- lprintf(3, "Error: %s\n", ChrPtr(Buf) + 4);
- return -1;
- }
+ if (rc < 0)
+ return rc;
+ StrBufCutLeft(Buf, 4);
+ this_block = StrTol(Buf);
+ rc = StrBuf_ServGetBLOBBuffered(Ret, this_block);
+ 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;
+ return rc;
+ }
+ bytes_read += rc;
}
}
+
return StrLength(Ret);
}
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) {
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);
sin6.sin6_family = AF_INET6;
sin4.sin_family = AF_INET;
- if ( (ip_addr == NULL) /* any IPv6 address */
+ if ( (ip_addr == NULL) /* any IPv6 */
|| (IsEmptyStr(ip_addr))
|| (!strcmp(ip_addr, "*"))
) {
ip_version = 6;
sin6.sin6_addr = in6addr_any;
}
- else if (!strcmp(ip_addr, "0.0.0.0")) /* any IPv4 address */
+ else if (!strcmp(ip_addr, "0.0.0.0")) /* any IPv4 */
{
ip_version = 4;
sin4.sin_addr.s_addr = INADDR_ANY;
{
ip_version = 4;
if (inet_pton(AF_INET, ip_addr, &sin4.sin_addr) <= 0) {
- lprintf(1, "Error binding to [%s] : %s\n", ip_addr, strerror(errno));
+ syslog(1, "Error binding to [%s] : %s\n", ip_addr, strerror(errno));
return (-WC_EXIT_BIND);
}
}
{
ip_version = 6;
if (inet_pton(AF_INET6, ip_addr, &sin6.sin6_addr) <= 0) {
- lprintf(1, "Error binding to [%s] : %s\n", ip_addr, strerror(errno));
+ syslog(1, "Error binding to [%s] : %s\n", ip_addr, strerror(errno));
return (-WC_EXIT_BIND);
}
}
if (port_number == 0) {
- lprintf(1, "Cannot start: no port number specified.\n");
+ syslog(1, "Cannot start: no port number specified.\n");
return (-WC_EXIT_BIND);
}
sin6.sin6_port = htons((u_short) port_number);
s = socket( ((ip_version == 6) ? PF_INET6 : PF_INET), SOCK_STREAM, (p->p_proto));
if (s < 0) {
- lprintf(1, "Can't create a listening socket: %s\n", strerror(errno));
+ syslog(1, "Can't create a listening socket: %s\n", strerror(errno));
return (-WC_EXIT_BIND);
}
/* Set some socket options that make sense. */
}
if (b < 0) {
- lprintf(1, "Can't bind: %s\n", strerror(errno));
+ syslog(1, "Can't bind: %s\n", strerror(errno));
+ close(s);
return (-WC_EXIT_BIND);
}
-
if (listen(s, queue_len) < 0) {
- lprintf(1, "Can't listen: %s\n", strerror(errno));
+ syslog(1, "Can't listen: %s\n", strerror(errno));
+ close(s);
return (-WC_EXIT_BIND);
}
return (s);
i = unlink(sockpath);
if ((i != 0) && (errno != ENOENT)) {
- lprintf(1, "webcit: can't unlink %s: %s\n",
+ syslog(1, "webcit: can't unlink %s: %s\n",
sockpath, strerror(errno));
return (-WC_EXIT_BIND);
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
- lprintf(1, "webcit: Can't create a unix domain socket: %s\n", strerror(errno));
+ syslog(1, "webcit: Can't create a unix domain socket: %s\n", strerror(errno));
return (-WC_EXIT_BIND);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- lprintf(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) {
- lprintf(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);
}
#ifdef HAVE_OPENSSL
if (is_https) {
- long bufremain;
+ long bufremain = 0;
long baselen;
baselen = StrLength(Target);
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);
- StrBufCutLeft(Hdr->ReadBuf, bufremain);
+ if (StrLength(Hdr->ReadBuf) > 0)
+ {
+ bufremain = StrLength(Hdr->ReadBuf) - (Hdr->Pos - ChrPtr(Hdr->ReadBuf));
+
+ if (bytes < bufremain)
+ bufremain = bytes;
+ StrBufAppendBufPlain(Target, Hdr->Pos, bufremain, 0);
+ StrBufCutLeft(Hdr->ReadBuf, bufremain);
+ }
if (bytes > bufremain)
{
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 {
- lprintf(2, "client_read_ssl() failed\n");
+ syslog(2, "client_read_ssl() failed\n");
return -1;
}
}
O_TERM,
&Error);
if (retval < 0) {
- lprintf(2, "client_read() failed: %s\n",
+ syslog(2, "client_read() failed: %s\n",
Error);
wc_backtrace();
return retval;
}
-#ifdef HTTP_TRACING
- write(2, "\033[32m", 5);
- write(2, buf, bytes);
- write(2, "\033[30m", 5);
-#endif
return 1;
}
if (CompressBuffer(WCC->WBuf) > 0)
hprintf("Content-encoding: gzip\r\n");
else {
- lprintf(CTDL_ALERT, "Compression failed: %d [%s] sending uncompressed\n", errno, strerror(errno));
+ syslog(LOG_ALERT, "Compression failed: %d [%s] sending uncompressed\n", errno, strerror(errno));
wc_backtrace();
}
}
}
#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);
FD_ZERO(&wset);
FD_SET(WCC->Hdr->http_sock, &wset);
if (select(WCC->Hdr->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
- lprintf(2, "client_write: Socket select failed (%s)\n", strerror(errno));
+ syslog(2, "client_write: Socket select failed (%s)\n", strerror(errno));
return -1;
}
}
(res = write(WCC->Hdr->http_sock,
ptr,
count)) == -1) {
- lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno));
+ syslog(2, "client_write: Socket write failed (%s)\n", strerror(errno));
wc_backtrace();
return res;
}
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);
FD_SET(WCC->Hdr->http_sock, &wset);
if (select(WCC->Hdr->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
- lprintf(2, "client_write: Socket select failed (%s)\n", strerror(errno));
+ syslog(2, "client_write: Socket select failed (%s)\n", strerror(errno));
return -1;
}
}
(res = write(WCC->Hdr->http_sock,
ptr,
count)) == -1) {
- lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno));
+ syslog(2, "client_write: Socket write failed (%s)\n", strerror(errno));
wc_backtrace();
return res;
}
{
FreeStrBuf(&sess->CLineBuf);
FreeStrBuf(&sess->ReadBuf);
+ sess->connected = 0;
sess->ReadPos = NULL;
FreeStrBuf(&sess->MigrateReadLineBuf);
- if (sess->serv_sock > 0)
+ if (sess->serv_sock > 0) {
+ syslog(LOG_DEBUG, "Closing socket %d", sess->serv_sock);
close(sess->serv_sock);
+ }
+ sess->serv_sock = -1;
}