1*8ccd4a63SDavid du Colombier #include "u.h" 2*8ccd4a63SDavid du Colombier #include <errno.h> 3*8ccd4a63SDavid du Colombier #include "lib.h" 4*8ccd4a63SDavid du Colombier #include "dat.h" 5*8ccd4a63SDavid du Colombier #include "fns.h" 6*8ccd4a63SDavid du Colombier #include "error.h" 7*8ccd4a63SDavid du Colombier 8*8ccd4a63SDavid du Colombier #undef pread 9*8ccd4a63SDavid du Colombier #undef pwrite 10*8ccd4a63SDavid du Colombier 11*8ccd4a63SDavid du Colombier Chan* 12*8ccd4a63SDavid du Colombier lfdchan(int fd) 13*8ccd4a63SDavid du Colombier { 14*8ccd4a63SDavid du Colombier Chan *c; 15*8ccd4a63SDavid du Colombier 16*8ccd4a63SDavid du Colombier c = newchan(); 17*8ccd4a63SDavid du Colombier c->type = devno('L', 0); 18*8ccd4a63SDavid du Colombier c->aux = (void*)fd; 19*8ccd4a63SDavid du Colombier c->name = newcname("fd"); 20*8ccd4a63SDavid du Colombier c->mode = ORDWR; 21*8ccd4a63SDavid du Colombier c->qid.type = 0; 22*8ccd4a63SDavid du Colombier c->qid.path = 0; 23*8ccd4a63SDavid du Colombier c->qid.vers = 0; 24*8ccd4a63SDavid du Colombier c->dev = 0; 25*8ccd4a63SDavid du Colombier c->offset = 0; 26*8ccd4a63SDavid du Colombier return c; 27*8ccd4a63SDavid du Colombier } 28*8ccd4a63SDavid du Colombier 29*8ccd4a63SDavid du Colombier int 30*8ccd4a63SDavid du Colombier lfdfd(int fd) 31*8ccd4a63SDavid du Colombier { 32*8ccd4a63SDavid du Colombier return newfd(lfdchan(fd)); 33*8ccd4a63SDavid du Colombier } 34*8ccd4a63SDavid du Colombier 35*8ccd4a63SDavid du Colombier static Chan* 36*8ccd4a63SDavid du Colombier lfdattach(char *x) 37*8ccd4a63SDavid du Colombier { 38*8ccd4a63SDavid du Colombier USED(x); 39*8ccd4a63SDavid du Colombier 40*8ccd4a63SDavid du Colombier error(Egreg); 41*8ccd4a63SDavid du Colombier return nil; 42*8ccd4a63SDavid du Colombier } 43*8ccd4a63SDavid du Colombier 44*8ccd4a63SDavid du Colombier static Walkqid* 45*8ccd4a63SDavid du Colombier lfdwalk(Chan *c, Chan *nc, char **name, int nname) 46*8ccd4a63SDavid du Colombier { 47*8ccd4a63SDavid du Colombier USED(c); 48*8ccd4a63SDavid du Colombier USED(nc); 49*8ccd4a63SDavid du Colombier USED(name); 50*8ccd4a63SDavid du Colombier USED(nname); 51*8ccd4a63SDavid du Colombier 52*8ccd4a63SDavid du Colombier error(Egreg); 53*8ccd4a63SDavid du Colombier return nil; 54*8ccd4a63SDavid du Colombier } 55*8ccd4a63SDavid du Colombier 56*8ccd4a63SDavid du Colombier static int 57*8ccd4a63SDavid du Colombier lfdstat(Chan *c, uchar *dp, int n) 58*8ccd4a63SDavid du Colombier { 59*8ccd4a63SDavid du Colombier USED(c); 60*8ccd4a63SDavid du Colombier USED(dp); 61*8ccd4a63SDavid du Colombier USED(n); 62*8ccd4a63SDavid du Colombier error(Egreg); 63*8ccd4a63SDavid du Colombier return -1; 64*8ccd4a63SDavid du Colombier } 65*8ccd4a63SDavid du Colombier 66*8ccd4a63SDavid du Colombier static Chan* 67*8ccd4a63SDavid du Colombier lfdopen(Chan *c, int omode) 68*8ccd4a63SDavid du Colombier { 69*8ccd4a63SDavid du Colombier USED(c); 70*8ccd4a63SDavid du Colombier USED(omode); 71*8ccd4a63SDavid du Colombier 72*8ccd4a63SDavid du Colombier error(Egreg); 73*8ccd4a63SDavid du Colombier return nil; 74*8ccd4a63SDavid du Colombier } 75*8ccd4a63SDavid du Colombier 76*8ccd4a63SDavid du Colombier static void 77*8ccd4a63SDavid du Colombier lfdclose(Chan *c) 78*8ccd4a63SDavid du Colombier { 79*8ccd4a63SDavid du Colombier close((int)c->aux); 80*8ccd4a63SDavid du Colombier } 81*8ccd4a63SDavid du Colombier 82*8ccd4a63SDavid du Colombier static long 83*8ccd4a63SDavid du Colombier lfdread(Chan *c, void *buf, long n, vlong off) 84*8ccd4a63SDavid du Colombier { 85*8ccd4a63SDavid du Colombier USED(off); /* can't pread on pipes */ 86*8ccd4a63SDavid du Colombier n = read((int)c->aux, buf, n); 87*8ccd4a63SDavid du Colombier if(n < 0){ 88*8ccd4a63SDavid du Colombier iprint("error %d\n", errno); 89*8ccd4a63SDavid du Colombier oserror(); 90*8ccd4a63SDavid du Colombier } 91*8ccd4a63SDavid du Colombier return n; 92*8ccd4a63SDavid du Colombier } 93*8ccd4a63SDavid du Colombier 94*8ccd4a63SDavid du Colombier static long 95*8ccd4a63SDavid du Colombier lfdwrite(Chan *c, void *buf, long n, vlong off) 96*8ccd4a63SDavid du Colombier { 97*8ccd4a63SDavid du Colombier USED(off); /* can't pread on pipes */ 98*8ccd4a63SDavid du Colombier 99*8ccd4a63SDavid du Colombier n = write((int)c->aux, buf, n); 100*8ccd4a63SDavid du Colombier if(n < 0){ 101*8ccd4a63SDavid du Colombier iprint("error %d\n", errno); 102*8ccd4a63SDavid du Colombier oserror(); 103*8ccd4a63SDavid du Colombier } 104*8ccd4a63SDavid du Colombier return n; 105*8ccd4a63SDavid du Colombier } 106*8ccd4a63SDavid du Colombier 107*8ccd4a63SDavid du Colombier Dev lfddevtab = { 108*8ccd4a63SDavid du Colombier 'L', 109*8ccd4a63SDavid du Colombier "lfd", 110*8ccd4a63SDavid du Colombier 111*8ccd4a63SDavid du Colombier devreset, 112*8ccd4a63SDavid du Colombier devinit, 113*8ccd4a63SDavid du Colombier devshutdown, 114*8ccd4a63SDavid du Colombier lfdattach, 115*8ccd4a63SDavid du Colombier lfdwalk, 116*8ccd4a63SDavid du Colombier lfdstat, 117*8ccd4a63SDavid du Colombier lfdopen, 118*8ccd4a63SDavid du Colombier devcreate, 119*8ccd4a63SDavid du Colombier lfdclose, 120*8ccd4a63SDavid du Colombier lfdread, 121*8ccd4a63SDavid du Colombier devbread, 122*8ccd4a63SDavid du Colombier lfdwrite, 123*8ccd4a63SDavid du Colombier devbwrite, 124*8ccd4a63SDavid du Colombier devremove, 125*8ccd4a63SDavid du Colombier devwstat, 126*8ccd4a63SDavid du Colombier }; 127