xref: /netbsd-src/tests/lib/libcurses/slave/commands.c (revision cb861154c176d3dcc8ff846f449e3c16a5f5edb5)
1 /*	$NetBSD: commands.c,v 1.1 2011/04/10 09:55:10 blymn Exp $	*/
2 
3 /*-
4  * Copyright 2009 Brett Lymn <blymn@NetBSD.org>
5  *
6  * All rights reserved.
7  *
8  * This code has been donated to The NetBSD Foundation by the Author.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. The name of the author may not be used to endorse or promote products
16  *    derived from this software withough specific prior written permission
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  *
29  *
30  */
31 
32 #include <curses.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <stdio.h>
36 #include <sys/types.h>
37 #include "returns.h"
38 #include "slave.h"
39 #include "command_table.h"
40 
41 extern int cmdpipe[2];
42 extern int slvpipe[2];
43 
44 static void report_type(returns_enum_t);
45 static void report_message(int, char *);
46 
47 /*
48  * Match the passed command string and execute the associated test
49  * function.
50  */
51 void
52 command_execute(char *func, int nargs, char **args)
53 {
54 	size_t i;
55 
56 	i = 0;
57 	while (i < ncmds) {
58 		if (strcasecmp(func, commands[i].name) == 0) {
59 			/* matched function */
60 			commands[i].func(nargs, args);
61 			return;
62 		}
63 		i++;
64 	}
65 
66 	report_status("UNKNOWN_FUNCTION");
67 }
68 
69 /*
70  * Report an pointer value back to the director
71  */
72 void
73 report_ptr(void *ptr)
74 {
75 	char *string;
76 
77 	asprintf(&string, "%td", ptr);
78 	report_status(string);
79 	free(string);
80 }
81 
82 /*
83  * Report an integer value back to the director
84  */
85 void
86 report_int(int value)
87 {
88 	char *string;
89 
90 	asprintf(&string, "%d", value);
91 	report_status(string);
92 	free(string);
93 }
94 
95 /*
96  * Report either an ERR or OK back to the director
97  */
98 void
99 report_return(int status)
100 {
101 	if (status == ERR)
102 		report_type(ret_err);
103 	else if (status == OK)
104 		report_type(ret_ok);
105 	else
106 		report_status("INVALID_RETURN");
107 }
108 
109 /*
110  * Report the type back to the director via the command pipe
111  */
112 static void
113 report_type(returns_enum_t return_type)
114 {
115 	int type;
116 
117 	type = return_type;
118 	if (write(slvpipe[WRITE_PIPE], &type, sizeof(int)) < 0) {
119 		perror("command pipe write for status type failed");
120 		exit(1);
121 	}
122 
123 }
124 
125 /*
126  * Report the number of returns back to the director via the command pipe
127  */
128 void
129 report_count(int count)
130 {
131 	int type;
132 
133 	type = ret_count;
134 	if (write(slvpipe[WRITE_PIPE], &type, sizeof(int)) < 0) {
135 		perror("command pipe write for count type failed");
136 		exit(1);
137 	}
138 
139 	if (write(slvpipe[WRITE_PIPE], &count, sizeof(int)) < 0) {
140 		perror("command pipe write for count");
141 		exit(1);
142 	}
143 }
144 
145 /*
146  * Report the status back to the director via the command pipe
147  */
148 void
149 report_status(char *status)
150 {
151 	report_message(ret_string, status);
152 }
153 
154 /*
155  * Report an error message back to the director via the command pipe.
156  */
157 void
158 report_error(char *status)
159 {
160 	report_message(ret_slave_error, status);
161 }
162 
163 /*
164  * Report the message with the given type back to the director via the
165  * command pipe.
166  */
167 static void
168 report_message(int type, char *status)
169 {
170 	int len;
171 
172 	len = strlen(status);
173 
174 	if (write(slvpipe[WRITE_PIPE], &type, sizeof(int)) < 0) {
175 		perror("command pipe write for message type failed");
176 		exit(1);
177 	}
178 
179 	if (write(slvpipe[WRITE_PIPE], &len, sizeof(int)) < 0) {
180 		perror("command pipe write for message length failed");
181 		exit(1);
182 	}
183 
184 	if (write(slvpipe[WRITE_PIPE], status, len) < 0) {
185 		perror("command pipe write of message data failed");
186 		exit(1);
187 	}
188 }
189 
190 /*
191  * Report a string of chtype back to the director via the command pipe.
192  */
193 void
194 report_nstr(chtype *string)
195 {
196 	int len, type;
197 	chtype *p;
198 
199 	len = 0;
200 	p = string;
201 
202 	while ((*p++ & __CHARTEXT) != 0) {
203 		len++;
204 	}
205 
206 	type = ret_byte;
207 	if (write(slvpipe[WRITE_PIPE], &type, sizeof(int)) < 0) {
208 		perror("report_nstr: command pipe write for status type failed");
209 		exit(1);
210 	}
211 
212 	if (write(slvpipe[WRITE_PIPE], &len, sizeof(int)) < 0) {
213 		perror("report_nstr: command pipe write for status length failed");
214 		exit(1);
215 	}
216 
217 	if (write(slvpipe[WRITE_PIPE], string, len) < 0) {
218 		perror("report_nstr: command pipe write of status data failed");
219 		exit(1);
220 	}
221 }
222 
223 /*
224  * Check the number of args we received are what we expect.  Return an
225  * error if they do not match.
226  */
227 int
228 check_arg_count(int nargs, int expected)
229 {
230 	if (nargs != expected) {
231 		report_count(1);
232 		report_error("INCORRECT_ARGUMENT_NUMBER");
233 		return(1);
234 	}
235 
236 	return(0);
237 }
238