Command-line parsing in pg_ctl is not portable

Started by Peter Eisentrautabout 21 years ago2 messages
#1Peter Eisentraut
peter_e@gmx.net

The command-line argument parsing in pg_ctl is not portable. This is the
output on a glibc system:

$ pg_ctl start stop
pg_ctl: too many command-line arguments (first is "start")

But:

$ POSIXLY_CORRECT=1 pg_ctl start stop
pg_ctl: too many command-line arguments (first is "stop")

This is probably because GNU getopt rearranges the arguments, and since pg_ctl
uses two while loops to try to allow non-option arguments before options,
things may get reordered multiple times.

Now this particular case is minor trouble, but I wonder in what other
situations arguments will get reordered where the order does make a
difference.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

#2Bruce Momjian
pgman@candle.pha.pa.us
In reply to: Peter Eisentraut (#1)
Re: Command-line parsing in pg_ctl is not portable

Peter Eisentraut wrote:

The command-line argument parsing in pg_ctl is not portable. This is the
output on a glibc system:

$ pg_ctl start stop
pg_ctl: too many command-line arguments (first is "start")

But:

$ POSIXLY_CORRECT=1 pg_ctl start stop
pg_ctl: too many command-line arguments (first is "stop")

This is probably because GNU getopt rearranges the arguments, and since pg_ctl
uses two while loops to try to allow non-option arguments before options,
things may get reordered multiple times.

Now this particular case is minor trouble, but I wonder in what other
situations arguments will get reordered where the order does make a
difference.

Yea, I found that GNU getopt reordering thing to be very strange. I can
imagine some risks to such reordering. Fortunately we don't have any
other commands where we have to do this weird double-calls.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073