00001
00002
00003
00009
00010
00011
00012
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