X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=d03672eacc7edebde02b9d1b1e3b66d67af17d79;hb=d8abfc1ab880919a13cfc012427eab7ee0363334;hp=9771fec8f75f2e03847e0e32f4787f897b559ab8;hpb=26ff89e7128fc3c41fad52269e746e4248c7148e;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 9771fec8f..d03672eac 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -1,228 +1,240 @@ /* - * tcp_sockets.c - * - * TCP socket module for WebCit - * - * version 1.3 - * + * $Id$ */ +/** + * \defgroup TcpSockets TCP client socket module for WebCit + * \ingroup CitadelCommunitacion + */ +/*@{*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "webcit.h" +/* + * Uncomment this to log all communications with the Citadel server +#define SERV_TRACE 1 + */ -char server_is_local = 0; +#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"); + exit(3); +} -extern int errno; -int serv_sock; +/** + * \brief Connect a unix domain socket + * \param sockpath where to open a unix domain socket + */ +int uds_connectsock(char *sockpath) +{ + struct sockaddr_un addr; + int s; + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, sockpath, sizeof addr.sun_path); + + s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s < 0) { + lprintf(1, "Can't create socket: %s\n", + strerror(errno)); + return(-1); + } -#ifndef DONT_PROTO_HTONS -u_short htons(); -#endif -u_long inet_addr(); + if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + lprintf(1, "Can't connect: %s\n", + strerror(errno)); + close(s); + return(-1); + } + return s; +} -void timeout() { - printf("\rConnection timed out.\n"); - exit(3); - } -int connectsock(host,service,protocol) -char *host; -char *service; -char *protocol; { +/** + * \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) +{ struct hostent *phe; struct servent *pse; struct protoent *ppe; struct sockaddr_in sin; - int s,type; + int s; - bzero((char *)&sin,sizeof(sin)); + memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; - pse=getservbyname(service,protocol); + pse = getservbyname(service, "tcp"); if (pse) { sin.sin_port = pse->s_port; - } - else if ((sin.sin_port = htons((u_short)atoi(service))) == 0) { - fprintf(stderr,"can't get %s service entry: %s\n", - service,strerror(errno)); - return(-1); - } - - phe=gethostbyname(host); + } else if ((sin.sin_port = htons((u_short) atoi(service))) == 0) { + lprintf(1, "Can't get %s service entry\n", service); + return (-1); + } + phe = gethostbyname(host); if (phe) { - bcopy(phe->h_addr,(char *)&sin.sin_addr,phe->h_length); - } - else if ((sin.sin_addr.s_addr = inet_addr(host))==INADDR_NONE) { - fprintf(stderr,"can't get %s host entry: %s\n", - host,strerror(errno)); - return(-1); - } - - if ((ppe=getprotobyname(protocol))==0) { - fprintf(stderr,"can't get %s protocol entry: %s\n", - protocol,strerror(errno)); - return(-1); - } - - if (!strcmp(protocol,"udp")) - type = SOCK_DGRAM; - else - type = SOCK_STREAM; - - s = socket(PF_INET,type,ppe->p_proto); - if (s<0) { - fprintf(stderr,"can't create socket: %s\n",strerror(errno)); - return(-1); - } - + memcpy(&sin.sin_addr, phe->h_addr, phe->h_length); + } else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) { + lprintf(1, "Can't get %s host entry: %s\n", + host, strerror(errno)); + return (-1); + } + if ((ppe = getprotobyname("tcp")) == 0) { + lprintf(1, "Can't get TCP protocol entry: %s\n", + strerror(errno)); + return (-1); + } - signal(SIGALRM,timeout); + s = socket(PF_INET, SOCK_STREAM, ppe->p_proto); + if (s < 0) { + lprintf(1, "Can't create socket: %s\n", strerror(errno)); + return (-1); + } + signal(SIGALRM, timeout); alarm(30); - if (connect(s,(struct sockaddr *)&sin,sizeof(sin))<0) { - fprintf(stderr,"can't connect to %s.%s: %s\n", - host,service,strerror(errno)); - return(-1); - } - + 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); - signal(SIGALRM,SIG_IGN); + signal(SIGALRM, SIG_IGN); - return(s); - } + return (s); +} -/* - * 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(buf,bytes) -char buf[]; -int bytes; { - int len,rlen; - - len = 0; - while(lenserv_sock, &buf[len], bytes - len); + if (rlen < 1) { + lprintf(1, "Server connection broken: %s\n", strerror(errno)); - connected = 0; - logged_in = 0; + wc_backtrace(); + close(WC->serv_sock); + WC->serv_sock = (-1); + WC->connected = 0; + WC->logged_in = 0; + memset(buf, 0, bytes); return; - } - len = len + rlen; - } - } + } + len = len + rlen; + } +} -/* - * input string from pipe +/** + * \brief input string from pipe */ -void serv_gets(strbuf) -char strbuf[]; { - int ch,len,rlen; +int serv_getln(char *strbuf, int bufsize) +{ + int ch, len; char buf[2]; len = 0; - strcpy(strbuf,""); + strbuf[0] = 0; do { serv_read(&buf[0], 1); ch = buf[0]; - strbuf[len++] = ch; - } while((ch!=10)&&(ch!=13)&&(ch!=0)&&(len<255)); - strbuf[len-1] = 0; - /* fprintf(stderr, ">%s\n", strbuf); */ - } - - - -/* - * Attach to a Citadel server - */ -void attach_to_server(argc,argv) -int argc; -char *argv[]; { - if (argc==1) { - server_is_local = 1; - serv_sock = connectsock("localhost","citadel","tcp"); - } - if (argc==2) { - serv_sock = connectsock(argv[1],"citadel","tcp"); - if ( (!strcmp(argv[1],"localhost")) - || (!strcmp(argv[1],"127.0.0.1")) ) server_is_local = 1; + if ((ch != 13) && (ch != 10)) { + strbuf[len++] = ch; } - if (argc>=3) serv_sock = connectsock(argv[1],argv[2],"tcp"); + } 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; +} - if (serv_sock < 0) exit(errno); - } -/* - * 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(buf, nbytes) -char buf[]; -int nbytes; { - int bytes_written = 0; - int retval; - while (bytes_written < nbytes) { - retval = write(serv_sock, &buf[bytes_written], - nbytes - bytes_written); - if (retval < 1) { - fprintf(stderr, "Server connection broken: %s\n", +void serv_write(char *buf, int nbytes) +{ + int bytes_written = 0; + int retval; + while (bytes_written < nbytes) { + retval = write(WC->serv_sock, &buf[bytes_written], + nbytes - bytes_written); + if (retval < 1) { + lprintf(1, "Server connection broken: %s\n", strerror(errno)); - connected = 0; - logged_in = 0; + close(WC->serv_sock); + WC->serv_sock = (-1); + WC->connected = 0; + WC->logged_in = 0; return; - } - bytes_written = bytes_written + retval; - } - } - - -/* - * send line to server - */ -void serv_puts(string) -char *string; { - char buf[256]; - - sprintf(buf,"%s\n",string); - serv_write(buf, strlen(buf)); + } + bytes_written = bytes_written + retval; } +} -/* - * convenience function to send stuff to the server +/** + * \brief send line to server + * \param string the line to send to the citadel server */ -void serv_printf(const char *format, ...) { - va_list arg_ptr; - char buf[256]; +void serv_puts(char *string) +{ +#ifdef SERV_TRACE + lprintf(9, "%3d<%s\n", WC->serv_sock, string); +#endif + serv_write(string, strlen(string)); + serv_write("\n", 1); +} - va_start(arg_ptr, format); - vsprintf(buf, format, arg_ptr); - va_end(arg_ptr); - strcat(buf, "\n"); - serv_write(buf, strlen(buf)); - /* fprintf(stderr, "<%s", buf); */ - } +/** + * \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); + vsnprintf(buf, sizeof buf, format, arg_ptr); + va_end(arg_ptr); + + len = strlen(buf); + buf[len++] = '\n'; + buf[len] = '\0'; + serv_write(buf, len); +#ifdef SERV_TRACE + lprintf(9, "<%s", buf); +#endif +} +/*@}*/