20 #include "../config.h"
24 #include <sys/types.h>
47 #define Aaip_TRANSLATE 0
48 #define Aaip_ACL_USER_OBJ 1
49 #define Aaip_ACL_USER 2
50 #define Aaip_ACL_GROUP_OBJ 3
51 #define Aaip_ACL_GROUP 4
52 #define Aaip_ACL_MASK 5
53 #define Aaip_ACL_OTHER 6
54 #define Aaip_SWITCH_MARK 8
55 #define Aaip_ACL_USER_N 10
56 #define Aaip_ACL_GROUP_N 12
57 #define Aaip_FUTURE_VERSION 15
59 #define Aaip_with_short_namespaceS yes
60 #define Aaip_max_named_spacE 0x06
61 #define Aaip_min_named_spacE 0x02
62 #define Aaip_maxdef_namespacE 0x1f
64 #define Aaip_namespace_literaL 0x01
65 #define Aaip_namespace_systeM 0x02
66 #define Aaip_namespace_useR 0x03
67 #define Aaip_namespace_isofS 0x04
68 #define Aaip_namespace_trusteD 0x05
69 #define Aaip_namespace_securitY 0x06
72 #define Aaip_max_name_expansioN 9
75 {
"",
"",
"system.",
"user.",
"isofs.",
"trusted.",
"security."};
81 unsigned int *num_recs,
size_t *comp_size,
82 unsigned char *result,
size_t result_fill,
101 size_t *value_lengths,
char **values,
102 size_t *result_len,
unsigned char **result,
int flag)
104 size_t mem_size= 0, comp_size;
106 unsigned int number_of_fields, i, num_recs;
111 for(i= 0; i < num_attrs; i++) {
113 &num_recs, &comp_size, NULL, (
size_t) 0, 1);
116 mem_size+= comp_size;
118 number_of_fields= mem_size / 250 + !!(mem_size % 250);
119 if(number_of_fields == 0)
121 mem_size+= number_of_fields * 5;
123 #ifdef Aaip_encode_debuG
124 *result= (
unsigned char *) calloc(1, mem_size + 1024000);
127 *result= (
unsigned char *) calloc(1, mem_size);
134 for(i= 0; i < num_attrs; i++) {
136 &num_recs, &comp_size, *result, *result_len, 0);
143 (*result_len)+= comp_size;
147 for(i= 0; i < number_of_fields; i++) {
148 (*result)[i * 255 + 0]=
'A';
149 (*result)[i * 255 + 1]=
'L';
150 if(i < number_of_fields - 1 || (mem_size % 255) == 0)
151 (*result)[i * 255 + 2]= 255;
153 (*result)[i * 255 + 2]= mem_size % 255;
154 (*result)[i * 255 + 3]= 1;
155 (*result)[i * 255 + 4]= (flag & 1) || (i < number_of_fields - 1);
157 (*result_len)+= number_of_fields * 5;
159 #ifdef Aaip_encode_debuG
160 if(*result_len != mem_size) {
161 fprintf(stderr,
"aaip_encode(): MEMORY MISMATCH BY %d BYTES\n",
162 (
int) (mem_size - *result_len));
165 hpt= malloc(*result_len);
167 memcpy(hpt, *result, *result_len);
173 for(i= 0; i < *result_len; i+= ((
unsigned char *) (*result))[i + 2])
175 if(ret != (
int) number_of_fields) {
176 fprintf(stderr,
"aaip_encode(): WRONG NUMBER OF FIELDS %d <> %d\n",
177 (
int) number_of_fields, ret);
181 return(number_of_fields);
188 result[(*result_fill / 250) * 255 + 5 + (*result_fill % 250)]= value;
194 int prefix,
char *data,
size_t l,
int flag)
197 char *rpt, *comp_start;
199 if(l == 0 && prefix <= 0) {
204 for(rpt= data; rpt - data < (ssize_t) l;) {
205 todo= l - (rpt - data) + (prefix > 0);
215 for(comp_start= rpt; rpt - comp_start < (ssize_t) todo; rpt++)
227 unsigned int *num_recs,
size_t *comp_size,
228 unsigned char *result,
size_t result_fill,
234 #ifdef Aaip_with_short_namespaceS
249 l= strlen(name) + (prefix > 0);
250 *num_recs= l / 255 + (!!(l % 255)) + (l == 0) +
251 attr_length / 255 + (!!(attr_length % 255)) + (attr_length == 0);
252 *comp_size= l + attr_length + 2 * *num_recs;
266 size_t result_size,
unsigned char *result,
int flag);
293 size_t *result_len,
unsigned char **result,
int flag)
300 (
size_t) 0, NULL, 1 | (flag & (2 | 4 | 8 | 16)));
304 return((
int) bytes - 1);
309 *result= calloc(bytes + 1, 1);
315 (flag & (2 | 4 | 8 | 16)));
319 return((
int) bytes - 1);
320 if((
size_t) bytes != *result_len) {
333 for(cpt= name; *cpt != 0; cpt++)
334 if(*cpt < '0' || *cpt >
'9')
338 sscanf(name,
"%lf", &num);
375 size_t result_size,
unsigned char *result,
int flag)
377 char *rpt, *npt, *cpt;
378 int qualifier= 0, perms, type, i, qualifier_len= 0, num_recs, needed= 0, ret;
379 unsigned int has_u= 0, has_g= 0, has_o= 0, has_m= 0, is_trivial= 1;
393 if((
size_t) count >= result_size)
394 goto result_size_overflow;
400 for(rpt= acl_text; *rpt != 0; rpt= npt) {
401 npt= strchr(rpt,
'\n');
403 npt= rpt + strlen(rpt);
408 cpt= strchr(rpt,
':');
411 cpt= strchr(cpt + 1,
':');
415 if(strncmp(rpt,
"user:", 5) == 0) {
425 "Duplicate u:: entry detected in ACL text");
431 if(cpt - (rpt + 5) >= name_size)
434 strncpy(name, rpt + 5, cpt - (rpt + 5));
435 name[cpt - (rpt + 5)]= 0;
445 "Unknown user name found in ACL text: '%s'", name);
450 uid= huid= pwd->pw_uid;
452 for(i= 0; huid != 0; i++)
455 if(qualifier_len <= 0)
457 for(i= 0; i < qualifier_len ; i++)
458 name[i]= uid >> (8 * (qualifier_len - i - 1));
461 qualifier_len= strlen(name);
462 if(qualifier_len <= 0)
467 }
else if(strncmp(rpt,
"group:", 6) == 0) {
477 "Duplicate g:: entry detected in ACL text");
483 if(cpt - (rpt + 6) >= name_size)
486 strncpy(name, rpt + 6, cpt - (rpt + 6));
487 name[cpt - (rpt + 6)]= 0;
497 "Unknown group name found in ACL text: '%s'", name);
502 gid= hgid= grp->gr_gid;
504 for(i= 0; hgid != 0; i++)
507 if(qualifier_len <= 0)
509 for(i= 0; i < qualifier_len ; i++)
510 name[i]= gid >> (8 * (qualifier_len - i - 1));
513 qualifier_len= strlen(name);
514 if(qualifier_len <= 0)
519 }
else if(strncmp(rpt,
"other:", 6) == 0) {
528 "Duplicate o:: entry detected in ACL text");
533 }
else if(strncmp(rpt,
"mask:", 5) == 0) {
544 if((
size_t) count >= result_size)
545 goto result_size_overflow;
546 result[count]= perms | ((!!qualifier) << 3) | (type << 4);
551 num_recs= (qualifier_len / 127) + !!(qualifier_len % 127);
553 if((
size_t) (count + 1) > result_size)
554 goto result_size_overflow;
555 for(i= 0; i < num_recs; i++) {
557 result[count++]= 255;
559 result[count++]= (qualifier_len % 127);
560 if(result[count - 1] == 0)
561 result[count - 1]= 127;
563 if((
size_t) (count + (result[count - 1] & 127)) > result_size)
564 goto result_size_overflow;
565 memcpy(result + count, name + i * 127, result[count - 1] & 127);
566 count+= result[count - 1] & 127;
569 count+= qualifier_len + num_recs;
574 needed= (!has_u) + (!has_g) + (!has_o) + !(is_trivial || has_m);
578 if((
size_t) (count + needed) > result_size)
579 goto result_size_overflow;
582 if ((flag & 8) && needed > 0 && !(flag & 1)) {
598 if(!(is_trivial | has_m)) {
609 result_size_overflow:;
612 "Program error: Text to ACL conversion result size overflow");
619 size_t *result_len,
unsigned char **result,
int flag)
622 size_t a_acl_len= 0, d_acl_len= 0, acl_len= 0;
623 unsigned char *a_acl= NULL, *d_acl= NULL, *acl= NULL;
625 if(a_acl_text != NULL) {
627 flag & (1 | 2 | 8 | 16));
631 if(d_acl_text != NULL) {
633 (flag & (1 | 2 | 16)) | 4);
637 if(a_acl == NULL || a_acl_len == 0) {
641 }
else if (d_acl == NULL || d_acl_len == 0) {
646 acl= calloc(a_acl_len + d_acl_len, 1);
649 memcpy(acl, a_acl, a_acl_len);
650 memcpy(acl + a_acl_len, d_acl, d_acl_len);
651 acl_len= a_acl_len + d_acl_len;
654 *result_len= acl_len;
722 char *rpt, *wpt, *npt, *cpt;
723 mode_t m, list_mode, st_mode;
724 int tag_types= 0, has_mask= 0, do_cleanout = 0;
726 list_mode= st_mode= *in_st_mode;
727 do_cleanout = !(flag & 15);
729 has_mask= strncmp(acl_text,
"mask:", 5) == 0 ||
730 strstr(acl_text,
"\nmask:") != NULL;
731 if(has_mask && (flag & 2))
734 for(npt= wpt= rpt= acl_text; *npt != 0; rpt= npt + 1) {
735 npt= strchr(rpt,
'\n');
737 npt= rpt + strlen(rpt);
738 if(strncmp(rpt,
"user:", 5) == 0) {
739 if(rpt[5] ==
':' && npt - rpt == 9) {
748 list_mode= (list_mode & ~S_IRWXU) | m;
749 if((st_mode & S_IRWXU) == (m & S_IRWXU)) {
754 cpt[0]= st_mode & S_IRUSR ?
'r' :
'-';
755 cpt[1]= st_mode & S_IWUSR ?
'w' :
'-';
756 cpt[2]= st_mode & S_IXUSR ?
'x' :
'-';
760 tag_types|= 64 | 128;
762 }
else if(strncmp(rpt,
"group:", 6) == 0) {
763 if(rpt[6] ==
':' && npt - rpt == 10 && ((flag & 16) || !has_mask)) {
773 list_mode= (list_mode & ~S_IRWXG) | m;
774 if((st_mode & S_IRWXG) == (m & S_IRWXG)) {
779 cpt[0]= st_mode & S_IRGRP ?
'r' :
'-';
780 cpt[1]= st_mode & S_IWGRP ?
'w' :
'-';
781 cpt[2]= st_mode & S_IXGRP ?
'x' :
'-';
785 if(rpt[6] ==
':' && npt - rpt == 10)
788 tag_types|= 64 | 256;
790 }
else if(strncmp(rpt,
"other::", 7) == 0 && npt - rpt == 10) {
800 list_mode= (list_mode & ~S_IRWXO) | m;
801 if((st_mode & S_IRWXO) == (m & S_IRWXO)) {
806 cpt[0]= st_mode & S_IROTH ?
'r' :
'-';
807 cpt[1]= st_mode & S_IWOTH ?
'w' :
'-';
808 cpt[2]= st_mode & S_IXOTH ?
'x' :
'-';
811 }
else if(strncmp(rpt,
"other:", 6) == 0 && npt - rpt == 9) {
814 }
else if(strncmp(rpt,
"mask::", 6) == 0 && npt - rpt == 9) {
817 tag_types|= 64 | 512;
827 list_mode= (list_mode & ~S_IRWXG) | m;
829 cpt[0]= st_mode & S_IRGRP ?
'r' :
'-';
830 cpt[1]= st_mode & S_IWGRP ?
'w' :
'-';
831 cpt[2]= st_mode & S_IXGRP ?
'x' :
'-';
834 }
else if(strncmp(rpt,
"mask:", 5) == 0 && npt - rpt == 8) {
837 }
else if(*rpt != 0) {
847 memmove(wpt, rpt, 1 + npt - rpt);
853 else if(*(wpt - 1) != 0)
858 *in_st_mode= list_mode;
871 if(!(tag_types & (4 | 32))) {
872 wpt= acl_text + strlen(acl_text);
873 sprintf(wpt,
"user::%c%c%c\n",
874 st_mode & S_IRUSR ?
'r' :
'-',
875 st_mode & S_IWUSR ?
'w' :
'-',
876 st_mode & S_IXUSR ?
'x' :
'-');
878 if(!(tag_types & (2 | 16 | 1024))) {
879 wpt= acl_text + strlen(acl_text);
880 sprintf(wpt,
"group::%c%c%c\n",
881 st_mode & S_IRGRP ?
'r' :
'-',
882 st_mode & S_IWGRP ?
'w' :
'-',
883 st_mode & S_IXGRP ?
'x' :
'-');
885 if(!(tag_types & (1 | 8))) {
886 wpt= acl_text + strlen(acl_text);
887 sprintf(wpt,
"other::%c%c%c\n",
888 st_mode & S_IROTH ?
'r' :
'-',
889 st_mode & S_IWOTH ?
'w' :
'-',
890 st_mode & S_IXOTH ?
'x' :
'-');
892 if((tag_types & (128 | 256)) && !(tag_types & 512)) {
893 wpt= acl_text + strlen(acl_text);
894 sprintf(wpt,
"mask::%c%c%c\n",
895 st_mode & S_IRGRP ?
'r' :
'-',
896 st_mode & S_IWGRP ?
'w' :
'-',
897 st_mode & S_IXGRP ?
'x' :
'-');
908 #define Aaip_buffer_sizE 4096
913 #define Aaip_buffer_reservE (257 + 3 * 2)
971 for(aapt= data; !done; aapt += aapt[2])
972 done = !(aapt[4] & 1);
973 return((
size_t) (aapt - data));
1024 #define Aaip_with_ring_buffeR yes
1026 #ifdef Aaip_with_ring_buffeR
1041 unsigned char **start_pt,
size_t *at_start_pt,
1042 size_t *at_recs,
int flag)
1051 *start_pt= aaip->
recs + (idx - ahead);
1054 *at_start_pt= ahead;
1055 *at_recs= todo - ahead;
1069 size_t todo,
int flag)
1071 unsigned char *start_pt;
1072 size_t at_start_pt, at_recs;
1075 &start_pt, &at_start_pt, &at_recs, 0);
1077 memcpy(start_pt, data, at_start_pt);
1079 memcpy(aaip->
recs, data + at_start_pt, at_recs);
1088 unsigned char *data,
size_t num_data,
int flag)
1090 unsigned char *start_pt;
1091 size_t at_start_pt, at_recs;
1094 &start_pt, &at_start_pt, &at_recs, 0);
1096 memcpy(data, start_pt, at_start_pt);
1098 memcpy(data + at_start_pt, aaip->
recs, at_recs);
1104 unsigned char data,
int flag)
1106 unsigned char *start_pt;
1107 size_t at_start_pt, at_recs;
1110 &start_pt, &at_start_pt, &at_recs, 0);
1118 unsigned char *start_pt;
1119 size_t at_start_pt, at_recs;
1122 &start_pt, &at_start_pt, &at_recs, 0);
1123 return((
int) *start_pt);
1130 unsigned char *start_pt;
1131 size_t at_start_pt, at_recs;
1133 if(todo < aaip->recs_fill) {
1134 ret=
aaip_ring_adr(aaip, 0, todo, &start_pt, &at_start_pt, &at_recs, 0);
1159 size_t todo,
int flag)
1170 unsigned char *data,
size_t num_data,
int flag)
1172 memcpy(data, aaip->
recs + idx, num_data);
1178 unsigned char data,
int flag)
1180 aaip->
recs[idx]= data;
1187 return((
int) aaip->
recs[idx]);
1193 if(todo < aaip->recs_fill)
1209 unsigned char **data,
size_t *num_data,
int flag)
1233 unsigned char **data,
size_t *num_data,
int flag)
1266 unsigned char **data,
size_t *num_data,
int flag)
1269 unsigned char aa_head[5];
1278 if(aa_head[0] !=
'A' || (aa_head[1] !=
'L' && aa_head[1] !=
'A') ||
1282 aaip->
aa_ends= !(aa_head[4] & 1);
1296 unsigned char **data,
size_t *num_data,
int flag)
1299 static unsigned char zero_char[2]= {0, 0};
1301 while(*num_data > 0 && aaip->
aa_missing > 0) {
1319 for(i= 0; (int) i < aaip->rec_missing; i++)
1372 unsigned char *data,
size_t num_data,
1373 size_t *ready_bytes,
int flag)
1376 unsigned char *in_data;
1386 while(num_data > 0) {
1390 *ready_bytes= data - in_data;
1433 char *result,
size_t result_size,
size_t *num_result,
1436 int ret= -1, complete= 0, payload;
1437 unsigned int i, num_bytes= 0, h;
1444 for(i= 0; i < aaip->
num_recs && !complete; i++) {
1447 if(num_bytes + payload > result_size)
1451 *num_result= num_bytes + payload;
1453 num_bytes+= payload;
1528 char *name,
size_t name_size,
size_t *name_fill,
1529 char *value,
size_t value_size,
size_t *value_fill,
1538 wpt= name + *name_fill;
1539 size= name_size - *name_fill;
1541 wpt= value + *value_fill;
1542 size= value_size - *value_fill;
1549 *name_fill= *value_fill= 0;
1553 }
else if(ret == -1) {
1555 }
else if(ret == 0) {
1559 if(ret == 2 || ret == 3) {
1562 value, value_size, value_fill, flag);
1566 }
else if(ret == 1) {
1568 }
else if(ret == 2) {
1569 (*value_fill)+= num;
1577 }
else if(ret == 3) {
1579 (*value_fill)+= num;
1616 unsigned char *data,
size_t num_data,
size_t *consumed,
1617 char *name,
size_t name_size,
size_t *name_fill,
1618 char *value,
size_t value_size,
size_t *value_fill,
1622 size_t ready_bytes= 0;
1624 #ifdef Aaip_with_short_namespaceS
1641 *name_fill= *value_fill= 0;
1654 *consumed= ready_bytes;
1656 }
else if(ret == 0) { ;
1659 }
else if(ret == 1) {
1661 }
else if(ret == 2) {
1663 }
else if(ret == 3) {
1665 }
else if(ret == 4) {
1670 *consumed= num_data;
1672 name_fill, value, value_size, value_fill, flag & 1);
1674 if(ret >= 2 && ret <= 4)
1681 #ifdef Aaip_with_short_namespaceS
1683 if(ret >= 2 && ret <= 4 && *name_fill > 0) {
1691 memmove(name, name + 1, nl - 1);
1702 memmove(name + pl, name + 1, nl - 1);
1703 memcpy(name, prefix, pl);
1704 *name_fill= pl + nl - 1;
1725 #define Aaip_initial_name_leN 256
1726 #define Aaip_initial_value_leN 256
1727 #define Aaip_initial_list_sizE 2
1728 #define Aaip_list_enlargeR 1.5
1736 size_t item_size,
char **buf,
size_t *buf_size,
int flag)
1742 if(aaip->
list_mem_used + (new_size - *buf_size) * item_size >= memory_limit)
1745 new_buf= realloc(*buf, new_size * item_size);
1750 *buf_size= new_size;
1786 size_t memory_limit,
size_t num_attr_limit,
1787 unsigned char *data,
size_t num_data,
size_t *consumed,
1792 size_t h_num, *h_lengths, i, new_mem, pair_consumed= 0;
1793 char **h_names, **h_values, *hpt;
1796 if(flag & (1 << 15)) {
1804 if((*handle)->name_buf != NULL)
1805 free((*handle)->name_buf);
1806 if((*handle)->value_buf != NULL)
1807 free((*handle)->value_buf);
1808 free((
char *) *handle);
1814 if(aaip == NULL || (flag & 1)) {
1815 aaip= *handle= calloc(1,
sizeof(
struct aaip_state));
1824 if(num_attr_limit > 0 && num_attr_limit < aaip->
list_size)
1826 new_mem= aaip->
list_size * (2*
sizeof(
char *) +
sizeof(
size_t)) +
1866 *consumed+= pair_consumed;
1878 }
else if(ret == -1) {
1879 if(pair_consumed <= 0)
1882 }
else if(ret < 0) {
1885 }
else if(ret == 0) {
1888 }
else if(ret == 1) {
1892 }
else if(ret == 2 || ret == 3 || ret == 4) {
1972 char ***names,
size_t **value_lengths,
char ***values,
1979 if(flag & (1 << 15)) {
1980 if(*names != NULL) {
1981 for(i= 0; i < *num_attrs; i++) {
1982 if((*names)[i] != NULL)
1989 if(*values != NULL) {
1990 for(i= 0; i < *num_attrs; i++) {
1991 if((*values)[i] != NULL)
1998 if(*value_lengths != NULL)
1999 free(*value_lengths);
2000 *value_lengths= NULL;
2029 char *tag_type,
char *qualifier,
2030 char *permissions,
int flag)
2032 size_t needed, tag_len, perm_len, qualifier_len;
2034 tag_len= strlen(tag_type);
2035 qualifier_len= strlen(qualifier);
2036 perm_len= strlen(permissions);
2037 needed= tag_len + qualifier_len + perm_len + 3;
2039 (*result_size)+= needed;
2042 if(needed + 1 > *result_size)
2044 memcpy((*result), tag_type, tag_len);
2045 (*result)[tag_len]=
':';
2046 memcpy((*result) + tag_len + 1, qualifier, qualifier_len);
2047 (*result)[tag_len + 1 + qualifier_len]=
':';
2048 memcpy((*result) + tag_len + 1 + qualifier_len + 1, permissions, perm_len);
2049 (*result)[tag_len + 1 + qualifier_len + 1 + perm_len]=
'\n';
2050 (*result)[tag_len + 1 + qualifier_len + 1 + perm_len + 1] = 0;
2052 (*result_size)-= needed;
2058 char *name,
size_t name_size,
size_t *name_fill,
2066 for(rpt= data; !is_done; rpt+= rec_len) {
2067 rec_len= (*rpt) & 127;
2068 is_done= !((*rpt) & 128);
2069 if(*name_fill + rec_len >= name_size ||
2070 (
size_t) (rpt + 1 + rec_len - data) > num_data)
2072 memcpy(name + *name_fill, rpt + 1, rec_len);
2074 (*name_fill)+= rec_len;
2075 name[*name_fill]= 0;
2104 char *acl_text,
size_t acl_text_size,
2105 size_t *acl_text_fill,
int flag)
2108 char perm_text[4], *wpt, *name= NULL;
2109 int type, qualifier= 0, perm, ret, cnt, name_size= 1024;
2110 size_t w_size= 0, name_fill= 0, i;
2120 w_size= acl_text_size;
2122 for(rpt= data; (size_t) (rpt - data) < num_data; ) {
2124 strcpy(perm_text,
"---");
2134 {ret = -3;
goto ex;}
2136 qualifier= !!((*rpt) & 8);
2139 name, name_size, &name_fill, 0);
2141 {ret = -1;
goto ex;}
2145 (*consumed)+= 1 + (qualifier ? name_fill + 1 : 0);
2146 rpt+= 1 + (qualifier ? name_fill + 1 : 0);
2177 for(i= 0; i < name_fill; i++)
2178 uid= (uid << 8) | ((
unsigned char *) name)[i];
2181 sprintf(name,
"%.f", (
double) uid);
2182 else if(strlen(pwd->pw_name) >= (
size_t) name_size)
2183 sprintf(name,
"%.f", (
double) uid);
2185 strcpy(name, pwd->pw_name);
2191 for(i= 0; i < name_fill; i++)
2192 gid= (gid << 8) | ((
unsigned char *) name)[i];
2195 sprintf(name,
"%.f", (
double) gid);
2196 else if(strlen(grp->gr_name) >= (
size_t) name_size)
2197 sprintf(name,
"%.f", (
double) gid);
2199 strcpy(name, grp->gr_name);
2204 {ret = -4;
goto ex;}
2207 {ret = -2;
goto ex;}
2211 *acl_text_fill= w_size;
2222 #ifdef Libisofs_use_os_dummY
2232 #ifdef __FreeBSD_kernel__
2235 #ifdef Libisofs_with_aaip_xattR
static int aaip_make_aaip_perms(int r, int w, int x)
#define Aaip_ACL_USER_OBJ
static int aaip_read_qualifier(unsigned char *data, size_t num_data, char *name, size_t name_size, size_t *name_fill, int flag)
static int aaip_read_from_recs(struct aaip_state *aaip, size_t idx, unsigned char *data, size_t num_data, int flag)
#define Aaip_buffer_reservE
ssize_t aaip_encode(size_t num_attrs, char **names, size_t *value_lengths, char **values, size_t *result_len, unsigned char **result, int flag)
#define Aaip_ACL_GROUP_OBJ
static int aaip_advance_pair(struct aaip_state *aaip, char *name, size_t name_size, size_t *name_fill, char *value, size_t value_size, size_t *value_fill, int flag)
static int aaip_enlarge_buf(struct aaip_state *aaip, size_t memory_limit, size_t item_size, char **buf, size_t *buf_size, int flag)
#define Aaip_initial_list_sizE
static int aaip_shift_recs(struct aaip_state *aaip, size_t todo, int flag)
int aaip_init_aaip_state(struct aaip_state *aaip, int flag)
#define Aaip_namespace_trusteD
#define Aaip_list_enlargeR
static int aaip_consume_rec_data(struct aaip_state *aaip, unsigned char **data, size_t *num_data, int flag)
unsigned int aaip_get_pairs_skipped(struct aaip_state *aaip, int flag)
#define Aaip_max_named_spacE
int aaip_add_acl_st_mode(char *acl_text, mode_t st_mode, int flag)
#define Aaip_namespace_systeM
int aaip_submit_data(struct aaip_state *aaip, unsigned char *data, size_t num_data, size_t *ready_bytes, int flag)
static void aaip_encode_byte(unsigned char *result, size_t *result_fill, unsigned char value)
size_t aaip_count_bytes(unsigned char *data, int flag)
static int aaip_encode_comp(unsigned char *result, size_t *result_fill, int prefix, char *data, size_t l, int flag)
static int aaip_get_buffer_byte(struct aaip_state *aaip, size_t idx, int flag)
static int aaip_push_to_recs(struct aaip_state *aaip, unsigned char *data, size_t todo, int flag)
int aaip_get_decoded_attrs(struct aaip_state **handle, size_t *num_attrs, char ***names, size_t **value_lengths, char ***values, int flag)
int aaip_encode_acl(char *acl_text, mode_t st_mode, size_t *result_len, unsigned char **result, int flag)
int aaip_decode_pair(struct aaip_state *aaip, unsigned char *data, size_t num_data, size_t *consumed, char *name, size_t name_size, size_t *name_fill, char *value, size_t value_size, size_t *value_fill, int flag)
int aaip_cleanout_st_mode(char *acl_text, mode_t *in_st_mode, int flag)
static int aaip_ring_adr(struct aaip_state *aaip, size_t idx, size_t todo, unsigned char **start_pt, size_t *at_start_pt, size_t *at_recs, int flag)
size_t aaip_sizeof_aaip_state(void)
static double aaip_numeric_id(char *name, int flag)
#define Aaip_namespace_securitY
int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed, char *acl_text, size_t acl_text_size, size_t *acl_text_fill, int flag)
int aaip_decode_attrs(struct aaip_state **handle, size_t memory_limit, size_t num_attr_limit, unsigned char *data, size_t num_data, size_t *consumed, int flag)
#define Aaip_min_named_spacE
static char Aaip_namespace_textS[][9+1]
static int aaip_consume_rec_head(struct aaip_state *aaip, unsigned char **data, size_t *num_data, int flag)
#define Aaip_max_name_expansioN
static int aaip_consume_aa_head(struct aaip_state *aaip, unsigned char **data, size_t *num_data, int flag)
static int aaip_set_buffer_byte(struct aaip_state *aaip, size_t idx, unsigned char data, int flag)
#define Aaip_namespace_isofS
#define Aaip_initial_value_leN
int aaip_skip_component(struct aaip_state *aaip, int flag)
#define Aaip_initial_name_leN
#define Aaip_FUTURE_VERSION
#define Aaip_namespace_literaL
static int aaip_encode_pair(char *name, size_t attr_length, char *attr, unsigned int *num_recs, size_t *comp_size, unsigned char *result, size_t result_fill, int flag)
#define Aaip_maxdef_namespacE
int aaip_encode_both_acl(char *a_acl_text, char *d_acl_text, mode_t st_mode, size_t *result_len, unsigned char **result, int flag)
int aaip_fetch_data(struct aaip_state *aaip, char *result, size_t result_size, size_t *num_result, int flag)
#define Aaip_namespace_useR
static ssize_t aaip_encode_acl_text(char *acl_text, mode_t st_mode, size_t result_size, unsigned char *result, int flag)
static int aaip_write_acl_line(char **result, size_t *result_size, char *tag_type, char *qualifier, char *permissions, int flag)
static int aaip_consume_aa_data(struct aaip_state *aaip, unsigned char **data, size_t *num_data, int flag)
#define LIBISO_FREE_MEM(pt)
#define LIBISO_ALLOC_MEM(pt, typ, count)
#define ISO_AAIP_BAD_ACL_TEXT
#define ISO_AAIP_ACL_MULT_OBJ
#define ISO_ASSERT_FAILURE
int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt,...)
unsigned int num_components
size_t * list_value_lengths
unsigned char * recs_start
unsigned char recs[4096+(257+3 *2)]
unsigned int pairs_skipped