Annotation of src/usr.bin/ldap/ber.h, Revision 1.5
1.5 ! claudio 1: /* $OpenBSD: ber.h,v 1.4 2018/07/03 18:49:10 rob Exp $ */
1.1 reyk 2:
3: /*
1.3 rob 4: * Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org>
1.1 reyk 5: * Copyright (c) 2006, 2007 Claudio Jeker <claudio@openbsd.org>
6: *
7: * Permission to use, copy, modify, and distribute this software for any
8: * purpose with or without fee is hereby granted, provided that the above
9: * copyright notice and this permission notice appear in all copies.
10: *
11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18: */
19:
1.4 rob 20: #ifndef _BER_H
21: #define _BER_H
22:
1.1 reyk 23: struct ber_element {
24: struct ber_element *be_next;
1.5 ! claudio 25: unsigned int be_type;
! 26: unsigned int be_encoding;
1.1 reyk 27: size_t be_len;
1.4 rob 28: off_t be_offs;
1.1 reyk 29: int be_free;
30: u_int8_t be_class;
1.4 rob 31: void (*be_cb)(void *, size_t);
32: void *be_cbarg;
1.1 reyk 33: union {
34: struct ber_element *bv_sub;
35: void *bv_val;
36: long long bv_numeric;
37: } be_union;
38: #define be_sub be_union.bv_sub
39: #define be_val be_union.bv_val
40: #define be_numeric be_union.bv_numeric
41: };
42:
43: struct ber {
1.4 rob 44: off_t br_offs;
1.1 reyk 45: u_char *br_wbuf;
46: u_char *br_wptr;
47: u_char *br_wend;
48: u_char *br_rbuf;
49: u_char *br_rptr;
50: u_char *br_rend;
51:
1.5 ! claudio 52: unsigned int (*br_application)(struct ber_element *);
1.1 reyk 53: };
54:
55: /* well-known ber_element types */
1.5 ! claudio 56: #define BER_TYPE_DEFAULT ((unsigned int)-1)
1.1 reyk 57: #define BER_TYPE_EOC 0
58: #define BER_TYPE_BOOLEAN 1
59: #define BER_TYPE_INTEGER 2
60: #define BER_TYPE_BITSTRING 3
61: #define BER_TYPE_OCTETSTRING 4
62: #define BER_TYPE_NULL 5
63: #define BER_TYPE_OBJECT 6
64: #define BER_TYPE_ENUMERATED 10
65: #define BER_TYPE_SEQUENCE 16
66: #define BER_TYPE_SET 17
67:
68: /* ber classes */
69: #define BER_CLASS_UNIVERSAL 0x0
70: #define BER_CLASS_UNIV BER_CLASS_UNIVERSAL
71: #define BER_CLASS_APPLICATION 0x1
72: #define BER_CLASS_APP BER_CLASS_APPLICATION
73: #define BER_CLASS_CONTEXT 0x2
74: #define BER_CLASS_PRIVATE 0x3
75: #define BER_CLASS_MASK 0x3
76:
77: /* common definitions */
78: #define BER_MIN_OID_LEN 2 /* OBJECT */
79: #define BER_MAX_OID_LEN 32 /* OBJECT */
80:
81: struct ber_oid {
82: u_int32_t bo_id[BER_MAX_OID_LEN + 1];
83: size_t bo_n;
84: };
85:
86: __BEGIN_DECLS
1.5 ! claudio 87: struct ber_element *ber_get_element(unsigned int);
1.1 reyk 88: void ber_set_header(struct ber_element *, int,
1.5 ! claudio 89: unsigned int);
1.1 reyk 90: void ber_link_elements(struct ber_element *,
91: struct ber_element *);
92: struct ber_element *ber_unlink_elements(struct ber_element *);
93: void ber_replace_elements(struct ber_element *,
94: struct ber_element *);
95: struct ber_element *ber_add_sequence(struct ber_element *);
96: struct ber_element *ber_add_set(struct ber_element *);
97: struct ber_element *ber_add_integer(struct ber_element *, long long);
98: int ber_get_integer(struct ber_element *, long long *);
99: struct ber_element *ber_add_enumerated(struct ber_element *, long long);
100: int ber_get_enumerated(struct ber_element *, long long *);
101: struct ber_element *ber_add_boolean(struct ber_element *, int);
102: int ber_get_boolean(struct ber_element *, int *);
103: struct ber_element *ber_add_string(struct ber_element *, const char *);
104: struct ber_element *ber_add_nstring(struct ber_element *, const char *,
105: size_t);
106: int ber_get_string(struct ber_element *, char **);
107: int ber_get_nstring(struct ber_element *, void **,
108: size_t *);
109: struct ber_element *ber_add_bitstring(struct ber_element *, const void *,
110: size_t);
111: int ber_get_bitstring(struct ber_element *, void **,
112: size_t *);
113: struct ber_element *ber_add_null(struct ber_element *);
114: int ber_get_null(struct ber_element *);
115: struct ber_element *ber_add_eoc(struct ber_element *);
116: int ber_get_eoc(struct ber_element *);
117: struct ber_element *ber_add_oid(struct ber_element *, struct ber_oid *);
118: struct ber_element *ber_add_noid(struct ber_element *, struct ber_oid *, int);
119: struct ber_element *ber_add_oidstring(struct ber_element *, const char *);
120: int ber_get_oid(struct ber_element *, struct ber_oid *);
121: size_t ber_oid2ber(struct ber_oid *, u_int8_t *, size_t);
122: int ber_string2oid(const char *, struct ber_oid *);
123: struct ber_element *ber_printf_elements(struct ber_element *, char *, ...);
124: int ber_scanf_elements(struct ber_element *, char *, ...);
125: ssize_t ber_get_writebuf(struct ber *, void **);
126: int ber_write_elements(struct ber *, struct ber_element *);
127: void ber_set_readbuf(struct ber *, void *, size_t);
128: struct ber_element *ber_read_elements(struct ber *, struct ber_element *);
1.4 rob 129: off_t ber_getpos(struct ber_element *);
1.2 rob 130: void ber_free_element(struct ber_element *);
1.1 reyk 131: void ber_free_elements(struct ber_element *);
132: size_t ber_calc_len(struct ber_element *);
133: void ber_set_application(struct ber *,
1.5 ! claudio 134: unsigned int (*)(struct ber_element *));
1.4 rob 135: void ber_set_writecallback(struct ber_element *,
136: void (*)(void *, size_t), void *);
1.1 reyk 137: void ber_free(struct ber *);
1.4 rob 138: int ber_oid_cmp(struct ber_oid *, struct ber_oid *);
139:
1.1 reyk 140: __END_DECLS
1.4 rob 141:
142: #endif /* _BER_H */