/* * Place the directory entry tree @branch at the path @target_tstr in the WIM * image. * * @target_tstr cannot contain trailing slashes, and all path separators must be * WIM_PATH_SEPARATOR. * * On success, @branch is committed to the journal @j. * Otherwise @branch is freed. * * The relevant @add_flags are WIMLIB_ADD_FLAG_NO_REPLACE and * WIMLIB_ADD_FLAG_VERBOSE. */ static int attach_branch(struct wim_dentry *branch, const tchar *target_tstr, struct update_command_journal *j, int add_flags, wimlib_progress_func_t progfunc, void *progctx) { int ret; const utf16lechar *target; ret = 0; if (unlikely(!branch)) goto out; ret = tstr_get_utf16le(target_tstr, &target); if (ret) goto out_free_branch; BUILD_BUG_ON(WIM_PATH_SEPARATOR != OS_PREFERRED_PATH_SEPARATOR); ret = dentry_set_name(branch, path_basename(target_tstr)); if (ret) goto out_free_target; ret = do_attach_branch(branch, target, j, add_flags, progfunc, progctx); if (ret) goto out_free_target; /* branch was successfully committed to the journal */ branch = NULL; out_free_target: tstr_put_utf16le(target); out_free_branch: free_dentry_tree(branch, j->lookup_table); out: return ret; }
JS_EXPORT_API void desktop_set_rich_dir_name(GFile* dir, const char* name) { char* new_name = g_strconcat(DEEPIN_RICH_DIR, name, NULL); dentry_set_name(dir, new_name); g_free(new_name); }
/* Rename a file or directory in the WIM. * * This returns a -errno value. * * The journal @j is optional. */ int rename_wim_path(WIMStruct *wim, const tchar *from, const tchar *to, CASE_SENSITIVITY_TYPE case_type, struct update_command_journal *j) { struct wim_dentry *src; struct wim_dentry *dst; struct wim_dentry *parent_of_dst; int ret; /* This rename() implementation currently only supports actual files * (not alternate data streams) */ src = get_dentry(wim, from, case_type); if (!src) return -errno; dst = get_dentry(wim, to, case_type); if (dst) { /* Destination file exists */ if (src == dst) /* Same file */ return 0; if (!dentry_is_directory(src)) { /* Cannot rename non-directory to directory. */ if (dentry_is_directory(dst)) return -EISDIR; } else { /* Cannot rename directory to a non-directory or a non-empty * directory */ if (!dentry_is_directory(dst)) return -ENOTDIR; if (dentry_has_children(dst)) return -ENOTEMPTY; } parent_of_dst = dst->d_parent; } else { /* Destination does not exist */ parent_of_dst = get_parent_dentry(wim, to, case_type); if (!parent_of_dst) return -errno; if (!dentry_is_directory(parent_of_dst)) return -ENOTDIR; } /* @src can't be an ancestor of @dst. Otherwise we're unlinking @src * from the tree and creating a loop... */ if (is_ancestor(src, parent_of_dst)) return -EBUSY; if (j) { if (dst) if (journaled_unlink(j, dst)) return -ENOMEM; if (journaled_unlink(j, src)) return -ENOMEM; if (journaled_change_name(j, src, path_basename(to))) return -ENOMEM; if (journaled_link(j, src, parent_of_dst)) return -ENOMEM; } else { ret = dentry_set_name(src, path_basename(to)); if (ret) return -ENOMEM; if (dst) { unlink_dentry(dst); free_dentry_tree(dst, wim->lookup_table); } unlink_dentry(src); dentry_add_child(parent_of_dst, src); } if (src->_full_path) for_dentry_in_tree(src, free_dentry_full_path, NULL); return 0; }