xref: /freebsd-src/contrib/netbsd-tests/lib/libcurses/slave/slave.c (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper /*	$NetBSD: slave.c,v 1.6 2011/09/15 11:46:19 blymn Exp $	*/
2*57718be8SEnji Cooper 
3*57718be8SEnji Cooper /*-
4*57718be8SEnji Cooper  * Copyright 2009 Brett Lymn <blymn@NetBSD.org>
5*57718be8SEnji Cooper  *
6*57718be8SEnji Cooper  * All rights reserved.
7*57718be8SEnji Cooper  *
8*57718be8SEnji Cooper  * This code has been donated to The NetBSD Foundation by the Author.
9*57718be8SEnji Cooper  *
10*57718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
11*57718be8SEnji Cooper  * modification, are permitted provided that the following conditions
12*57718be8SEnji Cooper  * are met:
13*57718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
14*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
15*57718be8SEnji Cooper  * 2. The name of the author may not be used to endorse or promote products
16*57718be8SEnji Cooper  *    derived from this software withough specific prior written permission
17*57718be8SEnji Cooper  *
18*57718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*57718be8SEnji Cooper  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*57718be8SEnji Cooper  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*57718be8SEnji Cooper  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*57718be8SEnji Cooper  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*57718be8SEnji Cooper  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*57718be8SEnji Cooper  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*57718be8SEnji Cooper  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*57718be8SEnji Cooper  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*57718be8SEnji Cooper  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*57718be8SEnji Cooper  *
29*57718be8SEnji Cooper  *
30*57718be8SEnji Cooper  */
31*57718be8SEnji Cooper #include <fcntl.h>
32*57718be8SEnji Cooper #include <sys/ioctl.h>
33*57718be8SEnji Cooper #include <unistd.h>
34*57718be8SEnji Cooper #include <err.h>
35*57718be8SEnji Cooper #include <stdio.h>
36*57718be8SEnji Cooper #include <stdlib.h>
37*57718be8SEnji Cooper #include <string.h>
38*57718be8SEnji Cooper #include <curses.h>
39*57718be8SEnji Cooper #include "returns.h"
40*57718be8SEnji Cooper #include "slave.h"
41*57718be8SEnji Cooper 
42*57718be8SEnji Cooper int cmdpipe[2];
43*57718be8SEnji Cooper int slvpipe[2];
44*57718be8SEnji Cooper 
45*57718be8SEnji Cooper #if 0
46*57718be8SEnji Cooper static const char *returns_enum_names[] = {
47*57718be8SEnji Cooper 	"unused", "numeric", "string", "byte", "ERR", "OK", "NULL", "not NULL",
48*57718be8SEnji Cooper 	"variable"
49*57718be8SEnji Cooper };
50*57718be8SEnji Cooper #endif
51*57718be8SEnji Cooper 
52*57718be8SEnji Cooper /*
53*57718be8SEnji Cooper  * Read the command pipe for the function to execute, gather the args
54*57718be8SEnji Cooper  * and then process the command.
55*57718be8SEnji Cooper  */
56*57718be8SEnji Cooper static void
process_commands(WINDOW * mainscr)57*57718be8SEnji Cooper process_commands(WINDOW *mainscr)
58*57718be8SEnji Cooper {
59*57718be8SEnji Cooper 	int len, maxlen, argslen, i, ret, type;
60*57718be8SEnji Cooper 	char *cmdbuf, *tmpbuf, **args, **tmpargs;
61*57718be8SEnji Cooper 
62*57718be8SEnji Cooper 	len = maxlen = 30;
63*57718be8SEnji Cooper 	if ((cmdbuf = malloc(maxlen)) == NULL)
64*57718be8SEnji Cooper 		err(1, "slave cmdbuf malloc failed");
65*57718be8SEnji Cooper 
66*57718be8SEnji Cooper 	while(1) {
67*57718be8SEnji Cooper 		if (read(cmdpipe[READ_PIPE], &type, sizeof(int)) < 0)
68*57718be8SEnji Cooper 			err(1, "slave command type read failed");
69*57718be8SEnji Cooper 
70*57718be8SEnji Cooper 		if (type != ret_string)
71*57718be8SEnji Cooper 			errx(1, "Unexpected type for command, got %d", type);
72*57718be8SEnji Cooper 
73*57718be8SEnji Cooper 		if (read(cmdpipe[READ_PIPE], &len, sizeof(int)) < 0)
74*57718be8SEnji Cooper 			err(1, "slave command len read failed");
75*57718be8SEnji Cooper 
76*57718be8SEnji Cooper 		if ((len + 1) > maxlen) {
77*57718be8SEnji Cooper 			maxlen = len + 1;
78*57718be8SEnji Cooper 			if ((tmpbuf = realloc(cmdbuf, maxlen)) == NULL)
79*57718be8SEnji Cooper 				err(1, "slave cmdbuf realloc to %d "
80*57718be8SEnji Cooper 				    "bytes failed", maxlen);
81*57718be8SEnji Cooper 			cmdbuf = tmpbuf;
82*57718be8SEnji Cooper 		}
83*57718be8SEnji Cooper 
84*57718be8SEnji Cooper 		if (read(cmdpipe[READ_PIPE], cmdbuf, len) < 0)
85*57718be8SEnji Cooper 			err(1, "slave command read failed");
86*57718be8SEnji Cooper 		cmdbuf[len] = '\0';
87*57718be8SEnji Cooper 		argslen = 0;
88*57718be8SEnji Cooper 		args = NULL;
89*57718be8SEnji Cooper 
90*57718be8SEnji Cooper 		do {
91*57718be8SEnji Cooper 			if (read(cmdpipe[READ_PIPE], &type, sizeof(int)) < 0)
92*57718be8SEnji Cooper 				err(1, "slave arg type read failed");
93*57718be8SEnji Cooper 
94*57718be8SEnji Cooper 			if (read(cmdpipe[READ_PIPE], &len, sizeof(int)) < 0)
95*57718be8SEnji Cooper 				err(1, "slave arg len read failed");
96*57718be8SEnji Cooper 
97*57718be8SEnji Cooper 			if (len >= 0) {
98*57718be8SEnji Cooper 				tmpargs = realloc(args,
99*57718be8SEnji Cooper 				    (argslen + 1) * sizeof(char *));
100*57718be8SEnji Cooper 				if (tmpargs == NULL)
101*57718be8SEnji Cooper 					err(1, "slave realloc of args array "
102*57718be8SEnji Cooper 					    "failed");
103*57718be8SEnji Cooper 
104*57718be8SEnji Cooper 				args = tmpargs;
105*57718be8SEnji Cooper 				if (type != ret_null) {
106*57718be8SEnji Cooper 					args[argslen] = malloc(len + 1);
107*57718be8SEnji Cooper 
108*57718be8SEnji Cooper 					if (args[argslen] == NULL)
109*57718be8SEnji Cooper 						err(1, "slave alloc of %d bytes"
110*57718be8SEnji Cooper 						    " for args failed", len);
111*57718be8SEnji Cooper 				}
112*57718be8SEnji Cooper 
113*57718be8SEnji Cooper 				if (len == 0) {
114*57718be8SEnji Cooper 					if (type == ret_null)
115*57718be8SEnji Cooper 						args[argslen] = NULL;
116*57718be8SEnji Cooper 					else
117*57718be8SEnji Cooper 						args[argslen][0] = '\0';
118*57718be8SEnji Cooper 				} else {
119*57718be8SEnji Cooper 					read(cmdpipe[READ_PIPE], args[argslen],
120*57718be8SEnji Cooper 					     len);
121*57718be8SEnji Cooper 					if (type != ret_byte)
122*57718be8SEnji Cooper 						args[argslen][len] = '\0';
123*57718be8SEnji Cooper 
124*57718be8SEnji Cooper 					if (len == 6) {
125*57718be8SEnji Cooper 						if (strcmp(args[argslen],
126*57718be8SEnji Cooper 							   "STDSCR") == 0) {
127*57718be8SEnji Cooper 							ret = asprintf(&tmpbuf,
128*57718be8SEnji Cooper 								 "%p",
129*57718be8SEnji Cooper 								 stdscr);
130*57718be8SEnji Cooper 							if (ret < 0)
131*57718be8SEnji Cooper 								err(2,
132*57718be8SEnji Cooper 								    "asprintf of stdscr failed");
133*57718be8SEnji Cooper 							free(args[argslen]);
134*57718be8SEnji Cooper 							args[argslen] = tmpbuf;
135*57718be8SEnji Cooper 						}
136*57718be8SEnji Cooper 					}
137*57718be8SEnji Cooper 				}
138*57718be8SEnji Cooper 
139*57718be8SEnji Cooper 				argslen++;
140*57718be8SEnji Cooper 			}
141*57718be8SEnji Cooper 		}
142*57718be8SEnji Cooper 		while(len >= 0);
143*57718be8SEnji Cooper 
144*57718be8SEnji Cooper 		command_execute(cmdbuf, argslen, args);
145*57718be8SEnji Cooper 
146*57718be8SEnji Cooper 		if (args != NULL) {
147*57718be8SEnji Cooper 			for (i = 0; i < argslen; i++)
148*57718be8SEnji Cooper 				free(args[i]);
149*57718be8SEnji Cooper 
150*57718be8SEnji Cooper 			free(args);
151*57718be8SEnji Cooper 		}
152*57718be8SEnji Cooper 	}
153*57718be8SEnji Cooper }
154*57718be8SEnji Cooper 
155*57718be8SEnji Cooper int
main(int argc,char * argv[])156*57718be8SEnji Cooper main(int argc, char *argv[])
157*57718be8SEnji Cooper {
158*57718be8SEnji Cooper 	WINDOW *mainscr;
159*57718be8SEnji Cooper 
160*57718be8SEnji Cooper 	if (argc != 5) {
161*57718be8SEnji Cooper 		fprintf(stderr, "Usage: %s <cmdin> <cmdout> <slvin> slvout>\n",
162*57718be8SEnji Cooper 			getprogname());
163*57718be8SEnji Cooper 		return 0;
164*57718be8SEnji Cooper 	}
165*57718be8SEnji Cooper 	sscanf(argv[1], "%d", &cmdpipe[0]);
166*57718be8SEnji Cooper 	sscanf(argv[2], "%d", &cmdpipe[1]);
167*57718be8SEnji Cooper 	sscanf(argv[3], "%d", &slvpipe[0]);
168*57718be8SEnji Cooper 	sscanf(argv[4], "%d", &slvpipe[1]);
169*57718be8SEnji Cooper 
170*57718be8SEnji Cooper 	mainscr = initscr();
171*57718be8SEnji Cooper 	if (mainscr == NULL)
172*57718be8SEnji Cooper 		err(1, "initscr failed");
173*57718be8SEnji Cooper 
174*57718be8SEnji Cooper 	process_commands(mainscr);
175*57718be8SEnji Cooper 
176*57718be8SEnji Cooper 	return 0;
177*57718be8SEnji Cooper }
178