about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--config.h.in6
-rw-r--r--csu/init-first.c8
-rw-r--r--include/getopt.h11
-rw-r--r--manual/getopt.texi3
-rw-r--r--posix/Makefile2
-rw-r--r--posix/getopt.c97
-rw-r--r--posix/getopt_init.c74
-rw-r--r--posix/getopt_int.h5
-rw-r--r--sysdeps/mach/hurd/i386/init-first.c8
10 files changed, 18 insertions, 211 deletions
diff --git a/ChangeLog b/ChangeLog
index 9ae4706a89..aaa08dff2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2017-04-07  Zack Weinberg  <zackw@panix.com>
+
+	* config.h.in (USE_NONOPTION_FLAGS): Remove.
+	* csu/init-first.c: Remove all #ifdef USE_NONOPTION_FLAGS blocks.
+	* sysdeps/mach/hurd/i386/init-first.c: Likewise.
+	* posix/getopt_int.h: Likewise.
+	* posix/getopt.c: Likewise. Also remove SWAP_FLAGS and the
+	__libc_argc and __libc_argv externs, which were only used by
+	#ifdef USE_NONOPTION_FLAGS blocks.
+	* posix/getopt_init.c: Remove file.
+	* posix/Makefile (routines): Remove getopt_init.
+	* include/getopt.h: Don't declare __getopt_initialize_environment.
+	* manual/getopt.texi: Remove mention of USE_NONOPTION_FLAGS in
+	a comment.
+
 2017-04-07  Florian Weimer  <fweimer@redhat.com>
 
 	* resolv/res_mkquery.c (res_nmkquery): Remove IQUERY support.
diff --git a/config.h.in b/config.h.in
index 4ce845de51..2caa412575 100644
--- a/config.h.in
+++ b/config.h.in
@@ -123,12 +123,6 @@
 /* Override abi-tags ABI version if necessary.  */
 #undef  __ABI_TAG_VERSION
 
-/* bash 2.0 introduced the _XXX_GNU_nonoption_argv_flags_ variable to help
-   getopt determine whether a parameter is a flag or not.  This features
-   was disabled later since it caused trouble.  We are by default therefore
-   disabling the support as well.  */
-#undef USE_NONOPTION_FLAGS
-
 /* Mach/Hurd specific: define if mig supports the `retcode' keyword.  */
 #undef	HAVE_MIG_RETCODE
 
