Implemented reading of AA fields to struct image_fs_data.aa_string

and defined IsoFileSource_Iface version 1 with access function .get_aa_string()
This commit is contained in:
2009-01-15 17:43:58 +01:00
parent 3c91c2f333
commit de99f93640
7 changed files with 195 additions and 19 deletions

View File

@ -118,7 +118,7 @@ int aaip_get_attr_list(char *path, size_t *num_attrs, char ***names,
/* This function expects to get submitted a complete chain of AA fields and
determines its size by interpeting the SUSP structure..
determines its size by interpeting the SUSP structure.
@param aa_name The Signature Word (advised is "AA") to be looked for
@param data An arbitrary number of bytes beginning with the
complete chain of AA fields. Trailing trash is ignored.

View File

@ -265,6 +265,20 @@ struct image_fs_data
*/
off_t offset;
} data;
#ifdef Libisofs_with_aaiP
/* ts A90114 */
/**
* malloc() storage for the string of AA fields which represent
* POSIX Extended Attributes and ACLs. (Not to be confused with
* ECMA-119 Extended Attributes.)
*/
unsigned char *aa_string;
#endif /* Libisofs_with_aaiP */
};
struct child_list
@ -907,9 +921,28 @@ void ifs_free(IsoFileSource *src)
free(data->sections);
free(data->name);
#ifdef Libisofs_with_aaiP
/* ts A90115 */
if (data->aa_string != NULL)
free(data->aa_string);
#endif /* Libisofs_with_aaiP */
free(data);
}
#ifdef Libisofs_with_aaiP
/* >>> unsigned char *(*get_aa_string)(IsoFileSource *src,
unsigned char **aa_string, int flag);
*/
#endif /* Libisofs_with_aaiP */
IsoFileSourceIface ifs_class = {
0, /* version */
ifs_get_path,
@ -996,6 +1029,16 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
uint32_t relocated_dir = 0;
#ifdef Libisofs_with_aaiP
/* ts A90115 */
unsigned char *aa_string = NULL;
size_t aa_size = 0, aa_len = 0, prev_field = 0;
int aa_done = 0;
#endif /* Libisofs_with_aaiP */
if (fs == NULL || fs->data == NULL || record == NULL || src == NULL) {
return ISO_NULL_POINTER;
}
@ -1025,7 +1068,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
if (record->len_xa[0]) {
iso_msg_submit(fsdata->msgid, ISO_UNSUPPORTED_ECMA119, 0,
"Unsupported image. This image has at least one file with "
"Extended Attributes, that are not supported");
"ECMA-119 Extended Attributes, that are not supported");
return ISO_UNSUPPORTED_ECMA119;
}
@ -1238,20 +1281,19 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
#ifdef Libisofs_with_aaiP
/* ts A90115 */
} else if (SUSP_SIG(sue, 'A', 'A')) {
ret = ISO_SUCCESS;
/* >>> ts A90112
ret = read_susp_AA(sue, &aa, &aacont);
*/
ret = read_aaip_AA(sue, "AA", &aa_string, &aa_size, &aa_len,
&prev_field, &aa_done, 0);
if (ret < 0) {
/* notify and continue */
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
"Invalid NM entry");
"Invalid AA entry");
continue;
}
#endif /* Libisofs_with_aaiP */
@ -1512,6 +1554,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
ifsdata->info = atts;
ifsdata->name = name;
#ifdef Libisofs_with_aaiP
ifsdata->aa_string = aa_string;
#endif /* Libisofs_with_aaiP */
/* save extents */
ifsdata->sections = realloc(ifsdata->sections,
(1 + ifsdata->nsections) * sizeof(struct iso_file_section));

View File

