New (yet inofficial) -find actions set/get_hfs_crtp, set/get_hfs_bless

This commit is contained in:
Thomas Schmitt 2012-05-30 15:34:07 +00:00
parent 6296f1fbbd
commit 50ce43b470
5 changed files with 166 additions and 16 deletions

View File

@ -1,7 +1,7 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net> Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
Provided under GPL version 2 or later. Provided under GPL version 2 or later.
@ -46,6 +46,8 @@ struct ExprtesT {
15= -has_md5 15= -has_md5
16= -disk_name char *arg1 (regex_t in *arg2) 16= -disk_name char *arg1 (regex_t in *arg2)
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet) 17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
>>> -has_hfs_crtp
>>> -has_hfs_bless blessing|any
*/ */
int test_type; int test_type;
@ -159,6 +161,10 @@ struct FindjoB {
42= rm_merge 42= rm_merge
43= clear_merge 43= clear_merge
44= list_extattr 44= list_extattr
45= set_hfs_crtp creator type
46= get_hfs_crtp
47= set_hfs_bless blessing
48= get_hfs_bless
*/ */
int action; int action;
int prune; int prune;

View File

@ -2397,20 +2397,22 @@ cannot_iter:;
1=ok 1=ok
2=ok, node has been deleted, 2=ok, node has been deleted,
3=ok, do not dive into directory (e.g. because it is a split file) 3=ok, do not dive into directory (e.g. because it is a split file)
4=ok, end findjob gracefully
*/ */
int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job, int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
IsoDirIter *boss_iter, off_t boss_mem, IsoDirIter *boss_iter, off_t boss_mem,
char *abs_path, char *show_path, char *abs_path, char *show_path,
IsoNode *node, int depth, int flag) IsoNode *node, int depth, int flag)
{ {
int ret= 0, type, action= 0, hflag, deleted= 0, no_dive= 0; int ret= 0, type, action= 0, hflag, deleted= 0, no_dive= 0, i, bless_idx;
uid_t user= 0; uid_t user= 0;
gid_t group= 0; gid_t group= 0;
time_t date= 0; time_t date= 0;
mode_t mode_or= 0, mode_and= ~1; mode_t mode_or= 0, mode_and= ~1;
char *target, *text_2, *iso_prefix, md5[16], *basename; char *target, *text_2, *iso_prefix, md5[16], *basename, bless_code[17];
struct FindjoB *subjob; struct FindjoB *subjob;
struct stat dir_stbuf, stbuf; struct stat dir_stbuf, stbuf;
struct iso_hfsplus_xinfo_data *hfsplus_xinfo;
action= Findjob_get_action_parms(job, &target, &text_2, &user, &group, action= Findjob_get_action_parms(job, &target, &text_2, &user, &group,
&mode_and, &mode_or, &type, &date, &subjob, 0); &mode_and, &mode_or, &type, &date, &subjob, 0);
@ -2549,6 +2551,47 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
} else if(action == 44) { /* list_extattr */ } else if(action == 44) { /* list_extattr */
ret= Xorriso_list_extattr(xorriso, (void *) node, show_path, show_path, ret= Xorriso_list_extattr(xorriso, (void *) node, show_path, show_path,
target, 0); target, 0);
} else if(action == 45) { /* set_hfs_crtp */
ret= Xorriso_hfsplus_file_creator_type(xorriso, show_path, (void *) node,
target, text_2, 0);
} else if(action == 46) { /* get_hfs_crtp */
ret= iso_node_get_xinfo(node, iso_hfsplus_xinfo_func,
(void **) &hfsplus_xinfo);
if(ret < 0) {
Xorriso_process_msg_queues(xorriso, 0);
ret= 0;
} else if(ret == 1) {
for(i= 0; i < 4; i++)
xorriso->result_line[i]= hfsplus_xinfo->creator_code[i];
xorriso->result_line[4]= ' ';
for(i= 0; i < 4; i++)
xorriso->result_line[5 + i]= hfsplus_xinfo->type_code[i];
xorriso->result_line[9]= ' ';
xorriso->result_line[10]= 0;
Text_shellsafe(show_path, xorriso->result_line, 1);
strcat(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0);
}
ret= 1;
} else if(action == 47) { /* set_hfs_bless */
ret= Xorriso_hfsplus_bless(xorriso, show_path, (void *) node, target, 0);
/* If successful, end -find run gracefully */
if(ret > 0) {
sprintf(xorriso->info_text, "HFS blessing '%s' issued to ", target);
Text_shellsafe(show_path, xorriso->info_text, 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
}
return(4);
} else if(action == 48) { /* get_hfs_bless */
ret= Xorriso_get_blessing(xorriso, node, &bless_idx, bless_code, 0);
if (ret > 0) {
sprintf(xorriso->result_line, "%-16.16s ", bless_code);
Text_shellsafe(show_path, xorriso->result_line, 1);
strcat(xorriso->result_line, "\n");
Xorriso_result(xorriso, 0);
} else if(ret == 0)
ret= 1;
} else { /* includes : 15 in_iso */ } else { /* includes : 15 in_iso */
Text_shellsafe(show_path, xorriso->result_line, 0); Text_shellsafe(show_path, xorriso->result_line, 0);
strcat(xorriso->result_line, "\n"); strcat(xorriso->result_line, "\n");
@ -2852,6 +2895,7 @@ int Xorriso_findi_headline(struct XorrisO *xorriso, struct FindjoB *job,
bit2= do not dive into split file directories bit2= do not dive into split file directories
(implicitly given with actions 14=compare and 17=update) (implicitly given with actions 14=compare and 17=update)
@return <=0 error, 1= ok , 2= dir node and path has been deleted @return <=0 error, 1= ok , 2= dir node and path has been deleted
4= end gracefully
*/ */
int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
void *boss_iter, off_t boss_mem, void *boss_iter, off_t boss_mem,
@ -2922,10 +2966,12 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
flag&(1|2)); flag&(1|2));
deleted= (iso_node_get_parent(iso_node) == NULL); /* still in tree ? */ deleted= (iso_node_get_parent(iso_node) == NULL); /* still in tree ? */
iso_node_unref(iso_node); /* eventually do real disposal */ iso_node_unref(iso_node); /* eventually do real disposal */
if(ret<=0)
goto ex;
if(xorriso->request_to_abort) if(xorriso->request_to_abort)
{ret= 0; goto ex;} {ret= 0; goto ex;}
if(ret == 4)
goto ex;
if(ret<=0)
goto ex;
if(ret==2 || deleted) { if(ret==2 || deleted) {
/* re-determine dir_node in case it has a new persona */ /* re-determine dir_node in case it has a new persona */
ret= Xorriso_node_from_path(xorriso, volume, path, &iso_node, 1); ret= Xorriso_node_from_path(xorriso, volume, path, &iso_node, 1);
@ -3001,6 +3047,8 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
abs_path, path, node, depth, 1|(flag&2)); abs_path, path, node, depth, 1|(flag&2));
if(xorriso->request_to_abort) if(xorriso->request_to_abort)
{ret= 0; goto ex;} {ret= 0; goto ex;}
if(ret == 4)
goto ex;
if(ret==2) { /* node has been deleted */ if(ret==2) { /* node has been deleted */
/* re-determine node in case it has a new persona */ /* re-determine node in case it has a new persona */
if(volume==NULL) { if(volume==NULL) {
@ -3031,6 +3079,10 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
(void *) node, path, &stbuf, depth+1, flag|1); (void *) node, path, &stbuf, depth+1, flag|1);
if(ret<0) if(ret<0)
goto ex; goto ex;
if(xorriso->request_to_abort)
{ret= 0; goto ex;}
if(ret == 4)
goto ex;
} }
} }
@ -3176,6 +3228,8 @@ int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
if(ret <= 0 || xorriso->request_to_abort) if(ret <= 0 || xorriso->request_to_abort)
if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0) if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0)
goto ex; goto ex;
if(ret == 4) /* end gracefully */
break;
} }
ret= 1; ret= 1;
@ -3461,32 +3515,49 @@ set_error:;
} }
/* @param flag bit0= only check creator and hfs_type for compliance.
*/
int Xorriso_hfsplus_file_creator_type(struct XorrisO *xorriso, char *path, int Xorriso_hfsplus_file_creator_type(struct XorrisO *xorriso, char *path,
void *in_node, void *in_node,
char *creator, char *hfs_type, int flag) char *creator, char *hfs_type, int flag)
{ {
int ret; int ret;
IsoNode *node; IsoNode *node;
struct iso_hfsplus_xinfo_data *hfs_data; struct iso_hfsplus_xinfo_data *hfs_data= NULL;
if(in_node == NULL) { if(in_node == NULL && !(flag * 1)) {
ret= Xorriso_node_from_path(xorriso, NULL, path, &node, 0); ret= Xorriso_node_from_path(xorriso, NULL, path, &node, 0);
if(ret <= 0) if(ret <= 0)
return(ret); return(ret);
} else } else
node= (IsoNode *) in_node; node= (IsoNode *) in_node;
if((creator[0] == 0 && hfs_type[0] == 0) ||
strcmp(creator, "--delete") == 0) {
if(flag & 1)
return(1);
ret= iso_node_remove_xinfo(node, iso_hfsplus_xinfo_func);
Xorriso_process_msg_queues(xorriso, 0);
if(ret < 0) {
Xorriso_report_iso_error(xorriso, path, ret,
"Cannot remove HFS+ creator and type of ISO node",
0, "FAILURE", 1);
goto failure;
}
return(1);
} else if(strlen(creator) != 4 || strlen(hfs_type) != 4) {
strcat(xorriso->info_text,
"HFS+ file creator code or type code are not exactly 4 characters long");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
if(flag & 1)
return(1);
hfs_data= iso_hfsplus_xinfo_new(0); hfs_data= iso_hfsplus_xinfo_new(0);
if(hfs_data == NULL) { if(hfs_data == NULL) {
Xorriso_no_malloc_memory(xorriso, NULL, 0); Xorriso_no_malloc_memory(xorriso, NULL, 0);
return(-1); return(-1);
} }
if(strlen(creator) != 4 || strlen(hfs_type) != 4) {
strcat(xorriso->info_text,
"HFS+ file creator code or type code are not exactly 4 characters long");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
memcpy(hfs_data->creator_code, creator, 4); memcpy(hfs_data->creator_code, creator, 4);
memcpy(hfs_data->type_code, hfs_type, 4); memcpy(hfs_data->type_code, hfs_type, 4);
@ -3510,11 +3581,11 @@ int Xorriso_hfsplus_file_creator_type(struct XorrisO *xorriso, char *path,
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
goto failure; goto failure;
} }
Xorriso_set_change_pending(xorriso, 0);
return(1); return(1);
failure: failure:
iso_hfsplus_xinfo_func(hfs_data, 1); if(hfs_data != NULL)
iso_hfsplus_xinfo_func(hfs_data, 1);
return(0); return(0);
} }
@ -3527,6 +3598,8 @@ failure:
bit0= Revoke blessing if node != NULL bears it. bit0= Revoke blessing if node != NULL bears it.
bit1= Revoke any blessing of the node, regardless of parameter bit1= Revoke any blessing of the node, regardless of parameter
blessing. If node is NULL, then revoke all blessings in opts. blessing. If node is NULL, then revoke all blessings in opts.
bit2= Only check parameter blessing.
Return 1 instead of issueing the blessing.
*/ */
int Xorriso_hfsplus_bless(struct XorrisO *xorriso, char *path, int Xorriso_hfsplus_bless(struct XorrisO *xorriso, char *path,
void *in_node, char *blessing, int flag) void *in_node, char *blessing, int flag)
@ -3568,6 +3641,9 @@ int Xorriso_hfsplus_bless(struct XorrisO *xorriso, char *path,
return(0); return(0);
} }
if(flag & 4)
return(1);
ret= iso_image_hfsplus_bless(volume, bless_code, node, flag & 3); ret= iso_image_hfsplus_bless(volume, bless_code, node, flag & 3);
Xorriso_process_msg_queues(xorriso, 0); Xorriso_process_msg_queues(xorriso, 0);
if(ret == 0 && path[0]) { if(ret == 0 && path[0]) {
@ -3594,3 +3670,45 @@ int Xorriso_hfsplus_bless(struct XorrisO *xorriso, char *path,
return(1); return(1);
} }
int Xorriso_get_blessing(struct XorrisO *xorriso, IsoNode *node,
int *bless_idx, char bless_code[17], int flag)
{
IsoNode **blessed_nodes;
int bless_max, ret, i;
if(xorriso->in_volset_handle == NULL)
return(0);
ret= iso_image_hfsplus_get_blessed((IsoImage *) xorriso->in_volset_handle,
&blessed_nodes, &bless_max, 0);
Xorriso_process_msg_queues(xorriso, 0);
if(ret < 0) {
Xorriso_report_iso_error(xorriso, "", ret,
"Error when trying to inquire HFS+ file blessings",
0, "FAILURE", 1);
return(-1);
}
for(i= 0; i < bless_max; i++) {
if(blessed_nodes[i] == node) {
switch (i) {
case ISO_HFSPLUS_BLESS_PPC_BOOTDIR:
strcpy(bless_code, "ppc_bootdir");
break; case ISO_HFSPLUS_BLESS_INTEL_BOOTFILE:
strcpy(bless_code, "intel_bootfile");
break; case ISO_HFSPLUS_BLESS_SHOWFOLDER:
strcpy(bless_code, "show_folder");
break; case ISO_HFSPLUS_BLESS_OS9_FOLDER:
strcpy(bless_code, "os9_folder");
break; case ISO_HFSPLUS_BLESS_OSX_FOLDER:
strcpy(bless_code, "osx_folder");
break; default:
strcpy(bless_code, "unknown_blessing");
}
return(1);
}
}
return(0);
}

View File

@ -70,5 +70,8 @@ int Xorriso__file_start_lba(IsoNode *node, int *lba, int flag);
int Xorriso__mark_update_xinfo(void *data, int flag); int Xorriso__mark_update_xinfo(void *data, int flag);
int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag); int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag);
int Xorriso_get_blessing(struct XorrisO *xorriso, IsoNode *node,
int *bless_idx, char bless_code[17], int flag);
#endif /* ! Xorriso_pvt_iso_manip_includeD */ #endif /* ! Xorriso_pvt_iso_manip_includeD */

