119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * test_ss.c
33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright 1987, 1988 by MIT Student Information Processing Board
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Permission to use, copy, modify, and distribute this software and
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * its documentation for any purpose is hereby granted, provided that
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * advertising or publicity pertaining to distribution of the software
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * without specific, written prior permission.  M.I.T. and the
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * M.I.T. S.I.P.B. make no representations about the suitability of
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * this software for any purpose.  It is provided "as is" without
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * express or implied warranty.
143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h>
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ss.h"
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern ss_request_table test_cmds;
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define TRUE 1
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define FALSE 0
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char subsystem_name[] = "test_ss";
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char version[] = "1.0";
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int source_file(const char *cmd_file, int sci_idx)
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	FILE		*f;
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		buf[256];
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		*cp;
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		exit_status = 0;
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		retval;
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int 		noecho;
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (strcmp(cmd_file, "-") == 0)
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		f = stdin;
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	else {
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		f = fopen(cmd_file, "r");
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!f) {
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			perror(cmd_file);
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(1);
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	fflush(stdout);
533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	fflush(stderr);
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	setbuf(stdout, NULL);
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	setbuf(stderr, NULL);
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (!feof(f)) {
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (fgets(buf, sizeof(buf), f) == NULL)
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (buf[0] == '#')
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		noecho = 0;
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (buf[0] == '-') {
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			noecho = 1;
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			buf[0] = ' ';
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp = strchr(buf, '\n');
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (cp)
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*cp = 0;
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp = strchr(buf, '\r');
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (cp)
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*cp = 0;
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!noecho)
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			printf("test_icount: %s\n", buf);
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		retval = ss_execute_line(sci_idx, buf);
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (retval) {
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ss_perror(sci_idx, retval, buf);
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit_status++;
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return exit_status;
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main(int argc, char **argv)
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int c, code;
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char *request = (char *)NULL;
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		*cmd_file = 0;
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int sci_idx;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int exit_status = 0;
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while ((c = getopt (argc, argv, "wR:f:")) != EOF) {
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		switch (c) {
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case 'R':
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			request = optarg;
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case 'f':
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			cmd_file = optarg;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		default:
1003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			com_err(argv[0], 0, "Usage: test_ss [-R request] "
1013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt				"[-f cmd_file]");
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(1);
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	sci_idx = ss_create_invocation(subsystem_name, version,
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       (char *)NULL, &test_cmds, &code);
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (code) {
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ss_perror(sci_idx, code, "creating invocation");
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	(void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &code);
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (code) {
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ss_perror (sci_idx, code, "adding standard requests");
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit (1);
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("test_ss %s.  Type '?' for a list of commands.\n\n",
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       version);
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (request) {
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		code = ss_execute_line(sci_idx, request);
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (code) {
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ss_perror(sci_idx, code, request);
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit_status++;
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	} else if (cmd_file) {
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit_status = source_file(cmd_file, sci_idx);
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	} else {
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ss_listen(sci_idx);
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	exit(exit_status);
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid test_cmd (argc, argv)
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    int argc;
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    char **argv;
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    printf("Hello, world!\n");
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    printf("Args: ");
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    while (++argv, --argc) {
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("'%s'", *argv);
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (argc > 1)
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    fputs(", ", stdout);
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    putchar ('\n');
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
151