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