Re: Errno checks for rmtree() - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Errno checks for rmtree()
Date
Msg-id 200502130153.j1D1rb024663@candle.pha.pa.us
Whole thread Raw
In response to Re: Errno checks for rmtree()  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Errno checks for rmtree()
List pgsql-patches
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > Wow, you want to print out the raw errno number.
>
> No, I didn't say that.  I wanted the strerror result, and that's what
> the code I suggested does.

OK, new version.

--
  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: src/port/dirmod.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/dirmod.c,v
retrieving revision 1.34
diff -c -c -r1.34 dirmod.c
*** src/port/dirmod.c    31 Dec 2004 22:03:53 -0000    1.34
--- src/port/dirmod.c    13 Feb 2005 01:51:35 -0000
***************
*** 350,355 ****
--- 350,356 ----
      return filenames;
  }

+
  /*
   *    fnames_cleanup
   *
***************
*** 366,371 ****
--- 367,373 ----
      pfree(filenames);
  }

+
  /*
   *    rmtree
   *
***************
*** 398,413 ****
          snprintf(filepath, MAXPGPATH, "%s/%s", path, *filename);

          if (stat(filepath, &statbuf) != 0)
!         {
!             fnames_cleanup(filenames);
!             return false;
!         }

          if (S_ISDIR(statbuf.st_mode))
          {
              /* call ourselves recursively for a directory */
              if (!rmtree(filepath, true))
              {
                  fnames_cleanup(filenames);
                  return false;
              }
--- 400,413 ----
          snprintf(filepath, MAXPGPATH, "%s/%s", path, *filename);

          if (stat(filepath, &statbuf) != 0)
!             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,436 ****
          else
          {
              if (unlink(filepath) != 0)
!             {
!                 fnames_cleanup(filenames);
!                 return false;
!             }
          }
      }

      if (rmtopdir)
      {
          if (rmdir(path) != 0)
!         {
!             fnames_cleanup(filenames);
!             return false;
!         }
      }

      fnames_cleanup(filenames);
      return true;
  }
--- 415,440 ----
          else
          {
              if (unlink(filepath) != 0)
!                 goto report_and_fail;
          }
      }

      if (rmtopdir)
      {
          if (rmdir(path) != 0)
!             goto report_and_fail;
      }

      fnames_cleanup(filenames);
      return true;
+
+ report_and_fail:
+
+ #ifndef FRONTEND
+     elog(WARNING, "can not remove \"%s\": %s", filepath, strerror(errno));
+ #else
+     fprintf(stderr, "can not remove \"%s\": %s\n", filepath, strerror(errno));
+ #endif
+     fnames_cleanup(filenames);
+     return false;
  }

pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: Errno checks for rmtree()
Next
From: Tom Lane
Date:
Subject: Re: Errno checks for rmtree()