xref: /plan9/sys/src/cmd/unix/drawterm/kern/devlfd.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
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