Alvaro Herrera napsal(a):
Zdenek Kotala wrote:
If I looked correctly there is no getopt_long. There is only getopt with
- as a option. See PostmasterMain:
while ((opt = getopt(argc, argv,
"A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
If I understand correctly the POSIX standard "-" should not used in a
option list.
Hmm, right. Our current parsing of --long-opts is quite a hack, it
seems :-( Having to list all GUC options in the getopt_long array would
be a mess. Any other ideas?
I attached patch which replaces any "--..." occurrence with "-c..." on
command line.
Zdenek
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /zfs_data/cvs_pgsql/cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.552
diff -c -r1.552 postmaster.c
*** src/backend/postmaster/postmaster.c 20 Feb 2008 22:46:24 -0000 1.552
--- src/backend/postmaster/postmaster.c 22 Feb 2008 09:32:15 -0000
***************
*** 483,490 ****
* Parse command-line options. CAUTION: keep this in sync with
* tcop/postgres.c (the option sets should not conflict) and with the
* common help() function in main/main.c.
*/
! while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
{
switch (opt)
{
--- 483,511 ----
* Parse command-line options. CAUTION: keep this in sync with
* tcop/postgres.c (the option sets should not conflict) and with the
* common help() function in main/main.c.
+ *
+ * We want to support --NAME=VALUE args type, but getopt_long is not suitable
+ * for porcessing all GUC variables and we cannot use "-" as in a getopt option
+ * list, because it is not supported on some platforms.
+ * Regarding this issues a preprocessing which replaces "--" with "-c" is necessary.
*/
!
! for(int n=0; n<argc ; n++)
! {
! int arglen;
! arglen = strlen(argv[n]);
! if(arglen >= 2)
! {
! if(argv[n][0] == '-' && argv[n][1] == '-')
! {
! if(arglen == 2)
! break; // we found -- end of option list
! argv[n][1]='c';
! }
! }
! }
!
! while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:")) != -1)
{
switch (opt)
{
***************
*** 617,623 ****
break;
case 'c':
- case '-':
{
char *name,
*value;
--- 638,643 ----
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend