2005-01-31 04:57:58 +03:00
/*
Unix SMB / CIFS implementation .
answer name queries
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
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-01-31 04:57:58 +03:00
( 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
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-01-31 04:57:58 +03:00
*/
# include "includes.h"
2006-08-30 15:29:34 +04:00
# include "lib/util/dlinklist.h"
2005-01-31 04:57:58 +03:00
# include "system/network.h"
# include "nbt_server/nbt_server.h"
2005-12-30 15:43:11 +03:00
# include "nbt_server/wins/winsserver.h"
2006-03-16 03:23:11 +03:00
# include "librpc/gen_ndr/ndr_nbt.h"
2006-01-10 01:12:53 +03:00
# include "lib/socket/socket.h"
2007-09-08 16:42:09 +04:00
# include "param/param.h"
2005-01-31 04:57:58 +03:00
/*
answer a name query
*/
2005-02-04 04:39:10 +03:00
void nbtd_request_query ( struct nbt_name_socket * nbtsock ,
struct nbt_name_packet * packet ,
2006-01-10 01:12:53 +03:00
struct socket_address * src )
2005-01-31 04:57:58 +03:00
{
2005-02-06 11:25:53 +03:00
struct nbtd_iface_name * iname ;
2005-01-31 04:57:58 +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-01-31 04:57:58 +03:00
2005-01-31 07:15:58 +03:00
/* see if its a node status query */
if ( packet - > qdcount = = 1 & &
packet - > questions [ 0 ] . question_type = = NBT_QTYPE_STATUS ) {
2005-10-14 16:22:15 +04:00
nbtd_query_status ( nbtsock , packet , src ) ;
2005-01-31 07:15:58 +03:00
return ;
}
2005-10-14 18:02:47 +04:00
NBTD_ASSERT_PACKET ( packet , src , packet - > qdcount = = 1 ) ;
NBTD_ASSERT_PACKET ( packet , src ,
2005-02-12 02:54:37 +03:00
packet - > questions [ 0 ] . question_type = = NBT_QTYPE_NETBIOS ) ;
2005-10-14 18:02:47 +04:00
NBTD_ASSERT_PACKET ( packet , src ,
2005-02-12 02:54:37 +03:00
packet - > questions [ 0 ] . question_class = = NBT_QCLASS_IP ) ;
2005-01-31 04:57:58 +03:00
/* see if we have the requested name on this interface */
name = & packet - > questions [ 0 ] . name ;
2005-02-06 11:25:53 +03:00
iname = nbtd_find_iname ( iface , name , 0 ) ;
2005-01-31 04:57:58 +03:00
if ( iname = = NULL ) {
2005-02-12 02:54:37 +03:00
/* don't send negative replies to broadcast queries */
if ( packet - > operation & NBT_FLAG_BROADCAST ) {
return ;
}
2005-12-30 15:43:11 +03:00
if ( packet - > operation & NBT_FLAG_RECURSION_DESIRED ) {
nbtd_winsserver_request ( nbtsock , packet , src ) ;
return ;
}
2005-02-12 02:54:37 +03:00
/* otherwise send a negative reply */
2005-10-14 16:22:15 +04:00
nbtd_negative_name_query_reply ( nbtsock , packet , src ) ;
2005-01-31 04:57:58 +03:00
return ;
}
2005-12-30 17:04:18 +03:00
/*
* normally we should forward all queries with the
* recursion desired flag to the wins server , but this
* breaks are winsclient code , when doing mhomed registrations
*/
2005-12-30 15:43:11 +03:00
if ( ! ( packet - > operation & NBT_FLAG_BROADCAST ) & &
( packet - > operation & NBT_FLAG_RECURSION_DESIRED ) & &
2005-12-30 17:04:18 +03:00
( iname - > nb_flags & NBT_NM_GROUP ) & &
2007-09-28 05:17:46 +04:00
lp_wins_support ( global_loadparm ) ) {
2005-12-30 15:43:11 +03:00
nbtd_winsserver_request ( nbtsock , packet , src ) ;
return ;
}
2005-02-06 11:25:53 +03:00
/* if the name is not yet active and its a broadcast query then
ignore it for now */
if ( ! ( iname - > nb_flags & NBT_NM_ACTIVE ) & &
( packet - > operation & NBT_FLAG_BROADCAST ) ) {
2005-02-12 04:00:15 +03:00
DEBUG ( 7 , ( " Query for %s from %s - name not active yet on %s \n " ,
2005-10-14 16:22:15 +04:00
nbt_name_string ( packet , name ) , src - > addr , iface - > ip_address ) ) ;
2005-02-06 11:25:53 +03:00
return ;
}
2005-10-14 16:22:15 +04:00
nbtd_name_query_reply ( nbtsock , packet , src ,
2005-02-04 04:39:10 +03:00
& iname - > name , iname - > ttl , iname - > nb_flags ,
2005-02-07 14:49:55 +03:00
nbtd_address_list ( iface , packet ) ) ;
2005-01-31 04:57:58 +03:00
}