X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Flber-int.h;h=c9b9b29d532c315f81009e3057e1e0a15bcb67c8;hb=2948d34f0a4f423ad40d3073fe78163a3359280a;hp=37db2a986b04661c864ad31d14559eb2f4c09518;hpb=321354ecff5571b92cda1bf4b0299e33218d9be8;p=openldap diff --git a/libraries/liblber/lber-int.h b/libraries/liblber/lber-int.h index 37db2a986b..c9b9b29d53 100644 --- a/libraries/liblber/lber-int.h +++ b/libraries/liblber/lber-int.h @@ -23,16 +23,22 @@ LDAP_BEGIN_DECL -#define LBER_ITEM_BERELEMENT 1 -#define LBER_ITEM_SOCKBUF 2 - extern int lber_int_debug; #define lber_log_printf lber_pvt_log_printf +struct lber_options { + short lbo_item_type; +#define LBER_ITEM_BERELEMENT 1 +#define LBER_ITEM_SOCKBUF 2 + short lbo_options; + int lbo_debug; +}; + struct berelement { - short ber_item_type; /* always LBER_ITEM_BERELEMENT */ - short ber_options; - int ber_debug; + struct lber_options ber_opts; +#define ber_item_type ber_opts.lbo_item_type +#define ber_options ber_opts.lbo_options +#define ber_debug ber_opts.lbo_debug int ber_usertag; @@ -50,28 +56,89 @@ struct berelement { }; #define NULLBER ((BerElement *) 0) -struct sockbuf { - short sb_item_type; /* always LBER_ITEM_SOCKBUF */ - short sb_options; /* to support copying ber elements */ - int sb_debug; +struct sockbuf; + +struct sockbuf_io { + int (*sbi_setup)( struct sockbuf * sb, void *arg ); + int (*sbi_remove)( struct sockbuf *sb ); + + long (*sbi_read)( struct sockbuf *sb, void *buf, long len ); + long (*sbi_write)( struct sockbuf *sb, void *buf, long len ); + int (*sbi_close)( struct sockbuf *sb ); +}; + +struct sockbuf_sec { + int (*sbs_setup)( struct sockbuf * sb, void *arg ); + int (*sbs_remove)( struct sockbuf *sb ); + + long (*sbs_protect)( struct sockbuf *sb, char *in, long *ilen, + char *out, long olen ); + long (*sbs_release)( struct sockbuf *sb, char *in, long ilen, + char *out0, long olen0, char *out1, long olen1 ); +}; - int sb_fd; +struct sockbuf_buf { + long buf_size; + long buf_ptr; + long buf_end; + char *buf_base; +}; + +typedef struct sockbuf_io Sockbuf_IO; +typedef struct sockbuf_sec Sockbuf_Sec; +typedef struct sockbuf_buf Sockbuf_Buf; + +#define lber_pvt_sb_get_desc( sb ) ((sb)->sb_sd) +#define lber_pvt_sb_set_desc( sb, val ) ((sb)->sb_sd =(val)) +#define lber_pvt_sb_in_use( sb ) ((sb)->sb_sd!=-1) + +#ifdef USE_SASL +#define lber_pvt_sb_data_ready( sb ) \ +(((sb)->sb_buf_ready) || ((sb)->sb_trans_ready) || ((sb)->sb_sec_ready)) +#else +#define lber_pvt_sb_data_ready( sb ) \ +(((sb)->sb_buf_ready) || ((sb)->sb_trans_ready)) +#endif + +struct sockbuf { + struct lber_options sb_opts; +#define sb_item_type sb_opts.lbo_item_type +#define sb_options sb_opts.lbo_options +#define sb_debug sb_opts.lbo_debug + + int sb_non_block:1; + int sb_read_ahead:1; + + int sb_buf_ready:1; + int sb_trans_ready:1; + int sb_sec_ready:1; + + int sb_fd; + + void *sb_iodata; /* transport-layer data pointer */ + Sockbuf_IO *sb_io; /* I/O functions */ + +#ifdef LDAP_SASL + void *sb_sdata; /* security-layer data pointer */ + Sockbuf_Sec *sb_sec; +#endif + #ifndef MACOS int sb_sd; #else /* MACOS */ void *sb_sd; #endif /* MACOS */ - +#ifdef DEADWOOD long sb_max_incoming; - - BerElement sb_ber; - - int sb_naddr; /* > 0 implies using CLDAP (UDP) */ - void *sb_useaddr; /* pointer to sockaddr to use next */ - void *sb_fromaddr; /* pointer to message source sockaddr */ - void **sb_addrs; /* actually an array of pointers to - sockaddrs */ +#endif + Sockbuf_Buf sb_buf; +#ifdef LDAP_SASL + Sockbuf_Buf sb_sec_buf_in; + Sockbuf_Buf sb_sec_buf_out; + long sb_sec_prev_len; +#endif }; + #define READBUFSIZ 8192 struct seqorset { @@ -104,4 +171,33 @@ LDAP_F int lber_log_sos_dump LDAP_P(( int loglvl, Seqorset *sos )); +/* io.c */ +LDAP_F Sockbuf *lber_pvt_sb_alloc LDAP_P(( void )); +LDAP_F Sockbuf *lber_pvt_sb_alloc_fd LDAP_P(( int )); +LDAP_F Sockbuf *lber_pvt_sb_alloc_fd LDAP_P(( int )); +LDAP_F void lber_pvt_sb_free LDAP_P(( Sockbuf * )); +LDAP_F int lber_pvt_sb_get_option LDAP_P(( Sockbuf *, int, void * )); +LDAP_F int lber_pvt_sb_set_option LDAP_P(( Sockbuf *, int, void * )); + +/* sockbuf.c */ + +LDAP_F int lber_pvt_sb_init LDAP_P(( Sockbuf *sb )); +LDAP_F int lber_pvt_sb_destroy LDAP_P(( Sockbuf *sb )); +#ifdef USE_SASL +LDAP_F int lber_pvt_sb_set_sec LDAP_P(( Sockbuf *sb, Sockbuf_Sec *sec, void *arg )); +LDAP_F int lber_pvt_sb_clear_sec LDAP_P(( Sockbuf *sb )); +#endif +LDAP_F int lber_pvt_sb_set_io LDAP_P(( Sockbuf *sb, Sockbuf_IO *layer, void *arg )); +LDAP_F int lber_pvt_sb_clear_io LDAP_P(( Sockbuf *sb )); +LDAP_F int lber_pvt_sb_close LDAP_P((Sockbuf *sb )); +LDAP_F int lber_pvt_sb_set_nonblock LDAP_P(( Sockbuf *sb, int nb )); +LDAP_F int lber_pvt_sb_set_readahead LDAP_P(( Sockbuf *sb, int rh )); +LDAP_F long lber_pvt_sb_read LDAP_P(( Sockbuf *sb, void *buf, long len )); +LDAP_F long lber_pvt_sb_write LDAP_P(( Sockbuf *sb, void *buf, long len )); +LDAP_F int lber_pvt_sb_udp_set_dst LDAP_P((Sockbuf *sb, void *addr )); +LDAP_F void *lber_pvt_sb_udp_get_src LDAP_P((Sockbuf *sb )); + +extern Sockbuf_IO lber_pvt_sb_io_tcp; +extern Sockbuf_IO lber_pvt_sb_io_udp; + #endif /* _LBER_INT_H */