@ -459,7 +459,12 @@ struct iso_filesystem
*/
struct IsoFileSource_Iface
{
/* reserved for future usage, set to 0 */
/* ts A90114 */
/**
* Tells the version of the interface:
* Version 0 provides functions up to (*lseek)().
* Version 1 additionally provides function *(get_aa_string)().
*/
int version;
/**
@ -654,13 +659,38 @@ struct IsoFileSource_Iface
* 2 The offset is set to the size of the file plus offset bytes
* (SEEK_END).
* @return
* Absolute offset posistion on the file, or < 0 on error. Cast the
* Absolute offset position of the file, or < 0 on error. Cast the
* returning value to int to get a valid libisofs error.
*
* @since 0.6.4
*/
off_t (*lseek)(IsoFileSource *src, off_t offset, int flag);
/* Add-ons of .version 1 begin here */
/* ts A90114 */
/**
* Valid only if .version is > 0. See above.
* Get the AA string with encoded ACL and/or POSIX Extended Attributes.
* (Not to be confused with ECMA-119 Extended Attributes).
* @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.
* @param aa_string Returns a pointer to the AA string data. If no AA
* string is available, *aa_string becomes NULL.
* The caller is responsible for finally calling free()
* on non-NULL results.
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
* libisofs/aaip_0_2.h for encoding and decoding.)
* @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).
* @since 0.6.14
*/
unsigned char *(*get_aa_string)(IsoFileSource *src,
unsigned char **aa_string, int flag);
/*
* TODO #00004 Add a get_mime_type() function.
* This can be useful for GUI apps, to choose the icon of the file

View File

@ -1346,7 +1346,6 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
/* Obtain AA field string from node
and write it to directory entry or CE area.
*/
aapt = NULL;
ret = ISO_SUCCESS;
num_aapt = 0;

View File

@ -28,6 +28,17 @@
#include "ecma119.h"
/* ts A90112 : Enable experiments about EA and ACL
*/
#define Libisofs_with_aaiP yes
/* ts A90112
<<< write dummy AAIP fields with any node
# define Libisofs_with_aaip_dummY yes
*/
#define SUSP_SIG(entry, a, b) ((entry->sig[0] == a) && (entry->sig[1] == b))
/**
@ -115,6 +126,18 @@ struct rr_SL {
uint8_t comps[1];
};
#ifdef Libisofs_with_aaiP
/** Arbitrary Attribute (AAIP, see doc/susp_aaip_0_2.txt) */
struct rr_AA {
uint8_t flags[1];
uint8_t comps[1];
};
#endif /* Libisofs_with_aaiP */
/**
* Struct for a SUSP System User Entry (SUSP, 4.1)
*/
@ -133,6 +156,11 @@ struct susp_sys_user_entry
struct rr_NM NM;
struct rr_CL CL;
struct rr_SL SL;
#ifdef Libisofs_with_aaiP
struct rr_AA AA;
#endif /* Libisofs_with_aaiP */
} data; /* 5 to 4+len_sue */
};
@ -265,13 +293,32 @@ int read_rr_SL(struct susp_sys_user_entry *sl, char **dest, int *cont);
int read_rr_PN(struct susp_sys_user_entry *pn, struct stat *st);
/* ts A90112 : Enable experiments about EA and ACL
*/
#define Libisofs_with_aaiP yes
#ifdef Libisofs_with_aaiP
/**
* Collects the AA field string from single AA fields.
* (see doc/susp_aaip_0_2.txt)
* @param aa Signature of fields for inner representation. It will
* replace the signature of of the submitted SUSP field.
* Advised is "AA".
* @param aa_string Storage location of the emerging string.
* Begin with *aa_string == NULL, or own malloc() storage.
* @param aa_size Current allocated size of aa_string.
* Begin with *aa_size == 0, or own storage size.
* @param aa_len Current occupied size of aa_string.
* Begin with *aa_len == 0
* @param prev_field Returns the index of start of the previous field
* in the string.
* @param is_done The current completion state of the AA field string.
* Fields will be ignored as soon as it is 1.
* Begin with *is_done == 0
* @param flag Unused yet. Submit 0.
*/
int read_aaip_AA(struct susp_sys_user_entry *sue, char aa[2],
unsigned char **aa_string, size_t *aa_size, size_t *aa_len,
size_t *prev_field, int *is_done, int flag);
#endif
/* ts A90112
<<< write dummy AAIP fields with any node
# define Libisofs_with_aaip_dummY yes
*/
#endif /* LIBISO_ROCKRIDGE_H */

View File

@ -417,3 +417,54 @@ int read_rr_PN(struct susp_sys_user_entry *pn, struct stat *st)
| (dev_t)iso_read_bb(pn->data.PN.low, 4, NULL);
return ISO_SUCCESS;
}
#ifdef Libisofs_with_aaiP
int read_aaip_AA(struct susp_sys_user_entry *sue, char aa[2],
unsigned char **aa_string, size_t *aa_size, size_t *aa_len,
size_t *prev_field, int *is_done, int flag)
{
unsigned char *aapt;
if (*is_done) {
return ISO_WRONG_RR;
}
/* Eventually create or grow storage */
if (*aa_size == 0 || *aa_string == 0) {
*aa_size = *aa_len + sue->len_sue[0];
*aa_string = calloc(*aa_size, 1);
*aa_len = 0;
} else if (*aa_len + sue->len_sue[0] > *aa_size) {
*aa_size += *aa_len + sue->len_sue[0];
*aa_string = realloc(*aa_string, *aa_size);
}
if (*aa_string == NULL)
return ISO_OUT_OF_MEM;
if (*aa_len > 0) {
/* Mark prev_field as being continued */
(*aa_string)[*prev_field + 4] = 1;
}
*prev_field = *aa_len;
/* Compose new SUSP header with signature aa[], cont == 0 */
aapt = *aa_string + *aa_len;
aapt[0] = aa[0];
aapt[1] = aa[1];
aapt[2] = sue->len_sue[0];
aapt[3] = 1;
aapt[4] = 0;
/* Append sue payload */
memcpy(aapt + 5, sue->data.AA.comps, sue->len_sue[0]);
*is_done = sue->data.AA.flags[0] & 1;
return ISO_SUCCESS;
}
#endif /* Libisofs_with_aaiP */