Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

+128-140
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)