New API function isoburn_get_mount_params()
This commit is contained in:
@ -24,6 +24,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <regex.h>
|
||||
|
||||
|
||||
#ifndef Xorriso_standalonE
|
||||
@ -1041,7 +1042,9 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
||||
}
|
||||
ret= isoburn_read_iso_head_parse(d, buffer+32*1024, image_blocks, info,
|
||||
info_mode);
|
||||
return(ret);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
@ -1509,12 +1512,14 @@ int isoburn_drive_set_msgs_submit(struct burn_drive *d,
|
||||
|
||||
|
||||
/* @param flag bit0= with adr_mode 3: adr_value might be 16 blocks too high
|
||||
bit1= insist in seeing a disc object with at least one session
|
||||
bit2= with adr_mode 4: use adr_value as regular expression
|
||||
*/
|
||||
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
int flag)
|
||||
{
|
||||
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
||||
int lba, best_lba, size;
|
||||
int lba, best_lba, size, re_valid= 0;
|
||||
char volid[33], msg[160];
|
||||
struct isoburn *o;
|
||||
struct isoburn_toc_disc *disc= NULL;
|
||||
@ -1522,6 +1527,8 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
struct isoburn_toc_track **tracks= NULL;
|
||||
static char mode_names[][20]= {"auto", "session", "track", "lba", "volid"};
|
||||
static int max_mode_names= 4;
|
||||
regex_t re;
|
||||
regmatch_t match[1];
|
||||
|
||||
ret= isoburn_find_emulator(&o, d, 0);
|
||||
if(ret<0)
|
||||
@ -1530,7 +1537,7 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
return(-1);
|
||||
|
||||
adr_num= atoi(adr_value);
|
||||
if(adr_mode!=3) {
|
||||
if(adr_mode!=3 || (flag & 2)) {
|
||||
disc= isoburn_toc_drive_get_disc(d);
|
||||
if(disc==NULL) {
|
||||
not_found:;
|
||||
@ -1589,6 +1596,13 @@ not_found:;
|
||||
}
|
||||
} else if(adr_mode==4) {
|
||||
/* search for volume id that is equal to adr_value */
|
||||
if(flag & 4) {
|
||||
ret= regcomp(&re, adr_value, 0);
|
||||
if(ret != 0)
|
||||
flag&= ~4;
|
||||
else
|
||||
re_valid= 1;
|
||||
}
|
||||
best_lba= -1;
|
||||
for(i=0; i<num_sessions; i++) {
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
||||
@ -1599,8 +1613,14 @@ not_found:;
|
||||
ret= isoburn_read_iso_head(d, lba, &size, volid, 1);
|
||||
if(ret<=0)
|
||||
continue;
|
||||
if(strcmp(volid, adr_value)!=0)
|
||||
if(flag & 4) {
|
||||
ret= regexec(&re, volid, 1, match, 0);
|
||||
if(ret != 0)
|
||||
continue;
|
||||
} else {
|
||||
if(strcmp(volid, adr_value)!=0)
|
||||
continue;
|
||||
}
|
||||
best_lba= lba;
|
||||
}
|
||||
}
|
||||
@ -1618,7 +1638,64 @@ unknown_mode:;
|
||||
ex:;
|
||||
if(disc!=NULL)
|
||||
isoburn_toc_disc_free(disc);
|
||||
if((flag & 4) && re_valid)
|
||||
regfree(&re);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_get_mount_params(struct burn_drive *d,
|
||||
int adr_mode, char *adr_value,
|
||||
int *lba, int *track, int *session,
|
||||
char volid[33], int flag)
|
||||
{
|
||||
int msc1_mem, ret, total_tracks, num_sessions, num_tracks, i, j, track_lba;
|
||||
int size, is_iso= 0;
|
||||
struct isoburn *o;
|
||||
struct isoburn_toc_disc *disc= NULL;
|
||||
struct isoburn_toc_session **sessions= NULL;
|
||||
struct isoburn_toc_track **tracks= NULL;
|
||||
|
||||
*lba= *track= *session= -1;
|
||||
volid[0]= 0;
|
||||
ret= isoburn_find_emulator(&o, d, 0);
|
||||
if(ret < 0 || o == NULL)
|
||||
return(-1);
|
||||
msc1_mem= o->fabricated_msc1;
|
||||
ret= isoburn_set_msc1(d, adr_mode, adr_value, 2 | (flag & 4));
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
*lba= o->fabricated_msc1;
|
||||
|
||||
disc= isoburn_toc_drive_get_disc(d);
|
||||
if(disc==NULL)
|
||||
{ret= -1; goto ex;} /* cannot happen because checked by isoburn_set_msc1 */
|
||||
sessions= isoburn_toc_disc_get_sessions(disc, &num_sessions);
|
||||
if(sessions==NULL || num_sessions<=0)
|
||||
{ret= -1; goto ex;} /* cannot happen because checked by isoburn_set_msc1 */
|
||||
total_tracks= 0;
|
||||
for(i=0; i<num_sessions && *session < 0; i++) {
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
||||
if(tracks==NULL)
|
||||
continue;
|
||||
for(j= 0; j<num_tracks && *track < 0; j++) {
|
||||
total_tracks++;
|
||||
isoburn_get_track_lba(tracks[j], &track_lba, 0);
|
||||
if(track_lba == *lba) {
|
||||
*track= total_tracks;
|
||||
*session= i + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret= isoburn_read_iso_head(d, *lba, &size, volid, 1);
|
||||
if(ret <= 0)
|
||||
volid[0]= 0;
|
||||
else
|
||||
is_iso= 1;
|
||||
|
||||
ex:;
|
||||
o->fabricated_msc1= msc1_mem;
|
||||
return(2 - is_iso);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user