@ -4,7 +4,7 @@
*
* Portions Copyright ( c ) 1996 - 2009 , PostgreSQL Global Development Group
*
* $ PostgreSQL : pgsql / src / bin / pg_ctl / pg_ctl . c , v 1.115 2009 / 11 / 14 15 : 39 : 36 mha Exp $
* $ PostgreSQL : pgsql / src / bin / pg_ctl / pg_ctl . c , v 1.116 2009 / 12 / 10 06 : 32 : 28 petere Exp $
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -57,6 +57,7 @@ typedef enum
typedef enum
{
NO_COMMAND = 0 ,
INIT_COMMAND ,
START_COMMAND ,
STOP_COMMAND ,
RESTART_COMMAND ,
@ -82,7 +83,7 @@ static char *pgdata_opt = NULL;
static char * post_opts = NULL ;
static const char * progname ;
static char * log_file = NULL ;
static char * postgres _path = NULL ;
static char * exec _path = NULL ;
static char * register_servicename = " PostgreSQL " ; /* FIXME: + version ID? */
static char * register_username = NULL ;
static char * register_password = NULL ;
@ -100,6 +101,7 @@ static void do_advice(void);
static void do_help ( void ) ;
static void set_mode ( char * modeopt ) ;
static void set_sig ( char * signame ) ;
static void do_init ( void ) ;
static void do_start ( void ) ;
static void do_stop ( void ) ;
static void do_restart ( void ) ;
@ -358,11 +360,11 @@ start_postmaster(void)
*/
if ( log_file ! = NULL )
snprintf ( cmd , MAXPGPATH , SYSTEMQUOTE " \" %s \" %s%s < \" %s \" >> \" %s \" 2>&1 & " SYSTEMQUOTE ,
postgres _path, pgdata_opt , post_opts ,
exec _path, pgdata_opt , post_opts ,
DEVNULL , log_file ) ;
else
snprintf ( cmd , MAXPGPATH , SYSTEMQUOTE " \" %s \" %s%s < \" %s \" 2>&1 & " SYSTEMQUOTE ,
postgres _path, pgdata_opt , post_opts , DEVNULL ) ;
exec _path, pgdata_opt , post_opts , DEVNULL ) ;
return system ( cmd ) ;
# else /* WIN32 */
@ -376,10 +378,10 @@ start_postmaster(void)
if ( log_file ! = NULL )
snprintf ( cmd , MAXPGPATH , " CMD /C " SYSTEMQUOTE " \" %s \" %s%s < \" %s \" >> \" %s \" 2>&1 " SYSTEMQUOTE ,
postgres _path, pgdata_opt , post_opts , DEVNULL , log_file ) ;
exec _path, pgdata_opt , post_opts , DEVNULL , log_file ) ;
else
snprintf ( cmd , MAXPGPATH , " CMD /C " SYSTEMQUOTE " \" %s \" %s%s < \" %s \" 2>&1 " SYSTEMQUOTE ,
postgres _path, pgdata_opt , post_opts , DEVNULL ) ;
exec _path, pgdata_opt , post_opts , DEVNULL ) ;
if ( ! CreateRestrictedProcess ( cmd , & pi , false ) )
return GetLastError ( ) ;
@ -607,13 +609,70 @@ read_post_opts(void)
* name */
post_opts = arg1 + 1 ; /* point past whitespace */
}
if ( postgres _path = = NULL )
postgres _path = optline ;
if ( exec _path = = NULL )
exec _path = optline ;
}
}
}
}
static char *
find_other_exec_or_die ( const char * argv0 , const char * target , const char * versionstr )
{
int ret ;
char * found_path ;
found_path = pg_malloc ( MAXPGPATH ) ;
if ( ( ret = find_other_exec ( argv0 , target , versionstr , found_path ) ) < 0 )
{
char full_path [ MAXPGPATH ] ;
if ( find_my_exec ( argv0 , full_path ) < 0 )
strlcpy ( full_path , progname , sizeof ( full_path ) ) ;
if ( ret = = - 1 )
write_stderr ( _ ( " The program \" %s \" is needed by %s "
" but was not found in the \n "
" same directory as \" %s \" . \n "
" Check your installation. \n " ) ,
target , progname , full_path ) ;
else
write_stderr ( _ ( " The program \" %s \" was found by \" %s \" \n "
" but was not the same version as %s. \n "
" Check your installation. \n " ) ,
target , full_path , progname ) ;
exit ( 1 ) ;
}
return found_path ;
}
static void
do_init ( void )
{
char cmd [ MAXPGPATH ] ;
if ( exec_path = = NULL )
exec_path = find_other_exec_or_die ( argv0 , " initdb " , " initdb (PostgreSQL) " PG_VERSION " \n " ) ;
if ( post_opts = = NULL )
post_opts = " " ;
if ( ! silent_mode )
snprintf ( cmd , MAXPGPATH , SYSTEMQUOTE " \" %s \" %s%s " SYSTEMQUOTE ,
exec_path , pgdata_opt , post_opts ) ;
else
snprintf ( cmd , MAXPGPATH , SYSTEMQUOTE " \" %s \" %s%s > \" %s \" " SYSTEMQUOTE ,
exec_path , pgdata_opt , post_opts , DEVNULL ) ;
if ( system ( cmd ) ! = 0 )
{
write_stderr ( _ ( " %s: database system initialization failed \n " ) , progname ) ;
exit ( 1 ) ;
}
}
static void
do_start ( void )
{
@ -636,36 +695,8 @@ do_start(void)
if ( ctl_command = = RESTART_COMMAND | | pgdata_opt = = NULL )
pgdata_opt = " " ;
if ( postgres_path = = NULL )
{
char * postmaster_path ;
int ret ;
postmaster_path = pg_malloc ( MAXPGPATH ) ;
if ( ( ret = find_other_exec ( argv0 , " postgres " , PG_BACKEND_VERSIONSTR ,
postmaster_path ) ) < 0 )
{
char full_path [ MAXPGPATH ] ;
if ( find_my_exec ( argv0 , full_path ) < 0 )
strlcpy ( full_path , progname , sizeof ( full_path ) ) ;
if ( ret = = - 1 )
write_stderr ( _ ( " The program \" postgres \" is needed by %s "
" but was not found in the \n "
" same directory as \" %s \" . \n "
" Check your installation. \n " ) ,
progname , full_path ) ;
else
write_stderr ( _ ( " The program \" postgres \" was found by \" %s \" \n "
" but was not the same version as %s. \n "
" Check your installation. \n " ) ,
full_path , progname ) ;
exit ( 1 ) ;
}
postgres_path = postmaster_path ;
}
if ( exec_path = = NULL )
exec_path = find_other_exec_or_die ( argv0 , " postgres " , PG_BACKEND_VERSIONSTR ) ;
# if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
if ( allow_core_files )
@ -1536,6 +1567,7 @@ do_help(void)
printf ( _ ( " %s is a utility to start, stop, restart, reload configuration files, \n "
" report the status of a PostgreSQL server, or signal a PostgreSQL process. \n \n " ) , progname ) ;
printf ( _ ( " Usage: \n " ) ) ;
printf ( _ ( " %s init[db] [-D DATADIR] [-s] [-o \" OPTIONS \" ] \n " ) , progname ) ;
printf ( _ ( " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \" OPTIONS \" ] \n " ) , progname ) ;
printf ( _ ( " %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] \n " ) , progname ) ;
printf ( _ ( " %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] \n "
@ -1568,7 +1600,7 @@ do_help(void)
# endif
printf ( _ ( " -l, --log FILENAME write (or append) server log to FILENAME \n " ) ) ;
printf ( _ ( " -o OPTIONS command line options to pass to postgres \n "
" (PostgreSQL server executable) \n " ) ) ;
" (PostgreSQL server executable) or initdb \n " ) ) ;
printf ( _ ( " -p PATH-TO-POSTGRES normally not necessary \n " ) ) ;
printf ( _ ( " \n Options for stop or restart: \n " ) ) ;
printf ( _ ( " -m SHUTDOWN-MODE can be \" smart \" , \" fast \" , or \" immediate \" \n " ) ) ;
@ -1770,7 +1802,7 @@ main(int argc, char **argv)
post_opts = xstrdup ( optarg ) ;
break ;
case ' p ' :
postgres _path = xstrdup ( optarg ) ;
exec _path = xstrdup ( optarg ) ;
break ;
case ' P ' :
register_password = xstrdup ( optarg ) ;
@ -1825,7 +1857,10 @@ main(int argc, char **argv)
exit ( 1 ) ;
}
if ( strcmp ( argv [ optind ] , " start " ) = = 0 )
if ( strcmp ( argv [ optind ] , " init " ) = = 0
| | strcmp ( argv [ optind ] , " initdb " ) = = 0 )
ctl_command = INIT_COMMAND ;
else if ( strcmp ( argv [ optind ] , " start " ) = = 0 )
ctl_command = START_COMMAND ;
else if ( strcmp ( argv [ optind ] , " stop " ) = = 0 )
ctl_command = STOP_COMMAND ;
@ -1922,6 +1957,9 @@ main(int argc, char **argv)
switch ( ctl_command )
{
case INIT_COMMAND :
do_init ( ) ;
break ;
case STATUS_COMMAND :
do_status ( ) ;
break ;