From 58c0732a8edea3f1041ce20b4de442dd833aa0be Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 2 Feb 2009 20:11:26 +0000 Subject: [PATCH] Enabled restoring of xattr --- libisoburn/trunk/xorriso/xorriso.1 | 25 ++++++++++- libisoburn/trunk/xorriso/xorriso_timestamp.h | 2 +- libisoburn/trunk/xorriso/xorrisoburn.c | 47 +++++++++++++++++--- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/libisoburn/trunk/xorriso/xorriso.1 b/libisoburn/trunk/xorriso/xorriso.1 index a1497b5c..ec0ba37e 100644 --- a/libisoburn/trunk/xorriso/xorriso.1 +++ b/libisoburn/trunk/xorriso/xorriso.1 @@ -35,7 +35,7 @@ optical media or to filesystem objects. Vice versa xorriso is able to restore file objects from ISO 9660 filesystems. .PP A special property of xorriso is that it needs neither an external ISO 9660 -formatter program nor an external burn program for CD or DVD but rather +formatter program nor an external burn program for CD, DVD or BD but rather incorporates the libraries of libburnia-project.org . .SS .B Overview of features: @@ -53,6 +53,8 @@ Updates ISO subtrees incrementally to match given disk subtrees. Writes result either as completely new image or as add-on session to optical media or filesystem objects. .br +Can record and restore ACL of disk files. +.br Can activate ISOLINUX boot images via El Torito. .br Can perform multi-session tasks as emulation of mkisofs and cdrecord. @@ -1049,6 +1051,19 @@ matches only files which use data blocks outside the areas marked as damaged. matches only files which use data blocks within the range of start_lba and start_lba+block_count-1. .br +-has_acl , -has_no_acl +.br +match files which have resp. have not a non-trivial ACL. +.br +-has_xattr , -has_no_xattr +.br +match files which have resp. have not xattr name-value pairs. +.br +-has_aaip , -has_no_aaip +.br +match files which have ACL or xattr resp. have neither of them. +.br + Default action is "echo", i.e. to print the address of the found file. Other actions are certain xorriso commands which get performed on the found files. These commands @@ -1139,6 +1154,12 @@ E.g.: .br -find /workgroup -exec setfacl u:lisa:rw,u::rw,g::r,o::-,m::rw .br +"getfattr" prints eventual xattr name-value pairs to the result channel. +.br +E.g.: +.br + -find / -has_xattr -exec getfattr +.br "find" performs another run of -find on the matching file address. It accepts the same params as -find, except iso_rr_path. E.g.: @@ -2059,7 +2080,7 @@ directories. .TP \fB\-getfattr\fR iso_rr_pattern [***] Print the XFS style Extended Attributes of the given files in the ISO image. -If the file has no such xattr then noting is printed. +If ia file has no such xattr then noting is printed for it. .TP \fB\-getfattr_r\fR iso_rr_pattern [***] Like -gefattr but listing recursively the whole file trees underneath eventual diff --git a/libisoburn/trunk/xorriso/xorriso_timestamp.h b/libisoburn/trunk/xorriso/xorriso_timestamp.h index be7cc9d2..3a967ab0 100644 --- a/libisoburn/trunk/xorriso/xorriso_timestamp.h +++ b/libisoburn/trunk/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.02.02.134346" +#define Xorriso_timestamP "2009.02.02.201124" diff --git a/libisoburn/trunk/xorriso/xorrisoburn.c b/libisoburn/trunk/xorriso/xorrisoburn.c index a494450a..1c816698 100644 --- a/libisoburn/trunk/xorriso/xorrisoburn.c +++ b/libisoburn/trunk/xorriso/xorrisoburn.c @@ -2009,7 +2009,7 @@ int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf, if(xorriso->do_aaip & 5) { ret= iso_local_get_attrs(disk_path, &num_attrs, &names, &value_lengths, &values, ((xorriso->do_aaip & 1) && !(flag & 2)) - | (!(xorriso->do_aaip & 4)) << 4); + | (!(xorriso->do_aaip & 4)) << 2); if(ret < 0) { Xorriso_process_msg_queues(xorriso,0); Xorriso_report_iso_error(xorriso, disk_path, ret, @@ -2862,9 +2862,16 @@ int Xorriso_restore_properties(struct XorrisO *xorriso, char *disk_path, uid_t uid; gid_t gid; struct utimbuf utime_buffer; - char sfe[5*SfileadrL], *access_text= NULL, *default_text= NULL; + char sfe[5*SfileadrL]; struct stat stbuf; +#ifdef NIX + char *access_text= NULL, *default_text= NULL; +#else + size_t num_attrs= 0, *value_lengths= NULL; + char **names= NULL, **values= NULL; +#endif + ret= lstat(disk_path, &stbuf); if(ret==-1) { sprintf(xorriso->info_text, @@ -2902,10 +2909,9 @@ int Xorriso_restore_properties(struct XorrisO *xorriso, char *disk_path, #ifdef Xorriso_with_aaiP +#ifdef NIX + if(xorriso->do_aaip & 2) { - - /* >>> change to iso_node_get_attrs */; - ret= iso_node_get_acl_text(node, &access_text, &default_text, 16); if(ret < 0) { strcpy(xorriso->info_text, "Error with obtaining ACL for "); @@ -2934,6 +2940,33 @@ cannot_change_acl:; } } +#else /* NIX */ + + if(xorriso->do_aaip & 10) { + ret= iso_node_get_attrs(node, &num_attrs, &names, &value_lengths, &values, + (!!(xorriso->do_aaip & 2)) | (!(xorriso->do_aaip & 8)) << 2); + if (ret < 0) { + strcpy(xorriso->info_text, "Error with obtaining ACL and xattr for "); + Text_shellsafe(disk_path, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + {ret= 0; goto ex;} + } + if(num_attrs > 0) { + ret= iso_local_set_attrs(disk_path, num_attrs, names, value_lengths, + values, 0); + if(ret < 0) { + sprintf(xorriso->info_text, + "Cannot change ACL or xattr of disk file %s", + Text_shellsafe(disk_path, sfe, 0)); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0); + {ret= 0; goto ex;} + } + } + Xorriso_process_msg_queues(xorriso,0); + } + +#endif /* ! NIX */ + #endif /* Xorriso_with_aaiP */ if(flag&1) @@ -2955,7 +2988,11 @@ cannot_change_acl:; } ret= 1; ex:; +#ifdef NIX iso_node_get_acl_text(node, &access_text, &default_text, 1 << 15); +#else + iso_node_get_attrs(node, &num_attrs, &names, &value_lengths, &values,1 << 15); +#endif return(ret); }