- fixed -T/--zero-time for 3.x volumes

- reordered initialization of $Quota indexes
- added ntfs_calloc()
- fixed all missing memory allocation error handlings in initialize_quota()
edge.strict_endians
szaka 2005-11-16 21:36:20 +00:00
parent f7b087b07d
commit 1e14b996c0
1 changed files with 94 additions and 72 deletions

View File

@ -576,6 +576,20 @@ static time_t mkntfs_time(void)
return 0;
}
/**
* mkntfs_calloc
*/
static void *ntfs_calloc(size_t nmemb, size_t size)
{
void *p;
p = calloc(nmemb, size);
if (!p)
ntfs_log_perror("Failed to calloc() %lld bytes",
(long long)nmemb * size);
return p;
}
/**
* append_to_bad_blocks
*
@ -2937,14 +2951,87 @@ static int initialize_quota(MFT_RECORD *m)
INDEX_ENTRY *idx_entry_o, *idx_entry_q1, *idx_entry_q2;
QUOTA_O_INDEX_DATA *idx_entry_o_data;
QUOTA_CONTROL_ENTRY *idx_entry_q1_data, *idx_entry_q2_data;
err = 0;
o_size = cpu_to_le32(0x28);
/* q index entry num 1 */
q1_size = cpu_to_le32(0x48);
q2_size = cpu_to_le32(0x58);
idx_entry_q1 = ntfs_calloc(1, q1_size);
if (!idx_entry_q1)
return errno;
idx_entry_q1->data_offset = cpu_to_le16(0x14);
idx_entry_q1->data_length = cpu_to_le16(0x30);
idx_entry_q1->reservedV = cpu_to_le32(0x00);
idx_entry_q1->length = cpu_to_le16(0x48);
idx_entry_q1->key_length = cpu_to_le16(0x04);
idx_entry_q1->flags = cpu_to_le16(0x00);
idx_entry_q1->reserved = cpu_to_le16(0x00);
idx_entry_q1->key.owner_id = cpu_to_le32(0x01);
idx_entry_q1_data = (QUOTA_CONTROL_ENTRY*)((char*)idx_entry_q1
+ idx_entry_q1->data_offset);
idx_entry_q1_data->version = cpu_to_le32(0x02);
idx_entry_q1_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
if (g_vol->minor_ver == 0)
idx_entry_q1_data->flags |= QUOTA_FLAG_OUT_OF_DATE;
idx_entry_q1_data->bytes_used = cpu_to_le64(0x00);
idx_entry_q1_data->change_time = utc2ntfs(mkntfs_time());
idx_entry_q1_data->threshold = cpu_to_sle64(-0x01);
idx_entry_q1_data->limit = cpu_to_sle64(-0x01);
idx_entry_q1_data->exceeded_time = cpu_to_sle64(0x00);
idx_entry_o = calloc(1, o_size);
idx_entry_q1 = calloc(1, q1_size);
idx_entry_q2 = calloc(1, q2_size);
err = insert_index_entry_in_res_dir_index(idx_entry_q1,
q1_size, m,
NTFS_INDEX_Q, 2, AT_UNUSED);
free(idx_entry_q1);
if (err)
return err;
/* q index entry num 2 */
q2_size = cpu_to_le32(0x58);
idx_entry_q2 = ntfs_calloc(1, q2_size);
if (!idx_entry_q2)
return errno;
idx_entry_q2->data_offset = cpu_to_le16(0x14);
idx_entry_q2->data_length = cpu_to_le16(0x40);
idx_entry_q2->reservedV = cpu_to_le32(0x00);
idx_entry_q2->length = cpu_to_le16(0x58);
idx_entry_q2->key_length = cpu_to_le16(0x04);
idx_entry_q2->flags = cpu_to_le16(0x00);
idx_entry_q2->reserved = cpu_to_le16(0x00);
idx_entry_q2->key.owner_id = QUOTA_FIRST_USER_ID;
idx_entry_q2_data = (QUOTA_CONTROL_ENTRY*)((char*)idx_entry_q2
+ idx_entry_q2->data_offset);
idx_entry_q2_data->version = cpu_to_le32(0x02);
idx_entry_q2_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
idx_entry_q2_data->bytes_used = cpu_to_le64(0x00);
idx_entry_q2_data->change_time = utc2ntfs(mkntfs_time());;
idx_entry_q2_data->threshold = cpu_to_sle64(-0x01);
idx_entry_q2_data->limit = cpu_to_sle64(-0x01);
idx_entry_q2_data->exceeded_time = cpu_to_sle64(0x00);
idx_entry_q2_data->sid.revision = 1;
idx_entry_q2_data->sid.sub_authority_count = 2;
idx_entry_q2_data->sid.identifier_authority.high_part =
cpu_to_le16(0x0000);
idx_entry_q2_data->sid.identifier_authority.low_part =
cpu_to_le32(0x05000000);
idx_entry_q2_data->sid.sub_authority[0] =
cpu_to_le32(SECURITY_BUILTIN_DOMAIN_RID);
idx_entry_q2_data->sid.sub_authority[1] =
cpu_to_le32(DOMAIN_ALIAS_RID_ADMINS);
err = insert_index_entry_in_res_dir_index(idx_entry_q2,
q2_size, m,
NTFS_INDEX_Q, 2, AT_UNUSED);
free(idx_entry_q2);
if (err)
return err;
o_size = cpu_to_le32(0x28);
idx_entry_o = ntfs_calloc(1, o_size);
if (!idx_entry_o)
return errno;
idx_entry_o->data_offset = cpu_to_le16(0x20);
idx_entry_o->data_length = cpu_to_le16(0x04);
@ -2973,70 +3060,6 @@ static int initialize_quota(MFT_RECORD *m)
o_size, m,
NTFS_INDEX_O, 2, AT_UNUSED);
free(idx_entry_o);
if (err)
return err;
/* q index entry num 1 */
idx_entry_q1->data_offset = cpu_to_le16(0x14);
idx_entry_q1->data_length = cpu_to_le16(0x30);
idx_entry_q1->reservedV = cpu_to_le32(0x00);
idx_entry_q1->length = cpu_to_le16(0x48);
idx_entry_q1->key_length = cpu_to_le16(0x04);
idx_entry_q1->flags = cpu_to_le16(0x00);
idx_entry_q1->reserved = cpu_to_le16(0x00);
idx_entry_q1->key.owner_id = cpu_to_le32(0x01);
idx_entry_q1_data = (QUOTA_CONTROL_ENTRY*)((char*)idx_entry_q1
+ idx_entry_q1->data_offset);
idx_entry_q1_data->version = cpu_to_le32(0x02);
idx_entry_q1_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
if (g_vol->minor_ver == 0)
idx_entry_q1_data->flags |= QUOTA_FLAG_OUT_OF_DATE;
idx_entry_q1_data->bytes_used = cpu_to_le64(0x00);
idx_entry_q1_data->change_time = utc2ntfs(time(NULL));
idx_entry_q1_data->threshold = cpu_to_sle64(-0x01);
idx_entry_q1_data->limit = cpu_to_sle64(-0x01);
idx_entry_q1_data->exceeded_time = cpu_to_sle64(0x00);
err = insert_index_entry_in_res_dir_index(idx_entry_q1,
q1_size, m,
NTFS_INDEX_Q, 2, AT_UNUSED);
free(idx_entry_q1);
if (err)
return err;
/* q index entry num 2 */
idx_entry_q2->data_offset = cpu_to_le16(0x14);
idx_entry_q2->data_length = cpu_to_le16(0x40);
idx_entry_q2->reservedV = cpu_to_le32(0x00);
idx_entry_q2->length = cpu_to_le16(0x58);
idx_entry_q2->key_length = cpu_to_le16(0x04);
idx_entry_q2->flags = cpu_to_le16(0x00);
idx_entry_q2->reserved = cpu_to_le16(0x00);
idx_entry_q2->key.owner_id = QUOTA_FIRST_USER_ID;
idx_entry_q2_data = (QUOTA_CONTROL_ENTRY*)((char*)idx_entry_q2
+ idx_entry_q2->data_offset);
idx_entry_q2_data->version = cpu_to_le32(0x02);
idx_entry_q2_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
idx_entry_q2_data->bytes_used = cpu_to_le64(0x00);
idx_entry_q2_data->change_time = utc2ntfs(time(NULL));;
idx_entry_q2_data->threshold = cpu_to_sle64(-0x01);
idx_entry_q2_data->limit = cpu_to_sle64(-0x01);
idx_entry_q2_data->exceeded_time = cpu_to_sle64(0x00);
idx_entry_q2_data->sid.revision = 1;
idx_entry_q2_data->sid.sub_authority_count = 2;
idx_entry_q2_data->sid.identifier_authority.high_part =
cpu_to_le16(0x0000);
idx_entry_q2_data->sid.identifier_authority.low_part =
cpu_to_le32(0x05000000);
idx_entry_q2_data->sid.sub_authority[0] =
cpu_to_le32(SECURITY_BUILTIN_DOMAIN_RID);
idx_entry_q2_data->sid.sub_authority[1] =
cpu_to_le32(DOMAIN_ALIAS_RID_ADMINS);
err = insert_index_entry_in_res_dir_index(idx_entry_q2,
q2_size, m,
NTFS_INDEX_Q, 2, AT_UNUSED);
free(idx_entry_q2);
return err;
}
@ -3191,9 +3214,8 @@ static int create_hardlink_res(MFT_RECORD *m_parent, const MFT_REF ref_parent,
if (!fn)
return -errno;
fn->parent_directory = ref_parent;
/* FIXME: Is this correct? Or do we have to copy the creation_time */
/* from the std info? */
fn->creation_time = utc2ntfs(time(NULL));
/* FIXME: copy the creation_time from the std info */
fn->creation_time = utc2ntfs(mkntfs_time());
fn->last_data_change_time = fn->creation_time;
fn->last_mft_change_time = fn->creation_time;
fn->last_access_time = fn->creation_time;