From 09aad5a3a67338e7b2dc83e6b9799c580e6511ab Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 15 May 2003 17:59:17 +0000 Subject: [PATCH] Add copydir() function because xcopy doesn't work in XP without a window. --- configure | 5 ++-- configure.in | 7 ++--- src/backend/commands/dbcommands.c | 9 +++---- src/port/copydir.c | 44 +++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/port/copydir.c diff --git a/configure b/configure index 1a09a82268..bd84605af0 100755 --- a/configure +++ b/configure @@ -11395,8 +11395,9 @@ LIBOBJS="$LIBOBJS qsort.$ac_objext" ;; esac # Win32 can't to rename or unlink on an open file -case $host_os in win32*|mingw*) -LIBOBJS="$LIBOBJS dirmod.$ac_objext" ;; +case $host_os in mingw*) +LIBOBJS="$LIBOBJS dirmod.$ac_objext" +LIBOBJS="$LIBOBJS copydir.$ac_objext" ;; esac if test "$with_readline" = yes; then diff --git a/configure.in b/configure.in index 774f439829..670e5960d7 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $Header: /cvsroot/pgsql/configure.in,v 1.250 2003/05/15 16:35:27 momjian Exp $ +dnl $Header: /cvsroot/pgsql/configure.in,v 1.251 2003/05/15 17:59:17 momjian Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -863,8 +863,9 @@ AC_LIBOBJ(qsort) ;; esac # Win32 can't to rename or unlink on an open file -case $host_os in win32*|mingw*) -AC_LIBOBJ(dirmod) ;; +case $host_os in mingw*) +AC_LIBOBJ(dirmod) +AC_LIBOBJ(copydir) ;; esac if test "$with_readline" = yes; then diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 1c3b554c29..bd43687818 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.114 2003/05/07 03:47:08 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.115 2003/05/15 17:59:17 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -311,11 +311,10 @@ createdb(const CreatedbStmt *stmt) /* Copy the template database to the new location */ #ifndef WIN32 snprintf(buf, sizeof(buf), "cp -r '%s' '%s'", src_loc, target_dir); -#else - snprintf(buf, sizeof(buf), "xcopy /e /i /q '%s' '%s'", src_loc, target_dir); -#endif - if (system(buf) != 0) +#else + if (copydir(src_loc, target_dir) != 0) +#endif { if (remove_dbdirs(nominal_loc, alt_loc)) elog(ERROR, "CREATE DATABASE: could not initialize database directory"); diff --git a/src/port/copydir.c b/src/port/copydir.c new file mode 100644 index 0000000000..cd39f4d07e --- /dev/null +++ b/src/port/copydir.c @@ -0,0 +1,44 @@ +/* + * While "xcopy /e /i /q" works fine for copying directories, on Windows XP + * it requires an Window handle which prevents it from working when invoked + * as a service. + */ + +#include "postgres.h" + +int +copydir(char *fromdir,char *todir) +{ + DIR *xldir; + struct dirent *xlde; + char fromfl[MAXPGPATH]; + char tofl[MAXPGPATH]; + + if (mkdir(todir) != 0) + { + elog(ERROR, "could not make directory '%s'",todir); + return 1; + } + xldir = opendir(fromdir); + if (xldir == NULL) + { + closedir(xldir); + elog(ERROR, "could not open directory '%s'",fromdir); + return 1; + } + + while ((xlde = readdir(xldir)) != NULL) + { + snprintf(fromfl, MAXPGPATH, "%s/%s", fromdir, xlde->d_name); + snprintf(tofl, MAXPGPATH, "%s/%s", todir, xlde->d_name); + if (CopyFile(fromfl,tofl,TRUE) < 0) + { + closedir(xldir); + elog(ERROR,"could not create file %s\n",todir); + return 1; + } + } + + closedir(xldir); + return 0; +}