1 /*
2  * test_ss.c
3  *
4  * Copyright 1987, 1988 by MIT Student Information Processing Board
5  *
6  * Permission to use, copy, modify, and distribute this software and
7  * its documentation for any purpose is hereby granted, provided that
8  * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in
9  * advertising or publicity pertaining to distribution of the software
10  * without specific, written prior permission.  M.I.T. and the
11  * M.I.T. S.I.P.B. make no representations about the suitability of
12  * this software for any purpose.  It is provided "as is" without
13  * express or implied warranty.
14 
15  */
16 
17 #include "config.h"
18 #include <unistd.h>
19 #include <stdlib.h>
20 #include <stdio.h>
21 #ifdef HAVE_GETOPT_H
22 #include <getopt.h>
23 #endif
24 #include <string.h>
25 #include "ss.h"
26 
27 extern ss_request_table test_cmds;
28 
29 #define TRUE 1
30 #define FALSE 0
31 
32 static char subsystem_name[] = "test_ss";
33 static char version[] = "1.0";
34 
source_file(const char * cmd_file,int sci_idx)35 static int source_file(const char *cmd_file, int sci_idx)
36 {
37 	FILE		*f;
38 	char		buf[256];
39 	char		*cp;
40 	int		exit_status = 0;
41 	int		retval;
42 	int 		noecho;
43 
44 	if (strcmp(cmd_file, "-") == 0)
45 		f = stdin;
46 	else {
47 		f = fopen(cmd_file, "r");
48 		if (!f) {
49 			perror(cmd_file);
50 			exit(1);
51 		}
52 	}
53 	fflush(stdout);
54 	fflush(stderr);
55 	setbuf(stdout, NULL);
56 	setbuf(stderr, NULL);
57 	while (!feof(f)) {
58 		if (fgets(buf, sizeof(buf), f) == NULL)
59 			break;
60 		if (buf[0] == '#')
61 			continue;
62 		noecho = 0;
63 		if (buf[0] == '-') {
64 			noecho = 1;
65 			buf[0] = ' ';
66 		}
67 		cp = strchr(buf, '\n');
68 		if (cp)
69 			*cp = 0;
70 		cp = strchr(buf, '\r');
71 		if (cp)
72 			*cp = 0;
73 		if (!noecho)
74 			printf("test_icount: %s\n", buf);
75 		retval = ss_execute_line(sci_idx, buf);
76 		if (retval) {
77 			ss_perror(sci_idx, retval, buf);
78 			exit_status++;
79 		}
80 	}
81 	return exit_status;
82 }
83 
main(int argc,char ** argv)84 int main(int argc, char **argv)
85 {
86 	int c, code;
87 	char *request = (char *)NULL;
88 	char		*cmd_file = 0;
89 	int sci_idx;
90 	int exit_status = 0;
91 
92 	while ((c = getopt (argc, argv, "wR:f:")) != EOF) {
93 		switch (c) {
94 		case 'R':
95 			request = optarg;
96 			break;
97 		case 'f':
98 			cmd_file = optarg;
99 			break;
100 		default:
101 			com_err(argv[0], 0, "Usage: test_ss [-R request] "
102 				"[-f cmd_file]");
103 			exit(1);
104 		}
105 	}
106 
107 	sci_idx = ss_create_invocation(subsystem_name, version,
108 				       (char *)NULL, &test_cmds, &code);
109 	if (code) {
110 		ss_perror(sci_idx, code, "creating invocation");
111 		exit(1);
112 	}
113 
114 	(void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &code);
115 	if (code) {
116 		ss_perror (sci_idx, code, "adding standard requests");
117 		exit (1);
118 	}
119 
120 	printf("test_ss %s.  Type '?' for a list of commands.\n\n",
121 	       version);
122 
123 	if (request) {
124 		code = ss_execute_line(sci_idx, request);
125 		if (code) {
126 			ss_perror(sci_idx, code, request);
127 			exit_status++;
128 		}
129 	} else if (cmd_file) {
130 		exit_status = source_file(cmd_file, sci_idx);
131 	} else {
132 		ss_listen(sci_idx);
133 	}
134 
135 	exit(exit_status);
136 }
137 
138 
test_cmd(argc,argv)139 void test_cmd (argc, argv)
140     int argc;
141     char **argv;
142 {
143     printf("Hello, world!\n");
144     printf("Args: ");
145     while (++argv, --argc) {
146 	printf("'%s'", *argv);
147 	if (argc > 1)
148 	    fputs(", ", stdout);
149     }
150     putchar ('\n');
151 }
152