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