1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-09 09:57:48 +03:00
samba-mirror/source3/namedbresp.c
Samba Release Account 3ffb30e8be local_only NetServerEnum syncs can now be issued.
bug spotted in nameservresp.c - arguments to test subnet the response
is received on (same_net()) were the wrong way round (ccm@shentel.net)

samba was adding WORKGROUP(1e) as a unique not a group name: fixed this

bug in reply_name_status() and reply_name_query(): WINS entries weren't
being looked up.

name status reply adds local SELF entries to WINS SELF entries: some
SELF entries are only added locally, while others are only added via
WINS. name status needs to have both, combined.

a sync will only occur when an ANN_LocalMasterAnnouncement is received, NOT
an ANN_HostAnnouncement or an ANN_DomainAnnouncement.

when samba is a member of a workgroup, it looks for (using a wins server)
and announces to its domain master. NAME_QUERY_ANNOUNCE_HOST - yet another
'state' - has been created to do this: do the name query on the wins server
and send the announce host to the answer to this query.

jeremy @ vantive wrote the original code to do this, which used the
name_query() function.  i'm trying to avoid name_query: it times out and
generally messes things up, but using queue_netbios_packet() and
queue_netbios_pkt_wins() is... not intuitive?

lkcl with help from jra
(This used to be commit 6e932e4bae8b46e7ff4a55a75484bad78308336a)
1996-08-01 17:49:40 +00:00

161 lines
4.3 KiB
C

/*
Unix SMB/Netbios implementation.
Version 1.9.
NBT netbios library routines
Copyright (C) Andrew Tridgell 1994-1996
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 02139, USA.
Module name: namedbresp.c
*/
#include "includes.h"
extern int ClientNMB;
extern int ClientDGRAM;
extern struct subnet_record *subnetlist;
extern int DEBUGLEVEL;
extern pstring scope;
extern pstring myname;
extern struct in_addr ipzero;
extern struct in_addr ipgrp;
int num_response_packets = 0;
/***************************************************************************
add an expected response record into the list
**************************************************************************/
void add_response_record(struct subnet_record *d,
struct response_record *n)
{
struct response_record *n2;
if (!d) return;
num_response_packets++; /* count of total number of packets still around */
DEBUG(4,("adding response record id:%d num_records:%d\n",
n->response_id, num_response_packets));
if (!d->responselist)
{
d->responselist = n;
n->prev = NULL;
n->next = NULL;
return;
}
for (n2 = d->responselist; n2->next; n2 = n2->next) ;
n2->next = n;
n->next = NULL;
n->prev = n2;
}
/***************************************************************************
remove an expected response record from the list
**************************************************************************/
void remove_response_record(struct subnet_record *d,
struct response_record *n)
{
if (!d) return;
if (n->prev) n->prev->next = n->next;
if (n->next) n->next->prev = n->prev;
if (d->responselist == n) d->responselist = n->next;
free(n);
num_response_packets--; /* count of total number of packets still around */
}
/****************************************************************************
create a name query response record
**************************************************************************/
struct response_record *make_response_queue_record(enum state_type state,
int id,uint16 fd,
int quest_type, char *name,int type, int nb_flags, time_t ttl,
int server_type, char *my_name, char *my_comment,
BOOL bcast,BOOL recurse,
struct in_addr send_ip, struct in_addr reply_to_ip)
{
struct response_record *n;
if (!name || !name[0]) return NULL;
if (!(n = (struct response_record *)malloc(sizeof(*n))))
return(NULL);
n->response_id = id;
n->state = state;
n->fd = fd;
n->quest_type = quest_type;
make_nmb_name(&n->name, name, type, scope);
n->nb_flags = nb_flags;
n->ttl = ttl;
n->server_type = server_type;
n->bcast = bcast;
n->recurse = recurse;
n->send_ip = send_ip;
n->reply_to_ip = reply_to_ip;
StrnCpy(my_name , n->my_name , sizeof(n->my_name )-1);
StrnCpy(my_comment, n->my_comment, sizeof(n->my_comment)-1);
n->repeat_interval = 1; /* XXXX should be in ms */
n->repeat_count = 3; /* 3 retries */
n->repeat_time = time(NULL) + n->repeat_interval; /* initial retry time */
n->num_msgs = 0;
return n;
}
/****************************************************************************
find a response in a subnet's name query response list.
**************************************************************************/
struct response_record *find_response_record(struct subnet_record **d,
uint16 id)
{
struct response_record *n;
if (!d) return NULL;
for ((*d) = subnetlist; (*d); (*d) = (*d)->next)
{
for (n = (*d)->responselist; n; n = n->next)
{
if (n->response_id == id) {
DEBUG(4, ("found response record on %s: %d\n",
inet_ntoa((*d)->bcast_ip), id));
return n;
}
}
}
*d = NULL;
return NULL;
}