Re: getopt() and strdup()

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: getopt() and strdup()
Date: 2012-10-12 17:35:48
Message-ID: 20121012173548.GA31038@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)momjian(dot)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(at)momjian(dot)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(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers

--
Bruce Momjian <bruce(at)momjian(dot)us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ It's impossible for everything to be true. +

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Nathan Boley 2012-10-12 17:41:58 Re: Measure Theoretic Data Types in Postgresql
Previous Message Bruce Momjian 2012-10-12 17:29:21 Adding comments for system table/column names