New API function isoburn_get_mount_params()
This commit is contained in:
parent
1bc60d0c0c
commit
e7ab799c76
@ -24,6 +24,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef Xorriso_standalonE
|
#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,
|
ret= isoburn_read_iso_head_parse(d, buffer+32*1024, image_blocks, info,
|
||||||
info_mode);
|
info_mode);
|
||||||
|
if(ret<=0)
|
||||||
return(ret);
|
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
|
/* @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 isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
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];
|
char volid[33], msg[160];
|
||||||
struct isoburn *o;
|
struct isoburn *o;
|
||||||
struct isoburn_toc_disc *disc= NULL;
|
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;
|
struct isoburn_toc_track **tracks= NULL;
|
||||||
static char mode_names[][20]= {"auto", "session", "track", "lba", "volid"};
|
static char mode_names[][20]= {"auto", "session", "track", "lba", "volid"};
|
||||||
static int max_mode_names= 4;
|
static int max_mode_names= 4;
|
||||||
|
regex_t re;
|
||||||
|
regmatch_t match[1];
|
||||||
|
|
||||||
ret= isoburn_find_emulator(&o, d, 0);
|
ret= isoburn_find_emulator(&o, d, 0);
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
@ -1530,7 +1537,7 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
|||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
adr_num= atoi(adr_value);
|
adr_num= atoi(adr_value);
|
||||||
if(adr_mode!=3) {
|
if(adr_mode!=3 || (flag & 2)) {
|
||||||
disc= isoburn_toc_drive_get_disc(d);
|
disc= isoburn_toc_drive_get_disc(d);
|
||||||
if(disc==NULL) {
|
if(disc==NULL) {
|
||||||
not_found:;
|
not_found:;
|
||||||
@ -1589,6 +1596,13 @@ not_found:;
|
|||||||
}
|
}
|
||||||
} else if(adr_mode==4) {
|
} else if(adr_mode==4) {
|
||||||
/* search for volume id that is equal to adr_value */
|
/* 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;
|
best_lba= -1;
|
||||||
for(i=0; i<num_sessions; i++) {
|
for(i=0; i<num_sessions; i++) {
|
||||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
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);
|
ret= isoburn_read_iso_head(d, lba, &size, volid, 1);
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
continue;
|
continue;
|
||||||
|
if(flag & 4) {
|
||||||
|
ret= regexec(&re, volid, 1, match, 0);
|
||||||
|
if(ret != 0)
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
if(strcmp(volid, adr_value)!=0)
|
if(strcmp(volid, adr_value)!=0)
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
best_lba= lba;
|
best_lba= lba;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1618,7 +1638,64 @@ unknown_mode:;
|
|||||||
ex:;
|
ex:;
|
||||||
if(disc!=NULL)
|
if(disc!=NULL)
|
||||||
isoburn_toc_disc_free(disc);
|
isoburn_toc_disc_free(disc);
|
||||||
|
if((flag & 4) && re_valid)
|
||||||
|
regfree(&re);
|
||||||
return(ret);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -336,7 +336,8 @@ int isoburn_set_msgs_submit(int (*msgs_submit)(void *handle, int error_code,
|
|||||||
(cdrom/burner). Thus use with driveno 0 only. On failure
|
(cdrom/burner). Thus use with driveno 0 only. On failure
|
||||||
the array has no valid elements at all.
|
the array has no valid elements at all.
|
||||||
The returned array should be freed via burn_drive_info_free()
|
The returned array should be freed via burn_drive_info_free()
|
||||||
when the drive is no longer needed.
|
when the drive is no longer needed. But before this is done
|
||||||
|
one has to call isoburn_drive_release(drive_infos[0].drive).
|
||||||
@param adr The persistent address of the desired drive.
|
@param adr The persistent address of the desired drive.
|
||||||
@param load 1 attempt to load the disc tray. 0 no attempt,rather failure.
|
@param load 1 attempt to load the disc tray. 0 no attempt,rather failure.
|
||||||
@return 1 = success , 0 = drive not found , <0 = other error
|
@return 1 = success , 0 = drive not found , <0 = other error
|
||||||
@ -353,7 +354,8 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
|
|||||||
(cdrom/burner). Thus use with driveno 0 only. On failure
|
(cdrom/burner). Thus use with driveno 0 only. On failure
|
||||||
the array has no valid elements at all.
|
the array has no valid elements at all.
|
||||||
The returned array should be freed via burn_drive_info_free()
|
The returned array should be freed via burn_drive_info_free()
|
||||||
when the drive is no longer needed.
|
when the drive is no longer needed. But before this is done
|
||||||
|
one has to call isoburn_drive_release(drive_infos[0].drive).
|
||||||
@param adr The persistent address of the desired drive.
|
@param adr The persistent address of the desired drive.
|
||||||
@param flag bit0= attempt to load the disc tray.
|
@param flag bit0= attempt to load the disc tray.
|
||||||
Else: failure if not loaded.
|
Else: failure if not loaded.
|
||||||
@ -375,6 +377,7 @@ int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
|||||||
Wrapper for: burn_drive_grab()
|
Wrapper for: burn_drive_grab()
|
||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
@param drive The drive to grab. E.g. drive_infos[1].drive .
|
@param drive The drive to grab. E.g. drive_infos[1].drive .
|
||||||
|
Call isoburn_drive_release(drive) when it it no longer needed.
|
||||||
@param load 1 attempt to load the disc tray. 0 no attempt, rather failure.
|
@param load 1 attempt to load the disc tray. 0 no attempt, rather failure.
|
||||||
@return 1 success, <=0 failure
|
@return 1 success, <=0 failure
|
||||||
*/
|
*/
|
||||||
@ -450,12 +453,14 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast);
|
|||||||
3= adr_value itself is the lba to be used
|
3= adr_value itself is the lba to be used
|
||||||
4= start lba of last session with volume id
|
4= start lba of last session with volume id
|
||||||
given by adr_value
|
given by adr_value
|
||||||
@parm adr_value A string describing the value to be eventually used.
|
@param adr_value A string describing the value to be eventually used.
|
||||||
@param flag Bitfield for control purposes.
|
@param flag Bitfield for control purposes.
|
||||||
bit0= @since 0.2.2
|
bit0= @since 0.2.2
|
||||||
with adr_mode 3: adr_value might be 16 blocks too high
|
with adr_mode 3: adr_value might be 16 blocks too high
|
||||||
(e.g. -C stemming from growisofs). Probe for ISO head
|
(e.g. -C stemming from growisofs). Probe for ISO head
|
||||||
at adr_value-16 and eventually adjust setting.
|
at adr_value-16 and eventually adjust setting.
|
||||||
|
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 isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||||
int flag);
|
int flag);
|
||||||
@ -600,6 +605,35 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
|||||||
int *image_blocks, char *info, int flag);
|
int *image_blocks, char *info, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
/** Try to convert the given entity address into various entity addresses
|
||||||
|
which would describe it.
|
||||||
|
Note: Sessions and tracks are counted beginning with 1, not with 0.
|
||||||
|
@since 0.3.2
|
||||||
|
@param drive The drive where msc1 is to be set
|
||||||
|
@param adr_mode Determines how to interpret the input adr_value.
|
||||||
|
If adr_value shall represent a number then decimal ASCII
|
||||||
|
digits are expected.
|
||||||
|
0= start lba of last session in TOC, ignore adr_value
|
||||||
|
1= start lba of session number given by adr_value
|
||||||
|
2= start lba of track given number by adr_value
|
||||||
|
3= adr_value itself is the lba to be used
|
||||||
|
4= start lba of last session with volume id
|
||||||
|
given by adr_value
|
||||||
|
@param adr_value A string describing the value to be eventually used.
|
||||||
|
@param lba returns the block address of the entity, -1 means invalid
|
||||||
|
@param track returns the track number of the entity, -1 means invalid
|
||||||
|
@param session returns the session number of the entity, -1 means invalid
|
||||||
|
@param volid returns the volume id of the entity if it is a ISO session
|
||||||
|
@param flag Bitfield for control purposes.
|
||||||
|
bit2= with adr_mode 4: use adr_value as regular expression
|
||||||
|
@return <=0 error , 1 ok, ISO session, 2 ok, not an ISO session
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@ -1243,7 +1277,7 @@ void isoburn_disc_write(struct burn_write_opts *o, struct burn_disc *disc);
|
|||||||
Hint: If only burn_write_opts and not burn_drive is known, then the drive
|
Hint: If only burn_write_opts and not burn_drive is known, then the drive
|
||||||
can be obtained by burn_write_opts_get_drive().
|
can be obtained by burn_write_opts_get_drive().
|
||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
@parm d The drive to which the track with the fifo gets burned.
|
@param d The drive to which the track with the fifo gets burned.
|
||||||
@param size The total size of the fifo
|
@param size The total size of the fifo
|
||||||
@param free_bytes The current free capacity of the fifo
|
@param free_bytes The current free capacity of the fifo
|
||||||
@param status_text Returns a pointer to a constant text, see below
|
@param status_text Returns a pointer to a constant text, see below
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2008.12.04.175459"
|
#define Xorriso_timestamP "2008.12.05.171005"
|
||||||
|
Loading…
Reference in New Issue
Block a user