New option -assert_volid

This commit is contained in:
Thomas Schmitt 2008-12-14 09:31:52 +00:00
parent 1ab53e33ef
commit c6ebbd5049
6 changed files with 161 additions and 34 deletions

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Dec 10, 2008"
.TH XORRISO 1 "Dec 13, 2008"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -561,6 +561,14 @@ until the next -dev or -indev. After the image has been loaded once, the
setting is valid for -rollback until next -dev or -indev, where it
will be reset to "auto".
.TP
\fB\-assert_volid\fR pattern severity
Refuse to load ISO images with volume ids which do not match the given
search pattern. When refusing an image, give up the input drive and issue
an event of the given severity. An empty search pattern accepts any image.
.br
This option does not hamper the creation of an empty image from blank
input media and does not discard an already loaded image.
.TP
\fB\-in_charset\fR character_set_name
Set the character set from which to convert file names when loading an
image. This has eventually to be done before specifying -dev , -indev or
@ -2834,16 +2842,17 @@ Seconds since Jan 1 1970:
.B =1194531416
.SS
.B Incremental backup of a few directory trees
This does the following to directories /open_source_project and /personal_mail
in the ISO image:
create them if not existing yet,
compare them with their disk counterparts,
add disk file objects which are missing yet,
overwrite those which are different on disk,
and delete those which have vanished on disk.
But do not add or overwrite files matching *.o, *.swp.
This changes the directory trees /open_source_project and /personal_mail
in the ISO image so that they become exact copies of their disk counterparts.
ISO file objects get created, deleted or get their attributes adjusted
accordingly.
Files with names matching *.o or *.swp get excluded explicitely.
.br
\fB$\fR xorriso -dev /dev/sr0 \\
Only media with the expected volume id or blank media are accepted.
.br
\fB$\fR xorriso -assert_volid 'PROJECTS_MAIL_*' FATAL \\
.br
-dev /dev/sr0 \\
.br
-volid PROJECTS_MAIL_"$(date '+%Y_%m_%d_%H%M%S')" \\
.br

View File

@ -1745,6 +1745,31 @@ int Sregex_resolve_var(char *form, char *vars[][2], int num_vars,
}
/* @param flag bit0= only test expression whether compilable
*/
int Sregex_match(char *pattern, char *text, int flag)
{
int ret;
char re_text[2*SfileadrL];
regex_t re;
regmatch_t match[1];
Xorriso__bourne_to_reg(pattern, re_text, 0);
ret= regcomp(&re, re_text, 0);
if(ret != 0)
return(-1);
if(flag & 1) {
regfree(&re);
return(1);
}
ret= regexec(&re, text, 1, match, 0);
regfree(&re);
if(ret != 0)
return(0);
return(1);
}
#endif /* Xorriso_sregex_externaL */
@ -3805,8 +3830,10 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->do_global_uid= 0;
m->global_uid= 0;
strcpy(m->volid, "ISOIMAGE");
m->loaded_volid[0]= 0;
m->volid_default= 1;
m->loaded_volid[0]= 0;
m->assert_volid[0]= 0;
m->assert_volid_sev[0]= 0;
m->publisher[0]= 0;
m->application_id[0]= 0;
m->session_logfile[0]= 0;
@ -6042,7 +6069,16 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso, filter, fp, flag & 2);
}
is_default= (xorriso->assert_volid[0] == 0);
sprintf(line, "-assert_volid ");
Text_shellsafe(xorriso->assert_volid, line, 1);
strcat(line, " ");
Text_shellsafe(xorriso->assert_volid_sev, line, 1);
strcat(line, "\n");
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
do_single= 0;
if(filter != NULL)
if(strncmp(filter, "-indev", 6) == 0 ||
@ -10802,11 +10838,6 @@ int Xorriso_option_application_id(struct XorrisO *xorriso, char *name,
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0);
}
#ifdef NIX
Xorriso_set_application_id(xorriso, name, 0);
#endif
if(Sfile_str(xorriso->application_id,name,0)<=0)
return(-1);
return(1);
@ -10864,6 +10895,51 @@ ex:;
}
/* Option -assert_volid */
int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern,
char *severity, int flag)
{
int ret, sev;
char *sev_text= "";
if(strlen(pattern)>=sizeof(xorriso->assert_volid)) {
sprintf(xorriso->info_text,
"Name too long with option -application_id (%d > %d)",
(int) strlen(pattern), (int) sizeof(xorriso->assert_volid)-1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0);
}
if(pattern[0]) {
ret= Sregex_match(pattern, "", 1);
if(ret <= 0) {
sprintf(xorriso->info_text, "-assert_volid: Cannot use given pattern.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
}
if(severity[0] != 0 || pattern[0] != 0) {
if(severity[0] == 0) {
if(strcmp(xorriso->abort_on_text, "NEVER") == 0)
sev_text= "ABORT";
else
sev_text= xorriso->abort_on_text;
} else
sev_text= severity;
ret= Xorriso__text_to_sev(sev_text, &sev, 0);
if(ret<=0) {
sprintf(xorriso->info_text, "-assert_volid: Not a known severity name : ");
Text_shellsafe(severity, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(ret);
}
}
if(Sfile_str(xorriso->assert_volid, pattern,0) <= 0)
return(-1);
strcpy(xorriso->assert_volid_sev, sev_text);
return(1);
}
/* Option -backslash_codes */
int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
int flag)
@ -12876,6 +12952,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" -rom_toc_scan \"on\"|\"off\"[:\"emul_on\"|\"emul_off\"]",
" Enable scanning for ISO sessions on read-only drives/media",
" resp. on overwriteable media with emulated TOC.",
" -assert_volid pattern severity",
" Accept input image only if its volume id matches pattern.",
" -charset name Set the character set name to be used for file name",
" conversion from and to media.",
" -in_charset name",
@ -15373,7 +15451,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
""
};
static char arg2_commands[][40]= {
"boot_image","compare","compare_r",
"assert_volid","boot_image","compare","compare_r",
"errfile_log","error_behavior","extract","extract_single",
"load","logfile",
"map","map_single","page","return_with","update","update_r",
@ -15537,6 +15615,10 @@ next_command:;
} else if(strcmp(cmd,"as")==0) {
ret= Xorriso_option_as(xorriso, argc, argv, idx, 0);
} else if(strcmp(cmd,"assert_volid")==0) {
(*idx)+= 2;
ret= Xorriso_option_assert_volid(xorriso, arg1, arg2, 0);
} else if(strcmp(cmd,"backslash_codes")==0) {
(*idx)++;
ret= Xorriso_option_backslash_codes(xorriso, arg1, 0);

View File

@ -293,6 +293,10 @@ int Xorriso_option_application_id(struct XorrisO *xorriso, char *name,
int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag);
/* Option -assert_volid */
int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern,
char *severity, int flag);
/* Option -backslash_codes */
int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
int flag);

