mirror of
https://github.com/samba-team/samba.git
synced 2024-12-28 07:21:54 +03:00
afd08462ad
The 1.9.16 tree is now back to 1.9.16p2 as far as nmbd is concerned
apart from a small change that fixes the announce type in two places.
(This used to be commit 45e66a69d3
)
161 lines
4.3 KiB
C
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;
|
|
}
|
|
|
|
|