]> andersk Git - moira.git/blob - update/sendrecv.c
KEYFILE is no longer a compile-time constant in krb5's krb4 compat
[moira.git] / update / sendrecv.c
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
13 #include <sys/types.h>
14 #include <sys/uio.h>
15
16 #include <errno.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19
20 RCSID("$Header$");
21
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]
24
25 extern void fail(int conn, int err, char *msg);
26
27 int 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
42 int recv_int(int conn, long *data)
43 {
44   char buf[8];
45
46   if (read(conn, buf, 8) != 8)
47     {
48       fail(conn, errno, "reading integer");
49       return errno;
50     }
51   getlong((buf + 4), *data);
52   return 0;
53 }
54
55
56 int send_string(int conn, char *buf, size_t len)
57 {
58   char fulllen[4], stringlen[4];
59   struct iovec iov[3];
60
61   putlong(fulllen, (len + 4));
62   putlong(stringlen, len);
63   iov[0].iov_base = fulllen;
64   iov[0].iov_len = 4;
65   iov[1].iov_base = stringlen;
66   iov[1].iov_len = 4;
67   iov[2].iov_base = buf;
68   iov[2].iov_len = len;
69
70   if (writev(conn, iov, 3) == -1)
71     {
72       fail(conn, errno, "sending string");
73       return errno;
74     }
75   else
76     return 0;
77 }
78
79 int recv_string(int conn, char **buf, size_t *len)
80 {
81   char tmp[4];
82   int size, more;
83
84   if (read(conn, tmp, 4) != 4)
85     {
86       fail(conn, errno, "reading string");
87       return errno;
88     }
89   if (read(conn, tmp, 4) != 4)
90     {
91       fail(conn, errno, "reading string");
92       return errno;
93     }
94   getlong(tmp, *len);
95
96   *buf = malloc(*len);
97   if (!*buf)
98     {
99       fail(conn, ENOMEM, "reading string");
100       return ENOMEM;
101     }
102   for (size = 0; size < *len; size += more)
103     {
104       more = read(conn, *buf + size, *len - size);
105       if (!more)
106         break;
107     }
108   
109   if (size != *len)
110     {
111       free(buf);
112       fail(conn, errno, "reading string");
113       return errno;
114     }
115
116   return 0;
117 }
This page took 0.167671 seconds and 5 git commands to generate.