]> git.sur5r.net Git - openldap/blob - libraries/liblber/lber-int.h
Use getpassphrase() instead of getpass() if available.
[openldap] / libraries / liblber / lber-int.h
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2000 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  * io.c
180  */
181 int ber_realloc LDAP_P((
182         BerElement *ber,
183         ber_len_t len ));
184
185 /*
186  * bprint.c
187  */
188 #define ber_log_printf ber_pvt_log_printf
189
190 LIBLBER_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 LIBLBER_F( int )
198 ber_log_dump LDAP_P((
199         int errlvl,
200         int loglvl,
201         BerElement *ber,
202         int inout ));
203
204 LIBLBER_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 LIBLBER_F (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 LIBLBER_F( int )
251 ber_pvt_sb_init LDAP_P(( Sockbuf *sb ));
252
253 LIBLBER_F(      int )
254 ber_pvt_sb_destroy LDAP_P(( Sockbuf *sb ));
255
256 #ifdef USE_SASL
257 LIBLBER_F( int )
258 ber_pvt_sb_set_sec LDAP_P(( Sockbuf *sb, Sockbuf_Sec *sec, void *arg ));
259
260 LIBLBER_F( int )
261 ber_pvt_sb_clear_sec LDAP_P(( Sockbuf *sb ));
262 #endif
263
264 LIBLBER_F(      int )
265 ber_pvt_sb_set_io LDAP_P(( Sockbuf *sb, Sockbuf_IO *layer, void *arg ));
266
267 LIBLBER_F(      int )
268 ber_pvt_sb_clear_io LDAP_P(( Sockbuf *sb ));
269
270 LIBLBER_F(      int )
271 ber_pvt_sb_close LDAP_P((Sockbuf *sb ));
272
273 LIBLBER_F( int )
274 ber_pvt_sb_set_nonblock LDAP_P(( Sockbuf *sb, int nb ));
275
276 LIBLBER_F( int )
277 ber_pvt_sb_set_readahead LDAP_P(( Sockbuf *sb, int rh ));
278
279 LIBLBER_F( ber_slen_t )
280 ber_pvt_sb_read LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len ));
281
282 LIBLBER_F( ber_slen_t )
283 ber_pvt_sb_write LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len ));
284
285 LIBLBER_F(      int )
286 ber_pvt_sb_udp_set_dst LDAP_P((Sockbuf *sb, void *addr ));
287
288 LIBLBER_F(      void * )
289 ber_pvt_sb_udp_get_src LDAP_P((Sockbuf *sb ));
290
291 LIBLBER_F( int )
292 ber_pvt_socket_set_nonblock LDAP_P(( ber_socket_t sd, int nb ));
293
294 LDAP_END_DECL
295
296 #endif /* _LBER_INT_H */