Controlling import and export of ACL, EA, AAIP

This commit is contained in:
Thomas Schmitt 2009-01-23 09:32:32 +01:00
parent 65e5b00171
commit c8495481ca
10 changed files with 138 additions and 26 deletions

View File

@ -32,6 +32,13 @@ address enough storage if needed.
The SUSP field and the ER entry of AAIP shall only be present if the ER entry
of RRIP is present.
This extension is supposed not to disturb any reader system which complies
to this SUSP demand:
"6.2 Requirements for a Receiving System
[...]
Any System Use Field which the receiving system does not recognize
is to be ignored and skipped."
-------------------------------------------------------------------------------
System Entries Provided by this Specification
@ -337,4 +344,6 @@ Pending considerations:
- shall "AA" be fixely defined as signature ?
- shall the tag types ACL_USER and ACL_GROUP with non-numeric qualifier be
revoked ?

View File

@ -13,6 +13,9 @@
#include "node.h"
#include "fsource.h"
/* ts A90121 : needed for image->builder_ignore_acl */
#include "image.h"
#include <stdlib.h>
#include <string.h>
#include <limits.h>
@ -187,7 +190,9 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
/* ts A90115 */
/* obtain ownership of eventual AA string */
ret = iso_file_source_get_aa_string(src, &aa_string, 1);
ret = iso_file_source_get_aa_string(src, &aa_string,
1 | (image->builder_ignore_acl << 1) |
(image->builder_ignore_ea << 2 ));
if (ret == 1 && aa_string != NULL) {
/* >>> change field signatures to eventual libisofs non-"AA" setting */;

View File

@ -883,6 +883,10 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
target->rockridge = opts->rockridge;
target->joliet = opts->joliet;
target->iso1999 = opts->iso1999;
/* ts A90122 */
target->aaip = opts->aaip;
target->always_gmt = opts->always_gmt;
target->ino = 0;
target->omit_version_numbers = opts->omit_version_numbers
@ -1412,6 +1416,15 @@ int iso_write_opts_set_iso1999(IsoWriteOpts *opts, int enable)
return ISO_SUCCESS;
}
int iso_write_opts_set_aaip(IsoWriteOpts *opts, int enable)
{
if (opts == NULL) {
return ISO_NULL_POINTER;
}
opts->aaip = enable ? 1 : 0;
return ISO_SUCCESS;
}
int iso_write_opts_set_omit_version_numbers(IsoWriteOpts *opts, int omit)
{
if (opts == NULL) {

View File

@ -42,6 +42,9 @@ struct iso_write_opts {
unsigned int joliet :1;
unsigned int iso1999 :1;
/* ts A90122 */
unsigned int aaip :1; /* whether to write eventual ACL and EAs */
/* allways write timestamps in GMT */
unsigned int always_gmt :1;
@ -245,6 +248,9 @@ struct ecma119_image
unsigned int eltorito :1;
unsigned int iso1999 :1;
/* ts A90122 */
unsigned int aaip :1; /* whether to write eventual ACLs and EAs */
/* allways write timestamps in GMT */
unsigned int always_gmt :1;

View File

@ -295,7 +295,7 @@ struct image_fs_data
/**
* malloc() storage for the string of AA fields which represent
* POSIX Extended Attributes and ACLs. (Not to be confused with
* ACLs and XFS-style Extended Attributes. (Not to be confused with
* ECMA-119 Extended Attributes.)
*/
unsigned char *aa_string;

View File

@ -39,6 +39,7 @@ int iso_file_source_new_lfs(IsoFileSource *parent, const char *name,
*/
IsoFilesystem *lfs= NULL;
typedef struct
{
/** reference to the parent (if root it points to itself) */
@ -485,8 +486,16 @@ int lfs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
size_t num_attrs = 0, *value_lengths = NULL, result_len, sret;
char *path = NULL, **names = NULL, **values = NULL;
unsigned char *result = NULL;
_LocalFsFileSource *data;
data = src->data;
*aa_string = NULL;
if ((flag & 3 ) == 3) {
ret = 1;
goto ex;
}
/* Obtain EAs and ACLs ("access" and "default"). ACLs encoded according
to AAIP ACL representation. Clean out st_mode ACL entries.
*/
@ -494,7 +503,8 @@ int lfs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
/* >>> make adjustable: bit4 = ignoring of st_mode ACL entries */
ret = aaip_get_attr_list(path, &num_attrs, &names,
&value_lengths, &values, 1 | 2 | 16);
&value_lengths, &values,
(!(flag & 2)) | 2 | (flag & 4) | 16);
if (ret <= 0) {
ret = ISO_FILE_ERROR;
goto ex;

View File

@ -71,6 +71,8 @@ int iso_image_new(const char *name, IsoImage **image)
img->volset_id = strdup(name);
img->volume_id = strdup(name);
}
img->builder_ignore_acl = 1;
img->builder_ignore_ea = 1;
*image = img;
return ISO_SUCCESS;
}
@ -308,3 +310,11 @@ int iso_image_update_sizes(IsoImage *image)
return dir_update_size(image, image->root);
}
void iso_image_set_ignore_aclea(IsoImage *image, int what)
{
image->builder_ignore_acl = (what & 1);
image->builder_ignore_ea = !!(what & 2);
}

View File

@ -76,6 +76,20 @@ struct Iso_Image
*/
int ignore_special;
/**
* Whether to ignore ACL when inserting nodes into the image.
* Not in effect with loading a complete ISO image but only with image
* manipulation.
*/
unsigned int builder_ignore_acl : 1;
/**
* Whether to ignore EAs when inserting nodes into the image.
* Not in effect with loading a complete ISO image but only with image
* manipulation. ACL does not count as EA.
*/
unsigned int builder_ignore_ea : 1;
/**
* Files to exclude. Wildcard support is included.
*/

View File

@ -673,12 +673,20 @@ struct IsoFileSource_Iface
/* ts A90114 */
/**
* Valid only if .version is > 0. See above.
* Get the AA string with encoded ACL and/or POSIX Extended Attributes.
* Get the AA string with encoded ACL and/or XFS-style Extended Attributes.
* (Not to be confused with ECMA-119 Extended Attributes).
*
* bit1 and bit2 of flag should be implemented so that freshly fetched
* info does not include the undesired ACL or EAs. Nevertheless if the
* aa_string is cached, then it is permissible that ACL and EA are still
* delivered.
*
* @param flag Bitfield for control purposes
* bit0= Transfer ownership of AA string data.
* src will free the eventual cached data and might
* not be able to produce it again.
* bit1= No need to get ACL (no guarantee of exclusion)
* bit2= No need to get EA (no guarantee of exclusion)
* @param aa_string Returns a pointer to the AA string data. If no AA
* string is available, *aa_string becomes NULL.
* Field signature will be "AA".
@ -915,6 +923,30 @@ char *iso_get_local_charset(int flag);
int iso_image_new(const char *name, IsoImage **image);
/* ts A90121 */
/**
* Control whether ACL and XFS-style Extended Attributes will be imported from
* external filesystems (typically the local POSIX filesystem) when new
* nodes get inserted. If enabled by iso_write_opts_set_aaip() they will later
* be written into the image as AAIP extension fields.
*
* A change of this setting does neither affect existing IsoNode objects
* nor the way how ACL and EA are handled when loading an ISO image.
* The latter is controlled by iso_read_opts_set_no_aaip().
*
* @param image
* The image of which the behavior is to be controlled
* @param what
* A bit field which sets the behavior:
* bit0= ignore ACLs if the external file object bears some
* bit1= ignore EAs if the external file object bears some
* all other bits are reserved
*
* @since 0.6.14
*/
void iso_image_set_ignore_aclea(IsoImage *image, int what);
/**
* The following two functions three macros are utilities to help ensuring
* version match of application, compile time header, and runtime library.
@ -1017,6 +1049,9 @@ int iso_lib_is_compatible(int major, int minor, int micro);
* ---> 1 [BACKUP]
* POSIX compatibility for backup. Simple settings, ISO level is set to
* 3 and RR extensions are enabled. Useful for backup purposes.
* Note that ACL and XFS-style EA are not enabled by default.
* If you enable them, expect them not to show up in the mounted image.
* They will have to be retrieved by libisofs applications like xorriso.
* ---> 2 [DISTRIBUTION]
* Setting for information distribution. Both RR and Joliet are enabled
* to maximize compatibility with most systems. Permissions are set to
@ -1098,6 +1133,21 @@ int iso_write_opts_set_joliet(IsoWriteOpts *opts, int enable);
*/
int iso_write_opts_set_iso1999(IsoWriteOpts *opts, int enable);
/* ts A90122 */
/**
* Control writing of AAIP informations for ACL and XFS-style Extended
* Attributes.
* For importing ACL and EA when inserting nodes from external filesystems
* (e.g. the local POSIX filesystem) see iso_image_set_ignore_aclea().
* For loading of this information from images see iso_read_opts_set_no_aaip().
*
* @param enable 1 = do not read AAIP information
* 0 = read AAIP information if available
* All other values are reserved.
* @since 0.6.14
*/
int iso_write_opts_set_aaip(IsoWriteOpts *opts, int enable);
/**
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
* This breaks ECMA-119 specification, but version numbers are usually not
@ -1461,8 +1511,7 @@ int iso_image_update_sizes(IsoImage *image);
* ---> 0 [STANDARD]
* Suitable for most situations. Most extension are read. When both
* Joliet and RR extension are present, RR is used.
* AAIP for ACL and POSIX Extended Attributes is not enabled by
* default.
* AAIP for ACL and Extended Attributes is not enabled by default.
* @return
* 1 success, < 0 error
*
@ -1509,7 +1558,12 @@ int iso_read_opts_set_no_joliet(IsoReadOpts *opts, int nojoliet);
int iso_read_opts_set_no_iso1999(IsoReadOpts *opts, int noiso1999);
/**
* Control reading of AAIP informations for ACL and POSIX Extended Attributes.
* Control reading of AAIP informations about ACL and XFS-style Extended
* Attributes when loading existing images.
* For importing ACL and EA when inserting nodes from external filesystems
* (e.g. the local POSIX filesystem) see iso_image_set_ignore_aclea().
* For eventual writing of this information see iso_write_opts_set_aaip().
*
* @param noaaip 1 = do not read AAIP information
* 0 = read AAIP information if available
* All other values are reserved.
@ -3666,7 +3720,7 @@ int iso_file_source_readlink(IsoFileSource *src, char *buf, size_t bufsiz);
/**
* Get the AA string with encoded ACL and/or POSIX Extended Attributes.
* Get the AA string with encoded ACL and/or XFS-style Extended Attributes.
* (Not to be confused with ECMA-119 Extended Attributes).
* @param src The file source object to be inquired.
* @param aa_string Returns a pointer to the AA string data. If no AA
@ -3680,6 +3734,8 @@ int iso_file_source_readlink(IsoFileSource *src, char *buf, size_t bufsiz);
* bit0= Transfer ownership of AA string data.
* src will free the eventual cached data and might
* not be able to produce it again.
* bit1= No need to get ACL (but no guarantee of exclusion)
* bit2= No need to get EA (but no guarantee of exclusion)
* @return 1 means success (*aa_string == NULL is possible)
* <0 means failure and must b a valid libisofs error code
* (e.g. ISO_FILE_ERROR if no better one can be found).

View File

@ -880,9 +880,7 @@ int susp_calc_nm_sl_aa(Ecma119Image *t, Ecma119Node *n, size_t space,
/* obtain num_aapt from node */
num_aapt = 0;
/* >>> if AAIP is enabled */
if (1) {
if (t->aaip) {
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
if (ret == 1) {
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
@ -1127,10 +1125,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t space,
/* obtain num_aapt from node */
num_aapt = 0;
/* >>> if AAIP is enabled */
if (1) {
if (t->aaip) {
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
if (ret == 1) {
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
@ -1171,13 +1166,11 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t space,
if (1) {
#else /* Libisofs_with_aaip_dummY */
/* >>> if AAIP is enabled */
if (1) {
if (t->aaip) {
#endif /* ! Libisofs_with_aaip_dummY */
*ce += 160; /* ER of AAIP */
}
#endif /* Libisofs_with_aaiP */
@ -1655,9 +1648,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
ret = ISO_SUCCESS;
num_aapt = 0;
/* >>> if AAIP is enabled */
if (1) {
if (t->aaip) {
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
if (ret == 1) {
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
@ -1708,8 +1699,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
#else /* Libisofs_with_aaip_dummY */
/* >>> if AAIP is enabled */
if (1) {
if (t->aaip) {
#endif /* ! Libisofs_with_aaip_dummY */
@ -1737,8 +1727,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
#else /* Libisofs_with_aaip_dummY */
/* >>> if AAIP is enabled */
if (1) {
if (t->aaip) {
#endif /* ! Libisofs_with_aaip_dummY */