Support for specify image creation options.
This commit is contained in:
parent
33ef32b389
commit
22d0969098
@ -224,8 +224,8 @@ int isoburn_find_by_drive(struct isoburn **pt, struct burn_drive *d, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
||||||
int new_img)
|
struct isoburn_source_opts *opts, int new_img)
|
||||||
{
|
{
|
||||||
struct burn_source *wsrc;
|
struct burn_source *wsrc;
|
||||||
struct burn_session *session;
|
struct burn_session *session;
|
||||||
@ -244,25 +244,24 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
|||||||
session = burn_session_create();
|
session = burn_session_create();
|
||||||
burn_disc_add_session(*disc, session, BURN_POS_END);
|
burn_disc_add_session(*disc, session, BURN_POS_END);
|
||||||
|
|
||||||
// FIXME we need a way to allow users to pass parameters to this!!
|
|
||||||
wopts.volnum = 0;
|
wopts.volnum = 0;
|
||||||
wopts.level = 2;
|
wopts.level = opts->level;
|
||||||
wopts.flags = 0;
|
wopts.flags = opts->flag;
|
||||||
wopts.relaxed_constraints = 0;
|
wopts.relaxed_constraints = opts->relaxed_constraints;
|
||||||
wopts.copy_eltorito = 0;
|
wopts.copy_eltorito = opts->copy_eltorito;
|
||||||
wopts.no_cache_inodes = 0;
|
wopts.no_cache_inodes = opts->no_cache_inodes;
|
||||||
wopts.sort_files = 1;
|
wopts.sort_files = opts->sort_files;
|
||||||
wopts.default_mode = 0;
|
wopts.default_mode = opts->default_mode;
|
||||||
wopts.replace_dir_mode = 0;
|
wopts.replace_dir_mode = opts->replace_dir_mode;
|
||||||
wopts.replace_file_mode = 0;
|
wopts.replace_file_mode = opts->replace_file_mode;
|
||||||
wopts.replace_uid = 0;
|
wopts.replace_uid = opts->replace_uid;
|
||||||
wopts.replace_gid = 0;
|
wopts.replace_gid = opts->replace_gid;
|
||||||
wopts.dir_mode = 0555;
|
wopts.dir_mode = opts->dir_mode;
|
||||||
wopts.file_mode = 0555;
|
wopts.file_mode = opts->file_mode;
|
||||||
wopts.gid = 0;
|
wopts.gid = opts->gid;
|
||||||
wopts.uid = 0;
|
wopts.uid = opts->uid;
|
||||||
wopts.input_charset = NULL;
|
wopts.input_charset = opts->input_charset;
|
||||||
wopts.ouput_charset = NULL;
|
wopts.ouput_charset = opts->ouput_charset;
|
||||||
|
|
||||||
wopts.ms_block = (new_img ? 0 : o->nwa);
|
wopts.ms_block = (new_img ? 0 : o->nwa);
|
||||||
wopts.src = o->src;
|
wopts.src = o->src;
|
||||||
@ -276,12 +275,14 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc)
|
int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc,
|
||||||
|
struct isoburn_source_opts *opts)
|
||||||
{
|
{
|
||||||
return isoburn_prepare_disc_aux(d, disc, 0);
|
return isoburn_prepare_disc_aux(d, disc, opts, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc)
|
int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
|
||||||
|
struct isoburn_source_opts *opts)
|
||||||
{
|
{
|
||||||
return isoburn_prepare_disc_aux(d, disc, 1);
|
return isoburn_prepare_disc_aux(d, disc, opts, 1);
|
||||||
}
|
}
|
||||||
|
@ -87,12 +87,12 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast);
|
|||||||
/**
|
/**
|
||||||
* Options for image reading.
|
* Options for image reading.
|
||||||
*/
|
*/
|
||||||
struct isoburn_read_opts {
|
struct isoburn_read_opts {
|
||||||
unsigned int norock:1; /*< Do not read Rock Ridge extensions */
|
unsigned int norock:1; /*< Do not read Rock Ridge extensions */
|
||||||
unsigned int nojoliet:1; /*< Do not read Joliet extensions */
|
unsigned int nojoliet:1; /*< Do not read Joliet extensions */
|
||||||
unsigned int preferjoliet:1;
|
unsigned int preferjoliet:1;
|
||||||
/*< When both Joliet and RR extensions are present, the RR
|
/*< When both Joliet and RR extensions are present, the RR
|
||||||
* tree is used. If you prefer using Joliet, set this to 1. */
|
* tree is used. If you prefer using Joliet, set this to 1. */
|
||||||
uid_t uid; /**< Default uid when no RR */
|
uid_t uid; /**< Default uid when no RR */
|
||||||
gid_t gid; /**< Default uid when no RR */
|
gid_t gid; /**< Default uid when no RR */
|
||||||
mode_t mode; /**< Default mode when no RR (only permissions) */
|
mode_t mode; /**< Default mode when no RR (only permissions) */
|
||||||
@ -106,6 +106,69 @@ struct isoburn_read_opts {
|
|||||||
* the image, as reported in the PVM. */
|
* the image, as reported in the PVM. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for image generation.
|
||||||
|
*/
|
||||||
|
struct isoburn_source_opts {
|
||||||
|
int level; /**< ISO level to write at. */
|
||||||
|
int flags; /**< Which extensions to support. */
|
||||||
|
int relaxed_constraints; /**< see ecma119_relaxed_constraints_flag */
|
||||||
|
|
||||||
|
unsigned int copy_eltorito:1;
|
||||||
|
/**<
|
||||||
|
* In multisession discs, select whether to copy el-torito catalog
|
||||||
|
* and boot image. Copy is needed for isolinux images, that need to
|
||||||
|
* be patched. However, it can lead to problems when the image is
|
||||||
|
* not present in the iso filesystem, because we can't figure out
|
||||||
|
* its size. In those cases, we only copy 1 block of data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned int no_cache_inodes:1;
|
||||||
|
/**< If use inode caching or not. Set it to 1 to prevent
|
||||||
|
* inode caching.
|
||||||
|
* Usage of inode caching allows detection of hard-links,
|
||||||
|
* which contents are only written once to disc this way.
|
||||||
|
* Don't use inode caching in systems with non unique inodes
|
||||||
|
* per device.
|
||||||
|
*/
|
||||||
|
unsigned int sort_files:1;
|
||||||
|
/**< If files should be sorted based on their weight. */
|
||||||
|
unsigned int default_mode:1;
|
||||||
|
/**<
|
||||||
|
* The default values for files and directory permissions,
|
||||||
|
* gid and uid. This option can be overwritten when set
|
||||||
|
* one of the following.
|
||||||
|
* 0 to use useful values, 1 to use node modes (this are
|
||||||
|
* the same as filesystem ones if not changed after added
|
||||||
|
* to tree).
|
||||||
|
*/
|
||||||
|
unsigned int replace_dir_mode:1;
|
||||||
|
/**<
|
||||||
|
* When 1, permissions for all dirs will be replaced by the
|
||||||
|
* specified in dir_mode field.
|
||||||
|
*/
|
||||||
|
unsigned int replace_file_mode:1;
|
||||||
|
/**<
|
||||||
|
* When 1, permissions for all files will be replaced by the
|
||||||
|
* specified in file_mode field.
|
||||||
|
*/
|
||||||
|
unsigned int replace_uid:1;
|
||||||
|
/**<
|
||||||
|
* When 1, uid of all nodes (both files and dirs) will be
|
||||||
|
* replaced by the specified in uid field.
|
||||||
|
*/
|
||||||
|
unsigned int replace_gid:1;
|
||||||
|
/**<
|
||||||
|
* When 1, gid of all nodes (both files and dirs) will be
|
||||||
|
* replaced by the specified in gid field.
|
||||||
|
*/
|
||||||
|
mode_t dir_mode; /**< Mode to use on dirs when replace_dir_mode is set. */
|
||||||
|
mode_t file_mode; /**< Mode to use on files when replace_file_mode is set. */
|
||||||
|
gid_t gid; /**< gid to use when replace_gid is set. */
|
||||||
|
uid_t uid; /**< uid to use when replace_uid is set. */
|
||||||
|
char *input_charset; /**< NULL to use default charset */
|
||||||
|
char *ouput_charset; /**< NULL to use default charset */
|
||||||
|
};
|
||||||
|
|
||||||
/** Load the ISO filesystem directory tree from the media in the given drive.
|
/** 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
|
This will give libisoburn the base on which it can let libisofs perform
|
||||||
@ -146,8 +209,8 @@ int isoburn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
|||||||
@param disc A burn_disc suitable to pass to isoburn_disc_write.
|
@param disc A burn_disc suitable to pass to isoburn_disc_write.
|
||||||
@return <=0 error , 1 = success
|
@return <=0 error , 1 = success
|
||||||
*/
|
*/
|
||||||
// TODO we need to pass reduced ecma119_source_opts
|
int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc,
|
||||||
int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc);
|
struct isoburn_source_opts *opts);
|
||||||
|
|
||||||
|
|
||||||
/** Prepare a disc for creating a new image from the contents of a previous
|
/** Prepare a disc for creating a new image from the contents of a previous
|
||||||
@ -158,9 +221,8 @@ int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc);
|
|||||||
@param disc A burn_disc suitable to pass to burn_disc_write.
|
@param disc A burn_disc suitable to pass to burn_disc_write.
|
||||||
@return <=0 error , 1 = success
|
@return <=0 error , 1 = success
|
||||||
*/
|
*/
|
||||||
// TODO we need to pass reduced ecma119_source_opts
|
int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
|
||||||
int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc);
|
struct isoburn_source_opts *opts);
|
||||||
|
|
||||||
|
|
||||||
/** Start writing of the new session.
|
/** Start writing of the new session.
|
||||||
This call is asynchrounous. I.e. it returns quite soon and the progress has
|
This call is asynchrounous. I.e. it returns quite soon and the progress has
|
||||||
|
22
test/test.c
22
test/test.c
@ -46,6 +46,7 @@ int main(int argc, char **argv)
|
|||||||
struct burn_disc *disc;
|
struct burn_disc *disc;
|
||||||
enum burn_disc_status state;
|
enum burn_disc_status state;
|
||||||
struct isoburn_read_opts ropts;
|
struct isoburn_read_opts ropts;
|
||||||
|
struct isoburn_source_opts sopts;
|
||||||
int c;
|
int c;
|
||||||
struct iso_tree_radd_dir_behavior behav = {0,0,0};
|
struct iso_tree_radd_dir_behavior behav = {0,0,0};
|
||||||
int flags=0;
|
int flags=0;
|
||||||
@ -121,8 +122,27 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* add a new dir */
|
/* add a new dir */
|
||||||
iso_tree_radd_dir(root, argv[optind+1], &behav);
|
iso_tree_radd_dir(root, argv[optind+1], &behav);
|
||||||
|
|
||||||
|
|
||||||
if (isoburn_prepare_disc(drive, &disc) <= 0) {
|
sopts.level = 2;
|
||||||
|
sopts.flags = flags;
|
||||||
|
sopts.relaxed_constraints = 0;
|
||||||
|
sopts.copy_eltorito = 1;
|
||||||
|
sopts.no_cache_inodes = 0;
|
||||||
|
sopts.sort_files = 1;
|
||||||
|
sopts.default_mode = 0;
|
||||||
|
sopts.replace_dir_mode = 0;
|
||||||
|
sopts.replace_file_mode = 0;
|
||||||
|
sopts.replace_uid = 0;
|
||||||
|
sopts.replace_gid = 0;
|
||||||
|
sopts.dir_mode = 0555;
|
||||||
|
sopts.file_mode = 0444;
|
||||||
|
sopts.gid = 0;
|
||||||
|
sopts.uid = 0;
|
||||||
|
sopts.input_charset = NULL;
|
||||||
|
sopts.ouput_charset = NULL;
|
||||||
|
|
||||||
|
if (isoburn_prepare_disc(drive, &disc, &sopts) <= 0) {
|
||||||
printf("Can't prepare disc");
|
printf("Can't prepare disc");
|
||||||
goto volset_cleanup;
|
goto volset_cleanup;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user