From: Robert Millan Date: Mon, 13 Feb 2006 09:02:17 +0000 (+0000) Subject: reset_getopt: New function (borrowed from e2fsprogs) X-Git-Tag: 0.0~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c849ba32af231fba36f4500d0d3290821f4dd7b7;p=thirdparty%2Flibbsd.git reset_getopt: New function (borrowed from e2fsprogs) --- diff --git a/ChangeLog b/ChangeLog index f33a120..c9dbe63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-02-13 Robert Millan + + 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 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 + +/* 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 +}