/*
- * 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
*/
/*
#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? */
/*
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);
}
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)
{
- syslog(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;
&ErrStr);
if (rc < 0)
{
- syslog(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
- syslog(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)
{
- syslog(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
- syslog(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;
pche = pch + len;
if (WCC->ReadPos != pche)
{
- syslog(1, "ERROR: somebody didn't eat his soup! Remaing Chars: %d [%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"
* 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;
nbytes - bytes_written);
if (retval < 1) {
const char *ErrStr = strerror(errno);
- syslog(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)
{
#ifdef SERV_TRACE
syslog(9, "%3d>>>%s\n", WC->serv_sock, string);
#endif
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)
{
#ifdef SERV_TRACE
syslog(9, "%3d>>>%s\n", WC->serv_sock, ChrPtr(string));
#endif
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,...)
{
va_list arg_ptr;
char buf[SIZ];
size_t len;
+ int rc;
FlushReadBuf();
len = strlen(buf);
buf[len++] = '\n';
buf[len] = '\0';
- serv_write(buf, len);
+ rc = serv_write(buf, len);
#ifdef SERV_TRACE
syslog(9, ">>>%s", buf);
#endif
+ return rc;
}
return -1;
}
- serv_printf("READ %d|%d", bytes_read, total_len-bytes_read);
- if ( (StrBuf_ServGetln(Buf) > 0) && (GetServerStatus(Buf, NULL) == 6) ) {
+ serv_printf("READ "SIZE_T_FMT"|"SIZE_T_FMT, bytes_read, total_len-bytes_read);
+ if ( (rc = StrBuf_ServGetln(Buf) > 0) && (GetServerStatus(Buf, NULL) == 6) )
+ {
+ 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;
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);
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);
}
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);
}
#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 {
return retval;
}
-#ifdef HTTP_TRACING
- write(2, "\033[32m", 5);
- write(2, buf, bytes);
- write(2, "\033[30m", 5);
-#endif
return 1;
}
}
#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);
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);
{
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;
}