New options -xattr, -getfattr, find -has_xattr, -has_aaip, -exec getfattr
This commit is contained in:
@@ -634,13 +634,13 @@ ex:;
|
||||
bit3= encode in any case shellsafe:
|
||||
<=42 , 59, 60, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, int flag)
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag)
|
||||
{
|
||||
char *rpt, *wpt;
|
||||
int count, sq_open= 0, dq_open= 0;
|
||||
|
||||
count= 0;
|
||||
for(rpt= text; *rpt != 0; rpt++) {
|
||||
for(rpt= text; rpt - text < text_len; rpt++) {
|
||||
count++;
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || *rpt == 59 || *rpt == 60 || *rpt == 62 ||
|
||||
@@ -657,7 +657,7 @@ int Sfile_bsl_encoder(char **result, char *text, int flag)
|
||||
(*result)= wpt= calloc(count + 1, 1);
|
||||
if(wpt == NULL)
|
||||
return(-1);
|
||||
for(rpt= text; *rpt != 0; rpt++) {
|
||||
for(rpt= text; rpt - text < text_len; rpt++) {
|
||||
if(*rpt == '\'')
|
||||
sq_open= !(sq_open || dq_open);
|
||||
if(*rpt == '"')
|
||||
@@ -2323,6 +2323,8 @@ struct FindjoB {
|
||||
int damage_filter; /* -1=only undamaged , 0=all , 1=only damaged */
|
||||
int commit_filter; /* bit0= test -pending_data : uncommitted regular files */
|
||||
int acl_filter; /* -1=only without ACL , 0=all , 1=only with ACL */
|
||||
int xattr_filter; /* -1=only without xattr , 0=all , 1=only with xattr */
|
||||
int aaip_filter; /* -1=only without AA string, 0=all , 1=only with AA */
|
||||
|
||||
void *wanted_node; /* if not NULL, then only this node address matches */
|
||||
|
||||
@@ -2352,6 +2354,7 @@ struct FindjoB {
|
||||
23= internal:memorize path of last matching node in found_path
|
||||
24= getfacl
|
||||
25= setfacl access_acl default_acl
|
||||
26= getfattr
|
||||
*/
|
||||
int action;
|
||||
|
||||
@@ -2383,6 +2386,8 @@ int Findjob_new(struct FindjoB **o, char *start_path, int flag)
|
||||
m->damage_filter= 0;
|
||||
m->commit_filter= 0;
|
||||
m->acl_filter= 0;
|
||||
m->xattr_filter= 0;
|
||||
m->aaip_filter= 0;
|
||||
m->wanted_node= NULL;
|
||||
m->action= 0; /* print */
|
||||
m->target= NULL; /* a mere pointer, not managed memory */
|
||||
@@ -2540,6 +2545,34 @@ int Findjob_set_acl_filter(struct FindjoB *o, int value, int flag)
|
||||
}
|
||||
|
||||
|
||||
/* @param value -1= files without xattr, 0= all files, 1= only files with xattr
|
||||
*/
|
||||
int Findjob_set_xattr_filter(struct FindjoB *o, int value, int flag)
|
||||
{
|
||||
if(value < 0)
|
||||
o->xattr_filter= -1;
|
||||
else if(value > 0)
|
||||
o->xattr_filter= 1;
|
||||
else
|
||||
o->xattr_filter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param value -1= files without aaip, 0= all files, 1= only files with aaip
|
||||
*/
|
||||
int Findjob_set_aaip_filter(struct FindjoB *o, int value, int flag)
|
||||
{
|
||||
if(value < 0)
|
||||
o->aaip_filter= -1;
|
||||
else if(value > 0)
|
||||
o->aaip_filter= 1;
|
||||
else
|
||||
o->aaip_filter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Findjob_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag)
|
||||
{
|
||||
*acl_filter= o->acl_filter;
|
||||
@@ -2547,6 +2580,20 @@ int Findjob_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag)
|
||||
}
|
||||
|
||||
|
||||
int Findjob_get_xattr_filter(struct FindjoB *o, int *xattr_filter, int flag)
|
||||
{
|
||||
*xattr_filter= o->xattr_filter;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Findjob_get_aaip_filter(struct FindjoB *o, int *aaip_filter, int flag)
|
||||
{
|
||||
*aaip_filter= o->aaip_filter;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag)
|
||||
{
|
||||
o->wanted_node= wanted_node;
|
||||
@@ -4612,7 +4659,7 @@ bit15= with bit1 or bit2: close depicted log file
|
||||
/* Eventually perform backslash encoding of non-printable characters */
|
||||
if(((xorriso->bsl_interpretation & 32) && channel_no == 1) ||
|
||||
((xorriso->bsl_interpretation & 64) && channel_no == 2)) {
|
||||
ret= Sfile_bsl_encoder(&text, text, 1 | 2 | 4);
|
||||
ret= Sfile_bsl_encoder(&text, text, strlen(text), 1 | 2 | 4);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
@@ -6177,6 +6224,9 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
|
||||
|
||||
is_default= (xorriso->do_aaip==0);
|
||||
sprintf(line,"-acl %s\n", (xorriso->do_aaip & 1 ? "on" : "off"));
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
sprintf(line,"-xattr %s\n", (xorriso->do_aaip & 4 ? "on" : "off"));
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
@@ -6207,7 +6257,7 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
}
|
||||
for(s= xorriso->drive_greylist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
sprintf(line, "-drive_class 'caution' %s\n",
|
||||
sprintf(line, "-drive_class 'caution' %s\n",
|
||||
Text_shellsafe(Xorriso_lst_get_text(s, 0), sfe, 0));
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
}
|
||||
@@ -13017,6 +13067,14 @@ not_enough_arguments:;
|
||||
Findjob_set_acl_filter(job, 1, 0);
|
||||
} else if(strcmp(argv[i], "-has_no_acl")==0) {
|
||||
Findjob_set_acl_filter(job, -1, 0);
|
||||
} else if(strcmp(argv[i], "-has_xattr")==0) {
|
||||
Findjob_set_xattr_filter(job, 1, 0);
|
||||
} else if(strcmp(argv[i], "-has_no_xattr")==0) {
|
||||
Findjob_set_xattr_filter(job, -1, 0);
|
||||
} else if(strcmp(argv[i], "-has_aaip")==0) {
|
||||
Findjob_set_aaip_filter(job, 1, 0);
|
||||
} else if(strcmp(argv[i], "-has_no_aaip")==0) {
|
||||
Findjob_set_aaip_filter(job, -1, 0);
|
||||
} else if(strcmp(argv[i], "-exec")==0) {
|
||||
if(i+1>=end_idx)
|
||||
goto not_enough_arguments;
|
||||
@@ -13169,6 +13227,8 @@ not_enough_arguments:;
|
||||
goto ex;
|
||||
Findjob_set_action_text_2(job, 25, access_acl_text, default_acl_text,
|
||||
0);
|
||||
} else if(strcmp(cpt, "getfattr")==0) {
|
||||
Findjob_set_action_target(job, 26, NULL, 0);
|
||||
} else {
|
||||
sprintf(xorriso->info_text, "-find -exec: unknown action %s",
|
||||
Text_shellsafe(argv[i], sfe, 0));
|
||||
@@ -13299,8 +13359,11 @@ int Xorriso_option_fs(struct XorrisO *xorriso, char *size, int flag)
|
||||
}
|
||||
|
||||
|
||||
/* Option -getfacl alias -getfacli, -getfacl_r alias -getfacl_ri */
|
||||
/* @param flag bit0=recursive -getfacl_r
|
||||
/* Optionis -getfacl alias -getfacli, -getfacl_r alias -getfacl_ri
|
||||
-getfattr alias getfattri
|
||||
*/
|
||||
/* @param flag bit0= recursive -getfacl_r
|
||||
bit1= getfattr rather than getfacl
|
||||
*/
|
||||
int Xorriso_option_getfacli(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int *idx, int flag)
|
||||
@@ -13322,12 +13385,18 @@ int Xorriso_option_getfacli(struct XorrisO *xorriso,
|
||||
Xorriso_no_findjob(xorriso, "-getfacl_r", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
Findjob_set_action_target(job, 24, NULL, 0);
|
||||
if(flag & 2) {
|
||||
Findjob_set_action_target(job, 26, NULL, 0);
|
||||
} else
|
||||
Findjob_set_action_target(job, 24, NULL, 0);
|
||||
ret= Xorriso_findi(xorriso, job, NULL, (off_t) 0,
|
||||
NULL, optv[i], &dir_stbuf, 0, 0);
|
||||
Findjob_destroy(&job, 0);
|
||||
} else {
|
||||
ret= Xorriso_getfacl(xorriso, NULL, optv[i], NULL, 0);
|
||||
if(flag & 2)
|
||||
ret= Xorriso_getfattr(xorriso, NULL, optv[i], 0);
|
||||
else
|
||||
ret= Xorriso_getfacl(xorriso, NULL, optv[i], NULL, 0);
|
||||
}
|
||||
if(ret>0 && !xorriso->request_to_abort)
|
||||
continue; /* regular bottom of loop */
|
||||
@@ -13432,6 +13501,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
|
||||
" Override system assumption of the local character set name.",
|
||||
" -acl \"on\"|\"off\"",
|
||||
" Enable resp. disable reading and writing of ACLs.",
|
||||
" -xattr \"on\"|\"off\"",
|
||||
" Enable resp. disable reading and writing of xattr.",
|
||||
" -ban_stdio_write",
|
||||
" Allow for writing only the usage of optical drives.",
|
||||
" -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"",
|
||||
@@ -13569,11 +13640,12 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
|
||||
" If -type is given then only files with matching type are",
|
||||
" processed. Types: block,char,dir,pipe,file,link,socket.",
|
||||
" Further tests: -damaged, -undamaged, -lba_range start count,",
|
||||
" -pending_data, -has_acl, -has_no_acl.",
|
||||
" -pending_data, -has_acl, -has_no_acl, -has_xattr,",
|
||||
" -has_no_xattr, -has_aaip, -has_no_aaip.",
|
||||
" Action may be one of: echo, chown, chown_r, chgrp, chgrp_r",
|
||||
" chmod, chmod_r, alter_date, alter_date_r, lsdl, compare,",
|
||||
" rm, rm_r, compare, update, report_damage, report_lba,",
|
||||
" getfacl, setfacl, find.",
|
||||
" getfacl, setfacl, getfattr, find.",
|
||||
" params are their arguments except iso_rr_path.",
|
||||
" echo, lsdl, rm, rm_r, report_damage have no params at all.",
|
||||
" -mkdir iso_rr_path [...]",
|
||||
@@ -13666,6 +13738,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
|
||||
" -lsdlx pattern [***] like -lsdx but also telling some file attributes.",
|
||||
" -getfacl pattern [***] list eventual ACLs of the given files.",
|
||||
" -getfacl_r pattern [***] like -getfacl but listing whole file trees.",
|
||||
" -getfattr pattern [***] list eventual xattr of the given files.",
|
||||
" -getfxattr_r pattern [***] like -getfxattr but listing whole file trees.",
|
||||
"",
|
||||
" -du pattern [***] recursively lists sizes of files or directories in the",
|
||||
" ISO image which match one of the shell parser patterns.",
|
||||
@@ -13977,57 +14051,11 @@ int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode,
|
||||
ret= Xorriso_reassure(xorriso, "-load", "loads an alternative image", 0);
|
||||
if(ret<=0)
|
||||
return(2);
|
||||
|
||||
#ifndef NIX
|
||||
|
||||
ret= Xorriso_decode_load_adr(xorriso, "-load", adr_mode, adr_value,
|
||||
&(xorriso->image_start_mode),
|
||||
xorriso->image_start_value, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
#else
|
||||
|
||||
double num;
|
||||
int l;
|
||||
|
||||
if(strcmp(adr_mode, "auto")==0)
|
||||
xorriso->image_start_mode= 0;
|
||||
else if(strcmp(adr_mode, "session")==0)
|
||||
xorriso->image_start_mode= 1;
|
||||
else if(strcmp(adr_mode, "track")==0)
|
||||
xorriso->image_start_mode= 2;
|
||||
else if(strcmp(adr_mode, "lba")==0 || strcmp(adr_mode, "sbsector")==0)
|
||||
xorriso->image_start_mode= 3 | ((flag&1) << 16);
|
||||
else if(strcmp(adr_mode, "volid")==0)
|
||||
xorriso->image_start_mode= 4;
|
||||
else {
|
||||
sprintf(xorriso->info_text, "-load: unknown address mode '%s'", adr_mode);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
l= strlen(adr_value);
|
||||
if(l==0)
|
||||
xorriso->image_start_mode= 0;
|
||||
|
||||
if(xorriso->image_start_mode>=1 && xorriso->image_start_mode<= 3) {
|
||||
num= Scanf_io_size(adr_value, 0);
|
||||
if(xorriso->image_start_mode==3 &&
|
||||
(adr_value[l-1]<'0' || adr_value[l-1]>'9'))
|
||||
num/= 2048.0;
|
||||
sprintf(xorriso->image_start_value, "%.f", num);
|
||||
} else {
|
||||
if(strlen(adr_value)>80) {
|
||||
sprintf(xorriso->info_text, "-load: address value too long (80 < %d)",
|
||||
(int) strlen(adr_value));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
strcpy(xorriso->image_start_value, adr_value);
|
||||
}
|
||||
|
||||
#endif /* NIX */
|
||||
|
||||
xorriso->image_start_mode|= (1<<30); /* enable non-default msc1 processing */
|
||||
if(strlen(xorriso->indev)>0) {
|
||||
ret= Xorriso_option_rollback(xorriso, 1); /* Load image, no -reassure */
|
||||
@@ -15181,10 +15209,6 @@ int Xorriso_option_prompt(struct XorrisO *xorriso, char *text, int flag)
|
||||
/* Option -publisher */
|
||||
int Xorriso_option_publisher(struct XorrisO *xorriso, char *name, int flag)
|
||||
{
|
||||
#ifdef NIX
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
if(strlen(name)>=sizeof(xorriso->publisher)) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Name too long with option -publisher (%d > %d)",
|
||||
@@ -15192,13 +15216,6 @@ int Xorriso_option_publisher(struct XorrisO *xorriso, char *name, int flag)
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
#ifdef NIX
|
||||
ret= Xorriso_set_publisher(xorriso, name, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
#endif /* NIX */
|
||||
|
||||
if(Sfile_str(xorriso->publisher,name,0)<=0)
|
||||
return(-1);
|
||||
return(1);
|
||||
@@ -16059,6 +16076,27 @@ int Xorriso_option_volid(struct XorrisO *xorriso, char *volid, int flag)
|
||||
}
|
||||
|
||||
|
||||
/* Option -xattr "on"|"off" */
|
||||
int Xorriso_option_xattr(struct XorrisO *xorriso, char *mode, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(strcmp(mode, "off")==0)
|
||||
xorriso->do_aaip&= ~12;
|
||||
else if(strcmp(mode, "on")==0)
|
||||
xorriso->do_aaip|= (4 | 8);
|
||||
else {
|
||||
sprintf(xorriso->info_text, "-xattr: unknown mode '%s'", mode);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
ret= Xorriso_set_ignore_aclea(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* ---------------------------- End Options API ------------------------ */
|
||||
|
||||
|
||||
@@ -16124,7 +16162,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
"prog","prog_help","publisher","quoted_not_list","quoted_path_list",
|
||||
"reassure","report_about","rom_toc_scan",
|
||||
"session_log","speed","split_size","status","status_history_max",
|
||||
"stream_recording","temp_mem_limit","uid","volid","use_readline",
|
||||
"stream_recording","temp_mem_limit","uid","use_readline","volid","xattr",
|
||||
""
|
||||
};
|
||||
static char arg2_commands[][40]= {
|
||||
@@ -16147,6 +16185,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
"du","dui","dus","dusi","dux","dusx","extract_l",
|
||||
"file_size_limit","find","findi","findx",
|
||||
"getfacl","getfacli","getfacl_r","getfacl_ri",
|
||||
"getfattr","getfattri","getfattr_r","getfattr_ri",
|
||||
"ls","lsi","lsl","lsli","lsd","lsdi","lsdl","lsdli",
|
||||
"lsx","lslx","lsdx","lsdlx","map_l","mv","mvi","mkdir","mkdiri",
|
||||
"not_paths","rm","rmi","rm_r","rm_ri","rmdir","rmdiri","update_l",
|
||||
@@ -16503,6 +16542,12 @@ next_command:;
|
||||
} else if(strcmp(cmd,"getfacl_r")==0 || strcmp(cmd,"getfacl_ri")==0) {
|
||||
ret= Xorriso_option_getfacli(xorriso, argc, argv, idx, 1);
|
||||
|
||||
} else if(strcmp(cmd,"getfattr")==0 || strcmp(cmd,"getfattri")==0) {
|
||||
ret= Xorriso_option_getfacli(xorriso, argc, argv, idx, 2);
|
||||
|
||||
} else if(strcmp(cmd,"getfattr_r")==0 || strcmp(cmd,"getfattr_ri")==0) {
|
||||
ret= Xorriso_option_getfacli(xorriso, argc, argv, idx, 1 | 2);
|
||||
|
||||
} else if(strcmp(cmd,"gid")==0) {
|
||||
(*idx)++;
|
||||
ret= Xorriso_option_gid(xorriso,arg1,0);
|
||||
@@ -16854,6 +16899,10 @@ next_command:;
|
||||
(*idx)++;
|
||||
ret= Xorriso_option_volid(xorriso,arg1,0);
|
||||
|
||||
} else if(strcmp(cmd,"xattr")==0) {
|
||||
(*idx)++;
|
||||
ret= Xorriso_option_xattr(xorriso, arg1, 0);
|
||||
|
||||
} else if(strcmp(cmd, xorriso->list_delimiter)==0){
|
||||
/* tis ok */;
|
||||
|
||||
|
Reference in New Issue
Block a user