2005-04-03 08:32:37 +04:00
/*
Unix SMB / CIFS implementation .
a raw async NBT DGRAM 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
the Free Software Foundation ; either version 2 of the License , or
( 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
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "librpc/gen_ndr/ndr_nbt.h"
2005-04-05 12:35:02 +04:00
/*
2005-05-10 05:59:00 +04:00
a datagram name request
2005-04-05 12:35:02 +04:00
*/
struct nbt_dgram_request {
struct nbt_dgram_request * next , * prev ;
/* where to send the request */
2005-10-14 16:22:15 +04:00
struct nbt_peer_socket dest ;
2005-04-05 12:35:02 +04:00
/* the encoded request */
DATA_BLOB encoded ;
} ;
2005-04-03 08:32:37 +04:00
/*
context structure for operations on dgram packets
*/
struct nbt_dgram_socket {
struct socket_context * sock ;
struct event_context * event_ctx ;
/* the fd event */
struct fd_event * fde ;
2005-04-05 12:35:02 +04:00
/* a queue of outgoing requests */
struct nbt_dgram_request * send_queue ;
/* a list of mailslot handlers */
struct dgram_mailslot_handler * mailslot_handlers ;
2005-04-03 08:32:37 +04:00
/* what to do with incoming request packets */
struct {
void ( * handler ) ( struct nbt_dgram_socket * , struct nbt_dgram_packet * ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * src ) ;
2005-04-03 08:32:37 +04:00
void * private ;
} incoming ;
} ;
2005-04-05 12:35:02 +04:00
/*
the mailslot code keeps a list of mailslot handlers . A mailslot
handler is a function that receives incoming packets for a specific
mailslot name . When a caller needs to send a mailslot and wants to
get a reply then it needs to register itself as listening for
incoming packets on the reply mailslot
*/
typedef void ( * dgram_mailslot_handler_t ) ( struct dgram_mailslot_handler * ,
struct nbt_dgram_packet * ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * src ) ;
2005-04-05 12:35:02 +04:00
struct dgram_mailslot_handler {
struct dgram_mailslot_handler * next , * prev ;
struct nbt_dgram_socket * dgmsock ;
const char * mailslot_name ;
dgram_mailslot_handler_t handler ;
void * private ;
} ;
/* prototypes */
NTSTATUS nbt_dgram_send ( struct nbt_dgram_socket * dgmsock ,
struct nbt_dgram_packet * packet ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * dest ) ;
2005-04-05 12:35:02 +04:00
NTSTATUS dgram_set_incoming_handler ( struct nbt_dgram_socket * dgmsock ,
void ( * handler ) ( struct nbt_dgram_socket * ,
struct nbt_dgram_packet * ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * ) ,
2005-04-05 12:35:02 +04:00
void * private ) ;
struct nbt_dgram_socket * nbt_dgram_socket_init ( TALLOC_CTX * mem_ctx ,
struct event_context * event_ctx ) ;
const char * dgram_mailslot_name ( struct nbt_dgram_packet * packet ) ;
struct dgram_mailslot_handler * dgram_mailslot_find ( struct nbt_dgram_socket * dgmsock ,
const char * mailslot_name ) ;
struct dgram_mailslot_handler * dgram_mailslot_listen ( struct nbt_dgram_socket * dgmsock ,
const char * mailslot_name ,
dgram_mailslot_handler_t handler ,
void * private ) ;
struct dgram_mailslot_handler * dgram_mailslot_temp ( struct nbt_dgram_socket * dgmsock ,
const char * mailslot_name ,
dgram_mailslot_handler_t handler ,
void * private ) ;
2005-04-13 09:50:02 +04:00
DATA_BLOB dgram_mailslot_data ( struct nbt_dgram_packet * dgram ) ;
2005-04-05 12:35:02 +04:00
2005-04-06 15:17:08 +04:00
NTSTATUS dgram_mailslot_send ( struct nbt_dgram_socket * dgmsock ,
enum dgram_msg_type msg_type ,
const char * mailslot_name ,
struct nbt_name * dest_name ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * dest ,
2005-04-06 15:17:08 +04:00
struct nbt_name * src_name ,
DATA_BLOB * request ) ;
NTSTATUS dgram_mailslot_netlogon_send ( struct nbt_dgram_socket * dgmsock ,
struct nbt_name * dest_name ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * dest ,
2005-04-06 15:17:08 +04:00
struct nbt_name * src_name ,
struct nbt_netlogon_packet * request ) ;
2005-04-11 03:09:38 +04:00
NTSTATUS dgram_mailslot_netlogon_reply ( struct nbt_dgram_socket * dgmsock ,
struct nbt_dgram_packet * request ,
const char * mailslot_name ,
struct nbt_netlogon_packet * reply ) ;
2005-04-08 09:34:13 +04:00
NTSTATUS dgram_mailslot_netlogon_parse ( struct dgram_mailslot_handler * dgmslot ,
TALLOC_CTX * mem_ctx ,
struct nbt_dgram_packet * dgram ,
struct nbt_netlogon_packet * netlogon ) ;
2005-04-13 09:07:04 +04:00
NTSTATUS dgram_mailslot_ntlogon_send ( struct nbt_dgram_socket * dgmsock ,
2005-09-26 01:01:56 +04:00
enum dgram_msg_type msg_type ,
2005-04-13 09:07:04 +04:00
struct nbt_name * dest_name ,
2005-10-14 16:22:15 +04:00
const struct nbt_peer_socket * dest ,
2005-04-13 09:07:04 +04:00
struct nbt_name * src_name ,
struct nbt_ntlogon_packet * request ) ;
NTSTATUS dgram_mailslot_ntlogon_reply ( struct nbt_dgram_socket * dgmsock ,
struct nbt_dgram_packet * request ,
const char * mailslot_name ,
struct nbt_ntlogon_packet * reply ) ;
NTSTATUS dgram_mailslot_ntlogon_parse ( struct dgram_mailslot_handler * dgmslot ,
TALLOC_CTX * mem_ctx ,
struct nbt_dgram_packet * dgram ,
struct nbt_ntlogon_packet * ntlogon ) ;