Introduced into AAIP a short notation for name spaces "system.", "user.",
and "isofs.".
This commit is contained in:
parent
2633aab967
commit
699866f984
@ -3,7 +3,7 @@
|
|||||||
Arbitrary Attribute Interchange Protocol
|
Arbitrary Attribute Interchange Protocol
|
||||||
|
|
||||||
Draft version 0.2
|
Draft version 0.2
|
||||||
Jan 30 2008
|
Feb 10 2009
|
||||||
|
|
||||||
Interchange of Persistent File Attributes
|
Interchange of Persistent File Attributes
|
||||||
|
|
||||||
@ -46,11 +46,12 @@ The reader shall be prepared to detect and handle oversized data.
|
|||||||
One or more AA entries form the Attribute List of a file object with
|
One or more AA entries form the Attribute List of a file object with
|
||||||
an even number of components. Each two consequtive components form a pair of
|
an even number of components. Each two consequtive components form a pair of
|
||||||
Name and Value.
|
Name and Value.
|
||||||
Names which do not contain a perisod character "." are reserved for
|
|
||||||
registration at libburnia.org. The meaning of any other names is not
|
The empty name indicates that the value is a compact representation of ACLs.
|
||||||
specified by this document.
|
|
||||||
For now only one name is registered:
|
Names must not contain byte value 0x00. Names which begin by bytes 0x01 to 0x1f
|
||||||
The empty name indicates that the value is a compact representation of ALCs.
|
represent names in particular name spaces. See below: Name Spaces.
|
||||||
|
The meaning of any other names or name parts is not specified by this document.
|
||||||
|
|
||||||
All AA entries except the last one shall have the CONTINUE flag set. An AA
|
All AA entries except the last one shall have the CONTINUE flag set. An AA
|
||||||
entry with CONTINUE set to 0 indicates the end of the Attribute List.
|
entry with CONTINUE set to 0 indicates the end of the Attribute List.
|
||||||
@ -136,6 +137,50 @@ Example: Two pairs of "name"="long...content" and "one"="more" encoded as
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Name Spaces
|
||||||
|
|
||||||
|
AAIP provides a short notation for namespaces which uses a single non-printable
|
||||||
|
byte at the start of the name.
|
||||||
|
Reserved start bytes of names are
|
||||||
|
0x01 to 0x1F
|
||||||
|
|
||||||
|
The names of extended file attributes are traditionally organized in name
|
||||||
|
spaces, which get expressed as first part of an attribute name up to a
|
||||||
|
period "." character. It is also tradition that names are printable text,
|
||||||
|
single words and especially contain no 0-bytes.
|
||||||
|
|
||||||
|
AAIP does not enforce the use of any name space but it urges that names in the
|
||||||
|
following registered name spaces are used according to traditions.
|
||||||
|
|
||||||
|
The name spaces "system." and "user." are available with many file system
|
||||||
|
types. "system." is file system dependent and often restricted in the
|
||||||
|
choice of names. "user." is portable and allows to choose about any name.
|
||||||
|
|
||||||
|
Name space "isofs." is defined for internal use of AAIP enhanced ISO 9660
|
||||||
|
file systems. Names in this name space should be registered at libburnia.org.
|
||||||
|
|
||||||
|
Further name spaces may be registered at libburnia.org.
|
||||||
|
|
||||||
|
The reserved start bytes of names have the following meaning
|
||||||
|
0x01 escape reserved character at start of name
|
||||||
|
0x02 namespace "system."
|
||||||
|
0x03 namespace "user."
|
||||||
|
0x04 namespace "isofs."
|
||||||
|
0x05 to 0x1F shall not be used yet.
|
||||||
|
If encountered then they map to name space "user." and the name gets
|
||||||
|
prefixed "aaipXY_" with XY being two hex digits [0-9A-F] describing
|
||||||
|
the encountered short indicator value.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
Name "user.abc"
|
||||||
|
0, 4, 0x03, 'a', 'b', 'c'
|
||||||
|
Name "\003abc" (if really desired)
|
||||||
|
0, 5, 0x01, 0x03, 'a', 'b', 'c'
|
||||||
|
Default mapping of AAIP name component record {0, 4, 0x0f, 'a', 'b', 'c'}
|
||||||
|
"user.aaip0F_abc"
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
Specification of binary ACL representation as special Arbitrary Attribute
|
Specification of binary ACL representation as special Arbitrary Attribute
|
||||||
|
|
||||||
The Name component of a binary ACL shall be of length 0.
|
The Name component of a binary ACL shall be of length 0.
|
||||||
@ -345,6 +390,10 @@ Revoked drafts:
|
|||||||
There was a draft AAIP 0.0 with ER signature "AAIP_2008A". It did not resemble
|
There was a draft AAIP 0.0 with ER signature "AAIP_2008A". It did not resemble
|
||||||
the existing entry SL and therefore shall not be used by writers of ISO images.
|
the existing entry SL and therefore shall not be used by writers of ISO images.
|
||||||
|
|
||||||
|
AAIP 0.2 once allowed to announce and use a different signature than "AA".
|
||||||
|
This has been revoked because ES entries serve the purpose to distinguish
|
||||||
|
AAIP entries from eventual "AA" entries of any other extension.
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
References:
|
References:
|
||||||
|
|
||||||
@ -361,17 +410,3 @@ Pending considerations:
|
|||||||
- shall the tag types ACL_USER and ACL_GROUP with non-numeric qualifier be
|
- shall the tag types ACL_USER and ACL_GROUP with non-numeric qualifier be
|
||||||
revoked ?
|
revoked ?
|
||||||
|
|
||||||
- define short indicators for namespaces "user" and "system".
|
|
||||||
Idea:
|
|
||||||
Reserved start bytes of name
|
|
||||||
0x00 to 0x1F
|
|
||||||
have a meaning
|
|
||||||
0x00 builtin ACL
|
|
||||||
0x01 escape reserved character at start of name
|
|
||||||
0x02 namespace "system"
|
|
||||||
0x03 namespace "user"
|
|
||||||
0x04 namespace "libisofs"
|
|
||||||
0x05 to 0x1F shall not be used yet. If encountered then they map to name
|
|
||||||
space "user" and the name gets prefixed "aaipXY_" with XY being two hex
|
|
||||||
digits describint the encountered short indicator value.
|
|
||||||
|
|
||||||
|
@ -41,6 +41,21 @@
|
|||||||
#define Aaip_ACL_GROUP_N 12
|
#define Aaip_ACL_GROUP_N 12
|
||||||
#define Aaip_FUTURE_VERSION 15
|
#define Aaip_FUTURE_VERSION 15
|
||||||
|
|
||||||
|
#define Aaip_with_short_namespaceS yes
|
||||||
|
#define Aaip_max_named_spacE 0x04
|
||||||
|
#define Aaip_min_named_spacE 0x02
|
||||||
|
#define Aaip_maxdef_namespacE 0x1f
|
||||||
|
|
||||||
|
#define Aaip_namespace_literaL 0x01
|
||||||
|
#define Aaip_namespace_systeM 0x02
|
||||||
|
#define Aaip_namespace_useR 0x03
|
||||||
|
#define Aaip_namespace_isofS 0x04
|
||||||
|
|
||||||
|
static char Aaip_namespace_textS[][8]= {"", "", "system.", "user.", "isofs."};
|
||||||
|
|
||||||
|
/* maximum expansion: "user.aaipXY_" */
|
||||||
|
#define Aaip_max_name_expansioN 12
|
||||||
|
|
||||||
/* --------------------------------- Encoder ---------------------------- */
|
/* --------------------------------- Encoder ---------------------------- */
|
||||||
|
|
||||||
|
|
||||||
@ -151,22 +166,27 @@ static void aaip_encode_byte(unsigned char *result, size_t *result_fill,
|
|||||||
|
|
||||||
|
|
||||||
static int aaip_encode_comp(unsigned char *result, size_t *result_fill,
|
static int aaip_encode_comp(unsigned char *result, size_t *result_fill,
|
||||||
char *data, size_t l, int flag)
|
int prefix, char *data, size_t l, int flag)
|
||||||
{
|
{
|
||||||
size_t todo;
|
size_t todo;
|
||||||
char *rpt, *comp_start;
|
char *rpt, *comp_start;
|
||||||
|
|
||||||
if(l == 0) {
|
if(l == 0 && prefix <= 0) {
|
||||||
aaip_encode_byte(result, result_fill, 0);
|
aaip_encode_byte(result, result_fill, 0);
|
||||||
aaip_encode_byte(result, result_fill, 0);
|
aaip_encode_byte(result, result_fill, 0);
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
for(rpt= data; rpt - data < l;) {
|
for(rpt= data; rpt - data < l;) {
|
||||||
todo= l - (rpt - data);
|
todo= l - (rpt - data) + (prefix > 0);
|
||||||
aaip_encode_byte(result, result_fill, (todo > 255));
|
aaip_encode_byte(result, result_fill, (todo > 255));
|
||||||
if(todo > 255)
|
if(todo > 255)
|
||||||
todo= 255;
|
todo= 255;
|
||||||
aaip_encode_byte(result, result_fill, todo);
|
aaip_encode_byte(result, result_fill, todo);
|
||||||
|
if(prefix > 0) {
|
||||||
|
aaip_encode_byte(result, result_fill, prefix);
|
||||||
|
todo--;
|
||||||
|
prefix= 0;
|
||||||
|
}
|
||||||
for(comp_start= rpt; rpt - comp_start < todo; rpt++)
|
for(comp_start= rpt; rpt - comp_start < todo; rpt++)
|
||||||
aaip_encode_byte(result, result_fill, *((unsigned char *) rpt));
|
aaip_encode_byte(result, result_fill, *((unsigned char *) rpt));
|
||||||
}
|
}
|
||||||
@ -184,8 +204,24 @@ static int aaip_encode_pair(char *name, size_t attr_length, char *attr,
|
|||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
size_t l;
|
size_t l;
|
||||||
|
int i, prefix= 0;
|
||||||
|
|
||||||
l= strlen(name);
|
#ifdef Aaip_with_short_namespaceS
|
||||||
|
|
||||||
|
/* translate name into eventual short form */
|
||||||
|
for(i= Aaip_min_named_spacE; i <= Aaip_max_named_spacE; i++)
|
||||||
|
if(strncmp(name, Aaip_namespace_textS[i], strlen(Aaip_namespace_textS[i]))
|
||||||
|
== 0) {
|
||||||
|
name+= strlen(Aaip_namespace_textS[i]);
|
||||||
|
prefix= i;
|
||||||
|
}
|
||||||
|
/* Eventually prepend escape marker for strange names */
|
||||||
|
if(prefix <= 0 && name[0] > 0 && name[0] <= Aaip_maxdef_namespacE)
|
||||||
|
prefix= Aaip_namespace_literaL;
|
||||||
|
|
||||||
|
#endif /* Aaip_with_short_namespaceS */
|
||||||
|
|
||||||
|
l= strlen(name) + (prefix > 0);
|
||||||
*num_recs= l / 255 + (!!(l % 255)) + (l == 0) +
|
*num_recs= l / 255 + (!!(l % 255)) + (l == 0) +
|
||||||
attr_length / 255 + (!!(attr_length % 255)) + (attr_length == 0);
|
attr_length / 255 + (!!(attr_length % 255)) + (attr_length == 0);
|
||||||
*comp_size= l + attr_length + 2 * *num_recs;
|
*comp_size= l + attr_length + 2 * *num_recs;
|
||||||
@ -193,8 +229,8 @@ static int aaip_encode_pair(char *name, size_t attr_length, char *attr,
|
|||||||
if(flag & 1)
|
if(flag & 1)
|
||||||
return(1);
|
return(1);
|
||||||
|
|
||||||
aaip_encode_comp(result, &result_fill, name, l, 0);
|
aaip_encode_comp(result, &result_fill, prefix, name, l - (prefix > 0), 0);
|
||||||
aaip_encode_comp(result, &result_fill, attr, attr_length, 0);
|
aaip_encode_comp(result, &result_fill, 0, attr, attr_length, 0);
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1482,6 +1518,11 @@ int aaip_decode_pair(struct aaip_state *aaip,
|
|||||||
int ret;
|
int ret;
|
||||||
size_t ready_bytes;
|
size_t ready_bytes;
|
||||||
|
|
||||||
|
#ifdef Aaip_with_short_namespaceS
|
||||||
|
char prefix[Aaip_max_name_expansioN + 1];
|
||||||
|
size_t nl, pl;
|
||||||
|
#endif
|
||||||
|
|
||||||
*consumed= 0;
|
*consumed= 0;
|
||||||
if((aaip->pair_status < 0 && aaip->pair_status != -2) ||
|
if((aaip->pair_status < 0 && aaip->pair_status != -2) ||
|
||||||
aaip->pair_status == 4 ||
|
aaip->pair_status == 4 ||
|
||||||
@ -1524,8 +1565,8 @@ int aaip_decode_pair(struct aaip_state *aaip,
|
|||||||
{ret= -1; goto ex;} /* unknown reply from aaip_submit_data() */
|
{ret= -1; goto ex;} /* unknown reply from aaip_submit_data() */
|
||||||
|
|
||||||
*consumed= num_data;
|
*consumed= num_data;
|
||||||
ret= aaip_advance_pair(aaip, name, name_size, name_fill,
|
ret= aaip_advance_pair(aaip, name, name_size - Aaip_max_name_expansioN,
|
||||||
value, value_size, value_fill, flag & 1);
|
name_fill, value, value_size, value_fill, flag & 1);
|
||||||
if(aaip->aa_ends == 3) {
|
if(aaip->aa_ends == 3) {
|
||||||
if(ret >= 2 && ret <= 4)
|
if(ret >= 2 && ret <= 4)
|
||||||
ret= 4;
|
ret= 4;
|
||||||
@ -1533,6 +1574,38 @@ int aaip_decode_pair(struct aaip_state *aaip,
|
|||||||
ret= 5;
|
ret= 5;
|
||||||
}
|
}
|
||||||
ex:;
|
ex:;
|
||||||
|
|
||||||
|
#ifdef Aaip_with_short_namespaceS
|
||||||
|
|
||||||
|
if(ret >= 2 && ret <= 4 && *name_fill > 0) {
|
||||||
|
/* Translate name from eventual short form */
|
||||||
|
nl= *name_fill;
|
||||||
|
if(name[0] > 0 && name[0] <= Aaip_maxdef_namespacE) {
|
||||||
|
prefix[0]= 0;
|
||||||
|
if(name[0] == Aaip_namespace_literaL) {
|
||||||
|
if(nl > 1) {
|
||||||
|
/* Remove first character of name */
|
||||||
|
memmove(name, name + 1, nl - 1);
|
||||||
|
(*name_fill)--;
|
||||||
|
}
|
||||||
|
} else if(name[0] == Aaip_namespace_systeM ||
|
||||||
|
name[0] == Aaip_namespace_useR ||
|
||||||
|
name[0] == Aaip_namespace_isofS) {
|
||||||
|
strcpy(prefix, Aaip_namespace_textS[(int) name[0]]);
|
||||||
|
} else {
|
||||||
|
sprintf(prefix, "user.aaip%2.2X_", (unsigned int) name[0]);
|
||||||
|
}
|
||||||
|
pl= strlen(prefix);
|
||||||
|
if(pl > 0) {
|
||||||
|
memmove(name + pl, name + 1, nl - 1);
|
||||||
|
memcpy(name, prefix, pl);
|
||||||
|
*name_fill= pl + nl - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Aaip_with_short_namespaceS */
|
||||||
|
|
||||||
aaip->pair_status= ret;
|
aaip->pair_status= ret;
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user