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"
2005-01-21 09:54:10 +03:00
/*
possible states for pending requests
*/
enum nbt_request_state { NBT_REQUEST_SEND ,
NBT_REQUEST_WAIT ,
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 */
struct timed_event * te ;
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 ;
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 * ) ;
void * private ;
} async ;
2005-01-21 09:54:10 +03:00
} ;
/*
context structure for operations on name queries
*/
struct nbt_name_socket {
struct socket_context * sock ;
struct event_context * event_ctx ;
/* a queue of requests pending to be sent */
struct nbt_name_request * send_queue ;
/* the fd event */
struct fd_event * fde ;
/* 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 {
void ( * handler ) ( struct nbt_name_socket * , struct nbt_name_packet * ,
2006-01-10 01:12:53 +03:00
struct socket_address * ) ;
2005-01-30 13:24:36 +03:00
void * private ;
} incoming ;
2005-02-08 04:05:41 +03:00
/* what to do with unexpected replies */
struct {
void ( * handler ) ( struct nbt_name_socket * , struct nbt_name_packet * ,
2006-01-10 01:12:53 +03:00
struct socket_address * ) ;
2005-02-08 04:05:41 +03:00
void * private ;
} 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 ;
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 ;
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 ;
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 ;
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 ;
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 ;
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
# include "libcli/nbt/nbt_proto.h"
# endif /* __LIBNBT_H__ */