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 <[email protected]> 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  <[email protected]>        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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to