diff options
author | Bruce Momjian <bruce@momjian.us> | 2003-05-15 17:59:17 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2003-05-15 17:59:17 +0000 |
commit | 09aad5a3a67338e7b2dc83e6b9799c580e6511ab (patch) | |
tree | 6b3c6047dcb47c24d06bacc329c7cb833e15407f /src | |
parent | bee0ac67ee35e578404d7ae476cd3cc82b275154 (diff) | |
download | postgresql-09aad5a3a67338e7b2dc83e6b9799c580e6511ab.tar.gz postgresql-09aad5a3a67338e7b2dc83e6b9799c580e6511ab.zip |
Add copydir() function because xcopy doesn't work in XP without a
window.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/dbcommands.c | 7 | ||||
-rw-r--r-- | src/port/copydir.c | 44 |
2 files changed, 47 insertions, 4 deletions
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; +} |