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 <unistd.h>
18#include <stdlib.h>
19#include <stdio.h>
20#ifdef HAVE_GETOPT_H
21#include <getopt.h>
22#endif
23#include <string.h>
24#include "ss.h"
25
26extern ss_request_table test_cmds;
27
28#define TRUE 1
29#define FALSE 0
30
31static char subsystem_name[] = "test_ss";
32static char version[] = "1.0";
33
34static int source_file(const char *cmd_file, int sci_idx)
35{
36	FILE		*f;
37	char		buf[256];
38	char		*cp;
39	int		exit_status = 0;
40	int		retval;
41	int 		noecho;
42
43	if (strcmp(cmd_file, "-") == 0)
44		f = stdin;
45	else {
46		f = fopen(cmd_file, "r");
47		if (!f) {
48			perror(cmd_file);
49			exit(1);
50		}
51	}
52	setbuf(stdout, NULL);
53	setbuf(stderr, NULL);
54	while (!feof(f)) {
55		if (fgets(buf, sizeof(buf), f) == NULL)
56			break;
57		if (buf[0] == '#')
58			continue;
59		noecho = 0;
60		if (buf[0] == '-') {
61			noecho = 1;
62			buf[0] = ' ';
63		}
64		cp = strchr(buf, '\n');
65		if (cp)
66			*cp = 0;
67		cp = strchr(buf, '\r');
68		if (cp)
69			*cp = 0;
70		if (!noecho)
71			printf("test_icount: %s\n", buf);
72		retval = ss_execute_line(sci_idx, buf);
73		if (retval) {
74			ss_perror(sci_idx, retval, buf);
75			exit_status++;
76		}
77	}
78	return exit_status;
79}
80
81int main(int argc, char **argv)
82{
83	int c, code;
84	char *request = (char *)NULL;
85	char		*cmd_file = 0;
86	int sci_idx;
87	int exit_status = 0;
88	const char	*usage = "Usage: test_ss [-R request] [-f cmd_file]";
89
90	while ((c = getopt (argc, argv, "wR:f:")) != EOF) {
91		switch (c) {
92		case 'R':
93			request = optarg;
94			break;
95		case 'f':
96			cmd_file = optarg;
97			break;
98		default:
99			com_err(argv[0], 0, usage);
100			exit(1);
101		}
102	}
103
104	sci_idx = ss_create_invocation(subsystem_name, version,
105				       (char *)NULL, &test_cmds, &code);
106	if (code) {
107		ss_perror(sci_idx, code, "creating invocation");
108		exit(1);
109	}
110
111	(void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &code);
112	if (code) {
113		ss_perror (sci_idx, code, "adding standard requests");
114		exit (1);
115	}
116
117	printf("test_ss %s.  Type '?' for a list of commands.\n\n",
118	       version);
119
120	if (request) {
121		code = ss_execute_line(sci_idx, request);
122		if (code) {
123			ss_perror(sci_idx, code, request);
124			exit_status++;
125		}
126	} else if (cmd_file) {
127		exit_status = source_file(cmd_file, sci_idx);
128	} else {
129		ss_listen(sci_idx);
130	}
131
132	exit(exit_status);
133}
134
135
136void test_cmd (argc, argv)
137    int argc;
138    char **argv;
139{
140    printf("Hello, world!\n");
141    printf("Args: ");
142    while (++argv, --argc) {
143	printf("'%s'", *argv);
144	if (argc > 1)
145	    fputs(", ", stdout);
146    }
147    putchar ('\n');
148}
149