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