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