]> andersk Git - moira.git/blame - update/sendrecv.c
Command line printer manipulation client, and build goo.
[moira.git] / update / sendrecv.c
CommitLineData
85330553 1/* $Id$
2 *
3 * socket layer for update_server
4 *
5 * Copyright (C) 1997-1998 by the Massachusetts Institute of Technology
6 * For copying and distribution information, please see the file
7 * <mit-copyright.h>.
8 */
9
10#include <mit-copyright.h>
11#include <moira.h>
12
36f6a0ef 13#include <sys/types.h>
85330553 14#include <sys/uio.h>
15
16#include <errno.h>
17#include <stdlib.h>
18#include <unistd.h>
19
20RCSID("$Header$");
21
0d6fe123 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]
85330553 24
25extern void fail(int conn, int err, char *msg);
26
27int send_int(int conn, long data)
28{
29 char buf[8];
30
31 putlong(buf, 4);
32 putlong((buf + 4), data);
33 if (write(conn, buf, 8) == 8)
34 return 0;
35 else
36 {
37 fail(conn, errno, "sending integer");
38 return errno;
39 }
40}
41
42int recv_int(int conn, long *data)
43{
44 char buf[8];
19fcce2b 45 int len;
85330553 46
19fcce2b 47 len = read(conn, buf, 8);
48 if (len == -1)
85330553 49 {
50 fail(conn, errno, "reading integer");
51 return errno;
52 }
19fcce2b 53 else if (len < 8)
54 {
55 fail(conn, 0, "remote connection closed while reading integer");
56 return EIO;
57 }
85330553 58 getlong((buf + 4), *data);
59 return 0;
60}
61
62
63int send_string(int conn, char *buf, size_t len)
64{
65 char fulllen[4], stringlen[4];
66 struct iovec iov[3];
67
68 putlong(fulllen, (len + 4));
69 putlong(stringlen, len);
70 iov[0].iov_base = fulllen;
71 iov[0].iov_len = 4;
72 iov[1].iov_base = stringlen;
73 iov[1].iov_len = 4;
74 iov[2].iov_base = buf;
75 iov[2].iov_len = len;
76
77 if (writev(conn, iov, 3) == -1)
78 {
79 fail(conn, errno, "sending string");
80 return errno;
81 }
82 else
83 return 0;
84}
85
86int recv_string(int conn, char **buf, size_t *len)
87{
88 char tmp[4];
8cf1531d 89 int size, more;
85330553 90
19fcce2b 91 size = read(conn, tmp, 4);
92 if (size == -1)
85330553 93 {
94 fail(conn, errno, "reading string");
95 return errno;
96 }
19fcce2b 97 else if (size < 4)
98 {
99 fail(conn, 0, "remote connection closed while reading string");
100 return EIO;
101 }
102
103 size = read(conn, tmp, 4);
104 if (size == -1)
85330553 105 {
106 fail(conn, errno, "reading string");
107 return errno;
108 }
19fcce2b 109 else if (size < 4)
110 {
111 fail(conn, 0, "remote connection closed while reading string");
112 return EIO;
113 }
85330553 114 getlong(tmp, *len);
115
116 *buf = malloc(*len);
117 if (!*buf)
118 {
119 fail(conn, ENOMEM, "reading string");
120 return ENOMEM;
121 }
8cf1531d 122 for (size = 0; size < *len; size += more)
123 {
124 more = read(conn, *buf + size, *len - size);
125 if (!more)
126 break;
127 }
128
129 if (size != *len)
85330553 130 {
131 free(buf);
132 fail(conn, errno, "reading string");
133 return errno;
134 }
135
136 return 0;
137}
This page took 1.618317 seconds and 5 git commands to generate.