* GPL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
return rc;
}
+/* Recursively remove directory and its contents */
+int lr_rm_recursive(struct lr_info *info)
+{
+ int rc;
+
+ snprintf(info->cmd, PATH_MAX, "rm -rf %s", info->dest);
+ rc = system(info->cmd);
+ if (rc == -1)
+ rc = -errno;
+
+ return rc;
+}
+
/* Remove a file under SPECIAL_DIR with its tfid as its name. */
int lr_rm_special(struct lr_info *info)
{
/* Is f2p(pfid) present on the target? If not, the parent has
moved */
if (!mkspecial) {
- snprintf(info->dest, PATH_MAX, "%s%s", status->ls_targets[0],
+ snprintf(info->dest, PATH_MAX, "%s/%s", status->ls_targets[0],
info->path);
if (access(info->dest, F_OK) != 0)
mkspecial = 1;
}
for (info->target_no = 0; info->target_no < status->ls_num_targets;
info->target_no++) {
- snprintf(info->dest, PATH_MAX, "%s%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s",
status->ls_targets[info->target_no], info->savedpath);
lr_get_FID_PATH(status->ls_source, info->tfid, info->src,
PATH_MAX);
rc = rc1;
continue;
}
- snprintf(info->dest, PATH_MAX, "%s%s/%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s/%s",
status->ls_targets[info->target_no], info->path,
info->name);
rc1 = lr_rmfile(info);
lr_debug(DINFO, "remove: %s; rc1=%d, errno=%d\n",
info->dest, rc1, errno);
+ if (rc1 == -ENOTEMPTY)
+ rc1 = lr_rm_recursive(info);
+
if (rc1) {
rc = rc1;
continue;
info->target_no++) {
if (!rc_dest) {
- snprintf(info->dest, PATH_MAX, "%s%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s",
status->ls_targets[info->target_no],
ext->path);
if (access(info->dest, F_OK) != 0) {
rc_dest = -errno;
} else {
- snprintf(info->dest, PATH_MAX, "%s%s/%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s/%s",
status->ls_targets[info->target_no],
ext->path, ext->name);
}
}
if (!rc_src)
- snprintf(info->src, PATH_MAX, "%s%s/%s",
+ snprintf(info->src, PATH_MAX, "%s/%s/%s",
status->ls_targets[info->target_no],
info->path, info->name);
if (rc_src == -ENOENT || (access(info->src, F_OK) != 0 &&
len = strlen(info->path) - strlen(info->name);
if (len > 0 && strcmp(info->path + len,
info->name) == 0)
- snprintf(info->dest, PATH_MAX, "%s%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s",
status->ls_targets[info->target_no],
info->path);
else if (info->src[0] == 0)
- snprintf(info->src, PATH_MAX, "%s%s",
+ snprintf(info->src, PATH_MAX, "%s/%s",
status->ls_targets[info->target_no],
info->path);
}
for (info->target_no = 0; info->target_no < status->ls_num_targets;
info->target_no++) {
- snprintf(info->dest, PATH_MAX, "%s%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s",
status->ls_targets[info->target_no], info->path);
lr_debug(DINFO, "setattr: %s %s %s", info->src, info->dest,
info->tfid);
for (info->target_no = 0; info->target_no < status->ls_num_targets;
info->target_no++) {
- snprintf(info->dest, PATH_MAX, "%s%s",
+ snprintf(info->dest, PATH_MAX, "%s/%s",
status->ls_targets[info->target_no], info->path);
lr_debug(DINFO, "setxattr: %s %s %s\n", info->src, info->dest,
info->tfid);
if (statuslog != NULL)
printf("Statuslog: %s\n", statuslog);
printf("Changelog registration: %s\n", status->ls_registration);
- printf("Starting changelog record: %lld\n", status->ls_last_recno);
+ printf("Starting changelog record: "LPD64"\n", status->ls_last_recno);
if (noxattr)
printf("Replicate xattrs: no\n");
if (noclear)