1 /* 2 * Copyright (c) 2001 by Sun Microsystems, Inc. 3 * All rights reserved. 4 */ 5 6 /* 7 * Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 8 * 9 * The contents of this file are subject to the Netscape Public License 10 * Version 1.0(the "NPL"); you may not use this file except in 11 * compliance with the NPL. You may obtain a copy of the NPL at 12 * http:/ /www.mozilla.org/NPL/ 13 * 14 * Software distributed under the NPL is distributed on an "AS IS" basis, 15 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL 16 * for the specific language governing rights and limitations under the 17 * NPL. 18 * 19 * The Initial Developer of this code under the NPL is Netscape 20 * Communications Corporation. Portions created by Netscape are 21 * Copyright(C) 1998 Netscape Communications Corporation. All Rights 22 * Reserved. 23 */ 24 25 #ifndef _LBER_H 26 #define _LBER_H 27 28 #pragma ident "%Z%%M% %I% %E% SMI" 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #ifndef _SOLARIS_SDK 35 #define _SOLARIS_SDK 36 #endif 37 38 #include <stdlib.h> /* to pick up size_t typedef */ 39 40 #ifdef _SOLARIS_SDK 41 #ifdef sunos4 42 #define SAFEMEMCPY(d, s, n) bcopy(s, d, n) 43 #else /* sunos4 */ 44 #define SAFEMEMCPY(d, s, n) memmove(d, s, n) 45 #endif /* sunos4 */ 46 #endif /* _SOLARIS_SDK */ 47 /* 48 * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear 49 * as valid BER tags, and so it is safe to use them to report errors. In 50 * fact, any tag for which the following is true is invalid: 51 * (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 ) 52 */ 53 #define LBER_ERROR 0xffffffffU 54 #define LBER_DEFAULT 0xffffffffU 55 #define LBER_END_OF_SEQORSET 0xfffffffeU 56 /* BER classes and mask */ 57 #define LBER_CLASS_UNIVERSAL 0x00 58 #define LBER_CLASS_APPLICATION 0x40 59 #define LBER_CLASS_CONTEXT 0x80 60 #define LBER_CLASS_PRIVATE 0xc0 61 #define LBER_CLASS_MASK 0xc0 62 63 /* BER encoding type and mask */ 64 #define LBER_PRIMITIVE 0x00 65 #define LBER_CONSTRUCTED 0x20 66 #define LBER_ENCODING_MASK 0x20 67 68 #define LBER_BIG_TAG_MASK 0x1f 69 #define LBER_MORE_TAG_MASK 0x80 70 71 /* general BER types we know about */ 72 #define LBER_BOOLEAN 0x01 73 #define LBER_INTEGER 0x02 74 #define LBER_BITSTRING 0x03 75 #define LBER_OCTETSTRING 0x04 76 #define LBER_NULL 0x05 77 #define LBER_ENUMERATED 0x0a 78 #define LBER_SEQUENCE 0x30 79 #define LBER_SET 0x31 80 81 82 typedef unsigned int ber_len_t; /* for BER len */ 83 typedef unsigned int ber_tag_t; /* for BER tags */ 84 typedef int ber_int_t; /* for BER ints, enums, and Booleans */ 85 typedef unsigned int ber_uint_t; /* unsigned equivalent of ber_int_t */ 86 typedef int ber_slen_t; /* signed equivalent of ber_len_t */ 87 88 typedef struct berval { 89 ber_len_t bv_len; 90 char *bv_val; 91 } BerValue; 92 93 typedef struct berelement BerElement; 94 95 #ifdef _SOLARIS_SDK 96 #define NULLBER ((BerElement *)NULL) 97 #endif 98 99 typedef int (*BERTranslateProc)(char **bufp, ber_uint_t *buflenp, 100 int free_input); 101 #ifndef macintosh 102 #if defined(_WINDOWS) || defined(_WIN32) || defined(_CONSOLE) 103 #include <winsock.h> /* for SOCKET */ 104 typedef SOCKET LBER_SOCKET; 105 #else 106 typedef int LBER_SOCKET; 107 #endif /* _WINDOWS */ 108 #else /* macintosh */ 109 typedef void *LBER_SOCKET; 110 #endif /* macintosh */ 111 112 /* calling conventions used by library */ 113 #ifndef LDAP_CALL 114 #if defined(_WINDOWS) || defined(_WIN32) 115 #define LDAP_C __cdecl 116 #ifndef _WIN32 117 #define __stdcall _far _pascal 118 #define LDAP_CALLBACK _loadds 119 #else 120 #define LDAP_CALLBACK 121 #endif /* _WIN32 */ 122 #define LDAP_PASCAL __stdcall 123 #define LDAP_CALL LDAP_PASCAL 124 #else /* _WINDOWS */ 125 #define LDAP_C 126 #define LDAP_CALLBACK 127 #define LDAP_PASCAL 128 #define LDAP_CALL 129 #endif /* _WINDOWS */ 130 #endif /* LDAP_CALL */ 131 132 /* 133 * function prototypes for lber library 134 */ 135 #ifndef LDAP_API 136 #if defined(_WINDOWS) || defined(_WIN32) 137 #define LDAP_API(rt) rt 138 #else /* _WINDOWS */ 139 #define LDAP_API(rt) rt 140 #endif /* _WINDOWS */ 141 #endif /* LDAP_API */ 142 143 /* 144 * decode routines 145 */ 146 ber_tag_t LDAP_CALL ber_get_tag(BerElement *ber); 147 ber_tag_t LDAP_CALL ber_skip_tag(BerElement *ber, 148 ber_len_t *len); 149 ber_tag_t LDAP_CALL ber_peek_tag(BerElement *ber, 150 ber_len_t *len); 151 ber_tag_t LDAP_CALL ber_get_int(BerElement *ber, ber_int_t *num); 152 ber_tag_t LDAP_CALL ber_get_stringb(BerElement *ber, char *buf, 153 ber_len_t *len); 154 ber_tag_t LDAP_CALL ber_get_stringa(BerElement *ber, 155 char **buf); 156 ber_tag_t LDAP_CALL ber_get_stringal(BerElement *ber, 157 struct berval **bv); 158 ber_tag_t ber_get_bitstringa(BerElement *ber, 159 char **buf, ber_len_t *len); 160 ber_tag_t LDAP_CALL ber_get_null(BerElement *ber); 161 ber_tag_t LDAP_CALL ber_get_boolean(BerElement *ber, 162 int *boolval); 163 ber_tag_t LDAP_CALL ber_first_element(BerElement *ber, 164 ber_len_t *len, char **last); 165 ber_tag_t LDAP_CALL ber_next_element(BerElement *ber, 166 ber_len_t *len, char *last); 167 ber_tag_t LDAP_C ber_scanf(BerElement *ber, const char *fmt, 168 ...); 169 LDAP_API(void) LDAP_CALL ber_bvfree(struct berval *bv); 170 LDAP_API(void) LDAP_CALL ber_bvecfree(struct berval **bv); 171 struct berval *LDAP_CALL ber_bvdup(const struct berval *bv); 172 LDAP_API(void) LDAP_CALL ber_set_string_translators(BerElement *ber, 173 BERTranslateProc encode_proc, BERTranslateProc decode_proc); 174 LDAP_API(BerElement *) LDAP_CALL ber_init(const struct berval *bv); 175 176 /* 177 * encoding routines 178 */ 179 int LDAP_CALL ber_put_enum(BerElement *ber, ber_int_t num, 180 ber_tag_t tag); 181 int LDAP_CALL ber_put_int(BerElement *ber, ber_int_t num, 182 ber_tag_t tag); 183 int LDAP_CALL ber_put_ostring(BerElement *ber, char *str, 184 ber_len_t len, ber_tag_t tag); 185 int LDAP_CALL ber_put_string(BerElement *ber, char *str, 186 ber_tag_t tag); 187 int LDAP_CALL ber_put_bitstring(BerElement *ber, char *str, 188 ber_len_t bitlen, ber_tag_t tag); 189 int LDAP_CALL ber_put_null(BerElement *ber, ber_tag_t tag); 190 int LDAP_CALL ber_put_boolean(BerElement *ber, int boolval, 191 ber_tag_t tag); 192 int LDAP_CALL ber_start_seq(BerElement *ber, ber_tag_t tag); 193 int LDAP_CALL ber_start_set(BerElement *ber, ber_tag_t tag); 194 int LDAP_CALL ber_put_seq(BerElement *ber); 195 int LDAP_CALL ber_put_set(BerElement *ber); 196 int LDAP_C ber_printf(BerElement *ber, const char *fmt, ...); 197 int LDAP_CALL ber_flatten(BerElement *ber, 198 struct berval **bvPtr); 199 200 /* 201 * miscellaneous routines 202 */ 203 LDAP_API(void) LDAP_CALL ber_free(BerElement *ber, int freebuf); 204 LDAP_API(BerElement*) LDAP_CALL ber_alloc(void); 205 LDAP_API(BerElement*) LDAP_CALL der_alloc(void); 206 LDAP_API(BerElement*) LDAP_CALL ber_alloc_t(int options); 207 LDAP_API(BerElement*) LDAP_CALL ber_dup(BerElement *ber); 208 ber_int_t LDAP_CALL ber_read(BerElement *ber, char *buf, 209 ber_len_t len); 210 ber_int_t LDAP_CALL ber_write(BerElement *ber, char *buf, 211 ber_len_t len, int nosos); 212 LDAP_API(void) LDAP_CALL ber_reset(BerElement *ber, int was_writing); 213 214 #ifdef __cplusplus 215 } 216 #endif 217 218 #endif /* _LBER_H */ 219