diff --git a/csu/init-first.c b/csu/init-first.c
index 099e7bc330..510ea2db1e 100644
--- a/csu/init-first.c
+++ b/csu/init-first.c
@@ -51,9 +51,6 @@ attribute_hidden
 _init (int argc, char **argv, char **envp)
 {
 #endif
-#ifdef USE_NONOPTION_FLAGS
-  extern void __getopt_clean_environment (char **);
-#endif
 
   __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
 
@@ -83,11 +80,6 @@ _init (int argc, char **argv, char **envp)
 
   __init_misc (argc, argv, envp);
 
-#ifdef USE_NONOPTION_FLAGS
-  /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment (envp);
-#endif
-
   /* Initialize ctype data.  */
   __ctype_init ();
 
diff --git a/include/getopt.h b/include/getopt.h
index c094972c97..74ca6d453a 100644
--- a/include/getopt.h
+++ b/include/getopt.h
@@ -1,12 +1 @@
-#ifndef _GETOPT_H
-
-#include <features.h>		/* Get __GNU_LIBRARY__ defined now.  */
 #include <posix/getopt.h>
-
-# if defined _GETOPT_H && !defined _ISOMAC
-
-/* Now define the internal interfaces.  */
-extern void __getopt_clean_environment (char **__env);
-
-# endif /* _GETOPT_H && !_ISOMAC */
-#endif
diff --git a/manual/getopt.texi b/manual/getopt.texi
index 20e11ef2e2..a71c3731aa 100644
--- a/manual/getopt.texi
+++ b/manual/getopt.texi
@@ -70,15 +70,12 @@ option argument, for those options that accept arguments.
 @c leave (in case of cancellation) stderr in an inconsistent state.
 @c Various implicit, indirect uses of malloc, in uses of memstream and
 @c asprintf for error-printing, bring about the usual malloc issues.
-@c (The explicit use of malloc in a conditional situation in
-@c _getopt_initialize is never exercised in glibc.)
 @c
 @c _getopt_internal
 @c  _getopt_internal_r
 @c   gettext
 @c   _getopt_initialize
 @c    getenv
-@c    malloc if USE_NONOPTION_FLAGS, never defined in libc
 @c   open_memstream
 @c   lockfile, unlockfile, __fxprintf -> stderr
 @c   asprintf
diff --git a/posix/Makefile b/posix/Makefile
index ae17646323..efcbeff96a 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -45,7 +45,7 @@ routines :=								      \
 	pathconf sysconf fpathconf					      \
 	glob glob64 fnmatch regex					      \
 	confstr								      \
-	getopt getopt1 getopt_init					      \
+	getopt getopt1 							      \
 	sched_setp sched_getp sched_sets sched_gets sched_yield sched_primax  \
 	sched_primin sched_rr_gi sched_getaffinity sched_setaffinity	      \
 	getaddrinfo gai_strerror wordexp				      \
diff --git a/posix/getopt.c b/posix/getopt.c
index 3d8c31cada..6a28ed6e50 100644
--- a/posix/getopt.c
+++ b/posix/getopt.c
@@ -147,36 +147,6 @@ extern char *getenv ();
 
 #endif /* not __GNU_LIBRARY__ */
 
-#ifdef _LIBC
-/* Stored original parameters.
-   XXX This is no good solution.  We should rather copy the args so
-   that we can compare them later.  But we must not use malloc(3).  */
-extern int __libc_argc;
-extern char **__libc_argv;
-
-/* Bash 2.0 gives us an environment variable containing flags
-   indicating ARGV elements that should not be considered arguments.  */
-
-# ifdef USE_NONOPTION_FLAGS
-/* Defined in getopt_init.c  */
-extern char *__getopt_nonoption_flags;
-# endif
-
-# ifdef USE_NONOPTION_FLAGS
-#  define SWAP_FLAGS(ch1, ch2) \
-  if (d->__nonoption_flags_len > 0)					      \
-    {									      \
-      char __tmp = __getopt_nonoption_flags[ch1];			      \
-      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
-      __getopt_nonoption_flags[ch2] = __tmp;				      \
-    }
-# else
-#  define SWAP_FLAGS(ch1, ch2)
-# endif
-#else	/* !_LIBC */
-# define SWAP_FLAGS(ch1, ch2)
-#endif	/* _LIBC */
-
 /* Exchange two adjacent subsequences of ARGV.
    One subsequence is elements [first_nonopt,last_nonopt)
    which contains all the non-options that have been skipped so far.
@@ -199,28 +169,6 @@ exchange (char **argv, struct _getopt_data *d)
      It leaves the longer segment in the right place overall,
      but it consists of two parts that need to be swapped next.  */
 
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-  /* First make sure the handling of the `__getopt_nonoption_flags'
-     string can work normally.  Our top argument must be in the range
-     of the string.  */
-  if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
-    {
-      /* We must extend the array.  The user plays games with us and
-	 presents new arguments.  */
-      char *new_str = malloc (top + 1);
-      if (new_str == NULL)
-	d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
-      else
-	{
-	  memset (__mempcpy (new_str, __getopt_nonoption_flags,
-			     d->__nonoption_flags_max_len),
-		  '\0', top + 1 - d->__nonoption_flags_max_len);
-	  d->__nonoption_flags_max_len = top + 1;
-	  __getopt_nonoption_flags = new_str;
-	}
-    }
-#endif
-
   while (top > middle && middle > bottom)
     {
       if (top - middle > middle - bottom)
@@ -235,7 +183,6 @@ exchange (char **argv, struct _getopt_data *d)
 	      tem = argv[bottom + i];
 	      argv[bottom + i] = argv[top - (middle - bottom) + i];
 	      argv[top - (middle - bottom) + i] = tem;
-	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
 	    }
 	  /* Exclude the moved bottom segment from further swapping.  */
 	  top -= len;
@@ -252,7 +199,6 @@ exchange (char **argv, struct _getopt_data *d)
 	      tem = argv[bottom + i];
 	      argv[bottom + i] = argv[middle + i];
 	      argv[middle + i] = tem;
-	      SWAP_FLAGS (bottom + i, middle + i);
 	    }
 	  /* Exclude the moved top segment from further swapping.  */
 	  bottom += len;
@@ -298,36 +244,6 @@ _getopt_initialize (int argc, char *const *argv, const char *optstring,
   else
     d->__ordering = PERMUTE;
 
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-  if (!d->__posixly_correct
-      && argc == __libc_argc && argv == __libc_argv)
-    {
-      if (d->__nonoption_flags_max_len == 0)
-	{
-	  if (__getopt_nonoption_flags == NULL
-	      || __getopt_nonoption_flags[0] == '\0')
-	    d->__nonoption_flags_max_len = -1;
-	  else
-	    {
-	      const char *orig_str = __getopt_nonoption_flags;
-	      int len = d->__nonoption_flags_max_len = strlen (orig_str);
-	      if (d->__nonoption_flags_max_len < argc)
-		d->__nonoption_flags_max_len = argc;
-	      __getopt_nonoption_flags =
-		(char *) malloc (d->__nonoption_flags_max_len);
-	      if (__getopt_nonoption_flags == NULL)
-		d->__nonoption_flags_max_len = -1;
-	      else
-		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
-			'\0', d->__nonoption_flags_max_len - len);
-	    }
-	}
-      d->__nonoption_flags_len = d->__nonoption_flags_max_len;
-    }
-  else
-    d->__nonoption_flags_len = 0;
-#endif
-
   return optstring;
 }
 
