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