#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>
exit(EXIT_FAILURE);
}
-int ad_rm(int argc, char *argv[])
+int ad_rm(int argc, char *argv[], AFPObj *obj)
{
int ch;
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) {
switch (statp->st_mode & S_IFMT) {
case S_IFLNK:
- if (volume.volinfo.v_path) {
- if ((volume.volinfo.v_adouble == AD_VERSION2)
- && STRCMP(path, == , ".AppleDouble")) {
+ if (volume.vol->v_path) {
+ if ((volume.vol->v_adouble == AD_VERSION2)
+ && (strstr(path, ".AppleDouble") != NULL)) {
+ /* symlink inside adouble dir */
if (unlink(path) != 0)
badrm = rval = 1;
break;
/* 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;
}
return FTW_SKIP_SUBTREE;
}
- if (volume.volinfo.v_path) {
- if ((volume.volinfo.v_adouble == AD_VERSION2)
- && STRCMP(path, == , ".AppleDouble")) {
+ 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) {
SLOG("Error removing dir \"%s\": %s", path, strerror(errno));
badrm = rval = 1;
}
/* 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;
}
break;
default:
- if (volume.volinfo.v_path) {
- if ((volume.volinfo.v_adouble == AD_VERSION2)
- && STRCMP(path, == , ".AppleDouble")) {
+ if (volume.vol->v_path) {
+ if ((volume.vol->v_adouble == AD_VERSION2)
+ && (strstr(path, ".AppleDouble") != NULL)) {
+ /* file in adouble dir */
if (unlink(path) != 0)
badrm = rval = 1;
break;
/* 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) {