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