Implemented generation of AA strings from local filesystem

and upgraded IsoFileSourceIface lfs_class to version 1
This commit is contained in:
Thomas Schmitt 2009-01-16 13:24:30 +01:00
parent 9dc56426c0
commit d01b3cc6cc
8 changed files with 160 additions and 22 deletions

View File

@ -478,7 +478,7 @@ struct aaip_state {
/* ------- functions ------ */
size_t aaip_count_bytes(char aa_name[2], unsigned char *data, int flag)
size_t aaip_count_bytes(unsigned char *data, int flag)
{
int done = 0;
unsigned char *aapt;
@ -489,6 +489,20 @@ size_t aaip_count_bytes(char aa_name[2], unsigned char *data, int flag)
}
int aaip_set_signature(char aa_name[2], unsigned char *data, int flag)
{
int done = 0;
unsigned char *aapt;
for(aapt= data; !done; aapt += aapt[2]) {
done = !(aapt[4] & 1);
aapt[0] = aa_name[0];
aapt[1] = aa_name[1];
}
return(1);
}
size_t aaip_sizeof_aaip_state(void)
{
return((size_t) sizeof(struct aaip_state));

View File

@ -116,16 +116,28 @@ int aaip_get_attr_list(char *path, size_t *num_attrs, char ***names,
attribute lists but may also be used as alternative to Pair Level.
*/
/* Operations on complete AA field strings which need no decoder context.
These function expect to get submitted a complete chain of AA fields.
*/
/* This function expects to get submitted a complete chain of AA fields and
determines its size by interpeting the SUSP structure.
@param aa_name The Signature Word (advised is "AA") to be looked for
/* Determine the size of the AA string by interpreting the SUSP structure.
@param data An arbitrary number of bytes beginning with the
complete chain of AA fields. Trailing trash is ignored.
@param flag Unused yet. Submit 0.
@return The number of bytes of the AA field chain.
*/
size_t aaip_count_bytes(char aa_name[2], unsigned char *data, int flag);
size_t aaip_count_bytes(unsigned char *data, int flag);
/* Set the Signature Words of all fields in the AA string to the given
two byte values.
@param aa_name The Signature Word to be set (advised is "AA").
@param data An arbitrary number of bytes beginning with the
complete chain of AA fields. Trailing trash is ignored.
@param flag Unused yet. Submit 0.
@return 1 means succes, <=0 means error
*/
int aaip_set_signature(char aa_name[2], unsigned char *data, int flag);
/* The AAIP decoder context.

View File

@ -6,6 +6,9 @@
* published by the Free Software Foundation. See COPYING file for details.
*/
/* ts A90116 : libisofs.h eventually defines aaip_xinfo_func */
#include "libisofs.h"
#include "builder.h"
#include "node.h"
#include "fsource.h"
@ -86,6 +89,10 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
IsoNode *new;
char *name;
#ifdef Libisofs_with_aaiP
unsigned char *aa_string;
#endif /* Libisofs_with_aaiP */
if (builder == NULL || src == NULL || node == NULL) {
return ISO_NULL_POINTER;
}
@ -175,6 +182,24 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
iso_node_set_uid(new, info.st_uid);
*node = new;
#ifdef Libisofs_with_aaiP
/* ts A90115 */
/* obtain ownership of eventual AA string */
ret = iso_file_source_get_aa_string(src, &aa_string, 1);
if (ret == 1 && aa_string != NULL) {
/* >>> change field signatures to eventual libisofs non-"AA" setting */;
/* (for now everything is "AA" anyway) */
ret = iso_node_add_xinfo(new, aaip_xinfo_func, aa_string);
if (ret < 0)
return ret;
}
#endif /* Libisofs_with_aaiP */
return ISO_SUCCESS;
}

View File

@ -952,11 +952,12 @@ int ifs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
*aa_string = data->aa_string;
data->aa_string = NULL;
} else {
len = aaip_count_bytes((char *) data->aa_string, data->aa_string, 0);
len = aaip_count_bytes(data->aa_string, 0);
*aa_string = calloc(len, 1);
if (*aa_string == NULL)
return ISO_OUT_OF_MEM;
memcpy(*aa_string, data->aa_string, len);
aaip_set_signature("AA", *aa_string, 0); /* libisofs.h demands so */
}
return 1;
}
@ -2538,6 +2539,10 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
/* obtain ownership of eventual AA string */
ret = iso_file_source_get_aa_string(src, &aa_string, 1);
if (ret == 1 && aa_string != NULL) {
/* >>> change field signatures to eventual libisofs non-"AA" setting */;
/* (for now everything is "AA" anyway) */
ret = iso_node_add_xinfo(new, aaip_xinfo_func, aa_string);
if (ret < 0)
return ret;

View File

@ -10,9 +10,16 @@
* Filesystem/FileSource implementation to access the local filesystem.
*/
/* ts A90116 : libisofs.h eventually defines Libisofs_with_aaiP */
#include "libisofs.h"
#include "fsource.h"
#include "util.h"
#ifdef Libisofs_with_aaiP
#include "aaip_0_2.h"
#endif
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
@ -466,8 +473,59 @@ void lfs_free(IsoFileSource *src)
iso_filesystem_unref(lfs);
}
#ifdef Libisofs_with_aaiP
/* ts A90116 */
static
int lfs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
{
unsigned int uret;
int ret;
size_t num_attrs = 0, *value_lengths = NULL, result_len;
char *path = NULL, **names = NULL, **values = NULL;
unsigned char *result = NULL;
*aa_string = NULL;
/* Obtain EAs and ACLs ("access" and "default"). ACLs encoded according
to AAIP ACL representation.
*/
path = iso_file_source_get_path(src);
ret = aaip_get_attr_list(path, &num_attrs, &names,
&value_lengths, &values, 1 | 2);
if (ret <= 0) {
ret = ISO_FILE_ERROR;
goto ex;
}
uret = aaip_encode("AA", (unsigned int) num_attrs, names,
value_lengths, values, &result_len, &result, 0);
if (uret == 0) {
ret = ISO_OUT_OF_MEM;
goto ex;
}
*aa_string = result;
ret = 1;
ex:;
if (path != NULL)
free(path);
if (names != NULL || value_lengths != NULL || values != NULL)
aaip_get_attr_list(path, &num_attrs, &names, &value_lengths, &values,
1 << 15); /* free memory */
return ret;
}
#endif /* Libisofs_with_aaiP */
IsoFileSourceIface lfs_class = {
#ifdef Libisofs_with_aaiP
1, /* version */
#else
0, /* version */
#endif
lfs_get_path,
lfs_get_name,
lfs_lstat,
@ -481,8 +539,15 @@ IsoFileSourceIface lfs_class = {
lfs_get_filesystem,
lfs_free,
lfs_lseek
#ifdef Libisofs_with_aaiP
,
lfs_get_aa_string
#endif
};
/**
*
* @return

View File

@ -681,10 +681,11 @@ struct IsoFileSource_Iface
* 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.
* Field signature will be "AA".
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
* libisofs/aaip_0_2.h for encoding and decoding.)
* The caller is responsible for finally calling free()
* on non-NULL results.
* @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).
@ -3659,10 +3660,11 @@ int iso_file_source_readlink(IsoFileSource *src, char *buf, size_t bufsiz);
* @param src The file source object to be inquired.
* @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.
* Field signature will be "AA".
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
* libisofs/aaip_0_2.h for encoding and decoding.)
* The caller is responsible for finally calling free()
* on non-NULL results.
* @param flag Bitfield for control purposes
* bit0= Transfer ownership of AA string data.
* src will free the eventual cached data and might
@ -4103,4 +4105,26 @@ void iso_stream_get_id(IsoStream *stream, unsigned int *fs_id, dev_t *dev_id,
/** Read error occured with IsoDataSource (FATAL,HIGH, -513) */
#define ISO_DATA_SOURCE_FATAL 0xF030FCFF
/* --------------------------------- AAIP --------------------------------- */
/* 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
*/
#ifdef Libisofs_with_aaiP
/**
* Function to identify and manage AA strings as xinfo of IsoNode
*/
int aaip_xinfo_func(void *data, int flag);
#endif /* Libisofs_with_aaiP */
#endif /*LIBISO_LIBISOFS_H_*/

View File

@ -7,6 +7,9 @@
* published by the Free Software Foundation. See COPYING file for details.
*/
/* ts A90116 : libisofs.h eventually defines Libisofs_with_aaiP */
#include "libisofs.h"
#include "rockridge.h"
#include "node.h"
#include "ecma119_tree.h"
@ -883,7 +886,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t space,
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
if (ret == 1) {
num_aapt = aaip_count_bytes("AA", (unsigned char *) xipt, 0);
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
}
}
@ -1353,7 +1356,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
if (ret == 1) {
num_aapt = aaip_count_bytes("AA", (unsigned char *) xipt, 0);
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
if (num_aapt > 0) {
aapt = malloc(num_aapt);
if (aapt == NULL) {

View File

@ -29,16 +29,6 @@
#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))
/**