Define code style formatter for eclipse and apply it to source.
This commit is contained in:
248
src/ecma119.c
248
src/ecma119.c
@ -30,12 +30,12 @@ static
|
||||
void ecma119_image_free(Ecma119Image *t)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
|
||||
ecma119_node_free(t->root);
|
||||
iso_image_unref(t->image);
|
||||
iso_rbtree_destroy(t->files, iso_file_src_free);
|
||||
iso_ring_buffer_free(t->buffer);
|
||||
|
||||
|
||||
for (i = 0; i < t->nwriters; ++i) {
|
||||
IsoImageWriter *writer = t->writers[i];
|
||||
writer->free_data(writer);
|
||||
@ -73,7 +73,8 @@ size_t calc_dirent_len(Ecma119Image *t, Ecma119Node *n)
|
||||
if (need_version_number(t, n)) {
|
||||
ret += 2; /* take into account version numbers */
|
||||
}
|
||||
if (ret % 2) ret++;
|
||||
if (ret % 2)
|
||||
ret++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -90,12 +91,12 @@ size_t calc_dirent_len(Ecma119Image *t, Ecma119Node *n)
|
||||
* The size needed for all dir entries of the given dir, without
|
||||
* taking into account the continuation areas.
|
||||
*/
|
||||
static
|
||||
static
|
||||
size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
|
||||
{
|
||||
size_t i, len;
|
||||
size_t ce_len = 0;
|
||||
|
||||
|
||||
/* size of "." and ".." entries */
|
||||
len = 34 + 34;
|
||||
if (t->rockridge) {
|
||||
@ -104,14 +105,13 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
|
||||
len += rrip_calc_len(t, dir, 2, 255 - 34, &ce_len);
|
||||
*ce += ce_len;
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < dir->info.dir.nchildren; ++i) {
|
||||
size_t remaining;
|
||||
Ecma119Node *child = dir->info.dir.children[i];
|
||||
size_t dirent_len = calc_dirent_len(t, child);
|
||||
if (t->rockridge) {
|
||||
dirent_len += rrip_calc_len(t, child, 0, 255 - dirent_len,
|
||||
&ce_len);
|
||||
dirent_len += rrip_calc_len(t, child, 0, 255 - dirent_len, &ce_len);
|
||||
*ce += ce_len;
|
||||
}
|
||||
remaining = BLOCK_SIZE - (len % BLOCK_SIZE);
|
||||
@ -127,7 +127,7 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
|
||||
return len;
|
||||
}
|
||||
|
||||
static
|
||||
static
|
||||
void calc_dir_pos(Ecma119Image *t, Ecma119Node *dir)
|
||||
{
|
||||
size_t i, len;
|
||||
@ -156,12 +156,12 @@ uint32_t calc_path_table_size(Ecma119Node *dir)
|
||||
{
|
||||
uint32_t size;
|
||||
size_t i;
|
||||
|
||||
|
||||
/* size of path table for this entry */
|
||||
size = 8;
|
||||
size += dir->iso_name ? strlen(dir->iso_name) : 1;
|
||||
size += (size % 2);
|
||||
|
||||
|
||||
/* and recurse */
|
||||
for (i = 0; i < dir->info.dir.nchildren; i++) {
|
||||
Ecma119Node *child = dir->info.dir.children[i];
|
||||
@ -177,29 +177,29 @@ int ecma119_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
{
|
||||
Ecma119Image *target;
|
||||
uint32_t path_table_size;
|
||||
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
target = writer->target;
|
||||
|
||||
|
||||
/* compute position of directories */
|
||||
iso_msg_debug(target->image, "Computing position of dir structure");
|
||||
target->ndirs = 0;
|
||||
calc_dir_pos(target, target->root);
|
||||
|
||||
|
||||
/* compute length of pathlist */
|
||||
iso_msg_debug(target->image, "Computing length of pathlist");
|
||||
path_table_size = calc_path_table_size(target->root);
|
||||
|
||||
|
||||
/* compute location for path tables */
|
||||
target->l_path_table_pos = target->curblock;
|
||||
target->curblock += div_up(path_table_size, BLOCK_SIZE);
|
||||
target->m_path_table_pos = target->curblock;
|
||||
target->curblock += div_up(path_table_size, BLOCK_SIZE);
|
||||
target->path_table_size = path_table_size;
|
||||
|
||||
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
@ -216,28 +216,28 @@ int ecma119_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
* root directory record in the PVD (ECMA-119, 8.4.18) (in order to
|
||||
* distinguish it from the "." entry in the root directory)
|
||||
*/
|
||||
static
|
||||
static
|
||||
void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
||||
uint8_t *buf, size_t len_fi, struct susp_info *info)
|
||||
uint8_t *buf, size_t len_fi, struct susp_info *info)
|
||||
{
|
||||
uint32_t len;
|
||||
uint32_t block;
|
||||
uint8_t len_dr; /*< size of dir entry without SUSP fields */
|
||||
uint8_t *name = (file_id >= 0) ? (uint8_t*)&file_id :
|
||||
(uint8_t*)node->iso_name;
|
||||
|
||||
uint8_t *name = (file_id >= 0) ? (uint8_t*)&file_id
|
||||
: (uint8_t*)node->iso_name;
|
||||
|
||||
struct ecma119_dir_record *rec = (struct ecma119_dir_record*)buf;
|
||||
|
||||
|
||||
len_dr = 33 + len_fi + (len_fi % 2 ? 0 : 1);
|
||||
|
||||
|
||||
memcpy(rec->file_id, name, len_fi);
|
||||
|
||||
|
||||
if (need_version_number(t, node)) {
|
||||
len_dr += 2;
|
||||
rec->file_id[len_fi++] = ';';
|
||||
rec->file_id[len_fi++] = '1';
|
||||
}
|
||||
|
||||
|
||||
if (node->type == ECMA119_DIR) {
|
||||
/* use the cached length */
|
||||
len = node->info.dir.len;
|
||||
@ -253,7 +253,7 @@ void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
||||
len = 0;
|
||||
block = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* For ".." entry we need to write the parent info!
|
||||
*/
|
||||
@ -267,7 +267,7 @@ void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
||||
rec->flags[0] = (node->type == ECMA119_DIR) ? 2 : 0;
|
||||
iso_bb(rec->vol_seq_number, 1, 2);
|
||||
rec->len_fi[0] = len_fi;
|
||||
|
||||
|
||||
/* and finally write the SUSP fields */
|
||||
if (info != NULL) {
|
||||
rrip_write_susp_fields(t, info, buf + len_dr);
|
||||
@ -283,33 +283,33 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
IsoImage *image;
|
||||
Ecma119Image *t;
|
||||
struct ecma119_pri_vol_desc vol;
|
||||
|
||||
|
||||
char *vol_id, *pub_id, *data_id, *volset_id;
|
||||
char *system_id, *application_id, *copyright_file_id;
|
||||
char *abstract_file_id, *biblio_file_id;
|
||||
|
||||
|
||||
if (writer == NULL) {
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
t = writer->target;
|
||||
image = t->image;
|
||||
|
||||
|
||||
iso_msg_debug(image, "Write Primary Volume Descriptor");
|
||||
|
||||
|
||||
memset(&vol, 0, sizeof(struct ecma119_pri_vol_desc));
|
||||
|
||||
str2d_char(t->input_charset, image->volume_id, &vol_id);
|
||||
str2a_char(t->input_charset, image->publisher_id, &pub_id);
|
||||
str2a_char(t->input_charset, image->data_preparer_id, &data_id);
|
||||
str2d_char(t->input_charset, image->volset_id, &volset_id);
|
||||
|
||||
|
||||
str2a_char(t->input_charset, image->system_id, &system_id);
|
||||
str2a_char(t->input_charset, image->application_id, &application_id);
|
||||
str2d_char(t->input_charset, image->copyright_file_id, ©right_file_id);
|
||||
str2d_char(t->input_charset, image->abstract_file_id, &abstract_file_id);
|
||||
str2d_char(t->input_charset, image->biblio_file_id, &biblio_file_id);
|
||||
|
||||
|
||||
vol.vol_desc_type[0] = 1;
|
||||
memcpy(vol.std_identifier, "CD001", 5);
|
||||
vol.vol_desc_version[0] = 1;
|
||||
@ -318,7 +318,7 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
} else {
|
||||
/* put linux by default? */
|
||||
memcpy(vol.system_id, "LINUX", 5);
|
||||
}
|
||||
}
|
||||
if (vol_id) {
|
||||
strncpy((char*)vol.volume_id, vol_id, 32);
|
||||
}
|
||||
@ -338,7 +338,7 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
strncpy((char*)vol.publisher_id, pub_id, 128);
|
||||
if (data_id)
|
||||
strncpy((char*)vol.data_prep_id, data_id, 128);
|
||||
|
||||
|
||||
if (application_id)
|
||||
strncpy((char*)vol.application_id, application_id, 128);
|
||||
if (copyright_file_id)
|
||||
@ -362,12 +362,12 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
free(copyright_file_id);
|
||||
free(abstract_file_id);
|
||||
free(biblio_file_id);
|
||||
|
||||
|
||||
/* Finally write the Volume Descriptor */
|
||||
return iso_write(t, &vol, sizeof(struct ecma119_pri_vol_desc));
|
||||
}
|
||||
|
||||
static
|
||||
static
|
||||
int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
||||
{
|
||||
int ret;
|
||||
@ -375,13 +375,13 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
||||
size_t i;
|
||||
size_t fi_len, len;
|
||||
struct susp_info info;
|
||||
|
||||
|
||||
/* buf will point to current write position on buffer */
|
||||
uint8_t *buf = buffer;
|
||||
|
||||
|
||||
/* initialize buffer with 0s */
|
||||
memset(buffer, 0, BLOCK_SIZE);
|
||||
|
||||
|
||||
/*
|
||||
* set susp_info to 0's, this way code for both plain ECMA-119 and
|
||||
* RR is very similar
|
||||
@ -416,14 +416,14 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
||||
|
||||
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 ? 0 : 1);
|
||||
if (need_version_number(t, child)) {
|
||||
len += 2;
|
||||
}
|
||||
|
||||
|
||||
/* get the SUSP fields if rockridge is enabled */
|
||||
if (t->rockridge) {
|
||||
ret = rrip_get_susp_fields(t, child, 0, 255 - len, &info);
|
||||
@ -432,8 +432,8 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
||||
}
|
||||
len += info.suf_len;
|
||||
}
|
||||
|
||||
if ( (buf + len - buffer) > BLOCK_SIZE ) {
|
||||
|
||||
if ( (buf + len - buffer) > BLOCK_SIZE) {
|
||||
/* dir doesn't fit in current block */
|
||||
ret = iso_write(t, buffer, BLOCK_SIZE);
|
||||
if (ret < 0) {
|
||||
@ -446,33 +446,33 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
||||
write_one_dir_record(t, child, -1, buf, fi_len, &info);
|
||||
buf += len;
|
||||
}
|
||||
|
||||
|
||||
/* write the last block */
|
||||
ret = iso_write(t, buffer, BLOCK_SIZE);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* write the Continuation Area if needed */
|
||||
if (info.ce_len > 0) {
|
||||
ret = rrip_write_ce_fields(t, &info);
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
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];
|
||||
@ -486,7 +486,7 @@ int write_dirs(Ecma119Image *t, Ecma119Node *root)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
static
|
||||
int write_path_table(Ecma119Image *t, Ecma119Node **pathlist, int l_type)
|
||||
{
|
||||
size_t i, len;
|
||||
@ -496,8 +496,8 @@ int write_path_table(Ecma119Image *t, Ecma119Node **pathlist, int l_type)
|
||||
Ecma119Node *dir;
|
||||
uint32_t path_table_size;
|
||||
int parent = 0;
|
||||
int ret = ISO_SUCCESS;
|
||||
|
||||
int ret= ISO_SUCCESS;
|
||||
|
||||
path_table_size = 0;
|
||||
write_int = l_type ? iso_lsb : iso_msb;
|
||||
|
||||
@ -527,7 +527,7 @@ int write_path_table(Ecma119Image *t, Ecma119Node **pathlist, int l_type)
|
||||
}
|
||||
path_table_size += len;
|
||||
}
|
||||
|
||||
|
||||
/* we need to fill the last block with zeros */
|
||||
path_table_size %= BLOCK_SIZE;
|
||||
if (path_table_size) {
|
||||
@ -539,15 +539,15 @@ int write_path_table(Ecma119Image *t, Ecma119Node **pathlist, int l_type)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
static
|
||||
int write_path_tables(Ecma119Image *t)
|
||||
{
|
||||
int ret;
|
||||
size_t i, j, cur;
|
||||
Ecma119Node **pathlist;
|
||||
|
||||
|
||||
iso_msg_debug(t->image, "Writing ISO Path tables");
|
||||
|
||||
|
||||
/* allocate temporal pathlist */
|
||||
pathlist = malloc(sizeof(void*) * t->ndirs);
|
||||
if (pathlist == NULL) {
|
||||
@ -565,17 +565,17 @@ int write_path_tables(Ecma119Image *t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Write L Path Table */
|
||||
ret = write_path_table(t, pathlist, 1);
|
||||
if (ret < 0) {
|
||||
goto write_path_tables_exit;
|
||||
}
|
||||
|
||||
|
||||
/* Write L Path Table */
|
||||
ret = write_path_table(t, pathlist, 0);
|
||||
|
||||
write_path_tables_exit:;
|
||||
|
||||
write_path_tables_exit: ;
|
||||
free(pathlist);
|
||||
return ret;
|
||||
}
|
||||
@ -589,21 +589,21 @@ 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;
|
||||
}
|
||||
|
||||
|
||||
/* and write the path tables */
|
||||
ret = write_path_tables(t);
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -618,28 +618,28 @@ int ecma119_writer_create(Ecma119Image *target)
|
||||
{
|
||||
int ret;
|
||||
IsoImageWriter *writer;
|
||||
|
||||
|
||||
writer = malloc(sizeof(IsoImageWriter));
|
||||
if (writer == NULL) {
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
writer->compute_data_blocks = ecma119_writer_compute_data_blocks;
|
||||
writer->write_vol_desc = ecma119_writer_write_vol_desc;
|
||||
writer->write_data = ecma119_writer_write_data;
|
||||
writer->free_data = ecma119_writer_free_data;
|
||||
writer->data = NULL;
|
||||
writer->target = target;
|
||||
|
||||
|
||||
/* add this writer to image */
|
||||
target->writers[target->nwriters++] = writer;
|
||||
|
||||
|
||||
iso_msg_debug(target->image, "Creating low level ECMA-119 tree...");
|
||||
ret = ecma119_tree_create(target);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* we need the volume descriptor */
|
||||
target->curblock++;
|
||||
return ISO_SUCCESS;
|
||||
@ -652,10 +652,10 @@ void *write_function(void *arg)
|
||||
size_t i;
|
||||
uint8_t buf[BLOCK_SIZE];
|
||||
IsoImageWriter *writer;
|
||||
|
||||
|
||||
Ecma119Image *target = (Ecma119Image*)arg;
|
||||
iso_msg_debug(target->image, "Starting image writing...");
|
||||
|
||||
|
||||
/* Write System Area, 16 blocks of zeros (ECMA-119, 6.2.1) */
|
||||
memset(buf, 0, BLOCK_SIZE);
|
||||
for (i = 0; i < 16; ++i) {
|
||||
@ -664,7 +664,7 @@ void *write_function(void *arg)
|
||||
goto write_error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* write volume descriptors, one per writer */
|
||||
iso_msg_debug(target->image, "Write volume descriptors");
|
||||
for (i = 0; i < target->nwriters; ++i) {
|
||||
@ -674,22 +674,22 @@ void *write_function(void *arg)
|
||||
goto write_error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* write Volume Descriptor Set Terminator (ECMA-119, 8.3) */
|
||||
{
|
||||
struct ecma119_vol_desc_terminator *vol;
|
||||
vol = (struct ecma119_vol_desc_terminator *) buf;
|
||||
|
||||
|
||||
vol->vol_desc_type[0] = 255;
|
||||
memcpy(vol->std_identifier, "CD001", 5);
|
||||
vol->vol_desc_version[0] = 1;
|
||||
|
||||
|
||||
res = iso_write(target, buf, BLOCK_SIZE);
|
||||
if (res < 0) {
|
||||
goto write_error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* write data for each writer */
|
||||
for (i = 0; i < target->nwriters; ++i) {
|
||||
writer = target->writers[i];
|
||||
@ -698,40 +698,39 @@ void *write_function(void *arg)
|
||||
goto write_error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
iso_ring_buffer_writer_close(target->buffer);
|
||||
pthread_exit(NULL);
|
||||
|
||||
write_error:;
|
||||
iso_msg_fatal(target->image, LIBISO_WRITE_ERROR,
|
||||
|
||||
write_error: ;
|
||||
iso_msg_fatal(target->image, LIBISO_WRITE_ERROR,
|
||||
"Image write error, code %d", res);
|
||||
iso_ring_buffer_writer_close(target->buffer);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
static
|
||||
int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
Ecma119Image **img)
|
||||
static
|
||||
int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts, Ecma119Image **img)
|
||||
{
|
||||
int ret, i;
|
||||
Ecma119Image *target;
|
||||
|
||||
|
||||
/* 1. Allocate target and copy opts there */
|
||||
target = calloc(1, sizeof(Ecma119Image));
|
||||
if (target == NULL) {
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* create the tree for file caching */
|
||||
ret = iso_rbtree_new(iso_file_src_cmp, &(target->files));
|
||||
if (ret < 0) {
|
||||
free(target);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
target->image = src;
|
||||
iso_image_ref(src);
|
||||
|
||||
|
||||
target->iso_level = opts->level;
|
||||
target->rockridge = opts->rockridge;
|
||||
target->ino = 0;
|
||||
@ -748,7 +747,7 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
target->gid = opts->replace_gid == 2 ? opts->gid : 0;
|
||||
target->dir_mode = opts->replace_dir_mode == 2 ? opts->dir_mode : 0555;
|
||||
target->file_mode = opts->replace_file_mode == 2 ? opts->file_mode : 0444;
|
||||
|
||||
|
||||
target->now = time(NULL);
|
||||
target->ms_block = 0;
|
||||
|
||||
@ -760,7 +759,7 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
free(target);
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
if (opts->output_charset != NULL) {
|
||||
target->output_charset = strdup(opts->output_charset);
|
||||
} else {
|
||||
@ -771,7 +770,7 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
free(target);
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 2. Based on those options, create needed writers: iso, joliet...
|
||||
* Each writer inits its structures and stores needed info into
|
||||
@ -780,8 +779,8 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
* current block.
|
||||
* Finally, create Writer for files.
|
||||
*/
|
||||
target->curblock = target->ms_block + 16;
|
||||
|
||||
target->curblock = target->ms_block + 16;
|
||||
|
||||
/* the number of writers is dependent of the extensions */
|
||||
target->writers = malloc(2 * sizeof(void*));
|
||||
if (target->writers == NULL) {
|
||||
@ -789,22 +788,22 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
free(target);
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* create writer for ECMA-119 structure */
|
||||
ret = ecma119_writer_create(target);
|
||||
if (ret < 0) {
|
||||
goto target_cleanup;
|
||||
}
|
||||
|
||||
|
||||
/* Volume Descriptor Set Terminator */
|
||||
target->curblock++;
|
||||
|
||||
|
||||
/* create writer for file contents */
|
||||
ret = iso_file_src_writer_create(target);
|
||||
if (ret < 0) {
|
||||
goto target_cleanup;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 3.
|
||||
* Call compute_data_blocks() in each Writer.
|
||||
@ -818,27 +817,27 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
goto target_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The volume space size is just the size of the last session, in
|
||||
* case of ms images.
|
||||
*/
|
||||
target->total_size = (target->curblock - target->ms_block) * BLOCK_SIZE;
|
||||
target->vol_space_size = target->curblock - target->ms_block;
|
||||
|
||||
|
||||
/* 4. Create and start writting thread */
|
||||
|
||||
|
||||
/* create the ring buffer */
|
||||
ret = iso_ring_buffer_new(&target->buffer);
|
||||
if (ret < 0) {
|
||||
goto target_cleanup;
|
||||
}
|
||||
|
||||
|
||||
/* ensure the thread is created joinable */
|
||||
pthread_attr_init(&(target->th_attr));
|
||||
pthread_attr_setdetachstate(&(target->th_attr), PTHREAD_CREATE_JOINABLE);
|
||||
|
||||
ret = pthread_create(&(target->wthread), &(target->th_attr),
|
||||
ret = pthread_create(&(target->wthread), &(target->th_attr),
|
||||
write_function, (void *) target);
|
||||
if (ret != 0) {
|
||||
iso_msg_fatal(target->image, LIBISO_THREAD_ERROR,
|
||||
@ -846,24 +845,23 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
|
||||
ret = ISO_THREAD_ERROR;
|
||||
goto target_cleanup;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Notice that once we reach this point, target belongs to the writer
|
||||
* thread and should not be modified until the writer thread finished.
|
||||
* There're however, specific fields in target that can be accessed, or
|
||||
* even modified by the read thread (look inside bs_* functions)
|
||||
*/
|
||||
|
||||
|
||||
*img = target;
|
||||
return ISO_SUCCESS;
|
||||
|
||||
target_cleanup:;
|
||||
|
||||
target_cleanup: ;
|
||||
ecma119_image_free(target);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
bs_read(struct burn_source *bs, unsigned char *buf, int size)
|
||||
static int bs_read(struct burn_source *bs, unsigned char *buf, int size)
|
||||
{
|
||||
int ret;
|
||||
Ecma119Image *t = (Ecma119Image*)bs->data;
|
||||
@ -881,29 +879,27 @@ bs_read(struct burn_source *bs, unsigned char *buf, int size)
|
||||
}
|
||||
}
|
||||
|
||||
static off_t
|
||||
bs_get_size(struct burn_source *bs)
|
||||
static off_t bs_get_size(struct burn_source *bs)
|
||||
{
|
||||
Ecma119Image *target = (Ecma119Image*)bs->data;
|
||||
return target->total_size;
|
||||
}
|
||||
|
||||
static void
|
||||
bs_free_data(struct burn_source *bs)
|
||||
static void bs_free_data(struct burn_source *bs)
|
||||
{
|
||||
Ecma119Image *target = (Ecma119Image*)bs->data;
|
||||
|
||||
|
||||
/* forces writer to stop if it is still running */
|
||||
iso_ring_buffer_reader_close(target->buffer);
|
||||
|
||||
|
||||
/* wait until writer thread finishes */
|
||||
pthread_join(target->wthread, NULL);
|
||||
|
||||
|
||||
iso_msg_debug(target->image, "Writer thread joined");
|
||||
iso_msg_debug(target->image, "Ring buffer was %d times full and %d times "
|
||||
"empty", iso_ring_buffer_get_times_full(target->buffer),
|
||||
iso_ring_buffer_get_times_empty(target->buffer));
|
||||
|
||||
|
||||
/* now we can safety free target */
|
||||
ecma119_image_free(target);
|
||||
}
|
||||
@ -912,7 +908,7 @@ static
|
||||
int bs_set_size(struct burn_source *bs, off_t size)
|
||||
{
|
||||
Ecma119Image *target = (Ecma119Image*)bs->data;
|
||||
|
||||
|
||||
/*
|
||||
* just set the value to be returned by get_size. This is not used at
|
||||
* all by libisofs, it is here just for helping libburn to correctly pad
|
||||
@ -927,30 +923,30 @@ int iso_image_create(IsoImage *image, Ecma119WriteOpts *opts,
|
||||
{
|
||||
int ret;
|
||||
struct burn_source *source;
|
||||
Ecma119Image *target = NULL;
|
||||
|
||||
Ecma119Image *target= NULL;
|
||||
|
||||
if (image == NULL || opts == NULL || burn_src == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
|
||||
|
||||
source = calloc(1, sizeof(struct burn_source));
|
||||
if (source == NULL) {
|
||||
return ISO_MEM_ERROR;
|
||||
}
|
||||
|
||||
|
||||
ret = ecma119_image_new(image, opts, &target);
|
||||
if (ret < 0) {
|
||||
free(source);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
source->refcount = 1;
|
||||
source->read = bs_read;
|
||||
source->get_size = bs_get_size;
|
||||
source->set_size = bs_set_size;
|
||||
source->free_data = bs_free_data;
|
||||
source->data = target;
|
||||
|
||||
|
||||
*burn_src = source;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
@ -958,7 +954,7 @@ int iso_image_create(IsoImage *image, Ecma119WriteOpts *opts,
|
||||
int iso_write(Ecma119Image *target, void *buf, size_t count)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
||||
ret = iso_ring_buffer_write(target->buffer, buf, count);
|
||||
if (ret == 0) {
|
||||
/* reader cancelled */
|
||||
|
Reference in New Issue
Block a user