New -check_media option -patch_lba0=
This commit is contained in:
@ -2976,11 +2976,6 @@ int Xorriso_restore_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
struct PermiteM *perm_stack_mem;
|
||||
struct stat stbuf;
|
||||
|
||||
#ifdef NIX
|
||||
struct stat target_stbuf;
|
||||
target_is_dir;
|
||||
#endif
|
||||
|
||||
perm_stack_mem= xorriso->perm_stack;
|
||||
|
||||
/* Avoiding large local memory objects in order to save stack space */
|
||||
@ -3221,11 +3216,6 @@ int Xorriso_restore(struct XorrisO *xorriso,
|
||||
struct stat stbuf;
|
||||
struct PermiteM *perm_stack_mem;
|
||||
|
||||
#ifdef NIX
|
||||
struct stat target_stbuf;
|
||||
int target_is_dir;
|
||||
#endif
|
||||
|
||||
perm_stack_mem= xorriso->perm_stack;
|
||||
|
||||
ret= Xorriso_path_is_excluded(xorriso, disk_path, !(flag&4));
|
||||
@ -6182,6 +6172,148 @@ int Xorriso_atip(struct XorrisO *xorriso, int flag)
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_update_in_sector_map(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist, int read_chunk,
|
||||
struct CheckmediajoB *job, int flag)
|
||||
{
|
||||
int sectors, sector_size, sector_blocks, ret;
|
||||
struct SectorbitmaP *map;
|
||||
|
||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||
if(job->use_dev == 1)
|
||||
return(1);
|
||||
map= job->sector_map;
|
||||
sectors= Spotlist_block_count(spotlist, 0);
|
||||
if(sectors <= 0)
|
||||
return(0);
|
||||
sector_size= Spotlist_sector_size(spotlist, read_chunk, 0);
|
||||
sector_blocks= sector_size / 2048;
|
||||
if(sector_blocks > 1)
|
||||
sectors= sectors / sector_blocks + !!(sectors % sector_blocks);
|
||||
ret= Sectorbitmap_new(&(xorriso->in_sector_map), sectors, sector_size, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
if(map != NULL)
|
||||
Sectorbitmap_copy(map, xorriso->in_sector_map, 0);
|
||||
ret= Xorriso_spotlist_to_sectormap(xorriso, spotlist, read_chunk,
|
||||
&(xorriso->in_sector_map), 1);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= obtain iso_lba from indev
|
||||
bit1= head_buffer already contains a valid head
|
||||
bit2= issue message about success
|
||||
bit3= check whether source blocks are banned by in_sector_map
|
||||
*/
|
||||
int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize,
|
||||
char *head_buffer, struct CheckmediajoB *job,
|
||||
int flag)
|
||||
{
|
||||
int ret, full_size, i;
|
||||
char *headpt;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
off_t seek_ret;
|
||||
|
||||
if(flag & 1) {
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to learn current session lba", 1);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
ret= isoburn_disc_get_msc1(drive, &iso_lba);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
drive= NULL; /* indev will not be used furtherly */
|
||||
}
|
||||
if(job == NULL) {
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to update at lba 0 to 31", 2);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
}
|
||||
if(iso_lba < 32)
|
||||
return(2);
|
||||
if(!(flag & 2)) {
|
||||
/* head_buffer was not filled yet. Read it from output media. */
|
||||
if(job != NULL && job->data_to_fd >= 0) {
|
||||
if((flag & 8) && job->sector_map != NULL) {
|
||||
ret= Sectorbitmap_bytes_are_set(job->sector_map,
|
||||
((off_t) iso_lba) * (off_t) 2048,
|
||||
((off_t) (iso_lba + 32)) * ((off_t) 2048) - (off_t) 1, 0);
|
||||
if(ret <= 0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"ISO image head at lba %d is marked as invalid blocks in file copy",
|
||||
iso_lba);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",
|
||||
0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
seek_ret= lseek(job->data_to_fd, ((off_t) 2048) * (off_t) iso_lba,
|
||||
SEEK_SET);
|
||||
if(seek_ret == -1)
|
||||
ret= 0;
|
||||
else
|
||||
ret= read(job->data_to_fd, head_buffer, 64 * 1024);
|
||||
if(ret < 64 * 1024) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot read ISO image head from file copy");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0);
|
||||
return(0);
|
||||
}
|
||||
} else {
|
||||
ret= isoburn_read_iso_head(drive, iso_lba, &isosize, head_buffer, 2);
|
||||
if(ret<=0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot read freshly written ISO image head");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* patch ISO header */
|
||||
full_size= iso_lba + isosize;
|
||||
headpt= head_buffer + 32*1024;
|
||||
for(i=0;i<4;i++)
|
||||
headpt[87-i]= headpt[80+i]= (full_size >> (8*i)) & 0xff;
|
||||
|
||||
if(job != NULL) {
|
||||
seek_ret= lseek(job->data_to_fd, (off_t) 0, SEEK_SET);
|
||||
if(seek_ret == -1)
|
||||
ret= 0;
|
||||
else
|
||||
ret= write(job->data_to_fd, head_buffer, 64 * 1024);
|
||||
if(ret < 64 * 1024) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot write ISO image head to file copy");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0);
|
||||
return(0);
|
||||
}
|
||||
} else {
|
||||
ret= burn_random_access_write(drive, (off_t) 0, head_buffer,
|
||||
(off_t) (64*1024), 1);
|
||||
if(ret<=0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot write new ISO image head to LBA 0");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(flag & 4) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Overwrote LBA 0 to 31 by 64 KiB from LBA %d", iso_lba);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param write_start_address is valid if >=0
|
||||
@param tsize is valid if >0
|
||||
@param flag bit0= grow_overwriteable_iso
|
||||
@ -6191,7 +6323,8 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
|
||||
char *track_source, off_t tsize, int flag)
|
||||
{
|
||||
int ret, fd, unpredicted_size, profile_number, is_cd= 0, dummy, nwa= -1;
|
||||
int isosize= -1, i, full_size, do_isosize;
|
||||
int isosize= -1, do_isosize;
|
||||
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
struct burn_write_opts *burn_options;
|
||||
@ -6203,7 +6336,7 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
|
||||
struct burn_source *data_src, *fifo_src;
|
||||
enum burn_disc_status disc_state;
|
||||
char reasons[BURN_REASONS_LEN], sfe[5*SfileadrL], profile_name[80];
|
||||
char head_buffer[64*1024], *headpt;
|
||||
char head_buffer[64*1024];
|
||||
|
||||
do_isosize= !!(flag&2);
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
@ -6378,6 +6511,17 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
#ifndef NIX
|
||||
|
||||
if(flag & 1) {
|
||||
ret= Xorriso_update_iso_lba0(xorriso, nwa, isosize, head_buffer, NULL,
|
||||
flag & 2);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* Update ISO header at lba 0 */
|
||||
if((flag&1) && nwa >= 32) {
|
||||
if(!do_isosize) {
|
||||
@ -6407,6 +6551,8 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* NIX */
|
||||
|
||||
sprintf(xorriso->info_text, "Writing to %s completed sucessfully.\n\n",
|
||||
Text_shellsafe(xorriso->outdev,sfe,0));
|
||||
Xorriso_info(xorriso, 0);
|
||||
@ -6967,42 +7113,13 @@ ex:
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_update_in_sector_map(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist, int read_chunk,
|
||||
struct CheckmediajoB *job, int flag)
|
||||
{
|
||||
int sectors, sector_size, sector_blocks, ret;
|
||||
struct SectorbitmaP *map;
|
||||
|
||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||
if(job->use_dev == 1)
|
||||
return(1);
|
||||
map= job->sector_map;
|
||||
sectors= Spotlist_block_count(spotlist, 0);
|
||||
if(sectors <= 0)
|
||||
return(0);
|
||||
sector_size= Spotlist_sector_size(spotlist, read_chunk, 0);
|
||||
sector_blocks= sector_size / 2048;
|
||||
if(sector_blocks > 1)
|
||||
sectors= sectors / sector_blocks + !!(sectors % sector_blocks);
|
||||
ret= Sectorbitmap_new(&(xorriso->in_sector_map), sectors, sector_size, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
if(map != NULL)
|
||||
Sectorbitmap_copy(map, xorriso->in_sector_map, 0);
|
||||
ret= Xorriso_spotlist_to_sectormap(xorriso, spotlist, read_chunk,
|
||||
&(xorriso->in_sector_map), 1);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
struct CheckmediajoB *job, int flag)
|
||||
{
|
||||
int media_blocks= 0, read_chunk= 16, ret, mode, start_lba= 0;
|
||||
int blocks, os_errno, i, j, last_track_end= -1, track_blocks, track_lba;
|
||||
int num_sessions, num_tracks, declare_untested= 0;
|
||||
char sfe[5*SfileadrL], *toc_info= NULL;
|
||||
char *toc_info= NULL;
|
||||
struct burn_drive *drive;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct isoburn_toc_disc *isoburn_disc= NULL;
|
||||
@ -7043,17 +7160,9 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
}
|
||||
Xorriso_toc_to_string(xorriso, &toc_info, 4 * !job->map_with_volid);
|
||||
}
|
||||
|
||||
if(job->data_to_path[0]) {
|
||||
job->data_to_fd= open(job->data_to_path, O_WRONLY | O_CREAT,
|
||||
S_IRUSR | S_IWUSR);
|
||||
if(job->data_to_fd == -1) {
|
||||
sprintf(xorriso->info_text, "Cannot open path %s",
|
||||
Text_shellsafe(job->data_to_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
ret= Xorriso_open_job_data_to(xorriso, job, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
Xorriso_pacifier_reset(xorriso, 0);
|
||||
job->start_time= time(NULL);
|
||||
mode= job->mode;
|
||||
@ -7161,16 +7270,18 @@ no_content_visible:;
|
||||
xorriso->pacifier_count, xorriso->pacifier_total, "", 1);
|
||||
ret= 1;
|
||||
ex:;
|
||||
|
||||
if(job->data_to_fd != -1)
|
||||
close(job->data_to_fd);
|
||||
job->data_to_fd= -1;
|
||||
|
||||
if(ret > 0)
|
||||
ret= Xorriso_update_in_sector_map(xorriso, *spotlist, read_chunk, job, 0);
|
||||
|
||||
if(ret > 0 && job->sector_map_path[0]) {
|
||||
if(ret > 0) {
|
||||
ret= Xorriso_spotlist_to_sectormap(xorriso, *spotlist, read_chunk,
|
||||
&(job->sector_map), 0);
|
||||
if(ret > 0) {
|
||||
if(ret > 0 && job->sector_map_path[0]) {
|
||||
ret= Sectorbitmap_to_file(job->sector_map, job->sector_map_path, toc_info,
|
||||
xorriso->info_text, &os_errno, 0);
|
||||
if(ret <= 0) {
|
||||
|
Reference in New Issue
Block a user