Compile time check of libisoburn. Enforced minimum track size of 300 sectors.
This commit is contained in:
parent
9e1dccb40b
commit
0ce9be5c2d
@ -1 +1 @@
|
||||
#define Xorriso_timestamP "2008.02.02.131903"
|
||||
#define Xorriso_timestamP "2008.02.02.181200"
|
||||
|
@ -71,6 +71,9 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
S_ISSOCK(iso_node_get_mode(node)))
|
||||
|
||||
|
||||
#define Xorriso_min_track_sizE 300
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
||||
@ -80,6 +83,49 @@ int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag)
|
||||
char *handler_prefix= NULL;
|
||||
char *queue_sev, *print_sev, reason[1024];
|
||||
|
||||
|
||||
/* First an ugly compile time check for header version compatibility.
|
||||
If everthing matches, then no C code is produced. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
|
||||
/* The minimum requirement of xorriso towards the libisoburn header
|
||||
at compile time is defined in xorriso/xorrisoburn.h
|
||||
xorriso_libisoburn_req_major
|
||||
xorriso_libisoburn_req_minor
|
||||
xorriso_libisoburn_req_micro
|
||||
It gets compared against the version macros in libburn/libburn.h :
|
||||
isoburn_header_version_major
|
||||
isoburn_header_version_minor
|
||||
isoburn_header_version_micro
|
||||
If the header is too old then the following code shall cause failure of
|
||||
cdrskin compilation rather than to allow production of a program with
|
||||
unpredictable bugs or memory corruption.
|
||||
The compiler messages supposed to appear in this case are:
|
||||
error: 'LIBISOBURN_MISCONFIGURATION' undeclared (first use in this function)
|
||||
error: 'INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c' undeclared (first use in this function)
|
||||
error: 'LIBISOBURN_MISCONFIGURATION_' undeclared (first use in this function)
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if xorriso_libisoburn_req_major > isoburn_header_version_major
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_major == isoburn_header_version_major && xorriso_libisoburn_req_minor > isoburn_header_version_minor
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_minor == isoburn_header_version_minor && xorriso_libisoburn_req_micro > isoburn_header_version_micro
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Isoburn_libisoburn_dot_h_too_olD
|
||||
LIBISOBURN_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c = 0;
|
||||
LIBISOBURN_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
/* End of ugly compile time test (scroll up for explanation) */
|
||||
|
||||
|
||||
sprintf(xorriso->info_text, "Starting up libraries ...\n");
|
||||
Xorriso_info(xorriso, 0);
|
||||
|
||||
@ -546,7 +592,7 @@ int Xorriso_make_write_options(
|
||||
*/
|
||||
int Xorriso_write_session(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, media_space;
|
||||
int ret, media_space, img_sectors;
|
||||
struct isoburn_imgen_opts *sopts= NULL;
|
||||
struct burn_drive_info *dinfo, *source_dinfo;
|
||||
struct burn_drive *drive, *source_drive;
|
||||
@ -635,19 +681,42 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
ret= burn_disc_get_sectors(disc);
|
||||
ret= img_sectors= burn_disc_get_sectors(disc);
|
||||
if(flag&1)
|
||||
goto ex;
|
||||
|
||||
media_space= burn_disc_available_space(drive, burn_options) / (off_t) 2048;
|
||||
if(media_space < ret) {
|
||||
if(media_space < img_sectors || media_space < Xorriso_min_track_sizE) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,"Image size %ds exceeds free space on media %ds",
|
||||
ret, media_space);
|
||||
(img_sectors < Xorriso_min_track_sizE ? Xorriso_min_track_sizE
|
||||
: img_sectors ),
|
||||
media_space);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
|
||||
if(img_sectors < Xorriso_min_track_sizE) {
|
||||
sessions= burn_disc_get_sessions(disc, &num_sessions);
|
||||
if(sessions==NULL || num_sessions < 1) {
|
||||
no_track:;
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,"Program error : no track in prepared disc");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
tracks= burn_session_get_tracks(sessions[0], &num_tracks);
|
||||
if(tracks==NULL || num_tracks < 1)
|
||||
goto no_track;
|
||||
burn_track_define_data(tracks[0], 0,
|
||||
(Xorriso_min_track_sizE - img_sectors) * 2048,
|
||||
0, BURN_MODE1);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text, "Expanded track to minimum size of %d sectors",
|
||||
Xorriso_min_track_sizE);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
}
|
||||
|
||||
isoburn_disc_write(burn_options, disc);
|
||||
burn_write_opts_free(burn_options);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user