2005-02-04 04:55:50 +03:00
/*
Unix SMB / CIFS implementation .
defend our names against name registration requests
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 "includes.h"
# include "dlinklist.h"
# include "system/network.h"
# include "nbt_server/nbt_server.h"
/*
defend our registered names against registration or name refresh
requests
*/
void nbtd_request_defense ( struct nbt_name_socket * nbtsock ,
struct nbt_name_packet * packet ,
const char * src_address , int src_port )
{
2005-02-06 11:25:53 +03:00
struct nbtd_iface_name * iname ;
2005-02-04 04:55:50 +03:00
struct nbt_name * name ;
2005-02-06 11:25:53 +03:00
struct nbtd_interface * iface = talloc_get_type ( nbtsock - > incoming . private ,
struct nbtd_interface ) ;
2005-02-04 04:55:50 +03:00
2005-02-12 02:54:37 +03:00
NBTD_ASSERT_PACKET ( packet , src_address , packet - > qdcount = = 1 ) ;
NBTD_ASSERT_PACKET ( packet , src_address , packet - > arcount = = 1 ) ;
NBTD_ASSERT_PACKET ( packet , src_address ,
packet - > questions [ 0 ] . question_type = = NBT_QTYPE_NETBIOS ) ;
NBTD_ASSERT_PACKET ( packet , src_address ,
packet - > questions [ 0 ] . question_class = = NBT_QCLASS_IP ) ;
NBTD_ASSERT_PACKET ( packet , src_address ,
packet - > additional [ 0 ] . rr_type = = NBT_QTYPE_NETBIOS ) ;
NBTD_ASSERT_PACKET ( packet , src_address ,
packet - > additional [ 0 ] . rr_class = = NBT_QCLASS_IP ) ;
NBTD_ASSERT_PACKET ( packet , src_address ,
packet - > additional [ 0 ] . rdata . netbios . length = = 6 ) ;
2005-02-04 04:55:50 +03:00
/* see if we have the requested name on this interface */
name = & packet - > questions [ 0 ] . name ;
iname = nbtd_find_iname ( iface , name , NBT_NM_ACTIVE ) ;
2005-02-15 14:14:04 +03:00
if ( iname ! = NULL & &
! IS_GROUP_NAME ( name , iname - > nb_flags ) ) {
2005-02-12 04:00:15 +03:00
DEBUG ( 2 , ( " Defending name %s on %s against %s \n " ,
nbt_name_string ( packet , name ) ,
iface - > bcast_address , src_address ) ) ;
2005-02-12 14:33:42 +03:00
nbtd_name_registration_reply ( nbtsock , packet ,
src_address , src_port , NBT_RCODE_ACT ) ;
2005-02-12 02:54:37 +03:00
} else {
nbtd_winsserver_request ( nbtsock , packet , src_address , src_port ) ;
2005-02-04 04:55:50 +03:00
}
}