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