#include #include #include typedef struct Sfisx Sfisx; struct Sfisx { uvlong sectors; uint secsize; char serial[20]; char firmware[8]; char model[8]; uvlong wwn; Sfis; }; int idss0(Sfis *f, ushort *id) { uint sw, i; if(f->sig>>16 == 0xeb14) return 0; f->lsectsz = 512; f->physshift = 0; i = id16(id, 106); print("word 106 %.4ux [valid=%d]\n", i, i>>14 == 1); print(" multiple log/phys? %d\n", (i& 1<<13) != 0); if((i& 1<<13) != 0) print(" log/phys %d\n", 1<<(i&7)); sw = id32(id, 117); print(" logical sector size %d [valid=%d]\n", sw*2, (i & 1<<12) != 0); return 0; /* if(i >> 14 != 1) return f->lsectsz; if((sw = id32(id, 117)) >= 256) f->lsectsz = sw * 2; if(i & 1<<13) f->physshift = i & 7; return f->lsectsz * (1<physshift); */ } void main(void) { char buf[1024], buf2[128], *s2; ushort *id; int n, i, l; Sfisx *f; s2 = "az> "; l = strlen(s2); n = read(0, buf, sizeof buf); if(n < 512) sysfatal("bad ident: %r"); /* fix my mistake in asking for buffer */ for(i = 0; i <= n-l; i++) if(memcmp(buf+i, s2, l) == 0){ memcpy(buf+i, buf+i+l, n-(i+l)); n -= l; } if(n != 512) sysfatal("bad ident: %d bytes\n", n); // write(1, buf, 512); f = malloc(sizeof *f); if(f == nil) sysfatal("malloc"); memset(f, 0, sizeof *f); id = (ushort*)buf; f->sectors = idfeat(f, id); f->secsize = idss(f, id); f->wwn = idwwn(f, id); idmove(f->serial, id+10, 20); idmove(f->firmware, id+23, 8); idmove(f->model, id+27, 40); print("%,lld %d-byte sectors\n", f->sectors, f->secsize); print("serial: %s\n", f->serial); print("firmware: %s\n", f->firmware); print("model: %s\n", f->model); pflag(buf2, buf2+sizeof buf2, f); print("pflag: %s\n", buf2); idss0(f, id); exits(""); }