xref: /inferno-os/os/port/devtest.c (revision d0e1d143ef6f03c75c008c7ec648859dd260cbab)
1 /*
2  *  Test 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	"io.h"
10 #include	"../port/error.h"
11 #include	"libcrypt.h"
12 
13 #include <kernel.h>
14 
15 #define	DEBUG	0
16 
17 extern void _startup(void);
18 
19 enum{
20 	Qdir,
21 	Qkt5sum,
22 	Qkerndate,
23 };
24 
25 static
26 Dirtab testtab[]={
27 	".",			{ Qdir, 0, QTDIR},	0,	0555,
28 	"kt5sum",		{ Qkt5sum },		0,	0444,
29 	"kerndate",	{ Qkerndate },		0,	0444,
30 };
31 
32 
33 void ktsum(char *digest)
34 {
35 	uchar rawdigest[MD5dlen+1];
36 	int i;
37 	void *start =  _startup;
38 	ulong size = (ulong)etext - (ulong) start;
39 	md5(start, size, rawdigest, nil);
40 	for (i=0; i<MD5dlen; i++)
41 		sprint(&digest[2*i], "%2.2x", rawdigest[i]);
42 	digest[MD5dlen*2] = 0;
43 	strcat(digest, "\n");
44 }
45 
46 static Chan*
47 testattach(char *spec)
48 {
49 	return devattach('Z', spec);
50 }
51 
52 static Walkqid*
53 testwalk(Chan *c, Chan *nc, char **name, int nname)
54 {
55 	return devwalk(c, nc, name, nname, testtab, nelem(testtab), devgen);
56 }
57 
58 static int
59 teststat(Chan *c, uchar *db, int n)
60 {
61 	return devstat(c, db, n, testtab, nelem(testtab), devgen);
62 }
63 
64 static Chan*
65 testopen(Chan *c, int omode)
66 {
67 	return devopen(c, omode, testtab, nelem(testtab), devgen);
68 }
69 
70 static void
71 testclose(Chan *)
72 {
73 }
74 
75 extern ulong kerndate;
76 
77 static long
78 testread(Chan* c, void* a, long n, vlong offset)
79 {
80 	char digest[MD5dlen*2+1];
81 	switch ((ulong)c->qid.path) {
82 	case Qdir:
83 		return devdirread(c, a, n, testtab, nelem(testtab), devgen);
84 	case Qkt5sum:
85 		ktsum(digest);
86 		return readstr(offset, a, n, digest);
87 	case Qkerndate:
88 		sprint(digest, "%ld\n", kerndate);
89 		return readstr(offset, a, n, digest);
90 	default:
91 		n = 0;
92 		break;
93 	}
94 	return n;
95 }
96 
97 
98 static long
99 testwrite(Chan*, void*, long, vlong)
100 {
101 	error(Ebadusefd);
102 	return 0;
103 }
104 
105 Dev testdevtab = {
106 	'Z',
107 	"test",
108 
109 	devreset,
110 	devinit,
111 	devshutdown,
112 	testattach,
113 	testwalk,
114 	teststat,
115 	testopen,
116 	devcreate,
117 	testclose,
118 	testread,
119 	devbread,
120 	testwrite,
121 	devbwrite,
122 	devremove,
123 	devwstat,
124 };
125 
126