summaryrefslogtreecommitdiff
path: root/archivers
diff options
context:
space:
mode:
Diffstat (limited to 'archivers')
-rw-r--r--archivers/pax/files/getoldopt.c57
1 files changed, 46 insertions, 11 deletions
diff --git a/archivers/pax/files/getoldopt.c b/archivers/pax/files/getoldopt.c
index 9f595ff984c..21af930b81d 100644
--- a/archivers/pax/files/getoldopt.c
+++ b/archivers/pax/files/getoldopt.c
@@ -1,4 +1,4 @@
-/* $NetBSD: getoldopt.c,v 1.2 2003/06/23 13:39:01 grant Exp $ */
+/* $NetBSD: getoldopt.c,v 1.3 2003/06/30 11:45:40 grant Exp $ */
/*
* Plug-compatible replacement for getopt() for parsing tar-like
@@ -16,7 +16,7 @@
#endif
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: getoldopt.c,v 1.2 2003/06/23 13:39:01 grant Exp $");
+__RCSID("$NetBSD: getoldopt.c,v 1.3 2003/06/30 11:45:40 grant Exp $");
#endif /* not lint */
#include <getopt.h>
@@ -33,20 +33,55 @@ getoldopt(int argc, char **argv, const char *optstring,
struct option *longopts, int *idx)
{
static char *key; /* Points to next keyletter */
- static char argv1[64];
+ static char use_getopt; /* !=0 if argv[1][0] was '-' */
+ char c;
+ char *place;
+
+ optarg = NULL;
if (key == NULL) { /* First time */
if (argc < 2) return -1;
key = argv[1];
- if (*key != '-')
- (void)snprintf(argv[1] = argv1, sizeof(argv1), "-%s",
- key);
+ if (*key == '-')
+ use_getopt++;
+ else
+ optind = 2;
+ }
+
+ if (!use_getopt) {
+ c = *key++;
+ if (c == '\0') {
+ key--;
+ use_getopt = 1;
+ }
+ }
+ if (use_getopt) {
+ if (longopts != NULL) {
+ return getopt_long(argc, argv, optstring,
+ longopts, idx);
+ } else {
+ return getopt(argc, argv, optstring);
+ }
}
- if (longopts != NULL) {
- return getopt_long(argc, argv, optstring,
- longopts, idx);
- } else {
- return getopt(argc, argv, optstring);
+ place = strchr(optstring, c);
+
+ if (place == NULL || c == ':') {
+ fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
+ return('?');
+ }
+
+ place++;
+ if (*place == ':') {
+ if (optind < argc) {
+ optarg = argv[optind];
+ optind++;
+ } else {
+ fprintf(stderr, "%s: %c argument missing\n",
+ argv[0], c);
+ return('?');
+ }
}
+
+ return(c);
}