Some fixes in burn_source implementation
This commit is contained in:
parent
6546f1a197
commit
0224ad402d
@ -479,6 +479,7 @@ ecma119_target_new(struct iso_volset *volset,
|
||||
/* prepare for writing */
|
||||
t->curblock = 0;
|
||||
t->state = ECMA119_WRITE_SYSTEM_AREA;
|
||||
t->bytes_read = 2048;
|
||||
|
||||
return t;
|
||||
}
|
||||
@ -863,30 +864,57 @@ write_data_chunk(struct ecma119_write_target *t, uint8_t *buf)
|
||||
}
|
||||
|
||||
static int
|
||||
bs_read(struct burn_source *bs, unsigned char *buf, int size)
|
||||
bs_read_block(struct burn_source *bs)
|
||||
{
|
||||
struct ecma119_write_target *t = (struct ecma119_write_target*)bs->data;
|
||||
|
||||
if (size != t->block_size) {
|
||||
printf("[ERROR] You can only read in %d chunks\n", t->block_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (t->curblock >= t->vol_space_size) {
|
||||
/* total_size could be setted by libburn */
|
||||
if ( t->curblock >= (t->total_size / (off_t) t->block_size) ) {
|
||||
if ( t->curblock < (t->total_size / (off_t) t->block_size) ) {
|
||||
/* we pad the image */
|
||||
memset(buf, 0, size);
|
||||
return size;
|
||||
memset(t->buffer, 0, t->block_size);
|
||||
t->curblock++;
|
||||
return t->block_size;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (t->state_data_valid)
|
||||
write_data_chunk(t, buf);
|
||||
write_data_chunk(t, t->buffer);
|
||||
else
|
||||
writers[t->state](t, buf);
|
||||
writers[t->state](t, t->buffer);
|
||||
t->curblock++;
|
||||
return size;
|
||||
return t->block_size;
|
||||
}
|
||||
|
||||
static int
|
||||
bs_read(struct burn_source *bs, unsigned char *buf, int size)
|
||||
{
|
||||
int ret = 0,summed_ret = 0;
|
||||
struct ecma119_write_target *t = (struct ecma119_write_target*)bs->data;
|
||||
|
||||
/* make safe against partial buffer returns */
|
||||
while (1) {
|
||||
if (t->bytes_read == 2048) {
|
||||
/* we need to read next block */
|
||||
t->bytes_read = 0;
|
||||
ret = bs_read_block(bs);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int bytes_to_read = 2048 - t->bytes_read;
|
||||
if (summed_ret + bytes_to_read > size) {
|
||||
bytes_to_read = size - summed_ret;
|
||||
}
|
||||
|
||||
memcpy(buf + summed_ret, t->buffer, bytes_to_read);
|
||||
|
||||
t->bytes_read += bytes_to_read;
|
||||
summed_ret += bytes_to_read;
|
||||
if (summed_ret >= size)
|
||||
break;
|
||||
}
|
||||
return summed_ret;
|
||||
}
|
||||
|
||||
static off_t
|
||||
|
@ -174,17 +174,14 @@ struct ecma119_write_target
|
||||
|
||||
/* for writing out files */
|
||||
struct state_files {
|
||||
// off_t pos; /* The number of bytes we have written
|
||||
// * so far in the current file.
|
||||
// */
|
||||
// off_t data_len;/* The number of bytes in the currently
|
||||
// * open file.
|
||||
// */
|
||||
// FILE *fd; /* The currently open file. */
|
||||
struct iso_file_src *src; /* source for reading from the file */
|
||||
int file; /* The index in filelist that we are
|
||||
* currently writing (or about to write). */
|
||||
} state_files;
|
||||
|
||||
/* temp buffer for read functions */
|
||||
uint8_t buffer[2048];
|
||||
int bytes_read;
|
||||
};
|
||||
|
||||
#define BP(a,b) [(b) - (a) + 1]
|
||||
|
Loading…
Reference in New Issue
Block a user