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