]> git.ipfire.org Git - thirdparty/dhcp.git/blobdiff - common/discover.c
Merge changes between 3.0rc7 and 3.0rc8pl2.
[thirdparty/dhcp.git] / common / discover.c
index 4dc8b25f1744a4d25bfb68ad43be1a67b161845d..c11abb9ce2a87b1aae5eb5dada457f823393271b 100644 (file)
 
 #ifndef lint
 static char copyright[] =
-"$Id: discover.c,v 1.43 2001/05/17 19:03:44 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium.  All rights reserved.\n";
+"$Id: discover.c,v 1.44 2001/06/27 00:29:44 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium.  All rights reserved.\n";
 #endif /* not lint */
 
 #include "dhcpd.h"
 #include <sys/ioctl.h>
 
 struct interface_info *interfaces, *dummy_interfaces, *fallback_interface;
-extern int interfaces_invalidated;
+int interfaces_invalidated;
 int quiet_interface_discovery;
 u_int16_t local_port;
 u_int16_t remote_port;
@@ -406,6 +406,7 @@ void discover_interfaces (state)
                                log_fatal ("Can't allocate interface %s: %s",
                                           name, isc_result_totext (status));
                        tmp -> flags = ir;
+                       strncpy (tmp -> name, name, IFNAMSIZ);
                        interface_reference (&tmp -> next, interfaces, MDL);
                        interface_dereference (&interfaces, MDL);
                        interface_reference (&interfaces, tmp, MDL);
@@ -839,8 +840,23 @@ isc_result_t dhcp_interface_destroy (omapi_object_t *h,
                return ISC_R_INVALIDARG;
        interface = (struct interface_info *)h;
 
-       if (interface -> ifp)
+       if (interface -> ifp) {
                dfree (interface -> ifp, file, line);
+               interface -> ifp = 0;
+       }
+       if (interface -> next)
+               interface_dereference (&interface -> next, file, line);
+       if (interface -> rbuf) {
+               dfree (interface -> rbuf, file, line);
+               interface -> rbuf = (unsigned char *)0;
+       }
+       if (interface -> client)
+               interface -> client = (struct client_state *)0;
+
+       if (interface -> shared_network)
+               omapi_object_dereference ((omapi_object_t **)
+                                         &interface -> shared_network, MDL);
+
        return ISC_R_SUCCESS;
 }
 
@@ -924,6 +940,9 @@ isc_result_t dhcp_interface_lookup (omapi_object_t **ip,
        isc_result_t status;
        struct interface_info *interface;
 
+       if (!ref)
+               return ISC_R_NOKEYS;
+
        /* First see if we were sent a handle. */
        status = omapi_get_value_str (ref, id, "handle", &tv);
        if (status == ISC_R_SUCCESS) {
@@ -1095,7 +1114,7 @@ void interface_stash (struct interface_info *tptr)
                }
                interface_vector = vec;
        }
-       interface_vector [tptr -> index] = tptr;
+       interface_reference (&interface_vector [tptr -> index], tptr, MDL);
        if (tptr -> index >= interface_count)
                interface_count = tptr -> index + 1;
 #if defined (TRACING)