From 556b40c264840d925025a242ca2a0d7510ff8055 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Wed, 14 Nov 2007 14:26:32 +0000 Subject: [PATCH] New API call isoburn_attach_volset(), changes with isoburn_read_volset() --- src/isoburn.c | 2 +- src/isofs_wrap.c | 60 +++++++++++++++++++++++++++++----------- src/libisoburn.h | 54 ++++++++++++++++++++++-------------- test/test.c | 2 ++ test/xorriso_timestamp.h | 2 +- 5 files changed, 81 insertions(+), 39 deletions(-) diff --git a/src/isoburn.c b/src/isoburn.c index 9b643284..b3ee5bed 100644 --- a/src/isoburn.c +++ b/src/isoburn.c @@ -220,7 +220,7 @@ int isoburn_find_by_drive(struct isoburn **pt, struct burn_drive *d, int flag) struct isoburn *o; *pt= NULL; - for(o= isoburn_list_start;o!=NULL;o= o->prev) + for(o= isoburn_list_start;o!=NULL;o= o->next) if(o->drive==d) { *pt= o; return(1); diff --git a/src/isofs_wrap.c b/src/isofs_wrap.c index cdd50d94..ddf4d45d 100644 --- a/src/isofs_wrap.c +++ b/src/isofs_wrap.c @@ -7,6 +7,7 @@ libisofs related functions of libisoburn. Copyright 2007 Vreixo Formoso Lopes + Thomas Schmitt */ #include @@ -69,6 +70,7 @@ uint32_t iso_read_lsb(const uint8_t *buf, int bytes) return ret; } + /* API function. See libisoburn.h */ int isoburn_read_volset(struct burn_drive *d, @@ -77,26 +79,29 @@ int isoburn_read_volset(struct burn_drive *d, { int ret; struct ecma119_read_opts ropts; - enum burn_disc_status status; - struct isoburn *o; + enum burn_disc_status status= BURN_DISC_BLANK; + struct isoburn *o= NULL; - if(d==NULL || read_opts==NULL || volset==NULL) { + if(read_opts==NULL || volset==NULL) { /* >>> program error */; return(-1); } - - ret = isoburn_find_emulator(&o, d, 0); - if (ret < 0) - return 0; - - if (!o) { - return -1; + if(d != NULL) { + ret = isoburn_find_emulator(&o, d, 0); + if (ret < 0) + return 0; + + if (o == NULL) { + return -1; + } + status = isoburn_disc_get_status(d); + if(o->target_volset != NULL) + iso_volset_free(o->target_volset); + o->target_volset= NULL; } - - status = isoburn_disc_get_status(d); - if (status == BURN_DISC_BLANK) { + if (d == NULL || status == BURN_DISC_BLANK || read_opts->pretend_blank) { struct iso_volume *volume; struct iso_tree_node_dir *root; @@ -116,8 +121,10 @@ int isoburn_read_volset(struct burn_drive *d, if (!*volset) return -1; - o->target_volset = *volset; - iso_volset_ref(o->target_volset); /* protects object from premature free */ + if(o!=NULL) { + o->target_volset = *volset; + iso_volset_ref(o->target_volset); /*protects object from premature free*/ + } return 1; } @@ -152,6 +159,27 @@ int isoburn_read_volset(struct burn_drive *d, } +/* API function. See libisoburn.h +*/ +int isoburn_attach_volset(struct burn_drive *d, struct iso_volset *volset) +{ + int ret; + struct isoburn *o; + + if (volset == NULL) + return -1; + ret = isoburn_find_emulator(&o, d, 0); + if (ret < 0) + return 0; + if (o == NULL) + return -1; + if(o->target_volset != NULL) + iso_volset_free(o->target_volset); + o->target_volset = volset; + return(1); +} + + /* API function. See libisoburn.h */ int isoburn_activate_session(struct burn_drive *drive) @@ -170,7 +198,7 @@ int isoburn_activate_session(struct burn_drive *drive) return 1; ret = burn_random_access_write(drive, 0, (char*)o->target_iso_head, - 64*2048, 1); + 32*2048, 1); return ret; } diff --git a/src/libisoburn.h b/src/libisoburn.h index 7e6d2cd5..bd792802 100644 --- a/src/libisoburn.h +++ b/src/libisoburn.h @@ -104,6 +104,7 @@ struct isoburn_read_opts { present, to 0 if not. */ uint32_t size; /**< Will be filled with the size (in 2048 byte block) of * the image, as reported in the PVM. */ + unsigned int pretend_blank:1; /* always create empty image */ }; /** @@ -189,21 +190,48 @@ struct isoburn_source_opts { /** Load the ISO filesystem directory tree from the media in the given drive. This will give libisoburn the base on which it can let libisofs perform image growing or image modification. The loaded volset gets attached - to the drive object and is not publicly available. + to the drive object and handed out to the application. Not a wrapper, but peculiar to libisoburn. - @param d The drive which holds an existing ISO filesystem + @param d The drive which holds an existing ISO filesystem or blank media. + d is allowed to be NULL which produces an empty ISO image. In + this case one has to call before writing isoburn_attach_volset() + with the volset from this call and with the intended output + drive. @param read_opts The read options which can be chosen by the application - @param volset the volset that represents the image, if the disc is blacnk - it will have no files + @param volset the volset that represents the image, if the disc is blank + it will have no files. + This reference needs to be released via iso_volset_free() when + it is not longer needed. The drive, if not NULL, will hold an + own reference which it will release when it gets a new volset + or when it gets released via isoburn_drive_release(). @return <=0 error , 1 = success >>>>> error means damaged or unsupported image error code is stored in ecma119_read_opts in libisofs also error msgs are enqueued. Any need to pass them to usr? <<<<<< */ -int isoburn_read_volset(struct burn_drive *d, struct isoburn_read_opts *read_opts, +int isoburn_read_volset(struct burn_drive *d, + struct isoburn_read_opts *read_opts, struct iso_volset **volset); +/** Attach a ISO filesystem directory tree to a drive. This eventually releases + the reference to the old volset attached to the drive. + Caution: Use with care. It hardly makes sense to replace a volset that + reflects a valid ISO image on media. + This call is rather intended for writing a newly created and populated + image to blank media. The use case in xorriso is to let a volset survive + the change or demise of the outdev target drive. + @param d The drive which shall be write target of the volset. + @param volset The volset that represents the image to be written. + This volset pointer MUST already be a valid reference suitable + for iso_volset_free(). + It may have been obtained by appropriate libisofs calls or by + isoburn_read_volset() with d==NULL. + @return <=0 error , 1 = success +*/ +int isoburn_attach_volset(struct burn_drive *d, struct iso_volset *volset); + + /** Obtain the start block number of the most recent session on media. In case of random access media this will always be 0. Succesfull return is not a guarantee that there is a ISO-9660 image at all. The call will fail, @@ -348,19 +376,3 @@ void isoburn_finish(void); int isoburn_needs_emulation(struct burn_drive *drive); -#ifdef Libburn_obsoleted_on_its_way_ouT - -/** Caution: Use this with great care. It is not needed normally. - - This call can set the nwa block number to an arbitrary value. If ever, do - this before preparing the session by libisofs. The drive must be grabbed, - though. This overrides the automated address computation. Call - isoburn_disc_track_lba_nwa() afterwards to learn the effective new - address which might be somewhat higher than set by parameter value. - Wrapper for: burn_write_opts_set_start_byte (if ever) -*/ -void isoburn_write_opts_set_start_byte(struct burn_write_opts *opts, - off_t value); - -#endif /* Libburn_obsoleted_on_its_way_ouT */ - diff --git a/test/test.c b/test/test.c index 1ee2f2cd..ba0bdf2e 100644 --- a/test/test.c +++ b/test/test.c @@ -202,12 +202,14 @@ int main(int argc, char **argv) } /* fill read opts */ + memset(&ropts, sizeof(ropts), 0); ropts.norock = 0; ropts.nojoliet = 0; ropts.preferjoliet = 0; ropts.uid = 0; ropts.gid = 0; ropts.mode = 0555; + ropts.pretend_blank= 0; if (isoburn_read_volset(drive, &ropts, &volset) <= 0) { fprintf(stderr, "Can't read volset\n"); diff --git a/test/xorriso_timestamp.h b/test/xorriso_timestamp.h index 29ce0525..e5d5951e 100644 --- a/test/xorriso_timestamp.h +++ b/test/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2007.11.11.154453" +#define Xorriso_timestamP "2007.11.14.142904"