X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fntfs-apply.c;h=23526810cf50232e468c2c6aae1b167bddf51f2d;hp=ee1982af7f63d610676f59363fede5d46b94650e;hb=20dac4a44f74de14a71c2445d23f79cf56728cfe;hpb=40de13bf883e1cc67612a6d36a02fd76ee2853d0 diff --git a/src/ntfs-apply.c b/src/ntfs-apply.c index ee1982af..23526810 100644 --- a/src/ntfs-apply.c +++ b/src/ntfs-apply.c @@ -35,10 +35,9 @@ #include #include #include -#include +#include /* security.h before xattrs.h */ +#include #include -#include -#include #include #include @@ -49,7 +48,7 @@ struct ntfs_apply_args { }; -#ifndef WITH_NEW_NTFS_3G +#if 0 extern int ntfs_set_inode_security(ntfs_inode *ni, u32 selection, const char *attr); extern int ntfs_set_inode_attributes(ntfs_inode *ni, u32 attrib); @@ -235,34 +234,58 @@ static int wim_apply_hardlink_ntfs(const struct dentry *from_dentry, return ret; } +/*#define HAVE_NTFS_INODE_FUNCTIONS*/ + static int apply_file_attributes_and_security_data(ntfs_inode *ni, + ntfs_inode *dir_ni, const struct dentry *dentry, const WIMStruct *w) { DEBUG("Setting NTFS file attributes on `%s' to %#"PRIx32, dentry->full_path_utf8, dentry->attributes); - if (ntfs_set_inode_attributes(ni, dentry->attributes)) { + int ret; +#ifdef HAVE_NTFS_INODE_FUNCTIONS + ret = ntfs_set_inode_attributes(ni, dentry->attributes); +#else + struct SECURITY_CONTEXT ctx; + u32 attributes_le32; + attributes_le32 = cpu_to_le32(dentry->attributes); + memset(&ctx, 0, sizeof(ctx)); + ctx.vol = ni->vol; + ret = ntfs_xattr_system_setxattr(&ctx, XATTR_NTFS_ATTRIB, + ni, dir_ni, + (const char*)&attributes_le32, + sizeof(u32), 0); +#endif + if (ret != 0) { ERROR("Failed to set NTFS file attributes on `%s'", dentry->full_path_utf8); return WIMLIB_ERR_NTFS_3G; } - if (dentry->security_id != -1) { const struct wim_security_data *sd; + const char *descriptor; sd = wim_const_security_data(w); wimlib_assert(dentry->security_id < sd->num_entries); + descriptor = sd->descriptors[dentry->security_id]; DEBUG("Applying security descriptor %d to `%s'", dentry->security_id, dentry->full_path_utf8); + + #ifdef HAVE_NTFS_INODE_FUNCTIONS u32 selection = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION; + ret = ntfs_set_inode_security(ni, selection, descriptor); + #else + ntfs_xattr_system_setxattr(&ctx, XATTR_NTFS_ACL, + ni, dir_ni, descriptor, + sd->sizes[dentry->security_id], 0); + #endif - if (ntfs_set_inode_security(ni, selection, - (const char*)sd->descriptors[dentry->security_id])) - { + if (ret != 0) { ERROR_WITH_ERRNO("Failed to set security data on `%s'", dentry->full_path_utf8); return WIMLIB_ERR_NTFS_3G; @@ -464,7 +487,7 @@ static int do_wim_apply_dentry_ntfs(struct dentry *dentry, ntfs_inode *dir_ni, } - ret = apply_file_attributes_and_security_data(ni, dentry, w); + ret = apply_file_attributes_and_security_data(ni, dir_ni, dentry, w); if (ret != 0) goto out_close_dir_ni; @@ -574,7 +597,7 @@ static int wim_apply_root_dentry_ntfs(const struct dentry *dentry, ERROR_WITH_ERRNO("Could not find root NTFS inode"); return WIMLIB_ERR_NTFS_3G; } - ret = apply_file_attributes_and_security_data(ni, dentry, w); + ret = apply_file_attributes_and_security_data(ni, ni, dentry, w); if (ntfs_inode_close(ni) != 0) { ERROR_WITH_ERRNO("Failed to close NTFS inode for root " "directory"); @@ -729,11 +752,18 @@ out: * full filesystem to be applied to the volume. */ WIMLIBAPI int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image, - const char *device, int flags) + const char *device, int flags, + WIMStruct **additional_swms, + unsigned num_additional_swms) { + struct lookup_table *joined_tab, *w_tab_save; int ret; - if (!device) + DEBUG("w->filename = %s, image = %d, device = %s, flags = 0x%x, " + "num_additional_swms = %u", + w->filename, image, device, flags, num_additional_swms); + + if (!w || !device) return WIMLIB_ERR_INVALID_PARAM; if (image == WIM_ALL_IMAGES) { ERROR("Can only apply a single image when applying " @@ -745,16 +775,39 @@ WIMLIBAPI int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image, ERROR("directly to a NTFS volume"); return WIMLIB_ERR_INVALID_PARAM; } - ret = wimlib_select_image(w, image); + + ret = verify_swm_set(w, additional_swms, num_additional_swms); if (ret != 0) return ret; - return do_wim_apply_image_ntfs(w, device, flags); + if (num_additional_swms) { + ret = new_joined_lookup_table(w, additional_swms, + num_additional_swms, &joined_tab); + if (ret != 0) + return ret; + w_tab_save = w->lookup_table; + w->lookup_table = joined_tab; + } + + ret = wimlib_select_image(w, image); + if (ret != 0) + goto out; + + ret = do_wim_apply_image_ntfs(w, device, flags); + +out: + if (num_additional_swms) { + free_lookup_table(w->lookup_table); + w->lookup_table = w_tab_save; + } + return ret; } #else /* WITH_NTFS_3G */ WIMLIBAPI int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image, - const char *device, int flags) + const char *device, int flags, + WIMStruct **additional_swms, + unsigned num_additional_swms) { ERROR("wimlib was compiled without support for NTFS-3g, so"); ERROR("we cannot apply a WIM image directly to a NTFS volume");