Patch to copy dirs - Mailing list pgsql-patches

From Bruce Momjian
Subject Patch to copy dirs
Date
Msg-id 200305151758.h4FHweA03313@candle.pha.pa.us
Whole thread Raw
List pgsql-patches
It turns out that while xcopy works for Win32, you can't run it as a
service because you don't have a window.  This patch adds a Win32
version of 'cp' as copydir.

Applied.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: configure
===================================================================
RCS file: /cvsroot/pgsql-server/configure,v
retrieving revision 1.259
diff -c -c -r1.259 configure
*** configure    15 May 2003 16:35:23 -0000    1.259
--- configure    15 May 2003 17:53:31 -0000
***************
*** 11395,11402 ****
  esac

  # Win32 can't to rename or unlink on an open file
! case $host_os in win32*|mingw*)
! LIBOBJS="$LIBOBJS dirmod.$ac_objext" ;;
  esac

  if test "$with_readline" = yes; then
--- 11395,11403 ----
  esac

  # Win32 can't to rename or unlink on an open file
! case $host_os in mingw*)
! LIBOBJS="$LIBOBJS dirmod.$ac_objext"
! LIBOBJS="$LIBOBJS copydir.$ac_objext" ;;
  esac

  if test "$with_readline" = yes; then
Index: configure.in
===================================================================
RCS file: /cvsroot/pgsql-server/configure.in,v
retrieving revision 1.250
diff -c -c -r1.250 configure.in
*** configure.in    15 May 2003 16:35:27 -0000    1.250
--- configure.in    15 May 2003 17:53:32 -0000
***************
*** 863,870 ****
  esac

  # Win32 can't to rename or unlink on an open file
! case $host_os in win32*|mingw*)
! AC_LIBOBJ(dirmod) ;;
  esac

  if test "$with_readline" = yes; then
--- 863,871 ----
  esac

  # Win32 can't to rename or unlink on an open file
! case $host_os in mingw*)
! AC_LIBOBJ(dirmod)
! AC_LIBOBJ(copydir) ;;
  esac

  if test "$with_readline" = yes; then
Index: src/backend/commands/dbcommands.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/commands/dbcommands.c,v
retrieving revision 1.114
diff -c -c -r1.114 dbcommands.c
*** src/backend/commands/dbcommands.c    7 May 2003 03:47:08 -0000    1.114
--- src/backend/commands/dbcommands.c    15 May 2003 17:53:34 -0000
***************
*** 311,321 ****
      /* 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)
      {
          if (remove_dbdirs(nominal_loc, alt_loc))
              elog(ERROR, "CREATE DATABASE: could not initialize database directory");
--- 311,320 ----
      /* 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
!     if (copydir(src_loc, target_dir) != 0)
  #endif
      {
          if (remove_dbdirs(nominal_loc, alt_loc))
              elog(ERROR, "CREATE DATABASE: could not initialize database directory");
/*
 *    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;
}

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Win32 patch to allow compilation
Next
From: Sean Chittenden
Date:
Subject: Removal of krb4 support...