From ecbf829ea921e8420683fe7f88b50b33d9c90d8f Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Wed, 21 Jan 2009 20:45:22 +0000 Subject: [PATCH] New option -acl enables ACL loading --- xorriso/xorriso.c | 35 +++++++++++++++++++- xorriso/xorriso.h | 5 +++ xorriso/xorriso_private.h | 3 ++ xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.c | 64 +++++++++++++++++++++---------------- xorriso/xorrisoburn.h | 4 +++ 6 files changed, 84 insertions(+), 29 deletions(-) diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index dc75229c..78166645 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -3821,6 +3821,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->split_size= 0; strcpy(m->list_delimiter, "--"); m->do_joliet= 0; + m->do_aaip= 0; m->relax_compliance= 0; m->do_follow_pattern= 1; m->do_follow_param= 0; @@ -6120,6 +6121,11 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) Xorriso_status_result(xorriso, filter, fp, flag & 2); } + 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); + is_default= (xorriso->assert_volid[0] == 0); sprintf(line, "-assert_volid "); Text_shellsafe(xorriso->assert_volid, line, 1); @@ -10723,6 +10729,27 @@ int Xorriso_option_abort_on(struct XorrisO *xorriso, char *severity, int flag) } +/* Option -acl "on"|"off" */ +int Xorriso_option_acl(struct XorrisO *xorriso, char *mode, int flag) +{ + int ret; + + if(strcmp(mode, "off")==0) + xorriso->do_aaip&= ~3; + else if(strcmp(mode, "on")==0) + xorriso->do_aaip|= (1 | 2); + else { + sprintf(xorriso->info_text, "-acl: 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); +} + + /* Option -add */ /* @param flag bit0=do not report the added item bit1=do not reset pacifier, no final pacifier message @@ -13105,6 +13132,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Like -charset but only for conversion to media.", " -local_charset name", " Override system assumption of the local character set name.", +" -acl \"on\"|\"off\"", +" Enable resp. disable reading and writing of ACLs.", " -ban_stdio_write", " Allow for writing only the usage of optical drives.", " -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"", @@ -15580,7 +15609,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "" }; static char arg1_commands[][40]= { - "abort_on","add_plainly","application_id","backslash_codes","blank", + "abort_on","acl","add_plainly","application_id","backslash_codes","blank", "cd","cdi","cdx","charset","close","commit_eject","compliance", "dev", "dummy","dialog","disk_pattern","eject","iso_rr_pattern","follow", "format","fs","gid","grow_blindly", @@ -15741,6 +15770,10 @@ next_command:; (*idx)++; ret= Xorriso_option_abort_on(xorriso, arg1, 0); + } else if(strcmp(cmd,"acl")==0) { + (*idx)++; + ret= Xorriso_option_acl(xorriso, arg1, 0); + } else if(strcmp(cmd,"add")==0) { ret= Xorriso_option_add(xorriso, argc, argv, idx, 0); diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index cbb65221..09ae577c 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -263,6 +263,11 @@ int Xorriso_lst_destroy_all(struct Xorriso_lsT **lstring, int flag); /* Option -abort_on */ int Xorriso_option_abort_on(struct XorrisO *xorriso, char *severity, int flag); + +/* Option -acl "on"|"off" */ +int Xorriso_option_acl(struct XorrisO *xorriso, char *mode, int flag); + + /* Option -add */ /* @param flag bit0=do not report the added item bit1=do not reset pacifier, no final pacifier message diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index 0f146a23..92f3f4fe 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -100,6 +100,9 @@ struct XorrisO { /* the global context of xorriso */ /* >>> put libisofs aspects here <<< */ int do_joliet; + + int do_aaip; /* bit0= ACL in , bit1= ACL out , bit2= EA in , bit3= EA out */ + int relax_compliance; /* opaque bitfield to be set by xorrisoburn */ int do_follow_pattern; int do_follow_param; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index e201c0d8..3414460d 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.01.21.203852" +#define Xorriso_timestamP "2009.01.21.204513" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 6b825090..36009066 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -525,7 +525,7 @@ int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag) */ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) { - int ret, hret, not_writeable= 0, has_what, aquire_flag, load_lba; + int ret, hret, not_writeable= 0, has_what, aquire_flag, load_lba, ext; uint32_t size; struct burn_drive_info *dinfo= NULL, *out_dinfo, *in_dinfo; struct burn_drive *drive, *out_drive, *in_drive; @@ -582,6 +582,10 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) isoburn_set_msgs_submit(Xorriso_msgs_submit_void, (void *) xorriso, (3<<2) | 128 , 0); aquire_flag= 1 | ((flag&(8|4))>>1) | ((xorriso->toc_emulation_flag & 3)<<3); + if(!(xorriso->do_aaip & 1)) + aquire_flag|= 32; + if(!(xorriso->do_aaip & 4)) + aquire_flag|= 64; ret= isoburn_drive_aquire(&dinfo, libburn_adr, aquire_flag); Xorriso_process_msg_queues(xorriso,0); if(ret<=0) { @@ -670,7 +674,18 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) ret= isoburn_ropt_new(&ropts, 0); if(ret<=0) goto ex; - isoburn_ropt_set_extensions(ropts, isoburn_ropt_noiso1999); + + ext= isoburn_ropt_noiso1999; +#ifdef isoburn_ropt_noacl + if(!(xorriso->do_aaip & 1)) + ext|= isoburn_ropt_noacl; +#endif +#ifdef isoburn_ropt_noea + if(!(xorriso->do_aaip & 4)) + ext|= isoburn_ropt_noea; +#endif + isoburn_ropt_set_extensions(ropts, ext); + isoburn_ropt_set_default_perms(ropts, (uid_t) 0, (gid_t) 0, (mode_t) 0555); isoburn_ropt_set_input_charset(ropts, xorriso->in_charset); @@ -703,6 +718,7 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) isoburn_ropt_noiso1999 | isoburn_ropt_norock | isoburn_ropt_nojoliet); } + ret= isoburn_read_image(drive, ropts, &volset); /* <<< Resetting to normal thresholds */ @@ -8603,28 +8619,6 @@ int Xorriso_mount(struct XorrisO *xorriso, char *dev, int adr_mode, 0, "SORRY", 0); sprintf(xorriso->result_line, "%s\n", mount_command); Xorriso_result(xorriso,0); - -#ifdef NIX - - } else if(geteuid() != getuid() || getgid() != getegid()) { - Xorriso_msgs_submit(xorriso, 0, - "-mount : Detected own setuid/gid identity. Will not perform mount command.", - 0, "SORRY", 0); - sprintf(xorriso->result_line, "%s\n", mount_command); - Xorriso_result(xorriso,0); - } else { - /* >>> find safer way to perform command */; - ret= system(mount_command); - if(WIFEXITED(ret) && WEXITSTATUS(ret) != 0) { - sprintf(xorriso->info_text, - "-mount : mount command failed with exit value %d", - (int) WEXITSTATUS(ret)); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); - ret= 0; goto ex; - } - -#else - } else { ret= Xorriso_execv(xorriso, mount_command, "/bin:/sbin", &status, 1); if(WIFEXITED(status) && WEXITSTATUS(status) != 0) { @@ -8634,9 +8628,6 @@ int Xorriso_mount(struct XorrisO *xorriso, char *dev, int adr_mode, Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); ret= 0; goto ex; } - -#endif - sprintf(xorriso->info_text, "\nMounted session %d of device %s", session, Text_shellsafe(dev_path, sfe, 0)); dpt= strchr(cmd, ':'); @@ -8795,8 +8786,13 @@ int Xorriso_getfacl(struct XorrisO *xorriso, char *path, char **acl_text, goto ex; } if(ret == 0 || ret == 2) { +#ifdef Xorriso_with_aaiP strcpy(xorriso->info_text, "No ACL associated with "); Text_shellsafe(path, xorriso->info_text, 1); +#else + strcpy(xorriso->info_text, + "ACL not enabled by Libisofs_with_aaiP/Xorriso_with_aaiP"); +#endif Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0); if(ret == 0) {ret= 2; goto ex;} @@ -8841,3 +8837,17 @@ ex:; return(ret); } + +int Xorriso_set_ignore_aclea(struct XorrisO *xorriso, int flag) +{ + int ret; + IsoImage *volume; + + ret= Xorriso_get_volume(xorriso, &volume, 0); + if(ret<=0) + return(ret); + iso_image_set_ignore_aclea(volume, + ((~xorriso->do_aaip) & 1) | (((~xorriso->do_aaip) & 4) >> 1)); + return(1); +} + diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 5eb699e6..a8e9da48 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -394,6 +394,10 @@ int Xorriso_getfacl(struct XorrisO *xorriso, char *path, char **acl_text, int flag); +/* Calls iso_image_set_ignore_aclea() according to xorriso->do_aaip */ +int Xorriso_set_ignore_aclea(struct XorrisO *xorriso, int flag); + + /* A pseudo file type for El-Torito bootsectors as in man 2 stat : For now take the highest possible value. */