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