]> git.sur5r.net Git - openldap/blob - libraries/liblber/lber-int.h
a643270e78feb0e06e40328c98019cbef7413bb2
[openldap] / libraries / liblber / lber-int.h
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /* Portions
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_INT_H
19 #define _LBER_INT_H
20
21 #include "lber.h"
22 #include "ldap_log.h"
23 #include "lber_pvt.h"
24
25 LDAP_BEGIN_DECL
26
27 extern BER_ERRNO_FN ber_int_errno_fn;
28
29 /* these have to match lber types settings */
30 #define LBER_INT_HTON(i)        AC_HTONL(i)
31 #define LBER_INT_NTOH(i)        AC_NTOHL(i)
32 #define LBER_LEN_HTON(l)        AC_HTONL(l)
33 #define LBER_LEN_NTOH(l)        AC_NTOHL(l)
34 #define LBER_TAG_HTON(t)        AC_HTONL(t)
35 #define LBER_TAG_NTOH(t)        AC_NTOHL(t)
36
37 struct lber_options {
38         short lbo_valid;
39 #define LBER_UNINITIALIZED              0x0
40 #define LBER_INITIALIZED                0x1
41 #define LBER_VALID_BERELEMENT   0x2
42 #define LBER_VALID_SOCKBUF              0x3
43
44         unsigned short lbo_options;
45         int lbo_debug;
46 };
47
48 extern struct lber_options ber_int_options;
49 #define ber_int_debug ber_int_options.lbo_debug
50
51 struct berelement {
52         struct          lber_options ber_opts;
53 #define ber_valid               ber_opts.lbo_valid
54 #define ber_options             ber_opts.lbo_options
55 #define ber_debug               ber_opts.lbo_debug
56
57         ber_tag_t       ber_usertag;
58
59         ber_tag_t       ber_tag;
60         ber_len_t       ber_len;
61
62         char            *ber_buf;
63         char            *ber_ptr;
64         char            *ber_end;
65
66         struct seqorset *ber_sos;
67         char            *ber_rwptr;
68         BERTranslateProc ber_encode_translate_proc;
69         BERTranslateProc ber_decode_translate_proc;
70 };
71 #define BER_VALID(ber)  ((ber)->ber_valid==LBER_VALID_BERELEMENT)
72
73
74 #define ber_pvt_ber_bytes(ber)          ((ber)->ber_ptr - (ber)->ber_buf)
75 #define ber_pvt_ber_remaining(ber)      ((ber)->ber_end - (ber)->ber_ptr)
76
77 struct sockbuf;
78
79 struct sockbuf_io {
80         int     (*sbi_setup)( struct sockbuf * sb, void *arg );
81         int     (*sbi_remove)( struct sockbuf *sb );
82         
83         ber_slen_t      (*sbi_read)( struct sockbuf *sb, void *buf, ber_len_t len );
84         ber_slen_t      (*sbi_write)( struct sockbuf *sb, void *buf, ber_len_t len );
85         int     (*sbi_close)( struct sockbuf *sb );
86 };
87
88 struct sockbuf_sec {
89         int     (*sbs_setup)( struct sockbuf * sb, void *arg );
90         int     (*sbs_remove)( struct sockbuf *sb );
91    
92         long    (*sbs_protect)( struct sockbuf *sb, char *in, long *ilen,
93                                 char *out, long olen );
94         long    (*sbs_release)( struct sockbuf *sb, char *in, long ilen,
95                                char *out0, long olen0, char *out1, long olen1 );
96 };
97
98 struct sockbuf_buf {
99         ber_len_t       buf_size;
100         ber_len_t       buf_ptr;
101         ber_len_t       buf_end;
102         char    *buf_base;
103 };
104
105 typedef struct sockbuf_io Sockbuf_IO;
106 typedef struct sockbuf_sec Sockbuf_Sec;
107 typedef struct sockbuf_buf Sockbuf_Buf;
108
109 LDAP_F( Sockbuf_IO ) ber_pvt_sb_io_tcp;
110 LDAP_F( Sockbuf_IO ) ber_pvt_sb_io_udp;
111
112
113 struct sockbuf {
114         struct lber_options sb_opts;
115 #define sb_valid                sb_opts.lbo_valid
116 #define sb_options              sb_opts.lbo_options
117 #define sb_debug                sb_opts.lbo_debug
118
119         int             sb_non_block:1; 
120         int             sb_read_ahead:1;
121    
122         int             sb_buf_ready:1;
123         int             sb_trans_ready:1;
124         int             sb_sec_ready:1;
125       
126         /* these bits indicate if the transport layer 
127          * needs to read or write 
128          */
129         int             sb_trans_needs_read:1;
130         int             sb_trans_needs_write:1;
131
132         int             sb_fd;
133    
134         void            *sb_iodata;     /* transport-layer data pointer */
135         Sockbuf_IO      *sb_io;         /* I/O functions */
136    
137 #ifdef LDAP_SASL
138         void            *sb_sdata;      /* security-layer data pointer */
139         Sockbuf_Sec     *sb_sec;
140 #endif  
141
142         ber_socket_t    sb_sd;
143
144 #ifdef DEADWOOD
145         long            sb_max_incoming;
146 #endif
147         Sockbuf_Buf     sb_buf;
148 #ifdef LDAP_SASL   
149         Sockbuf_Buf     sb_sec_buf_in;
150         Sockbuf_Buf     sb_sec_buf_out;
151         ber_len_t       sb_sec_prev_len;
152 #endif   
153 };
154 #define SOCKBUF_VALID(ber)      ((sb)->sb_valid==LBER_VALID_SOCKBUF)
155
156 /* these should be internal ie: ber_int_* */
157 #define ber_pvt_sb_get_desc( sb ) ((sb)->sb_sd)
158 #define ber_pvt_sb_set_desc( sb, val ) ((sb)->sb_sd =(val))
159
160 #define ber_pvt_sb_in_use( sb ) ((sb)->sb_sd != AC_SOCKET_INVALID)
161
162 #ifdef USE_SASL
163 #define ber_pvt_sb_data_ready( sb ) \
164 (((sb)->sb_buf_ready) || ((sb)->sb_trans_ready) || ((sb)->sb_sec_ready))
165 #else
166 #define ber_pvt_sb_data_ready( sb ) \
167 (((sb)->sb_buf_ready) || ((sb)->sb_trans_ready))
168 #endif
169 #define ber_pvt_sb_needs_read( sb ) \
170 ((sb)->sb_trans_needs_read)
171 #define ber_pvt_sb_needs_write( sb ) \
172 ((sb)->sb_trans_needs_write)
173
174 #define READBUFSIZ      8192
175
176 struct seqorset {
177         BerElement      *sos_ber;
178         ber_len_t       sos_clen;
179         ber_tag_t       sos_tag;
180         char            *sos_first;
181         char            *sos_ptr;
182         struct seqorset *sos_next;
183 };
184
185
186 /*
187  * bprint.c
188  */
189 #define ber_log_printf ber_pvt_log_printf
190
191 #ifdef __MINGW32__
192 #   undef LDAP_F_PRE
193 #   ifdef LIBLBER_DECL
194 #       define LDAP_F_PRE       extern __declspec(LIBLBER_DECL)
195 #   else
196 #       define LDAP_F_PRE       extern
197 #   endif
198 #endif
199
200 LDAP_F( int )
201 ber_log_bprint LDAP_P((
202         int errlvl,
203         int loglvl,
204         const char *data,
205         ber_len_t len ));
206
207 LDAP_F( int )
208 ber_log_dump LDAP_P((
209         int errlvl,
210         int loglvl,
211         BerElement *ber,
212         int inout ));
213
214 LDAP_F( int )
215 ber_log_sos_dump LDAP_P((
216         int errlvl,
217         int loglvl,
218         Seqorset *sos ));
219
220
221 /* memory.c */
222         /* simple macros to realloc for now */
223 extern BerMemoryFunctions*              ber_int_memory_fns;
224
225 #ifdef CSRIMALLOC
226 #define LBER_INT_MALLOC         malloc
227 #define LBER_INT_CALLOC         calloc
228 #define LBER_INT_REALLOC        realloc
229 #define LBER_INT_FREE           free
230 #define LBER_INT_VFREE          ber_memvfree
231 #define LBER_INT_STRDUP         strdup
232
233 #define LBER_MALLOC                     malloc
234 #define LBER_CALLOC                     calloc
235 #define LBER_REALLOC            realloc
236 #define LBER_FREE                       free
237 #define LBER_VFREE                      ber_memvfree
238 #define LBER_STRDUP                     strdup
239
240 #else
241 #define LBER_INT_MALLOC(s)              ber_memalloc((s))
242 #define LBER_INT_CALLOC(n,s)    ber_memcalloc((n),(s))
243 #define LBER_INT_REALLOC(p,s)   ber_memrealloc((p),(s))
244 #define LBER_INT_FREE(p)                ber_memfree((p))
245 #define LBER_INT_VFREE(v)               ber_memvfree((void**)(v))
246 #define LBER_INT_STRDUP(s)              ber_strdup((s))
247
248 #define LBER_MALLOC(s)          ber_memalloc((s))
249 #define LBER_CALLOC(n,s)        ber_memcalloc((n),(s))
250 #define LBER_REALLOC(p,s)       ber_memrealloc((p),(s))
251 #define LBER_FREE(p)            ber_memfree((p))        
252 #define LBER_VFREE(v)           ber_memvfree((void**)(v))
253 #define LBER_STRDUP(s)          ber_strdup((s))
254 #endif
255
256 /* sockbuf.c */
257
258 /* these should be ber_int*() functions */
259
260 LDAP_F( int )
261 ber_pvt_sb_init LDAP_P(( Sockbuf *sb ));
262
263 LDAP_F( int )
264 ber_pvt_sb_destroy LDAP_P(( Sockbuf *sb ));
265
266 #ifdef USE_SASL
267 LDAP_F( int )
268 ber_pvt_sb_set_sec LDAP_P(( Sockbuf *sb, Sockbuf_Sec *sec, void *arg ));
269
270 LDAP_F( int )
271 ber_pvt_sb_clear_sec LDAP_P(( Sockbuf *sb ));
272 #endif
273
274 LDAP_F( int )
275 ber_pvt_sb_set_io LDAP_P(( Sockbuf *sb, Sockbuf_IO *layer, void *arg ));
276
277 LDAP_F( int )
278 ber_pvt_sb_clear_io LDAP_P(( Sockbuf *sb ));
279
280 LDAP_F( int )
281 ber_pvt_sb_close LDAP_P((Sockbuf *sb ));
282
283 LDAP_F( int )
284 ber_pvt_sb_set_nonblock LDAP_P(( Sockbuf *sb, int nb ));
285
286 LDAP_F( int )
287 ber_pvt_sb_set_readahead LDAP_P(( Sockbuf *sb, int rh ));
288
289 LDAP_F( ber_slen_t )
290 ber_pvt_sb_read LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len ));
291
292 LDAP_F( ber_slen_t )
293 ber_pvt_sb_write LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len ));
294
295 LDAP_F( int )
296 ber_pvt_sb_udp_set_dst LDAP_P((Sockbuf *sb, void *addr ));
297
298 LDAP_F( void * )
299 ber_pvt_sb_udp_get_src LDAP_P((Sockbuf *sb ));
300
301 LDAP_F( int )
302 ber_pvt_socket_set_nonblock LDAP_P(( ber_socket_t sd, int nb ));
303
304 #endif /* _LBER_INT_H */