Implemented generation of AA strings from local filesystem
and upgraded IsoFileSourceIface lfs_class to version 1
This commit is contained in:
parent
9dc56426c0
commit
d01b3cc6cc
@ -478,7 +478,7 @@ struct aaip_state {
|
|||||||
/* ------- functions ------ */
|
/* ------- 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;
|
int done = 0;
|
||||||
unsigned char *aapt;
|
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)
|
size_t aaip_sizeof_aaip_state(void)
|
||||||
{
|
{
|
||||||
return((size_t) sizeof(struct aaip_state));
|
return((size_t) sizeof(struct aaip_state));
|
||||||
|
@ -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.
|
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
|
/* Determine the size of the AA string by interpreting 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
|
@param data An arbitrary number of bytes beginning with the
|
||||||
complete chain of AA fields. Trailing trash is ignored.
|
complete chain of AA fields. Trailing trash is ignored.
|
||||||
@param flag Unused yet. Submit 0.
|
@param flag Unused yet. Submit 0.
|
||||||
@return The number of bytes of the AA field chain.
|
@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.
|
/* The AAIP decoder context.
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
* published by the Free Software Foundation. See COPYING file for details.
|
* 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 "builder.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "fsource.h"
|
#include "fsource.h"
|
||||||
@ -86,6 +89,10 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
IsoNode *new;
|
IsoNode *new;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
|
#ifdef Libisofs_with_aaiP
|
||||||
|
unsigned char *aa_string;
|
||||||
|
#endif /* Libisofs_with_aaiP */
|
||||||
|
|
||||||
if (builder == NULL || src == NULL || node == NULL) {
|
if (builder == NULL || src == NULL || node == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
@ -175,6 +182,24 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
iso_node_set_uid(new, info.st_uid);
|
iso_node_set_uid(new, info.st_uid);
|
||||||
|
|
||||||
*node = new;
|
*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;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -952,11 +952,12 @@ int ifs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
|
|||||||
*aa_string = data->aa_string;
|
*aa_string = data->aa_string;
|
||||||
data->aa_string = NULL;
|
data->aa_string = NULL;
|
||||||
} else {
|
} 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);
|
*aa_string = calloc(len, 1);
|
||||||
if (*aa_string == NULL)
|
if (*aa_string == NULL)
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
memcpy(*aa_string, data->aa_string, len);
|
memcpy(*aa_string, data->aa_string, len);
|
||||||
|
aaip_set_signature("AA", *aa_string, 0); /* libisofs.h demands so */
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -2538,6 +2539,10 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
/* obtain ownership of eventual AA string */
|
/* 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);
|
||||||
if (ret == 1 && aa_string != NULL) {
|
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);
|
ret = iso_node_add_xinfo(new, aaip_xinfo_func, aa_string);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -10,9 +10,16 @@
|
|||||||
* Filesystem/FileSource implementation to access the local filesystem.
|
* Filesystem/FileSource implementation to access the local filesystem.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* ts A90116 : libisofs.h eventually defines Libisofs_with_aaiP */
|
||||||
|
#include "libisofs.h"
|
||||||
|
|
||||||
#include "fsource.h"
|
#include "fsource.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
#ifdef Libisofs_with_aaiP
|
||||||
|
#include "aaip_0_2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -466,8 +473,59 @@ void lfs_free(IsoFileSource *src)
|
|||||||
iso_filesystem_unref(lfs);
|
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 = {
|
IsoFileSourceIface lfs_class = {
|
||||||
|
|
||||||
|
#ifdef Libisofs_with_aaiP
|
||||||
|
1, /* version */
|
||||||
|
#else
|
||||||
0, /* version */
|
0, /* version */
|
||||||
|
#endif
|
||||||
|
|
||||||
lfs_get_path,
|
lfs_get_path,
|
||||||
lfs_get_name,
|
lfs_get_name,
|
||||||
lfs_lstat,
|
lfs_lstat,
|
||||||
@ -481,8 +539,15 @@ IsoFileSourceIface lfs_class = {
|
|||||||
lfs_get_filesystem,
|
lfs_get_filesystem,
|
||||||
lfs_free,
|
lfs_free,
|
||||||
lfs_lseek
|
lfs_lseek
|
||||||
|
|
||||||
|
#ifdef Libisofs_with_aaiP
|
||||||
|
,
|
||||||
|
lfs_get_aa_string
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
|
@ -681,10 +681,11 @@ struct IsoFileSource_Iface
|
|||||||
* not be able to produce it again.
|
* not be able to produce it again.
|
||||||
* @param aa_string Returns a pointer to the AA string data. If no AA
|
* @param aa_string Returns a pointer to the AA string data. If no AA
|
||||||
* string is available, *aa_string becomes NULL.
|
* string is available, *aa_string becomes NULL.
|
||||||
* The caller is responsible for finally calling free()
|
* Field signature will be "AA".
|
||||||
* on non-NULL results.
|
|
||||||
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
|
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
|
||||||
* libisofs/aaip_0_2.h for encoding and decoding.)
|
* 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)
|
* @return 1 means success (*aa_string == NULL is possible)
|
||||||
* <0 means failure and must b a valid libisofs error code
|
* <0 means failure and must b a valid libisofs error code
|
||||||
* (e.g. ISO_FILE_ERROR if no better one can be found).
|
* (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 src The file source object to be inquired.
|
||||||
* @param aa_string Returns a pointer to the AA string data. If no AA
|
* @param aa_string Returns a pointer to the AA string data. If no AA
|
||||||
* string is available, *aa_string becomes NULL.
|
* string is available, *aa_string becomes NULL.
|
||||||
* The caller is responsible for finally calling free()
|
* Field signature will be "AA".
|
||||||
* on non-NULL results.
|
|
||||||
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
|
* (See doc/susp_aaip_0_2.txt for the meaning of AA and
|
||||||
* libisofs/aaip_0_2.h for encoding and decoding.)
|
* 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
|
* @param flag Bitfield for control purposes
|
||||||
* bit0= Transfer ownership of AA string data.
|
* bit0= Transfer ownership of AA string data.
|
||||||
* src will free the eventual cached data and might
|
* 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) */
|
/** Read error occured with IsoDataSource (FATAL,HIGH, -513) */
|
||||||
#define ISO_DATA_SOURCE_FATAL 0xF030FCFF
|
#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_*/
|
#endif /*LIBISO_LIBISOFS_H_*/
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
* published by the Free Software Foundation. See COPYING file for details.
|
* 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 "rockridge.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "ecma119_tree.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);
|
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
|
||||||
if (ret == 1) {
|
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);
|
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
|
||||||
if (ret == 1) {
|
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) {
|
if (num_aapt > 0) {
|
||||||
aapt = malloc(num_aapt);
|
aapt = malloc(num_aapt);
|
||||||
if (aapt == NULL) {
|
if (aapt == NULL) {
|
||||||
|
@ -29,16 +29,6 @@
|
|||||||
#include "ecma119.h"
|
#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))
|
#define SUSP_SIG(entry, a, b) ((entry->sig[0] == a) && (entry->sig[1] == b))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user