s3-registry: Check return code of push_reg_sz().
[kai/samba.git] / source3 / nmbd / nmbd_lmhosts.c
index 8dda58e35227db8f8a9ac4948fa05414a82e2120..c3eb2b58dd4adce164f6accc5b45c1239d3c346b 100644 (file)
 */
 
 #include "includes.h"
+#include "../libcli/nbt/libnbt.h"
+#include "nmbd/nmbd.h"
 
 /****************************************************************************
 Load a lmhosts file.
 ****************************************************************************/
 
 void load_lmhosts_file(const char *fname)
-{  
-       pstring name;
+{
+       char *name = NULL;
        int name_type;
-       struct in_addr ipaddr;
+       struct sockaddr_storage ss;
+       TALLOC_CTX *ctx = talloc_init("load_lmhosts_file");
        XFILE *fp = startlmhosts( fname );
 
        if (!fp) {
                DEBUG(2,("load_lmhosts_file: Can't open lmhosts file %s. Error was %s\n",
                        fname, strerror(errno)));
+               TALLOC_FREE(ctx);
                return;
        }
-   
-       while (getlmhostsent(fp, name, &name_type, &ipaddr) ) {
+
+       while (getlmhostsent(ctx, fp, &name, &name_type, &ss) ) {
+               struct in_addr ipaddr;
                struct subnet_record *subrec = NULL;
                enum name_source source = LMHOSTS_NAME;
 
+               if (ss.ss_family != AF_INET) {
+                       TALLOC_FREE(name);
+                       continue;
+               }
+
+               ipaddr = ((struct sockaddr_in *)&ss)->sin_addr;
+
                /* We find a relevent subnet to put this entry on, then add it. */
                /* Go through all the broadcast subnets and see if the mask matches. */
                for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
                        if(same_net_v4(ipaddr, subrec->bcast_ip, subrec->mask_ip))
                                break;
                }
-  
+
                /* If none match add the name to the remote_broadcast_subnet. */
                if(subrec == NULL)
                        subrec = remote_broadcast_subnet;
@@ -65,7 +77,8 @@ void load_lmhosts_file(const char *fname)
                        (void)add_name_to_subnet(subrec,name,name_type,(uint16)NB_ACTIVE,PERMANENT_TTL,source,1,&ipaddr);
                }
        }
-   
+
+       TALLOC_FREE(ctx);
        endlmhosts(fp);
 }