View File

@ -1081,6 +1081,29 @@ not_enough_exec_arguments:;
Findjob_set_action_target(job, 44, argv[i], 0); Findjob_set_action_target(job, 44, argv[i], 0);
list_extattr_head= 1; list_extattr_head= 1;
list_extattr_mode= argv[i]; list_extattr_mode= argv[i];
} else if(strcmp(cpt, "set_hfs_crtp")==0) {
if(i + 2 >= end_idx)
goto not_enough_exec_arguments;
i+= 2;
/* Check creator and type for compliance */
ret= Xorriso_hfsplus_file_creator_type(xorriso, "", NULL,
argv[i - 1], argv[i], 1);
if(ret <= 0)
goto ex;
Findjob_set_action_text_2(job, 45, argv[i - 1], argv[i], 0);
} else if(strcmp(cpt, "get_hfs_crtp")==0) {
Findjob_set_action_target(job, 46, NULL, 0);
} else if(strcmp(cpt, "set_hfs_bless")==0) {
if(i+1>=end_idx)
goto not_enough_exec_arguments;
i++;
/* Check type of blessing for compliance */
ret= Xorriso_hfsplus_bless(xorriso, "", NULL, argv[i], 4);
if(ret <= 0)
goto ex;
Findjob_set_action_target(job, 47, argv[i], 0);
} else if(strcmp(cpt, "get_hfs_bless")==0) {
Findjob_set_action_target(job, 48, NULL, 0);
} else { } else {
sprintf(xorriso->info_text, "-find -exec: unknown action "); sprintf(xorriso->info_text, "-find -exec: unknown action ");
Text_shellsafe(argv[i], xorriso->info_text, 1); Text_shellsafe(argv[i], xorriso->info_text, 1);

View File

@ -1 +1 @@
#define Xorriso_timestamP "2012.05.28.133310" #define Xorriso_timestamP "2012.05.30.153449"