#include <u.h>
#include <libc.h>
#include <draw.h>

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;
}



