diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index 1968c1c5..dcf11698 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -15654,6 +15654,83 @@ ex:; } +/* Options -setfattr alias -setfattri, -setfattr_r alias -setfattr_ri */ +/* @param flag bit0=recursive -setfattr_r +*/ +int Xorriso_option_setfattri(struct XorrisO *xorriso, char *name, char *value, + int argc, char **argv, int *idx, int flag) +{ + int i, ret, was_failure= 0, end_idx, fret, hflag; + int optc= 0; + size_t value_length, num_attrs= 1; + char **optv= NULL, *name_pt; + struct FindjoB *job= NULL; + struct stat dir_stbuf; + + ret= Xorriso_opt_args(xorriso, "-setfattr", argc, argv, *idx, &end_idx, &optc, + &optv, 0); + if(ret <= 0) + goto ex; + + for(i= 0; iinfo_text, + "-setfattr: Empty attribute name is not allowed"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + ret= 0; goto ex; + } else if(strcmp(name, "--remove-all") == 0) { + if(value[0]) { + sprintf(xorriso->info_text, + "-setfattr: Value is not empty with pseudo name --remove-all"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + ret= 0; goto ex; + } + num_attrs= 0; + hflag= 0; + } else if(name[0] == '-') { + name_pt++; + hflag|= 4; + } else if(name[0] == '=' || name[0] == '+') { + name_pt++; + } + ret= Xorriso_setfattr(xorriso, NULL, optv[i], + num_attrs, &name_pt, &value_length, &value, hflag); + } + if(ret>0 && !xorriso->request_to_abort) + continue; /* regular bottom of loop */ + was_failure= 1; + fret= Xorriso_eval_problem_status(xorriso, ret, 1|2); + if(fret>=0) + continue; + ret= 0; goto ex; + } + ret= 1; +ex:; + (*idx)= end_idx; + Xorriso_opt_args(xorriso, "-setfattr", argc, argv, *idx, &end_idx, + &optc, &optv, 256); + Findjob_destroy(&job, 0); + if(ret<=0) + return(ret); + return(!was_failure); +} + + /* Option -speed */ int Xorriso_option_speed(struct XorrisO *xorriso, char *speed, int flag) { @@ -16190,7 +16267,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "lsx","lslx","lsdx","lsdlx","map_l","mv","mvi","mkdir","mkdiri", "not_paths","rm","rmi","rm_r","rm_ri","rmdir","rmdiri","update_l", "setfacl","setfacli","setfacl_list","setfacl_listi", - "setfacl_r","setfacl_ri", + "setfacl_r","setfacl_ri","setfattr","setfattri","setfattr_r","setfattr_ri", "" }; @@ -16834,6 +16911,10 @@ next_command:; (*idx)+= 1; ret= Xorriso_option_setfacli(xorriso, arg1, argc, argv, idx, 1); + } else if(strcmp(cmd,"setfattr")==0 || strcmp(cmd,"setfattri")==0) { + (*idx)+= 2; + ret= Xorriso_option_setfattri(xorriso, arg1, arg2, argc, argv, idx, 0); + } else if(strcmp(cmd,"speed")==0) { (*idx)++; ret= Xorriso_option_speed(xorriso, arg1, 0); diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index d54fa5e8..c04da9cd 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -680,6 +680,12 @@ int Xorriso_option_setfacl_listi(struct XorrisO *xorriso, char *disk_path, int Xorriso_option_setfacli(struct XorrisO *xorriso, char *acl_text, int argc, char **argv, int *idx, int flag); +/* Options -setfattr alias -setfattri, -setfattr_r alias -setfattr_ri */ +/* @param flag bit0=recursive -setfattr_r +*/ +int Xorriso_option_setfattri(struct XorrisO *xorriso, char *name, char *value, + int argc, char **argv, int *idx, int flag); + /* Option -speed */ int Xorriso_option_speed(struct XorrisO *xorriso, char *speed, int flag); diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index f55dc8bc..16d47c06 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.02.07.142605" +#define Xorriso_timestamP "2009.02.08.132116" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 5611fef2..3b3b160a 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -416,6 +416,11 @@ int Xorriso_set_ignore_aclea(struct XorrisO *xorriso, int flag); int Xorriso_setfacl(struct XorrisO *xorriso, void *in_node, char *path, char *access_text, char *default_text, int flag); +int Xorriso_setfattr(struct XorrisO *xorriso, void *in_node, char *path, + size_t num_attrs, char **names, + size_t *value_lengths, char **values, int flag); + + /* A pseudo file type for El-Torito bootsectors as in man 2 stat : For now take the highest possible value. */