Print file name and errno string on rmtree failure.
authorBruce Momjian
Sun, 13 Feb 2005 16:50:44 +0000 (16:50 +0000)
committerBruce Momjian
Sun, 13 Feb 2005 16:50:44 +0000 (16:50 +0000)
Backpatch to 8.0.X.

src/port/dirmod.c

index 6220b4e4045b164f8f0c392fa6e97b557d9a3f3a..ce47e722f4b6d9ecdef3dbdcdb79660a6dec0d37 100644 (file)
@@ -10,7 +10,7 @@
  * Win32 (NT, Win2k, XP).  replace() doesn't work on Win95/98/Me.
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/dirmod.c,v 1.34 2004/12/31 22:03:53 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/port/dirmod.c,v 1.35 2005/02/13 16:50:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -350,6 +350,7 @@ fnames(char *path)
    return filenames;
 }
 
+
 /*
  * fnames_cleanup
  *
@@ -366,6 +367,7 @@ fnames_cleanup(char **filenames)
    pfree(filenames);
 }
 
+
 /*
  * rmtree
  *
@@ -398,16 +400,14 @@ rmtree(char *path, bool rmtopdir)
        snprintf(filepath, MAXPGPATH, "%s/%s", path, *filename);
 
        if (stat(filepath, &statbuf) != 0)
-       {
-           fnames_cleanup(filenames);
-           return false;
-       }
+           goto report_and_fail;
 
        if (S_ISDIR(statbuf.st_mode))
        {
            /* call ourselves recursively for a directory */
            if (!rmtree(filepath, true))
            {
+               /* we already reported the error */
                fnames_cleanup(filenames);
                return false;
            }
@@ -415,22 +415,26 @@ rmtree(char *path, bool rmtopdir)
        else
        {
            if (unlink(filepath) != 0)
-           {
-               fnames_cleanup(filenames);
-               return false;
-           }
+               goto report_and_fail;
        }
    }
 
    if (rmtopdir)
    {
        if (rmdir(path) != 0)
-       {
-           fnames_cleanup(filenames);
-           return false;
-       }
+           goto report_and_fail;
    }
 
    fnames_cleanup(filenames);
    return true;
+
+report_and_fail:
+
+#ifndef FRONTEND
+   elog(WARNING, "could not remove file or directory \"%s\": %m", filepath);
+#else
+   fprintf(stderr, "could not remove file or directory \"%s\": %s\n", filepath, strerror(errno));
+#endif
+   fnames_cleanup(filenames);
+   return false;
 }