1*eba00c11SDavid du Colombier /* Copyright © Coraid, Inc. 2006. All rights reserved. */
2*eba00c11SDavid du Colombier #include <u.h>
3*eba00c11SDavid du Colombier #include <libc.h>
4*eba00c11SDavid du Colombier #include "cec.h"
5*eba00c11SDavid du Colombier
6*eba00c11SDavid du Colombier int fd = -1;
7*eba00c11SDavid du Colombier int cfd = -1;
8*eba00c11SDavid du Colombier int efd = -1;
9*eba00c11SDavid du Colombier
10*eba00c11SDavid du Colombier int
netopen0(char * e)11*eba00c11SDavid du Colombier netopen0(char *e)
12*eba00c11SDavid du Colombier {
13*eba00c11SDavid du Colombier char buf[128], ctl[13];
14*eba00c11SDavid du Colombier int n;
15*eba00c11SDavid du Colombier
16*eba00c11SDavid du Colombier snprint(buf, sizeof buf, "%s/clone", e);
17*eba00c11SDavid du Colombier if((efd = open(buf, ORDWR)) == -1)
18*eba00c11SDavid du Colombier return -1;
19*eba00c11SDavid du Colombier memset(ctl, 0, sizeof ctl);
20*eba00c11SDavid du Colombier if(read(efd, ctl, sizeof ctl) < 0)
21*eba00c11SDavid du Colombier return -1;
22*eba00c11SDavid du Colombier n = atoi(ctl);
23*eba00c11SDavid du Colombier snprint(buf, sizeof buf, "connect %d", Etype);
24*eba00c11SDavid du Colombier if(write(efd, buf, strlen(buf)) != strlen(buf))
25*eba00c11SDavid du Colombier return -1;
26*eba00c11SDavid du Colombier snprint(buf, sizeof buf, "%s/%d/ctl", e, n);
27*eba00c11SDavid du Colombier if((cfd = open(buf, ORDWR)) < 0)
28*eba00c11SDavid du Colombier return -1;
29*eba00c11SDavid du Colombier snprint(buf, sizeof buf, "nonblocking");
30*eba00c11SDavid du Colombier if(write(cfd, buf, strlen(buf)) != strlen(buf))
31*eba00c11SDavid du Colombier return -1;
32*eba00c11SDavid du Colombier snprint(buf, sizeof buf, "%s/%d/data", e, n);
33*eba00c11SDavid du Colombier fd = open(buf, ORDWR);
34*eba00c11SDavid du Colombier return fd;
35*eba00c11SDavid du Colombier }
36*eba00c11SDavid du Colombier
37*eba00c11SDavid du Colombier void
netclose(void)38*eba00c11SDavid du Colombier netclose(void)
39*eba00c11SDavid du Colombier {
40*eba00c11SDavid du Colombier close(efd);
41*eba00c11SDavid du Colombier close(cfd);
42*eba00c11SDavid du Colombier close(fd);
43*eba00c11SDavid du Colombier efd = -1;
44*eba00c11SDavid du Colombier cfd = -1;
45*eba00c11SDavid du Colombier fd = -1;
46*eba00c11SDavid du Colombier }
47*eba00c11SDavid du Colombier
48*eba00c11SDavid du Colombier int
netopen(char * e)49*eba00c11SDavid du Colombier netopen(char *e)
50*eba00c11SDavid du Colombier {
51*eba00c11SDavid du Colombier int r;
52*eba00c11SDavid du Colombier
53*eba00c11SDavid du Colombier if((r = netopen0(e)) >= 0)
54*eba00c11SDavid du Colombier return r;
55*eba00c11SDavid du Colombier perror("netopen");
56*eba00c11SDavid du Colombier netclose();
57*eba00c11SDavid du Colombier return -1;
58*eba00c11SDavid du Colombier }
59*eba00c11SDavid du Colombier
60*eba00c11SDavid du Colombier /* what if len < netlen? */
61*eba00c11SDavid du Colombier int
netget(void * v,int len)62*eba00c11SDavid du Colombier netget(void *v, int len)
63*eba00c11SDavid du Colombier {
64*eba00c11SDavid du Colombier int l;
65*eba00c11SDavid du Colombier
66*eba00c11SDavid du Colombier l = read(fd, v, len);
67*eba00c11SDavid du Colombier if(debug && l > 0){
68*eba00c11SDavid du Colombier fprint(2, "read %d bytes\n", l);
69*eba00c11SDavid du Colombier dump((uchar*)v, l);
70*eba00c11SDavid du Colombier }
71*eba00c11SDavid du Colombier if (l <= 0)
72*eba00c11SDavid du Colombier return 0;
73*eba00c11SDavid du Colombier return l;
74*eba00c11SDavid du Colombier }
75*eba00c11SDavid du Colombier
76*eba00c11SDavid du Colombier int
netsend(void * v,int len)77*eba00c11SDavid du Colombier netsend(void *v, int len)
78*eba00c11SDavid du Colombier {
79*eba00c11SDavid du Colombier uchar *p;
80*eba00c11SDavid du Colombier
81*eba00c11SDavid du Colombier p = v;
82*eba00c11SDavid du Colombier if (debug) {
83*eba00c11SDavid du Colombier fprint(2, "sending %d bytes\n", len);
84*eba00c11SDavid du Colombier dump(p, len);
85*eba00c11SDavid du Colombier }
86*eba00c11SDavid du Colombier if (len < 60)
87*eba00c11SDavid du Colombier len = 60; /* mintu */
88*eba00c11SDavid du Colombier return write(fd, p, len);
89*eba00c11SDavid du Colombier }
90