X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=89a30a38b390e6a059184ca23c60e445c1154fba;hb=c1bfa993f32198515f9994cde602f7bcd4da35d8;hp=a786c6cbea875915b96c05d616dfa1a6e2b5ecb4;hpb=5b8eae516c5277a1409378676151f2cc6083df1d;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index a786c6cbe..89a30a38b 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -1,11 +1,6 @@ /* * $Id$ */ -/** - * \defgroup TcpSockets TCP client socket module for WebCit - * \ingroup CitadelCommunitacion - */ -/*@{*/ /* * Uncomment this to log all communications with the Citadel server @@ -16,21 +11,21 @@ #include "webcit.h" #include "webserver.h" -/** - * \brief register the timeout - * \param signum signalhandler number +/* + * register the timeout + * signum signalhandler number * \return signals */ RETSIGTYPE timeout(int signum) { - lprintf(1, "Connection timed out.\n"); - exit(3); + lprintf(1, "Connection timed out; unable to reach citserver\n"); + /* no exit here, since we need to server the connection unreachable thing. exit(3); */ } -/** - * \brief Connect a unix domain socket - * \param sockpath where to open a unix domain socket +/* + * Connect a unix domain socket + * sockpath where to open a unix domain socket */ int uds_connectsock(char *sockpath) { @@ -43,13 +38,15 @@ int uds_connectsock(char *sockpath) s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { - lprintf(1, "Can't create socket: %s\n", + lprintf(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\n", + lprintf(1, "Can't connect [%s]: %s\n", + sockpath, strerror(errno)); close(s); return(-1); @@ -59,13 +56,14 @@ int uds_connectsock(char *sockpath) } -/** - * \brief Connect a TCP/IP socket - * \param host the host to connect to - * \param service the service on the host to call +/* + * Connect a TCP/IP socket + * host the host to connect to + * service the service on the host to call */ int tcp_connectsock(char *host, char *service) { + int fdflags; struct hostent *phe; struct servent *pse; struct protoent *ppe; @@ -113,110 +111,111 @@ int tcp_connectsock(char *host, char *service) alarm(0); signal(SIGALRM, SIG_IGN); + fdflags = fcntl(s, F_GETFL); + fdflags = fdflags | O_NONBLOCK; + fcntl(s, F_SETFD, fdflags); return (s); } - -/** - * \brief Input binary data from socket - * \param buf the buffer to get the input to - * \param bytes the maximal number of bytes to read - */ -inline void _serv_read(char *buf, int bytes, struct wcsession *WCC) -{ - int len, rlen; - - len = 0; - while (len < bytes) { - rlen = read(WCC->serv_sock, &buf[len], bytes - len); - if (rlen < 1) { - lprintf(1, "Server connection broken: %s\n", - strerror(errno)); - 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); -} - -/** - * \brief input string from pipe +/* + * input string from pipe */ int serv_getln(char *strbuf, int bufsize) { - struct wcsession *WCC = WC; - int ch, len; - char buf[2]; - - len = 0; - strbuf[0] = 0; - do { - _serv_read(&buf[0], 1, WCC); - ch = buf[0]; - if ((ch != 13) && (ch != 10)) { - strbuf[len++] = ch; - } - } while ((ch != 10) && (ch != 0) && (len < (bufsize-1))); - strbuf[len] = 0; + wcsession *WCC = WC; + int len; + + *strbuf = '\0'; + StrBuf_ServGetln(WCC->MigrateReadLineBuf); + len = StrLength(WCC->MigrateReadLineBuf); + if (len > bufsize) + len = bufsize - 1; + memcpy(strbuf, ChrPtr(WCC->MigrateReadLineBuf), len); + FlushStrBuf(WCC->MigrateReadLineBuf); + strbuf[len] = '\0'; #ifdef SERV_TRACE lprintf(9, "%3d>%s\n", WC->serv_sock, strbuf); #endif return len; } + int StrBuf_ServGetln(StrBuf *buf) { + wcsession *WCC = WC; const char *ErrStr; int rc; - rc = StrBufTCP_read_line(buf, &WC->serv_sock, 0, &ErrStr); + rc = StrBufTCP_read_buffered_line_fast(buf, + WCC->ReadBuf, + &WCC->ReadPos, + &WCC->serv_sock, + 5, 1, + &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; + WCC->serv_sock = (-1); + WCC->connected = 0; + WCC->logged_in = 0; + } + return rc; +} + +int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize) +{ + wcsession *WCC = WC; + const char *Err; + int rc; + + rc = StrBufReadBLOBBuffered(buf, + WCC->ReadBuf, + &WCC->ReadPos, + &WCC->serv_sock, + 1, + BlobSize, + NNN_TERM, + &Err); + if (rc < 0) + { + lprintf(1, "Server connection broken: %s\n", + Err); + wc_backtrace(); + WCC->serv_sock = (-1); + WCC->connected = 0; + WCC->logged_in = 0; } return rc; } int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) { + wcsession *WCC = WC; const char *Err; int rc; - rc = StrBufReadBLOB(buf, &WC->serv_sock, 1, BlobSize, &Err); + WCC->ReadPos = NULL; + rc = StrBufReadBLOB(buf, &WCC->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; + WCC->serv_sock = (-1); + WCC->connected = 0; + WCC->logged_in = 0; } return rc; } -/** - * \brief send binary to server - * \param buf the buffer to write to citadel server - * \param nbytes how many bytes to send to citadel server +/* + * 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) { @@ -239,31 +238,56 @@ void serv_write(const char *buf, int nbytes) } -/** - * \brief send line to server - * \param string the line to send to the citadel server +/* + * send line to server + * string the line to send to the citadel server */ void serv_puts(const char *string) { + wcsession *WCC = WC; #ifdef SERV_TRACE lprintf(9, "%3d<%s\n", WC->serv_sock, string); #endif + FlushStrBuf(WCC->ReadBuf); + WCC->ReadPos = NULL; + serv_write(string, strlen(string)); serv_write("\n", 1); } +/* + * send line to server + * string the line to send to the citadel server + */ +void serv_putbuf(const StrBuf *string) +{ + wcsession *WCC = WC; +#ifdef SERV_TRACE + lprintf(9, "%3d<%s\n", WC->serv_sock, ChrPtr(string)); +#endif + FlushStrBuf(WCC->ReadBuf); + WCC->ReadPos = NULL; + + serv_write(ChrPtr(string), StrLength(string)); + serv_write("\n", 1); +} + -/** - * \brief convenience function to send stuff to the server - * \param format the formatstring - * \param ... the entities to insert into format +/* + * convenience function to send stuff to the server + * format the formatstring + * ... the entities to insert into format */ void serv_printf(const char *format,...) { + wcsession *WCC = WC; va_list arg_ptr; char buf[SIZ]; size_t len; + FlushStrBuf(WCC->ReadBuf); + WCC->ReadPos = NULL; + va_start(arg_ptr, format); vsnprintf(buf, sizeof buf, format, arg_ptr); va_end(arg_ptr); @@ -277,5 +301,3 @@ void serv_printf(const char *format,...) #endif } - -/*@}*/