getoldopt.c revision 139969
176351Skris/* $OpenBSD: getoldopt.c,v 1.4 2000/01/22 20:24:51 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 1076351Skris * in the Pubic Domain for your edification and enjoyment. 1176351Skris */ 1276351Skris 1399110Sobrien#include <sys/cdefs.h> 1499110Sobrien__FBSDID("$FreeBSD: head/bin/pax/getoldopt.c 139969 2005-01-10 08:39:26Z imp $"); 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 */ 3676351Skris if (argc < 2) return EOF; 3776351Skris key = argv[1]; 3876351Skris if (*key == '-') 3976351Skris use_getopt++; 4076351Skris else 4176351Skris optind = 2; 4276351Skris } 4376351Skris 4476351Skris if (use_getopt) 4576351Skris return getopt(argc, argv, optstring); 4676351Skris 4776351Skris c = *key++; 4876351Skris if (c == '\0') { 4976351Skris key--; 5076351Skris return EOF; 5176351Skris } 5276351Skris place = strchr(optstring, c); 5376351Skris 5476351Skris if (place == NULL || c == ':') { 5576351Skris fprintf(stderr, "%s: unknown option %c\n", argv[0], c); 5676351Skris return('?'); 5776351Skris } 5876351Skris 5976351Skris place++; 6076351Skris if (*place == ':') { 6176351Skris if (optind < argc) { 6276351Skris optarg = argv[optind]; 6376351Skris optind++; 6476351Skris } else { 6576351Skris fprintf(stderr, "%s: %c argument missing\n", 6676351Skris argv[0], c); 6776351Skris return('?'); 6876351Skris } 6976351Skris } 7076351Skris 7176351Skris return(c); 7276351Skris} 73