Code to write directory structure of the ECMA-119 tree.
This commit is contained in:
parent
46ffb6d33d
commit
31ee89c47b
@ -14,6 +14,7 @@
|
|||||||
#include "filesrc.h"
|
#include "filesrc.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "writer.h"
|
#include "writer.h"
|
||||||
|
#include "messages.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#include "libburn/libburn.h"
|
#include "libburn/libburn.h"
|
||||||
@ -293,10 +294,97 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
|||||||
return iso_write(t, &vol, sizeof(struct ecma119_pri_vol_desc));
|
return iso_write(t, &vol, sizeof(struct ecma119_pri_vol_desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
uint8_t buffer[BLOCK_SIZE];
|
||||||
|
size_t i;
|
||||||
|
size_t fi_len, len;
|
||||||
|
|
||||||
|
/* buf will point to current write position on buffer */
|
||||||
|
uint8_t *buf = buffer;
|
||||||
|
|
||||||
|
/* initialize buffer with 0s */
|
||||||
|
memset(buffer, 0, BLOCK_SIZE);
|
||||||
|
|
||||||
|
/* write the "." and ".." entries first */
|
||||||
|
write_one_dir_record(t, dir, 0, buf, 1);
|
||||||
|
buf += 34;
|
||||||
|
|
||||||
|
write_one_dir_record(t, dir, 1, buf, 1);
|
||||||
|
buf += 34;
|
||||||
|
|
||||||
|
for (i = 0; i < dir->info.dir.nchildren; i++) {
|
||||||
|
Ecma119Node *child = dir->info.dir.children[i];
|
||||||
|
|
||||||
|
/* compute len of directory entry */
|
||||||
|
fi_len = strlen(child->iso_name);
|
||||||
|
len = fi_len + 33 + (fi_len % 2);
|
||||||
|
if ( (buf + len - buffer) > BLOCK_SIZE ) {
|
||||||
|
/* dir doesn't fit in current block */
|
||||||
|
ret = iso_write(t, buffer, BLOCK_SIZE);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
memset(buffer, 0, BLOCK_SIZE);
|
||||||
|
buf = buffer;
|
||||||
|
}
|
||||||
|
/* write the directory entry in any case */
|
||||||
|
write_one_dir_record(t, child, -1, buf, fi_len);
|
||||||
|
buf += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write the last block */
|
||||||
|
ret = iso_write(t, buffer, BLOCK_SIZE);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int write_dirs(Ecma119Image *t, Ecma119Node *root)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* write all directory entries for this dir */
|
||||||
|
ret = write_one_dir(t, root);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* recurse */
|
||||||
|
for (i = 0; i < root->info.dir.nchildren; i++) {
|
||||||
|
Ecma119Node *child = root->info.dir.children[i];
|
||||||
|
if (child->type == ECMA119_DIR) {
|
||||||
|
ret = write_dirs(t, child);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write both the directory structure (ECMA-119, 6.8) and the L and M
|
||||||
|
* Path Tables (ECMA-119, 6.9).
|
||||||
|
*/
|
||||||
static
|
static
|
||||||
int ecma119_writer_write_data(IsoImageWriter *writer)
|
int ecma119_writer_write_data(IsoImageWriter *writer)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
Ecma119Image *t;
|
||||||
|
|
||||||
|
if (writer == NULL) {
|
||||||
|
return ISO_MEM_ERROR;
|
||||||
|
}
|
||||||
|
t = writer->target;
|
||||||
|
|
||||||
|
/* first of all, we write the directory structure */
|
||||||
|
ret = write_dirs(t, t->root);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
//TODO to implement
|
//TODO to implement
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user