xref: /plan9/sys/src/cmd/cec/plan9.c (revision eba00c1180f26027fec6be9f76c54eccfce0d97b)
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
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
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
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
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
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