New option update_r, -find actions "update" and "add_missing" (not yet completed)

This commit is contained in:
2008-03-01 15:13:13 +00:00
parent 0c73f1ecac
commit feb783a9c0
6 changed files with 178 additions and 61 deletions

View File

@ -2393,6 +2393,10 @@ struct FindjoB {
12= alter_date_r type date
13= find
14= compare disk_equivalent_of_start_path
15= in_iso
16= not_in_iso
17= update
18= add_missing
*/
int action;
char *target;
@ -4477,10 +4481,15 @@ I thought to have seen a libisofs bug here but it seems that it was an illusion
}
int Xorriso_find_compare(struct XorrisO *xorriso, char *iso_path,
char *iso_prefix, char *disk_prefix, int flag)
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
@param flag bit0= update rather than compare
*/
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
char *iso_path, char *iso_prefix, char *disk_prefix,
int flag)
{
int ret, result;
int ret, result, uret;
char disk_path[SfileadrL], adrc[SfileadrL];
if(strncmp(iso_path, iso_prefix, strlen(iso_prefix))!=0)
@ -4500,6 +4509,14 @@ int Xorriso_find_compare(struct XorrisO *xorriso, char *iso_path,
2|(1<<29));
if(ret<xorriso->find_compare_result)
xorriso->find_compare_result= ret;
if(flag&1) {
if(ret==0) {
uret= Xorriso_update_interpreter(xorriso, boss_iter,
result, disk_path, iso_path, 0);
if(uret<=0)
ret= 0;
}
}
return(ret);
}
@ -6078,7 +6095,7 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
char *abs_path, char *show_path, int depth, int flag)
{
int ret= 0, type, action= 0, dpl= 0, compare_result;
int ret= 0, type, action= 0, dpl= 0, compare_result, uret;
uid_t user= 0;
gid_t group= 0;
time_t date= 0;
@ -6093,7 +6110,8 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
action= 0;
if(action<0)
action= 0;
if(action==15 || action==16) { /* in_iso , not_in_iso */
if(action==15 || action==16 || action==18) {
/* in_iso , not_in_iso, add_missing */
Findjob_get_start_path(job, &disk_prefix, 0);
if(strncmp(abs_path, disk_prefix, strlen(disk_prefix))!=0)
return(-1);
@ -6107,20 +6125,33 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
return(ret);
}
if(action==15) {
if(action==15) { /* in_iso */
ret= Xorriso_iso_lstat(xorriso, iso_path, &stbuf, 0);
if(ret==-1)
return(1);
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
Xorriso_result(xorriso, 0);
ret= 1;
} else if(action==16) {
} else if(action==16) { /* not_in_iso */
ret= Xorriso_compare_2_files(xorriso, abs_path, iso_path, abs_path+dpl,
&compare_result, 4);
if(ret<xorriso->find_compare_result)
xorriso->find_compare_result= ret;
if(ret>=0)
ret= 1;
} else if(action==18) { /* add_missing */
ret= Xorriso_compare_2_files(xorriso, abs_path, iso_path, abs_path+dpl,
&compare_result, 4);
if(ret<xorriso->find_compare_result)
xorriso->find_compare_result= ret;
if(ret==0) {
uret= Xorriso_update_interpreter(xorriso, NULL, compare_result,
abs_path, iso_path, 0);
if(uret<=0)
ret= 0;
}
if(ret>=0)
ret= 1;
} else {
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
Xorriso_result(xorriso, 0);
@ -7048,9 +7079,12 @@ ex:;
}
int Xorriso_update_interpreter(struct XorrisO *xorriso, int compare_result,
char *disk_path, char *iso_rr_path,
int flag)
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
*/
int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
int compare_result, char *disk_path,
char *iso_rr_path, int flag)
{
int ret;
char sfe[5*SfileadrL];
@ -7059,7 +7093,7 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, int compare_result,
/* cannot open regular disk file, early eof of disk file */
sprintf(xorriso->info_text, "Problems with reading disk file %s\n",
Text_shellsafe(disk_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 1);
xorriso->find_compare_result= -1;
return(1);
}
@ -7070,20 +7104,20 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, int compare_result,
/* <<< tolerate for now: disk_path being softlink to dir, iso being dir */
/* <<< to be obsoleted by proper link handling in compare_2_files */
ret= Xorriso_rmi(xorriso, NULL, iso_rr_path, 1);
ret= Xorriso_rmi(xorriso, boss_iter, iso_rr_path, 1);
if(ret>0)
ret= Xorriso_graft_in(xorriso, disk_path, iso_rr_path, 2);
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, 2);
sprintf(xorriso->info_text, "Deleted and re-added ");
} else if(compare_result&(1)) {
/* disk_adr not existing */
ret= Xorriso_rmi(xorriso, NULL, iso_rr_path, 1);
ret= Xorriso_rmi(xorriso, boss_iter, iso_rr_path, 1);
sprintf(xorriso->info_text, "Deleted ");
} else if(compare_result&(2|128|(1<<12)|(1<<14)|(1<<15))) {
/* iso_adr not existing, size, cannot open iso file, early eof of iso file
content bytes differ */
ret= Xorriso_graft_in(xorriso, disk_path, iso_rr_path, 2);
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, 2);
sprintf(xorriso->info_text, "Added/overwrote ");
} else if(compare_result&(4|16|32|256|512|1024)) {
@ -7095,7 +7129,7 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, int compare_result,
ret= 1;
if(ret>0 && xorriso->info_text[0]) {
strcat(xorriso->info_text, Text_shellsafe(iso_rr_path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 1);
}
return(ret);
}
@ -7194,7 +7228,7 @@ int Xorriso_option_add(struct XorrisO *xorriso, int argc, char **argv,
goto problem_handler;
strcpy(source, eff_path);
ret= Xorriso_graft_in(xorriso, source, target, 0);
ret= Xorriso_graft_in(xorriso, NULL, source, target, 0);
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
sprintf(xorriso->info_text, "Added to ISO image: %s '%s'='%s'\n",
@ -7274,7 +7308,7 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso,
{ret= -1; goto ex;}
}
Findjob_set_action_ad(job, t_type, t, 0);
ret= Xorriso_findi(xorriso, job, NULL, optv[i], &dir_stbuf, 0, 0);
ret= Xorriso_findi(xorriso, job, NULL, NULL, optv[i], &dir_stbuf, 0, 0);
Findjob_destroy(&job, 0);
} else
ret= Xorriso_set_time(xorriso, optv[i], t, t_type);
@ -7639,7 +7673,7 @@ int Xorriso_option_chgrpi(struct XorrisO *xorriso, char *gid,
{ret= -1; goto ex;}
}
Findjob_set_action_chgrp(job, gid_number, 0);
ret= Xorriso_findi(xorriso, job, NULL, optv[i], &dir_stbuf, 0, 0);
ret= Xorriso_findi(xorriso, job, NULL, NULL, optv[i], &dir_stbuf, 0, 0);
Findjob_destroy(&job, 0);
} else
ret= Xorriso_set_gid(xorriso, optv[i], gid_number, 0);
@ -7692,7 +7726,7 @@ int Xorriso_option_chmodi(struct XorrisO *xorriso, char *mode,
{ret= -1; goto ex;}
}
Findjob_set_action_chmod(job, mode_and, mode_or, 0);
ret= Xorriso_findi(xorriso, job, NULL, optv[i], &dir_stbuf, 0, 0);
ret= Xorriso_findi(xorriso, job, NULL, NULL, optv[i], &dir_stbuf, 0, 0);
Findjob_destroy(&job, 0);
} else {
ret= Xorriso_set_st_mode(xorriso, optv[i], mode_and, mode_or, 0);
@ -7745,7 +7779,7 @@ int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid,
{ret= -1; goto ex;}
}
Findjob_set_action_chown(job, uid_number, 0);
ret= Xorriso_findi(xorriso, job, NULL, optv[i], &dir_stbuf, 0, 0);
ret= Xorriso_findi(xorriso, job, NULL, NULL, optv[i], &dir_stbuf, 0, 0);
Findjob_destroy(&job, 0);
} else
ret= Xorriso_set_uid(xorriso, optv[i], uid_number, 0);
@ -7943,7 +7977,7 @@ int Xorriso_option_cpri(struct XorrisO *xorriso, int argc, char **argv,
goto problem_handler;
}
}
ret= Xorriso_graft_in(xorriso, eff_origin, eff_dest, 0);
ret= Xorriso_graft_in(xorriso, NULL, eff_origin, eff_dest, 0);
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
sprintf(xorriso->info_text, "Added to ISO image: %s '%s'='%s'\n",
@ -8454,15 +8488,18 @@ not_enough_arguments:;
Findjob_set_action_subjob(job, 13, new_job, 0);
job= new_job;
} else if(strcmp(cpt, "compare")==0) {
} else if(strcmp(cpt, "compare")==0 || strcmp(cpt, "update")==0) {
if(i+1>=end_idx)
goto not_enough_arguments;
i++;
action= 14;
if(strcmp(cpt, "update")==0)
action= 17;
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, argv[i],
other_path_start, 1|2|4|8);
if(ret<=0)
goto ex;
Findjob_set_action_target(job, 14, other_path_start, 0);
Findjob_set_action_target(job, action, other_path_start, 0);
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdi, start_path,sfe, 1|2|4);
if(ret<=0)
goto ex;
@ -8471,7 +8508,8 @@ not_enough_arguments:;
Xorriso_pacifier_reset(xorriso, 0);
mem_lut= xorriso->last_update_time;
}
} else if(strcmp(cpt, "in_iso")==0 || strcmp(cpt, "not_in_iso")==0) {
} else if(strcmp(cpt, "in_iso")==0 || strcmp(cpt, "not_in_iso")==0 ||
strcmp(cpt, "add_missing")==0) {
if(i+1>=end_idx)
goto not_enough_arguments;
i++;
@ -8481,6 +8519,8 @@ not_enough_arguments:;
goto ex;
if(strcmp(cpt, "in_iso")==0)
action= 15;
else if(strcmp(cpt, "add_missing")==0)
action= 18;
else
action= 16;
Findjob_set_action_target(job, action, other_path_start, 0);
@ -8516,7 +8556,8 @@ sorry_ex:;
ret= Xorriso_findx(xorriso, first_job, "", start_path, &dir_stbuf, 0, NULL,
0);
else
ret= Xorriso_findi(xorriso, first_job, NULL, start_path, &dir_stbuf, 0, 0);
ret= Xorriso_findi(xorriso, first_job, NULL, NULL,
start_path, &dir_stbuf, 0, 0);
ex:;
if(mem_lut!=xorriso->last_update_time && mem_lut!=0.0 && !(flag&2))
Xorriso_pacifier_callback(xorriso, "content bytes read",
@ -9205,7 +9246,7 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
goto problem_handler;
}
}
ret= Xorriso_rename(xorriso, eff_origin, eff_dest, 0);
ret= Xorriso_rename(xorriso, NULL, eff_origin, eff_dest, 0);
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
sprintf(xorriso->info_text, "Renamed in ISO image: %s to %s\n",
@ -9987,7 +10028,8 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path,
ret= Xorriso_compare_2_files(xorriso, disk_path, ipth, "", &result,
2| (1<<30) | ((flag&4)<<27));
if(ret==0) {
uret= Xorriso_update_interpreter(xorriso, result, disk_path, ipth, 0);
uret= Xorriso_update_interpreter(xorriso, NULL, result, disk_path, ipth,
0);
if(uret<=0)
ret= -1;
}
@ -10524,6 +10566,10 @@ next_command:;
(*idx)+= 2;
ret= Xorriso_option_update(xorriso, arg1, arg2, 1);
} else if(strcmp(cmd,"update_r")==0) {
(*idx)+= 2;
ret= Xorriso_option_update(xorriso, arg1, arg2, 1|8);
} else if(strcmp(cmd,"volid")==0) {
(*idx)++;
ret= Xorriso_option_volid(xorriso,arg1,0);