]> arthur.barton.de Git - netatalk.git/blobdiff - bin/ad/ad_rm.c
Writing metadata xattr on directories with sticky bit set, FR#94
[netatalk.git] / bin / ad / ad_rm.c
index d940507787c3c403684ebf9af3cbb2c4be1e80a0..b32e659fad5ff73a833a0c6de20575adcde66fb5 100644 (file)
@@ -32,7 +32,6 @@
 #include <atalk/util.h>
 #include <atalk/unix.h>
 #include <atalk/volume.h>
-#include <atalk/volinfo.h>
 #include <atalk/bstrlib.h>
 #include <atalk/bstradd.h>
 #include <atalk/queue.h>
@@ -133,7 +132,7 @@ static void usage_rm(void)
     exit(EXIT_FAILURE);
 }
 
-int ad_rm(int argc, char *argv[])
+int ad_rm(int argc, char *argv[], AFPObj *obj)
 {
     int ch;
 
@@ -166,7 +165,7 @@ int ad_rm(int argc, char *argv[])
 
     for (int i = 0; argv[i] != NULL; i++) {
         /* Load .volinfo file for source */
-        openvol(argv[i], &volume);
+        openvol(obj, argv[i], &volume);
 
         if (nftw(argv[i], rm, upfunc, 20, FTW_DEPTH | FTW_PHYS) == -1) {
             if (alarmed) {
@@ -201,8 +200,8 @@ static int rm(const char *path,
     switch (statp->st_mode & S_IFMT) {
 
     case S_IFLNK:
-        if (volume.volinfo.v_path) {
-            if ((volume.volinfo.v_adouble == AD_VERSION2)
+        if (volume.vol->v_path) {
+            if ((volume.vol->v_adouble == AD_VERSION2)
                 && (strstr(path, ".AppleDouble") != NULL)) {
                 /* symlink inside adouble dir */
                 if (unlink(path) != 0)
@@ -212,8 +211,11 @@ static int rm(const char *path,
 
             /* Get CNID of Parent and add new childir to CNID database */
             pdid = did;
-            cnid = cnid_for_path(&volume.volinfo, &volume.volume, path, &did);
-            if (cnid_delete(volume.volume.v_cdb, cnid) != 0) {
+            if ((cnid = cnid_for_path(volume.vol->v_cdb, volume.vol->v_path, path, &did)) == CNID_INVALID) {
+                SLOG("Error resolving CNID for %s", path);
+                return -1;
+            }
+            if (cnid_delete(volume.vol->v_cdb, cnid) != 0) {
                 SLOG("Error removing CNID %u for %s", ntohl(cnid), path);
                 return -1;
             }
@@ -232,8 +234,8 @@ static int rm(const char *path,
             return FTW_SKIP_SUBTREE;
         }
 
-        if (volume.volinfo.v_path) {
-            if ((volume.volinfo.v_adouble == AD_VERSION2)
+        if (volume.vol->v_path) {
+            if ((volume.vol->v_adouble == AD_VERSION2)
                 && (strstr(path, ".AppleDouble") != NULL)) {
                 /* should be adouble dir itself */
                 if (rmdir(path) != 0) {
@@ -245,8 +247,11 @@ static int rm(const char *path,
             }
 
             /* Get CNID of Parent and add new childir to CNID database */
-            did = cnid_for_path(&volume.volinfo, &volume.volume, path, &pdid);
-            if (cnid_delete(volume.volume.v_cdb, did) != 0) {
+            if ((did = cnid_for_path(volume.vol->v_cdb, volume.vol->v_path, path, &pdid)) == CNID_INVALID) {
+                SLOG("Error resolving CNID for %s", path);
+                return -1;
+            }
+            if (cnid_delete(volume.vol->v_cdb, did) != 0) {
                 SLOG("Error removing CNID %u for %s", ntohl(did), path);
                 return -1;
             }
@@ -277,8 +282,8 @@ static int rm(const char *path,
         break;
 
     default:
-        if (volume.volinfo.v_path) {
-            if ((volume.volinfo.v_adouble == AD_VERSION2)
+        if (volume.vol->v_path) {
+            if ((volume.vol->v_adouble == AD_VERSION2)
                 && (strstr(path, ".AppleDouble") != NULL)) {
                 /* file in adouble dir */
                 if (unlink(path) != 0)
@@ -288,19 +293,17 @@ static int rm(const char *path,
 
             /* Get CNID of Parent and add new childir to CNID database */
             pdid = did;
-            cnid = cnid_for_path(&volume.volinfo, &volume.volume, path, &did);
-            if (cnid_delete(volume.volume.v_cdb, cnid) != 0) {
+            if ((cnid = cnid_for_path(volume.vol->v_cdb, volume.vol->v_path, path, &did)) == CNID_INVALID) {
+                SLOG("Error resolving CNID for %s", path);
+                return -1;
+            }
+            if (cnid_delete(volume.vol->v_cdb, cnid) != 0) {
                 SLOG("Error removing CNID %u for %s", ntohl(cnid), path);
                 return -1;
             }
 
-            if (!Rflag) {
-                if (volume.volume.vfs->vfs_deletefile(&volume.volume, -1, path) != 0) {
-                    SLOG("Error removing adouble file for: %s", path);
-                    badrm = rval = 1;
-                    break;
-                }
-            }
+            /* Ignore errors, because with -R adouble stuff is always alread gone */
+            volume.vol->vfs->vfs_deletefile(volume.vol, -1, path);
         }
 
         if (unlink(path) != 0) {