Skip to content

Commit 03d1080

Browse files
Simplify option handling in pg_ctl.
Now that the in-tree getopt_long() moves non-options to the end of argv (see commit 411b720), we can remove pg_ctl's workaround for getopt_long() implementations that don't reorder argv. Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/20230713034903.GA991765%40nathanxps13
1 parent e08d74c commit 03d1080

File tree

1 file changed

+128
-140
lines changed

1 file changed

+128
-140
lines changed

src/bin/pg_ctl/pg_ctl.c

Lines changed: 128 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,163 +2260,151 @@ main(int argc, char **argv)
22602260
if (env_wait != NULL)
22612261
wait_seconds = atoi(env_wait);
22622262

2263-
/*
2264-
* 'Action' can be before or after args so loop over both. Some
2265-
* getopt_long() implementations will reorder argv[] to place all flags
2266-
* first (GNU?), but we don't rely on it. Our /port version doesn't do
2267-
* that.
2268-
*/
2269-
optind = 1;
2270-
22712263
/* process command-line options */
2272-
while (optind < argc)
2264+
while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW",
2265+
long_options, &option_index)) != -1)
22732266
{
2274-
while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW",
2275-
long_options, &option_index)) != -1)
2267+
switch (c)
22762268
{
2277-
switch (c)
2278-
{
2279-
case 'D':
2280-
{
2281-
char *pgdata_D;
2282-
2283-
pgdata_D = pg_strdup(optarg);
2284-
canonicalize_path(pgdata_D);
2285-
setenv("PGDATA", pgdata_D, 1);
2286-
2287-
/*
2288-
* We could pass PGDATA just in an environment
2289-
* variable but we do -D too for clearer postmaster
2290-
* 'ps' display
2291-
*/
2292-
pgdata_opt = psprintf("-D \"%s\" ", pgdata_D);
2293-
free(pgdata_D);
2294-
break;
2295-
}
2296-
case 'e':
2297-
event_source = pg_strdup(optarg);
2298-
break;
2299-
case 'l':
2300-
log_file = pg_strdup(optarg);
2301-
break;
2302-
case 'm':
2303-
set_mode(optarg);
2304-
break;
2305-
case 'N':
2306-
register_servicename = pg_strdup(optarg);
2307-
break;
2308-
case 'o':
2309-
/* append option? */
2310-
if (!post_opts)
2311-
post_opts = pg_strdup(optarg);
2312-
else
2313-
{
2314-
char *old_post_opts = post_opts;
2315-
2316-
post_opts = psprintf("%s %s", old_post_opts, optarg);
2317-
free(old_post_opts);
2318-
}
2319-
break;
2320-
case 'p':
2321-
exec_path = pg_strdup(optarg);
2322-
break;
2323-
case 'P':
2324-
register_password = pg_strdup(optarg);
2325-
break;
2326-
case 's':
2327-
silent_mode = true;
2269+
case 'D':
2270+
{
2271+
char *pgdata_D;
2272+
2273+
pgdata_D = pg_strdup(optarg);
2274+
canonicalize_path(pgdata_D);
2275+
setenv("PGDATA", pgdata_D, 1);
2276+
2277+
/*
2278+
* We could pass PGDATA just in an environment variable
2279+
* but we do -D too for clearer postmaster 'ps' display
2280+
*/
2281+
pgdata_opt = psprintf("-D \"%s\" ", pgdata_D);
2282+
free(pgdata_D);
23282283
break;
2329-
case 'S':
2284+
}
2285+
case 'e':
2286+
event_source = pg_strdup(optarg);
2287+
break;
2288+
case 'l':
2289+
log_file = pg_strdup(optarg);
2290+
break;
2291+
case 'm':
2292+
set_mode(optarg);
2293+
break;
2294+
case 'N':
2295+
register_servicename = pg_strdup(optarg);
2296+
break;
2297+
case 'o':
2298+
/* append option? */
2299+
if (!post_opts)
2300+
post_opts = pg_strdup(optarg);
2301+
else
2302+
{
2303+
char *old_post_opts = post_opts;
2304+
2305+
post_opts = psprintf("%s %s", old_post_opts, optarg);
2306+
free(old_post_opts);
2307+
}
2308+
break;
2309+
case 'p':
2310+
exec_path = pg_strdup(optarg);
2311+
break;
2312+
case 'P':
2313+
register_password = pg_strdup(optarg);
2314+
break;
2315+
case 's':
2316+
silent_mode = true;
2317+
break;
2318+
case 'S':
23302319
#ifdef WIN32
2331-
set_starttype(optarg);
2320+
set_starttype(optarg);
23322321
#else
2333-
write_stderr(_("%s: -S option not supported on this platform\n"),
2334-
progname);
2335-
exit(1);
2322+
write_stderr(_("%s: -S option not supported on this platform\n"),
2323+
progname);
2324+
exit(1);
23362325
#endif
2337-
break;
2338-
case 't':
2339-
wait_seconds = atoi(optarg);
2340-
wait_seconds_arg = true;
2341-
break;
2342-
case 'U':
2343-
if (strchr(optarg, '\\'))
2344-
register_username = pg_strdup(optarg);
2345-
else
2346-
/* Prepend .\ for local accounts */
2347-
register_username = psprintf(".\\%s", optarg);
2348-
break;
2349-
case 'w':
2350-
do_wait = true;
2351-
break;
2352-
case 'W':
2353-
do_wait = false;
2354-
break;
2355-
case 'c':
2356-
allow_core_files = true;
2357-
break;
2358-
default:
2359-
/* getopt_long already issued a suitable error message */
2360-
do_advice();
2361-
exit(1);
2362-
}
2326+
break;
2327+
case 't':
2328+
wait_seconds = atoi(optarg);
2329+
wait_seconds_arg = true;
2330+
break;
2331+
case 'U':
2332+
if (strchr(optarg, '\\'))
2333+
register_username = pg_strdup(optarg);
2334+
else
2335+
/* Prepend .\ for local accounts */
2336+
register_username = psprintf(".\\%s", optarg);
2337+
break;
2338+
case 'w':
2339+
do_wait = true;
2340+
break;
2341+
case 'W':
2342+
do_wait = false;
2343+
break;
2344+
case 'c':
2345+
allow_core_files = true;
2346+
break;
2347+
default:
2348+
/* getopt_long already issued a suitable error message */
2349+
do_advice();
2350+
exit(1);
23632351
}
2352+
}
23642353

