tcp_sockets.c

00001 /*
00002  * $Id: tcp_sockets.c 5147 2007-05-08 15:36:22Z ajc $
00003  */
00009 
00010 /*
00011  * Uncomment this to log all communications with the Citadel server
00012 #define SERV_TRACE 1
00013  */
00014 
00015 #include "webcit.h"
00016 #include "webserver.h"
00017 
00023 RETSIGTYPE timeout(int signum)
00024 {
00025         lprintf(1, "Connection timed out.\n");
00026         exit(3);
00027 }
00028 
00029 
00034 int uds_connectsock(char *sockpath)
00035 {
00036         struct sockaddr_un addr;
00037         int s;
00038 
00039         memset(&addr, 0, sizeof(addr));
00040         addr.sun_family = AF_UNIX;
00041         strncpy(addr.sun_path, sockpath, sizeof addr.sun_path);
00042 
00043         s = socket(AF_UNIX, SOCK_STREAM, 0);
00044         if (s < 0) {
00045                 lprintf(1, "Can't create socket: %s\n",
00046                         strerror(errno));
00047                 return(-1);
00048         }
00049 
00050         if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
00051                 lprintf(1, "Can't connect: %s\n",
00052                         strerror(errno));
00053                 close(s);
00054                 return(-1);
00055         }
00056 
00057         return s;
00058 }
00059 
00060 
00066 int tcp_connectsock(char *host, char *service)
00067 {
00068         struct hostent *phe;
00069         struct servent *pse;
00070         struct protoent *ppe;
00071         struct sockaddr_in sin;
00072         int s;
00073 
00074         memset(&sin, 0, sizeof(sin));
00075         sin.sin_family = AF_INET;
00076 
00077         pse = getservbyname(service, "tcp");
00078         if (pse) {
00079                 sin.sin_port = pse->s_port;
00080         } else if ((sin.sin_port = htons((u_short) atoi(service))) == 0) {
00081                 lprintf(1, "Can't get %s service entry\n", service);
00082                 return (-1);
00083         }
00084         phe = gethostbyname(host);
00085         if (phe) {
00086                 memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
00087         } else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
00088                 lprintf(1, "Can't get %s host entry: %s\n",
00089                         host, strerror(errno));
00090                 return (-1);
00091         }
00092         if ((ppe = getprotobyname("tcp")) == 0) {
00093                 lprintf(1, "Can't get TCP protocol entry: %s\n",
00094                         strerror(errno));
00095                 return (-1);
00096         }
00097 
00098         s = socket(PF_INET, SOCK_STREAM, ppe->p_proto);
00099         if (s < 0) {
00100                 lprintf(1, "Can't create socket: %s\n", strerror(errno));
00101                 return (-1);
00102         }
00103         signal(SIGALRM, timeout);
00104         alarm(30);
00105 
00106         if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
00107                 lprintf(1, "Can't connect to %s.%s: %s\n",
00108                         host, service, strerror(errno));
00109                 close(s);
00110                 return (-1);
00111         }
00112         alarm(0);
00113         signal(SIGALRM, SIG_IGN);
00114 
00115         return (s);
00116 }
00117 
00118 
00119 
00120 
00126 void serv_read(char *buf, int bytes)
00127 {
00128         int len, rlen;
00129 
00130         len = 0;
00131         while (len < bytes) {
00132                 rlen = read(WC->serv_sock, &buf[len], bytes - len);
00133                 if (rlen < 1) {
00134                         lprintf(1, "Server connection broken: %s\n",
00135                                 strerror(errno));
00136                         close(WC->serv_sock);
00137                         WC->serv_sock = (-1);
00138                         WC->connected = 0;
00139                         WC->logged_in = 0;
00140                         memset(buf, 0, bytes);
00141                         return;
00142                 }
00143                 len = len + rlen;
00144         }
00145 }
00146 
00147 
00151 void serv_getln(char *strbuf, int bufsize)
00152 {
00153         int ch, len;
00154         char buf[2];
00155 
00156         len = 0;
00157         strbuf[0] = 0;
00158         do {
00159                 serv_read(&buf[0], 1);
00160                 ch = buf[0];
00161                 if ((ch != 13) && (ch != 10)) {
00162                         strbuf[len++] = ch;
00163                 }
00164         } while ((ch != 10) && (ch != 0) && (len < (bufsize-1)));
00165         strbuf[len] = 0;
00166 #ifdef SERV_TRACE
00167         lprintf(9, "%3d>%s\n", WC->serv_sock, strbuf);
00168 #endif
00169 }
00170 
00171 
00172 
00178 void serv_write(char *buf, int nbytes)
00179 {
00180         int bytes_written = 0;
00181         int retval;
00182         while (bytes_written < nbytes) {
00183                 retval = write(WC->serv_sock, &buf[bytes_written],
00184                                nbytes - bytes_written);
00185                 if (retval < 1) {
00186                         lprintf(1, "Server connection broken: %s\n",
00187                                 strerror(errno));
00188                         close(WC->serv_sock);
00189                         WC->serv_sock = (-1);
00190                         WC->connected = 0;
00191                         WC->logged_in = 0;
00192                         return;
00193                 }
00194                 bytes_written = bytes_written + retval;
00195         }
00196 }
00197 
00198 
00203 void serv_puts(char *string)
00204 {
00205         char buf[SIZ];
00206 
00207 #ifdef SERV_TRACE
00208         lprintf(9, "%3d<%s\n", WC->serv_sock, string);
00209 #endif
00210         sprintf(buf, "%s\n", string);
00211         serv_write(buf, strlen(buf));
00212 }
00213 
00214 
00220 void serv_printf(const char *format,...)
00221 {
00222         va_list arg_ptr;
00223         char buf[SIZ];
00224 
00225         va_start(arg_ptr, format);
00226         vsnprintf(buf, sizeof buf, format, arg_ptr);
00227         va_end(arg_ptr);
00228 
00229         strcat(buf, "\n");
00230         serv_write(buf, strlen(buf));
00231 #ifdef SERV_TRACE
00232         lprintf(9, "<%s", buf);
00233 #endif
00234 }
00235 
00236 

Generated on Wed Jun 20 23:13:10 2007 for webcit by  doxygen 1.5.2