@@ -412,17 +328,8 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring,
   if (optstring[0] == ':')
     print_errors = 0;
 
-  /* Test whether ARGV[optind] points to a non-option argument.
-     Either it does not have option syntax, or there is an environment flag
-     from the shell indicating it is not an option.  The later information
-     is only used when the used in the GNU libc.  */
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
-		      || (d->optind < d->__nonoption_flags_len		      \
-			  && __getopt_nonoption_flags[d->optind] == '1'))
-#else
-# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
-#endif
+  /* Test whether ARGV[optind] points to a non-option argument.  */
+#define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
 
   if (d->__nextchar == NULL || *d->__nextchar == '\0')
     {
diff --git a/posix/getopt_init.c b/posix/getopt_init.c
deleted file mode 100644
index 498b301433..0000000000
--- a/posix/getopt_init.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Perform additional initialization for getopt functions in GNU libc.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifdef USE_NONOPTION_FLAGS
-/* Attention: this file is *not* necessary when the GNU getopt functions
-   are used outside the GNU libc.  Some additional functionality of the
-   getopt functions in GNU libc require this additional work.  */
-
-#include <getopt.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-
-#include <_itoa.h>
-
-/* Variable to synchronize work.  */
-char *__getopt_nonoption_flags;
-
-
-/* Remove the environment variable "_<PID>_GNU_nonoption_argv_flags_" if
-   it is still available.  If the getopt functions are also used in the
-   application it does not exist anymore since it was saved for the use
-   in getopt.  */
-void
-__getopt_clean_environment (char **env)
-{
-  /* Bash 2.0 puts a special variable in the environment for each
-     command it runs, specifying which ARGV elements are the results
-     of file name wildcard expansion and therefore should not be
-     considered as options.  */
-  static const char envvar_tail[] = "_GNU_nonoption_argv_flags_=";
-  char var[50];
-  char *cp, **ep;
-  size_t len;
-
-  /* Construct the "_<PID>_GNU_nonoption_argv_flags_=" string.  We must
-     not use `sprintf'.  */
-  cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
-	       sizeof (envvar_tail));
-  cp = _itoa_word (__getpid (), cp, 10, 0);
-  /* Note: we omit adding the leading '_' since we explicitly test for
-     it before calling strncmp.  */
-  len = (var + sizeof (var) - 1) - cp;
-
-  for (ep = env; *ep != NULL; ++ep)
-    if ((*ep)[0] == '_'
-	&& __builtin_expect (strncmp (*ep + 1, cp, len) == 0, 0))
-      {
-	/* Found it.  Store this pointer and move later ones back.  */
-	char **dp = ep;
-	__getopt_nonoption_flags = &(*ep)[len];
-	do
-	  dp[0] = dp[1];
-	while (*dp++);
-	/* Continue the loop in case the name appears again.  */
-      }
-}
-#endif	/* USE_NONOPTION_FLAGS */
diff --git a/posix/getopt_int.h b/posix/getopt_int.h
index e9eb5132bb..71b9655549 100644
--- a/posix/getopt_int.h
+++ b/posix/getopt_int.h
@@ -98,11 +98,6 @@ struct _getopt_data
 
   int __first_nonopt;
   int __last_nonopt;
-
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-  int __nonoption_flags_max_len;
-  int __nonoption_flags_len;
-# endif
 };
 
 /* The initializer is necessary to set OPTIND and OPTERR to their
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index 3e5555cb1e..6a6a694719 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -33,9 +33,6 @@
 
 extern void __mach_init (void);
 extern void __init_misc (int, char **, char **);
-#ifdef USE_NONOPTION_FLAGS
-extern void __getopt_clean_environment (char **);
-#endif
 extern void __libc_global_ctors (void);
 
 unsigned int __hurd_threadvar_max;
@@ -88,11 +85,6 @@ posixland_init (int argc, char **argv, char **envp)
 #endif
   __init_misc (argc, argv, envp);
 
-#ifdef USE_NONOPTION_FLAGS
-  /* This is a hack to make the special getopt in GNU libc working.  */
-  __getopt_clean_environment (envp);
-#endif
-
   /* Initialize ctype data.  */
   __ctype_init ();