summaryrefslogtreecommitdiff
path: root/sys/src/cmd/atazz/probe.c
diff options
context:
space:
mode:
authorgoogle <google@daverabbitz.ath.cx>2012-09-20 22:39:48 +1200
committergoogle <google@daverabbitz.ath.cx>2012-09-20 22:39:48 +1200
commitfa7fb8b66b9ff50029532d09315f03896f2ac4c4 (patch)
tree262cfe8966f3c07a5ad6ed61fda028f6fa928a36 /sys/src/cmd/atazz/probe.c
parent913afc39c9b4750e630c7f4ff3161a37602b006b (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.c75
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;
+}