2365-
/* Process an action */
2366-
if (optind < argc)
2354+
/* Process an action */
2355+
if (optind < argc)
2356+
{
2357+
if (strcmp(argv[optind], "init") == 0
2358+
|| strcmp(argv[optind], "initdb") == 0)
2359+
ctl_command = INIT_COMMAND;
2360+
else if (strcmp(argv[optind], "start") == 0)
2361+
ctl_command = START_COMMAND;
2362+
else if (strcmp(argv[optind], "stop") == 0)
2363+
ctl_command = STOP_COMMAND;
2364+
else if (strcmp(argv[optind], "restart") == 0)
2365+
ctl_command = RESTART_COMMAND;
2366+
else if (strcmp(argv[optind], "reload") == 0)
2367+
ctl_command = RELOAD_COMMAND;
2368+
else if (strcmp(argv[optind], "status") == 0)
2369+
ctl_command = STATUS_COMMAND;
2370+
else if (strcmp(argv[optind], "promote") == 0)
2371+
ctl_command = PROMOTE_COMMAND;
2372+
else if (strcmp(argv[optind], "logrotate") == 0)
2373+
ctl_command = LOGROTATE_COMMAND;
2374+
else if (strcmp(argv[optind], "kill") == 0)
23672375
{
2368-
if (ctl_command != NO_COMMAND)
2376+
if (argc - optind < 3)
23692377
{
2370-
write_stderr(_("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind]);
2378+
write_stderr(_("%s: missing arguments for kill mode\n"), progname);
23712379
do_advice();
23722380
exit(1);
23732381
}
2374-
2375-
if (strcmp(argv[optind], "init") == 0
2376-
|| strcmp(argv[optind], "initdb") == 0)
2377-
ctl_command = INIT_COMMAND;
2378-
else if (strcmp(argv[optind], "start") == 0)
2379-
ctl_command = START_COMMAND;
2380-
else if (strcmp(argv[optind], "stop") == 0)
2381-
ctl_command = STOP_COMMAND;
2382-
else if (strcmp(argv[optind], "restart") == 0)
2383-
ctl_command = RESTART_COMMAND;
2384-
else if (strcmp(argv[optind], "reload") == 0)
2385-
ctl_command = RELOAD_COMMAND;
2386-
else if (strcmp(argv[optind], "status") == 0)
2387-
ctl_command = STATUS_COMMAND;
2388-
else if (strcmp(argv[optind], "promote") == 0)
2389-
ctl_command = PROMOTE_COMMAND;
2390-
else if (strcmp(argv[optind], "logrotate") == 0)
2391-
ctl_command = LOGROTATE_COMMAND;
2392-
else if (strcmp(argv[optind], "kill") == 0)
2393-
{
2394-
if (argc - optind < 3)
2395-
{
2396-
write_stderr(_("%s: missing arguments for kill mode\n"), progname);
2397-
do_advice();
2398-
exit(1);
2399-
}
2400-
ctl_command = KILL_COMMAND;
2401-
set_sig(argv[++optind]);
2402-
killproc = atol(argv[++optind]);
2403-
}
2382+
ctl_command = KILL_COMMAND;
2383+
set_sig(argv[++optind]);
2384+
killproc = atol(argv[++optind]);
2385+
}
24042386
#ifdef WIN32
2405-
else if (strcmp(argv[optind], "register") == 0)
2406-
ctl_command = REGISTER_COMMAND;
2407-
else if (strcmp(argv[optind], "unregister") == 0)
2408-
ctl_command = UNREGISTER_COMMAND;
2409-
else if (strcmp(argv[optind], "runservice") == 0)
2410-
ctl_command = RUN_AS_SERVICE_COMMAND;
2387+
else if (strcmp(argv[optind], "register") == 0)
2388+
ctl_command = REGISTER_COMMAND;
2389+
else if (strcmp(argv[optind], "unregister") == 0)
2390+
ctl_command = UNREGISTER_COMMAND;
2391+
else if (strcmp(argv[optind], "runservice") == 0)
2392+
ctl_command = RUN_AS_SERVICE_COMMAND;
24112393
#endif
2412-
else
2413-
{
2414-
write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]);
2415-
do_advice();
2416-
exit(1);
2417-
}
2418-
optind++;
2394+
else
2395+
{
2396+
write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]);
2397+
do_advice();
2398+
exit(1);
24192399
}
2400+
optind++;
2401+
}
2402+
2403+
if (optind < argc)
2404+
{
2405+
write_stderr(_("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind]);
2406+
do_advice();
2407+
exit(1);
24202408
}
24212409

24222410
if (ctl_command == NO_COMMAND)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy