Implemented potential fix to obey ECMA

This commit is contained in:
Mario Danic
2007-03-20 09:41:52 +00:00
parent b46f805756
commit ef56dc8f4f
2 changed files with 46 additions and 4 deletions

View File

@@ -101,6 +101,7 @@ joliet_calc_dir_size(struct ecma119_write_target *t,
struct joliet_tree_node *root)
{
size_t i;
size_t newlen;
struct joliet_tree_node *ch;
assert(root && ISO_ISDIR(root->iso_self));
@@ -108,7 +109,13 @@ joliet_calc_dir_size(struct ecma119_write_target *t,
root->len = 68; /* for "." and ".." entries */
for (i = 0; i < root->nchildren; i++) {
ch = root->children[i];
root->len += ch->dirent_len;
newlen = root->len + ch->dirent_len;
if ((newlen % 2048) < (root->len % 2048)) {
root->len = newlen + (2048 - (root->len % 2048));
}
else {
root->len += ch->dirent_len;
}
if (ISO_ISDIR(ch->iso_self))
joliet_calc_dir_size(t, ch);
}
@@ -305,7 +312,10 @@ write_one_dir(struct ecma119_write_target *t,
uint8_t *buf)
{
size_t i;
int j;
size_t len;
uint8_t *orig_buf = buf;
uint8_t *prior_buf = buf;
assert(ISO_ISDIR (dir->iso_self));
/* write the "." and ".." entries first */
@@ -317,7 +327,18 @@ write_one_dir(struct ecma119_write_target *t,
for (i = 0; i < dir->nchildren; i++) {
write_one_dir_record(t, dir->children[i], -1, buf);
buf += ((struct ecma119_dir_record*) buf)->len_dr[0];
len = ((struct ecma119_dir_record*) buf)->len_dr[0];
if ((buf + len - prior_buf) >= 2048) {
for (j = len - 1; j >= 0; j--) {
prior_buf[2048 + j] = buf[j];
buf[j] = 0;
}
prior_buf += 2048;
buf = prior_buf + len;
}
else {
buf += ((struct ecma119_dir_record*) buf)->len_dr[0];
}
}
assert (buf - orig_buf == dir->len);