]> granicus.if.org Git - postgresql/commitdiff
Fix multiple copy and paste-o's. No wonder this code didn't work.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 22 Feb 2010 02:50:10 +0000 (02:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 22 Feb 2010 02:50:10 +0000 (02:50 +0000)
src/port/copydir.c

index 43fd9359c595b1816c19e40d7b3ea591e1564a29..df763daa47f539d708846cf8cbd49caf4d143037 100644 (file)
@@ -11,7 +11,7 @@
  *     as a service.
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/port/copydir.c,v 1.29 2010/02/22 00:11:05 stark Exp $
+ *       $PostgreSQL: pgsql/src/port/copydir.c,v 1.30 2010/02/22 02:50:10 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -90,18 +90,18 @@ copydir(char *fromdir, char *todir, bool recurse)
                else if (S_ISREG(fst.st_mode))
                        copy_file(fromfile, tofile);
        }
-       Free(xldir);
+       FreeDir(xldir);
 
        /*
-        * Be paranoid here and fsync all files to ensure we catch problems.
+        * Be paranoid here and fsync all files to ensure the copy is really done.
         */
-       AllocateDir(fromdir);
+       xldir = AllocateDir(todir);
        if (xldir == NULL)
                ereport(ERROR,
                                (errcode_for_file_access(),
-                                errmsg("could not open directory \"%s\": %m", fromdir)));
+                                errmsg("could not open directory \"%s\": %m", todir)));
 
-       while ((xlde = ReadDir(xldir, fromdir)) != NULL)
+       while ((xlde = ReadDir(xldir, todir)) != NULL)
        {
                struct stat fst;
 
@@ -111,25 +111,29 @@ copydir(char *fromdir, char *todir, bool recurse)
 
                snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
 
-               /* We don't need to sync directories here since the recursive
-                * copydir will do it before it returns */
-               if (lstat(fromfile, &fst) < 0)
+               /*
+                * We don't need to sync subdirectories here since the recursive
+                * copydir will do it before it returns
+                */
+               if (lstat(tofile, &fst) < 0)
                        ereport(ERROR,
                                        (errcode_for_file_access(),
-                                        errmsg("could not stat file \"%s\": %m", fromfile)));
+                                        errmsg("could not stat file \"%s\": %m", tofile)));
+
                if (S_ISREG(fst.st_mode))
-               {
                        fsync_fname(tofile);
-               }
        }
        FreeDir(xldir);
 
 #ifdef NOTYET
-       /* It's important to fsync the destination directory itself as
+       /*
+        * It's important to fsync the destination directory itself as
         * individual file fsyncs don't guarantee that the directory entry
         * for the file is synced. Recent versions of ext4 have made the
         * window much wider but it's been true for ext3 and other
-        * filesystems in the past 
+        * filesystems in the past.
+        *
+        * However we can't do this just yet, it has portability issues.
         */
        fsync_fname(todir);
 #endif
@@ -210,7 +214,6 @@ copy_file(char *fromfile, char *tofile)
 }
 
 
-
 /*
  * fsync a file
  */