Adapted code to latest libntfs-3g, based on PERMISSION_HANDLING_BRANCH. Now requires libntfs-3g version 2010.5.22 minimum.

edge.strict_endians
Erik Larsson 2010-07-01 19:16:26 +02:00
parent 16ba09b70f
commit 4a641c85e0
7 changed files with 39 additions and 33 deletions

View File

@ -232,8 +232,8 @@ if test "$enable_fuse_module" != "no"; then
fi fi
AM_CONDITIONAL(ENABLE_FUSE_MODULE, $compile_fuse_module) AM_CONDITIONAL(ENABLE_FUSE_MODULE, $compile_fuse_module)
PKG_CHECK_MODULES(NTFS_3G_MODULE, libntfs-3g >= 2009.4.4, [], PKG_CHECK_MODULES(NTFS_3G_MODULE, libntfs-3g >= 2010.5.22, [],
AC_MSG_ERROR([ntfs-3g.progs requires libntfs-3g version >= 2009.4.4.]) AC_MSG_ERROR([ntfs-3g.progs requires libntfs-3g version >= 2009.5.22.])
) )
# Autodetect whether we can build crypto stuff or not. # Autodetect whether we can build crypto stuff or not.

View File

@ -523,11 +523,15 @@ static BOOL mkntfs_parse_options(int argc, char *argv[], struct mkntfs_options *
/** /**
* mkntfs_time * mkntfs_time
*/ */
static time_t mkntfs_time(void) static struct timespec mkntfs_time(void)
{ {
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 0;
if (!opts.use_epoch_time) if (!opts.use_epoch_time)
return time(NULL); ts.tv_sec = time(NULL);
return 0; return ts;
} }
/** /**
@ -1336,10 +1340,10 @@ static int mkntfs_attr_find(const ATTR_TYPES type, const ntfschar *name,
a->name_length, ic, upcase, upcase_len)) { a->name_length, ic, upcase, upcase_len)) {
int rc; int rc;
rc = ntfs_names_collate(name, name_len, rc = ntfs_names_full_collate(name, name_len,
(ntfschar*)((char*)a + (ntfschar*)((char*)a +
le16_to_cpu(a->name_offset)), le16_to_cpu(a->name_offset)),
a->name_length, 1, IGNORE_CASE, a->name_length, IGNORE_CASE,
upcase, upcase_len); upcase, upcase_len);
/* /*
* If @name collates before a->name, there is no * If @name collates before a->name, there is no
@ -1352,10 +1356,10 @@ static int mkntfs_attr_find(const ATTR_TYPES type, const ntfschar *name,
/* If the strings are not equal, continue search. */ /* If the strings are not equal, continue search. */
if (rc) if (rc)
continue; continue;
rc = ntfs_names_collate(name, name_len, rc = ntfs_names_full_collate(name, name_len,
(ntfschar*)((char*)a + (ntfschar*)((char*)a +
le16_to_cpu(a->name_offset)), le16_to_cpu(a->name_offset)),
a->name_length, 1, CASE_SENSITIVE, a->name_length, CASE_SENSITIVE,
upcase, upcase_len); upcase, upcase_len);
if (rc == -1) { if (rc == -1) {
errno = ENOENT; errno = ENOENT;
@ -1566,7 +1570,7 @@ static int insert_positioned_attr_in_mft_record(MFT_RECORD *m,
} else { } else {
hdr_size = 64; hdr_size = 64;
if (val_len) { if (val_len) {
mpa_size = ntfs_get_size_for_mapping_pairs(g_vol, rl, 0); mpa_size = ntfs_get_size_for_mapping_pairs(g_vol, rl, 0, INT_MAX);
if (mpa_size < 0) { if (mpa_size < 0) {
err = -errno; err = -errno;
ntfs_log_error("Failed to get size for mapping " ntfs_log_error("Failed to get size for mapping "
@ -1759,7 +1763,7 @@ static int insert_non_resident_attr_in_mft_record(MFT_RECORD *m,
} else { } else {
hdr_size = 64; hdr_size = 64;
if (val_len) { if (val_len) {
mpa_size = ntfs_get_size_for_mapping_pairs(g_vol, rl, 0); mpa_size = ntfs_get_size_for_mapping_pairs(g_vol, rl, 0, INT_MAX);
if (mpa_size < 0) { if (mpa_size < 0) {
err = -errno; err = -errno;
ntfs_log_error("Failed to get size for mapping " ntfs_log_error("Failed to get size for mapping "
@ -1980,7 +1984,7 @@ static int add_attr_std_info(MFT_RECORD *m, const FILE_ATTR_FLAGS flags,
sd_size = 48; sd_size = 48;
si.creation_time = utc2ntfs(mkntfs_time()); si.creation_time = timespec2ntfs(mkntfs_time());
si.last_data_change_time = si.creation_time; si.last_data_change_time = si.creation_time;
si.last_mft_change_time = si.creation_time; si.last_mft_change_time = si.creation_time;
si.last_access_time = si.creation_time; si.last_access_time = si.creation_time;
@ -2895,7 +2899,7 @@ static int initialize_quota(MFT_RECORD *m)
if (g_vol->minor_ver == 0) if (g_vol->minor_ver == 0)
idx_entry_q1_data->flags |= QUOTA_FLAG_OUT_OF_DATE; idx_entry_q1_data->flags |= QUOTA_FLAG_OUT_OF_DATE;
idx_entry_q1_data->bytes_used = const_cpu_to_le64(0x00); idx_entry_q1_data->bytes_used = const_cpu_to_le64(0x00);
idx_entry_q1_data->change_time = utc2ntfs(mkntfs_time()); idx_entry_q1_data->change_time = timespec2ntfs(mkntfs_time());
idx_entry_q1_data->threshold = const_cpu_to_le64((s64)-1); idx_entry_q1_data->threshold = const_cpu_to_le64((s64)-1);
idx_entry_q1_data->limit = const_cpu_to_le64((s64)-1); idx_entry_q1_data->limit = const_cpu_to_le64((s64)-1);
idx_entry_q1_data->exceeded_time = const_cpu_to_le64(0x00); idx_entry_q1_data->exceeded_time = const_cpu_to_le64(0x00);
@ -2922,7 +2926,7 @@ static int initialize_quota(MFT_RECORD *m)
idx_entry_q2_data->version = const_cpu_to_le32(0x02); idx_entry_q2_data->version = const_cpu_to_le32(0x02);
idx_entry_q2_data->flags = QUOTA_FLAG_DEFAULT_LIMITS; idx_entry_q2_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
idx_entry_q2_data->bytes_used = const_cpu_to_le64(0x00); idx_entry_q2_data->bytes_used = const_cpu_to_le64(0x00);
idx_entry_q2_data->change_time = utc2ntfs(mkntfs_time());; idx_entry_q2_data->change_time = timespec2ntfs(mkntfs_time());;
idx_entry_q2_data->threshold = const_cpu_to_le64((s64)-1); idx_entry_q2_data->threshold = const_cpu_to_le64((s64)-1);
idx_entry_q2_data->limit = const_cpu_to_le64((s64)-1); idx_entry_q2_data->limit = const_cpu_to_le64((s64)-1);
idx_entry_q2_data->exceeded_time = const_cpu_to_le64(0x00); idx_entry_q2_data->exceeded_time = const_cpu_to_le64(0x00);
@ -3125,7 +3129,7 @@ static int create_hardlink_res(MFT_RECORD *m_parent, const MFT_REF ref_parent,
return -errno; return -errno;
fn->parent_directory = ref_parent; fn->parent_directory = ref_parent;
/* FIXME: copy the creation_time from the std info */ /* FIXME: copy the creation_time from the std info */
fn->creation_time = utc2ntfs(mkntfs_time()); fn->creation_time = timespec2ntfs(mkntfs_time());
fn->last_data_change_time = fn->creation_time; fn->last_data_change_time = fn->creation_time;
fn->last_mft_change_time = fn->creation_time; fn->last_mft_change_time = fn->creation_time;
fn->last_access_time = fn->creation_time; fn->last_access_time = fn->creation_time;
@ -3241,7 +3245,7 @@ static int create_hardlink(INDEX_BLOCK *idx, const MFT_REF ref_parent,
fn->parent_directory = ref_parent; fn->parent_directory = ref_parent;
/* FIXME: Is this correct? Or do we have to copy the creation_time */ /* FIXME: Is this correct? Or do we have to copy the creation_time */
/* from the std info? */ /* from the std info? */
fn->creation_time = utc2ntfs(mkntfs_time()); fn->creation_time = timespec2ntfs(mkntfs_time());
fn->last_data_change_time = fn->creation_time; fn->last_data_change_time = fn->creation_time;
fn->last_mft_change_time = fn->creation_time; fn->last_mft_change_time = fn->creation_time;
fn->last_access_time = fn->creation_time; fn->last_access_time = fn->creation_time;
@ -4956,7 +4960,7 @@ static int mkntfs_redirect(struct mkntfs_options *opts2)
goto done; goto done;
} }
/* Initialize the random number generator with the current time. */ /* Initialize the random number generator with the current time. */
srandom(mkntfs_time()); srandom(mkntfs_time().tv_sec);
/* Allocate and initialize ntfs_volume structure g_vol. */ /* Allocate and initialize ntfs_volume structure g_vol. */
g_vol = ntfs_volume_alloc(); g_vol = ntfs_volume_alloc();
if (!g_vol) { if (!g_vol) {

View File

@ -716,7 +716,8 @@ static void restore_image(void)
static void wipe_index_entry_timestams(INDEX_ENTRY *e) static void wipe_index_entry_timestams(INDEX_ENTRY *e)
{ {
s64 timestamp = utc2ntfs(0); static const struct timespec zero_time = { .tv_sec = 0, .tv_nsec = 0 };
s64 timestamp = timespec2ntfs(zero_time);
while (!(e->ie_flags & INDEX_ENTRY_END)) { while (!(e->ie_flags & INDEX_ENTRY_END)) {
@ -806,7 +807,7 @@ static void wipe_index_allocation_timestamps(ntfs_inode *ni, ATTR_RECORD *attr)
} }
} }
if (ntfs_rl_pwrite(vol, na->rl, 0, na->data_size, indexa) != na->data_size) if (ntfs_rl_pwrite(vol, na->rl, 0, 0, na->data_size, indexa) != na->data_size)
ntfs_log_perror("ntfs_rl_pwrite failed"); ntfs_log_perror("ntfs_rl_pwrite failed");
out_indexa: out_indexa:
free(indexa); free(indexa);
@ -879,8 +880,9 @@ do { \
static void wipe_timestamps(ntfs_walk_clusters_ctx *image) static void wipe_timestamps(ntfs_walk_clusters_ctx *image)
{ {
static const struct timespec zero_time = { .tv_sec = 0, .tv_nsec = 0 };
ATTR_RECORD *a = image->ctx->attr; ATTR_RECORD *a = image->ctx->attr;
s64 timestamp = utc2ntfs(0); s64 timestamp = timespec2ntfs(zero_time);
if (a->type == AT_FILE_NAME) if (a->type == AT_FILE_NAME)
WIPE_TIMESTAMPS(FILE_NAME_ATTR, a, timestamp); WIPE_TIMESTAMPS(FILE_NAME_ATTR, a, timestamp);

View File

@ -319,8 +319,8 @@ static int parse_options(int argc, char *argv[])
*/ */
static char *ntfsinfo_time_to_str(const s64 sle_ntfs_clock) static char *ntfsinfo_time_to_str(const s64 sle_ntfs_clock)
{ {
time_t unix_clock = ntfs2utc(sle_ntfs_clock); struct timespec unix_clock = ntfs2timespec((ntfs_time) sle_ntfs_clock);
return ctime(&unix_clock); return ctime(&unix_clock.tv_sec);
} }
/** /**

View File

@ -552,7 +552,7 @@ static int list_dir_entry(ntfsls_dirent * dirent, const ntfschar * name,
ntfs_attr_search_ctx *ctx = NULL; ntfs_attr_search_ctx *ctx = NULL;
FILE_NAME_ATTR *file_name_attr; FILE_NAME_ATTR *file_name_attr;
ATTR_RECORD *attr; ATTR_RECORD *attr;
time_t ntfs_time; struct timespec ntfs_time;
char t_buf[26]; char t_buf[26];
result = -1; // Everything else is bad result = -1; // Everything else is bad
@ -575,8 +575,8 @@ static int list_dir_entry(ntfsls_dirent * dirent, const ntfschar * name,
if (!file_name_attr) if (!file_name_attr)
goto release; goto release;
ntfs_time = ntfs2utc(file_name_attr->last_data_change_time); ntfs_time = ntfs2timespec(file_name_attr->last_data_change_time);
strcpy(t_buf, ctime(&ntfs_time)); strcpy(t_buf, ctime(&ntfs_time.tv_sec));
memmove(t_buf+16, t_buf+19, 5); memmove(t_buf+16, t_buf+19, 5);
t_buf[21] = '\0'; t_buf[21] = '\0';

View File

@ -1146,7 +1146,7 @@ static void replace_attribute_runlist(ntfs_volume *vol,
rl_fixup(&rl); rl_fixup(&rl);
if ((mp_size = ntfs_get_size_for_mapping_pairs(vol, rl, 0)) == -1) if ((mp_size = ntfs_get_size_for_mapping_pairs(vol, rl, 0, INT_MAX)) == -1)
perr_exit("ntfs_get_size_for_mapping_pairs"); perr_exit("ntfs_get_size_for_mapping_pairs");
if (a->name_length) { if (a->name_length) {
@ -1964,7 +1964,7 @@ static void truncate_bitmap_data_attr(ntfs_resize_t *resize)
* attribute too, for now chkdsk will do this for us. * attribute too, for now chkdsk will do this for us.
*/ */
size = ntfs_rl_pwrite(vol, rl, 0, bm_bsize, resize->lcn_bitmap.bm); size = ntfs_rl_pwrite(vol, rl, 0, 0, bm_bsize, resize->lcn_bitmap.bm);
if (bm_bsize != size) { if (bm_bsize != size) {
if (size == -1) if (size == -1)
perr_exit("Couldn't write $Bitmap"); perr_exit("Couldn't write $Bitmap");

View File

@ -793,7 +793,7 @@ static FILE_NAME_ATTR* verify_parent(struct filename* name, MFT_RECORD* rec)
filename_attr = (FILE_NAME_ATTR*)((char*)attr30 + le16_to_cpu(attr30->value_offset)); filename_attr = (FILE_NAME_ATTR*)((char*)attr30 + le16_to_cpu(attr30->value_offset));
/* if name is older than this dir -> can't determine */ /* if name is older than this dir -> can't determine */
if (ntfs2utc(filename_attr->creation_time) > name->date_c) { if (ntfs2timespec(filename_attr->creation_time).tv_sec > name->date_c) {
return NULL; return NULL;
} }
@ -923,10 +923,10 @@ static int get_filenames(struct ufile *file, ntfs_volume* vol)
name->size_data = sle64_to_cpu(attr->data_size); name->size_data = sle64_to_cpu(attr->data_size);
name->flags = attr->file_attributes; name->flags = attr->file_attributes;
name->date_c = ntfs2utc(attr->creation_time); name->date_c = ntfs2timespec(attr->creation_time).tv_sec;
name->date_a = ntfs2utc(attr->last_data_change_time); name->date_a = ntfs2timespec(attr->last_data_change_time).tv_sec;
name->date_m = ntfs2utc(attr->last_mft_change_time); name->date_m = ntfs2timespec(attr->last_mft_change_time).tv_sec;
name->date_r = ntfs2utc(attr->last_access_time); name->date_r = ntfs2timespec(attr->last_access_time).tv_sec;
if (ntfs_ucstombs(name->uname, name->uname_len, &name->name, if (ntfs_ucstombs(name->uname, name->uname_len, &name->name,
0) < 0) { 0) < 0) {
@ -1101,7 +1101,7 @@ static struct ufile * read_record(ntfs_volume *vol, long long record)
if (attr10) { if (attr10) {
STANDARD_INFORMATION *si; STANDARD_INFORMATION *si;
si = (STANDARD_INFORMATION *) ((char *) attr10 + le16_to_cpu(attr10->value_offset)); si = (STANDARD_INFORMATION *) ((char *) attr10 + le16_to_cpu(attr10->value_offset));
file->date = ntfs2utc(si->last_data_change_time); file->date = ntfs2timespec(si->last_data_change_time).tv_sec;
} }
if (attr20 || !attr10) if (attr20 || !attr10)