mirror of
https://github.com/samba-team/samba.git
synced 2025-02-24 13:57:43 +03:00
r10997: r11980@SERNOX (orig r10037): metze | 2005-09-05 14:21:40 +0200
add struct nbt_peer_socket and use it instead of passing const char *addr, uint16 port everyhwere (tridge: can you review this please, (make test works) metze (This used to be commit a599d7a4ae881c94be2c2d908a398838549942bb)
This commit is contained in:
parent
0b0c38d899
commit
fccbbf3546
@ -246,6 +246,8 @@ struct nbt_name_refresh_wins;
|
||||
struct nbt_name_register_wins;
|
||||
struct nbt_name_request;
|
||||
|
||||
struct nbt_peer_socket;
|
||||
|
||||
struct nbt_dgram_packet;
|
||||
struct nbt_dgram_socket;
|
||||
struct dgram_mailslot_handler;
|
||||
|
@ -29,7 +29,7 @@
|
||||
#include "librpc/gen_ndr/ndr_nbt.h"
|
||||
|
||||
NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock,
|
||||
struct nbt_name *dest_name, const char *dest_address, int dest_port,
|
||||
struct nbt_name *dest_name, const struct nbt_peer_socket *dest,
|
||||
struct nbt_name *src_name, struct nbt_browse_packet *request)
|
||||
{
|
||||
NTSTATUS status;
|
||||
@ -45,7 +45,7 @@ NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock,
|
||||
|
||||
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
|
||||
NBT_MAILSLOT_BROWSE,
|
||||
dest_name, dest_address, dest_port,
|
||||
dest_name, dest,
|
||||
src_name, &blob);
|
||||
talloc_free(tmp_ctx);
|
||||
return status;
|
||||
@ -59,6 +59,7 @@ NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock,
|
||||
DATA_BLOB blob;
|
||||
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
|
||||
struct nbt_name myname;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
status = ndr_push_struct_blob(&blob, tmp_ctx, reply,
|
||||
(ndr_push_flags_fn_t)ndr_push_nbt_browse_packet);
|
||||
@ -69,10 +70,12 @@ NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock,
|
||||
|
||||
make_nbt_name_client(&myname, lp_netbios_name());
|
||||
|
||||
dest.port = request->src_port;
|
||||
dest.addr = request->src_addr;
|
||||
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
|
||||
mailslot_name,
|
||||
&request->data.msg.source_name,
|
||||
request->source, request->src_port,
|
||||
&dest,
|
||||
&myname, &blob);
|
||||
talloc_free(tmp_ctx);
|
||||
return status;
|
||||
|
@ -35,8 +35,7 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
|
||||
{
|
||||
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
|
||||
NTSTATUS status;
|
||||
const char *src_addr;
|
||||
int src_port;
|
||||
struct nbt_peer_socket src;
|
||||
DATA_BLOB blob;
|
||||
size_t nread, dsize;
|
||||
struct nbt_dgram_packet *packet;
|
||||
@ -55,16 +54,16 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
|
||||
}
|
||||
|
||||
status = socket_recvfrom(dgmsock->sock, blob.data, blob.length, &nread, 0,
|
||||
&src_addr, &src_port);
|
||||
&src.addr, &src.port);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
talloc_free(tmp_ctx);
|
||||
return;
|
||||
}
|
||||
talloc_steal(tmp_ctx, src_addr);
|
||||
talloc_steal(tmp_ctx, src.addr);
|
||||
blob.length = nread;
|
||||
|
||||
DEBUG(2,("Received dgram packet of length %d from %s:%d\n",
|
||||
(int)blob.length, src_addr, src_port));
|
||||
(int)blob.length, src.addr, src.port));
|
||||
|
||||
packet = talloc(tmp_ctx, struct nbt_dgram_packet);
|
||||
if (packet == NULL) {
|
||||
@ -88,14 +87,14 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
|
||||
struct dgram_mailslot_handler *dgmslot;
|
||||
dgmslot = dgram_mailslot_find(dgmsock, mailslot_name);
|
||||
if (dgmslot) {
|
||||
dgmslot->handler(dgmslot, packet, src_addr, src_port);
|
||||
dgmslot->handler(dgmslot, packet, &src);
|
||||
} else {
|
||||
DEBUG(2,("No mailslot handler for '%s'\n", mailslot_name));
|
||||
}
|
||||
} else {
|
||||
/* dispatch if there is a general handler */
|
||||
if (dgmsock->incoming.handler) {
|
||||
dgmsock->incoming.handler(dgmsock, packet, src_addr, src_port);
|
||||
dgmsock->incoming.handler(dgmsock, packet, &src);
|
||||
}
|
||||
}
|
||||
|
||||
@ -116,10 +115,10 @@ static void dgm_socket_send(struct nbt_dgram_socket *dgmsock)
|
||||
|
||||
len = req->encoded.length;
|
||||
status = socket_sendto(dgmsock->sock, &req->encoded, &len, 0,
|
||||
req->dest_addr, req->dest_port);
|
||||
req->dest.addr, req->dest.port);
|
||||
if (NT_STATUS_IS_ERR(status)) {
|
||||
DEBUG(3,("Failed to send datagram of length %u to %s:%d\n",
|
||||
(unsigned)req->encoded.length, req->dest_addr, req->dest_port));
|
||||
(unsigned)req->encoded.length, req->dest.addr, req->dest.port));
|
||||
DLIST_REMOVE(dgmsock->send_queue, req);
|
||||
talloc_free(req);
|
||||
continue;
|
||||
@ -201,7 +200,7 @@ failed:
|
||||
NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
|
||||
void (*handler)(struct nbt_dgram_socket *,
|
||||
struct nbt_dgram_packet *,
|
||||
const char *, int ),
|
||||
const struct nbt_peer_socket *),
|
||||
void *private)
|
||||
{
|
||||
dgmsock->incoming.handler = handler;
|
||||
@ -216,8 +215,7 @@ NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
|
||||
*/
|
||||
NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
|
||||
struct nbt_dgram_packet *packet,
|
||||
const char *dest_addr,
|
||||
int dest_port)
|
||||
const struct nbt_peer_socket *dest)
|
||||
{
|
||||
struct nbt_dgram_request *req;
|
||||
NTSTATUS status = NT_STATUS_NO_MEMORY;
|
||||
@ -225,9 +223,9 @@ NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
|
||||
req = talloc(dgmsock, struct nbt_dgram_request);
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
req->dest_addr = talloc_strdup(req, dest_addr);
|
||||
if (req->dest_addr == NULL) goto failed;
|
||||
req->dest_port = dest_port;
|
||||
req->dest.port = dest->port;
|
||||
req->dest.addr = talloc_strdup(req, dest->addr);
|
||||
if (req->dest.addr == NULL) goto failed;
|
||||
|
||||
status = ndr_push_struct_blob(&req->encoded, req, packet,
|
||||
(ndr_push_flags_fn_t)ndr_push_nbt_dgram_packet);
|
||||
|
@ -22,7 +22,6 @@
|
||||
|
||||
#include "librpc/gen_ndr/ndr_nbt.h"
|
||||
|
||||
|
||||
/*
|
||||
a datagram name request
|
||||
*/
|
||||
@ -30,8 +29,7 @@ struct nbt_dgram_request {
|
||||
struct nbt_dgram_request *next, *prev;
|
||||
|
||||
/* where to send the request */
|
||||
const char *dest_addr;
|
||||
int dest_port;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
/* the encoded request */
|
||||
DATA_BLOB encoded;
|
||||
@ -56,7 +54,7 @@ struct nbt_dgram_socket {
|
||||
/* what to do with incoming request packets */
|
||||
struct {
|
||||
void (*handler)(struct nbt_dgram_socket *, struct nbt_dgram_packet *,
|
||||
const char *, int );
|
||||
const struct nbt_peer_socket *src);
|
||||
void *private;
|
||||
} incoming;
|
||||
};
|
||||
@ -72,7 +70,7 @@ struct nbt_dgram_socket {
|
||||
|
||||
typedef void (*dgram_mailslot_handler_t)(struct dgram_mailslot_handler *,
|
||||
struct nbt_dgram_packet *,
|
||||
const char *, int );
|
||||
const struct nbt_peer_socket *src);
|
||||
|
||||
struct dgram_mailslot_handler {
|
||||
struct dgram_mailslot_handler *next, *prev;
|
||||
@ -88,12 +86,11 @@ struct dgram_mailslot_handler {
|
||||
/* prototypes */
|
||||
NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
|
||||
struct nbt_dgram_packet *packet,
|
||||
const char *dest_addr,
|
||||
int dest_port);
|
||||
const struct nbt_peer_socket *dest);
|
||||
NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
|
||||
void (*handler)(struct nbt_dgram_socket *,
|
||||
struct nbt_dgram_packet *,
|
||||
const char *, int ),
|
||||
const struct nbt_peer_socket *),
|
||||
void *private);
|
||||
struct nbt_dgram_socket *nbt_dgram_socket_init(TALLOC_CTX *mem_ctx,
|
||||
struct event_context *event_ctx);
|
||||
@ -116,15 +113,13 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
|
||||
enum dgram_msg_type msg_type,
|
||||
const char *mailslot_name,
|
||||
struct nbt_name *dest_name,
|
||||
const char *dest_address,
|
||||
int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name *src_name,
|
||||
DATA_BLOB *request);
|
||||
|
||||
NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
|
||||
struct nbt_name *dest_name,
|
||||
const char *dest_address,
|
||||
int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name *src_name,
|
||||
struct nbt_netlogon_packet *request);
|
||||
NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
|
||||
@ -139,8 +134,7 @@ NTSTATUS dgram_mailslot_netlogon_parse(struct dgram_mailslot_handler *dgmslot,
|
||||
NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
|
||||
enum dgram_msg_type msg_type,
|
||||
struct nbt_name *dest_name,
|
||||
const char *dest_address,
|
||||
int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name *src_name,
|
||||
struct nbt_ntlogon_packet *request);
|
||||
NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
|
||||
|
@ -152,27 +152,27 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
|
||||
enum dgram_msg_type msg_type,
|
||||
const char *mailslot_name,
|
||||
struct nbt_name *dest_name,
|
||||
const char *dest_address,
|
||||
int dest_port,
|
||||
const struct nbt_peer_socket *_dest,
|
||||
struct nbt_name *src_name,
|
||||
DATA_BLOB *request)
|
||||
{
|
||||
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
|
||||
struct nbt_dgram_packet packet;
|
||||
struct nbt_peer_socket dest = *_dest;
|
||||
struct dgram_message *msg;
|
||||
struct dgram_smb_packet *smb;
|
||||
struct smb_trans_body *trans;
|
||||
NTSTATUS status;
|
||||
|
||||
if (dest_port == 0) {
|
||||
dest_port = lp_dgram_port();
|
||||
if (dest.port == 0) {
|
||||
dest.port = lp_dgram_port();
|
||||
}
|
||||
|
||||
ZERO_STRUCT(packet);
|
||||
packet.msg_type = msg_type;
|
||||
packet.flags = DGRAM_FLAG_FIRST | DGRAM_NODE_NBDD;
|
||||
packet.dgram_id = generate_random() % UINT16_MAX;
|
||||
packet.source = socket_get_my_addr(dgmsock->sock, tmp_ctx);
|
||||
packet.src_addr = socket_get_my_addr(dgmsock->sock, tmp_ctx);
|
||||
packet.src_port = socket_get_my_port(dgmsock->sock);
|
||||
|
||||
msg = &packet.data.msg;
|
||||
@ -199,7 +199,7 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
|
||||
trans->mailslot_name = mailslot_name;
|
||||
trans->data = *request;
|
||||
|
||||
status = nbt_dgram_send(dgmsock, &packet, dest_address, dest_port);
|
||||
status = nbt_dgram_send(dgmsock, &packet, &dest);
|
||||
|
||||
talloc_free(tmp_ctx);
|
||||
|
||||
|
@ -33,8 +33,7 @@
|
||||
*/
|
||||
NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
|
||||
struct nbt_name *dest_name,
|
||||
const char *dest_address,
|
||||
int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name *src_name,
|
||||
struct nbt_netlogon_packet *request)
|
||||
{
|
||||
@ -52,7 +51,7 @@ NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
|
||||
|
||||
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
|
||||
NBT_MAILSLOT_NETLOGON,
|
||||
dest_name, dest_address, dest_port,
|
||||
dest_name, dest,
|
||||
src_name, &blob);
|
||||
talloc_free(tmp_ctx);
|
||||
return status;
|
||||
@ -71,6 +70,7 @@ NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
|
||||
DATA_BLOB blob;
|
||||
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
|
||||
struct nbt_name myname;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
status = ndr_push_struct_blob(&blob, tmp_ctx, reply,
|
||||
(ndr_push_flags_fn_t)ndr_push_nbt_netlogon_packet);
|
||||
@ -81,10 +81,12 @@ NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
|
||||
|
||||
make_nbt_name_client(&myname, lp_netbios_name());
|
||||
|
||||
dest.port = request->src_port;
|
||||
dest.addr = request->src_addr;
|
||||
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
|
||||
mailslot_name,
|
||||
&request->data.msg.source_name,
|
||||
request->source, request->src_port,
|
||||
&dest,
|
||||
&myname, &blob);
|
||||
talloc_free(tmp_ctx);
|
||||
return status;
|
||||
|
@ -34,8 +34,7 @@
|
||||
NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
|
||||
enum dgram_msg_type msg_type,
|
||||
struct nbt_name *dest_name,
|
||||
const char *dest_address,
|
||||
int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name *src_name,
|
||||
struct nbt_ntlogon_packet *request)
|
||||
{
|
||||
@ -53,7 +52,7 @@ NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
|
||||
|
||||
status = dgram_mailslot_send(dgmsock, msg_type,
|
||||
NBT_MAILSLOT_NTLOGON,
|
||||
dest_name, dest_address, dest_port,
|
||||
dest_name, dest,
|
||||
src_name, &blob);
|
||||
talloc_free(tmp_ctx);
|
||||
return status;
|
||||
@ -72,6 +71,7 @@ NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
|
||||
DATA_BLOB blob;
|
||||
TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
|
||||
struct nbt_name myname;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
status = ndr_push_struct_blob(&blob, tmp_ctx, reply,
|
||||
(ndr_push_flags_fn_t)ndr_push_nbt_ntlogon_packet);
|
||||
@ -82,10 +82,12 @@ NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
|
||||
|
||||
make_nbt_name_client(&myname, lp_netbios_name());
|
||||
|
||||
dest.port = request->src_port;
|
||||
dest.addr = request->src_addr;
|
||||
status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE,
|
||||
mailslot_name,
|
||||
&request->data.msg.source_name,
|
||||
request->source, request->src_port,
|
||||
&dest,
|
||||
&myname, &blob);
|
||||
talloc_free(tmp_ctx);
|
||||
return status;
|
||||
|
@ -31,6 +31,12 @@ enum nbt_request_state {NBT_REQUEST_SEND,
|
||||
NBT_REQUEST_TIMEOUT,
|
||||
NBT_REQUEST_ERROR};
|
||||
|
||||
/* where to send the request/replies */
|
||||
struct nbt_peer_socket {
|
||||
const char *addr;
|
||||
int port;
|
||||
};
|
||||
|
||||
/*
|
||||
a nbt name request
|
||||
*/
|
||||
@ -45,8 +51,7 @@ struct nbt_name_request {
|
||||
struct nbt_name_socket *nbtsock;
|
||||
|
||||
/* where to send the request */
|
||||
const char *dest_addr;
|
||||
int dest_port;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
/* timeout between retries */
|
||||
int timeout;
|
||||
@ -75,8 +80,7 @@ struct nbt_name_request {
|
||||
uint_t num_replies;
|
||||
struct nbt_name_reply {
|
||||
struct nbt_name_packet *packet;
|
||||
const char *reply_addr;
|
||||
int reply_port;
|
||||
struct nbt_peer_socket dest;
|
||||
} *replies;
|
||||
|
||||
/* information on what to do on completion */
|
||||
@ -110,14 +114,14 @@ struct nbt_name_socket {
|
||||
/* what to do with incoming request packets */
|
||||
struct {
|
||||
void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
|
||||
const char *, int );
|
||||
const struct nbt_peer_socket *);
|
||||
void *private;
|
||||
} incoming;
|
||||
|
||||
/* what to do with unexpected replies */
|
||||
struct {
|
||||
void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
|
||||
const char *, int );
|
||||
const struct nbt_peer_socket *);
|
||||
void *private;
|
||||
} unexpected;
|
||||
};
|
||||
|
@ -31,6 +31,7 @@ struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock,
|
||||
{
|
||||
struct nbt_name_request *req;
|
||||
struct nbt_name_packet *packet;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
packet = talloc_zero(nbtsock, struct nbt_name_packet);
|
||||
if (packet == NULL) return NULL;
|
||||
@ -50,8 +51,10 @@ struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock,
|
||||
packet->questions[0].name = io->in.name;
|
||||
packet->questions[0].question_type = NBT_QTYPE_NETBIOS;
|
||||
packet->questions[0].question_class = NBT_QCLASS_IP;
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
|
||||
dest.port = lp_nbt_port();
|
||||
dest.addr = io->in.dest_addr;
|
||||
req = nbt_name_request_send(nbtsock, &dest, packet,
|
||||
io->in.timeout, io->in.retries, False);
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
@ -81,7 +84,7 @@ NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
|
||||
}
|
||||
|
||||
packet = req->replies[0].packet;
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
|
||||
|
||||
if ((packet->operation & NBT_RCODE) != 0) {
|
||||
status = nbt_rcode_to_ntstatus(packet->operation & NBT_RCODE);
|
||||
@ -137,6 +140,7 @@ struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock,
|
||||
{
|
||||
struct nbt_name_request *req;
|
||||
struct nbt_name_packet *packet;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
packet = talloc_zero(nbtsock, struct nbt_name_packet);
|
||||
if (packet == NULL) return NULL;
|
||||
@ -150,8 +154,10 @@ struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock,
|
||||
packet->questions[0].name = io->in.name;
|
||||
packet->questions[0].question_type = NBT_QTYPE_STATUS;
|
||||
packet->questions[0].question_class = NBT_QCLASS_IP;
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
|
||||
dest.port = lp_nbt_port();
|
||||
dest.addr = io->in.dest_addr;
|
||||
req = nbt_name_request_send(nbtsock, &dest, packet,
|
||||
io->in.timeout, io->in.retries, False);
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
@ -181,7 +187,7 @@ NTSTATUS nbt_name_status_recv(struct nbt_name_request *req,
|
||||
}
|
||||
|
||||
packet = req->replies[0].packet;
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
|
||||
|
||||
if ((packet->operation & NBT_RCODE) != 0) {
|
||||
status = nbt_rcode_to_ntstatus(packet->operation & NBT_RCODE);
|
||||
|
@ -32,6 +32,7 @@ struct nbt_name_request *nbt_name_refresh_send(struct nbt_name_socket *nbtsock,
|
||||
{
|
||||
struct nbt_name_request *req;
|
||||
struct nbt_name_packet *packet;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
packet = talloc_zero(nbtsock, struct nbt_name_packet);
|
||||
if (packet == NULL) return NULL;
|
||||
@ -64,8 +65,10 @@ struct nbt_name_request *nbt_name_refresh_send(struct nbt_name_socket *nbtsock,
|
||||
packet->additional[0].rdata.netbios.addresses[0].nb_flags = io->in.nb_flags;
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr =
|
||||
talloc_strdup(packet->additional, io->in.address);
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
|
||||
dest.port = lp_nbt_port();
|
||||
dest.addr = io->in.dest_addr;
|
||||
req = nbt_name_request_send(nbtsock, &dest, packet,
|
||||
io->in.timeout, io->in.retries, False);
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
@ -94,7 +97,7 @@ NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
|
||||
}
|
||||
|
||||
packet = req->replies[0].packet;
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
|
||||
|
||||
if (packet->ancount != 1 ||
|
||||
packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
|
||||
|
@ -32,6 +32,7 @@ struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock,
|
||||
{
|
||||
struct nbt_name_request *req;
|
||||
struct nbt_name_packet *packet;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
packet = talloc_zero(nbtsock, struct nbt_name_packet);
|
||||
if (packet == NULL) return NULL;
|
||||
@ -72,8 +73,10 @@ struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock,
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr =
|
||||
talloc_strdup(packet->additional, io->in.address);
|
||||
if (packet->additional[0].rdata.netbios.addresses[0].ipaddr == NULL) goto failed;
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
|
||||
dest.port = lp_nbt_port();
|
||||
dest.addr = io->in.dest_addr;
|
||||
req = nbt_name_request_send(nbtsock, &dest, packet,
|
||||
io->in.timeout, io->in.retries, False);
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
@ -102,7 +105,7 @@ NTSTATUS nbt_name_register_recv(struct nbt_name_request *req,
|
||||
}
|
||||
|
||||
packet = req->replies[0].packet;
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
|
||||
|
||||
if (packet->ancount != 1 ||
|
||||
packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
|
||||
|
@ -31,6 +31,7 @@ struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
|
||||
{
|
||||
struct nbt_name_request *req;
|
||||
struct nbt_name_packet *packet;
|
||||
struct nbt_peer_socket dest;
|
||||
|
||||
packet = talloc_zero(nbtsock, struct nbt_name_packet);
|
||||
if (packet == NULL) return NULL;
|
||||
@ -63,8 +64,10 @@ struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
|
||||
packet->additional[0].rdata.netbios.addresses[0].nb_flags = io->in.nb_flags;
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr =
|
||||
talloc_strdup(packet->additional, io->in.address);
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
|
||||
dest.port = lp_nbt_port();
|
||||
dest.addr = io->in.dest_addr;
|
||||
req = nbt_name_request_send(nbtsock, &dest, packet,
|
||||
io->in.timeout, io->in.retries, False);
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
@ -93,7 +96,7 @@ NTSTATUS nbt_name_release_recv(struct nbt_name_request *req,
|
||||
}
|
||||
|
||||
packet = req->replies[0].packet;
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
|
||||
io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
|
||||
|
||||
if (packet->ancount != 1 ||
|
||||
packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
|
||||
|
@ -73,7 +73,7 @@ static void nbt_name_socket_send(struct nbt_name_socket *nbtsock)
|
||||
|
||||
len = req->encoded.length;
|
||||
status = socket_sendto(nbtsock->sock, &req->encoded, &len, 0,
|
||||
req->dest_addr, req->dest_port);
|
||||
req->dest.addr, req->dest.port);
|
||||
if (NT_STATUS_IS_ERR(status)) goto failed;
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
@ -153,8 +153,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
|
||||
{
|
||||
TALLOC_CTX *tmp_ctx = talloc_new(nbtsock);
|
||||
NTSTATUS status;
|
||||
const char *src_addr;
|
||||
int src_port;
|
||||
struct nbt_peer_socket src;
|
||||
DATA_BLOB blob;
|
||||
size_t nread, dsize;
|
||||
struct nbt_name_packet *packet;
|
||||
@ -173,12 +172,12 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
|
||||
}
|
||||
|
||||
status = socket_recvfrom(nbtsock->sock, blob.data, blob.length, &nread, 0,
|
||||
&src_addr, &src_port);
|
||||
&src.addr, &src.port);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
talloc_free(tmp_ctx);
|
||||
return;
|
||||
}
|
||||
talloc_steal(tmp_ctx, src_addr);
|
||||
talloc_steal(tmp_ctx, src.addr);
|
||||
blob.length = nread;
|
||||
|
||||
packet = talloc(tmp_ctx, struct nbt_name_packet);
|
||||
@ -199,7 +198,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
|
||||
|
||||
if (DEBUGLVL(10)) {
|
||||
DEBUG(10,("Received nbt packet of length %d from %s:%d\n",
|
||||
(int)blob.length, src_addr, src_port));
|
||||
(int)blob.length, src.addr, src.port));
|
||||
NDR_PRINT_DEBUG(nbt_name_packet, packet);
|
||||
}
|
||||
|
||||
@ -207,7 +206,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
|
||||
handler, if any */
|
||||
if (!(packet->operation & NBT_FLAG_REPLY)) {
|
||||
if (nbtsock->incoming.handler) {
|
||||
nbtsock->incoming.handler(nbtsock, packet, src_addr, src_port);
|
||||
nbtsock->incoming.handler(nbtsock, packet, &src);
|
||||
}
|
||||
talloc_free(tmp_ctx);
|
||||
return;
|
||||
@ -217,7 +216,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
|
||||
req = idr_find(nbtsock->idr, packet->name_trn_id);
|
||||
if (req == NULL) {
|
||||
if (nbtsock->unexpected.handler) {
|
||||
nbtsock->unexpected.handler(nbtsock, packet, src_addr, src_port);
|
||||
nbtsock->unexpected.handler(nbtsock, packet, &src);
|
||||
} else {
|
||||
DEBUG(2,("Failed to match request for incoming name packet id 0x%04x on %p\n",
|
||||
packet->name_trn_id, nbtsock));
|
||||
@ -259,8 +258,8 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
|
||||
goto done;
|
||||
}
|
||||
|
||||
req->replies[req->num_replies].reply_addr = talloc_steal(req, src_addr);
|
||||
req->replies[req->num_replies].reply_port = src_port;
|
||||
req->replies[req->num_replies].dest.addr = talloc_steal(req, src.addr);
|
||||
req->replies[req->num_replies].dest.port = src.port;
|
||||
req->replies[req->num_replies].packet = talloc_steal(req, packet);
|
||||
req->num_replies++;
|
||||
|
||||
@ -349,7 +348,7 @@ failed:
|
||||
send off a nbt name request
|
||||
*/
|
||||
struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
|
||||
const char *dest_addr, int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name_packet *request,
|
||||
int timeout, int retries,
|
||||
BOOL allow_multiple_replies)
|
||||
@ -362,14 +361,14 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
|
||||
if (req == NULL) goto failed;
|
||||
|
||||
req->nbtsock = nbtsock;
|
||||
req->dest_port = dest_port;
|
||||
req->allow_multiple_replies = allow_multiple_replies;
|
||||
req->state = NBT_REQUEST_SEND;
|
||||
req->is_reply = False;
|
||||
req->timeout = timeout;
|
||||
req->num_retries = retries;
|
||||
req->dest_addr = talloc_strdup(req, dest_addr);
|
||||
if (req->dest_addr == NULL) goto failed;
|
||||
req->dest.port = dest->port;
|
||||
req->dest.addr = talloc_strdup(req, dest->addr);
|
||||
if (req->dest.addr == NULL) goto failed;
|
||||
|
||||
/* we select a random transaction id unless the user supplied one */
|
||||
if (request->name_trn_id == 0) {
|
||||
@ -398,7 +397,7 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
|
||||
|
||||
if (DEBUGLVL(10)) {
|
||||
DEBUG(10,("Queueing nbt packet to %s:%d\n",
|
||||
req->dest_addr, req->dest_port));
|
||||
req->dest.addr, req->dest.port));
|
||||
NDR_PRINT_DEBUG(nbt_name_packet, request);
|
||||
}
|
||||
|
||||
@ -416,7 +415,7 @@ failed:
|
||||
send off a nbt name reply
|
||||
*/
|
||||
NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
|
||||
const char *dest_addr, int dest_port,
|
||||
const struct nbt_peer_socket *dest,
|
||||
struct nbt_name_packet *request)
|
||||
{
|
||||
struct nbt_name_request *req;
|
||||
@ -426,9 +425,9 @@ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
|
||||
NT_STATUS_HAVE_NO_MEMORY(req);
|
||||
|
||||
req->nbtsock = nbtsock;
|
||||
req->dest_addr = talloc_strdup(req, dest_addr);
|
||||
if (req->dest_addr == NULL) goto failed;
|
||||
req->dest_port = dest_port;
|
||||
req->dest.port = dest->port;
|
||||
req->dest.addr = talloc_strdup(req, dest->addr);
|
||||
if (req->dest.addr == NULL) goto failed;
|
||||
req->state = NBT_REQUEST_SEND;
|
||||
req->is_reply = True;
|
||||
|
||||
@ -481,7 +480,7 @@ NTSTATUS nbt_name_request_recv(struct nbt_name_request *req)
|
||||
*/
|
||||
NTSTATUS nbt_set_incoming_handler(struct nbt_name_socket *nbtsock,
|
||||
void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
|
||||
const char *, int ),
|
||||
const struct nbt_peer_socket *),
|
||||
void *private)
|
||||
{
|
||||
nbtsock->incoming.handler = handler;
|
||||
|
@ -319,7 +319,7 @@
|
||||
dgram_msg_type msg_type;
|
||||
dgram_flags flags;
|
||||
uint16 dgram_id;
|
||||
ipv4address source;
|
||||
ipv4address src_addr;
|
||||
uint16 src_port;
|
||||
[switch_is(msg_type)] dgram_data data;
|
||||
} nbt_dgram_packet;
|
||||
|
@ -32,24 +32,24 @@
|
||||
*/
|
||||
void nbtd_request_defense(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_iface_name *iname;
|
||||
struct nbt_name *name;
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
|
||||
NBTD_ASSERT_PACKET(packet, src_address, packet->qdcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src_address, packet->arcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr, packet->qdcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src->addr, packet->arcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->questions[0].question_type == NBT_QTYPE_NETBIOS);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->questions[0].question_class == NBT_QCLASS_IP);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->additional[0].rr_type == NBT_QTYPE_NETBIOS);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->additional[0].rr_class == NBT_QCLASS_IP);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->additional[0].rdata.netbios.length == 6);
|
||||
|
||||
/* see if we have the requested name on this interface */
|
||||
@ -60,10 +60,9 @@ void nbtd_request_defense(struct nbt_name_socket *nbtsock,
|
||||
!IS_GROUP_NAME(name, iname->nb_flags)) {
|
||||
DEBUG(2,("Defending name %s on %s against %s\n",
|
||||
nbt_name_string(packet, name),
|
||||
iface->bcast_address, src_address));
|
||||
nbtd_name_registration_reply(nbtsock, packet,
|
||||
src_address, src_port, NBT_RCODE_ACT);
|
||||
iface->bcast_address, src->addr));
|
||||
nbtd_name_registration_reply(nbtsock, packet, src, NBT_RCODE_ACT);
|
||||
} else {
|
||||
nbtd_winsserver_request(nbtsock, packet, src_address, src_port);
|
||||
nbtd_winsserver_request(nbtsock, packet, src);
|
||||
}
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
*/
|
||||
static void nbtd_request_handler(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -41,32 +41,32 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock,
|
||||
nbtsrv->stats.total_received++;
|
||||
|
||||
/* see if its from one of our own interfaces - if so, then ignore it */
|
||||
if (nbtd_self_packet(nbtsock, packet, src_address, src_port)) {
|
||||
DEBUG(10,("Ignoring self packet from %s:%d\n", src_address, src_port));
|
||||
if (nbtd_self_packet(nbtsock, packet, src)) {
|
||||
DEBUG(10,("Ignoring self packet from %s:%d\n", src->addr, src->port));
|
||||
return;
|
||||
}
|
||||
|
||||
switch (packet->operation & NBT_OPCODE) {
|
||||
case NBT_OPCODE_QUERY:
|
||||
nbtsrv->stats.query_count++;
|
||||
nbtd_request_query(nbtsock, packet, src_address, src_port);
|
||||
nbtd_request_query(nbtsock, packet, src);
|
||||
break;
|
||||
|
||||
case NBT_OPCODE_REGISTER:
|
||||
case NBT_OPCODE_REFRESH:
|
||||
case NBT_OPCODE_REFRESH2:
|
||||
nbtsrv->stats.register_count++;
|
||||
nbtd_request_defense(nbtsock, packet, src_address, src_port);
|
||||
nbtd_request_defense(nbtsock, packet, src);
|
||||
break;
|
||||
|
||||
case NBT_OPCODE_RELEASE:
|
||||
case NBT_OPCODE_MULTI_HOME_REG:
|
||||
nbtsrv->stats.release_count++;
|
||||
nbtd_winsserver_request(nbtsock, packet, src_address, src_port);
|
||||
nbtd_winsserver_request(nbtsock, packet, src);
|
||||
break;
|
||||
|
||||
default:
|
||||
nbtd_bad_packet(packet, src_address, "Unexpected opcode");
|
||||
nbtd_bad_packet(packet, src, "Unexpected opcode");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
*/
|
||||
static void nbtd_node_status_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *request_packet,
|
||||
const char *src_address, int src_port,
|
||||
const struct nbt_peer_socket *src,
|
||||
struct nbt_name *name,
|
||||
struct nbtd_interface *iface)
|
||||
{
|
||||
@ -84,10 +84,10 @@ static void nbtd_node_status_reply(struct nbt_name_socket *nbtsock,
|
||||
ZERO_STRUCT(packet->answers[0].rdata.status.statistics);
|
||||
|
||||
DEBUG(7,("Sending node status reply for %s to %s:%d\n",
|
||||
nbt_name_string(packet, name), src_address, src_port));
|
||||
nbt_name_string(packet, name), src->addr, src->port));
|
||||
|
||||
nbtsrv->stats.total_sent++;
|
||||
nbt_name_reply_send(nbtsock, src_address, src_port, packet);
|
||||
nbt_name_reply_send(nbtsock, src, packet);
|
||||
|
||||
failed:
|
||||
talloc_free(packet);
|
||||
@ -99,16 +99,16 @@ failed:
|
||||
*/
|
||||
void nbtd_query_status(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbt_name *name;
|
||||
struct nbtd_iface_name *iname;
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
|
||||
NBTD_ASSERT_PACKET(packet, src_address, packet->qdcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src_address, packet->questions[0].question_type == NBT_QTYPE_STATUS);
|
||||
NBTD_ASSERT_PACKET(packet, src_address, packet->questions[0].question_class == NBT_QCLASS_IP);
|
||||
NBTD_ASSERT_PACKET(packet, src->addr, packet->qdcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src->addr, packet->questions[0].question_type == NBT_QTYPE_STATUS);
|
||||
NBTD_ASSERT_PACKET(packet, src->addr, packet->questions[0].question_class == NBT_QCLASS_IP);
|
||||
|
||||
/* see if we have the requested name on this interface */
|
||||
name = &packet->questions[0].name;
|
||||
@ -116,10 +116,10 @@ void nbtd_query_status(struct nbt_name_socket *nbtsock,
|
||||
iname = nbtd_find_iname(iface, name, NBT_NM_ACTIVE);
|
||||
if (iname == NULL) {
|
||||
DEBUG(7,("Node status query for %s from %s - not found on %s\n",
|
||||
nbt_name_string(packet, name), src_address, iface->ip_address));
|
||||
nbt_name_string(packet, name), src->addr, iface->ip_address));
|
||||
return;
|
||||
}
|
||||
|
||||
nbtd_node_status_reply(nbtsock, packet, src_address, src_port,
|
||||
nbtd_node_status_reply(nbtsock, packet, src,
|
||||
&iname->name, iface);
|
||||
}
|
||||
|
@ -28,9 +28,9 @@
|
||||
we received a badly formed packet - log it
|
||||
*/
|
||||
void nbtd_bad_packet(struct nbt_name_packet *packet,
|
||||
const char *src_address, const char *reason)
|
||||
const struct nbt_peer_socket *src, const char *reason)
|
||||
{
|
||||
DEBUG(2,("nbtd: bad packet '%s' from %s\n", reason, src_address));
|
||||
DEBUG(2,("nbtd: bad packet '%s' from %s:%d\n", reason, src->addr, src->port));
|
||||
if (DEBUGLVL(5)) {
|
||||
NDR_PRINT_DEBUG(nbt_name_packet, packet);
|
||||
}
|
||||
@ -43,7 +43,7 @@ void nbtd_bad_packet(struct nbt_name_packet *packet,
|
||||
*/
|
||||
BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -55,7 +55,7 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
|
||||
}
|
||||
|
||||
/* if its not from the nbt port, then it wasn't a broadcast from us */
|
||||
if (src_port != lp_nbt_port()) {
|
||||
if (src->port != lp_nbt_port()) {
|
||||
return False;
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
|
||||
/* we have to loop over our interface list, seeing if its from
|
||||
one of our own interfaces */
|
||||
for (iface=nbtsrv->interfaces;iface;iface=iface->next) {
|
||||
if (strcmp(src_address, iface->ip_address) == 0) {
|
||||
if (strcmp(src->addr, iface->ip_address) == 0) {
|
||||
return True;
|
||||
}
|
||||
}
|
||||
@ -83,7 +83,7 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
|
||||
*/
|
||||
void nbtd_name_query_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *request_packet,
|
||||
const char *src_address, int src_port,
|
||||
const struct nbt_peer_socket *src,
|
||||
struct nbt_name *name, uint32_t ttl,
|
||||
uint16_t nb_flags, const char **addresses)
|
||||
{
|
||||
@ -132,10 +132,10 @@ void nbtd_name_query_reply(struct nbt_name_socket *nbtsock,
|
||||
}
|
||||
|
||||
DEBUG(7,("Sending name query reply for %s at %s to %s:%d\n",
|
||||
nbt_name_string(packet, name), addresses[0], src_address, src_port));
|
||||
nbt_name_string(packet, name), addresses[0], src->addr, src->port));
|
||||
|
||||
nbtsrv->stats.total_sent++;
|
||||
nbt_name_reply_send(nbtsock, src_address, src_port, packet);
|
||||
nbt_name_reply_send(nbtsock, src, packet);
|
||||
|
||||
failed:
|
||||
talloc_free(packet);
|
||||
@ -147,7 +147,7 @@ failed:
|
||||
*/
|
||||
void nbtd_negative_name_query_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *request_packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbt_name_packet *packet;
|
||||
struct nbt_name *name = &request_packet->questions[0].name;
|
||||
@ -176,10 +176,10 @@ void nbtd_negative_name_query_reply(struct nbt_name_socket *nbtsock,
|
||||
ZERO_STRUCT(packet->answers[0].rdata);
|
||||
|
||||
DEBUG(7,("Sending negative name query reply for %s to %s:%d\n",
|
||||
nbt_name_string(packet, name), src_address, src_port));
|
||||
nbt_name_string(packet, name), src->addr, src->port));
|
||||
|
||||
nbtsrv->stats.total_sent++;
|
||||
nbt_name_reply_send(nbtsock, src_address, src_port, packet);
|
||||
nbt_name_reply_send(nbtsock, src, packet);
|
||||
|
||||
failed:
|
||||
talloc_free(packet);
|
||||
@ -190,7 +190,7 @@ failed:
|
||||
*/
|
||||
void nbtd_name_registration_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *request_packet,
|
||||
const char *src_address, int src_port,
|
||||
const struct nbt_peer_socket *src,
|
||||
uint8_t rcode)
|
||||
{
|
||||
struct nbt_name_packet *packet;
|
||||
@ -223,10 +223,10 @@ void nbtd_name_registration_reply(struct nbt_name_socket *nbtsock,
|
||||
|
||||
DEBUG(7,("Sending %s name registration reply for %s to %s:%d\n",
|
||||
rcode==0?"positive":"negative",
|
||||
nbt_name_string(packet, name), src_address, src_port));
|
||||
nbt_name_string(packet, name), src->addr, src->port));
|
||||
|
||||
nbtsrv->stats.total_sent++;
|
||||
nbt_name_reply_send(nbtsock, src_address, src_port, packet);
|
||||
nbt_name_reply_send(nbtsock, src, packet);
|
||||
|
||||
failed:
|
||||
talloc_free(packet);
|
||||
@ -238,7 +238,7 @@ failed:
|
||||
*/
|
||||
void nbtd_name_release_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *request_packet,
|
||||
const char *src_address, int src_port,
|
||||
const struct nbt_peer_socket *src,
|
||||
uint8_t rcode)
|
||||
{
|
||||
struct nbt_name_packet *packet;
|
||||
@ -269,10 +269,10 @@ void nbtd_name_release_reply(struct nbt_name_socket *nbtsock,
|
||||
|
||||
DEBUG(7,("Sending %s name release reply for %s to %s:%d\n",
|
||||
rcode==0?"positive":"negative",
|
||||
nbt_name_string(packet, name), src_address, src_port));
|
||||
nbt_name_string(packet, name), src->addr, src->port));
|
||||
|
||||
nbtsrv->stats.total_sent++;
|
||||
nbt_name_reply_send(nbtsock, src_address, src_port, packet);
|
||||
nbt_name_reply_send(nbtsock, src, packet);
|
||||
|
||||
failed:
|
||||
talloc_free(packet);
|
||||
@ -284,7 +284,7 @@ failed:
|
||||
*/
|
||||
void nbtd_wack_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *request_packet,
|
||||
const char *src_address, int src_port,
|
||||
const struct nbt_peer_socket *src,
|
||||
uint32_t ttl)
|
||||
{
|
||||
struct nbt_name_packet *packet;
|
||||
@ -316,10 +316,10 @@ void nbtd_wack_reply(struct nbt_name_socket *nbtsock,
|
||||
RSSVAL(packet->answers[0].rdata.data.data, 0, request_packet->operation);
|
||||
|
||||
DEBUG(7,("Sending WACK reply for %s to %s:%d\n",
|
||||
nbt_name_string(packet, name), src_address, src_port));
|
||||
nbt_name_string(packet, name), src->addr, src->port));
|
||||
|
||||
nbtsrv->stats.total_sent++;
|
||||
nbt_name_reply_send(nbtsock, src_address, src_port, packet);
|
||||
nbt_name_reply_send(nbtsock, src, packet);
|
||||
|
||||
failed:
|
||||
talloc_free(packet);
|
||||
|
@ -31,7 +31,7 @@
|
||||
*/
|
||||
void nbtd_request_query(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_iface_name *iname;
|
||||
struct nbt_name *name;
|
||||
@ -41,14 +41,14 @@ void nbtd_request_query(struct nbt_name_socket *nbtsock,
|
||||
/* see if its a node status query */
|
||||
if (packet->qdcount == 1 &&
|
||||
packet->questions[0].question_type == NBT_QTYPE_STATUS) {
|
||||
nbtd_query_status(nbtsock, packet, src_address, src_port);
|
||||
nbtd_query_status(nbtsock, packet, src);
|
||||
return;
|
||||
}
|
||||
|
||||
NBTD_ASSERT_PACKET(packet, src_address, packet->qdcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr, packet->qdcount == 1);
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->questions[0].question_type == NBT_QTYPE_NETBIOS);
|
||||
NBTD_ASSERT_PACKET(packet, src_address,
|
||||
NBTD_ASSERT_PACKET(packet, src->addr,
|
||||
packet->questions[0].question_class == NBT_QCLASS_IP);
|
||||
|
||||
/* see if we have the requested name on this interface */
|
||||
@ -65,13 +65,12 @@ void nbtd_request_query(struct nbt_name_socket *nbtsock,
|
||||
/* if the name does not exist, then redirect to WINS
|
||||
server if recursion has been asked for */
|
||||
if (packet->operation & NBT_FLAG_RECURSION_DESIRED) {
|
||||
nbtd_winsserver_request(nbtsock, packet, src_address, src_port);
|
||||
nbtd_winsserver_request(nbtsock, packet, src);
|
||||
return;
|
||||
}
|
||||
|
||||
/* otherwise send a negative reply */
|
||||
nbtd_negative_name_query_reply(nbtsock, packet,
|
||||
src_address, src_port);
|
||||
nbtd_negative_name_query_reply(nbtsock, packet, src);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -80,11 +79,11 @@ void nbtd_request_query(struct nbt_name_socket *nbtsock,
|
||||
if (!(iname->nb_flags & NBT_NM_ACTIVE) &&
|
||||
(packet->operation & NBT_FLAG_BROADCAST)) {
|
||||
DEBUG(7,("Query for %s from %s - name not active yet on %s\n",
|
||||
nbt_name_string(packet, name), src_address, iface->ip_address));
|
||||
nbt_name_string(packet, name), src->addr, iface->ip_address));
|
||||
return;
|
||||
}
|
||||
|
||||
nbtd_name_query_reply(nbtsock, packet, src_address, src_port,
|
||||
nbtd_name_query_reply(nbtsock, packet, src,
|
||||
&iname->name, iname->ttl, iname->nb_flags,
|
||||
nbtd_address_list(iface, packet));
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ uint32_t wins_server_ttl(struct wins_server *winssrv, uint32_t ttl)
|
||||
*/
|
||||
static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -56,7 +56,7 @@ static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
|
||||
rec.nb_flags = nb_flags;
|
||||
rec.state = WINS_REC_ACTIVE;
|
||||
rec.expire_time = time(NULL) + ttl;
|
||||
rec.registered_by = src_address;
|
||||
rec.registered_by = src->addr;
|
||||
if (IS_GROUP_NAME(name, nb_flags)) {
|
||||
rec.addresses = str_list_make(packet, "255.255.255.255", NULL);
|
||||
} else {
|
||||
@ -77,7 +77,7 @@ static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
|
||||
static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
struct winsdb_record *rec,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -89,7 +89,7 @@ static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock,
|
||||
if (now + ttl > rec->expire_time) {
|
||||
rec->expire_time = now + ttl;
|
||||
}
|
||||
rec->registered_by = src_address;
|
||||
rec->registered_by = src->addr;
|
||||
|
||||
DEBUG(5,("WINS: refreshed registration of %s at %s\n",
|
||||
nbt_name_string(packet, rec->name), address));
|
||||
@ -102,7 +102,7 @@ static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock,
|
||||
*/
|
||||
static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -121,11 +121,11 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
|
||||
|
||||
rec = winsdb_load(winssrv, name, packet);
|
||||
if (rec == NULL) {
|
||||
rcode = wins_register_new(nbtsock, packet, src_address, src_port);
|
||||
rcode = wins_register_new(nbtsock, packet, src);
|
||||
goto done;
|
||||
} else if (rec->state != WINS_REC_ACTIVE) {
|
||||
winsdb_delete(winssrv, rec);
|
||||
rcode = wins_register_new(nbtsock, packet, src_address, src_port);
|
||||
rcode = wins_register_new(nbtsock, packet, src);
|
||||
goto done;
|
||||
}
|
||||
|
||||
@ -140,31 +140,31 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
|
||||
/* if its an active unique name, and the registration is for a group, then
|
||||
see if the unique name owner still wants the name */
|
||||
if (!(rec->nb_flags & NBT_NM_GROUP) && (nb_flags & NBT_NM_GROUP)) {
|
||||
wins_register_wack(nbtsock, packet, rec, src_address, src_port);
|
||||
wins_register_wack(nbtsock, packet, rec, src);
|
||||
return;
|
||||
}
|
||||
|
||||
/* if the registration is for a group, then just update the expiry time
|
||||
and we are done */
|
||||
if (IS_GROUP_NAME(name, nb_flags)) {
|
||||
wins_update_ttl(nbtsock, packet, rec, src_address, src_port);
|
||||
wins_update_ttl(nbtsock, packet, rec, src);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* if the registration is for an address that is currently active, then
|
||||
just update the expiry time */
|
||||
if (str_list_check(rec->addresses, address)) {
|
||||
wins_update_ttl(nbtsock, packet, rec, src_address, src_port);
|
||||
wins_update_ttl(nbtsock, packet, rec, src);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* we have to do a WACK to see if the current owner is willing
|
||||
to give up its claim */
|
||||
wins_register_wack(nbtsock, packet, rec, src_address, src_port);
|
||||
wins_register_wack(nbtsock, packet, rec, src);
|
||||
return;
|
||||
|
||||
done:
|
||||
nbtd_name_registration_reply(nbtsock, packet, src_address, src_port, rcode);
|
||||
nbtd_name_registration_reply(nbtsock, packet, src, rcode);
|
||||
}
|
||||
|
||||
|
||||
@ -174,7 +174,7 @@ done:
|
||||
*/
|
||||
static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -184,11 +184,11 @@ static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
|
||||
|
||||
rec = winsdb_load(winssrv, name, packet);
|
||||
if (rec == NULL || rec->state != WINS_REC_ACTIVE) {
|
||||
nbtd_negative_name_query_reply(nbtsock, packet, src_address, src_port);
|
||||
nbtd_negative_name_query_reply(nbtsock, packet, src);
|
||||
return;
|
||||
}
|
||||
|
||||
nbtd_name_query_reply(nbtsock, packet, src_address, src_port, name,
|
||||
nbtd_name_query_reply(nbtsock, packet, src, name,
|
||||
0, rec->nb_flags, rec->addresses);
|
||||
}
|
||||
|
||||
@ -197,7 +197,7 @@ static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
|
||||
*/
|
||||
static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -214,7 +214,7 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
|
||||
|
||||
/* we only allow releases from an owner - other releases are
|
||||
silently ignored */
|
||||
if (str_list_check(rec->addresses, src_address)) {
|
||||
if (str_list_check(rec->addresses, src->addr)) {
|
||||
const char *address = packet->additional[0].rdata.netbios.addresses[0].ipaddr;
|
||||
|
||||
DEBUG(4,("WINS: released name %s at %s\n", nbt_name_string(rec, rec->name), address));
|
||||
@ -227,7 +227,7 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
|
||||
|
||||
done:
|
||||
/* we match w2k3 by always giving a positive reply to name releases. */
|
||||
nbtd_name_release_reply(nbtsock, packet, src_address, src_port, NBT_RCODE_OK);
|
||||
nbtd_name_release_reply(nbtsock, packet, src, NBT_RCODE_OK);
|
||||
}
|
||||
|
||||
|
||||
@ -236,7 +236,7 @@ done:
|
||||
*/
|
||||
void nbtd_winsserver_request(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -247,18 +247,18 @@ void nbtd_winsserver_request(struct nbt_name_socket *nbtsock,
|
||||
|
||||
switch (packet->operation & NBT_OPCODE) {
|
||||
case NBT_OPCODE_QUERY:
|
||||
nbtd_winsserver_query(nbtsock, packet, src_address, src_port);
|
||||
nbtd_winsserver_query(nbtsock, packet, src);
|
||||
break;
|
||||
|
||||
case NBT_OPCODE_REGISTER:
|
||||
case NBT_OPCODE_REFRESH:
|
||||
case NBT_OPCODE_REFRESH2:
|
||||
case NBT_OPCODE_MULTI_HOME_REG:
|
||||
nbtd_winsserver_register(nbtsock, packet, src_address, src_port);
|
||||
nbtd_winsserver_register(nbtsock, packet, src);
|
||||
break;
|
||||
|
||||
case NBT_OPCODE_RELEASE:
|
||||
nbtd_winsserver_release(nbtsock, packet, src_address, src_port);
|
||||
nbtd_winsserver_release(nbtsock, packet, src);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -30,8 +30,7 @@ struct wack_state {
|
||||
struct nbt_name_socket *nbtsock;
|
||||
struct nbt_name_packet *request_packet;
|
||||
struct winsdb_record *rec;
|
||||
const char *src_address;
|
||||
int src_port;
|
||||
struct nbt_peer_socket src;
|
||||
const char **owner_addresses;
|
||||
const char *reg_address;
|
||||
struct nbt_name_query query;
|
||||
@ -44,9 +43,9 @@ struct wack_state {
|
||||
static void wins_wack_deny(struct wack_state *state)
|
||||
{
|
||||
nbtd_name_registration_reply(state->nbtsock, state->request_packet,
|
||||
state->src_address, state->src_port, NBT_RCODE_ACT);
|
||||
DEBUG(4,("WINS: denied name registration request for %s from %s\n",
|
||||
nbt_name_string(state, state->rec->name), state->src_address));
|
||||
&state->src, NBT_RCODE_ACT);
|
||||
DEBUG(4,("WINS: denied name registration request for %s from %s:%d\n",
|
||||
nbt_name_string(state, state->rec->name), state->src.addr, state->src.port));
|
||||
talloc_free(state);
|
||||
}
|
||||
|
||||
@ -68,7 +67,7 @@ static void wins_wack_allow(struct wack_state *state)
|
||||
}
|
||||
|
||||
nbtd_name_registration_reply(state->nbtsock, state->request_packet,
|
||||
state->src_address, state->src_port, NBT_RCODE_OK);
|
||||
&state->src, NBT_RCODE_OK);
|
||||
|
||||
rec->addresses = str_list_add(rec->addresses, state->reg_address);
|
||||
if (rec->addresses == NULL) goto failed;
|
||||
@ -77,7 +76,7 @@ static void wins_wack_allow(struct wack_state *state)
|
||||
if (now + ttl > rec->expire_time) {
|
||||
rec->expire_time = now + ttl;
|
||||
}
|
||||
rec->registered_by = state->src_address;
|
||||
rec->registered_by = state->src.addr;
|
||||
|
||||
winsdb_modify(state->winssrv, rec);
|
||||
|
||||
@ -158,7 +157,7 @@ failed:
|
||||
void wins_register_wack(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_name_packet *packet,
|
||||
struct winsdb_record *rec,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
|
||||
struct nbtd_interface);
|
||||
@ -175,11 +174,11 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
|
||||
state->nbtsock = nbtsock;
|
||||
state->request_packet = talloc_steal(state, packet);
|
||||
state->rec = talloc_steal(state, rec);
|
||||
state->src_port = src_port;
|
||||
state->owner_addresses = rec->addresses;
|
||||
state->reg_address = packet->additional[0].rdata.netbios.addresses[0].ipaddr;
|
||||
state->src_address = talloc_strdup(state, src_address);
|
||||
if (state->src_address == NULL) goto failed;
|
||||
state->src.port = src->port;
|
||||
state->src.addr = talloc_strdup(state, src->addr);
|
||||
if (state->src.addr == NULL) goto failed;
|
||||
|
||||
/* setup a name query to the first address */
|
||||
state->query.in.name = *rec->name;
|
||||
@ -198,7 +197,7 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
|
||||
/* send a WACK to the client, specifying the maximum time it could
|
||||
take to check with the owner, plus some slack */
|
||||
ttl = 5 + 4 * str_list_length(rec->addresses);
|
||||
nbtd_wack_reply(nbtsock, packet, src_address, src_port, ttl);
|
||||
nbtd_wack_reply(nbtsock, packet, src, ttl);
|
||||
|
||||
req = nbt_name_query_send(nbtsock, &state->query);
|
||||
if (req == NULL) goto failed;
|
||||
@ -209,5 +208,5 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
|
||||
|
||||
failed:
|
||||
talloc_free(state);
|
||||
nbtd_name_registration_reply(nbtsock, packet, src_address, src_port, NBT_RCODE_SVR);
|
||||
nbtd_name_registration_reply(nbtsock, packet, src, NBT_RCODE_SVR);
|
||||
}
|
||||
|
@ -35,18 +35,18 @@
|
||||
*/
|
||||
static void netlogon_handler(struct dgram_mailslot_handler *dgmslot,
|
||||
struct nbt_dgram_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct nbt_netlogon_packet netlogon;
|
||||
int *replies = dgmslot->private;
|
||||
|
||||
printf("netlogon reply from %s:%d\n", src_address, src_port);
|
||||
printf("netlogon reply from %s:%d\n", src->addr, src->port);
|
||||
|
||||
status = dgram_mailslot_netlogon_parse(dgmslot, dgmslot, packet, &netlogon);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
printf("Failed to parse netlogon packet from %s:%d\n",
|
||||
src_address, src_port);
|
||||
src->addr, src->port);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -62,6 +62,7 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
|
||||
{
|
||||
struct dgram_mailslot_handler *dgmslot;
|
||||
struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
|
||||
struct nbt_peer_socket dest;
|
||||
const char *myaddress = talloc_strdup(dgmsock, iface_best_ip(address));
|
||||
struct nbt_netlogon_packet logon;
|
||||
struct nbt_name myname;
|
||||
@ -81,7 +82,6 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
|
||||
/* setup a temporary mailslot listener for replies */
|
||||
dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
|
||||
netlogon_handler, &replies);
|
||||
|
||||
|
||||
ZERO_STRUCT(logon);
|
||||
logon.command = NETLOGON_QUERY_FOR_PDC;
|
||||
@ -94,14 +94,15 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
|
||||
|
||||
make_nbt_name_client(&myname, TEST_NAME);
|
||||
|
||||
status = dgram_mailslot_netlogon_send(dgmsock, &name, address,
|
||||
0, &myname, &logon);
|
||||
dest.port = 0;
|
||||
dest.addr = address;
|
||||
status = dgram_mailslot_netlogon_send(dgmsock, &name, &dest,
|
||||
&myname, &logon);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
printf("Failed to send netlogon request - %s\n", nt_errstr(status));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
|
||||
while (timeval_elapsed(&tv) < 5 && replies == 0) {
|
||||
event_loop_once(dgmsock->event_ctx);
|
||||
}
|
||||
@ -121,6 +122,7 @@ static BOOL nbt_test_netlogon2(TALLOC_CTX *mem_ctx,
|
||||
{
|
||||
struct dgram_mailslot_handler *dgmslot;
|
||||
struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
|
||||
struct nbt_peer_socket dest;
|
||||
const char *myaddress = talloc_strdup(dgmsock, iface_best_ip(address));
|
||||
struct nbt_netlogon_packet logon;
|
||||
struct nbt_name myname;
|
||||
@ -154,8 +156,10 @@ static BOOL nbt_test_netlogon2(TALLOC_CTX *mem_ctx,
|
||||
|
||||
make_nbt_name_client(&myname, TEST_NAME);
|
||||
|
||||
status = dgram_mailslot_netlogon_send(dgmsock, &name, address,
|
||||
0, &myname, &logon);
|
||||
dest.port = 0;
|
||||
dest.addr = address;
|
||||
status = dgram_mailslot_netlogon_send(dgmsock, &name, &dest,
|
||||
&myname, &logon);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
printf("Failed to send netlogon request - %s\n", nt_errstr(status));
|
||||
goto failed;
|
||||
@ -180,18 +184,18 @@ failed:
|
||||
*/
|
||||
static void ntlogon_handler(struct dgram_mailslot_handler *dgmslot,
|
||||
struct nbt_dgram_packet *packet,
|
||||
const char *src_address, int src_port)
|
||||
const struct nbt_peer_socket *src)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct nbt_ntlogon_packet ntlogon;
|
||||
int *replies = dgmslot->private;
|
||||
|
||||
printf("ntlogon reply from %s:%d\n", src_address, src_port);
|
||||
printf("ntlogon reply from %s:%d\n", src->addr, src->port);
|
||||
|
||||
status = dgram_mailslot_ntlogon_parse(dgmslot, dgmslot, packet, &ntlogon);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
printf("Failed to parse ntlogon packet from %s:%d\n",
|
||||
src_address, src_port);
|
||||
src->addr, src->port);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -207,6 +211,7 @@ static BOOL nbt_test_ntlogon(TALLOC_CTX *mem_ctx,
|
||||
{
|
||||
struct dgram_mailslot_handler *dgmslot;
|
||||
struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
|
||||
struct nbt_peer_socket dest;
|
||||
const char *myaddress = talloc_strdup(dgmsock, iface_best_ip(address));
|
||||
struct nbt_ntlogon_packet logon;
|
||||
struct nbt_name myname;
|
||||
@ -255,9 +260,10 @@ static BOOL nbt_test_ntlogon(TALLOC_CTX *mem_ctx,
|
||||
|
||||
make_nbt_name_client(&myname, TEST_NAME);
|
||||
|
||||
status = dgram_mailslot_ntlogon_send(dgmsock, DGRAM_DIRECT_UNIQUE,
|
||||
&name, address,
|
||||
0, &myname, &logon);
|
||||
dest.port = 0;
|
||||
dest.addr = address;
|
||||
status = dgram_mailslot_ntlogon_send(dgmsock, &name, &dest,
|
||||
&myname, &logon);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
printf("Failed to send ntlogon request - %s\n", nt_errstr(status));
|
||||
goto failed;
|
||||
|
Loading…
x
Reference in New Issue
Block a user