From bb17a98e3c08d20f5c12191127632df5a8879351 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sun, 13 Feb 2005 16:50:44 +0000
Subject: [PATCH] Print file name and errno string on rmtree failure.

Backpatch to 8.0.X.
---
 src/port/dirmod.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/port/dirmod.c b/src/port/dirmod.c
index 6220b4e4045..ce47e722f4b 100644
--- a/src/port/dirmod.c
+++ b/src/port/dirmod.c
@@ -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;
 }
-- 
GitLab