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