]> err.no Git - dpkg/commitdiff
Additionally check if errno is EEXIST after rmdir(2)
authorGuillem Jover <guillem@debian.org>
Fri, 18 Jan 2008 04:41:21 +0000 (06:41 +0200)
committerGuillem Jover <guillem@debian.org>
Fri, 18 Jan 2008 04:41:21 +0000 (06:41 +0200)
SUSv3 specifies that on non-empty directories it can either return
that or ENOTEMPTY. This should fix run time problems on Solaris.

ChangeLog
debian/changelog
src/help.c
src/remove.c

index f2613576fc4762d85089ff58ef48793c39a52172..34000b1e127f24efb4f0cdc4e52cbb31786ca942 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-01-18  Guillem Jover  <guillem@debian.org>
+
+       * src/remove.c (ensure_pathname_nonexisting): Additionally check if
+       errno is EEXIST after calling rmdir, per SUSv3 when the directory
+       is not empty errno can be ENOTEMPTY or EEXIST.
+       * src/help.c (removal_bulk_remove_files): Likewise.
+       (removal_bulk_remove_leftover_dirs): Likewise.
+
 2008-01-18  Guillem Jover  <guillem@debian.org>
 
        * scripts/update-alternatives.pl: Stop parsing '--test' as a valid
index 734aada43d3c63b329cb3b91785a63218791455a..d69001938b1434a6e4269f9375af849bea0c8139 100644 (file)
@@ -16,6 +16,9 @@ dpkg (1.14.16) UNRELEASED; urgency=low
     Based on a patch by Samuel Thibault.
   * Remove unimplemented --test option from update-alternatives.
     Closes: #392432, #461247
+  * Additionally check if errno is EEXIST after rmdir(2), as SUSv3 specifies
+    that on non-empty directories it can either return that or ENOTEMPTY.
+    This fixes run time problems on Solaris.
 
   [ Frank Lichtenheld ]
   * Make the -L option of dpkg-parsechangelog actually work (it's
index 5c0b8009d9fed63049ed8dabed312d94878dff66..b6401ab973c0f64d90a1d98ab2232108fa984d68 100644 (file)
@@ -510,7 +510,7 @@ void ensure_pathname_nonexisting(const char *pathname) {
     if (!chmodsafe_unlink(pathname, &failed)) return; /* OK, it was */
     if (errno == ENOTDIR) return;
   }
-  if (errno != ENOTEMPTY) { /* Huh ? */
+  if (errno != ENOTEMPTY && errno != EEXIST) { /* Huh ? */
     char mbuf[250];
     snprintf(mbuf, sizeof(mbuf), N_("failed to %s `%%.255s'"), failed);
     ohshite(_(mbuf),pathname);
index 4a4316786f18da6297f8f3fd3378b99271709416..e98517026c189f018debef833771e00e3d9b7e4e 100644 (file)
@@ -249,7 +249,7 @@ static void removal_bulk_remove_files(
       }
       debug(dbg_eachfiledetail, "removal_bulk removing `%s'", fnvb.buf);
       if (!rmdir(fnvb.buf) || errno == ENOENT || errno == ELOOP) continue;
-      if (errno == ENOTEMPTY) {
+      if (errno == ENOTEMPTY || errno == EEXIST) {
        debug(dbg_eachfiledetail, "removal_bulk `%s' was not empty, will try again later",
              fnvb.buf);
         push_leftover(&leftover,namenode);
@@ -364,7 +364,7 @@ static void removal_bulk_remove_leftover_dirs(struct pkginfo *pkg) {
 
     debug(dbg_eachfiledetail, "removal_bulk removing `%s'", fnvb.buf);
     if (!rmdir(fnvb.buf) || errno == ENOENT || errno == ELOOP) continue;
-    if (errno == ENOTEMPTY) {
+    if (errno == ENOTEMPTY || errno == EEXIST) {
       fprintf(stderr,
               _("dpkg - warning: while removing %.250s, directory `%.250s' not empty "
               "so not removed.\n"),