4 * TCP socket module for WebCit
16 #include <sys/types.h>
18 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
34 #define INADDR_NONE 0xffffffff
37 RETSIGTYPE timeout(int signum)
39 fprintf(stderr, "Connection timed out.\n");
46 * Connect a unix domain socket
48 int uds_connectsock(char *sockpath)
50 struct sockaddr_un addr;
53 memset(&addr, 0, sizeof(addr));
54 addr.sun_family = AF_UNIX;
55 strncpy(addr.sun_path, sockpath, sizeof addr.sun_path);
57 s = socket(AF_UNIX, SOCK_STREAM, 0);
59 fprintf(stderr, "Can't create socket: %s\n",
64 if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
65 fprintf(stderr, "can't connect: %s\n",
75 * Connect a TCP/IP socket
77 int tcp_connectsock(char *host, char *service)
82 struct sockaddr_in sin;
85 memset(&sin, 0, sizeof(sin));
86 sin.sin_family = AF_INET;
88 pse = getservbyname(service, "tcp");
90 sin.sin_port = pse->s_port;
91 } else if ((sin.sin_port = htons((u_short) atoi(service))) == 0) {
92 fprintf(stderr, "Can't get %s service entry\n", service);
95 phe = gethostbyname(host);
97 memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
98 } else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
99 fprintf(stderr, "Can't get %s host entry: %s\n",
100 host, strerror(errno));
103 if ((ppe = getprotobyname("tcp")) == 0) {
104 fprintf(stderr, "Can't get TCP protocol entry: %s\n",
109 s = socket(PF_INET, SOCK_STREAM, ppe->p_proto);
111 fprintf(stderr, "Can't create socket: %s\n", strerror(errno));
114 signal(SIGALRM, timeout);
117 if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
118 fprintf(stderr, "can't connect to %s.%s: %s\n",
119 host, service, strerror(errno));
123 signal(SIGALRM, SIG_IGN);
132 * Input binary data from socket
134 void serv_read(char *buf, int bytes)
139 while (len < bytes) {
140 rlen = read(WC->serv_sock, &buf[len], bytes - len);
142 fprintf(stderr, "Server connection broken: %s\n",
154 * input string from pipe
156 void serv_gets(char *strbuf)
164 serv_read(&buf[0], 1);
167 } while ((ch != 10) && (ch != 13) && (ch != 0) && (len < 255));
169 /* fprintf(stderr, ">%s\n", strbuf); */
175 * send binary to server
177 void serv_write(char *buf, int nbytes)
179 int bytes_written = 0;
181 while (bytes_written < nbytes) {
182 retval = write(WC->serv_sock, &buf[bytes_written],
183 nbytes - bytes_written);
185 fprintf(stderr, "Server connection broken: %s\n",
191 bytes_written = bytes_written + retval;
197 * send line to server
199 void serv_puts(char *string)
203 sprintf(buf, "%s\n", string);
204 serv_write(buf, strlen(buf));
209 * convenience function to send stuff to the server
211 void serv_printf(const char *format,...)
216 va_start(arg_ptr, format);
217 vsprintf(buf, format, arg_ptr);
221 serv_write(buf, strlen(buf));
222 /* fprintf(stderr, "<%s", buf); */