From bbfbb88a868ebf002520847b6c514b05ac41668e Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 20 Mar 2009 19:33:51 +0000 Subject: [PATCH] Now option -auto_charset based on xattr "isofs.cs" --- libisoburn/trunk/xorriso/xorriso.1 | 20 ++++++++++--- libisoburn/trunk/xorriso/xorriso.c | 29 ++++++++++++++++++- libisoburn/trunk/xorriso/xorriso.h | 3 ++ libisoburn/trunk/xorriso/xorriso_private.h | 4 ++- libisoburn/trunk/xorriso/xorriso_timestamp.h | 2 +- libisoburn/trunk/xorriso/xorrisoburn.c | 30 +++++++++++++++++--- 6 files changed, 77 insertions(+), 11 deletions(-) diff --git a/libisoburn/trunk/xorriso/xorriso.1 b/libisoburn/trunk/xorriso/xorriso.1 index d192f35e..c10a42ee 100644 --- a/libisoburn/trunk/xorriso/xorriso.1 +++ b/libisoburn/trunk/xorriso/xorriso.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH XORRISO 1 "Mar 12, 2009" +.TH XORRISO 1 "Mar 20, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -657,6 +657,16 @@ image. This has eventually to be done before specifying -dev , -indev or When loading the written image after -commit the setting of -out_charset will be copied to -in_charset. .TP +\fB\-auto_charset\fR "on"|"off" +Enable or disable recording of the output character set name in an xattr +attribute of the image root directory. If enabled then use an eventual +recorded character set name as input character set when reading an image. +.br +Note that the default output charset is the local character set of the +terminal where xorriso runs. Before attributing this one to the produced +ISO image, it is necessary to check whether the terminal properly displays +all intended filenames. Check especially the exotic national characters. +.TP \fB\-acl\fR "on"|"off" Enable or disable processing of ACLs. If enabled, then xorriso will obtain ACLs from disk file objects, @@ -1035,8 +1045,8 @@ Since -getfacl and getfacl -R strip leading "/" from file paths, the setting of \fB\-setfattr\fR [-]name value iso_rr_path [***] Attach the given xattr pair of name and value to the given iso_rr_paths. If the given name is prefixed by "-", then the pair with that name gets -removed from the xattr list. If name is "--remove-all" then the whole xattr -list of the given iso_rr_paths is deleted. In case of deletion, value must +removed from the xattr list. If name is "--remove-all" then all user namespace +xattr of the given iso_rr_paths get deleted. In case of deletion, value must be an empty text. .br Only names from the user namespace are allowed. I.e. a name has to begin with @@ -1635,7 +1645,9 @@ Default is "old_rr" which uses Rock Ridge version 1.10. This implies also "aaip_susp_1_10" allows AAIP to be written as inofficial extension of RRIP rather than as official extension under SUSP-1.12. .br -Default setting is "clear:deep_paths:long_paths:always_gmt". +Default setting is +.br + "clear:deep_paths:long_paths:always_gmt:old_rr". .br Note: The term "ISO file" means the plain ISO 9660 names wnd attributes which get visible if the reader ignores Rock Ridge. diff --git a/libisoburn/trunk/xorriso/xorriso.c b/libisoburn/trunk/xorriso/xorriso.c index 6c416efb..a5ef67c2 100644 --- a/libisoburn/trunk/xorriso/xorriso.c +++ b/libisoburn/trunk/xorriso/xorriso.c @@ -6382,6 +6382,10 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) if(!(is_default && no_defaults)) Xorriso_status_result(xorriso, filter, fp, flag & 2); } + is_default= ((xorriso->do_aaip & (256 | 512)) == 0); + sprintf(line,"-auto_charset %s\n", (xorriso->do_aaip & 256 ? "on" : "off")); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); is_default= ((xorriso->do_aaip & (1 | 4)) == 0); sprintf(line,"-acl %s\n", (xorriso->do_aaip & 1 ? "on" : "off")); @@ -11762,6 +11766,22 @@ int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern, } +/* Option -auto_charset "on"|"off" */ +int Xorriso_option_auto_charset(struct XorrisO *xorriso, char *mode, int flag) +{ + if(strcmp(mode, "off")==0) + xorriso->do_aaip&= ~(256 | 512); + else if(strcmp(mode, "on")==0) + xorriso->do_aaip|= (256 | 512); + else { + sprintf(xorriso->info_text, "-auto_charset: unknown mode '%s'", mode); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + return(1); +} + + /* Option -backslash_codes */ int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode, int flag) @@ -13939,6 +13959,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " conversion from and to media.", " -in_charset name", " Like -charset but only for conversion from media.", +" -auto_charset \"on\"|\"off\"", +" Enable writing and reading of character set name in image.", " -out_charset name", " Like -charset but only for conversion to media.", " -local_charset name", @@ -16823,7 +16845,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "" }; static char arg1_commands[][40]= { - "abort_on","acl","add_plainly","application_id","backslash_codes","blank", + "abort_on","acl","add_plainly","application_id","auto_charset", + "backslash_codes","blank", "cd","cdi","cdx","charset","close","commit_eject","compliance", "dev","dialog","disk_dev_ino","disk_pattern","dummy","eject", "iso_rr_pattern","follow","format","fs","gid","grow_blindly", @@ -17015,6 +17038,10 @@ next_command:; (*idx)+= 2; ret= Xorriso_option_assert_volid(xorriso, arg1, arg2, 0); + } else if(strcmp(cmd,"auto_charset")==0) { + (*idx)++; + ret= Xorriso_option_auto_charset(xorriso, arg1, 0); + } else if(strcmp(cmd,"backslash_codes")==0) { (*idx)++; ret= Xorriso_option_backslash_codes(xorriso, arg1, 0); diff --git a/libisoburn/trunk/xorriso/xorriso.h b/libisoburn/trunk/xorriso/xorriso.h index a6aa583c..ec5fc799 100644 --- a/libisoburn/trunk/xorriso/xorriso.h +++ b/libisoburn/trunk/xorriso/xorriso.h @@ -302,6 +302,9 @@ int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv, int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern, char *severity, int flag); +/* Option -auto_charset "on"|"off" */ +int Xorriso_option_auto_charset(struct XorrisO *xorriso, char *mode, int flag); + /* Option -backslash_codes */ int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode, int flag); diff --git a/libisoburn/trunk/xorriso/xorriso_private.h b/libisoburn/trunk/xorriso/xorriso_private.h index 8c9c06a2..b84de33d 100644 --- a/libisoburn/trunk/xorriso/xorriso_private.h +++ b/libisoburn/trunk/xorriso/xorriso_private.h @@ -104,7 +104,9 @@ struct XorrisO { /* the global context of xorriso */ int do_aaip; /* bit0= ACL in , bit1= ACL out , bit2= EA in , bit3= EA out bit4= record dev,inode , bit5= check dev,inode bit6= omit content check if dev,inode check is conclusive - bit7= omit dev check mit bit5 + bit7= omit dev check with bit5 + bit8= store output charset in xattr "isofs.cs" + bit9= allow to set input charset from xattr "isofs.cs" */ int relax_compliance; /* opaque bitfield to be set by xorrisoburn */ diff --git a/libisoburn/trunk/xorriso/xorriso_timestamp.h b/libisoburn/trunk/xorriso/xorriso_timestamp.h index 8bd898fc..2f481d14 100644 --- a/libisoburn/trunk/xorriso/xorriso_timestamp.h +++ b/libisoburn/trunk/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.03.20.192910" +#define Xorriso_timestamP "2009.03.20.193334" diff --git a/libisoburn/trunk/xorriso/xorrisoburn.c b/libisoburn/trunk/xorriso/xorrisoburn.c index 36ff68c7..3192fe7b 100644 --- a/libisoburn/trunk/xorriso/xorrisoburn.c +++ b/libisoburn/trunk/xorriso/xorrisoburn.c @@ -671,7 +671,7 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) ext= isoburn_ropt_noiso1999; #ifdef isoburn_ropt_noaaip - if(!(xorriso->do_aaip & (1 | 4 | 16))) + if(!(xorriso->do_aaip & (1 | 4 | 32))) ext|= isoburn_ropt_noaaip; #endif #ifdef isoburn_ropt_noacl @@ -681,11 +681,17 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) #ifdef isoburn_ropt_noea if(!(xorriso->do_aaip & 4)) ext|= isoburn_ropt_noea; +#endif +#ifdef Libisofs_has_auto_input_charseT + + /* >>> eventually allow iso_read_opts_auto_input_charset() */ + #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); + isoburn_ropt_set_auto_incharset(ropts, !!(xorriso->do_aaip & 512)); Xorriso_set_image_severities(xorriso, 1); /* No DEBUG messages */ Xorriso_pacifier_reset(xorriso, 0); @@ -1088,7 +1094,7 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) { int ret, relax= 0, i, pacifier_speed= 0, data_lba; int major, minor, micro; - char xorriso_id[256], *img_id, sfe[5*SfileadrL], *cpt; + char xorriso_id[256], *img_id, sfe[5*SfileadrL], *cpt, *out_cs; struct isoburn_imgen_opts *sopts= NULL; struct burn_drive_info *dinfo, *source_dinfo; struct burn_drive *drive, *source_drive; @@ -1106,6 +1112,10 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) int profile_number; char profile_name[80]; + out_cs= xorriso->out_charset; + if(out_cs == NULL) + Xorriso_get_local_charset(xorriso, &out_cs, 0); + if(!(flag & 1)) { ret= Xorriso_auto_format(xorriso, 0); if(ret <=0 ) @@ -1159,6 +1169,17 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) iso_image_set_publisher_id(image, xorriso->publisher); } + if((xorriso->do_aaip & 256) && out_cs != NULL) { + static char *names = "isofs.cs"; + size_t value_lengths[1]; + + value_lengths[0]= strlen(out_cs); + ret= Xorriso_setfattr(xorriso, NULL, "/", + (size_t) 1, &names, value_lengths, &out_cs, 2 | 8); + if(ret<=0) + goto ex; + } + /* Activate, adjust or discard boot image */ /* >>> ??? move down to libisoburn ? */ if(image!=NULL && !(flag&1)) { @@ -1293,12 +1314,12 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) } isoburn_igopt_set_level(sopts, 3); isoburn_igopt_set_extensions(sopts, 1 | ((!!xorriso->do_joliet)<<1) | - ((!!(xorriso->do_aaip & (2 | 8 | 16))) << 5)); + ((!!(xorriso->do_aaip & (2 | 8 | 16 | 256))) << 5)); isoburn_igopt_set_relaxed(sopts, relax); isoburn_igopt_set_sort_files(sopts, 1); isoburn_igopt_set_over_mode(sopts, 0, 0, (mode_t) 0, (mode_t) 0); isoburn_igopt_set_over_ugid(sopts, 0, 0, (uid_t) 0, (gid_t) 0); - isoburn_igopt_set_out_charset(sopts, xorriso->out_charset); + isoburn_igopt_set_out_charset(sopts, out_cs); isoburn_igopt_set_fifo_size(sopts, xorriso->fs * 2048); if(image!=NULL && @@ -1677,6 +1698,7 @@ int Xorriso__read_pacifier(IsoImage *image, IsoFileSource *filesource) xorriso= (struct XorrisO *) iso_image_get_attached_data(image); if(xorriso==NULL) return(1); + Xorriso_process_msg_queues(xorriso,0); xorriso->pacifier_count++; if(xorriso->pacifier_count%10) return(1);