Implemented option -chmod (does not get written into image, though)

This commit is contained in:
2007-11-07 19:18:31 +00:00
parent 25635f3838
commit c5724bc772
5 changed files with 200 additions and 45 deletions

View File

@ -1306,6 +1306,8 @@ char *Text_shellsafe(char *in_text, char *out_text, int flag)
out_text[w++]= '\'';
for(i=0;i<l;i++){
if(in_text[i]=='\''){
if(w+7>4*SfileadrL)
goto overflow;
/* escape hard quote within the text */
out_text[w++]= '\'';
out_text[w++]= '"';
@ -1313,6 +1315,11 @@ char *Text_shellsafe(char *in_text, char *out_text, int flag)
out_text[w++]= '"';
out_text[w++]= '\'';
} else {
if(w+3>4*SfileadrL) {
overflow:;
strncpy(out_text, "'xorriso: TEXT MUCH TOO LONG ... ",33);
break;
}
out_text[w++]= in_text[i];
}
}
@ -3415,14 +3422,14 @@ int Xorriso_option_cdx(struct XorrisO *xorriso, char *disk_path, int flag)
/* Option -chgrp alias -chgrpi */
int Xorriso_option_chgrpi(struct XorrisO *xorriso, char *gid, char *path,
int Xorriso_option_chgrpi(struct XorrisO *xorriso, char *gid,
int argc, char **argv, int *idx, int flag)
{
int i, end_idx;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 0);
fprintf(stderr, ">>> LIBISOFS : would perform -chgrpi %s %s ", gid, path);
fprintf(stderr, ">>> LIBISOFS : would perform -chgrpi %s ", gid);
for(i= *idx; i<end_idx; i++)
fprintf(stderr, "%s ", argv[i]);
fprintf(stderr, "\n");
@ -3433,32 +3440,112 @@ int Xorriso_option_chgrpi(struct XorrisO *xorriso, char *gid, char *path,
/* Option -chmod alias -chmodi */
int Xorriso_option_chmodi(struct XorrisO *xorriso, char *mode, char *path,
int Xorriso_option_chmodi(struct XorrisO *xorriso, char *mode,
int argc, char **argv, int *idx, int flag)
{
int i, end_idx;
int i, end_idx, ret, who_val= 0;
unsigned int num;
mode_t mode_and= ~0, mode_or= 0, mode_val;
char sfe[4*SfileadrL], *mpt, *opt, *vpt;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 0);
fprintf(stderr, ">>> LIBISOFS : would perform -chmodi %s %s ", mode, path);
for(i= *idx; i<end_idx; i++)
fprintf(stderr, "%s ", argv[i]);
fprintf(stderr, "\n");
if(mode[0]=='0') {
mode_and= 0;
sscanf(mode,"%o",&num);
mode_or= num;
} else if(strchr(mode,'+')!=NULL || strchr(mode,'-')!=NULL) {
/* [ugoa][+-][rwxst] */;
for(mpt= mode; mpt!=NULL; mpt= strchr(mpt, ',')) {
if(*mpt==',')
mpt++;
if(strlen(mpt)<3)
goto unrecognizable;
who_val= 0;
for(vpt= mpt; *vpt!='+' && *vpt!='-' && *vpt!='='; vpt++) {
if(*vpt=='u')
who_val|= 4;
else if(*vpt=='g')
who_val|= 2;
else if(*vpt=='o')
who_val|= 1;
else if(*vpt=='a')
who_val|= 7;
else
goto unrecognizable;
}
opt= vpt;
mode_val= 0;
for(vpt= opt+1; *vpt!=0 && *vpt!=','; vpt++) {
if(*vpt=='r') {
if(who_val&4)
mode_val|= S_IRUSR;
if(who_val&2)
mode_val|= S_IRGRP;
if(who_val&1)
mode_val|= S_IROTH;
} else if(*vpt=='w') {
if(who_val&4)
mode_val|= S_IWUSR;
if(who_val&2)
mode_val|= S_IWGRP;
if(who_val&1)
mode_val|= S_IWOTH;
} else if(*vpt=='x') {
if(who_val&4)
mode_val|= S_IXUSR;
if(who_val&2)
mode_val|= S_IXGRP;
if(who_val&1)
mode_val|= S_IXOTH;
} else if(*vpt=='s') {
if(who_val&4)
mode_val|= S_ISUID;
if(who_val&2)
mode_val|= S_ISGID;
} else if(*vpt=='t') {
mode_val|= S_ISVTX;
} else
goto unrecognizable;
}
if(*opt=='+') {
mode_or|= mode_val;
} else if(*opt=='=') {
mode_and= 0;
mode_or= mode_val;
} else if(*opt=='-') {
mode_or&= ~mode_val;
mode_and&= ~mode_val;
}
}
} else {
unrecognizable:;
sprintf(xorriso->info_text,
"-chmodi: Unrecognizable or faulty permission mode %s\n",
Text_shellsafe(mode, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
}
ret= 1;
for(i= *idx; i<end_idx; i++) {
ret= Xorriso_set_st_mode(xorriso, argv[i], mode_and, mode_or, 0);
if(ret<=0)
break;
}
(*idx)= end_idx;
return(1);
return(ret);
}
/* Option -chown alias -chowni */
int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid, char *path,
int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid,
int argc, char **argv, int *idx, int flag)
{
int i, end_idx;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 0);
fprintf(stderr, ">>> LIBISOFS : would perform -chowni %s %s ", uid, path);
fprintf(stderr, ">>> LIBISOFS : would perform -chowni %s", uid);
for(i= *idx; i<end_idx; i++)
fprintf(stderr, "%s ", argv[i]);
fprintf(stderr, "\n");
@ -4952,16 +5039,16 @@ next_command:;
ret= Xorriso_option_cdx(xorriso, arg1, 0);
} else if(strcmp(cmd,"-chgrp")==0 || strcmp(cmd,"-chgrpi")==0) {
(*idx)+= 2;
ret= Xorriso_option_chgrpi(xorriso, arg1, arg2, argc, argv, idx, 0);
(*idx)+= 1;
ret= Xorriso_option_chgrpi(xorriso, arg1, argc, argv, idx, 0);
} else if(strcmp(cmd,"-chmod")==0 || strcmp(cmd,"-chmodi")==0) {
(*idx)+= 2;
ret= Xorriso_option_chmodi(xorriso, arg1, arg2, argc, argv, idx, 0);
(*idx)+= 1;
ret= Xorriso_option_chmodi(xorriso, arg1, argc, argv, idx, 0);
} else if(strcmp(cmd,"-chown")==0 || strcmp(cmd,"-chowni")==0) {
(*idx)+= 2;
ret= Xorriso_option_chowni(xorriso, arg1, arg2, argc, argv, idx, 0);
(*idx)+= 1;
ret= Xorriso_option_chowni(xorriso, arg1, argc, argv, idx, 0);
} else if(strcmp(cmd,"-close")==0) {
(*idx)++;