]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Pass flag to cons_options indicating whether this is BOOTP or DHCP. Change handling...
authorTed Lemon <source@isc.org>
Tue, 16 Sep 1997 18:20:30 +0000 (18:20 +0000)
committerTed Lemon <source@isc.org>
Tue, 16 Sep 1997 18:20:30 +0000 (18:20 +0000)
server/dhcp.c

index 6c3d0e976dbf8263f044452322229cc01211f3e7..f94fd99f3a5f95724defcc7ba4dae5229bff07e6 100644 (file)
@@ -42,7 +42,7 @@
 
 #ifndef lint
 static char copyright[] =
-"$Id: dhcp.c,v 1.50 1997/06/08 04:10:41 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
+"$Id: dhcp.c,v 1.51 1997/09/16 18:20:30 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium.  All rights reserved.\n";
 #endif /* not lint */
 
 #include "dhcpd.h"
@@ -406,7 +406,7 @@ void nak_lease (packet, cip)
 
        /* Set up the option buffer... */
        outgoing.packet_length =
-               cons_options (packet, outgoing.raw, options, 0, 0);
+               cons_options (packet, outgoing.raw, options, 0, 0, 0);
 
 /*     memset (&raw.ciaddr, 0, sizeof raw.ciaddr);*/
        raw.siaddr = packet -> interface -> primary_address;
@@ -504,12 +504,6 @@ void ack_lease (packet, lease, offer, when)
                return;
        }
 
-       /* Allocate a lease state structure... */
-       state = new_lease_state ("ack_lease");
-       if (!state)
-               error ("unable to allocate lease state!");
-       memset (state, 0, sizeof *state);
-
        if (packet -> options [DHO_DHCP_CLASS_IDENTIFIER].len) {
                vendor_class =
                        find_class (0,
@@ -532,6 +526,29 @@ void ack_lease (packet, lease, offer, when)
                user_class = (struct class *)0;
        }
 
+       /*
+        * If there is not a specific host entry, and either the
+        * vendor class or user class (if they exist) deny booting,
+        * then bug out.
+        */
+       if (!lease -> host) {
+               if (vendor_class && !vendor_class -> group -> allow_booting) {
+                       debug ("Booting denied by vendor class");
+                       return;
+               }
+
+               if (user_class && !user_class -> group -> allow_booting) {
+                       debug ("Booting denied by user class");
+                       return;
+               }
+       }
+
+       /* Allocate a lease state structure... */
+       state = new_lease_state ("ack_lease");
+       if (!state)
+               error ("unable to allocate lease state!");
+       memset (state, 0, sizeof *state);
+
        /* Replace the old lease hostname with the new one, if it's changed. */
        if (packet -> options [DHO_HOST_NAME].len &&
            lease -> client_hostname &&
@@ -917,6 +934,7 @@ void dhcp_reply (lease)
        int result;
        int i;
        struct lease_state *state = lease -> state;
+       int nulltp, bootpp;
 
        if (!state)
                error ("dhcp_reply was supplied lease with no state!");
@@ -946,11 +964,19 @@ void dhcp_reply (lease)
        /* See if this is a Microsoft client that NUL-terminates its
           strings and expects us to do likewise... */
        if (lease -> flags & MS_NULL_TERMINATION)
-               packet_length = cons_options ((struct packet *)0,
-                                             &raw, state -> options, bufs, 1);
+               nulltp = 1;
        else
-               packet_length = cons_options ((struct packet *)0,
-                                             &raw, state -> options, bufs, 0);
+               nulltp = 0;
+
+       /* See if this is a bootp client... */
+       if (state -> offer)
+               bootpp = 0;
+       else
+               bootpp = 1;
+
+       /* Insert such options as will fit into the buffer. */
+       packet_length = cons_options ((struct packet *)0, &raw,
+                                     state -> options, bufs, nulltp, bootpp);
 
        /* Having done the cons_options(), we can release the tree_cache
           entries. */
@@ -1184,9 +1210,9 @@ struct lease *find_lease (packet, share, ours)
           a uid) we let the client get away with it. */
        if (hw_lease &&
            hw_lease -> ends >= cur_time &&
-           hw_lease -> uid && hw_lease != uid_lease &&
-           (packet -> packet_type != 0 ||
-            !(hw_lease -> flags & DYNAMIC_BOOTP_OK)))
+           hw_lease -> uid &&
+           packet -> options [DHO_DHCP_CLIENT_IDENTIFIER].len &&
+           hw_lease != uid_lease)
                hw_lease = (struct lease *)0;
 
        /* Toss extra pointers to the same lease... */