18ccd4a63SDavid du Colombier #include "u.h"
28ccd4a63SDavid du Colombier #include <errno.h>
38ccd4a63SDavid du Colombier #include "lib.h"
48ccd4a63SDavid du Colombier #include "dat.h"
58ccd4a63SDavid du Colombier #include "fns.h"
68ccd4a63SDavid du Colombier #include "error.h"
78ccd4a63SDavid du Colombier
88ccd4a63SDavid du Colombier #undef pread
98ccd4a63SDavid du Colombier #undef pwrite
108ccd4a63SDavid du Colombier
118ccd4a63SDavid du Colombier Chan*
lfdchan(int fd)128ccd4a63SDavid du Colombier lfdchan(int fd)
138ccd4a63SDavid du Colombier {
148ccd4a63SDavid du Colombier Chan *c;
158ccd4a63SDavid du Colombier
168ccd4a63SDavid du Colombier c = newchan();
178ccd4a63SDavid du Colombier c->type = devno('L', 0);
18*ec59a3ddSDavid du Colombier c->aux = (void*)(uintptr)fd;
198ccd4a63SDavid du Colombier c->name = newcname("fd");
208ccd4a63SDavid du Colombier c->mode = ORDWR;
218ccd4a63SDavid du Colombier c->qid.type = 0;
228ccd4a63SDavid du Colombier c->qid.path = 0;
238ccd4a63SDavid du Colombier c->qid.vers = 0;
248ccd4a63SDavid du Colombier c->dev = 0;
258ccd4a63SDavid du Colombier c->offset = 0;
268ccd4a63SDavid du Colombier return c;
278ccd4a63SDavid du Colombier }
288ccd4a63SDavid du Colombier
298ccd4a63SDavid du Colombier int
lfdfd(int fd)308ccd4a63SDavid du Colombier lfdfd(int fd)
318ccd4a63SDavid du Colombier {
328ccd4a63SDavid du Colombier return newfd(lfdchan(fd));
338ccd4a63SDavid du Colombier }
348ccd4a63SDavid du Colombier
358ccd4a63SDavid du Colombier static Chan*
lfdattach(char * x)368ccd4a63SDavid du Colombier lfdattach(char *x)
378ccd4a63SDavid du Colombier {
388ccd4a63SDavid du Colombier USED(x);
398ccd4a63SDavid du Colombier
408ccd4a63SDavid du Colombier error(Egreg);
418ccd4a63SDavid du Colombier return nil;
428ccd4a63SDavid du Colombier }
438ccd4a63SDavid du Colombier
448ccd4a63SDavid du Colombier static Walkqid*
lfdwalk(Chan * c,Chan * nc,char ** name,int nname)458ccd4a63SDavid du Colombier lfdwalk(Chan *c, Chan *nc, char **name, int nname)
468ccd4a63SDavid du Colombier {
478ccd4a63SDavid du Colombier USED(c);
488ccd4a63SDavid du Colombier USED(nc);
498ccd4a63SDavid du Colombier USED(name);
508ccd4a63SDavid du Colombier USED(nname);
518ccd4a63SDavid du Colombier
528ccd4a63SDavid du Colombier error(Egreg);
538ccd4a63SDavid du Colombier return nil;
548ccd4a63SDavid du Colombier }
558ccd4a63SDavid du Colombier
568ccd4a63SDavid du Colombier static int
lfdstat(Chan * c,uchar * dp,int n)578ccd4a63SDavid du Colombier lfdstat(Chan *c, uchar *dp, int n)
588ccd4a63SDavid du Colombier {
598ccd4a63SDavid du Colombier USED(c);
608ccd4a63SDavid du Colombier USED(dp);
618ccd4a63SDavid du Colombier USED(n);
628ccd4a63SDavid du Colombier error(Egreg);
638ccd4a63SDavid du Colombier return -1;
648ccd4a63SDavid du Colombier }
658ccd4a63SDavid du Colombier
668ccd4a63SDavid du Colombier static Chan*
lfdopen(Chan * c,int omode)678ccd4a63SDavid du Colombier lfdopen(Chan *c, int omode)
688ccd4a63SDavid du Colombier {
698ccd4a63SDavid du Colombier USED(c);
708ccd4a63SDavid du Colombier USED(omode);
718ccd4a63SDavid du Colombier
728ccd4a63SDavid du Colombier error(Egreg);
738ccd4a63SDavid du Colombier return nil;
748ccd4a63SDavid du Colombier }
758ccd4a63SDavid du Colombier
768ccd4a63SDavid du Colombier static void
lfdclose(Chan * c)778ccd4a63SDavid du Colombier lfdclose(Chan *c)
788ccd4a63SDavid du Colombier {
79*ec59a3ddSDavid du Colombier close((int)(uintptr)c->aux);
808ccd4a63SDavid du Colombier }
818ccd4a63SDavid du Colombier
828ccd4a63SDavid du Colombier static long
lfdread(Chan * c,void * buf,long n,vlong off)838ccd4a63SDavid du Colombier lfdread(Chan *c, void *buf, long n, vlong off)
848ccd4a63SDavid du Colombier {
858ccd4a63SDavid du Colombier USED(off); /* can't pread on pipes */
86*ec59a3ddSDavid du Colombier n = read((int)(uintptr)c->aux, buf, n);
878ccd4a63SDavid du Colombier if(n < 0){
888ccd4a63SDavid du Colombier iprint("error %d\n", errno);
898ccd4a63SDavid du Colombier oserror();
908ccd4a63SDavid du Colombier }
918ccd4a63SDavid du Colombier return n;
928ccd4a63SDavid du Colombier }
938ccd4a63SDavid du Colombier
948ccd4a63SDavid du Colombier static long
lfdwrite(Chan * c,void * buf,long n,vlong off)958ccd4a63SDavid du Colombier lfdwrite(Chan *c, void *buf, long n, vlong off)
968ccd4a63SDavid du Colombier {
978ccd4a63SDavid du Colombier USED(off); /* can't pread on pipes */
988ccd4a63SDavid du Colombier
99*ec59a3ddSDavid du Colombier n = write((int)(uintptr)c->aux, buf, n);
1008ccd4a63SDavid du Colombier if(n < 0){
1018ccd4a63SDavid du Colombier iprint("error %d\n", errno);
1028ccd4a63SDavid du Colombier oserror();
1038ccd4a63SDavid du Colombier }
1048ccd4a63SDavid du Colombier return n;
1058ccd4a63SDavid du Colombier }
1068ccd4a63SDavid du Colombier
1078ccd4a63SDavid du Colombier Dev lfddevtab = {
1088ccd4a63SDavid du Colombier 'L',
1098ccd4a63SDavid du Colombier "lfd",
1108ccd4a63SDavid du Colombier
1118ccd4a63SDavid du Colombier devreset,
1128ccd4a63SDavid du Colombier devinit,
1138ccd4a63SDavid du Colombier devshutdown,
1148ccd4a63SDavid du Colombier lfdattach,
1158ccd4a63SDavid du Colombier lfdwalk,
1168ccd4a63SDavid du Colombier lfdstat,
1178ccd4a63SDavid du Colombier lfdopen,
1188ccd4a63SDavid du Colombier devcreate,
1198ccd4a63SDavid du Colombier lfdclose,
1208ccd4a63SDavid du Colombier lfdread,
1218ccd4a63SDavid du Colombier devbread,
1228ccd4a63SDavid du Colombier lfdwrite,
1238ccd4a63SDavid du Colombier devbwrite,
1248ccd4a63SDavid du Colombier devremove,
1258ccd4a63SDavid du Colombier devwstat,
1268ccd4a63SDavid du Colombier };
127