Enabling non-user xattr namespaces with -getfattr and -setfattr
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2016 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007-2017 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
@ -2127,11 +2127,19 @@ ex:;
|
||||
@return >0 success , <=0 failure
|
||||
*/
|
||||
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)
|
||||
size_t in_num_attrs, char **in_names,
|
||||
size_t *in_value_lengths, char **in_values, int flag)
|
||||
{
|
||||
int ret;
|
||||
int ret, block_isofs= 0, in_original= 1;
|
||||
size_t i, j, num_attrs;
|
||||
IsoNode *node;
|
||||
char **names, **values;
|
||||
size_t *value_lengths;
|
||||
|
||||
num_attrs= in_num_attrs;
|
||||
names= in_names;
|
||||
value_lengths= in_value_lengths;
|
||||
values= in_values;
|
||||
|
||||
node= (IsoNode *) in_node;
|
||||
if(node == NULL) {
|
||||
@ -2139,8 +2147,46 @@ int Xorriso_setfattr(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
if((xorriso->do_aaip & 1024) && !(flag & 8)) {
|
||||
flag|= 8;
|
||||
block_isofs= 1;
|
||||
for(i= 0; i < in_num_attrs; i++) {
|
||||
if(strncmp(in_names[i], "isofs.", 6) == 0) {
|
||||
if(in_original) {
|
||||
strcpy(xorriso->info_text,
|
||||
"Attempt to set xattr from namespace \"isofs\" to ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
ret= Xorriso_eval_problem_status(xorriso, 0, 0);
|
||||
if(ret < 0) {
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
/* Switch to copy mode and omit isofs names */
|
||||
Xorriso_alloc_meM(names, char *, num_attrs);
|
||||
Xorriso_alloc_meM(value_lengths, size_t, num_attrs);
|
||||
Xorriso_alloc_meM(values, char *, num_attrs);
|
||||
in_original= 0;
|
||||
for(j= 0; j < i; j++) {
|
||||
names[j]= in_names[j];
|
||||
value_lengths[j]= in_value_lengths[j];
|
||||
values[j]= in_values[j];
|
||||
}
|
||||
num_attrs= i;
|
||||
}
|
||||
} else if(!in_original) {
|
||||
names[num_attrs]= in_names[i];
|
||||
value_lengths[num_attrs]= in_value_lengths[i];
|
||||
values[num_attrs]= in_values[i];
|
||||
num_attrs++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(num_attrs <= 0) {
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
|
||||
ret= iso_node_set_attrs(node, num_attrs, names, value_lengths, values,
|
||||
flag & (1 | 2 | 4 | 8));
|
||||
(flag & (1 | 2 | 4 | 8)) | (block_isofs << 4));
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0) {
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
@ -2156,7 +2202,12 @@ int Xorriso_setfattr(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
Xorriso_set_change_pending(xorriso, 0);
|
||||
ret= 1;
|
||||
ex:;
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
if(!in_original) {
|
||||
Xorriso_free_meM(names);
|
||||
Xorriso_free_meM(value_lengths);
|
||||
Xorriso_free_meM(values);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user