X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=6c9b34f3564732ca1df7ebf8b97ab20942682c8a;hb=cfa7d8dcaa2bf3b270f3d7de31373cef2e60ff10;hp=37eaa29879ffbcace514b9f7ac1db48b398d4ce8;hpb=f96067856317189504d45b0b93a85166c77ef25b;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 37eaa2987..6c9b34f35 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -1,41 +1,26 @@ /* - * tcp_sockets.c - * - * TCP socket module for WebCit - * * $Id$ */ +/** + * \defgroup TcpSockets TCP client socket module for WebCit + * \ingroup CitadelCommunitacion + */ +/*@{*/ + +/* + * Uncomment this to log all communications with the Citadel server +#define SERV_TRACE 1 + */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "webcit.h" #include "webserver.h" - -#ifndef INADDR_NONE -#define INADDR_NONE 0xffffffff -#endif - +/** + * \brief register the timeout + * \param signum signalhandler number + * \return signals + */ RETSIGTYPE timeout(int signum) { lprintf(1, "Connection timed out.\n"); @@ -43,9 +28,9 @@ RETSIGTYPE timeout(int signum) } - -/* - * Connect a unix domain socket +/** + * \brief Connect a unix domain socket + * \param sockpath where to open a unix domain socket */ int uds_connectsock(char *sockpath) { @@ -66,6 +51,7 @@ int uds_connectsock(char *sockpath) if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { lprintf(1, "Can't connect: %s\n", strerror(errno)); + close(s); return(-1); } @@ -73,8 +59,10 @@ int uds_connectsock(char *sockpath) } -/* - * Connect a TCP/IP socket +/** + * \brief Connect a TCP/IP socket + * \param host the host to connect to + * \param service the service on the host to call */ int tcp_connectsock(char *host, char *service) { @@ -119,6 +107,7 @@ int tcp_connectsock(char *host, char *service) if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) { lprintf(1, "Can't connect to %s.%s: %s\n", host, service, strerror(errno)); + close(s); return (-1); } alarm(0); @@ -130,54 +119,106 @@ int tcp_connectsock(char *host, char *service) -/* - * Input binary data from socket +/** + * \brief Input binary data from socket + * \param buf the buffer to get the input to + * \param bytes the maximal number of bytes to read */ -void serv_read(char *buf, int bytes) +inline void _serv_read(char *buf, int bytes, struct wcsession *WCC) { int len, rlen; len = 0; while (len < bytes) { - rlen = read(WC->serv_sock, &buf[len], bytes - len); + rlen = read(WCC->serv_sock, &buf[len], bytes - len); if (rlen < 1) { lprintf(1, "Server connection broken: %s\n", strerror(errno)); - WC->connected = 0; - WC->logged_in = 0; + wc_backtrace(); + close(WCC->serv_sock); + WCC->serv_sock = (-1); + WCC->connected = 0; + WCC->logged_in = 0; + memset(buf, 0, bytes); return; } len = len + rlen; } } +void serv_read(char *buf, int bytes) +{ + struct wcsession *WCC = WC; + _serv_read(buf, bytes, WCC); +} -/* - * input string from pipe +/** + * \brief input string from pipe */ -void serv_gets(char *strbuf) +int serv_getln(char *strbuf, int bufsize) { + struct wcsession *WCC = WC; int ch, len; char buf[2]; len = 0; - strcpy(strbuf, ""); + strbuf[0] = 0; do { - serv_read(&buf[0], 1); + _serv_read(&buf[0], 1, WCC); ch = buf[0]; - strbuf[len++] = ch; - } while ((ch != 10) && (ch != 0) && (len < (SIZ-1))); - if (strbuf[len-1] == 10) strbuf[--len] = 0; - if (strbuf[len-1] == 13) strbuf[--len] = 0; - /* lprintf(9, ">%s\n", strbuf); */ + if ((ch != 13) && (ch != 10)) { + strbuf[len++] = ch; + } + } while ((ch != 10) && (ch != 0) && (len < (bufsize-1))); + strbuf[len] = 0; +#ifdef SERV_TRACE + lprintf(9, "%3d>%s\n", WC->serv_sock, strbuf); +#endif + return len; } +int StrBuf_ServGetln(StrBuf *buf) +{ + const char *ErrStr; + int rc; + + rc = StrBufTCP_read_line(buf, &WC->serv_sock, 0, &ErrStr); + if (rc < 0) + { + lprintf(1, "Server connection broken: %s\n", + ErrStr); + wc_backtrace(); + WC->serv_sock = (-1); + WC->connected = 0; + WC->logged_in = 0; + } + return rc; +} +int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) +{ + const char *Err; + int rc; + + rc = StrBufReadBLOB(buf, &WC->serv_sock, 1, BlobSize, &Err); + if (rc < 0) + { + lprintf(1, "Server connection broken: %s\n", + Err); + wc_backtrace(); + WC->serv_sock = (-1); + WC->connected = 0; + WC->logged_in = 0; + } + return rc; +} -/* - * send binary to server +/** + * \brief send binary to server + * \param buf the buffer to write to citadel server + * \param nbytes how many bytes to send to citadel server */ -void serv_write(char *buf, int nbytes) +void serv_write(const char *buf, int nbytes) { int bytes_written = 0; int retval; @@ -187,6 +228,8 @@ void serv_write(char *buf, int nbytes) if (retval < 1) { lprintf(1, "Server connection broken: %s\n", strerror(errno)); + close(WC->serv_sock); + WC->serv_sock = (-1); WC->connected = 0; WC->logged_in = 0; return; @@ -196,31 +239,56 @@ void serv_write(char *buf, int nbytes) } -/* - * send line to server +/** + * \brief send line to server + * \param string the line to send to the citadel server */ -void serv_puts(char *string) +void serv_puts(const char *string) { - char buf[SIZ]; +#ifdef SERV_TRACE + lprintf(9, "%3d<%s\n", WC->serv_sock, string); +#endif + serv_write(string, strlen(string)); + serv_write("\n", 1); +} - sprintf(buf, "%s\n", string); - serv_write(buf, strlen(buf)); +/** + * \brief send line to server + * \param string the line to send to the citadel server + */ +void serv_putbuf(const StrBuf *string) +{ +#ifdef SERV_TRACE + lprintf(9, "%3d<%s\n", WC->serv_sock, ChrPtr(string)); +#endif + serv_write(ChrPtr(string), StrLength(string)); + serv_write("\n", 1); } -/* - * convenience function to send stuff to the server +/** + * \brief convenience function to send stuff to the server + * \param format the formatstring + * \param ... the entities to insert into format */ void serv_printf(const char *format,...) { va_list arg_ptr; char buf[SIZ]; + size_t len; va_start(arg_ptr, format); - vsprintf(buf, format, arg_ptr); + vsnprintf(buf, sizeof buf, format, arg_ptr); va_end(arg_ptr); - strcat(buf, "\n"); - serv_write(buf, strlen(buf)); - /* lprintf(9, "<%s", buf); */ + len = strlen(buf); + buf[len++] = '\n'; + buf[len] = '\0'; + serv_write(buf, len); +#ifdef SERV_TRACE + lprintf(9, "<%s", buf); +#endif } + + +/*@}*/