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