Enabling non-user xattr namespaces with -getfattr and -setfattr

This commit is contained in:
2017-11-15 11:10:33 +01:00
parent 3eee0607ec
commit 3794753662
7 changed files with 253 additions and 157 deletions

View File

@ -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);
}