aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure5
-rw-r--r--configure.in7
-rw-r--r--src/backend/commands/dbcommands.c7
-rw-r--r--src/port/copydir.c44
4 files changed, 54 insertions, 9 deletions
diff --git a/configure b/configure
index 1a09a822687..bd84605af0f 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 774f439829b..670e5960d7e 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 1c3b554c291..bd436878189 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);
+ if (system(buf) != 0)
#else
- snprintf(buf, sizeof(buf), "xcopy /e /i /q '%s' '%s'", src_loc, target_dir);
+ if (copydir(src_loc, target_dir) != 0)
#endif
-
- if (system(buf) != 0)
{
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 00000000000..cd39f4d07ee
--- /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;
+}