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