first public release of samba4 code
[bbaumbach/samba-autobuild/.git] / source4 / nmbd / nmbd_lmhosts.c
1 /*
2    Unix SMB/CIFS implementation.
3    NBT netbios routines and daemon - version 2
4    Copyright (C) Jeremy Allison 1994-1998
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20    Revision History:
21
22    Handle lmhosts file reading.
23
24 */
25
26 #include "includes.h"
27
28 /****************************************************************************
29 Load a lmhosts file.
30 ****************************************************************************/
31 void load_lmhosts_file(char *fname)
32 {  
33   char *name;
34   int name_type;
35   struct in_addr ipaddr;
36   XFILE *fp = startlmhosts( fname );
37   TALLOC_CTX *mem_ctx;
38
39   if (!fp) {
40     DEBUG(2,("load_lmhosts_file: Can't open lmhosts file %s. Error was %s\n",
41              fname, strerror(errno)));
42     return;
43   }
44   mem_ctx = talloc_init("load_lmhosts_files");
45   if (!mem_ctx) {
46     DEBUG(2,("load_lmhosts_file: No memory to open lmhosts file %s. Error was %s\n",
47              fname, strerror(errno)));
48     return;
49   }
50   while (getlmhostsent(mem_ctx, fp, name, &name_type, &ipaddr) )
51   {
52     struct subnet_record *subrec = NULL;
53     enum name_source source = LMHOSTS_NAME;
54
55     /* We find a relevent subnet to put this entry on, then add it. */
56     /* Go through all the broadcast subnets and see if the mask matches. */
57     for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
58     {
59       if(same_net(ipaddr, subrec->bcast_ip, subrec->mask_ip))
60         break;
61     }
62   
63     /* If none match add the name to the remote_broadcast_subnet. */
64     if(subrec == NULL)
65       subrec = remote_broadcast_subnet;
66
67     if(name_type == -1)
68     {
69       /* Add the (0) and (0x20) names directly into the namelist for this subnet. */
70       (void)add_name_to_subnet(subrec,name,0x00,(uint16)NB_ACTIVE,PERMANENT_TTL,source,1,&ipaddr);
71       (void)add_name_to_subnet(subrec,name,0x20,(uint16)NB_ACTIVE,PERMANENT_TTL,source,1,&ipaddr);
72     }
73     else
74     {
75       /* Add the given name type to the subnet namelist. */
76       (void)add_name_to_subnet(subrec,name,name_type,(uint16)NB_ACTIVE,PERMANENT_TTL,source,1,&ipaddr);
77     }
78   }
79    
80   endlmhosts(fp);
81 }
82
83 /****************************************************************************
84   Find a name read from the lmhosts file. We secretly check the names on
85   the remote_broadcast_subnet as if the name was added to a regular broadcast
86   subnet it will be found by normal name query processing.
87 ****************************************************************************/
88
89 BOOL find_name_in_lmhosts(struct nmb_name *nmbname, struct name_record **namerecp)
90 {
91   struct name_record *namerec;
92
93   *namerecp = NULL;
94
95   if((namerec = find_name_on_subnet(remote_broadcast_subnet, nmbname, 
96                                  FIND_ANY_NAME))==NULL)
97     return False;
98
99   if(!NAME_IS_ACTIVE(namerec) || (namerec->data.source != LMHOSTS_NAME))
100     return False;
101
102   *namerecp = namerec;
103   return True;
104 }