mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Fix our getopt_long's behavior for a command line argument of just "-".
src/port/getopt_long.c failed on such an argument, always seeing it as an unrecognized switch. This is unhelpful; better is to treat such an item as a non-switch argument. That behavior is what we find in GNU's getopt_long(); it's what src/port/getopt.c does; and it is required by POSIX for getopt(), which getopt_long() ought to be generally a superset of. Moreover, it's expected by ecpg, which intends an argument of "-" to mean "read from stdin". So fix it. Also add some documentation about ecpg's behavior in this area, since that was miserably underdocumented. I had to reverse-engineer it from the code. Per bug #16304 from James Gray. Back-patch to all supported branches, since this has been broken forever. Discussion: https://postgr.es/m/16304-c662b00a1322db7f@postgresql.org
This commit is contained in:
@ -79,14 +79,22 @@ getopt_long(int argc, char *const argv[],
|
||||
|
||||
place++;
|
||||
|
||||
if (place[0] && place[0] == '-' && place[1] == '\0')
|
||||
{ /* found "--" */
|
||||
if (!*place)
|
||||
{
|
||||
/* treat "-" as not being an option */
|
||||
place = EMSG;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (place[0] == '-' && place[1] == '\0')
|
||||
{
|
||||
/* found "--", treat it as end of options */
|
||||
++optind;
|
||||
place = EMSG;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (place[0] && place[0] == '-' && place[1])
|
||||
if (place[0] == '-' && place[1])
|
||||
{
|
||||
/* long option */
|
||||
size_t namelen;
|
||||
|
Reference in New Issue
Block a user