13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * test_ss.c
3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * Copyright 1987, 1988 by MIT Student Information Processing Board
53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * Permission to use, copy, modify, and distribute this software and
733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * its documentation for any purpose is hereby granted, provided that
833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in
933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * advertising or publicity pertaining to distribution of the software
1033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * without specific, written prior permission.  M.I.T. and the
1133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * M.I.T. S.I.P.B. make no representations about the suitability of
1233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * this software for any purpose.  It is provided "as is" without
1333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o * express or implied warranty.
14efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o#include <unistd.h>
1833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o#include <stdlib.h>
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h>
2033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o#ifdef HAVE_GETOPT_H
2133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o#include <getopt.h>
2233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o#endif
2333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o#include <string.h>
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ss.h"
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern ss_request_table test_cmds;
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define TRUE 1
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FALSE 0
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
3133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'ostatic char subsystem_name[] = "test_ss";
3233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'ostatic char version[] = "1.0";
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
3433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'ostatic int source_file(const char *cmd_file, int sci_idx)
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
3633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	FILE		*f;
3733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	char		buf[256];
3833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	char		*cp;
3933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	int		exit_status = 0;
4033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	int		retval;
4133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	int 		noecho;
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
4333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	if (strcmp(cmd_file, "-") == 0)
4433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		f = stdin;
4533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	else {
4633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		f = fopen(cmd_file, "r");
4733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (!f) {
4833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			perror(cmd_file);
4933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			exit(1);
5033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		}
513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
522a7bfe835317bb9f3ebcd20079b2bb800f4b9eaaTheodore Ts'o	fflush(stdout);
532a7bfe835317bb9f3ebcd20079b2bb800f4b9eaaTheodore Ts'o	fflush(stderr);
5433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	setbuf(stdout, NULL);
5533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	setbuf(stderr, NULL);
5633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	while (!feof(f)) {
5733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (fgets(buf, sizeof(buf), f) == NULL)
5833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			break;
5933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (buf[0] == '#')
6033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			continue;
6133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		noecho = 0;
6233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (buf[0] == '-') {
6333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			noecho = 1;
6433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			buf[0] = ' ';
6533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		}
6633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		cp = strchr(buf, '\n');
6733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (cp)
6833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			*cp = 0;
6933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		cp = strchr(buf, '\r');
7033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (cp)
7133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			*cp = 0;
7233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (!noecho)
7333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			printf("test_icount: %s\n", buf);
7433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		retval = ss_execute_line(sci_idx, buf);
7533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (retval) {
7633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			ss_perror(sci_idx, retval, buf);
7733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			exit_status++;
7833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		}
793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
8033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	return exit_status;
8133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o}
8233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o
8333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'oint main(int argc, char **argv)
8433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o{
8533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	int c, code;
8633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	char *request = (char *)NULL;
8733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	char		*cmd_file = 0;
8833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	int sci_idx;
8933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	int exit_status = 0;
9033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o
9133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	while ((c = getopt (argc, argv, "wR:f:")) != EOF) {
9233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		switch (c) {
9333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		case 'R':
9433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			request = optarg;
9533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			break;
9633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		case 'f':
9733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			cmd_file = optarg;
9833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			break;
9933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		default:
1005299580c1ced39e7a6d7ac2717a3d6a3cab299b0Theodore Ts'o			com_err(argv[0], 0, "Usage: test_ss [-R request] "
1015299580c1ced39e7a6d7ac2717a3d6a3cab299b0Theodore Ts'o				"[-f cmd_file]");
10233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			exit(1);
10333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		}
1043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
1053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	sci_idx = ss_create_invocation(subsystem_name, version,
10733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o				       (char *)NULL, &test_cmds, &code);
10833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	if (code) {
10933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		ss_perror(sci_idx, code, "creating invocation");
11033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		exit(1);
11133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	}
1123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
11333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	(void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &code);
11433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	if (code) {
11533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		ss_perror (sci_idx, code, "adding standard requests");
11633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		exit (1);
11733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	}
1183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
11933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	printf("test_ss %s.  Type '?' for a list of commands.\n\n",
1203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	       version);
1213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
12233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	if (request) {
12333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		code = ss_execute_line(sci_idx, request);
12433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		if (code) {
12533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			ss_perror(sci_idx, code, request);
12633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o			exit_status++;
12733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		}
12833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	} else if (cmd_file) {
12933b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		exit_status = source_file(cmd_file, sci_idx);
13033b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	} else {
13133b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o		ss_listen(sci_idx);
13233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	}
13333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o
13433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	exit(exit_status);
1353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid test_cmd (argc, argv)
1393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o    int argc;
1403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o    char **argv;
1413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
14233b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o    printf("Hello, world!\n");
14333b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o    printf("Args: ");
14433b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o    while (++argv, --argc) {
14533b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	printf("'%s'", *argv);
14633b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	if (argc > 1)
14733b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o	    fputs(", ", stdout);
14833b92836cd20510974ba5839177887bbb0b1e3d4Theodore Ts'o    }
1493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o    putchar ('\n');
1503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
151