xref: /aosp_15_r20/external/e2fsprogs/lib/ss/test_ss.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
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