#include #include #include int readln(char*, char*, int); void error(char *, ...); void usage(void); int setlm(char *); int mlock = 1; int dlock = 1; void main(int argc, char **argv) { int drawd,mctl; int i,j,t = 30,s = 0; char lockp[32], ulockp[32], *lm, *am; char l = '1'; ARGBEGIN{ case 't': t = atol(ARGF()); if(t==0) usage(); break; case 'b': l = '0'; break; case 'm': lm = ARGF(); if(lm==0) usage(); if(setlm(lm) < 0 ) error("unknown lock method %s\n", lm); break; default: usage(); }ARGEND; readln("Lockword: ",lockp, sizeof lockp); if (dlock) { drawd = open("/dev/draw/1/data", OWRITE); if(drawd < 0) error("couldn't open /dev/draw/1/data"); fprint(drawd, "B%c%-4d%-4d\n",l,t,s); } if (mlock) { mctl = open("/dev/mousectl", OWRITE); if(mctl < 0) error("couldn't open /dev/mousectl"); fprint(mctl, "buttonlock"); } for(;;) { readln("Password: ",ulockp,sizeof ulockp); if (strcmp(ulockp,lockp) == 0) { if (mlock) fprint(mctl, "buttonmap"); if (dlock) { fprint(drawd, "B0%-4d%-4d\n",t,t); } exits(0); } else { print("Invalid password, try again\n"); } } if (mlock) close(mctl); if (dlock) close(drawd); } int setlm(char *lm) { if(strcmp(lm,"mouse") == 0) { dlock = 0; return 0; } if(strcmp(lm,"draw") == 0) { mlock = 0; return 0; } if(strcmp(lm,"all") == 0) { return 0; } return -1; } void usage(void) { fprint(2, "usage: rlock [-t time] [-m {mouse|draw|all} ] [ -b ] \n"); exits("usage"); } void error(char *fmt, ...) { char buf[8192], *s; va_list arg; s = buf; s += sprint(s, "rlock: "); va_start(arg, fmt); s = doprint(s, buf + sizeof(buf), fmt, arg); va_end(arg); *s++ = '\n'; write(2, buf, s - buf); exits(buf); } int readln(char *prompt, char *line, int len) { char *p; int fd, ctl, n, nr; fd = open("/dev/cons", ORDWR); if(fd < 0) error("couldn't open cons"); ctl = open("/dev/consctl", OWRITE); if(ctl < 0) error("couldn't set raw mode"); write(ctl, "rawon", 5); fprint(fd, "%s", prompt); nr = 0; p = line; for(;;){ n = read(fd, p, 1); if(n < 0){ close(fd); close(ctl); return -1; } if(n == 0 || *p == '\n' || *p == '\r'){ *p = '\0'; write(fd, "\n", 1); close(fd); close(ctl); return nr; } if(*p == '\b'){ if(nr > 0){ nr--; p--; } }else if(*p == 21){ /* cntrl-u */ fprint(fd, "\n%s", prompt); nr = 0; p = line; }else{ nr++; p++; } if(nr == len){ fprint(fd, "line too long; try again\n%s", prompt); nr = 0; p = line; } } return -1; }