xref: /openbsd-src/bin/pax/getoldopt.c (revision 043fbe51c197dbbcd422e917b65f765d8b5f8874)
1*043fbe51Sderaadt /*	$OpenBSD: getoldopt.c,v 1.9 2009/10/27 23:59:22 deraadt Exp $	*/
2df930be7Sderaadt /*	$NetBSD: getoldopt.c,v 1.3 1995/03/21 09:07:28 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Plug-compatible replacement for getopt() for parsing tar-like
6df930be7Sderaadt  * arguments.  If the first argument begins with "-", it uses getopt;
7df930be7Sderaadt  * otherwise, it uses the old rules used by tar, dump, and ps.
8df930be7Sderaadt  *
9df930be7Sderaadt  * Written 25 August 1985 by John Gilmore (ihnp4!hoptoad!gnu) and placed
104eb0b000Smillert  * in the Public Domain for your edification and enjoyment.
11df930be7Sderaadt  */
12df930be7Sderaadt 
13a12b0823Sderaadt #include <sys/types.h>
14a12b0823Sderaadt #include <sys/stat.h>
15df930be7Sderaadt #include <stdio.h>
16df930be7Sderaadt #include <string.h>
17df930be7Sderaadt #include <unistd.h>
18a12b0823Sderaadt #include "pax.h"
19a12b0823Sderaadt #include "extern.h"
20df930be7Sderaadt 
21df930be7Sderaadt int
getoldopt(int argc,char ** argv,const char * optstring)227097cf92Smillert getoldopt(int argc, char **argv, const char *optstring)
23df930be7Sderaadt {
24df930be7Sderaadt 	static char	*key;		/* Points to next keyletter */
25df930be7Sderaadt 	static char	use_getopt;	/* !=0 if argv[1][0] was '-' */
26df930be7Sderaadt 	char		c;
27df930be7Sderaadt 	char		*place;
28df930be7Sderaadt 
29df930be7Sderaadt 	optarg = NULL;
30df930be7Sderaadt 
31df930be7Sderaadt 	if (key == NULL) {		/* First time */
32669b04e6Smillert 		if (argc < 2)
33669b04e6Smillert 			return (-1);
34df930be7Sderaadt 		key = argv[1];
35df930be7Sderaadt 		if (*key == '-')
36df930be7Sderaadt 			use_getopt++;
37df930be7Sderaadt 		else
38df930be7Sderaadt 			optind = 2;
39df930be7Sderaadt 	}
40df930be7Sderaadt 
41df930be7Sderaadt 	if (use_getopt)
42669b04e6Smillert 		return (getopt(argc, argv, optstring));
43df930be7Sderaadt 
44df930be7Sderaadt 	c = *key++;
45df930be7Sderaadt 	if (c == '\0') {
46df930be7Sderaadt 		key--;
47669b04e6Smillert 		return (-1);
48df930be7Sderaadt 	}
49df930be7Sderaadt 	place = strchr(optstring, c);
50df930be7Sderaadt 
51df930be7Sderaadt 	if (place == NULL || c == ':') {
52df930be7Sderaadt 		fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
53df930be7Sderaadt 		return ('?');
54df930be7Sderaadt 	}
55df930be7Sderaadt 
56df930be7Sderaadt 	place++;
57df930be7Sderaadt 	if (*place == ':') {
58df930be7Sderaadt 		if (optind < argc) {
59df930be7Sderaadt 			optarg = argv[optind];
60df930be7Sderaadt 			optind++;
61df930be7Sderaadt 		} else {
62df930be7Sderaadt 			fprintf(stderr, "%s: %c argument missing\n",
63df930be7Sderaadt 				argv[0], c);
64df930be7Sderaadt 			return ('?');
65df930be7Sderaadt 		}
66df930be7Sderaadt 	}
67df930be7Sderaadt 
68df930be7Sderaadt 	return (c);
69df930be7Sderaadt }
70