Re: getopt() and strdup() - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: getopt() and strdup()
Date
Msg-id 20121012173548.GA31038@momjian.us
Whole thread Raw
In response to Re: getopt() and strdup()  (Bruce Momjian <bruce@momjian.us>)
List pgsql-hackers
Applied.

---------------------------------------------------------------------------

On Wed, Oct 10, 2012 at 07:54:15PM -0400, Bruce Momjian wrote:
> On Mon, Oct  8, 2012 at 09:03:37PM -0400, Bruce Momjian wrote:
> > On Mon, Oct  8, 2012 at 04:33:29PM -0400, Tom Lane wrote:
> > > Bruce Momjian <bruce@momjian.us> writes:
> > > > A while ago I noticed that in some places we strdup/pg_strdup() optarg
> > > > strings from getopt(), and in some places we don't.
> > > 
> > > > If we needed the strdup(), the missing cases should generate errors.  If
> > > > we don't need them, the strdup() is unnecessary, and research confirms
> > > > they are unnecessary.  Should we remove the extra strdup/pg_strdup()
> > > > calls, for consistency.
> > > 
> > > What research?  Given the number of different ways argv[] is handled
> > > on different platforms (cf ps_status.c), I am very unwilling to trust
> > > that it's safe to hang onto an argv string for long without strdup'ing
> > > it.
> > > 
> > > > I think we might have had old platforms that required it, but none are
> > > > still supported today.
> > > 
> > > And what's your grounds for stating that?  All the alternatives in
> > > ps_status.c are still live code AFAICS.
> > > 
> > > My feeling is it's more likely to be a good idea to be adding strdup's
> > > than removing them.
> > 
> > Well, what we have now is either wrong or over-kill --- I don't know for
> > sure which.
> 
> OK, I have developed the attached patch to add strdup/pg_strdup() calls
> to all saving of getopt optarg arguments.
> 
> Also, do we want to centralize the definition of pg_strdup() in /port,
> or leave each module to define it on its own?   I see pg_strdup() defined
> in these modules:
> 
>     /pgtop/contrib/oid2name
>     /pgtop/contrib/pgbench
>     /pgtop/contrib/pg_upgrade
>     /pgtop/src/bin/initdb
>     /pgtop/src/bin/pg_basebackup
>     /pgtop/src/bin/pg_ctl
>     /pgtop/src/bin/pg_dump
>     /pgtop/src/bin/psql
>     /pgtop/src/bin/scripts
> 
> -- 
>   Bruce Momjian  <bruce@momjian.us>        http://momjian.us
>   EnterpriseDB                             http://enterprisedb.com
> 
>   + It's impossible for everything to be true. +

> diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c
> new file mode 100644
> index 8f77998..e97a11c
> *** a/contrib/pg_archivecleanup/pg_archivecleanup.c
> --- b/contrib/pg_archivecleanup/pg_archivecleanup.c
> *************** main(int argc, char **argv)
> *** 299,305 ****
>                   dryrun = true;
>                   break;
>               case 'x':
> !                 additional_ext = optarg;        /* Extension to remove from
>                                                    * xlogfile names */
>                   break;
>               default:
> --- 299,305 ----
>                   dryrun = true;
>                   break;
>               case 'x':
> !                 additional_ext = strdup(optarg);        /* Extension to remove from
>                                                    * xlogfile names */
>                   break;
>               default:
> diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
> new file mode 100644
> index 84941ed..659bd50
> *** a/contrib/pg_standby/pg_standby.c
> --- b/contrib/pg_standby/pg_standby.c
> *************** main(int argc, char **argv)
> *** 643,649 ****
>                   }
>                   break;
>               case 't':            /* Trigger file */
> !                 triggerPath = optarg;
>                   break;
>               case 'w':            /* Max wait time */
>                   maxwaittime = atoi(optarg);
> --- 643,649 ----
>                   }
>                   break;
>               case 't':            /* Trigger file */
> !                 triggerPath = strdup(optarg);
>                   break;
>               case 'w':            /* Max wait time */
>                   maxwaittime = atoi(optarg);
> diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c
> new file mode 100644
> index c399d59..5d48aee
> *** a/contrib/pgbench/pgbench.c
> --- b/contrib/pgbench/pgbench.c
> *************** main(int argc, char **argv)
> *** 1995,2001 ****
>                   is_init_mode++;
>                   break;
>               case 'h':
> !                 pghost = optarg;
>                   break;
>               case 'n':
>                   is_no_vacuum++;
> --- 1995,2001 ----
>                   is_init_mode++;
>                   break;
>               case 'h':
> !                 pghost = pg_strdup(optarg);
>                   break;
>               case 'n':
>                   is_no_vacuum++;
> *************** main(int argc, char **argv)
> *** 2004,2010 ****
>                   do_vacuum_accounts++;
>                   break;
>               case 'p':
> !                 pgport = optarg;
>                   break;
>               case 'd':
>                   debug++;
> --- 2004,2010 ----
>                   do_vacuum_accounts++;
>                   break;
>               case 'p':
> !                 pgport = pg_strdup(optarg);
>                   break;
>               case 'd':
>                   debug++;
> *************** main(int argc, char **argv)
> *** 2090,2103 ****
>                   }
>                   break;
>               case 'U':
> !                 login = optarg;
>                   break;
>               case 'l':
>                   use_log = true;
>                   break;
>               case 'f':
>                   ttype = 3;
> !                 filename = optarg;
>                   if (process_file(filename) == false || *sql_files[num_files - 1] == NULL)
>                       exit(1);
>                   break;
> --- 2090,2103 ----
>                   }
>                   break;
>               case 'U':
> !                 login = pg_strdup(optarg);
>                   break;
>               case 'l':
>                   use_log = true;
>                   break;
>               case 'f':
>                   ttype = 3;
> !                 filename = pg_strdup(optarg);
>                   if (process_file(filename) == false || *sql_files[num_files - 1] == NULL)
>                       exit(1);
>                   break;
> *************** main(int argc, char **argv)
> *** 2143,2152 ****
>                   /* This covers long options which take no argument. */
>                   break;
>               case 2:                /* tablespace */
> !                 tablespace = optarg;
>                   break;
>               case 3:                /* index-tablespace */
> !                 index_tablespace = optarg;
>                   break;
>               case 4:
>                   sample_rate = atof(optarg);
> --- 2143,2152 ----
>                   /* This covers long options which take no argument. */
>                   break;
>               case 2:                /* tablespace */
> !                 tablespace = pg_strdup(optarg);
>                   break;
>               case 3:                /* index-tablespace */
> !                 index_tablespace = pg_strdup(optarg);
>                   break;
>               case 4:
>                   sample_rate = atof(optarg);
> diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
> new file mode 100644
> index 34ddebb..11086e2
> *** a/src/backend/bootstrap/bootstrap.c
> --- b/src/backend/bootstrap/bootstrap.c
> *************** AuxiliaryProcessMain(int argc, char *arg
> *** 241,247 ****
>                   SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
>                   break;
>               case 'D':
> !                 userDoption = optarg;
>                   break;
>               case 'd':
>                   {
> --- 241,247 ----
>                   SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
>                   break;
>               case 'D':
> !                 userDoption = strdup(optarg);
>                   break;
>               case 'd':
>                   {
> diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
> new file mode 100644
> index e73caa8..dfe4049
> *** a/src/backend/postmaster/postmaster.c
> --- b/src/backend/postmaster/postmaster.c
> *************** PostmasterMain(int argc, char *argv[])
> *** 570,580 ****
>                   break;
>   
>               case 'C':
> !                 output_config_variable = optarg;
>                   break;
>   
>               case 'D':
> !                 userDoption = optarg;
>                   break;
>   
>               case 'd':
> --- 570,580 ----
>                   break;
>   
>               case 'C':
> !                 output_config_variable = strdup(optarg);
>                   break;
>   
>               case 'D':
> !                 userDoption = strdup(optarg);
>                   break;
>   
>               case 'd':
> diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
> new file mode 100644
> index 9920d96..dd2019a
> *** a/src/bin/pg_dump/pg_dump.c
> --- b/src/bin/pg_dump/pg_dump.c
> *************** main(int argc, char **argv)
> *** 409,427 ****
>                   break;
>   
>               case 'E':            /* Dump encoding */
> !                 dumpencoding = optarg;
>                   break;
>   
>               case 'f':
> !                 filename = optarg;
>                   break;
>   
>               case 'F':
> !                 format = optarg;
>                   break;
>   
>               case 'h':            /* server host */
> !                 pghost = optarg;
>                   break;
>   
>               case 'i':
> --- 409,427 ----
>                   break;
>   
>               case 'E':            /* Dump encoding */
> !                 dumpencoding = pg_strdup(optarg);
>                   break;
>   
>               case 'f':
> !                 filename = pg_strdup(optarg);
>                   break;
>   
>               case 'F':
> !                 format = pg_strdup(optarg);
>                   break;
>   
>               case 'h':            /* server host */
> !                 pghost = pg_strdup(optarg);
>                   break;
>   
>               case 'i':
> *************** main(int argc, char **argv)
> *** 446,452 ****
>                   break;
>   
>               case 'p':            /* server port */
> !                 pgport = optarg;
>                   break;
>   
>               case 'R':
> --- 446,452 ----
>                   break;
>   
>               case 'p':            /* server port */
> !                 pgport = pg_strdup(optarg);
>                   break;
>   
>               case 'R':
> *************** main(int argc, char **argv)
> *** 471,477 ****
>                   break;
>   
>               case 'U':
> !                 username = optarg;
>                   break;
>   
>               case 'v':            /* verbose */
> --- 471,477 ----
>                   break;
>   
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>   
>               case 'v':            /* verbose */
> *************** main(int argc, char **argv)
> *** 499,509 ****
>                   break;
>   
>               case 2:                /* lock-wait-timeout */
> !                 lockWaitTimeout = optarg;
>                   break;
>   
>               case 3:                /* SET ROLE */
> !                 use_role = optarg;
>                   break;
>   
>               case 4:                /* exclude table(s) data */
> --- 499,509 ----
>                   break;
>   
>               case 2:                /* lock-wait-timeout */
> !                 lockWaitTimeout = pg_strdup(optarg);
>                   break;
>   
>               case 3:                /* SET ROLE */
> !                 use_role = pg_strdup(optarg);
>                   break;
>   
>               case 4:                /* exclude table(s) data */
> diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
> new file mode 100644
> index 10ce222..ca95bad
> *** a/src/bin/pg_dump/pg_dumpall.c
> --- b/src/bin/pg_dump/pg_dumpall.c
> *************** main(int argc, char *argv[])
> *** 200,206 ****
>                   break;
>   
>               case 'f':
> !                 filename = optarg;
>                   appendPQExpBuffer(pgdumpopts, " -f ");
>                   doShellQuoting(pgdumpopts, filename);
>                   break;
> --- 200,206 ----
>                   break;
>   
>               case 'f':
> !                 filename = pg_strdup(optarg);
>                   appendPQExpBuffer(pgdumpopts, " -f ");
>                   doShellQuoting(pgdumpopts, filename);
>                   break;
> *************** main(int argc, char *argv[])
> *** 210,216 ****
>                   break;
>   
>               case 'h':
> !                 pghost = optarg;
>                   appendPQExpBuffer(pgdumpopts, " -h ");
>                   doShellQuoting(pgdumpopts, pghost);
>                   break;
> --- 210,216 ----
>                   break;
>   
>               case 'h':
> !                 pghost = pg_strdup(optarg);
>                   appendPQExpBuffer(pgdumpopts, " -h ");
>                   doShellQuoting(pgdumpopts, pghost);
>                   break;
> *************** main(int argc, char *argv[])
> *** 220,226 ****
>                   break;
>   
>               case 'l':
> !                 pgdb = optarg;
>                   break;
>   
>               case 'o':
> --- 220,226 ----
>                   break;
>   
>               case 'l':
> !                 pgdb = pg_strdup(optarg);
>                   break;
>   
>               case 'o':
> *************** main(int argc, char *argv[])
> *** 232,238 ****
>                   break;
>   
>               case 'p':
> !                 pgport = optarg;
>                   appendPQExpBuffer(pgdumpopts, " -p ");
>                   doShellQuoting(pgdumpopts, pgport);
>                   break;
> --- 232,238 ----
>                   break;
>   
>               case 'p':
> !                 pgport = pg_strdup(optarg);
>                   appendPQExpBuffer(pgdumpopts, " -p ");
>                   doShellQuoting(pgdumpopts, pgport);
>                   break;
> *************** main(int argc, char *argv[])
> *** 255,261 ****
>                   break;
>   
>               case 'U':
> !                 pguser = optarg;
>                   appendPQExpBuffer(pgdumpopts, " -U ");
>                   doShellQuoting(pgdumpopts, pguser);
>                   break;
> --- 255,261 ----
>                   break;
>   
>               case 'U':
> !                 pguser = pg_strdup(optarg);
>                   appendPQExpBuffer(pgdumpopts, " -U ");
>                   doShellQuoting(pgdumpopts, pguser);
>                   break;
> *************** main(int argc, char *argv[])
> *** 289,295 ****
>                   break;
>   
>               case 3:
> !                 use_role = optarg;
>                   appendPQExpBuffer(pgdumpopts, " --role ");
>                   doShellQuoting(pgdumpopts, use_role);
>                   break;
> --- 289,295 ----
>                   break;
>   
>               case 3:
> !                 use_role = pg_strdup(optarg);
>                   appendPQExpBuffer(pgdumpopts, " --role ");
>                   doShellQuoting(pgdumpopts, use_role);
>                   break;
> diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
> new file mode 100644
> index f6c835b..49d799b
> *** a/src/bin/pg_dump/pg_restore.c
> --- b/src/bin/pg_dump/pg_restore.c
> *************** main(int argc, char **argv)
> *** 238,244 ****
>                   break;
>   
>               case 'U':
> !                 opts->username = optarg;
>                   break;
>   
>               case 'v':            /* verbose */
> --- 238,244 ----
>                   break;
>   
>               case 'U':
> !                 opts->username = pg_strdup(optarg);
>                   break;
>   
>               case 'v':            /* verbose */
> *************** main(int argc, char **argv)
> *** 270,276 ****
>                   break;
>   
>               case 2:                /* SET ROLE */
> !                 opts->use_role = optarg;
>                   break;
>   
>               case 3:                /* section */
> --- 270,276 ----
>                   break;
>   
>               case 2:                /* SET ROLE */
> !                 opts->use_role = pg_strdup(optarg);
>                   break;
>   
>               case 3:                /* section */
> diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
> new file mode 100644
> index 3fb12c9..1fcc47f
> *** a/src/bin/psql/startup.c
> --- b/src/bin/psql/startup.c
> *************** parse_psql_options(int argc, char *argv[
> *** 411,417 ****
>                   pset.popt.topt.format = PRINT_UNALIGNED;
>                   break;
>               case 'c':
> !                 options->action_string = optarg;
>                   if (optarg[0] == '\\')
>                   {
>                       options->action = ACT_SINGLE_SLASH;
> --- 411,417 ----
>                   pset.popt.topt.format = PRINT_UNALIGNED;
>                   break;
>               case 'c':
> !                 options->action_string = pg_strdup(optarg);
>                   if (optarg[0] == '\\')
>                   {
>                       options->action = ACT_SINGLE_SLASH;
> *************** parse_psql_options(int argc, char *argv[
> *** 421,427 ****
>                       options->action = ACT_SINGLE_QUERY;
>                   break;
>               case 'd':
> !                 options->dbname = optarg;
>                   break;
>               case 'e':
>                   SetVariable(pset.vars, "ECHO", "queries");
> --- 421,427 ----
>                       options->action = ACT_SINGLE_QUERY;
>                   break;
>               case 'd':
> !                 options->dbname = pg_strdup(optarg);
>                   break;
>               case 'e':
>                   SetVariable(pset.vars, "ECHO", "queries");
> *************** parse_psql_options(int argc, char *argv[
> *** 431,444 ****
>                   break;
>               case 'f':
>                   options->action = ACT_FILE;
> !                 options->action_string = optarg;
>                   break;
>               case 'F':
>                   pset.popt.topt.fieldSep.separator = pg_strdup(optarg);
>                   pset.popt.topt.fieldSep.separator_zero = false;
>                   break;
>               case 'h':
> !                 options->host = optarg;
>                   break;
>               case 'H':
>                   pset.popt.topt.format = PRINT_HTML;
> --- 431,444 ----
>                   break;
>               case 'f':
>                   options->action = ACT_FILE;
> !                 options->action_string = pg_strdup(optarg);
>                   break;
>               case 'F':
>                   pset.popt.topt.fieldSep.separator = pg_strdup(optarg);
>                   pset.popt.topt.fieldSep.separator_zero = false;
>                   break;
>               case 'h':
> !                 options->host = pg_strdup(optarg);
>                   break;
>               case 'H':
>                   pset.popt.topt.format = PRINT_HTML;
> *************** parse_psql_options(int argc, char *argv[
> *** 447,453 ****
>                   options->action = ACT_LIST_DB;
>                   break;
>               case 'L':
> !                 options->logfilename = optarg;
>                   break;
>               case 'n':
>                   options->no_readline = true;
> --- 447,453 ----
>                   options->action = ACT_LIST_DB;
>                   break;
>               case 'L':
> !                 options->logfilename = pg_strdup(optarg);
>                   break;
>               case 'n':
>                   options->no_readline = true;
> *************** parse_psql_options(int argc, char *argv[
> *** 456,462 ****
>                   setQFout(optarg);
>                   break;
>               case 'p':
> !                 options->port = optarg;
>                   break;
>               case 'P':
>                   {
> --- 456,462 ----
>                   setQFout(optarg);
>                   break;
>               case 'p':
> !                 options->port = pg_strdup(optarg);
>                   break;
>               case 'P':
>                   {
> *************** parse_psql_options(int argc, char *argv[
> *** 503,509 ****
>                   pset.popt.topt.tableAttr = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 options->username = optarg;
>                   break;
>               case 'v':
>                   {
> --- 503,509 ----
>                   pset.popt.topt.tableAttr = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 options->username = pg_strdup(optarg);
>                   break;
>               case 'v':
>                   {
> diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
> new file mode 100644
> index b8ac675..261b438
> *** a/src/bin/scripts/clusterdb.c
> --- b/src/bin/scripts/clusterdb.c
> *************** main(int argc, char *argv[])
> *** 71,83 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 71,83 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 92,110 ****
>                   quiet = true;
>                   break;
>               case 'd':
> !                 dbname = optarg;
>                   break;
>               case 'a':
>                   alldb = true;
>                   break;
>               case 't':
> !                 table = optarg;
>                   break;
>               case 'v':
>                   verbose = true;
>                   break;
>               case 2:
> !                 maintenance_db = optarg;
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> --- 92,110 ----
>                   quiet = true;
>                   break;
>               case 'd':
> !                 dbname = pg_strdup(optarg);
>                   break;
>               case 'a':
>                   alldb = true;
>                   break;
>               case 't':
> !                 table = pg_strdup(optarg);
>                   break;
>               case 'v':
>                   verbose = true;
>                   break;
>               case 2:
> !                 maintenance_db = pg_strdup(optarg);
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c
> new file mode 100644
> index 91b1a24..4df70cb
> *** a/src/bin/scripts/createdb.c
> --- b/src/bin/scripts/createdb.c
> *************** main(int argc, char *argv[])
> *** 74,86 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 74,86 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 92,119 ****
>                   echo = true;
>                   break;
>               case 'O':
> !                 owner = optarg;
>                   break;
>               case 'D':
> !                 tablespace = optarg;
>                   break;
>               case 'T':
> !                 template = optarg;
>                   break;
>               case 'E':
> !                 encoding = optarg;
>                   break;
>               case 1:
> !                 lc_collate = optarg;
>                   break;
>               case 2:
> !                 lc_ctype = optarg;
>                   break;
>               case 'l':
> !                 locale = optarg;
>                   break;
>               case 3:
> !                 maintenance_db = optarg;
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> --- 92,119 ----
>                   echo = true;
>                   break;
>               case 'O':
> !                 owner = pg_strdup(optarg);
>                   break;
>               case 'D':
> !                 tablespace = pg_strdup(optarg);
>                   break;
>               case 'T':
> !                 template = pg_strdup(optarg);
>                   break;
>               case 'E':
> !                 encoding = pg_strdup(optarg);
>                   break;
>               case 1:
> !                 lc_collate = pg_strdup(optarg);
>                   break;
>               case 2:
> !                 lc_ctype = pg_strdup(optarg);
>                   break;
>               case 'l':
> !                 locale = pg_strdup(optarg);
>                   break;
>               case 3:
> !                 maintenance_db = pg_strdup(optarg);
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c
> new file mode 100644
> index 60066af..b85cf04
> *** a/src/bin/scripts/createlang.c
> --- b/src/bin/scripts/createlang.c
> *************** main(int argc, char *argv[])
> *** 65,77 ****
>                   listlangs = true;
>                   break;
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 65,77 ----
>                   listlangs = true;
>                   break;
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 80,86 ****
>                   prompt_password = TRI_YES;
>                   break;
>               case 'd':
> !                 dbname = optarg;
>                   break;
>               case 'e':
>                   echo = true;
> --- 80,86 ----
>                   prompt_password = TRI_YES;
>                   break;
>               case 'd':
> !                 dbname = pg_strdup(optarg);
>                   break;
>               case 'e':
>                   echo = true;
> diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c
> new file mode 100644
> index db3b5d0..d35121b
> *** a/src/bin/scripts/createuser.c
> --- b/src/bin/scripts/createuser.c
> *************** main(int argc, char *argv[])
> *** 89,101 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 89,101 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 139,145 ****
>                   login = TRI_NO;
>                   break;
>               case 'c':
> !                 conn_limit = optarg;
>                   break;
>               case 'P':
>                   pwprompt = true;
> --- 139,145 ----
>                   login = TRI_NO;
>                   break;
>               case 'c':
> !                 conn_limit = pg_strdup(optarg);
>                   break;
>               case 'P':
>                   pwprompt = true;
> diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c
> new file mode 100644
> index 583655d..5f978cc
> *** a/src/bin/scripts/dropdb.c
> --- b/src/bin/scripts/dropdb.c
> *************** main(int argc, char *argv[])
> *** 64,76 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 64,76 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 88,94 ****
>                   /* this covers the long options */
>                   break;
>               case 2:
> !                 maintenance_db = optarg;
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> --- 88,94 ----
>                   /* this covers the long options */
>                   break;
>               case 2:
> !                 maintenance_db = pg_strdup(optarg);
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c
> new file mode 100644
> index 4772dc5..b9f42bb
> *** a/src/bin/scripts/droplang.c
> --- b/src/bin/scripts/droplang.c
> *************** main(int argc, char *argv[])
> *** 64,76 ****
>                   listlangs = true;
>                   break;
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 64,76 ----
>                   listlangs = true;
>                   break;
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 79,85 ****
>                   prompt_password = TRI_YES;
>                   break;
>               case 'd':
> !                 dbname = optarg;
>                   break;
>               case 'e':
>                   echo = true;
> --- 79,85 ----
>                   prompt_password = TRI_YES;
>                   break;
>               case 'd':
> !                 dbname = pg_strdup(optarg);
>                   break;
>               case 'e':
>                   echo = true;
> diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c
> new file mode 100644
> index d0bf6ff..7c10101
> *** a/src/bin/scripts/dropuser.c
> --- b/src/bin/scripts/dropuser.c
> *************** main(int argc, char *argv[])
> *** 62,74 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 62,74 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
> new file mode 100644
> index d1e27bd..f61dada
> *** a/src/bin/scripts/reindexdb.c
> --- b/src/bin/scripts/reindexdb.c
> *************** main(int argc, char *argv[])
> *** 78,90 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 78,90 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 99,105 ****
>                   quiet = true;
>                   break;
>               case 'd':
> !                 dbname = optarg;
>                   break;
>               case 'a':
>                   alldb = true;
> --- 99,105 ----
>                   quiet = true;
>                   break;
>               case 'd':
> !                 dbname = pg_strdup(optarg);
>                   break;
>               case 'a':
>                   alldb = true;
> *************** main(int argc, char *argv[])
> *** 108,120 ****
>                   syscatalog = true;
>                   break;
>               case 't':
> !                 table = optarg;
>                   break;
>               case 'i':
> !                 index = optarg;
>                   break;
>               case 2:
> !                 maintenance_db = optarg;
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> --- 108,120 ----
>                   syscatalog = true;
>                   break;
>               case 't':
> !                 table = pg_strdup(optarg);
>                   break;
>               case 'i':
> !                 index = pg_strdup(optarg);
>                   break;
>               case 2:
> !                 maintenance_db = pg_strdup(optarg);
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
> new file mode 100644
> index 0ac6ab4..eb28ad4
> *** a/src/bin/scripts/vacuumdb.c
> --- b/src/bin/scripts/vacuumdb.c
> *************** main(int argc, char *argv[])
> *** 82,94 ****
>           switch (c)
>           {
>               case 'h':
> !                 host = optarg;
>                   break;
>               case 'p':
> !                 port = optarg;
>                   break;
>               case 'U':
> !                 username = optarg;
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> --- 82,94 ----
>           switch (c)
>           {
>               case 'h':
> !                 host = pg_strdup(optarg);
>                   break;
>               case 'p':
> !                 port = pg_strdup(optarg);
>                   break;
>               case 'U':
> !                 username = pg_strdup(optarg);
>                   break;
>               case 'w':
>                   prompt_password = TRI_NO;
> *************** main(int argc, char *argv[])
> *** 103,109 ****
>                   quiet = true;
>                   break;
>               case 'd':
> !                 dbname = optarg;
>                   break;
>               case 'z':
>                   and_analyze = true;
> --- 103,109 ----
>                   quiet = true;
>                   break;
>               case 'd':
> !                 dbname = pg_strdup(optarg);
>                   break;
>               case 'z':
>                   and_analyze = true;
> *************** main(int argc, char *argv[])
> *** 118,124 ****
>                   alldb = true;
>                   break;
>               case 't':
> !                 table = optarg;
>                   break;
>               case 'f':
>                   full = true;
> --- 118,124 ----
>                   alldb = true;
>                   break;
>               case 't':
> !                 table = pg_strdup(optarg);
>                   break;
>               case 'f':
>                   full = true;
> *************** main(int argc, char *argv[])
> *** 127,133 ****
>                   verbose = true;
>                   break;
>               case 2:
> !                 maintenance_db = optarg;
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> --- 127,133 ----
>                   verbose = true;
>                   break;
>               case 2:
> !                 maintenance_db = pg_strdup(optarg);
>                   break;
>               default:
>                   fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
> diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
> new file mode 100644
> index 7e7bae3..1b775a1
> *** a/src/interfaces/ecpg/preproc/ecpg.c
> --- b/src/interfaces/ecpg/preproc/ecpg.c
> *************** main(int argc, char *const argv[])
> *** 171,177 ****
>                   regression_mode = true;
>                   break;
>               case 'o':
> !                 output_filename = optarg;
>                   if (strcmp(output_filename, "-") == 0)
>                       yyout = stdout;
>                   else
> --- 171,177 ----
>                   regression_mode = true;
>                   break;
>               case 'o':
> !                 output_filename = strdup(optarg);
>                   if (strcmp(output_filename, "-") == 0)
>                       yyout = stdout;
>                   else
> diff --git a/src/timezone/zic.c b/src/timezone/zic.c
> new file mode 100644
> index 8a95d6a..0aa90eb
> *** a/src/timezone/zic.c
> --- b/src/timezone/zic.c
> *************** main(int argc, char *argv[])
> *** 505,511 ****
>                   usage(stderr, EXIT_FAILURE);
>               case 'd':
>                   if (directory == NULL)
> !                     directory = optarg;
>                   else
>                   {
>                       (void) fprintf(stderr,
> --- 505,511 ----
>                   usage(stderr, EXIT_FAILURE);
>               case 'd':
>                   if (directory == NULL)
> !                     directory = strdup(optarg);
>                   else
>                   {
>                       (void) fprintf(stderr,
> *************** main(int argc, char *argv[])
> *** 516,522 ****
>                   break;
>               case 'l':
>                   if (lcltime == NULL)
> !                     lcltime = optarg;
>                   else
>                   {
>                       (void) fprintf(stderr,
> --- 516,522 ----
>                   break;
>               case 'l':
>                   if (lcltime == NULL)
> !                     lcltime = strdup(optarg);
>                   else
>                   {
>                       (void) fprintf(stderr,
> *************** main(int argc, char *argv[])
> *** 527,533 ****
>                   break;
>               case 'p':
>                   if (psxrules == NULL)
> !                     psxrules = optarg;
>                   else
>                   {
>                       (void) fprintf(stderr,
> --- 527,533 ----
>                   break;
>               case 'p':
>                   if (psxrules == NULL)
> !                     psxrules = strdup(optarg);
>                   else
>                   {
>                       (void) fprintf(stderr,
> *************** main(int argc, char *argv[])
> *** 538,544 ****
>                   break;
>               case 'y':
>                   if (yitcommand == NULL)
> !                     yitcommand = optarg;
>                   else
>                   {
>                       (void) fprintf(stderr,
> --- 538,544 ----
>                   break;
>               case 'y':
>                   if (yitcommand == NULL)
> !                     yitcommand = strdup(optarg);
>                   else
>                   {
>                       (void) fprintf(stderr,
> *************** main(int argc, char *argv[])
> *** 549,555 ****
>                   break;
>               case 'L':
>                   if (leapsec == NULL)
> !                     leapsec = optarg;
>                   else
>                   {
>                       (void) fprintf(stderr,
> --- 549,555 ----
>                   break;
>               case 'L':
>                   if (leapsec == NULL)
> !                     leapsec = strdup(optarg);
>                   else
>                   {
>                       (void) fprintf(stderr,

> 
> -- 
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers


--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +



pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Adding comments for system table/column names
Next
From: Nathan Boley
Date:
Subject: Re: Measure Theoretic Data Types in Postgresql