1 /* 2 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* 7 * Copyright (c) 1990 Regents of the University of Michigan. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms are permitted 11 * provided that this notice is preserved and that due credit is given 12 * to the University of Michigan at Ann Arbor. The name of the University 13 * may not be used to endorse or promote products derived from this 14 * software without specific prior written permission. This software 15 * is provided ``as is'' without express or implied warranty. 16 */ 17 18 #ifndef _LBER_H 19 #define _LBER_H 20 21 #pragma ident "%Z%%M% %I% %E% SMI" 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 #if !defined(NEEDPROTOS) && defined(__STDC__) 28 #define NEEDPROTOS 1 29 #endif 30 31 /* BER classes and mask */ 32 #define LBER_CLASS_UNIVERSAL 0x00 33 #define LBER_CLASS_APPLICATION 0x40 34 #define LBER_CLASS_CONTEXT 0x80 35 #define LBER_CLASS_PRIVATE 0xc0 36 #define LBER_CLASS_MASK 0xc0 37 38 /* BER encoding type and mask */ 39 #define LBER_PRIMITIVE 0x00 40 #define LBER_CONSTRUCTED 0x20 41 #define LBER_ENCODING_MASK 0x20 42 43 #define LBER_BIG_TAG_MASK 0x1f 44 #define LBER_MORE_TAG_MASK 0x80 45 46 /* 47 * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear 48 * as valid BER tags, and so it is safe to use them to report errors. In 49 * fact, any tag for which the following is true is invalid: 50 * (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 ) 51 */ 52 #define LBER_ERROR 0xffffffff 53 #define LBER_DEFAULT 0xffffffff 54 55 /* general BER types we know about */ 56 #define LBER_BOOLEAN 0x01 57 #define LBER_INTEGER 0x02 58 #define LBER_BITSTRING 0x03 59 #define LBER_OCTETSTRING 0x04 60 #define LBER_NULL 0x05 61 #define LBER_ENUMERATED 0x0a 62 #define LBER_SEQUENCE 0x30 /* constructed */ 63 #define LBER_SET 0x31 /* constructed */ 64 65 #define OLD_LBER_SEQUENCE 0x10 /* w/o constructed bit - broken */ 66 #define OLD_LBER_SET 0x11 /* w/o constructed bit - broken */ 67 68 #ifdef NEEDPROTOS 69 typedef int (*BERTranslateProc)(char **bufp, unsigned int *buflenp, 70 int free_input); 71 #else /* NEEDPROTOS */ 72 typedef int (*BERTranslateProc)(); 73 #endif /* NEEDPROTOS */ 74 75 typedef struct berelement BerElement; /* Opaque BerElement structure */ 76 #define NULLBER ((BerElement *) 0) 77 78 #ifdef LDAP_SSL 79 #include <security/ssl.h> 80 #endif /* LDAP_SSL */ 81 82 /* 83 * Structure Sockbuf which used to be defined in this header file, is 84 * removed since the c-api draft does not define the structure and it 85 * is only used internal to the library 86 */ 87 88 typedef struct seqorset { 89 BerElement *sos_ber; 90 unsigned int sos_clen; 91 unsigned int sos_tag; 92 char *sos_first; 93 char *sos_ptr; 94 struct seqorset *sos_next; 95 } Seqorset; 96 #define NULLSEQORSET ((Seqorset *) 0) 97 98 typedef unsigned int ber_len_t; /* for BER len */ 99 typedef unsigned int ber_tag_t; /* for BER tags */ 100 typedef int ber_int_t; /* for BER ints, enums, and Booleans */ 101 typedef unsigned int ber_uint_t; /* unsigned equivalent of ber_int_t */ 102 typedef int ber_slen_t; /* signed equivalent of ber_len_t */ 103 104 /* structure for returning a sequence of octet strings + length */ 105 typedef struct berval { 106 ber_len_t bv_len; 107 char *bv_val; 108 } BerValue; 109 110 #ifndef NEEDPROTOS 111 extern BerElement *ber_alloc(); 112 extern BerElement *der_alloc(); 113 extern BerElement *ber_alloc_t(); 114 extern BerElement *ber_dup(); 115 extern BerElement *ber_init(); 116 extern int lber_debug; 117 extern void ber_bvfree(); 118 extern void ber_bvecfree(); 119 extern struct berval *ber_bvdup(); 120 extern void ber_dump(); 121 extern void ber_sos_dump(); 122 extern void lber_bprint(); 123 extern void ber_reset(); 124 extern void ber_zero_init(); 125 #else /* NEEDPROTOS */ 126 127 /* 128 * in bprint.c: 129 */ 130 void lber_bprint(char *data, int len); 131 132 /* 133 * in decode.c: 134 */ 135 ber_tag_t ber_get_tag(BerElement *ber); 136 ber_tag_t ber_skip_tag(BerElement *ber, ber_len_t *len); 137 ber_tag_t ber_peek_tag(BerElement *ber, ber_len_t *len); 138 unsigned int ber_get_int(BerElement *ber, int *num); 139 unsigned int ber_get_stringb(BerElement *ber, char *buf, 140 ber_len_t *len); 141 unsigned int ber_get_stringa(BerElement *ber, char **buf); 142 unsigned int ber_get_stringal(BerElement *ber, struct berval **bv); 143 unsigned int ber_get_bitstringa(BerElement *ber, char **buf, 144 ber_len_t *len); 145 unsigned int ber_get_null(BerElement *ber); 146 unsigned int ber_get_boolean(BerElement *ber, int *boolval); 147 ber_tag_t ber_first_element(BerElement *ber, ber_len_t *len, 148 char **last); 149 ber_tag_t ber_next_element(BerElement *ber, ber_len_t *len, 150 char *last); 151 #if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun) 152 ber_tag_t ber_scanf(BerElement *ber, char *fmt, ...); 153 #else 154 ber_tag_t ber_scanf(); 155 #endif 156 void ber_bvfree(struct berval *bv); 157 void ber_bvecfree(struct berval **bv); 158 struct berval *ber_bvdup(struct berval *bv); 159 #ifdef STR_TRANSLATION 160 void ber_set_string_translators(BerElement *ber, 161 BERTranslateProc encode_proc, BERTranslateProc decode_proc); 162 #endif /* STR_TRANSLATION */ 163 int ber_flatten(BerElement *ber, struct berval **bvPtr); 164 165 /* 166 * in encode.c 167 */ 168 int ber_put_enum(BerElement *ber, int num, ber_tag_t tag); 169 int ber_put_int(BerElement *ber, int num, ber_tag_t tag); 170 int ber_put_ostring(BerElement *ber, char *str, ber_len_t len, ber_tag_t tag); 171 int ber_put_string(BerElement *ber, char *str, ber_tag_t tag); 172 int ber_put_bitstring(BerElement *ber, char *str, 173 unsigned int bitlen, ber_tag_t tag); 174 int ber_put_null(BerElement *ber, ber_tag_t tag); 175 int ber_put_boolean(BerElement *ber, int boolval, ber_tag_t tag); 176 int ber_start_seq(BerElement *ber, ber_tag_t tag); 177 int ber_start_set(BerElement *ber, ber_tag_t tag); 178 int ber_put_seq(BerElement *ber); 179 int ber_put_set(BerElement *ber); 180 #if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun) 181 int ber_printf(BerElement *ber, char *fmt, ...); 182 #else 183 int ber_printf(); 184 #endif 185 186 /* 187 * in io.c: 188 * 189 * ber_flush() and ber_get_next() functions are obsolete and removed 190 * from this library/header file 191 */ 192 int ber_read(BerElement *ber, char *buf, ber_len_t len); 193 int ber_write(BerElement *ber, char *buf, ber_len_t len, int nosos); 194 void ber_free(BerElement *ber, int freebuf); 195 BerElement *ber_alloc(void); 196 BerElement *der_alloc(void); 197 BerElement *ber_alloc_t(int options); 198 BerElement *ber_dup(BerElement *ber); 199 BerElement *ber_init(struct berval *bv); 200 void ber_dump(BerElement *ber, int inout); 201 void ber_sos_dump(Seqorset *sos); 202 void ber_zero_init(BerElement *ber, int options); 203 void ber_reset(BerElement *ber, int was_writing); 204 205 #ifdef NEEDGETOPT 206 /* 207 * in getopt.c 208 */ 209 int getopt(int nargc, char **nargv, char *ostr); 210 #endif /* NEEDGETOPT */ 211 #endif /* NEEDPROTOS */ 212 213 #define LBER_HTONL(l) htonl(l) 214 #define LBER_NTOHL(l) ntohl(l) 215 216 /* 217 * SAFEMEMCPY is an overlap-safe copy from s to d of n bytes 218 */ 219 #ifdef sunos4 220 #define SAFEMEMCPY(d, s, n) bcopy(s, d, n) 221 #else /* sunos4 */ 222 #define SAFEMEMCPY(d, s, n) memmove(d, s, n) 223 #endif /* sunos4 */ 224 225 #ifdef SUN 226 227 /* I18N support */ 228 #include <locale.h> 229 #include <nl_types.h> 230 231 extern nl_catd slapdcat; /* for I18N support */ 232 extern void i18n_catopen(char *); 233 234 #endif 235 236 #ifdef __cplusplus 237 } 238 #endif 239 240 #endif /* _LBER_H */ 241