xref: /plan9/sys/src/cmd/samterm/plan9.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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