View File

@ -120,6 +120,8 @@ struct XorrisO { /* the global context of xorriso */
char volid[33];
int volid_default;
char loaded_volid[33];
char assert_volid[SfileadrL];
char assert_volid_sev[80];
char publisher[129];
char application_id[129];
@ -820,5 +822,9 @@ int Sectorbitmap_copy(struct SectorbitmaP *from, struct SectorbitmaP *to,
/* bit0= append (text!=NULL) */
int Sregex_string(char **handle, char *text, int flag);
/* @param flag bit0= only test expression whether compilable
*/
int Sregex_match(char *pattern, char *text, int flag);
#endif /* Xorriso_private_includeD */

View File

@ -1 +1 @@
#define Xorriso_timestamP "2008.12.13.161650"
#define Xorriso_timestamP "2008.12.14.093125"

View File

@ -469,6 +469,44 @@ int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag)
}
int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag)
{
int ret, image_blocks;
char volid[33];
struct burn_drive_info *dinfo;
struct burn_drive *drive;
if(xorriso->assert_volid[0] == 0)
return(1);
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to perform -assert_volid", 0);
if(ret<=0)
return(0);
ret= isoburn_read_iso_head(drive, msc1, &image_blocks, volid, 1);
Xorriso_process_msg_queues(xorriso,0);
if(ret <= 0) {
sprintf(xorriso->info_text,
"-assert_volid: Cannot determine Volume Id at LBA %d.", msc1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
xorriso->assert_volid_sev, 0);
}
ret= Sregex_match(xorriso->assert_volid, volid, 0);
if(ret < 0)
return(2);
if(ret == 0) {
strcpy(xorriso->info_text,
"-assert_volid: Volume id does not match pattern: ");
Text_shellsafe(xorriso->assert_volid, xorriso->info_text, 1);
strcat(xorriso->info_text, " <> ");
Text_shellsafe(xorriso->loaded_volid, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
xorriso->assert_volid_sev, 0);
return(0);
}
return(ret);
}
/* @param flag bit0= aquire as isoburn input drive
bit1= aquire as libburn output drive (as isoburn drive if bit0)
bit2= regard overwriteable media as blank
@ -647,6 +685,9 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
"Loading ISO image tree from LBA %d", load_lba);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
}
ret= Xorriso_assert_volid(xorriso, load_lba, 0);
if(ret <= 0)
goto ex;
}
/* <<< */
@ -711,18 +752,6 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
if(!(flag&32)) {
Xorriso_toc(xorriso, 1 | 8);
if(xorriso->loaded_volid[0]!=0) {
#ifdef NIX
sprintf(xorriso->result_line,"Volume id : '%s'\n",
xorriso->loaded_volid);
Xorriso_result(xorriso,0);
if(strcmp(xorriso->loaded_volid, xorriso->volid)!=0 &&
!xorriso->volid_default) {
sprintf(xorriso->result_line, "New volume id: '%s'\n", xorriso->volid);
Xorriso_result(xorriso,0);
}
#else
sprintf(xorriso->info_text,"Volume id : '%s'\n",
xorriso->loaded_volid);
Xorriso_info(xorriso, 0);
@ -731,9 +760,6 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
sprintf(xorriso->info_text, "New volume id: '%s'\n", xorriso->volid);
Xorriso_info(xorriso, 0);
}
#endif /* ! NIX */
}
}
ret= 1+not_writeable;