-/*
- * Support for UDP (CLDAP)
- */
-
-struct dgram_data
-{
- struct sockaddr dst;
- struct sockaddr src;
-};
-
-static int
-sb_dgram_setup( Sockbuf_IO_Desc *sbiod, void *arg )
-{
- struct dgram_data *p;
-
- assert( sbiod != NULL);
- assert( SOCKBUF_VALID( sbiod->sbiod_sb ) );
-
- p = LBER_MALLOC( sizeof( *p ) );
- if ( p == NULL )
- return -1;
- memset( p, 0, sizeof( *p ) );
- sbiod->sbiod_pvt = (void *)p;
- if ( arg != NULL )
- sbiod->sbiod_sb->sb_fd = *((int *)arg);
- return 0;
-}
-
-static int
-sb_dgram_release( Sockbuf_IO_Desc *sbiod )
-{
- assert( sbiod != NULL);
- assert( SOCKBUF_VALID( sbiod->sbiod_sb ) );
-
- LBER_FREE( sbiod->sbiod_pvt );
- sbiod->sbiod_pvt = NULL;
- return 0;
-}
-
-static ber_slen_t
-sb_dgram_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
-{
-#ifdef LDAP_CONNECTIONLESS
- ber_slen_t rc;
- socklen_t addrlen;
- struct dgram_data *p;
-
- assert( sbiod != NULL );
- assert( SOCKBUF_VALID( sbiod->sbiod_sb ) );
- assert( buf != NULL );
-
- p = (struct dgram_data *)sbiod->sbiod_pvt;
-
- addrlen = sizeof( struct sockaddr );
- rc = recvfrom( sbiod->sbiod_sb->sb_fd, buf, len, 0, &p->src,
- &addrlen );
-
- return rc;
-# else /* LDAP_CONNECTIONLESS */
- return -1;
-# endif /* LDAP_CONNECTIONLESS */
-}
-
-static ber_slen_t
-sb_dgram_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
-{
-#ifdef LDAP_CONNECTIONLESS
- ber_slen_t rc;
- struct dgram_data *p;
-
- assert( sbiod != NULL );
- assert( SOCKBUF_VALID( sbiod->sbiod_sb ) );
- assert( buf != NULL );
-
- p = (struct dgram_data *)sbiod->sbiod_pvt;
-
- rc = sendto( sbiod->sbiod_sb->sb_fd, buf, len, 0, &p->dst,
- sizeof( struct sockaddr ) );
-
- if ( rc <= 0 )
- return -1;
-
- /* fake error if write was not atomic */
- if (rc < len) {
-# ifdef EMSGSIZE
- errno = EMSGSIZE;
-# endif
- return -1;
- }
- return rc;
-#else
- return -1;
-#endif
-}
-
-static int
-sb_dgram_close( Sockbuf_IO_Desc *sbiod )
-{
- assert( sbiod != NULL );
- assert( SOCKBUF_VALID( sbiod->sbiod_sb ) );
-
- tcp_close( sbiod->sbiod_sb->sb_fd );
- return 0;
-}
-
-static int
-sb_dgram_ctrl( Sockbuf_IO_Desc *sbiod, int opt, void *arg )
-{
- struct dgram_data *p;
-
- assert( sbiod != NULL );
- assert( SOCKBUF_VALID( sbiod->sbiod_sb ) );
-
- p = (struct dgram_data *)sbiod->sbiod_pvt;
-
- if ( opt == LBER_SB_OPT_UDP_SET_DST ) {
- memcpy( &p->dst, arg, sizeof( struct sockaddr ) );
- return 1;
- }
- else if ( opt == LBER_SB_OPT_UDP_GET_SRC ) {
- *(( struct sockaddr **)arg) = &p->src;
- return 1;
- }
- /* This is an end IO descriptor */
- return 0;
-}
-
-Sockbuf_IO ber_sockbuf_io_udp =
-{
- sb_dgram_setup, /* sbi_setup */
- sb_dgram_release, /* sbi_release */
- sb_dgram_ctrl, /* sbi_ctrl */
- sb_dgram_read, /* sbi_read */
- sb_dgram_write, /* sbi_write */
- sb_dgram_close /* sbi_close */
-};