1205942Sdelphij/*	$OpenBSD: getoldopt.c,v 1.9 2009/10/27 23:59:22 deraadt Exp $	*/
276351Skris/*	$NetBSD: getoldopt.c,v 1.3 1995/03/21 09:07:28 cgd Exp $	*/
376351Skris
4139969Simp/*-
576351Skris * Plug-compatible replacement for getopt() for parsing tar-like
676351Skris * arguments.  If the first argument begins with "-", it uses getopt;
776351Skris * otherwise, it uses the old rules used by tar, dump, and ps.
876351Skris *
976351Skris * Written 25 August 1985 by John Gilmore (ihnp4!hoptoad!gnu) and placed
10205942Sdelphij * in the Public Domain for your edification and enjoyment.
1176351Skris */
1276351Skris
1399110Sobrien#include <sys/cdefs.h>
1499110Sobrien__FBSDID("$FreeBSD$");
1576351Skris
16114583Smarkm#include <sys/types.h>
17114583Smarkm#include <sys/stat.h>
1876351Skris#include <stdio.h>
1976351Skris#include <string.h>
2076351Skris#include <unistd.h>
2176351Skris
22114583Smarkm#include "pax.h"
23114583Smarkm#include "extern.h"
24114583Smarkm
2576351Skrisint
26114583Smarkmgetoldopt(int argc, char **argv, const char *optstring)
2776351Skris{
2876351Skris	static char	*key;		/* Points to next keyletter */
2976351Skris	static char	use_getopt;	/* !=0 if argv[1][0] was '-' */
3076351Skris	char		c;
3176351Skris	char		*place;
3276351Skris
3376351Skris	optarg = NULL;
3476351Skris
3576351Skris	if (key == NULL) {		/* First time */
36205942Sdelphij		if (argc < 2)
37205942Sdelphij			return (-1);
3876351Skris		key = argv[1];
3976351Skris		if (*key == '-')
4076351Skris			use_getopt++;
4176351Skris		else
4276351Skris			optind = 2;
4376351Skris	}
4476351Skris
4576351Skris	if (use_getopt)
46205942Sdelphij		return (getopt(argc, argv, optstring));
4776351Skris
4876351Skris	c = *key++;
4976351Skris	if (c == '\0') {
5076351Skris		key--;
51205942Sdelphij		return (-1);
5276351Skris	}
5376351Skris	place = strchr(optstring, c);
5476351Skris
5576351Skris	if (place == NULL || c == ':') {
5676351Skris		fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
57205942Sdelphij		return ('?');
5876351Skris	}
5976351Skris
6076351Skris	place++;
6176351Skris	if (*place == ':') {
6276351Skris		if (optind < argc) {
6376351Skris			optarg = argv[optind];
6476351Skris			optind++;
6576351Skris		} else {
6676351Skris			fprintf(stderr, "%s: %c argument missing\n",
6776351Skris				argv[0], c);
68205942Sdelphij			return ('?');
6976351Skris		}
7076351Skris	}
7176351Skris
72205942Sdelphij	return (c);
7376351Skris}
74