xref: /freebsd/usr.bin/rpcgen/rpc_main.c (revision 4e115012be61e89caf65497654493e52630b15e4)
14e115012SGarrett Wollman /* @(#)rpc_main.c	2.2 88/08/01 4.0 RPCSRC */
24e115012SGarrett Wollman /*
34e115012SGarrett Wollman  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
44e115012SGarrett Wollman  * unrestricted use provided that this legend is included on all tape
54e115012SGarrett Wollman  * media and as a part of the software program in whole or part.  Users
64e115012SGarrett Wollman  * may copy or modify Sun RPC without charge, but are not authorized
74e115012SGarrett Wollman  * to license or distribute it to anyone else except as part of a product or
84e115012SGarrett Wollman  * program developed by the user.
94e115012SGarrett Wollman  *
104e115012SGarrett Wollman  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
114e115012SGarrett Wollman  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
124e115012SGarrett Wollman  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
134e115012SGarrett Wollman  *
144e115012SGarrett Wollman  * Sun RPC is provided with no support and without any obligation on the
154e115012SGarrett Wollman  * part of Sun Microsystems, Inc. to assist in its use, correction,
164e115012SGarrett Wollman  * modification or enhancement.
174e115012SGarrett Wollman  *
184e115012SGarrett Wollman  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
194e115012SGarrett Wollman  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
204e115012SGarrett Wollman  * OR ANY PART THEREOF.
214e115012SGarrett Wollman  *
224e115012SGarrett Wollman  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
234e115012SGarrett Wollman  * or profits or other special, indirect and consequential damages, even if
244e115012SGarrett Wollman  * Sun has been advised of the possibility of such damages.
254e115012SGarrett Wollman  *
264e115012SGarrett Wollman  * Sun Microsystems, Inc.
274e115012SGarrett Wollman  * 2550 Garcia Avenue
284e115012SGarrett Wollman  * Mountain View, California  94043
294e115012SGarrett Wollman  */
304e115012SGarrett Wollman #ifndef lint
314e115012SGarrett Wollman /*static char sccsid[] = "from: @(#)rpc_main.c 1.7 87/06/24 (C) 1987 SMI";*/
324e115012SGarrett Wollman static char rcsid[] = "$Id: rpc_main.c,v 1.1 1993/09/13 23:20:15 jtc Exp $";
334e115012SGarrett Wollman #endif
344e115012SGarrett Wollman 
354e115012SGarrett Wollman /*
364e115012SGarrett Wollman  * rpc_main.c, Top level of the RPC protocol compiler.
374e115012SGarrett Wollman  * Copyright (C) 1987, Sun Microsystems, Inc.
384e115012SGarrett Wollman  */
394e115012SGarrett Wollman 
404e115012SGarrett Wollman #include <stdio.h>
414e115012SGarrett Wollman #include <strings.h>
424e115012SGarrett Wollman #include <sys/file.h>
434e115012SGarrett Wollman #include "rpc_util.h"
444e115012SGarrett Wollman #include "rpc_parse.h"
454e115012SGarrett Wollman #include "rpc_scan.h"
464e115012SGarrett Wollman 
474e115012SGarrett Wollman #define EXTEND	1		/* alias for TRUE */
484e115012SGarrett Wollman 
494e115012SGarrett Wollman struct commandline {
504e115012SGarrett Wollman 	int cflag;
514e115012SGarrett Wollman 	int hflag;
524e115012SGarrett Wollman 	int lflag;
534e115012SGarrett Wollman 	int sflag;
544e115012SGarrett Wollman 	int mflag;
554e115012SGarrett Wollman 	char *infile;
564e115012SGarrett Wollman 	char *outfile;
574e115012SGarrett Wollman };
584e115012SGarrett Wollman 
594e115012SGarrett Wollman static char *cmdname;
604e115012SGarrett Wollman static char CPP[] = "/usr/bin/cpp";
614e115012SGarrett Wollman static char CPPFLAGS[] = "-C";
624e115012SGarrett Wollman static char *allv[] = {
634e115012SGarrett Wollman 	"rpcgen", "-s", "udp", "-s", "tcp",
644e115012SGarrett Wollman };
654e115012SGarrett Wollman static int allc = sizeof(allv)/sizeof(allv[0]);
664e115012SGarrett Wollman 
674e115012SGarrett Wollman 
684e115012SGarrett Wollman static int h_output(), c_output(), s_output(), l_output(), do_registers(),
694e115012SGarrett Wollman 	   parseargs();
704e115012SGarrett Wollman 
714e115012SGarrett Wollman main(argc, argv)
724e115012SGarrett Wollman 	int argc;
734e115012SGarrett Wollman 	char *argv[];
744e115012SGarrett Wollman 
754e115012SGarrett Wollman {
764e115012SGarrett Wollman 	struct commandline cmd;
774e115012SGarrett Wollman 
784e115012SGarrett Wollman 	if (!parseargs(argc, argv, &cmd)) {
794e115012SGarrett Wollman 		f_print(stderr,
804e115012SGarrett Wollman 			"usage: %s infile\n", cmdname);
814e115012SGarrett Wollman 		f_print(stderr,
824e115012SGarrett Wollman 			"       %s [-c | -h | -l | -m] [-o outfile] [infile]\n",
834e115012SGarrett Wollman 			cmdname);
844e115012SGarrett Wollman 		f_print(stderr,
854e115012SGarrett Wollman 			"       %s [-s udp|tcp]* [-o outfile] [infile]\n",
864e115012SGarrett Wollman 			cmdname);
874e115012SGarrett Wollman 		exit(1);
884e115012SGarrett Wollman 	}
894e115012SGarrett Wollman 	if (cmd.cflag) {
904e115012SGarrett Wollman 		c_output(cmd.infile, "-DRPC_XDR", !EXTEND, cmd.outfile);
914e115012SGarrett Wollman 	} else if (cmd.hflag) {
924e115012SGarrett Wollman 		h_output(cmd.infile, "-DRPC_HDR", !EXTEND, cmd.outfile);
934e115012SGarrett Wollman 	} else if (cmd.lflag) {
944e115012SGarrett Wollman 		l_output(cmd.infile, "-DRPC_CLNT", !EXTEND, cmd.outfile);
954e115012SGarrett Wollman 	} else if (cmd.sflag || cmd.mflag) {
964e115012SGarrett Wollman 		s_output(argc, argv, cmd.infile, "-DRPC_SVC", !EXTEND,
974e115012SGarrett Wollman 			 cmd.outfile, cmd.mflag);
984e115012SGarrett Wollman 	} else {
994e115012SGarrett Wollman 		c_output(cmd.infile, "-DRPC_XDR", EXTEND, "_xdr.c");
1004e115012SGarrett Wollman 		reinitialize();
1014e115012SGarrett Wollman 		h_output(cmd.infile, "-DRPC_HDR", EXTEND, ".h");
1024e115012SGarrett Wollman 		reinitialize();
1034e115012SGarrett Wollman 		l_output(cmd.infile, "-DRPC_CLNT", EXTEND, "_clnt.c");
1044e115012SGarrett Wollman 		reinitialize();
1054e115012SGarrett Wollman 		s_output(allc, allv, cmd.infile, "-DRPC_SVC", EXTEND,
1064e115012SGarrett Wollman 			 "_svc.c", cmd.mflag);
1074e115012SGarrett Wollman 	}
1084e115012SGarrett Wollman 	exit(0);
1094e115012SGarrett Wollman }
1104e115012SGarrett Wollman 
1114e115012SGarrett Wollman /*
1124e115012SGarrett Wollman  * add extension to filename
1134e115012SGarrett Wollman  */
1144e115012SGarrett Wollman static char *
1154e115012SGarrett Wollman extendfile(file, ext)
1164e115012SGarrett Wollman 	char *file;
1174e115012SGarrett Wollman 	char *ext;
1184e115012SGarrett Wollman {
1194e115012SGarrett Wollman 	char *res;
1204e115012SGarrett Wollman 	char *p;
1214e115012SGarrett Wollman 
1224e115012SGarrett Wollman 	res = alloc(strlen(file) + strlen(ext) + 1);
1234e115012SGarrett Wollman 	if (res == NULL) {
1244e115012SGarrett Wollman 		abort();
1254e115012SGarrett Wollman 	}
1264e115012SGarrett Wollman 	p = rindex(file, '.');
1274e115012SGarrett Wollman 	if (p == NULL) {
1284e115012SGarrett Wollman 		p = file + strlen(file);
1294e115012SGarrett Wollman 	}
1304e115012SGarrett Wollman 	(void) strcpy(res, file);
1314e115012SGarrett Wollman 	(void) strcpy(res + (p - file), ext);
1324e115012SGarrett Wollman 	return (res);
1334e115012SGarrett Wollman }
1344e115012SGarrett Wollman 
1354e115012SGarrett Wollman /*
1364e115012SGarrett Wollman  * Open output file with given extension
1374e115012SGarrett Wollman  */
1384e115012SGarrett Wollman static
1394e115012SGarrett Wollman open_output(infile, outfile)
1404e115012SGarrett Wollman 	char *infile;
1414e115012SGarrett Wollman 	char *outfile;
1424e115012SGarrett Wollman {
1434e115012SGarrett Wollman 	if (outfile == NULL) {
1444e115012SGarrett Wollman 		fout = stdout;
1454e115012SGarrett Wollman 		return;
1464e115012SGarrett Wollman 	}
1474e115012SGarrett Wollman 	if (infile != NULL && streq(outfile, infile)) {
1484e115012SGarrett Wollman 		f_print(stderr, "%s: output would overwrite %s\n", cmdname,
1494e115012SGarrett Wollman 			infile);
1504e115012SGarrett Wollman 		crash();
1514e115012SGarrett Wollman 	}
1524e115012SGarrett Wollman 	fout = fopen(outfile, "w");
1534e115012SGarrett Wollman 	if (fout == NULL) {
1544e115012SGarrett Wollman 		f_print(stderr, "%s: unable to open ", cmdname);
1554e115012SGarrett Wollman 		perror(outfile);
1564e115012SGarrett Wollman 		crash();
1574e115012SGarrett Wollman 	}
1584e115012SGarrett Wollman 	record_open(outfile);
1594e115012SGarrett Wollman }
1604e115012SGarrett Wollman 
1614e115012SGarrett Wollman /*
1624e115012SGarrett Wollman  * Open input file with given define for C-preprocessor
1634e115012SGarrett Wollman  */
1644e115012SGarrett Wollman static
1654e115012SGarrett Wollman open_input(infile, define)
1664e115012SGarrett Wollman 	char *infile;
1674e115012SGarrett Wollman 	char *define;
1684e115012SGarrett Wollman {
1694e115012SGarrett Wollman 	int pd[2];
1704e115012SGarrett Wollman 
1714e115012SGarrett Wollman 	infilename = (infile == NULL) ? "<stdin>" : infile;
1724e115012SGarrett Wollman 	(void) pipe(pd);
1734e115012SGarrett Wollman 	switch (fork()) {
1744e115012SGarrett Wollman 	case 0:
1754e115012SGarrett Wollman 		(void) close(1);
1764e115012SGarrett Wollman 		(void) dup2(pd[1], 1);
1774e115012SGarrett Wollman 		(void) close(pd[0]);
1784e115012SGarrett Wollman 		execl(CPP, CPP, CPPFLAGS, define, infile, NULL);
1794e115012SGarrett Wollman 		perror("execl");
1804e115012SGarrett Wollman 		exit(1);
1814e115012SGarrett Wollman 	case -1:
1824e115012SGarrett Wollman 		perror("fork");
1834e115012SGarrett Wollman 		exit(1);
1844e115012SGarrett Wollman 	}
1854e115012SGarrett Wollman 	(void) close(pd[1]);
1864e115012SGarrett Wollman 	fin = fdopen(pd[0], "r");
1874e115012SGarrett Wollman 	if (fin == NULL) {
1884e115012SGarrett Wollman 		f_print(stderr, "%s: ", cmdname);
1894e115012SGarrett Wollman 		perror(infilename);
1904e115012SGarrett Wollman 		crash();
1914e115012SGarrett Wollman 	}
1924e115012SGarrett Wollman }
1934e115012SGarrett Wollman 
1944e115012SGarrett Wollman /*
1954e115012SGarrett Wollman  * Compile into an XDR routine output file
1964e115012SGarrett Wollman  */
1974e115012SGarrett Wollman static
1984e115012SGarrett Wollman c_output(infile, define, extend, outfile)
1994e115012SGarrett Wollman 	char *infile;
2004e115012SGarrett Wollman 	char *define;
2014e115012SGarrett Wollman 	int extend;
2024e115012SGarrett Wollman 	char *outfile;
2034e115012SGarrett Wollman {
2044e115012SGarrett Wollman 	definition *def;
2054e115012SGarrett Wollman 	char *include;
2064e115012SGarrett Wollman 	char *outfilename;
2074e115012SGarrett Wollman 	long tell;
2084e115012SGarrett Wollman 
2094e115012SGarrett Wollman 	open_input(infile, define);
2104e115012SGarrett Wollman 	outfilename = extend ? extendfile(infile, outfile) : outfile;
2114e115012SGarrett Wollman 	open_output(infile, outfilename);
2124e115012SGarrett Wollman 	f_print(fout, "#include <rpc/rpc.h>\n");
2134e115012SGarrett Wollman 	if (infile && (include = extendfile(infile, ".h"))) {
2144e115012SGarrett Wollman 		f_print(fout, "#include \"%s\"\n", include);
2154e115012SGarrett Wollman 		free(include);
2164e115012SGarrett Wollman 	}
2174e115012SGarrett Wollman 	tell = ftell(fout);
2184e115012SGarrett Wollman 	while (def = get_definition()) {
2194e115012SGarrett Wollman 		emit(def);
2204e115012SGarrett Wollman 	}
2214e115012SGarrett Wollman 	if (extend && tell == ftell(fout)) {
2224e115012SGarrett Wollman 		(void) unlink(outfilename);
2234e115012SGarrett Wollman 	}
2244e115012SGarrett Wollman }
2254e115012SGarrett Wollman 
2264e115012SGarrett Wollman /*
2274e115012SGarrett Wollman  * Compile into an XDR header file
2284e115012SGarrett Wollman  */
2294e115012SGarrett Wollman static
2304e115012SGarrett Wollman h_output(infile, define, extend, outfile)
2314e115012SGarrett Wollman 	char *infile;
2324e115012SGarrett Wollman 	char *define;
2334e115012SGarrett Wollman 	int extend;
2344e115012SGarrett Wollman 	char *outfile;
2354e115012SGarrett Wollman {
2364e115012SGarrett Wollman 	definition *def;
2374e115012SGarrett Wollman 	char *outfilename;
2384e115012SGarrett Wollman 	long tell;
2394e115012SGarrett Wollman 
2404e115012SGarrett Wollman 	open_input(infile, define);
2414e115012SGarrett Wollman 	outfilename =  extend ? extendfile(infile, outfile) : outfile;
2424e115012SGarrett Wollman 	open_output(infile, outfilename);
2434e115012SGarrett Wollman 	tell = ftell(fout);
2444e115012SGarrett Wollman 	while (def = get_definition()) {
2454e115012SGarrett Wollman 		print_datadef(def);
2464e115012SGarrett Wollman 	}
2474e115012SGarrett Wollman 	if (extend && tell == ftell(fout)) {
2484e115012SGarrett Wollman 		(void) unlink(outfilename);
2494e115012SGarrett Wollman 	}
2504e115012SGarrett Wollman }
2514e115012SGarrett Wollman 
2524e115012SGarrett Wollman /*
2534e115012SGarrett Wollman  * Compile into an RPC service
2544e115012SGarrett Wollman  */
2554e115012SGarrett Wollman static
2564e115012SGarrett Wollman s_output(argc, argv, infile, define, extend, outfile, nomain)
2574e115012SGarrett Wollman 	int argc;
2584e115012SGarrett Wollman 	char *argv[];
2594e115012SGarrett Wollman 	char *infile;
2604e115012SGarrett Wollman 	char *define;
2614e115012SGarrett Wollman 	int extend;
2624e115012SGarrett Wollman 	char *outfile;
2634e115012SGarrett Wollman 	int nomain;
2644e115012SGarrett Wollman {
2654e115012SGarrett Wollman 	char *include;
2664e115012SGarrett Wollman 	definition *def;
2674e115012SGarrett Wollman 	int foundprogram;
2684e115012SGarrett Wollman 	char *outfilename;
2694e115012SGarrett Wollman 
2704e115012SGarrett Wollman 	open_input(infile, define);
2714e115012SGarrett Wollman 	outfilename = extend ? extendfile(infile, outfile) : outfile;
2724e115012SGarrett Wollman 	open_output(infile, outfilename);
2734e115012SGarrett Wollman 	f_print(fout, "#include <stdio.h>\n");
2744e115012SGarrett Wollman 	f_print(fout, "#include <rpc/rpc.h>\n");
2754e115012SGarrett Wollman 	if (infile && (include = extendfile(infile, ".h"))) {
2764e115012SGarrett Wollman 		f_print(fout, "#include \"%s\"\n", include);
2774e115012SGarrett Wollman 		free(include);
2784e115012SGarrett Wollman 	}
2794e115012SGarrett Wollman 	foundprogram = 0;
2804e115012SGarrett Wollman 	while (def = get_definition()) {
2814e115012SGarrett Wollman 		foundprogram |= (def->def_kind == DEF_PROGRAM);
2824e115012SGarrett Wollman 	}
2834e115012SGarrett Wollman 	if (extend && !foundprogram) {
2844e115012SGarrett Wollman 		(void) unlink(outfilename);
2854e115012SGarrett Wollman 		return;
2864e115012SGarrett Wollman 	}
2874e115012SGarrett Wollman 	if (nomain) {
2884e115012SGarrett Wollman 		write_programs((char *)NULL);
2894e115012SGarrett Wollman 	} else {
2904e115012SGarrett Wollman 		write_most();
2914e115012SGarrett Wollman 		do_registers(argc, argv);
2924e115012SGarrett Wollman 		write_rest();
2934e115012SGarrett Wollman 		write_programs("static");
2944e115012SGarrett Wollman 	}
2954e115012SGarrett Wollman }
2964e115012SGarrett Wollman 
2974e115012SGarrett Wollman static
2984e115012SGarrett Wollman l_output(infile, define, extend, outfile)
2994e115012SGarrett Wollman 	char *infile;
3004e115012SGarrett Wollman 	char *define;
3014e115012SGarrett Wollman 	int extend;
3024e115012SGarrett Wollman 	char *outfile;
3034e115012SGarrett Wollman {
3044e115012SGarrett Wollman 	char *include;
3054e115012SGarrett Wollman 	definition *def;
3064e115012SGarrett Wollman 	int foundprogram;
3074e115012SGarrett Wollman 	char *outfilename;
3084e115012SGarrett Wollman 
3094e115012SGarrett Wollman 	open_input(infile, define);
3104e115012SGarrett Wollman 	outfilename = extend ? extendfile(infile, outfile) : outfile;
3114e115012SGarrett Wollman 	open_output(infile, outfilename);
3124e115012SGarrett Wollman 	f_print(fout, "#include <rpc/rpc.h>\n");
3134e115012SGarrett Wollman 	if (infile && (include = extendfile(infile, ".h"))) {
3144e115012SGarrett Wollman 		f_print(fout, "#include \"%s\"\n", include);
3154e115012SGarrett Wollman 		free(include);
3164e115012SGarrett Wollman 	}
3174e115012SGarrett Wollman 	foundprogram = 0;
3184e115012SGarrett Wollman 	while (def = get_definition()) {
3194e115012SGarrett Wollman 		foundprogram |= (def->def_kind == DEF_PROGRAM);
3204e115012SGarrett Wollman 	}
3214e115012SGarrett Wollman 	if (extend && !foundprogram) {
3224e115012SGarrett Wollman 		(void) unlink(outfilename);
3234e115012SGarrett Wollman 		return;
3244e115012SGarrett Wollman 	}
3254e115012SGarrett Wollman 	write_stubs();
3264e115012SGarrett Wollman }
3274e115012SGarrett Wollman 
3284e115012SGarrett Wollman /*
3294e115012SGarrett Wollman  * Perform registrations for service output
3304e115012SGarrett Wollman  */
3314e115012SGarrett Wollman static
3324e115012SGarrett Wollman do_registers(argc, argv)
3334e115012SGarrett Wollman 	int argc;
3344e115012SGarrett Wollman 	char *argv[];
3354e115012SGarrett Wollman 
3364e115012SGarrett Wollman {
3374e115012SGarrett Wollman 	int i;
3384e115012SGarrett Wollman 
3394e115012SGarrett Wollman 	for (i = 1; i < argc; i++) {
3404e115012SGarrett Wollman 		if (streq(argv[i], "-s")) {
3414e115012SGarrett Wollman 			write_register(argv[i + 1]);
3424e115012SGarrett Wollman 			i++;
3434e115012SGarrett Wollman 		}
3444e115012SGarrett Wollman 	}
3454e115012SGarrett Wollman }
3464e115012SGarrett Wollman 
3474e115012SGarrett Wollman /*
3484e115012SGarrett Wollman  * Parse command line arguments
3494e115012SGarrett Wollman  */
3504e115012SGarrett Wollman static
3514e115012SGarrett Wollman parseargs(argc, argv, cmd)
3524e115012SGarrett Wollman 	int argc;
3534e115012SGarrett Wollman 	char *argv[];
3544e115012SGarrett Wollman 	struct commandline *cmd;
3554e115012SGarrett Wollman 
3564e115012SGarrett Wollman {
3574e115012SGarrett Wollman 	int i;
3584e115012SGarrett Wollman 	int j;
3594e115012SGarrett Wollman 	char c;
3604e115012SGarrett Wollman 	char flag[(1 << 8 * sizeof(char))];
3614e115012SGarrett Wollman 	int nflags;
3624e115012SGarrett Wollman 
3634e115012SGarrett Wollman 	cmdname = argv[0];
3644e115012SGarrett Wollman 	cmd->infile = cmd->outfile = NULL;
3654e115012SGarrett Wollman 	if (argc < 2) {
3664e115012SGarrett Wollman 		return (0);
3674e115012SGarrett Wollman 	}
3684e115012SGarrett Wollman 	flag['c'] = 0;
3694e115012SGarrett Wollman 	flag['h'] = 0;
3704e115012SGarrett Wollman 	flag['s'] = 0;
3714e115012SGarrett Wollman 	flag['o'] = 0;
3724e115012SGarrett Wollman 	flag['l'] = 0;
3734e115012SGarrett Wollman 	flag['m'] = 0;
3744e115012SGarrett Wollman 	for (i = 1; i < argc; i++) {
3754e115012SGarrett Wollman 		if (argv[i][0] != '-') {
3764e115012SGarrett Wollman 			if (cmd->infile) {
3774e115012SGarrett Wollman 				return (0);
3784e115012SGarrett Wollman 			}
3794e115012SGarrett Wollman 			cmd->infile = argv[i];
3804e115012SGarrett Wollman 		} else {
3814e115012SGarrett Wollman 			for (j = 1; argv[i][j] != 0; j++) {
3824e115012SGarrett Wollman 				c = argv[i][j];
3834e115012SGarrett Wollman 				switch (c) {
3844e115012SGarrett Wollman 				case 'c':
3854e115012SGarrett Wollman 				case 'h':
3864e115012SGarrett Wollman 				case 'l':
3874e115012SGarrett Wollman 				case 'm':
3884e115012SGarrett Wollman 					if (flag[c]) {
3894e115012SGarrett Wollman 						return (0);
3904e115012SGarrett Wollman 					}
3914e115012SGarrett Wollman 					flag[c] = 1;
3924e115012SGarrett Wollman 					break;
3934e115012SGarrett Wollman 				case 'o':
3944e115012SGarrett Wollman 				case 's':
3954e115012SGarrett Wollman 					if (argv[i][j - 1] != '-' ||
3964e115012SGarrett Wollman 					    argv[i][j + 1] != 0) {
3974e115012SGarrett Wollman 						return (0);
3984e115012SGarrett Wollman 					}
3994e115012SGarrett Wollman 					flag[c] = 1;
4004e115012SGarrett Wollman 					if (++i == argc) {
4014e115012SGarrett Wollman 						return (0);
4024e115012SGarrett Wollman 					}
4034e115012SGarrett Wollman 					if (c == 's') {
4044e115012SGarrett Wollman 						if (!streq(argv[i], "udp") &&
4054e115012SGarrett Wollman 						    !streq(argv[i], "tcp")) {
4064e115012SGarrett Wollman 							return (0);
4074e115012SGarrett Wollman 						}
4084e115012SGarrett Wollman 					} else if (c == 'o') {
4094e115012SGarrett Wollman 						if (cmd->outfile) {
4104e115012SGarrett Wollman 							return (0);
4114e115012SGarrett Wollman 						}
4124e115012SGarrett Wollman 						cmd->outfile = argv[i];
4134e115012SGarrett Wollman 					}
4144e115012SGarrett Wollman 					goto nextarg;
4154e115012SGarrett Wollman 
4164e115012SGarrett Wollman 				default:
4174e115012SGarrett Wollman 					return (0);
4184e115012SGarrett Wollman 				}
4194e115012SGarrett Wollman 			}
4204e115012SGarrett Wollman 	nextarg:
4214e115012SGarrett Wollman 			;
4224e115012SGarrett Wollman 		}
4234e115012SGarrett Wollman 	}
4244e115012SGarrett Wollman 	cmd->cflag = flag['c'];
4254e115012SGarrett Wollman 	cmd->hflag = flag['h'];
4264e115012SGarrett Wollman 	cmd->sflag = flag['s'];
4274e115012SGarrett Wollman 	cmd->lflag = flag['l'];
4284e115012SGarrett Wollman 	cmd->mflag = flag['m'];
4294e115012SGarrett Wollman 	nflags = cmd->cflag + cmd->hflag + cmd->sflag + cmd->lflag + cmd->mflag;
4304e115012SGarrett Wollman 	if (nflags == 0) {
4314e115012SGarrett Wollman 		if (cmd->outfile != NULL || cmd->infile == NULL) {
4324e115012SGarrett Wollman 			return (0);
4334e115012SGarrett Wollman 		}
4344e115012SGarrett Wollman 	} else if (nflags > 1) {
4354e115012SGarrett Wollman 		return (0);
4364e115012SGarrett Wollman 	}
4374e115012SGarrett Wollman 	return (1);
4384e115012SGarrett Wollman }
439