@ -45,25 +45,10 @@ typedef struct _resultmap
} _resultmap ;
} _resultmap ;
/*
/*
* Values obtained from pg_config_paths . h and Makefile . The PG installation
* Values obtained from Makefile .
* paths are only used in temp_install mode : we use these strings to find
* out where " make install " will put stuff under the temp_install directory .
* In non - temp_install mode , the only thing we need is the location of psql ,
* which we expect to find in psqldir , or in the PATH if psqldir isn ' t given .
*
* XXX Because pg_regress is not installed in bindir , we can ' t support
* this for relocatable trees as it is . - - psqldir would need to be
* specified in those cases .
*/
*/
char * bindir = PGBINDIR ;
char * libdir = LIBDIR ;
char * datadir = PGSHAREDIR ;
char * host_platform = HOST_TUPLE ;
char * host_platform = HOST_TUPLE ;
# ifndef WIN32_ONLY_COMPILER
static char * makeprog = MAKEPROG ;
# endif
# ifndef WIN32 /* not used in WIN32 case */
# ifndef WIN32 /* not used in WIN32 case */
static char * shellprog = SHELLPROG ;
static char * shellprog = SHELLPROG ;
# endif
# endif
@ -86,7 +71,7 @@ _stringlist *dblist = NULL;
bool debug = false ;
bool debug = false ;
char * inputdir = " . " ;
char * inputdir = " . " ;
char * outputdir = " . " ;
char * outputdir = " . " ;
char * psql dir = PGBINDIR ;
char * bin dir = PGBINDIR ;
char * launcher = NULL ;
char * launcher = NULL ;
static _stringlist * loadlanguage = NULL ;
static _stringlist * loadlanguage = NULL ;
static _stringlist * loadextension = NULL ;
static _stringlist * loadextension = NULL ;
@ -94,9 +79,8 @@ static int max_connections = 0;
static char * encoding = NULL ;
static char * encoding = NULL ;
static _stringlist * schedulelist = NULL ;
static _stringlist * schedulelist = NULL ;
static _stringlist * extra_tests = NULL ;
static _stringlist * extra_tests = NULL ;
static char * temp_install = NULL ;
static char * temp_instance = NULL ;
static char * temp_config = NULL ;
static char * temp_config = NULL ;
static char * top_builddir = NULL ;
static bool nolocale = false ;
static bool nolocale = false ;
static bool use_existing = false ;
static bool use_existing = false ;
static char * hostname = NULL ;
static char * hostname = NULL ;
@ -105,7 +89,6 @@ static bool port_specified_by_user = false;
static char * dlpath = PKGLIBDIR ;
static char * dlpath = PKGLIBDIR ;
static char * user = NULL ;
static char * user = NULL ;
static _stringlist * extraroles = NULL ;
static _stringlist * extraroles = NULL ;
static _stringlist * extra_install = NULL ;
static char * config_auth_datadir = NULL ;
static char * config_auth_datadir = NULL ;
/* internal variables */
/* internal variables */
@ -282,8 +265,10 @@ stop_postmaster(void)
fflush ( stderr ) ;
fflush ( stderr ) ;
snprintf ( buf , sizeof ( buf ) ,
snprintf ( buf , sizeof ( buf ) ,
" \" %s/pg_ctl \" stop -D \" %s/data \" -s -m fast " ,
" \" %s%spg_ctl \" stop -D \" %s/data \" -s -m fast " ,
bindir , temp_install ) ;
bindir ? bindir : " " ,
bindir ? " / " : " " ,
temp_instance ) ;
r = system ( buf ) ;
r = system ( buf ) ;
if ( r ! = 0 )
if ( r ! = 0 )
{
{
@ -730,27 +715,6 @@ doputenv(const char *var, const char *val)
putenv ( s ) ;
putenv ( s ) ;
}
}
/*
* Set the environment variable " pathname " , prepending " addval " to its
* old value ( if any ) .
*/
static void
add_to_path ( const char * pathname , char separator , const char * addval )
{
char * oldval = getenv ( pathname ) ;
char * newval ;
if ( ! oldval | | ! oldval [ 0 ] )
{
/* no previous value */
newval = psprintf ( " %s=%s " , pathname , addval ) ;
}
else
newval = psprintf ( " %s=%s%c%s " , pathname , addval , separator , oldval ) ;
putenv ( newval ) ;
}
/*
/*
* Prepare environment variables for running regression tests
* Prepare environment variables for running regression tests
*/
*/
@ -825,7 +789,7 @@ initialize_environment(void)
putenv ( new_pgoptions ) ;
putenv ( new_pgoptions ) ;
}
}
if ( temp_install )
if ( temp_instance )
{
{
/*
/*
* Clear out any environment vars that might cause psql to connect to
* Clear out any environment vars that might cause psql to connect to
@ -863,49 +827,6 @@ initialize_environment(void)
sprintf ( s , " %d " , port ) ;
sprintf ( s , " %d " , port ) ;
doputenv ( " PGPORT " , s ) ;
doputenv ( " PGPORT " , s ) ;
}
}
/*
* GNU make stores some flags in the MAKEFLAGS environment variable to
* pass arguments to its own children . If we are invoked by make ,
* that causes the make invoked by us to think its part of the make
* task invoking us , and so it tries to communicate with the toplevel
* make . Which fails .
*
* Unset the variable to protect against such problems . We also reset
* MAKELEVEL to be certain the child doesn ' t notice the make above us .
*/
unsetenv ( " MAKEFLAGS " ) ;
unsetenv ( " MAKELEVEL " ) ;
/*
* Adjust path variables to point into the temp - install tree
*/
bindir = psprintf ( " %s/install/%s " , temp_install , bindir ) ;
libdir = psprintf ( " %s/install/%s " , temp_install , libdir ) ;
datadir = psprintf ( " %s/install/%s " , temp_install , datadir ) ;
/* psql will be installed into temp-install bindir */
psqldir = bindir ;
/*
* Set up shared library paths to include the temp install .
*
* LD_LIBRARY_PATH covers many platforms . DYLD_LIBRARY_PATH works on
* Darwin , and maybe other Mach - based systems . LIBPATH is for AIX .
* Windows needs shared libraries in PATH ( only those linked into
* executables , not dlopen ' ed ones ) . Feel free to account for others
* as well .
*/
add_to_path ( " LD_LIBRARY_PATH " , ' : ' , libdir ) ;
add_to_path ( " DYLD_LIBRARY_PATH " , ' : ' , libdir ) ;
add_to_path ( " LIBPATH " , ' : ' , libdir ) ;
# if defined(WIN32)
add_to_path ( " PATH " , ' ; ' , libdir ) ;
# elif defined(__CYGWIN__)
add_to_path ( " PATH " , ' : ' , libdir ) ;
# endif
}
}
else
else
{
{
@ -1158,8 +1079,8 @@ psql_command(const char *database, const char *query,...)
/* And now we can build and execute the shell command */
/* And now we can build and execute the shell command */
snprintf ( psql_cmd , sizeof ( psql_cmd ) ,
snprintf ( psql_cmd , sizeof ( psql_cmd ) ,
" \" %s%spsql \" -X -c \" %s \" \" %s \" " ,
" \" %s%spsql \" -X -c \" %s \" \" %s \" " ,
psqldir ? psql dir : " " ,
bindir ? bin dir : " " ,
psql dir ? " / " : " " ,
bin dir ? " / " : " " ,
query_escaped ,
query_escaped ,
database ) ;
database ) ;
@ -2051,21 +1972,18 @@ help(void)
printf ( _ ( " --outputdir=DIR place output files in DIR (default \" . \" ) \n " ) ) ;
printf ( _ ( " --outputdir=DIR place output files in DIR (default \" . \" ) \n " ) ) ;
printf ( _ ( " --schedule=FILE use test ordering schedule from FILE \n " ) ) ;
printf ( _ ( " --schedule=FILE use test ordering schedule from FILE \n " ) ) ;
printf ( _ ( " (can be used multiple times to concatenate) \n " ) ) ;
printf ( _ ( " (can be used multiple times to concatenate) \n " ) ) ;
printf ( _ ( " --temp-install=DIR create a temporary installation in DIR \n " ) ) ;
printf ( _ ( " --temp-instance=DIR create a temporary instance in DIR \n " ) ) ;
printf ( _ ( " --use-existing use an existing installation \n " ) ) ;
printf ( _ ( " --use-existing use an existing installation \n " ) ) ; // XXX
printf ( _ ( " \n " ) ) ;
printf ( _ ( " \n " ) ) ;
printf ( _ ( " Options for \" temp-install \" mode: \n " ) ) ;
printf ( _ ( " Options for \" temp-instance \" mode: \n " ) ) ;
printf ( _ ( " --extra-install=DIR additional directory to install (e.g., contrib) \n " ) ) ;
printf ( _ ( " --no-locale use C locale \n " ) ) ;
printf ( _ ( " --no-locale use C locale \n " ) ) ;
printf ( _ ( " --port=PORT start postmaster on PORT \n " ) ) ;
printf ( _ ( " --port=PORT start postmaster on PORT \n " ) ) ;
printf ( _ ( " --temp-config=FILE append contents of FILE to temporary config \n " ) ) ;
printf ( _ ( " --temp-config=FILE append contents of FILE to temporary config \n " ) ) ;
printf ( _ ( " --top-builddir=DIR (relative) path to top level build directory \n " ) ) ;
printf ( _ ( " \n " ) ) ;
printf ( _ ( " \n " ) ) ;
printf ( _ ( " Options for using an existing installation: \n " ) ) ;
printf ( _ ( " Options for using an existing installation: \n " ) ) ;
printf ( _ ( " --host=HOST use postmaster running on HOST \n " ) ) ;
printf ( _ ( " --host=HOST use postmaster running on HOST \n " ) ) ;
printf ( _ ( " --port=PORT use postmaster running at PORT \n " ) ) ;
printf ( _ ( " --port=PORT use postmaster running at PORT \n " ) ) ;
printf ( _ ( " --user=USER connect as USER \n " ) ) ;
printf ( _ ( " --user=USER connect as USER \n " ) ) ;
printf ( _ ( " --psqldir=DIR use psql in DIR (default: configured bindir) \n " ) ) ;
printf ( _ ( " \n " ) ) ;
printf ( _ ( " \n " ) ) ;
printf ( _ ( " The exit status is 0 if all tests passed, 1 if some tests failed, and 2 \n " ) ) ;
printf ( _ ( " The exit status is 0 if all tests passed, 1 if some tests failed, and 2 \n " ) ) ;
printf ( _ ( " if the tests could not be run for some reason. \n " ) ) ;
printf ( _ ( " if the tests could not be run for some reason. \n " ) ) ;
@ -2087,20 +2005,18 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
{ " encoding " , required_argument , NULL , 6 } ,
{ " encoding " , required_argument , NULL , 6 } ,
{ " outputdir " , required_argument , NULL , 7 } ,
{ " outputdir " , required_argument , NULL , 7 } ,
{ " schedule " , required_argument , NULL , 8 } ,
{ " schedule " , required_argument , NULL , 8 } ,
{ " temp-install " , required_argument , NULL , 9 } ,
{ " temp-instance " , required_argument , NULL , 9 } ,
{ " no-locale " , no_argument , NULL , 10 } ,
{ " no-locale " , no_argument , NULL , 10 } ,
{ " top-builddir " , required_argument , NULL , 11 } ,
{ " host " , required_argument , NULL , 13 } ,
{ " host " , required_argument , NULL , 13 } ,
{ " port " , required_argument , NULL , 14 } ,
{ " port " , required_argument , NULL , 14 } ,
{ " user " , required_argument , NULL , 15 } ,
{ " user " , required_argument , NULL , 15 } ,
{ " psql dir" , required_argument , NULL , 16 } ,
{ " bin dir" , required_argument , NULL , 16 } ,
{ " dlpath " , required_argument , NULL , 17 } ,
{ " dlpath " , required_argument , NULL , 17 } ,
{ " create-role " , required_argument , NULL , 18 } ,
{ " create-role " , required_argument , NULL , 18 } ,
{ " temp-config " , required_argument , NULL , 19 } ,
{ " temp-config " , required_argument , NULL , 19 } ,
{ " use-existing " , no_argument , NULL , 20 } ,
{ " use-existing " , no_argument , NULL , 20 } ,
{ " launcher " , required_argument , NULL , 21 } ,
{ " launcher " , required_argument , NULL , 21 } ,
{ " load-extension " , required_argument , NULL , 22 } ,
{ " load-extension " , required_argument , NULL , 22 } ,
{ " extra-install " , required_argument , NULL , 23 } ,
{ " config-auth " , required_argument , NULL , 24 } ,
{ " config-auth " , required_argument , NULL , 24 } ,
{ NULL , 0 , NULL , 0 }
{ NULL , 0 , NULL , 0 }
} ;
} ;
@ -2172,14 +2088,11 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
add_stringlist_item ( & schedulelist , optarg ) ;
add_stringlist_item ( & schedulelist , optarg ) ;
break ;
break ;
case 9 :
case 9 :
temp_install = make_absolute_path ( optarg ) ;
temp_instance = make_absolute_path ( optarg ) ;
break ;
break ;
case 10 :
case 10 :
nolocale = true ;
nolocale = true ;
break ;
break ;
case 11 :
top_builddir = strdup ( optarg ) ;
break ;
case 13 :
case 13 :
hostname = strdup ( optarg ) ;
hostname = strdup ( optarg ) ;
break ;
break ;
@ -2191,9 +2104,11 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
user = strdup ( optarg ) ;
user = strdup ( optarg ) ;
break ;
break ;
case 16 :
case 16 :
/* "--psqldir=" should mean to use PATH */
/* "--bindir=" means to use PATH */
if ( strlen ( optarg ) )
if ( strlen ( optarg ) )
psqldir = strdup ( optarg ) ;
bindir = strdup ( optarg ) ;
else
bindir = NULL ;
break ;
break ;
case 17 :
case 17 :
dlpath = strdup ( optarg ) ;
dlpath = strdup ( optarg ) ;
@ -2213,9 +2128,6 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
case 22 :
case 22 :
add_stringlist_item ( & loadextension , optarg ) ;
add_stringlist_item ( & loadextension , optarg ) ;
break ;
break ;
case 23 :
add_stringlist_item ( & extra_install , optarg ) ;
break ;
case 24 :
case 24 :
config_auth_datadir = pstrdup ( optarg ) ;
config_auth_datadir = pstrdup ( optarg ) ;
break ;
break ;
@ -2244,7 +2156,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
exit ( 0 ) ;
exit ( 0 ) ;
}
}
if ( temp_install & & ! port_specified_by_user )
if ( temp_instance & & ! port_specified_by_user )
/*
/*
* To reduce chances of interference with parallel installations , use
* To reduce chances of interference with parallel installations , use
@ -2270,83 +2182,45 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
unlimit_core_size ( ) ;
unlimit_core_size ( ) ;
# endif
# endif
if ( temp_install )
if ( temp_instance )
{
{
FILE * pg_conf ;
FILE * pg_conf ;
_stringlist * sl ;
/*
/*
* Prepare the temp installatio n
* Prepare the temp instance
*/
*/
if ( ! top_builddir )
{
fprintf ( stderr , _ ( " --top-builddir must be specified when using --temp-install \n " ) ) ;
exit ( 2 ) ;
}
if ( directory_exists ( temp_install ) )
if ( directory_exists ( temp_instance ) )
{
{
header ( _ ( " removing existing temp installatio n " ) ) ;
header ( _ ( " removing existing temp instance " ) ) ;
if ( ! rmtree ( temp_install , true ) )
if ( ! rmtree ( temp_instance , true ) )
{
{
fprintf ( stderr , _ ( " \n %s: could not remove temp installatio n \" %s \" \n " ) ,
fprintf ( stderr , _ ( " \n %s: could not remove temp instance \" %s \" \n " ) ,
progname , temp_install ) ;
progname , temp_instance ) ;
exit ( 2 ) ;
exit ( 2 ) ;
}
}
}
}
header ( _ ( " creating temporary installatio n " ) ) ;
header ( _ ( " creating temporary instance " ) ) ;
/* make the temp install top directory */
/* make the temp instance top directory */
make_directory ( temp_install ) ;
make_directory ( temp_instance ) ;
/* and a directory for log files */
/* and a directory for log files */
snprintf ( buf , sizeof ( buf ) , " %s/log " , outputdir ) ;
snprintf ( buf , sizeof ( buf ) , " %s/log " , temp_instance ) ;
if ( ! directory_exists ( buf ) )
if ( ! directory_exists ( buf ) )
make_directory ( buf ) ;
make_directory ( buf ) ;
/* "make install" */
# ifndef WIN32_ONLY_COMPILER
snprintf ( buf , sizeof ( buf ) ,
" \" %s \" -C \" %s \" DESTDIR= \" %s/install \" install > \" %s/log/install.log \" 2>&1 " ,
makeprog , top_builddir , temp_install , outputdir ) ;
# else
snprintf ( buf , sizeof ( buf ) ,
" perl \" %s/src/tools/msvc/install.pl \" \" %s/install \" > \" %s/log/install.log \" 2>&1 " ,
top_builddir , temp_install , outputdir ) ;
# endif
if ( system ( buf ) )
{
fprintf ( stderr , _ ( " \n %s: installation failed \n Examine %s/log/install.log for the reason. \n Command was: %s \n " ) , progname , outputdir , buf ) ;
exit ( 2 ) ;
}
for ( sl = extra_install ; sl ! = NULL ; sl = sl - > next )
{
# ifndef WIN32_ONLY_COMPILER
snprintf ( buf , sizeof ( buf ) ,
" \" %s \" -C \" %s/%s \" DESTDIR= \" %s/install \" install >> \" %s/log/install.log \" 2>&1 " ,
makeprog , top_builddir , sl - > str , temp_install , outputdir ) ;
# else
fprintf ( stderr , _ ( " \n %s: --extra-install option not supported on this platform \n " ) , progname ) ;
exit ( 2 ) ;
# endif
if ( system ( buf ) )
{
fprintf ( stderr , _ ( " \n %s: installation failed \n Examine %s/log/install.log for the reason. \n Command was: %s \n " ) , progname , outputdir , buf ) ;
exit ( 2 ) ;
}
}
/* initdb */
/* initdb */
header ( _ ( " initializing database system " ) ) ;
header ( _ ( " initializing database system " ) ) ;
snprintf ( buf , sizeof ( buf ) ,
snprintf ( buf , sizeof ( buf ) ,
" \" %s/initdb \" -D \" %s/data \" -L \" %s \" --noclean --nosync%s%s > \" %s/log/initdb.log \" 2>&1 " ,
" \" %s%sinitdb \" -D \" %s/data \" --noclean --nosync%s%s > \" %s/log/initdb.log \" 2>&1 " ,
bindir , temp_install , datadir ,
bindir ? bindir : " " ,
bindir ? " / " : " " ,
temp_instance ,
debug ? " --debug " : " " ,
debug ? " --debug " : " " ,
nolocale ? " --no-locale " : " " ,
nolocale ? " --no-locale " : " " ,
outputdir ) ;
temp_instance ) ;
if ( system ( buf ) )
if ( system ( buf ) )
{
{
fprintf ( stderr , _ ( " \n %s: initdb failed \n Examine %s/log/initdb.log for the reason. \n Command was: %s \n " ) , progname , outputdir , buf ) ;
fprintf ( stderr , _ ( " \n %s: initdb failed \n Examine %s/log/initdb.log for the reason. \n Command was: %s \n " ) , progname , outputdir , buf ) ;
@ -2361,7 +2235,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
* failures , don ' t set max_prepared_transactions any higher than
* failures , don ' t set max_prepared_transactions any higher than
* actually needed by the prepared_xacts regression test . )
* actually needed by the prepared_xacts regression test . )
*/
*/
snprintf ( buf , sizeof ( buf ) , " %s/data/postgresql.conf " , temp_install ) ;
snprintf ( buf , sizeof ( buf ) , " %s/data/postgresql.conf " , temp_instance ) ;
pg_conf = fopen ( buf , " a " ) ;
pg_conf = fopen ( buf , " a " ) ;
if ( pg_conf = = NULL )
if ( pg_conf = = NULL )
{
{
@ -2399,7 +2273,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
* Since we successfully used the same buffer for the much - longer
* Since we successfully used the same buffer for the much - longer
* " initdb " command , this can ' t truncate .
* " initdb " command , this can ' t truncate .
*/
*/
snprintf ( buf , sizeof ( buf ) , " %s/data " , temp_install ) ;
snprintf ( buf , sizeof ( buf ) , " %s/data " , temp_instance ) ;
config_sspi_auth ( buf ) ;
config_sspi_auth ( buf ) ;
# elif !defined(HAVE_UNIX_SOCKETS)
# elif !defined(HAVE_UNIX_SOCKETS)
# error Platform has no means to secure the test installation.
# error Platform has no means to secure the test installation.
@ -2409,8 +2283,10 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
* Check if there is a postmaster running already .
* Check if there is a postmaster running already .
*/
*/
snprintf ( buf2 , sizeof ( buf2 ) ,
snprintf ( buf2 , sizeof ( buf2 ) ,
" \" %s/psql \" -X postgres <%s 2>%s " ,
" \" %s%spsql \" -X postgres <%s 2>%s " ,
bindir , DEVNULL , DEVNULL ) ;
bindir ? bindir : " " ,
bindir ? " / " : " " ,
DEVNULL , DEVNULL ) ;
for ( i = 0 ; i < 16 ; i + + )
for ( i = 0 ; i < 16 ; i + + )
{
{
@ -2441,12 +2317,14 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
*/
*/
header ( _ ( " starting postmaster " ) ) ;
header ( _ ( " starting postmaster " ) ) ;
snprintf ( buf , sizeof ( buf ) ,
snprintf ( buf , sizeof ( buf ) ,
" \" %s/ postgres \" -D \" %s/data \" -F%s "
" \" %s%s postgres \" -D \" %s/data \" -F%s "
" -c \" listen_addresses=%s \" -k \" %s \" "
" -c \" listen_addresses=%s \" -k \" %s \" "
" > \" %s/log/postmaster.log \" 2>&1 " ,
" > \" %s/log/postmaster.log \" 2>&1 " ,
bindir , temp_install , debug ? " -d 5 " : " " ,
bindir ? bindir : " " ,
bindir ? " / " : " " ,
temp_instance , debug ? " -d 5 " : " " ,
hostname ? hostname : " " , sockdir ? sockdir : " " ,
hostname ? hostname : " " , sockdir ? sockdir : " " ,
outputdir ) ;
temp_instance ) ;
postmaster_pid = spawn_process ( buf ) ;
postmaster_pid = spawn_process ( buf ) ;
if ( postmaster_pid = = INVALID_PID )
if ( postmaster_pid = = INVALID_PID )
{
{
@ -2560,23 +2438,23 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
/*
/*
* Shut down temp installation ' s postmaster
* Shut down temp installation ' s postmaster
*/
*/
if ( temp_install )
if ( temp_instance )
{
{
header ( _ ( " shutting down postmaster " ) ) ;
header ( _ ( " shutting down postmaster " ) ) ;
stop_postmaster ( ) ;
stop_postmaster ( ) ;
}
}
/*
/*
* If there were no errors , remove the temp installatio n immediately to
* If there were no errors , remove the temp instance immediately to
* conserve disk space . ( If there were errors , we leave the installatio n
* conserve disk space . ( If there were errors , we leave the instance
* in place for possible manual investigation . )
* in place for possible manual investigation . )
*/
*/
if ( temp_install & & fail_count = = 0 & & fail_ignore_count = = 0 )
if ( temp_instance & & fail_count = = 0 & & fail_ignore_count = = 0 )
{
{
header ( _ ( " removing temporary installatio n " ) ) ;
header ( _ ( " removing temporary instance " ) ) ;
if ( ! rmtree ( temp_install , true ) )
if ( ! rmtree ( temp_instance , true ) )
fprintf ( stderr , _ ( " \n %s: could not remove temp installatio n \" %s \" \n " ) ,
fprintf ( stderr , _ ( " \n %s: could not remove temp instance \" %s \" \n " ) ,
progname , temp_install ) ;
progname , temp_instance ) ;
}
}
fclose ( logfile ) ;
fclose ( logfile ) ;