diff options
author | google <google@daverabbitz.ath.cx> | 2012-09-20 22:39:48 +1200 |
---|---|---|
committer | google <google@daverabbitz.ath.cx> | 2012-09-20 22:39:48 +1200 |
commit | fa7fb8b66b9ff50029532d09315f03896f2ac4c4 (patch) | |
tree | 262cfe8966f3c07a5ad6ed61fda028f6fa928a36 /sys/src/cmd/atazz/probe.c | |
parent | 913afc39c9b4750e630c7f4ff3161a37602b006b (diff) |
Add Erik Quanstrom's atazz
(needed to disable power management/head unload on 2.5" drive)
Diffstat (limited to 'sys/src/cmd/atazz/probe.c')
-rw-r--r-- | sys/src/cmd/atazz/probe.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/sys/src/cmd/atazz/probe.c b/sys/src/cmd/atazz/probe.c new file mode 100644 index 000000000..7963364be --- /dev/null +++ b/sys/src/cmd/atazz/probe.c @@ -0,0 +1,75 @@ +#include <u.h> +#include <libc.h> +#include <fis.h> +#include "atazz.h" + +static int +ckprint(char *s) +{ + char buf[ERRMAX]; + int st; + Dev d; + + squelch = 1; + d.fd = -1; + st = opendev(s, &d); + squelch = 0; + if(st == -1){ + rerrstr(buf, sizeof buf); + if(strstr(buf, "ata command") != nil) + return 0; + return 0 /* -1 */; + } + close(d.fd); + print("%s\t%llud; %ud\t%llux\n", s, d.nsect, d.secsize, d.wwn); + return 1; +} + +static int +probe0(char *s, int l) +{ + char *p, *f[3], buf[16]; + int i, r; + + s[l] = 0; + r = 0; + for(; p = strchr(s, '\n'); s = p + 1){ + if(tokenize(s, f, nelem(f)) < 1) + continue; + for(i = 0; i < 10; i++){ + snprint(buf, sizeof buf, "/dev/%s%d", f[0], i); + switch(ckprint(buf)){ + case -1: + eprint("!device error %s: %r\n", buf); + break; + case 0: + goto nextdev; + case 1: + r++; + break; + } + nextdev: + ; + } + } + return r; +} + +int +probe(void) +{ + char *s; + int fd, l, r; + + fd = open("/dev/sdctl", OREAD); + if(fd == -1) + return -1; + r = -1; + l = 1024; /* #S/sdctl has 0 size; guess */ + if(s = malloc(l + 1)) + if((l = read(fd, s, l)) > 0) + r = probe0(s, l); + free(s); + close(fd); + return r; +} |