pgpool2.git / summary / log / commit / refs

commit    4bb83e9f21dd55b490271dbb61ab3ee90b18aec1
Author:   Guillaume Lelarge <guillaume at lelarge.info>
Date:     Sun Aug 22 08:24:02 2010 +0000

    Add getopt_long.h and getopt_long.c source code files from PostgreSQL source
    code, so that platforms without getopt_long function can still use long
    options.


Makefile.am | 3 +- Makefile.in | 6 +- getopt_long.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++ getopt_long.h | 44 +++++++++++ main.c | 3 + pcp/pcp_attach_node.c | 4 + pcp/pcp_detach_node.c | 4 + pcp/pcp_node_count.c | 4 + pcp/pcp_node_info.c | 4 + pcp/pcp_proc_count.c | 4 + pcp/pcp_proc_info.c | 4 + pcp/pcp_recovery_node.c | 4 + pcp/pcp_stop_pgpool.c | 4 + pcp/pcp_systemdb_info.c | 4 + pg_md5.c | 2 + 15 files changed, 291 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index c5c5cb73c..08a40a7fb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -21,7 +21,8 @@ pgpool_SOURCES = pool.h pool_type.h version.h pgpool.conf.sample \ pool_worker_child.c \ pool_passwd.c pool_passwd.h \ pool_globals.c \ - pool_select_walker.c pool_select_walker.h + pool_select_walker.c pool_select_walker.h \ + getopt_long.c getopt_long.h pg_md5_SOURCES = pg_md5.c md5.c md5.h \ pool.h \ diff --git a/Makefile.in b/Makefile.in index a626c8646..35e542ec9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -82,7 +82,7 @@ am_pgpool_OBJECTS = main.$(OBJEXT) child.$(OBJEXT) pool_auth.$(OBJEXT) \ pool_process_context.$(OBJEXT) pool_session_context.$(OBJEXT) \ pool_query_context.$(OBJEXT) pool_worker_child.$(OBJEXT) \ pool_passwd.$(OBJEXT) pool_globals.$(OBJEXT) \ - pool_select_walker.$(OBJEXT) + pool_select_walker.$(OBJEXT) getopt_long.$(OBJEXT) pgpool_OBJECTS = $(am_pgpool_OBJECTS) pgpool_DEPENDENCIES = parser/libsql-parser.a pcp/libpcp.la \ parser/nodes.o @@ -261,7 +261,8 @@ pgpool_SOURCES = pool.h pool_type.h version.h pgpool.conf.sample \ pool_worker_child.c \ pool_passwd.c pool_passwd.h \ pool_globals.c \ - pool_select_walker.c pool_select_walker.h + pool_select_walker.c pool_select_walker.h \ + getopt_long.c getopt_long.h pg_md5_SOURCES = pg_md5.c md5.c md5.h \ pool.h \ @@ -457,6 +458,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps_status.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recovery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcpy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt_long.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/getopt_long.c b/getopt_long.c new file mode 100644 index 000000000..dfb92f5b6 --- /dev/null +++ b/getopt_long.c @@ -0,0 +1,200 @@ +/* + * getopt_long() -- long options parser + * + * Portions Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Portions Copyright (c) 2003 + * PostgreSQL Global Development Group + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $PostgreSQL: pgsql/src/port/getopt_long.c,v 1.8 2009-06-11 14:49:15 momjian Exp $ + */ + +#include <stdio.h> + +#include "getopt_long.h" + +#ifndef HAVE_INT_OPTRESET +int optreset; + +/* else the "extern" was provided by getopt_long.h */ +#endif + +#define BADCH '?' +#define BADARG ':' +#define EMSG "" + + +int +getopt_long(int argc, char *const argv[], + const char *optstring, + const struct option * longopts, int *longindex) +{ + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || !*place) + { /* update scanning pointer */ + optreset = 0; + + if (optind >= argc) + { + place = EMSG; + return -1; + } + + place = argv[optind]; + + if (place[0] != '-') + { + place = EMSG; + return -1; + } + + place++; + + if (place[0] && place[0] == '-' && place[1] == '\0') + { /* found "--" */ + ++optind; + place = EMSG; + return -1; + } + + if (place[0] && place[0] == '-' && place[1]) + { + /* long option */ + size_t namelen; + int i; + + place++; + + namelen = strcspn(place, "="); + for (i = 0; longopts[i].name != NULL; i++) + { + if (strlen(longopts[i].name) == namelen + && strncmp(place, longopts[i].name, namelen) == 0) + { + if (longopts[i].has_arg) + { + if (place[namelen] == '=') + optarg = place + namelen + 1; + else if (optind < argc - 1) + { + optind++; + optarg = argv[optind]; + } + else + { + if (optstring[0] == ':') + return BADARG; + if (opterr) + fprintf(stderr, + "%s: option requires an argument -- %s\n", + argv[0], place); + place = EMSG; + optind++; + return BADCH; + } + } + else + { + optarg = NULL; + if (place[namelen] != 0) + { + /* XXX error? */ + } + } + + optind++; + + if (longindex) + *longindex = i; + + place = EMSG; + + if (longopts[i].flag == NULL) + return longopts[i].val; + else + { + *longopts[i].flag = longopts[i].val; + return 0; + } + } + } + + if (opterr && optstring[0] != ':') + fprintf(stderr, + "%s: illegal option -- %s\n", argv[0], place); + place = EMSG; + optind++; + return BADCH; + } + } + + /* short option */ + optopt = (int) *place++; + + oli = strchr(optstring, optopt); + if (!oli) + { + if (!*place) + ++optind; + if (opterr && *optstring != ':') + fprintf(stderr, + "%s: illegal option -- %c\n", argv[0], optopt); + return BADCH; + } + + if (oli[1] != ':') + { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } + else + { /* need an argument */ + if (*place) /* no white space */ + optarg = place; + else if (argc <= ++optind) + { /* no arg */ + place = EMSG; + if (*optstring == ':') + return BADARG; + if (opterr) + fprintf(stderr, + "%s: option requires an argument -- %c\n", + argv[0], optopt); + return BADCH; + } + else + /* white space */ + optarg = argv[optind]; + place = EMSG; + ++optind; + } + return optopt; +} diff --git a/getopt_long.h b/getopt_long.h new file mode 100644 index 000000000..4ec1febbb --- /dev/null +++ b/getopt_long.h @@ -0,0 +1,44 @@ +/* + * Portions Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Portions Copyright (c) 2003-2010, PostgreSQL Global Development Group + * + * $PostgreSQL: pgsql/src/include/getopt_long.h,v 1.12 2010-01-02 16:58:00 momjian Exp $ + */ +#ifndef GETOPT_LONG_H +#define GETOPT_LONG_H + +#ifdef HAVE_GETOPT_H +#include <getopt.h> +#endif + +/* These are picked up from the system's getopt() facility. */ +extern int opterr; +extern int optind; +extern int optopt; +extern char *optarg; +extern int optreset; + +#ifndef HAVE_STRUCT_OPTION + +struct option +{ + const char *name; + int has_arg; + int *flag; + int val; +}; + +#define no_argument 0 +#define required_argument 1 +#endif + +#ifndef HAVE_GETOPT_LONG + +extern int getopt_long(int argc, char *const argv[], + const char *optstring, + const struct option * longopts, int *longindex); +#endif + +#endif /* GETOPT_LONG_H */ diff --git a/main.c b/main.c index 8257b1247..b3cfa7a62 100644 --- a/main.c +++ b/main.c @@ -49,7 +49,10 @@ #ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" #endif + #include <libgen.h> #include "version.h" diff --git a/pcp/pcp_attach_node.c b/pcp/pcp_attach_node.c index eaf5db18b..96c58adb6 100644 --- a/pcp/pcp_attach_node.c +++ b/pcp/pcp_attach_node.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_detach_node.c b/pcp/pcp_detach_node.c index 930c20df4..9d1efeaf7 100644 --- a/pcp/pcp_detach_node.c +++ b/pcp/pcp_detach_node.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_node_count.c b/pcp/pcp_node_count.c index d3a4f580a..25ec08e87 100644 --- a/pcp/pcp_node_count.c +++ b/pcp/pcp_node_count.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_node_info.c b/pcp/pcp_node_info.c index e3d2e46e9..ce44f7f4c 100644 --- a/pcp/pcp_node_info.c +++ b/pcp/pcp_node_info.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_proc_count.c b/pcp/pcp_proc_count.c index 1853284cc..c53d0920e 100644 --- a/pcp/pcp_proc_count.c +++ b/pcp/pcp_proc_count.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_proc_info.c b/pcp/pcp_proc_info.c index 52630c412..53032b67f 100644 --- a/pcp/pcp_proc_info.c +++ b/pcp/pcp_proc_info.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include <time.h> #include "pcp.h" diff --git a/pcp/pcp_recovery_node.c b/pcp/pcp_recovery_node.c index 67ba0f668..fa9099bd4 100644 --- a/pcp/pcp_recovery_node.c +++ b/pcp/pcp_recovery_node.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_stop_pgpool.c b/pcp/pcp_stop_pgpool.c index 07d41c028..66c2747f5 100644 --- a/pcp/pcp_stop_pgpool.c +++ b/pcp/pcp_stop_pgpool.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pcp/pcp_systemdb_info.c b/pcp/pcp_systemdb_info.c index c456b9540..5b75beeaa 100644 --- a/pcp/pcp_systemdb_info.c +++ b/pcp/pcp_systemdb_info.c @@ -24,7 +24,11 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" +#endif #include "pcp.h" diff --git a/pg_md5.c b/pg_md5.c index b0c4eed4f..32b8e9850 100644 --- a/pg_md5.c +++ b/pg_md5.c @@ -34,6 +34,8 @@ #include <termios.h> #ifdef HAVE_GETOPT_H #include <getopt.h> +#else +#include "getopt_long.h" #endif #include <pwd.h> #include <libgen.h> [parent: 554233979809]