3 * socket layer for update_server
5 * Copyright (C) 1997-1998 by the Massachusetts Institute of Technology
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
13 #include <sys/types.h>
22 #define putlong(cp, l) { ((unsigned char *)cp)[0] = l >> 24; ((unsigned char *)cp)[1] = l >> 16; ((unsigned char *)cp)[2] = l >> 8; ((unsigned char *)cp)[3] = l; }
23 #define getlong(cp, l) l = ((((unsigned char *)cp)[0] * 256 + ((unsigned char *)cp)[1]) * 256 + ((unsigned char *)cp)[2]) * 256 + ((unsigned char *)cp)[3]
25 extern void fail(int conn, int err, char *msg);
27 int send_int(int conn, long data)
32 putlong((buf + 4), data);
33 if (write(conn, buf, 8) == 8)
37 fail(conn, errno, "sending integer");
42 int recv_int(int conn, long *data)
47 len = read(conn, buf, 8);
50 fail(conn, errno, "reading integer");
55 fail(conn, 0, "remote connection closed while reading integer");
58 getlong((buf + 4), *data);
63 int send_string(int conn, char *buf, size_t len)
65 char fulllen[4], stringlen[4];
68 putlong(fulllen, (len + 4));
69 putlong(stringlen, len);
70 iov[0].iov_base = fulllen;
72 iov[1].iov_base = stringlen;
74 iov[2].iov_base = buf;
77 if (writev(conn, iov, 3) == -1)
79 fail(conn, errno, "sending string");
86 int recv_string(int conn, char **buf, size_t *len)
91 size = read(conn, tmp, 4);
94 fail(conn, errno, "reading string");
99 fail(conn, 0, "remote connection closed while reading string");
103 size = read(conn, tmp, 4);
106 fail(conn, errno, "reading string");
111 fail(conn, 0, "remote connection closed while reading string");
119 fail(conn, ENOMEM, "reading string");
122 for (size = 0; size < *len; size += more)
124 more = read(conn, *buf + size, *len - size);
132 fail(conn, errno, "reading string");