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

Reply via email to