Switch from SCTP to TCP
[public/pyceo-broken.git] / src / net.c
1 #include <stdio.h>
2 #include <sys/utsname.h>
3 #include <unistd.h>
4 #include <netdb.h>
5 #include <errno.h>
6
7 #include "util.h"
8 #include "net.h"
9 #include "gss.h"
10 #include "strbuf.h"
11
12 struct strbuf fqdn = STRBUF_INIT;
13
14 const size_t MAX_MSGLEN = 65536;
15 const size_t MSG_BUFINC = 4096;
16
17 void setup_fqdn(void) {
18     struct utsname uts;
19     struct hostent *lo;
20
21     if (uname(&uts))
22         fatalpe("uname");
23     lo = gethostbyname(uts.nodename);
24     if (!lo)
25         fatalpe("gethostbyname");
26
27     strbuf_addstr(&fqdn, lo->h_name);
28 }
29
30 void free_fqdn(void) {
31     strbuf_release(&fqdn);
32 }
33
34 int ceo_send_message(int sock, void *buf, size_t len, uint32_t msgtype) {
35     uint32_t msgheader[2];
36     msgheader[0] = htonl(len);
37     msgheader[1] = htonl(msgtype);
38
39     if (full_write(sock, msgheader, sizeof(msgheader)) < 0)
40         fatalpe("write");
41
42     if (full_write(sock, buf, len) < 0)
43         fatalpe("write");
44
45     return 0;
46 }
47
48 int ceo_receive_message(int sock, struct strbuf *msg, uint32_t *msgtype) {
49     uint32_t msglen, received = 0;
50     uint32_t msgheader[2];
51     ssize_t bytes;
52
53     strbuf_reset(msg);
54
55     while (received < sizeof(msgheader)) {
56         bytes = read(sock, msgheader, sizeof(msgheader) - received);
57         if (bytes < 0) {
58             if (errno == EAGAIN)
59                 continue;
60             fatalpe("read");
61         }
62         if (!bytes && !received)
63             return -1;
64         if (!bytes)
65             fatalpe("short header received");
66         received += bytes;
67     }
68
69     msglen = ntohl(msgheader[0]);
70     *msgtype = ntohl(msgheader[1]);
71     received = 0;
72
73     if (!msglen)
74         fatal("length is zero in message header");
75
76     if (msglen > MAX_MSGLEN)
77         fatal("length is huge in message header");
78
79     strbuf_grow(msg, msglen);
80     strbuf_setlen(msg, msglen);
81
82     while (received < msglen) {
83         bytes = read(sock, msg->buf + received, msglen - received);
84         if (bytes < 0) {
85             if (errno == EAGAIN)
86                 continue;
87             fatalpe("read");
88         }
89         if (!bytes)
90             fatal("short message received");
91         received += bytes;
92     }
93
94     return 0;
95 }