xref: /inferno-os/os/port/devXXX.c (revision 4eb166cf184c1f102fb79e31b1465ea3e2021c39)
1 /*
2  *  template for making a new device
3  */
4 #include	"u.h"
5 #include	"../port/lib.h"
6 #include	"mem.h"
7 #include	"dat.h"
8 #include	"fns.h"
9 #include	"../port/error.h"
10 
11 
12 enum{
13 	Qdir,
14 	Qdata,
15 };
16 
17 static
18 Dirtab XXXtab[]={
19 	".",			{Qdir, 0, QTDIR},	0,	0555,	/* entry for "." must be first if devgen used */
20 	"data",		{Qdata, 0},	0,	0666,
21 };
22 
23 static void
24 XXXreset(void)						/* default in dev.c */
25 {
26 }
27 
28 static void
29 XXXinit(void)						/* default in dev.c */
30 {
31 }
32 
33 static Chan*
34 XXXattach(char* spec)
35 {
36 	return devattach('X', spec);
37 }
38 
39 static Walkqid*
40 XXXwalk(Chan *c, Chan *nc, char **name, int nname)
41 {
42 	return devwalk(c, nc, name, nname, XXXtab, nelem(XXXtab), devgen);
43 }
44 
45 static int
46 XXXstat(Chan* c, uchar *db, int n)
47 {
48 	return devstat(c, db, n, XXXtab, nelem(XXXtab), devgen);
49 }
50 
51 static Chan*
52 XXXopen(Chan* c, int omode)
53 {
54 	return devopen(c, omode, XXXtab, nelem(XXXtab), devgen);
55 }
56 
57 static void
58 XXXcreate(Chan* c, char* name, int omode, ulong perm)	/* default in dev.c */
59 {
60 	USED(c, name, omode, perm);
61 	error(Eperm);
62 }
63 
64 static void
65 XXXremove(Chan* c)					/* default in dev.c */
66 {
67 	USED(c);
68 	error(Eperm);
69 }
70 
71 static int
72 XXXwstat(Chan* c, uchar *dp, int n)				/* default in dev.c */
73 {
74 	USED(c, dp);
75 	error(Eperm);
76 	return n;
77 }
78 
79 static void
80 XXXclose(Chan* c)
81 {
82 	USED(c);
83 }
84 
85 static long
86 XXXread(Chan* c, void* a, long n, vlong offset)
87 {
88 	USED(offset);
89 
90 	switch((ulong)c->qid.path){
91 	case Qdir:
92 		return devdirread(c, a, n, XXXtab, nelem(XXXtab), devgen);
93 	case Qdata:
94 		break;
95 	default:
96 		n=0;
97 		break;
98 	}
99 	return n;
100 }
101 
102 static Block*
103 XXXbread(Chan* c, long n, ulong offset)			/* default in dev.c */
104 {
105 	return devbread(c, n, offset);
106 }
107 
108 static long
109 XXXwrite(Chan* c, void* a, long n, vlong offset)
110 {
111 	USED(a, offset);
112 
113 	switch((ulong)c->qid.path){
114 	case Qdata:
115 		break;
116 	default:
117 		error(Ebadusefd);
118 	}
119 	return n;
120 }
121 
122 static long
123 XXXbwrite(Chan* c, Block* bp, ulong offset)		/* default in dev.c */
124 {
125 	return devbwrite(c, bp, offset);
126 }
127 
128 Dev XXXdevtab = {					/* defaults in dev.c */
129 	'X',
130 	"XXX",
131 
132 	XXXreset,					/* devreset */
133 	XXXinit,					/* devinit */
134 	devshutdown,
135 	XXXattach,
136 	XXXwalk,
137 	XXXstat,
138 	XXXopen,
139 	XXXcreate,					/* devcreate */
140 	XXXclose,
141 	XXXread,
142 	XXXbread,					/* devbread */
143 	XXXwrite,
144 	XXXbwrite,					/* devbwrite */
145 	XXXremove,					/* devremove */
146 	XXXwstat,					/* devwstat */
147 };
148