2005-01-21 09:54:10 +03:00
/*
Unix SMB / CIFS implementation .
a raw async NBT library
Copyright ( C ) Andrew Tridgell 2005
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-01-21 09:54:10 +03:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-01-21 09:54:10 +03:00
*/
2005-12-28 18:38:36 +03:00
# ifndef __LIBNBT_H__
# define __LIBNBT_H__
2006-03-16 03:23:11 +03:00
# include "librpc/gen_ndr/nbt.h"
2008-04-02 06:53:27 +04:00
# include "librpc/ndr/libndr.h"
2005-01-21 09:54:10 +03:00
/*
possible states for pending requests
*/
2008-09-23 08:58:17 +04:00
enum nbt_request_state { NBT_REQUEST_SEND ,
NBT_REQUEST_WAIT ,
2005-01-21 09:54:10 +03:00
NBT_REQUEST_DONE ,
NBT_REQUEST_TIMEOUT ,
NBT_REQUEST_ERROR } ;
/*
a nbt name request
*/
struct nbt_name_request {
struct nbt_name_request * next , * prev ;
enum nbt_request_state state ;
NTSTATUS status ;
/* the socket this was on */
struct nbt_name_socket * nbtsock ;
/* where to send the request */
2006-01-10 01:12:53 +03:00
struct socket_address * dest ;
2005-01-21 09:54:10 +03:00
2005-02-06 11:22:18 +03:00
/* timeout between retries */
int timeout ;
/* how many retries to send on timeout */
int num_retries ;
/* whether we have received a WACK */
2007-08-27 22:10:19 +04:00
bool received_wack ;
2005-02-06 11:22:18 +03:00
2005-01-21 09:54:10 +03:00
/* the timeout event */
2008-12-29 22:24:57 +03:00
struct tevent_timer * te ;
2005-01-21 09:54:10 +03:00
2005-01-31 07:53:53 +03:00
/* the name transaction id */
uint16_t name_trn_id ;
/* is it a reply? */
2007-08-27 22:10:19 +04:00
bool is_reply ;
2008-09-23 08:58:17 +04:00
2005-01-31 07:53:53 +03:00
/* the encoded request */
DATA_BLOB encoded ;
2005-01-21 09:54:10 +03:00
/* shall we allow multiple replies? */
2007-08-27 22:10:19 +04:00
bool allow_multiple_replies ;
2005-01-21 09:54:10 +03:00
2006-05-02 03:03:32 +04:00
unsigned int num_replies ;
2005-01-21 09:54:10 +03:00
struct nbt_name_reply {
struct nbt_name_packet * packet ;
2006-01-10 01:12:53 +03:00
struct socket_address * dest ;
2005-01-21 09:54:10 +03:00
} * replies ;
2005-01-21 14:18:56 +03:00
/* information on what to do on completion */
struct {
void ( * fn ) ( struct nbt_name_request * ) ;
2008-09-23 11:02:16 +04:00
void * private_data ;
2005-01-21 14:18:56 +03:00
} async ;
2005-01-21 09:54:10 +03:00
} ;
/*
context structure for operations on name queries
*/
struct nbt_name_socket {
struct socket_context * sock ;
2008-12-29 22:24:57 +03:00
struct tevent_context * event_ctx ;
2008-02-21 19:17:37 +03:00
struct smb_iconv_convenience * iconv_convenience ;
2005-01-21 09:54:10 +03:00
/* a queue of requests pending to be sent */
struct nbt_name_request * send_queue ;
/* the fd event */
2008-12-29 22:24:57 +03:00
struct tevent_fd * fde ;
2005-01-21 09:54:10 +03:00
/* mapping from name_trn_id to pending event */
struct idr_context * idr ;
/* how many requests are waiting for a reply */
uint16_t num_pending ;
2005-01-30 13:24:36 +03:00
/* what to do with incoming request packets */
struct {
2008-09-23 08:58:17 +04:00
void ( * handler ) ( struct nbt_name_socket * , struct nbt_name_packet * ,
2006-01-10 01:12:53 +03:00
struct socket_address * ) ;
2008-09-23 11:02:16 +04:00
void * private_data ;
2005-01-30 13:24:36 +03:00
} incoming ;
2005-02-08 04:05:41 +03:00
/* what to do with unexpected replies */
struct {
2008-09-23 08:58:17 +04:00
void ( * handler ) ( struct nbt_name_socket * , struct nbt_name_packet * ,
2006-01-10 01:12:53 +03:00
struct socket_address * ) ;
2008-09-23 11:02:16 +04:00
void * private_data ;
2005-02-08 04:05:41 +03:00
} unexpected ;
2005-01-21 09:54:10 +03:00
} ;
/* a simple name query */
struct nbt_name_query {
struct {
struct nbt_name name ;
const char * dest_addr ;
2007-12-06 18:26:56 +03:00
uint16_t dest_port ;
2007-08-27 22:10:19 +04:00
bool broadcast ;
bool wins_lookup ;
2005-01-21 09:54:10 +03:00
int timeout ; /* in seconds */
2005-02-06 11:22:18 +03:00
int retries ;
2005-01-21 09:54:10 +03:00
} in ;
struct {
const char * reply_from ;
struct nbt_name name ;
2005-01-31 04:57:58 +03:00
int16_t num_addrs ;
const char * * reply_addrs ;
2005-01-21 09:54:10 +03:00
} out ;
} ;
/* a simple name status query */
struct nbt_name_status {
struct {
struct nbt_name name ;
const char * dest_addr ;
2007-12-10 20:41:29 +03:00
uint16_t dest_port ;
2005-01-21 09:54:10 +03:00
int timeout ; /* in seconds */
2005-02-06 11:22:18 +03:00
int retries ;
2005-01-21 09:54:10 +03:00
} in ;
struct {
const char * reply_from ;
struct nbt_name name ;
struct nbt_rdata_status status ;
} out ;
} ;
2005-01-31 04:57:58 +03:00
/* a name registration request */
struct nbt_name_register {
struct {
struct nbt_name name ;
const char * dest_addr ;
2007-12-10 20:41:45 +03:00
uint16_t dest_port ;
2005-01-31 04:57:58 +03:00
const char * address ;
uint16_t nb_flags ;
2007-08-27 22:10:19 +04:00
bool register_demand ;
bool broadcast ;
bool multi_homed ;
2005-01-31 04:57:58 +03:00
uint32_t ttl ;
int timeout ; /* in seconds */
2005-02-06 11:22:18 +03:00
int retries ;
2005-01-31 04:57:58 +03:00
} in ;
struct {
const char * reply_from ;
struct nbt_name name ;
const char * reply_addr ;
uint8_t rcode ;
} out ;
} ;
2005-01-31 06:14:15 +03:00
/* a send 3 times then demand name broadcast name registration */
struct nbt_name_register_bcast {
struct {
struct nbt_name name ;
const char * dest_addr ;
2007-12-12 04:15:20 +03:00
uint16_t dest_port ;
2005-01-31 06:14:15 +03:00
const char * address ;
uint16_t nb_flags ;
uint32_t ttl ;
} in ;
} ;
2005-01-31 09:55:25 +03:00
2005-02-08 04:05:41 +03:00
/* wins name register with multiple wins servers to try and multiple
2005-02-06 11:22:18 +03:00
addresses to register */
2005-02-08 04:05:41 +03:00
struct nbt_name_register_wins {
2005-02-06 11:22:18 +03:00
struct {
struct nbt_name name ;
const char * * wins_servers ;
2007-12-12 04:15:20 +03:00
uint16_t wins_port ;
2005-02-06 11:22:18 +03:00
const char * * addresses ;
uint16_t nb_flags ;
uint32_t ttl ;
} in ;
struct {
const char * wins_server ;
uint8_t rcode ;
} out ;
} ;
2005-01-31 09:55:25 +03:00
2005-02-08 04:05:41 +03:00
2005-01-31 09:55:25 +03:00
/* a name refresh request */
struct nbt_name_refresh {
struct {
struct nbt_name name ;
const char * dest_addr ;
2007-12-10 20:41:41 +03:00
uint16_t dest_port ;
2005-01-31 09:55:25 +03:00
const char * address ;
uint16_t nb_flags ;
2007-08-27 22:10:19 +04:00
bool broadcast ;
2005-01-31 09:55:25 +03:00
uint32_t ttl ;
int timeout ; /* in seconds */
2005-02-06 11:22:18 +03:00
int retries ;
2005-01-31 09:55:25 +03:00
} in ;
struct {
const char * reply_from ;
struct nbt_name name ;
const char * reply_addr ;
uint8_t rcode ;
} out ;
} ;
2005-02-08 04:05:41 +03:00
/* wins name refresh with multiple wins servers to try and multiple
addresses to register */
struct nbt_name_refresh_wins {
struct {
struct nbt_name name ;
const char * * wins_servers ;
2007-12-12 04:15:20 +03:00
uint16_t wins_port ;
2005-02-08 04:05:41 +03:00
const char * * addresses ;
uint16_t nb_flags ;
uint32_t ttl ;
} in ;
struct {
const char * wins_server ;
uint8_t rcode ;
} out ;
} ;
2005-02-10 06:22:47 +03:00
/* a name release request */
struct nbt_name_release {
struct {
struct nbt_name name ;
const char * dest_addr ;
2007-12-12 04:15:20 +03:00
uint16_t dest_port ;
2005-02-10 06:22:47 +03:00
const char * address ;
uint16_t nb_flags ;
2007-08-27 22:10:19 +04:00
bool broadcast ;
2005-02-10 06:22:47 +03:00
int timeout ; /* in seconds */
int retries ;
} in ;
struct {
const char * reply_from ;
struct nbt_name name ;
const char * reply_addr ;
uint8_t rcode ;
} out ;
} ;
2005-12-28 18:38:36 +03:00
2008-09-23 08:58:17 +04:00
struct nbt_name_socket * nbt_name_socket_init ( TALLOC_CTX * mem_ctx ,
2008-12-29 22:24:57 +03:00
struct tevent_context * event_ctx ,
2008-04-02 06:53:27 +04:00
struct smb_iconv_convenience * iconv_convenience ) ;
struct nbt_name_request * nbt_name_query_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_query * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_query_recv ( struct nbt_name_request * req ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_query * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_query ( struct nbt_name_socket * nbtsock ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_query * io ) ;
struct nbt_name_request * nbt_name_status_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_status * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_status_recv ( struct nbt_name_request * req ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_status * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_status ( struct nbt_name_socket * nbtsock ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_status * io ) ;
NTSTATUS nbt_name_dup ( TALLOC_CTX * mem_ctx , struct nbt_name * name , struct nbt_name * newname ) ;
NTSTATUS nbt_name_to_blob ( TALLOC_CTX * mem_ctx , struct smb_iconv_convenience * iconv_convenience , DATA_BLOB * blob , struct nbt_name * name ) ;
NTSTATUS nbt_name_from_blob ( TALLOC_CTX * mem_ctx , const DATA_BLOB * blob , struct nbt_name * name ) ;
void nbt_choose_called_name ( TALLOC_CTX * mem_ctx , struct nbt_name * n , const char * name , int type ) ;
char * nbt_name_string ( TALLOC_CTX * mem_ctx , const struct nbt_name * name ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_register ( struct nbt_name_socket * nbtsock ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_register * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_refresh ( struct nbt_name_socket * nbtsock ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_refresh * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_release ( struct nbt_name_socket * nbtsock ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_release * io ) ;
NTSTATUS nbt_name_register_wins ( struct nbt_name_socket * nbtsock ,
TALLOC_CTX * mem_ctx ,
struct nbt_name_register_wins * io ) ;
NTSTATUS nbt_name_refresh_wins ( struct nbt_name_socket * nbtsock ,
TALLOC_CTX * mem_ctx ,
struct nbt_name_refresh_wins * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_register_recv ( struct nbt_name_request * req ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_register * io ) ;
struct nbt_name_request * nbt_name_register_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_register * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_release_recv ( struct nbt_name_request * req ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_release * io ) ;
struct nbt_name_request * nbt_name_release_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_release * io ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_refresh_recv ( struct nbt_name_request * req ,
2008-04-02 06:53:27 +04:00
TALLOC_CTX * mem_ctx , struct nbt_name_refresh * io ) ;
NTSTATUS nbt_set_incoming_handler ( struct nbt_name_socket * nbtsock ,
2008-09-23 08:58:17 +04:00
void ( * handler ) ( struct nbt_name_socket * , struct nbt_name_packet * ,
2008-04-02 06:53:27 +04:00
struct socket_address * ) ,
2008-09-23 11:02:16 +04:00
void * private_data ) ;
2009-01-17 20:15:24 +03:00
NTSTATUS nbt_set_unexpected_handler ( struct nbt_name_socket * nbtsock ,
void ( * handler ) ( struct nbt_name_socket * , struct nbt_name_packet * ,
struct socket_address * ) ,
void * private ) ;
2008-09-23 08:58:17 +04:00
NTSTATUS nbt_name_reply_send ( struct nbt_name_socket * nbtsock ,
2008-04-02 06:53:27 +04:00
struct socket_address * dest ,
struct nbt_name_packet * request ) ;
2008-11-23 12:43:10 +03:00
NDR_SCALAR_PROTO ( wrepl_nbt_name , const struct nbt_name * )
NDR_SCALAR_PROTO ( nbt_string , const char * )
NDR_BUFFER_PROTO ( nbt_name , struct nbt_name )
2008-04-02 06:53:27 +04:00
NTSTATUS nbt_rcode_to_ntstatus ( uint8_t rcode ) ;
struct composite_context ;
struct composite_context * nbt_name_register_bcast_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_register_bcast * io ) ;
NTSTATUS nbt_name_register_bcast_recv ( struct composite_context * c ) ;
struct composite_context * nbt_name_register_wins_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_register_wins * io ) ;
NTSTATUS nbt_name_refresh_wins_recv ( struct composite_context * c , TALLOC_CTX * mem_ctx ,
struct nbt_name_refresh_wins * io ) ;
struct composite_context * nbt_name_refresh_wins_send ( struct nbt_name_socket * nbtsock ,
struct nbt_name_refresh_wins * io ) ;
NTSTATUS nbt_name_register_wins_recv ( struct composite_context * c , TALLOC_CTX * mem_ctx ,
struct nbt_name_register_wins * io ) ;
2005-12-28 18:38:36 +03:00
# endif /* __LIBNBT_H__ */