xref: /plan9/sys/src/cmd/vt/consctl.c (revision ac84fd08a8c8d942164771116b1cd72c58cf8dc5)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include "cons.h"
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier /*
77dd7cddfSDavid du Colombier  *  bind a pipe onto consctl and keep reading it to
87dd7cddfSDavid du Colombier  *  get changes to console state.
97dd7cddfSDavid du Colombier  */
107dd7cddfSDavid du Colombier Consstate*
consctl(void)117dd7cddfSDavid du Colombier consctl(void)
127dd7cddfSDavid du Colombier {
13*ac84fd08SDavid du Colombier 	int i, n, fd, tries;
147dd7cddfSDavid du Colombier 	char buf[128];
157dd7cddfSDavid du Colombier 	Consstate *x;
167dd7cddfSDavid du Colombier 	char *field[10];
177dd7cddfSDavid du Colombier 
18*ac84fd08SDavid du Colombier 	x = segattach(0, "shared", 0, sizeof *x);
19*ac84fd08SDavid du Colombier 	if(x == (void*)-1)
20*ac84fd08SDavid du Colombier 		sysfatal("segattach: %r");
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier 	/* a pipe to simulate consctl */
237dd7cddfSDavid du Colombier 	if(bind("#|", "/mnt/cons/consctl", MBEFORE) < 0
24*ac84fd08SDavid du Colombier 	|| bind("/mnt/cons/consctl/data1", "/dev/consctl", MREPL) < 0)
25*ac84fd08SDavid du Colombier 		sysfatal("bind consctl: %r");
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier 	/* a pipe to simulate the /dev/cons */
287dd7cddfSDavid du Colombier 	if(bind("#|", "/mnt/cons/cons", MREPL) < 0
29*ac84fd08SDavid du Colombier 	|| bind("/mnt/cons/cons/data1", "/dev/cons", MREPL) < 0)
30*ac84fd08SDavid du Colombier 		sysfatal("bind cons: %r");
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	switch(fork()){
337dd7cddfSDavid du Colombier 	case -1:
34*ac84fd08SDavid du Colombier 		sysfatal("fork: %r");
357dd7cddfSDavid du Colombier 	case 0:
367dd7cddfSDavid du Colombier 		break;
377dd7cddfSDavid du Colombier 	default:
387dd7cddfSDavid du Colombier 		return x;
397dd7cddfSDavid du Colombier 	}
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 	notify(0);
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier 	for(tries = 0; tries < 100; tries++){
447dd7cddfSDavid du Colombier 		x->raw = 0;
457dd7cddfSDavid du Colombier 		x->hold = 0;
467dd7cddfSDavid du Colombier 		fd = open("/mnt/cons/consctl/data", OREAD);
477dd7cddfSDavid du Colombier 		if(fd < 0)
487dd7cddfSDavid du Colombier 			break;
497dd7cddfSDavid du Colombier 		tries = 0;
507dd7cddfSDavid du Colombier 		for(;;){
517dd7cddfSDavid du Colombier 			n = read(fd, buf, sizeof(buf)-1);
527dd7cddfSDavid du Colombier 			if(n <= 0)
537dd7cddfSDavid du Colombier 				break;
547dd7cddfSDavid du Colombier 			buf[n] = 0;
557dd7cddfSDavid du Colombier 			n = getfields(buf, field, 10, 1, " ");
567dd7cddfSDavid du Colombier 			for(i = 0; i < n; i++){
577dd7cddfSDavid du Colombier 				if(strcmp(field[i], "rawon") == 0)
587dd7cddfSDavid du Colombier 					x->raw = 1;
597dd7cddfSDavid du Colombier 				else if(strcmp(field[i], "rawoff") == 0)
607dd7cddfSDavid du Colombier 					x->raw = 0;
617dd7cddfSDavid du Colombier 				else if(strcmp(field[i], "holdon") == 0)
627dd7cddfSDavid du Colombier 					x->hold = 1;
637dd7cddfSDavid du Colombier 				else if(strcmp(field[i], "holdoff") == 0)
647dd7cddfSDavid du Colombier 					x->hold = 0;
657dd7cddfSDavid du Colombier 			}
667dd7cddfSDavid du Colombier 		}
677dd7cddfSDavid du Colombier 		close(fd);
687dd7cddfSDavid du Colombier 	}
697dd7cddfSDavid du Colombier 	exits(0);
707dd7cddfSDavid du Colombier 	return 0;		/* dummy to keep compiler quiet*/
717dd7cddfSDavid du Colombier }
72