13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <libg.h> 43e12c5d1SDavid du Colombier #include <frame.h> 53e12c5d1SDavid du Colombier #include "flayer.h" 63e12c5d1SDavid du Colombier #include "samterm.h" 73e12c5d1SDavid du Colombier 8bd389b36SDavid du Colombier static char exname[64]; 9bd389b36SDavid du Colombier 103e12c5d1SDavid du Colombier void 113e12c5d1SDavid du Colombier getscreen(int argc, char **argv) 123e12c5d1SDavid du Colombier { 133e12c5d1SDavid du Colombier USED(argc); 143e12c5d1SDavid du Colombier USED(argv); 153e12c5d1SDavid du Colombier binit(panic, 0, "sam"); 163e12c5d1SDavid du Colombier bitblt(&screen, screen.clipr.min, &screen, screen.clipr, 0); 173e12c5d1SDavid du Colombier } 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier int 20*219b2ee8SDavid du Colombier screensize(int *w, int *h) 21*219b2ee8SDavid du Colombier { 22*219b2ee8SDavid du Colombier int fd, n; 23*219b2ee8SDavid du Colombier char buf[5*12+1]; 24*219b2ee8SDavid du Colombier 25*219b2ee8SDavid du Colombier fd = open("/dev/screen", OREAD); 26*219b2ee8SDavid du Colombier if(fd < 0) 27*219b2ee8SDavid du Colombier return 0; 28*219b2ee8SDavid du Colombier n = read(fd, buf, sizeof(buf)-1); 29*219b2ee8SDavid du Colombier close(fd); 30*219b2ee8SDavid du Colombier if(n != sizeof(buf)-1) 31*219b2ee8SDavid du Colombier return 0; 32*219b2ee8SDavid du Colombier buf[n] = 0; 33*219b2ee8SDavid du Colombier if(h){ 34*219b2ee8SDavid du Colombier *h = atoi(buf+4*12)-atoi(buf+2*12); 35*219b2ee8SDavid du Colombier if (*h < 0) 36*219b2ee8SDavid du Colombier return 0; 37*219b2ee8SDavid du Colombier } 38*219b2ee8SDavid du Colombier if(w){ 39*219b2ee8SDavid du Colombier *w = atoi(buf+3*12)-atoi(buf+1*12); 40*219b2ee8SDavid du Colombier if (*w < 0) 41*219b2ee8SDavid du Colombier return 0; 42*219b2ee8SDavid du Colombier } 43*219b2ee8SDavid du Colombier return 1; 44*219b2ee8SDavid du Colombier } 45*219b2ee8SDavid du Colombier 46*219b2ee8SDavid du Colombier int 473e12c5d1SDavid du Colombier snarfswap(char *fromsam, int nc, char **tosam) 483e12c5d1SDavid du Colombier { 493e12c5d1SDavid du Colombier char *s1; 503e12c5d1SDavid du Colombier int f, n; 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier f = open("/dev/snarf", 0); 533e12c5d1SDavid du Colombier if(f < 0) 543e12c5d1SDavid du Colombier return -1; 553e12c5d1SDavid du Colombier *tosam = s1 = alloc(SNARFSIZE); 563e12c5d1SDavid du Colombier n = read(f, s1, SNARFSIZE-1); 573e12c5d1SDavid du Colombier close(f); 583e12c5d1SDavid du Colombier if(n < 0) 593e12c5d1SDavid du Colombier n = 0; 60bd389b36SDavid du Colombier if(n == 0){ 613e12c5d1SDavid du Colombier *tosam = 0; 62bd389b36SDavid du Colombier free(s1); 63bd389b36SDavid du Colombier }else 643e12c5d1SDavid du Colombier s1[n] = 0; 653e12c5d1SDavid du Colombier f = create("/dev/snarf", 1, 0666); 663e12c5d1SDavid du Colombier if(f >= 0){ 673e12c5d1SDavid du Colombier write(f, fromsam, nc); 683e12c5d1SDavid du Colombier close(f); 693e12c5d1SDavid du Colombier } 703e12c5d1SDavid du Colombier return n; 713e12c5d1SDavid du Colombier } 723e12c5d1SDavid du Colombier 733e12c5d1SDavid du Colombier void 743e12c5d1SDavid du Colombier dumperrmsg(int count, int type, int count0, int c) 753e12c5d1SDavid du Colombier { 763e12c5d1SDavid du Colombier fprint(2, "samterm: host mesg: count %d %ux %ux %ux %s...ignored\n", 773e12c5d1SDavid du Colombier count, type, count0, c, rcvstring()); 783e12c5d1SDavid du Colombier } 79bd389b36SDavid du Colombier 80bd389b36SDavid du Colombier void 81bd389b36SDavid du Colombier removeextern(void) 82bd389b36SDavid du Colombier { 83bd389b36SDavid du Colombier remove(exname); 84bd389b36SDavid du Colombier } 85bd389b36SDavid du Colombier 86bd389b36SDavid du Colombier void 87bd389b36SDavid du Colombier extstart(void) 88bd389b36SDavid du Colombier { 89bd389b36SDavid du Colombier char buf[32]; 90bd389b36SDavid du Colombier int fd, p[2]; 91bd389b36SDavid du Colombier 92bd389b36SDavid du Colombier if(pipe(p) < 0) 93bd389b36SDavid du Colombier return; 94bd389b36SDavid du Colombier sprint(exname, "/srv/sam.%s", getuser()); 95bd389b36SDavid du Colombier fd = create(exname, 1, 0600); 96*219b2ee8SDavid du Colombier if(fd < 0){ /* assume existing guy is more important */ 97bd389b36SDavid du Colombier Err: 98bd389b36SDavid du Colombier close(p[0]); 99bd389b36SDavid du Colombier close(p[1]); 100bd389b36SDavid du Colombier return; 101bd389b36SDavid du Colombier } 102bd389b36SDavid du Colombier sprint(buf, "%d", p[0]); 103bd389b36SDavid du Colombier if(write(fd, buf, strlen(buf)) <= 0) 104bd389b36SDavid du Colombier goto Err; 105bd389b36SDavid du Colombier close(fd); 106bd389b36SDavid du Colombier /* 107bd389b36SDavid du Colombier * leave p[0] open so if the file is removed the event 108bd389b36SDavid du Colombier * library won't get an error 109bd389b36SDavid du Colombier */ 110bd389b36SDavid du Colombier estart(Eextern, p[1], 8192); 111bd389b36SDavid du Colombier atexit(removeextern); 112bd389b36SDavid du Colombier } 113