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