#include #include #include enum{LEN = 128}; int match(int n, char *label) { int fd, len; char s[LEN]; snprint(s, LEN, "/dev/wsys/%d/label", n); if((fd = open(s, OREAD)) < 0) return 0; len = strlen(label); if(read(fd, s, len) != len || memcmp(s, label, len) != 0){ close(fd); return 0; } close(fd); snprint(s, LEN, "/dev/wsys/%d/wctl", n); if((fd = open(s, OWRITE)) < 0) return -1; fprint(fd, "unhide"); fprint(fd, "current"); close(fd); return 1; } void findwctl(char *label) { Dir *d; int fd, n, i; if((fd = open("/dev/wsys", OREAD)) < 0) return; while((n = dirread(fd, &d)) > 0){ for(i = 0; i < n; i++) if(match(atoi(d[i].name), label)){ free(d); close(fd); return; } free(d); } close(fd); } void main(int argc, char **argv) { Plumbmsg *m; int fd; if(argc != 3) sysfatal("usage: %s fd label", argv[0]); if(strlen(argv[2]) >= LEN) sysfatal("label match too long: %s", argv[2]); if((fd = plumbopen(argv[1], OREAD)) < 0) sysfatal("couldn't open plumb fd %s", argv[1]); for(;;){ if((m = plumbrecv(fd)) == nil) sysfatal("error on plumb fd %s", argv[1]); plumbfree(m); findwctl(argv[2]); } }