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