Get user to build with the new libraries.
[akaros.git] / user / parlib / net.c
1 /* Copyright (c) 2014 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Networking helpers for dealing with the plan 9 interface. */
6
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <assert.h>
12 #include <net.h>
13
14 #include <sys/types.h>
15 #include <sys/stat.h>
16 #include <fcntl.h>
17
18 #if 0
19 /* my cheap dial, assumes either /net/ or a protocol first, with !s btw the
20  * proto, host, and port.  it also will modify addr temporarily.  */
21 int dial(char *addr, char *local, char *dir, int *cfdp)
22 {
23         int ret, ctlfd, datafd, conv_id;
24         char *prefix;
25         char *hostname;                                         /* including !port */
26         size_t buf_len = strlen(addr) + 30;     /* 30 should be enough extra */
27         char *buf = malloc(buf_len);
28         if (!buf) {
29                 perror("Unable to malloc buf!");
30                 return -1;
31         }
32         if (local || dir) {
33                 perror("Cheap dial doesn't support local or dir");
34                 ret = -1;
35                 goto out_buf;
36         }
37         hostname = strchr(addr, '!');
38         if (!hostname) {
39                 perror("No first bang");
40                 ret = -1;
41                 goto out_buf;
42         }
43         *hostname++ = '\0';
44         prefix = (addr[0] == '/' ? "" : "/net/");
45         ret = snprintf(buf, buf_len, "%s%s/clone", prefix, addr);
46         if (snprintf_overflow(ret, buf, buf_len)) {
47                 perror("Clone chan path too long");
48                 ret = -1;
49                 goto out_readdr;
50         }
51         ctlfd = open(buf, O_RDWR);
52         if (ctlfd < 0) {
53                 perror("Can't clone a conversation");
54                 ret = -1;
55                 goto out_readdr;
56         }
57         ret = read(ctlfd, buf, buf_len - 1);
58         if (ret <= 0) {
59                 if (!ret)
60                         printf("Got early EOF from ctl\n");
61                 else
62                         perror("Can't read ctl");
63                 ret = -1;
64                 goto out_ctlfd;
65         }
66         buf[ret] = 0;
67         conv_id = atoi(buf);
68         ret = snprintf(buf, buf_len, "connect %s", hostname);
69         if (snprintf_overflow(ret, buf, buf_len)) {
70                 perror("Connect string too long");
71                 ret = -1;
72                 goto out_ctlfd;
73         }
74         if ((write(ctlfd, buf, strlen(buf)) <= 0)) {
75                 perror("Failed to connect");
76                 ret = -1;
77                 goto out_ctlfd;
78         }
79         ret = snprintf(buf, buf_len, "%s%s/%d/data", prefix, addr, conv_id);
80         if (snprintf_overflow(ret, buf, buf_len)) {
81                 perror("Data chan path too long");
82                 ret = -1;
83                 goto out_ctlfd;
84         }
85         datafd = open(buf, O_RDWR);
86         if (datafd < 0) {
87                 perror("Failed to open data chan");
88                 ret = -1;
89                 goto out_ctlfd;
90         }
91         if (cfdp)
92                 *cfdp = ctlfd;
93         else
94                 close(ctlfd);
95         ret = datafd;
96         /* skip over the ctlfd close */
97         goto out_readdr;
98
99 out_ctlfd:
100         close(ctlfd);
101 out_readdr:
102         /* restore the change we made to addr */
103         *--hostname = '!';
104 out_buf:
105         free(buf);
106         return ret;
107 }
108 #endif