reset_getopt: New function (borrowed from e2fsprogs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
diff --git a/ChangeLog b/ChangeLog
index f33a120..c9dbe63 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-02-13 Robert Millan <rmh@aybabtu.com>
+
+ Add reset_getopt (borrowed from e2fsprogs).
+ * reset_getopt.c: New.
+ * Versions: Add reset_getopt.
+ * Makefile: Add reset_getopt.c.
+ * debian/copyright: Add license (GPL).
+
2006-02-10 Robert Millan <rmh@aybabtu.com>
Add errc, warnc, verrc and vwarnc.
diff --git a/Makefile b/Makefile
index 5190820..c5c2747 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# $Id$
#
-LIB_SRCS = arc4random.c err.c fgetln.c inet_net_pton.c strlcat.c strlcpy.c md5c.c fmtcheck.c
+LIB_SRCS = arc4random.c err.c fgetln.c inet_net_pton.c reset_getopt.c strlcat.c strlcpy.c md5c.c fmtcheck.c
LIB_INCLUDES = include/bsd/err.h include/bsd/ip_icmp.h include/bsd/random.h include/bsd/queue.h include/bsd/md5.h include/bsd/string.h include/bsd/bsd.h include/bsd/stdlib.h
diff --git a/Versions b/Versions
index 49e068c..2b83d5e 100644
--- a/Versions
+++ b/Versions
@@ -6,8 +6,8 @@ LIBBSD_0.0 {
fgetwln;
fmtcheck;
inet_net_pton;
- strlcpy;
- strlcat;
+ reset_getopt;
+ strlcpy; strlcat;
MD5Init;
MD5Update;
MD5Pad;
diff --git a/reset_getopt.c b/reset_getopt.c
new file mode 100644
index 0000000..c1e2cf9
--- /dev/null
+++ b/reset_getopt.c
@@ -0,0 +1,51 @@
+/*
+ * util.c --- utilities for the debugfs program
+ *
+ * Copyright (C) 1993, 1994 Theodore Ts'o. This file may be
+ * redistributed under the terms of the GNU Public License.
+ *
+ */
+
+/* Enable getopt variables */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <unistd.h>
+
+/* FIXME */
+#ifndef __GLIBC__
+# define HAVE_OPTRESET 1
+#endif
+
+/*
+ * This function resets the libc getopt() function, which keeps
+ * internal state. Bad design! Stupid libc API designers! No
+ * biscuit!
+ *
+ * BSD-derived getopt() functions require that optind be reset to 1 in
+ * order to reset getopt() state. This used to be generally accepted
+ * way of resetting getopt(). However, glibc's getopt()
+ * has additional getopt() state beyond optind, and requires that
+ * optind be set zero to reset its state. So the unfortunate state of
+ * affairs is that BSD-derived versions of getopt() misbehave if
+ * optind is set to 0 in order to reset getopt(), and glibc's getopt()
+ * will core ump if optind is set 1 in order to reset getopt().
+ *
+ * More modern versions of BSD require that optreset be set to 1 in
+ * order to reset getopt(). Sigh. Standards, anyone?
+ *
+ * We hide the hair here.
+ */
+void
+reset_getopt (void)
+{
+#ifdef __GLIBC__
+ optind = 0;
+#else
+ optind = 1;
+#endif
+#ifdef HAVE_OPTRESET
+ optreset = 1; /* Makes BSD getopt happy */
+#endif
+}