diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
| commit | 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch) | |
| tree | c6e220ba61db3a6ea4052e6841296d829654e664 /os/port/devtest.c | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'os/port/devtest.c')
| -rw-r--r-- | os/port/devtest.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/os/port/devtest.c b/os/port/devtest.c new file mode 100644 index 00000000..2c935014 --- /dev/null +++ b/os/port/devtest.c @@ -0,0 +1,125 @@ +/* + * Test device + */ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "../port/error.h" +#include "libcrypt.h" + +#include <kernel.h> + +#define DEBUG 0 + +extern void _startup(void); + +enum{ + Qdir, + Qkt5sum, + Qkerndate, +}; + +static +Dirtab testtab[]={ + ".", { Qdir, 0, QTDIR}, 0, 0555, + "kt5sum", { Qkt5sum }, 0, 0444, + "kerndate", { Qkerndate }, 0, 0444, +}; + + +void ktsum(char *digest) +{ + uchar rawdigest[MD5dlen+1]; + int i; + void *start = _startup; + ulong size = (ulong)etext - (ulong) start; + md5(start, size, rawdigest, nil); + for (i=0; i<MD5dlen; i++) + sprint(&digest[2*i], "%2.2x", rawdigest[i]); + digest[MD5dlen*2] = 0; + strcat(digest, "\n"); +} + +static Chan* +testattach(char *spec) +{ + return devattach('Z', spec); +} + +static Walkqid* +testwalk(Chan *c, Chan *nc, char **name, int nname) +{ + return devwalk(c, nc, name, nname, testtab, nelem(testtab), devgen); +} + +static int +teststat(Chan *c, uchar *db, int n) +{ + return devstat(c, db, n, testtab, nelem(testtab), devgen); +} + +static Chan* +testopen(Chan *c, int omode) +{ + return devopen(c, omode, testtab, nelem(testtab), devgen); +} + +static void +testclose(Chan *) +{ +} + +extern ulong kerndate; + +static long +testread(Chan* c, void* a, long n, vlong offset) +{ + char digest[MD5dlen*2+1]; + switch ((ulong)c->qid.path) { + case Qdir: + return devdirread(c, a, n, testtab, nelem(testtab), devgen); + case Qkt5sum: + ktsum(digest); + return readstr(offset, a, n, digest); + case Qkerndate: + sprint(digest, "%ld\n", kerndate); + return readstr(offset, a, n, digest); + default: + n = 0; + break; + } + return n; +} + + +static long +testwrite(Chan*, void*, long, vlong) +{ + error(Ebadusefd); + return 0; +} + +Dev testdevtab = { + 'Z', + "test", + + devreset, + devinit, + devshutdown, + testattach, + testwalk, + teststat, + testopen, + devcreate, + testclose, + testread, + devbread, + testwrite, + devbwrite, + devremove, + devwstat, +}; + |
