* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
+
#include "config.h"
+
+#ifdef WITH_NTFS_3G
+#include <ntfs-3g/endians.h>
+#include <ntfs-3g/types.h>
+#endif
+
#include "wimlib_internal.h"
#include <ntfs-3g/attrib.h>
#include <ntfs-3g/misc.h>
#include <ntfs-3g/reparse.h>
-#include <ntfs-3g/security.h>
+#include <ntfs-3g/security.h> /* security.h before xattrs.h */
+#include <ntfs-3g/xattrs.h>
#include <ntfs-3g/volume.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
-#ifndef WITH_NEW_NTFS_3G
+#if 0
extern int ntfs_get_inode_security(ntfs_inode *ni, u32 selection, char *buf,
u32 buflen, u32 *psize);
lte = NULL;
} else {
if (type == AT_REPARSE_POINT && data_size < 8) {
- ERROR("`%s': reparse point buffer too small");
+ ERROR("`%s': reparse point buffer too small",
+ path);
ret = WIMLIB_ERR_NTFS_3G;
goto out_put_actx;
}
lte->ntfs_loc = ntfs_loc;
lte->resource_location = RESOURCE_IN_NTFS_VOLUME;
if (type == AT_REPARSE_POINT) {
- dentry->reparse_tag = reparse_tag;
+ dentry->inode->reparse_tag = reparse_tag;
ntfs_loc->is_reparse_point = true;
lte->resource_entry.original_size = data_size - 8;
lte->resource_entry.size = data_size - 8;
}
if (name_length == 0) {
/* Unnamed data stream. Put the reference to it in the
- * dentry. */
- if (dentry->lte) {
+ * dentry's inode. */
+ if (dentry->inode->lte) {
ERROR("Found two un-named data streams for "
"`%s'", path);
ret = WIMLIB_ERR_NTFS_3G;
goto out_free_lte;
}
- dentry->lte = lte;
+ dentry->inode->lte = lte;
} else {
/* Named data stream. Put the reference to it in the
* alternate data stream entries */
&stream_name_utf8_len);
if (!stream_name_utf8)
goto out_free_lte;
- new_ads_entry = dentry_add_ads(dentry, stream_name_utf8);
+ new_ads_entry = inode_add_ads(dentry->inode, stream_name_utf8);
FREE(stream_name_utf8);
if (!new_ads_entry)
goto out_free_lte;
return 0;
}
+/*#define HAVE_NTFS_INODE_FUNCTIONS*/
+
/* Recursively build a WIM dentry tree corresponding to a NTFS volume.
* At the same time, update the WIM lookup table with lookup table entries for
* the NTFS streams, and build an array of security descriptors.
struct dentry *root;
mrec_flags = ni->mrec->flags;
+#ifdef HAVE_NTFS_INODE_FUNCTIONS
attributes = ntfs_get_inode_attributes(ni);
+#else
+ struct SECURITY_CONTEXT ctx;
+ memset(&ctx, 0, sizeof(ctx));
+ ctx.vol = ni->vol;
+ ret = ntfs_xattr_system_getxattr(&ctx, XATTR_NTFS_ATTRIB,
+ ni, dir_ni, (char *)&attributes,
+ sizeof(u32));
+ if (ret != 4) {
+ ERROR_WITH_ERRNO("Failed to get NTFS attributes from `%s'",
+ path);
+ return WIMLIB_ERR_NTFS_3G;
+ }
+#endif
if (exclude_path(path, config, false)) {
if (flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) {
if (flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE)
printf("Scanning `%s'\n", path);
- root = new_dentry(path_basename(path));
+ root = new_dentry_with_inode(path_basename(path));
if (!root)
return WIMLIB_ERR_NOMEM;
*root_p = root;
if (ret != 0)
return ret;
} else {
+ #ifdef ENODATA
if (errno != ENODATA) {
ERROR_WITH_ERRNO("Error getting DOS name "
"of `%s'", path);
return WIMLIB_ERR_NTFS_3G;
}
+ #endif
}
}
- root->creation_time = le64_to_cpu(ni->creation_time);
- root->last_write_time = le64_to_cpu(ni->last_data_change_time);
- root->last_access_time = le64_to_cpu(ni->last_access_time);
- root->attributes = le32_to_cpu(attributes);
- root->link_group_id = ni->mft_no;
- root->resolved = true;
+ root->inode->creation_time = le64_to_cpu(ni->creation_time);
+ root->inode->last_write_time = le64_to_cpu(ni->last_data_change_time);
+ root->inode->last_access_time = le64_to_cpu(ni->last_access_time);
+ root->inode->attributes = le32_to_cpu(attributes);
+ root->inode->ino = ni->mft_no;
+ root->inode->resolved = true;
if (attributes & FILE_ATTR_REPARSE_POINT) {
/* Junction point, symbolic link, or other reparse point */
if (ret != 0)
return ret;
+#ifdef HAVE_NTFS_INODE_FUNCTIONS
ret = ntfs_get_inode_security(ni,
OWNER_SECURITY_INFORMATION |
GROUP_SECURITY_INFORMATION |
} else {
if (ret > 0) {
/*print_security_descriptor(sd, sd_size);*/
- root->security_id = sd_set_add_sd(sd_set, sd, sd_size);
+ root->security_id = sd_set_add_sd(sd_set, sd, ret);
if (root->security_id == -1) {
ERROR("Out of memory");
return WIMLIB_ERR_NOMEM;
}
ret = 0;
}
+#else
+ char _sd[1];
+ char *sd = _sd;
+ errno = 0;
+ ret = ntfs_xattr_system_getxattr(&ctx, XATTR_NTFS_ACL,
+ ni, dir_ni, sd,
+ sizeof(sd));
+ if (ret > sizeof(sd)) {
+ sd = alloca(ret);
+ ret = ntfs_xattr_system_getxattr(&ctx, XATTR_NTFS_ACL,
+ ni, dir_ni, sd, ret);
+ }
+ if (ret > 0) {
+ root->inode->security_id = sd_set_add_sd(sd_set, sd, ret);
+ if (root->inode->security_id == -1) {
+ ERROR("Out of memory");
+ return WIMLIB_ERR_NOMEM;
+ }
+ DEBUG("Added security ID = %u for `%s'",
+ root->inode->security_id, path);
+ ret = 0;
+ } else if (ret < 0) {
+ ERROR_WITH_ERRNO("Failed to get security information from "
+ "`%s'", path);
+ ret = WIMLIB_ERR_NTFS_3G;
+ } else {
+ root->inode->security_id = -1;
+ DEBUG("No security ID for `%s'", path);
+ }
+#endif
return ret;
}