version 1.7, 2018/07/01 20:03:48 |
version 1.8, 2018/07/03 18:49:10 |
|
|
va_list ap; |
va_list ap; |
int *d, level = -1; |
int *d, level = -1; |
unsigned long *t; |
unsigned long *t; |
long long *i; |
long long *i, l; |
void **ptr; |
void **ptr; |
size_t *len, ret = 0, n = strlen(fmt); |
size_t *len, ret = 0, n = strlen(fmt); |
char **s; |
char **s; |
|
off_t *pos; |
struct ber_oid *o; |
struct ber_oid *o; |
struct ber_element *parent[_MAX_SEQ], **e; |
struct ber_element *parent[_MAX_SEQ], **e; |
|
|
|
|
goto fail; |
goto fail; |
ret++; |
ret++; |
break; |
break; |
|
case 'd': |
|
d = va_arg(ap, int *); |
|
if (ber_get_integer(ber, &l) == -1) |
|
goto fail; |
|
*d = l; |
|
ret++; |
|
break; |
case 'e': |
case 'e': |
e = va_arg(ap, struct ber_element **); |
e = va_arg(ap, struct ber_element **); |
*e = ber; |
*e = ber; |
|
|
goto fail; |
goto fail; |
ret++; |
ret++; |
break; |
break; |
|
case 'p': |
|
pos = va_arg(ap, off_t *); |
|
*pos = ber_getpos(ber); |
|
ret++; |
|
continue; |
case '{': |
case '{': |
case '(': |
case '(': |
if (ber->be_encoding != BER_TYPE_SEQUENCE && |
if (ber->be_encoding != BER_TYPE_SEQUENCE && |
|
|
return root; |
return root; |
} |
} |
|
|
|
off_t |
|
ber_getpos(struct ber_element *elm) |
|
{ |
|
return elm->be_offs; |
|
} |
|
|
void |
void |
ber_free_element(struct ber_element *root) |
ber_free_element(struct ber_element *root) |
{ |
{ |
|
|
uint8_t u; |
uint8_t u; |
|
|
ber_dump_header(ber, root); |
ber_dump_header(ber, root); |
|
if (root->be_cb) |
|
root->be_cb(root->be_cbarg, ber->br_wptr - ber->br_wbuf); |
|
|
switch (root->be_encoding) { |
switch (root->be_encoding) { |
case BER_TYPE_BOOLEAN: |
case BER_TYPE_BOOLEAN: |
|
|
|
|
elm->be_type = type; |
elm->be_type = type; |
elm->be_len = len; |
elm->be_len = len; |
|
elm->be_offs = ber->br_offs; /* element position within stream */ |
elm->be_class = class; |
elm->be_class = class; |
|
|
if (elm->be_encoding == 0) { |
if (elm->be_encoding == 0) { |
|
|
} |
} |
|
|
void |
void |
|
ber_set_writecallback(struct ber_element *elm, void (*cb)(void *, size_t), |
|
void *arg) |
|
{ |
|
elm->be_cb = cb; |
|
elm->be_cbarg = arg; |
|
} |
|
|
|
|
|
void |
ber_free(struct ber *b) |
ber_free(struct ber *b) |
{ |
{ |
free(b->br_wbuf); |
free(b->br_wbuf); |
|
|
b += r; |
b += r; |
remain -= r; |
remain -= r; |
} |
} |
return (b - (u_char *)buf); |
r = b - (u_char *)buf; |
|
ber->br_offs += r; |
|
return r; |
|
} |
|
|
|
int |
|
ber_oid_cmp(struct ber_oid *a, struct ber_oid *b) |
|
{ |
|
size_t i; |
|
for (i = 0; i < BER_MAX_OID_LEN; i++) { |
|
if (a->bo_id[i] != 0) { |
|
if (a->bo_id[i] == b->bo_id[i]) |
|
continue; |
|
else if (a->bo_id[i] < b->bo_id[i]) { |
|
/* b is a successor of a */ |
|
return (1); |
|
} else { |
|
/* b is a predecessor of a */ |
|
return (-1); |
|
} |
|
} else if (b->bo_id[i] != 0) { |
|
/* b is larger, but a child of a */ |
|
return (2); |
|
} else |
|
break; |
|
} |
|
|
|
/* b and a are identical */ |
|
return (0); |
} |
} |