Replaced some large local variables by other means in xorriso/disk_ops.c

This commit is contained in:
Thomas Schmitt 2011-05-02 19:16:41 +00:00
parent 84d2a2ba9d
commit 59c60d410e
2 changed files with 153 additions and 111 deletions

View File

@ -42,9 +42,12 @@ int Xorriso_resolve_link(struct XorrisO *xorriso,
ssize_t l; ssize_t l;
struct stat stbuf; struct stat stbuf;
int link_count= 0, ret, show_errno= 0; int link_count= 0, ret, show_errno= 0;
char buf[SfileadrL], dirbuf[SfileadrL], *lpt, *spt, sfe[5*SfileadrL]; char *buf= NULL, *dirbuf= NULL, *lpt, *spt;
static int link_limit= 100; static int link_limit= 100;
Xorriso_alloc_meM(buf, char, SfileadrL);
Xorriso_alloc_meM(dirbuf, char, SfileadrL);
if(!(flag&1)) if(!(flag&1))
if(stat(link_path, &stbuf)==-1) if(stat(link_path, &stbuf)==-1)
if(errno==ELOOP) { if(errno==ELOOP) {
@ -57,35 +60,35 @@ int Xorriso_resolve_link(struct XorrisO *xorriso,
if(l==-1) { if(l==-1) {
handle_error:; handle_error:;
Xorriso_msgs_submit(xorriso, 0, link_path, 0, "ERRFILE", 0); Xorriso_msgs_submit(xorriso, 0, link_path, 0, "ERRFILE", 0);
sprintf(xorriso->info_text, "Cannot obtain link target of : %s", sprintf(xorriso->info_text, "Cannot obtain link target of : ");
Text_shellsafe(link_path, sfe, 0)); Text_shellsafe(link_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0);
handle_abort:; handle_abort:;
if(strcmp(lpt, link_path)!=0) { if(strcmp(lpt, link_path)!=0) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Problem occured with intermediate path : %s", "Problem occured with intermediate path : ");
Text_shellsafe(lpt, sfe, 0)); Text_shellsafe(lpt, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE",0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
} }
return(0); {ret= 0; goto ex;}
} }
buf[l]= 0; buf[l]= 0;
if(l==0) { if(l==0) {
Xorriso_msgs_submit(xorriso, 0, link_path, 0, "ERRFILE", 0); Xorriso_msgs_submit(xorriso, 0, link_path, 0, "ERRFILE", 0);
sprintf(xorriso->info_text, "Empty link target with : %s", sprintf(xorriso->info_text, "Empty link target with : ");
Text_shellsafe(link_path, sfe, 0)); Text_shellsafe(link_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
goto handle_abort; goto handle_abort;
} }
if(flag&1) { if(flag&1) {
strcpy(result_path, buf); strcpy(result_path, buf);
return(1); {ret= 1; goto ex;}
} }
/* normalize relative to disk_path */ /* normalize relative to disk_path */
if(Sfile_str(dirbuf, lpt, 0)<=0) if(Sfile_str(dirbuf, lpt, 0)<=0)
return(-1); {ret= -1; goto ex;}
while(1) { while(1) {
spt= strrchr(dirbuf,'/'); spt= strrchr(dirbuf,'/');
if(spt!=NULL) { if(spt!=NULL) {
@ -97,7 +100,7 @@ handle_abort:;
} }
ret= Xorriso_normalize_img_path(xorriso, dirbuf, buf, result_path, 2|4); ret= Xorriso_normalize_img_path(xorriso, dirbuf, buf, result_path, 2|4);
if(ret<=0) if(ret<=0)
return(ret); goto ex;
if(lstat(result_path, &stbuf)==-1) { if(lstat(result_path, &stbuf)==-1) {
lpt= result_path; lpt= result_path;
@ -111,14 +114,18 @@ handle_abort:;
if(link_count>link_limit) { if(link_count>link_limit) {
too_many_hops:; too_many_hops:;
Xorriso_msgs_submit(xorriso, 0, link_path, 0, "ERRFILE", 0); Xorriso_msgs_submit(xorriso, 0, link_path, 0, "ERRFILE", 0);
sprintf(xorriso->info_text, "Too many link hops with : %s", sprintf(xorriso->info_text, "Too many link hops with : ");
Text_shellsafe(link_path, sfe, 0)); Text_shellsafe(link_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, show_errno, Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, show_errno,
"FAILURE",0); "FAILURE", 0);
return(0); {ret= 0; goto ex;}
} }
} }
return(1); ret= 1;
ex:;
Xorriso_free_meM(buf);
Xorriso_free_meM(dirbuf);
return(ret);
} }
@ -174,7 +181,7 @@ int Xorriso_convert_modstring(struct XorrisO *xorriso, char *cmd, char *mode,
mode_t *mode_and, mode_t *mode_or, int flag) mode_t *mode_and, mode_t *mode_or, int flag)
{ {
int who_val= 0; int who_val= 0;
char sfe[5*SfileadrL], *mpt, *vpt, *opt; char *mpt, *vpt, *opt;
unsigned int num= 0; unsigned int num= 0;
mode_t mode_val,mask; mode_t mode_val,mask;
@ -260,8 +267,8 @@ int Xorriso_convert_modstring(struct XorrisO *xorriso, char *cmd, char *mode,
} else { } else {
unrecognizable:; unrecognizable:;
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"%s: Unrecognizable or faulty permission mode %s\n", cmd, "%s: Unrecognizable or faulty permission mode ", cmd);
Text_shellsafe(mode, sfe, 0)); Text_shellsafe(mode, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0); return(0);
} }
@ -277,13 +284,12 @@ int Xorriso_hop_link(struct XorrisO *xorriso, char *link_path,
{ {
int ret; int ret;
struct LinkiteM *litm; struct LinkiteM *litm;
char sfe[5*SfileadrL];
if(*link_stack != NULL) { if(*link_stack != NULL) {
if(Linkitem_get_link_count(*link_stack, 0) >= xorriso->follow_link_limit) { if(Linkitem_get_link_count(*link_stack, 0) >= xorriso->follow_link_limit) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Too many symbolic links in single tree branch at : %s", "Too many symbolic links in single tree branch at : ");
Text_shellsafe(link_path, sfe, 0)); Text_shellsafe(link_path, xorriso->info_text, 1);
if(!(flag&2)) if(!(flag&2))
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,"WARNING",flag&1); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,"WARNING",flag&1);
return(0); return(0);
@ -294,9 +300,8 @@ int Xorriso_hop_link(struct XorrisO *xorriso, char *link_path,
return(0); return(0);
ret= Linkitem_find(*link_stack, stbuf->st_dev, stbuf->st_ino, &litm, 0); ret= Linkitem_find(*link_stack, stbuf->st_dev, stbuf->st_ino, &litm, 0);
if(ret>0) { if(ret>0) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text, "Detected symbolic link loop around : ");
"Detected symbolic link loop around : %s", Text_shellsafe(link_path, xorriso->info_text, 1);
Text_shellsafe(link_path, sfe, 0));
if(!(flag&2)) if(!(flag&2))
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", flag&1); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", flag&1);
return(0); return(0);
@ -700,11 +705,13 @@ int Xorriso_sorted_dir_x(struct XorrisO *xorriso, char *dir_path,
int *filec, char ***filev, off_t boss_mem, int flag) int *filec, char ***filev, off_t boss_mem, int flag)
{ {
int count= 0, ret; int count= 0, ret;
char name[SfileadrL]; char *name= NULL;
struct DirseQ *dirseq= NULL; struct DirseQ *dirseq= NULL;
off_t mem; off_t mem;
struct DirentrY *last= NULL, *current= NULL; struct DirentrY *last= NULL, *current= NULL;
Xorriso_alloc_meM(name, char, SfileadrL);
*filec= 0; *filec= 0;
*filev= NULL; *filev= NULL;
mem= boss_mem; mem= boss_mem;
@ -722,22 +729,28 @@ int Xorriso_sorted_dir_x(struct XorrisO *xorriso, char *dir_path,
{ret= 0; goto ex;} {ret= 0; goto ex;}
current= (struct DirentrY *) calloc(1, sizeof(struct DirentrY)); current= (struct DirentrY *) calloc(1, sizeof(struct DirentrY));
if(current==NULL) if(current==NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
{ret= -1; goto ex;} {ret= -1; goto ex;}
}
current->adr= NULL; current->adr= NULL;
current->next= last; current->next= last;
last= current; last= current;
last->adr= strdup(name); last->adr= strdup(name);
if(last->adr==NULL) if(last->adr==NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
{ret= -1; goto ex;} {ret= -1; goto ex;}
}
count++; count++;
} }
*filec= count; *filec= count;
if(count==0) if(count==0)
{ret= 1; goto ex;} {ret= 1; goto ex;}
(*filev)= (char **) calloc(count, sizeof(char *)); (*filev)= (char **) calloc(count, sizeof(char *));
if(*filev==NULL) if(*filev==NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
{ret= -1; goto ex; } {ret= -1; goto ex; }
}
count= 0; count= 0;
for(current= last; current!=NULL; current= last) { for(current= last; current!=NULL; current= last) {
last= current->next; last= current->next;
@ -752,6 +765,7 @@ ex:;
free(current->adr); free(current->adr);
free((char *) current); free((char *) current);
} }
Xorriso_free_meM(name);
return(ret); return(ret);
} }
@ -765,11 +779,14 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
int filec, char **filev, off_t boss_mem, int flag) int filec, char **filev, off_t boss_mem, int flag)
{ {
int i, ret, was_error= 0, dfilec= 0, pass, passes; int i, ret, was_error= 0, dfilec= 0, pass, passes;
char sfe[5*SfileadrL], sfe2[5*SfileadrL], path[SfileadrL], *acl_text= NULL; char *path= NULL, *acl_text= NULL;
char *rpt, link_target[SfileadrL], **dfilev= NULL; char *rpt, *link_target= NULL, **dfilev= NULL;
off_t size; off_t size;
struct stat stbuf; struct stat stbuf;
Xorriso_alloc_meM(path, char, SfileadrL);
Xorriso_alloc_meM(link_target, char, SfileadrL);
rpt= xorriso->result_line; rpt= xorriso->result_line;
Sort_argv(filec, filev, 0); Sort_argv(filec, filev, 0);
@ -783,8 +800,8 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
} }
ret= lstat(path, &stbuf); ret= lstat(path, &stbuf);
if(ret==-1) { if(ret==-1) {
sprintf(xorriso->info_text, "Not found in local filesystem: %s", sprintf(xorriso->info_text, "Not found in local filesystem: ");
Text_shellsafe(path, sfe, 0)); Text_shellsafe(path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 1); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 1);
was_error++; was_error++;
continue; continue;
@ -795,7 +812,7 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
sprintf(xorriso->info_text,"Valid local files found: %d\n",filec-was_error); sprintf(xorriso->info_text,"Valid local files found: %d\n",filec-was_error);
Xorriso_info(xorriso,1); Xorriso_info(xorriso,1);
if(filec-was_error<=0) if(filec-was_error<=0)
return(!was_error); {ret= !was_error; goto ex;}
} }
passes= 1+!(flag&(4|8)); passes= 1+!(flag&(4|8));
@ -821,7 +838,8 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
if(filec>1) { if(filec>1) {
strcpy(xorriso->result_line, "\n"); strcpy(xorriso->result_line, "\n");
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
sprintf(xorriso->result_line, "%s:\n", Text_shellsafe(filev[i], sfe,0)); Text_shellsafe(filev[i], xorriso->result_line, 0);
strcat(xorriso->result_line, ":\n");
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
} }
ret= Xorriso_sorted_dir_x(xorriso, path, &dfilec, &dfilev, boss_mem, 0); ret= Xorriso_sorted_dir_x(xorriso, path, &dfilec, &dfilev, boss_mem, 0);
@ -862,22 +880,27 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
ret= Xorriso_show_dux_subs(xorriso, path, filev[i], &size, boss_mem, ret= Xorriso_show_dux_subs(xorriso, path, filev[i], &size, boss_mem,
NULL, flag&1); NULL, flag&1);
if(ret<0) if(ret<0)
return(-1); {ret= -1; goto ex;}
if(ret==0) if(ret==0)
continue; continue;
} }
sprintf(rpt, "%7.f ",(double) (size/1024)); sprintf(rpt, "%7.f ",(double) (size/1024));
} }
if(link_target[0]) if(link_target[0]) {
sprintf(xorriso->result_line+strlen(xorriso->result_line), "%s -> %s\n", Text_shellsafe(filev[i], xorriso->result_line, 1);
Text_shellsafe(filev[i], sfe, 0), strcat(xorriso->result_line, " -> ");
Text_shellsafe(link_target, sfe2, 0)); Text_shellsafe(link_target, xorriso->result_line, 1);
else } else {
sprintf(xorriso->result_line+strlen(xorriso->result_line), "%s\n", Text_shellsafe(filev[i], xorriso->result_line, 1);
Text_shellsafe(filev[i], sfe, 0)); }
strcat(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);
} }
return(!was_error); ret= !was_error;
ex:;
Xorriso_free_meM(path);
Xorriso_free_meM(link_target);
return(ret);
} }
@ -1086,11 +1109,13 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
gid_t group= 0; gid_t group= 0;
time_t date= 0; time_t date= 0;
mode_t mode_or= 0, mode_and= ~1; mode_t mode_or= 0, mode_and= ~1;
char *target, *text_2, sfe[5*SfileadrL], *disk_prefix, iso_path[SfileadrL]; char *target, *text_2, *wdi_mem= NULL, *disk_prefix, *iso_path= NULL;
char *basename; char *basename;
struct FindjoB *subjob; struct FindjoB *subjob;
struct stat stbuf; struct stat stbuf;
Xorriso_alloc_meM(iso_path, char, SfileadrL);
action= Findjob_get_action_parms(job, &target, &text_2, &user, &group, action= Findjob_get_action_parms(job, &target, &text_2, &user, &group,
&mode_and, &mode_or, &type, &date, &subjob, 0); &mode_and, &mode_or, &type, &date, &subjob, 0);
if(action<0) if(action<0)
@ -1116,7 +1141,8 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
ret= Xorriso_iso_lstat(xorriso, iso_path, &stbuf, 0); ret= Xorriso_iso_lstat(xorriso, iso_path, &stbuf, 0);
if(ret<0) if(ret<0)
{ret= 1; goto ex;} {ret= 1; goto ex;}
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0)); Text_shellsafe(show_path, xorriso->result_line, 0);
strcat(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);
ret= 1; ret= 1;
} else if(action==16) { /* not_in_iso */ } else if(action==16) { /* not_in_iso */
@ -1147,8 +1173,8 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
{ret= 1; goto ex;} {ret= 1; goto ex;}
ret= Xorriso_rmi(xorriso, NULL, (off_t) 0, iso_path, 1|32); ret= Xorriso_rmi(xorriso, NULL, (off_t) 0, iso_path, 1|32);
if(ret>0) { if(ret>0) {
sprintf(xorriso->info_text, "Emptied directory %s", sprintf(xorriso->info_text, "Emptied directory ");
Text_shellsafe(iso_path, sfe, 0)); Text_shellsafe(iso_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
} }
} else if(action==20) { /* is_full_in_iso */ } else if(action==20) { /* is_full_in_iso */
@ -1157,14 +1183,19 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
{ret= 1; goto ex;} {ret= 1; goto ex;}
if(!S_ISDIR(stbuf.st_mode)) if(!S_ISDIR(stbuf.st_mode))
{ret= 1; goto ex;} {ret= 1; goto ex;}
strcpy(sfe, xorriso->wdi); wdi_mem= strdup(xorriso->wdi);
if(wdi_mem == NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
{ret= -1; goto ex;}
}
strcpy(xorriso->wdi, iso_path); strcpy(xorriso->wdi, iso_path);
ret= Xorriso_ls(xorriso, 4|8); ret= Xorriso_ls(xorriso, 4|8);
strcpy(xorriso->wdi, sfe); strcpy(xorriso->wdi, wdi_mem);
if(ret>0) { if(ret>0) {
sprintf(xorriso->result_line, strcpy(xorriso->result_line, "d ");
"d %s (ISO) : non-empty directory (would not match mount point)\n", Text_shellsafe(iso_path, xorriso->result_line, 1);
Text_shellsafe(iso_path, sfe, 0)); strcat(xorriso->result_line,
" (ISO) : non-empty directory (would not match mount point)\n");
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
} }
{ret= 1; goto ex;} {ret= 1; goto ex;}
@ -1179,7 +1210,8 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
ret= Xorriso_estimate_file_size(xorriso, job, basename, stbuf.st_mode, ret= Xorriso_estimate_file_size(xorriso, job, basename, stbuf.st_mode,
stbuf.st_size, 0); stbuf.st_size, 0);
} else { } else {
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0)); Text_shellsafe(show_path, xorriso->result_line, 0);
strcat(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0); Xorriso_result(xorriso, 0);
ret= 1; ret= 1;
} }
@ -1187,6 +1219,9 @@ ex:;
if(action==15 || action==16 || action==18 || action==19 || action==20) if(action==15 || action==16 || action==18 || action==19 || action==20)
if(xorriso->no_volset_present) if(xorriso->no_volset_present)
xorriso->request_to_abort= 1; /* Need an image. No use to try again. */ xorriso->request_to_abort= 1; /* Need an image. No use to try again. */
if(wdi_mem != NULL)
free(wdi_mem);
Xorriso_free_meM(iso_path);
return(ret); return(ret);
} }
@ -1209,16 +1244,12 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
if(xorriso->request_to_abort) if(xorriso->request_to_abort)
{ret= 0; goto ex;} {ret= 0; goto ex;}
sfe= malloc(5*SfileadrL); Xorriso_alloc_meM(sfe, char, 5*SfileadrL);
name= malloc(SfileadrL); Xorriso_alloc_meM(name, char, SfileadrL);
path= malloc(SfileadrL); Xorriso_alloc_meM(path, char, SfileadrL);
abs_dir_path_data= malloc(SfileadrL); Xorriso_alloc_meM(abs_dir_path_data, char, SfileadrL);
abs_path= malloc(SfileadrL); Xorriso_alloc_meM(abs_path, char, SfileadrL);
if(name==NULL || sfe==NULL || path==NULL ||
abs_dir_path_data==NULL || abs_path==NULL) {
Xorriso_no_malloc_memory(xorriso, &sfe, 0);
{ret= -1; goto ex;}
}
own_link_stack= link_stack; own_link_stack= link_stack;
abs_dir_path= abs_dir_parm; abs_dir_path= abs_dir_parm;
if(abs_dir_path[0]==0) { if(abs_dir_path[0]==0) {
@ -1338,16 +1369,11 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
ret= 1; ret= 1;
ex:; ex:;
if(sfe!=NULL) Xorriso_free_meM(sfe);
free(sfe); Xorriso_free_meM(name);
if(name!=NULL) Xorriso_free_meM(path);
free(name); Xorriso_free_meM(abs_dir_path_data);
if(path!=NULL) Xorriso_free_meM(abs_path);
free(path);
if(abs_dir_path_data!=NULL)
free(abs_dir_path_data);
if(abs_path!=NULL)
free(abs_path);
Dirseq_destroy(&dirseq, 0); Dirseq_destroy(&dirseq, 0);
return(ret); return(ret);
} }
@ -1447,7 +1473,6 @@ ex:;
int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag) int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag)
{ {
int ret; int ret;
char sfe[5*SfileadrL];
while((xorriso->do_reassure==1 || (xorriso->do_reassure==2 && !(flag&4))) while((xorriso->do_reassure==1 || (xorriso->do_reassure==2 && !(flag&4)))
&& !xorriso->request_not_to_ask) { && !xorriso->request_not_to_ask) {
@ -1467,8 +1492,8 @@ int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag)
goto ex; goto ex;
if(xorriso->request_to_abort) { if(xorriso->request_to_abort) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Removal operation aborted by user before file: %s", "Removal operation aborted by user before file: ");
Text_shellsafe(path, sfe, 0)); Text_shellsafe(path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= 3; goto ex; ret= 3; goto ex;
} }
@ -1481,8 +1506,8 @@ int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag)
break; break;
} }
if(ret==1) { /* no */ if(ret==1) { /* no */
sprintf(xorriso->info_text, "Kept in existing state: %s", sprintf(xorriso->info_text, "Kept in existing state: ");
Text_shellsafe(path, sfe, 0)); Text_shellsafe(path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= 3; goto ex; ret= 3; goto ex;
} }
@ -1532,59 +1557,67 @@ int Xorriso_make_tmp_path(struct XorrisO *xorriso, char *orig_path,
int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag) int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag)
{ {
int ret, is_link= 0; int ret, is_link= 0;
char *path_pt, sfe[5*SfileadrL], link_target[SfileadrL]; char *path_pt, *link_target= NULL;
mode_t mode, desired= S_IRUSR | S_IWUSR | S_IXUSR; mode_t mode, desired= S_IRUSR | S_IWUSR | S_IXUSR;
struct stat stbuf; struct stat stbuf;
Xorriso_alloc_meM(link_target, char, SfileadrL);
if(!(xorriso->do_auto_chmod || (flag & 1))) if(!(xorriso->do_auto_chmod || (flag & 1)))
return(0); {ret= 0; goto ex;}
if(flag & 2) if(flag & 2)
desired &= ~S_IWUSR; desired &= ~S_IWUSR;
path_pt= disk_path; path_pt= disk_path;
ret= lstat(path_pt, &stbuf); ret= lstat(path_pt, &stbuf);
if(ret==-1) if(ret==-1)
return(0); {ret= 0; goto ex;}
if(S_ISLNK(stbuf.st_mode)) { if(S_ISLNK(stbuf.st_mode)) {
is_link= 1; is_link= 1;
ret= stat(path_pt, &stbuf); ret= stat(path_pt, &stbuf);
if(ret==-1) if(ret==-1)
return(0); {ret= 0; goto ex;}
} }
if(!S_ISDIR(stbuf.st_mode)) if(!S_ISDIR(stbuf.st_mode))
return(0); {ret= 0; goto ex;}
if(is_link) { if(is_link) {
ret= Xorriso_resolve_link(xorriso, path_pt, link_target, 0); ret= Xorriso_resolve_link(xorriso, path_pt, link_target, 0);
if(ret<=0) if(ret<=0)
return(ret); goto ex;
path_pt= link_target; path_pt= link_target;
} }
if((stbuf.st_mode & desired) == desired) if((stbuf.st_mode & desired) == desired)
return(0); {ret= 0; goto ex;}
if(stbuf.st_uid!=geteuid()) if(stbuf.st_uid!=geteuid())
return(-2); {ret= -2; goto ex;}
mode= (stbuf.st_mode | desired) & 07777; mode= (stbuf.st_mode | desired) & 07777;
ret= chmod(path_pt, mode); ret= chmod(path_pt, mode);
if(ret==-1) { if(ret==-1) {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Cannot change access permissions of disk directory: chmod %o %s", "Cannot change access permissions of disk directory: chmod %o ",
(unsigned int) (mode & 07777), Text_shellsafe(path_pt, sfe, 0)); (unsigned int) (mode & 07777));
Text_shellsafe(path_pt, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "SORRY", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "SORRY", 0);
return(-2); {ret= -2; goto ex;}
} }
ret= Permstack_push(&(xorriso->perm_stack), path_pt, &stbuf, 0); ret= Permstack_push(&(xorriso->perm_stack), path_pt, &stbuf, 0);
if(ret<=0) if(ret<=0)
return(ret); goto ex;
return(1); ret= 1;
ex:;
Xorriso_free_meM(link_target);
return(ret);
} }
int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path, int flag) int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path, int flag)
{ {
int done= 0, ret, just_rx= 2; int done= 0, ret, just_rx= 2;
char *npt, *apt, path[SfileadrL], *wpt; char *npt, *apt, *path, *wpt;
Xorriso_alloc_meM(path, char, SfileadrL);
apt= disk_path; apt= disk_path;
wpt= path; wpt= path;
for(npt= apt; !done; apt= npt + 1) { for(npt= apt; !done; apt= npt + 1) {
@ -1598,11 +1631,14 @@ int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path, int flag)
*wpt= 0; *wpt= 0;
ret= Xorriso_auto_chmod(xorriso, path, just_rx); ret= Xorriso_auto_chmod(xorriso, path, just_rx);
if(ret == -1) if(ret == -1)
return(-1); {ret= -1; goto ex;}
if(ret == -2) if(ret == -2)
return(0); {ret= 0; goto ex;}
} }
return(1); ret= 1;
ex:
Xorriso_free_meM(path);
return(ret);
} }
@ -1735,16 +1771,17 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
char *devadr, char result[SfileadrL], int flag) char *devadr, char result[SfileadrL], int flag)
{ {
int ret, reg_file= 0, is_safe= 0, sys_code= 0; int ret, reg_file= 0, is_safe= 0, sys_code= 0;
char form[6*SfileadrL], session_text[12], track_text[12], lba_text[12]; char *form= NULL, session_text[12], track_text[12], lba_text[12];
char *vars[5][2], sfe[5*SfileadrL], volid_sfe[5*80+1], *cpt, *sysname; char *vars[5][2], *sfe= NULL, *volid_sfe= NULL, *cpt, *sysname;
struct stat stbuf; struct stat stbuf;
Xorriso_alloc_meM(form, char, 6 * SfileadrL);
Xorriso_alloc_meM(sfe, char, 5 * SfileadrL);
Xorriso_alloc_meM(volid_sfe, char, 5 * 80 + 1);
if(strlen(cmd) > SfileadrL) { if(strlen(cmd) > SfileadrL) {
/*
too_long:;
*/
Xorriso_msgs_submit(xorriso, 0, "Argument much too long", 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, "Argument much too long", 0, "FAILURE", 0);
return(0); {ret= 0; goto ex;}
} }
ret= stat(devadr, &stbuf); ret= stat(devadr, &stbuf);
if(ret != -1) if(ret != -1)
@ -1769,7 +1806,7 @@ too_long:;
Xorriso_msgs_submit(xorriso, 0, Xorriso_msgs_submit(xorriso, 0,
"-mount*: Cannot determine current system type", "-mount*: Cannot determine current system type",
0, "FAILURE", 0); 0, "FAILURE", 0);
return(0); {ret= 0; goto ex;}
} else if(strcmp(sysname, "FreeBSD") == 0 || } else if(strcmp(sysname, "FreeBSD") == 0 ||
strcmp(sysname, "GNU/kFreeBSD") == 0) { strcmp(sysname, "GNU/kFreeBSD") == 0) {
/* "GNU/kFreeBSD" = Debian kfreebsd */ /* "GNU/kFreeBSD" = Debian kfreebsd */
@ -1780,7 +1817,7 @@ too_long:;
sprintf(xorriso->info_text, "-mount*: Unsupported system type %s", sprintf(xorriso->info_text, "-mount*: Unsupported system type %s",
Text_shellsafe(sysname, sfe, 0)); Text_shellsafe(sysname, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0); {ret= 0; goto ex;}
} }
} }
@ -1810,7 +1847,7 @@ too_long:;
Xorriso_msgs_submit(xorriso, 0, Xorriso_msgs_submit(xorriso, 0,
"Command mdconfig -a -t vnode -f can create a device node which uses the file", "Command mdconfig -a -t vnode -f can create a device node which uses the file",
0, "HINT", 0); 0, "HINT", 0);
return(0); {ret= 0; goto ex;}
} else { } else {
sprintf(form, sprintf(form,
"%smount_cd9660 -o noexec,nosuid -s %%sbsector%% %%device%% %s", "%smount_cd9660 -o noexec,nosuid -s %%sbsector%% %%device%% %s",
@ -1837,8 +1874,13 @@ too_long:;
vars[4][1]= Text_shellsafe(devadr, sfe, 0); vars[4][1]= Text_shellsafe(devadr, sfe, 0);
ret= Sregex_resolve_var(form, vars, 5, "%", "%", "%", result, SfileadrL, 0); ret= Sregex_resolve_var(form, vars, 5, "%", "%", "%", result, SfileadrL, 0);
if(ret <= 0) if(ret <= 0)
return(ret); goto ex;
return(1 + is_safe); ret= 1 + is_safe;
ex:;
Xorriso_free_meM(form);
Xorriso_free_meM(sfe);
Xorriso_free_meM(volid_sfe);
return(ret);
} }

View File

@ -1 +1 @@
#define Xorriso_timestamP "2011.05.02.121907" #define Xorriso_timestamP "2011.05.02.191704"