=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ldap/Attic/ber.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/ldap/Attic/ber.c 2018/07/01 20:03:48 1.7 --- src/usr.bin/ldap/Attic/ber.c 2018/07/03 18:49:10 1.8 *************** *** 1,4 **** ! /* $OpenBSD: ber.c,v 1.7 2018/07/01 20:03:48 rob Exp $ */ /* * Copyright (c) 2007, 2012 Reyk Floeter --- 1,4 ---- ! /* $OpenBSD: ber.c,v 1.8 2018/07/03 18:49:10 rob Exp $ */ /* * Copyright (c) 2007, 2012 Reyk Floeter *************** *** 631,640 **** va_list ap; int *d, level = -1; unsigned long *t; ! long long *i; void **ptr; size_t *len, ret = 0, n = strlen(fmt); char **s; struct ber_oid *o; struct ber_element *parent[_MAX_SEQ], **e; --- 631,641 ---- va_list ap; int *d, level = -1; unsigned long *t; ! long long *i, l; void **ptr; size_t *len, ret = 0, n = strlen(fmt); char **s; + off_t *pos; struct ber_oid *o; struct ber_element *parent[_MAX_SEQ], **e; *************** *** 656,661 **** --- 657,669 ---- goto fail; ret++; break; + case 'd': + d = va_arg(ap, int *); + if (ber_get_integer(ber, &l) == -1) + goto fail; + *d = l; + ret++; + break; case 'e': e = va_arg(ap, struct ber_element **); *e = ber; *************** *** 712,717 **** --- 720,730 ---- goto fail; ret++; break; + case 'p': + pos = va_arg(ap, off_t *); + *pos = ber_getpos(ber); + ret++; + continue; case '{': case '(': if (ber->be_encoding != BER_TYPE_SEQUENCE && *************** *** 821,826 **** --- 834,845 ---- return root; } + off_t + ber_getpos(struct ber_element *elm) + { + return elm->be_offs; + } + void ber_free_element(struct ber_element *root) { *************** *** 893,898 **** --- 912,919 ---- uint8_t u; 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) { case BER_TYPE_BOOLEAN: *************** *** 1101,1106 **** --- 1122,1128 ---- elm->be_type = type; elm->be_len = len; + elm->be_offs = ber->br_offs; /* element position within stream */ elm->be_class = class; if (elm->be_encoding == 0) { *************** *** 1232,1237 **** --- 1254,1268 ---- } 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) { free(b->br_wbuf); *************** *** 1258,1262 **** b += r; remain -= r; } ! return (b - (u_char *)buf); } --- 1289,1321 ---- b += r; remain -= r; } ! 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); }