diff options
author | Henning Brauer <henning@cvs.openbsd.org> | 2004-04-14 01:27:50 +0000 |
---|---|---|
committer | Henning Brauer <henning@cvs.openbsd.org> | 2004-04-14 01:27:50 +0000 |
commit | 4155c9e9f0564da7e0791d4e2abf1e86ecd4167f (patch) | |
tree | c89481980be76d9440283bdc32ceb9667191872e /usr.sbin/dhcpd | |
parent | f13d7f71d21867a72b76986161f6923c4c43c547 (diff) |
the ones from dhclient do, and they're already KNF'd and annsified...
Diffstat (limited to 'usr.sbin/dhcpd')
-rw-r--r-- | usr.sbin/dhcpd/convert.c | 81 | ||||
-rw-r--r-- | usr.sbin/dhcpd/inet.c | 137 | ||||
-rw-r--r-- | usr.sbin/dhcpd/options.c | 724 | ||||
-rw-r--r-- | usr.sbin/dhcpd/parse.c | 592 | ||||
-rw-r--r-- | usr.sbin/dhcpd/tables.c | 75 |
5 files changed, 804 insertions, 805 deletions
diff --git a/usr.sbin/dhcpd/convert.c b/usr.sbin/dhcpd/convert.c index 12afe87a40a..aefd645eacc 100644 --- a/usr.sbin/dhcpd/convert.c +++ b/usr.sbin/dhcpd/convert.c @@ -1,7 +1,9 @@ -/* convert.c +/* $OpenBSD: convert.c,v 1.2 2004/04/14 01:27:49 henning Exp $ */ - Safe copying of option values into and out of the option buffer, which - can't be assumed to be aligned. */ +/* + * Safe copying of option values into and out of the option buffer, + * which can't be assumed to be aligned. + */ /* * Copyright (c) 1995, 1996 The Internet Software Consortium. @@ -43,71 +45,70 @@ #include "dhcpd.h" -u_int32_t getULong (buf) - unsigned char *buf; +u_int32_t +getULong(unsigned char *buf) { u_int32_t ibuf; - memcpy (&ibuf, buf, sizeof (ibuf)); - return ntohl (ibuf); + memcpy(&ibuf, buf, sizeof(ibuf)); + return (ntohl(ibuf)); } -int32_t getLong (buf) - unsigned char *buf; +int32_t +getLong(unsigned char *(buf)) { int32_t ibuf; - memcpy (&ibuf, buf, sizeof (ibuf)); - return ntohl (ibuf); + memcpy(&ibuf, buf, sizeof(ibuf)); + return (ntohl(ibuf)); } -u_int16_t getUShort (buf) - unsigned char *buf; +u_int16_t +getUShort(unsigned char *buf) { u_int16_t ibuf; - memcpy (&ibuf, buf, sizeof (ibuf)); - return ntohs (ibuf); + memcpy(&ibuf, buf, sizeof(ibuf)); + return (ntohs(ibuf)); } -int16_t getShort (buf) - unsigned char *buf; +int16_t +getShort(unsigned char *buf) { int16_t ibuf; - memcpy (&ibuf, buf, sizeof (ibuf)); - return ntohs (ibuf); + memcpy(&ibuf, buf, sizeof(ibuf)); + return (ntohs(ibuf)); } -void putULong (obuf, val) - unsigned char *obuf; - u_int32_t val; +void +putULong(unsigned char *obuf, u_int32_t val) { - u_int32_t tmp = htonl (val); - memcpy (obuf, &tmp, sizeof tmp); + u_int32_t tmp = htonl(val); + + memcpy(obuf, &tmp, sizeof(tmp)); } -void putLong (obuf, val) - unsigned char *obuf; - int32_t val; +void +putLong(unsigned char *obuf, int32_t val) { - int32_t tmp = htonl (val); - memcpy (obuf, &tmp, sizeof tmp); + int32_t tmp = htonl(val); + + memcpy(obuf, &tmp, sizeof(tmp)); } -void putUShort (obuf, val) - unsigned char *obuf; - unsigned int val; +void +putUShort(unsigned char *obuf, unsigned int val) { - u_int16_t tmp = htons (val); - memcpy (obuf, &tmp, sizeof tmp); + u_int16_t tmp = htons(val); + + memcpy(obuf, &tmp, sizeof(tmp)); } -void putShort (obuf, val) - unsigned char *obuf; - int val; +void +putShort(unsigned char *obuf, int val) { - int16_t tmp = htons (val); - memcpy (obuf, &tmp, sizeof tmp); -} + int16_t tmp = htons(val); + memcpy(obuf, &tmp, sizeof(tmp)); +} diff --git a/usr.sbin/dhcpd/inet.c b/usr.sbin/dhcpd/inet.c index 16097b08185..dcec0b55ff4 100644 --- a/usr.sbin/dhcpd/inet.c +++ b/usr.sbin/dhcpd/inet.c @@ -1,7 +1,9 @@ -/* inet.c +/* $OpenBSD: inet.c,v 1.2 2004/04/14 01:27:49 henning Exp $ */ - Subroutines to manipulate internet addresses in a safely portable - way... */ +/* + * Subroutines to manipulate internet addresses in a safely portable + * way... + */ /* * Copyright (c) 1996 The Internet Software Consortium. All rights reserved. @@ -42,98 +44,95 @@ #include "dhcpd.h" -/* Return just the network number of an internet address... */ - -struct iaddr subnet_number (addr, mask) - struct iaddr addr; - struct iaddr mask; +/* + * Return just the network number of an internet address... + */ +struct iaddr +subnet_number(struct iaddr addr, struct iaddr mask) { - int i; struct iaddr rv; + int i; rv.len = 0; /* Both addresses must have the same length... */ if (addr.len != mask.len) - return rv; + return (rv); rv.len = addr.len; for (i = 0; i < rv.len; i++) - rv.iabuf [i] = addr.iabuf [i] & mask.iabuf [i]; - return rv; + rv.iabuf[i] = addr.iabuf[i] & mask.iabuf[i]; + return (rv); } -/* Combine a network number and a integer to produce an internet address. +/* + * Combine a network number and a integer to produce an internet address. * This won't work for subnets with more than 32 bits of host address, but - * maybe this isn't a problem. + * maybe this isn't a problem. */ - -struct iaddr ip_addr (subnet, mask, host_address) - struct iaddr subnet; - struct iaddr mask; - u_int32_t host_address; +struct iaddr +ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address) { int i, j, k; u_int32_t swaddr; + unsigned char habuf[sizeof(swaddr)]; struct iaddr rv; - unsigned char habuf [sizeof swaddr]; - swaddr = htonl (host_address); - memcpy (habuf, &swaddr, sizeof swaddr); + swaddr = htonl(host_address); + memcpy(habuf, &swaddr, sizeof(swaddr)); - /* Combine the subnet address and the host address. If - the host address is bigger than can fit in the subnet, - return a zero-length iaddr structure. */ + /* + * Combine the subnet address and the host address. If the + * host address is bigger than can fit in the subnet, return a + * zero-length iaddr structure. + */ rv = subnet; - j = rv.len - sizeof habuf; - for (i = sizeof habuf - 1; i >= 0; i--) { - if (mask.iabuf [i + j]) { - if (habuf [i] > (mask.iabuf [i + j] ^ 0xFF)) { + j = rv.len - sizeof(habuf); + for (i = sizeof(habuf) - 1; i >= 0; i--) { + if (mask.iabuf[i + j]) { + if (habuf[i] > (mask.iabuf[i + j] ^ 0xFF)) { rv.len = 0; - return rv; + return (rv); } - for (k = i - 1; k >= 0; k--) { - if (habuf [k]) { + for (k = i - 1; k >= 0; k--) + if (habuf[k]) { rv.len = 0; - return rv; + return (rv); } - } - rv.iabuf [i + j] |= habuf [i]; + rv.iabuf[i + j] |= habuf[i]; break; } else - rv.iabuf [i + j] = habuf [i]; + rv.iabuf[i + j] = habuf[i]; } - - return rv; -} -/* Given a subnet number and netmask, return the address on that subnet - for which the host portion of the address is all ones (the standard - broadcast address). */ + return (rv); +} -struct iaddr broadcast_addr (subnet, mask) - struct iaddr subnet; - struct iaddr mask; +/* + * Given a subnet number and netmask, return the address on that subnet + * for which the host portion of the address is all ones (the standard + * broadcast address). + */ +struct iaddr +broadcast_addr(struct iaddr subnet, struct iaddr mask) { int i; struct iaddr rv; if (subnet.len != mask.len) { rv.len = 0; - return rv; + return (rv); } - for (i = 0; i < subnet.len; i++) { - rv.iabuf [i] = subnet.iabuf [i] | (~mask.iabuf [i] & 255); - } + for (i = 0; i < subnet.len; i++) + rv.iabuf[i] = subnet.iabuf[i] | (~mask.iabuf[i] & 255); rv.len = subnet.len; - return rv; + return (rv); } -u_int32_t host_addr (addr, mask) - struct iaddr addr; - struct iaddr mask; +u_int32_t +host_addr(struct iaddr addr, struct iaddr mask) { int i; u_int32_t swaddr; @@ -144,41 +143,39 @@ u_int32_t host_addr (addr, mask) /* Mask out the network bits... */ rv.len = addr.len; for (i = 0; i < rv.len; i++) - rv.iabuf [i] = addr.iabuf [i] & ~mask.iabuf [i]; + rv.iabuf[i] = addr.iabuf[i] & ~mask.iabuf[i]; /* Copy out up to 32 bits... */ - memcpy (&swaddr, &rv.iabuf [rv.len - sizeof swaddr], sizeof swaddr); + memcpy(&swaddr, &rv.iabuf[rv.len - sizeof(swaddr)], sizeof(swaddr)); /* Swap it and return it. */ - return ntohl (swaddr); + return (ntohl(swaddr)); } -int addr_eq (addr1, addr2) - struct iaddr addr1, addr2; +int +addr_eq(struct iaddr addr1, struct iaddr addr2) { if (addr1.len != addr2.len) - return 0; - return memcmp (addr1.iabuf, addr2.iabuf, addr1.len) == 0; + return (0); + return (memcmp(addr1.iabuf, addr2.iabuf, addr1.len) == 0); } -char *piaddr (addr) - struct iaddr addr; +char *piaddr(struct iaddr addr) { - static char pbuf [32]; + static char pbuf[32]; char *s; struct in_addr a; - + memcpy(&a, &(addr.iabuf), sizeof(struct in_addr)); - if (addr.len == 0) { - strlcpy (pbuf, "<null address>", sizeof(pbuf)); - } + if (addr.len == 0) + strlcpy(pbuf, "<null address>", sizeof(pbuf)); else { s = inet_ntoa(a); if (s != NULL) strlcpy(pbuf, s, sizeof(pbuf)); else - strlcpy (pbuf, "<invalid address>", sizeof(pbuf)); - } - return(pbuf); + strlcpy(pbuf, "<invalid address>", sizeof(pbuf)); + } + return (pbuf); } diff --git a/usr.sbin/dhcpd/options.c b/usr.sbin/dhcpd/options.c index e445dad97c0..97bf6a2718a 100644 --- a/usr.sbin/dhcpd/options.c +++ b/usr.sbin/dhcpd/options.c @@ -1,6 +1,6 @@ -/* options.c +/* $OpenBSD: options.c,v 1.2 2004/04/14 01:27:49 henning Exp $ */ - DHCP options parsing and reassembly. */ +/* DHCP options parsing and reassembly. */ /* * Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. @@ -40,56 +40,67 @@ * Enterprises, see ``http://www.vix.com''. */ +#include <ctype.h> + #define DHCP_OPTION_DATA #include "dhcpd.h" -#include <ctype.h> int bad_options = 0; int bad_options_max = 5; -/* Parse all available options out of the specified packet. */ +void parse_options(struct packet *); +void parse_option_buffer(struct packet *, unsigned char *, int); +int store_options(unsigned char *, int, struct tree_cache **, + unsigned char *, int, int, int, int); -void parse_options (packet) - struct packet *packet; + +/* + * Parse all available options out of the specified packet. + */ +void +parse_options(struct packet *packet) { /* Initially, zero all option pointers. */ - memset (packet -> options, 0, sizeof (packet -> options)); + memset(packet->options, 0, sizeof(packet->options)); /* If we don't see the magic cookie, there's nothing to parse. */ - if (memcmp (packet -> raw -> options, DHCP_OPTIONS_COOKIE, 4)) { - packet -> options_valid = 0; + if (memcmp(packet->raw->options, DHCP_OPTIONS_COOKIE, 4)) { + packet->options_valid = 0; return; } - /* Go through the options field, up to the end of the packet - or the End field. */ - parse_option_buffer (packet, &packet -> raw -> options [4], - packet -> packet_length - DHCP_FIXED_NON_UDP - 4); - /* If we parsed a DHCP Option Overload option, parse more - options out of the buffer(s) containing them. */ - if (packet -> options_valid - && packet -> options [DHO_DHCP_OPTION_OVERLOAD].data) { - if (packet -> options [DHO_DHCP_OPTION_OVERLOAD].data [0] & 1) - parse_option_buffer (packet, - (unsigned char *) - packet -> raw -> file, - sizeof packet -> raw -> file); - if (packet -> options [DHO_DHCP_OPTION_OVERLOAD].data [0] & 2) - parse_option_buffer (packet, - (unsigned char *) - packet -> raw -> sname, - sizeof packet -> raw -> sname); + /* + * Go through the options field, up to the end of the packet or + * the End field. + */ + parse_option_buffer(packet, &packet->raw->options[4], + packet->packet_length - DHCP_FIXED_NON_UDP - 4); + + /* + * If we parsed a DHCP Option Overload option, parse more + * options out of the buffer(s) containing them. + */ + if (packet->options_valid && + packet->options[DHO_DHCP_OPTION_OVERLOAD].data) { + if (packet->options[DHO_DHCP_OPTION_OVERLOAD].data[0] & 1) + parse_option_buffer(packet, + (unsigned char *)packet->raw->file, + sizeof(packet->raw->file)); + if (packet->options[DHO_DHCP_OPTION_OVERLOAD].data[0] & 2) + parse_option_buffer(packet, + (unsigned char *)packet->raw->sname, + sizeof(packet->raw->sname)); } } -/* Parse options out of the specified buffer, storing addresses of option - values in packet -> options and setting packet -> options_valid if no - errors are encountered. */ - -void parse_option_buffer (packet, buffer, length) - struct packet *packet; - unsigned char *buffer; - int length; +/* + * Parse options out of the specified buffer, storing addresses of + * option values in packet->options and setting packet->options_valid if + * no errors are encountered. + */ +void +parse_option_buffer(struct packet *packet, + unsigned char *buffer, int length) { unsigned char *s, *t; unsigned char *end = buffer + length; @@ -97,127 +108,127 @@ void parse_option_buffer (packet, buffer, length) int code; for (s = buffer; *s != DHO_END && s < end; ) { - code = s [0]; + code = s[0]; /* Pad options don't have a length - just skip them. */ if (code == DHO_PAD) { - ++s; + s++; continue; } if (s + 2 > end) { len = 65536; goto bogus; } - - /* All other fields (except end, see above) have a - one-byte length. */ - len = s [1]; - - /* If the length is outrageous, silently skip the - * rest, and mark the packet bad. Unfortuntely - * some crappy dhcp servers always seem to give - * us garbage on the end of a packet. so rather than - * keep refusing, give up and try to take one after - * seeing a few without anything good. + + /* + * All other fields (except end, see above) have a + * one-byte length. + */ + len = s[1]; + + /* + * If the length is outrageous, silently skip the rest, + * and mark the packet bad. Unfortuntely some crappy + * dhcp servers always seem to give us garbage on the + * end of a packet. so rather than keep refusing, give + * up and try to take one after seeing a few without + * anything good. */ if (s + len + 2 > end) { bogus: bad_options++; - warn ("option %s (%d) %s.", - dhcp_options [code].name, len, - "larger than buffer"); + warn("option %s (%d) %s.", + dhcp_options[code].name, len, + "larger than buffer"); if (bad_options == bad_options_max) { - packet -> options_valid = 1; + packet->options_valid = 1; bad_options = 0; - warn ("Many bogus options seen in offers."); - warn ("Taking this offer in spite of bogus"); - warn ("options - hope for the best!"); + warn("Many bogus options seen in offers."); + warn("Taking this offer in spite of bogus"); + warn("options - hope for the best!"); } else { - warn ("rejecting bogus offer."); - packet -> options_valid = 0; + warn("rejecting bogus offer."); + packet->options_valid = 0; } return; } - /* If we haven't seen this option before, just make - space for it and copy it there. */ - if (!packet -> options [code].data) { - if (!(t = ((unsigned char *) - dmalloc (len + 1, "parse_option_buffer")))) - error ("Can't allocate storage for option %s.", - dhcp_options [code].name); - /* Copy and NUL-terminate the option (in case it's an - ASCII string. */ - memcpy (t, &s [2], len); - t [len] = 0; - packet -> options [code].len = len; - packet -> options [code].data = t; + /* + * If we haven't seen this option before, just make + * space for it and copy it there. + */ + if (!packet->options[code].data) { + if (!(t = dmalloc(len + 1, "parse_option_buffer"))) + error("Can't allocate storage for option %s.", + dhcp_options[code].name); + /* + * Copy and NUL-terminate the option (in case + * it's an ASCII string. + */ + memcpy(t, &s[2], len); + t[len] = 0; + packet->options[code].len = len; + packet->options[code].data = t; } else { - /* If it's a repeat, concatenate it to whatever - we last saw. This is really only required - for clients, but what the heck... */ - t = ((unsigned char *) - dmalloc (len + packet -> options [code].len + 1, - "parse_option_buffer")); + /* + * If it's a repeat, concatenate it to whatever + * we last saw. This is really only required + * for clients, but what the heck... + */ + t = dmalloc(len + packet->options[code].len + 1, + "parse_option_buffer"); if (!t) - error ("Can't expand storage for option %s.", - dhcp_options [code].name); - memcpy (t, packet -> options [code].data, - packet -> options [code].len); - memcpy (t + packet -> options [code].len, - &s [2], len); - packet -> options [code].len += len; - t [packet -> options [code].len] = 0; - dfree (packet -> options [code].data, - "parse_option_buffer"); - packet -> options [code].data = t; + error("Can't expand storage for option %s.", + dhcp_options[code].name); + memcpy(t, packet->options[code].data, + packet->options[code].len); + memcpy(t + packet->options[code].len, + &s[2], len); + packet->options[code].len += len; + t[packet->options[code].len] = 0; + dfree(packet->options[code].data, + "parse_option_buffer"); + packet->options[code].data = t; } s += len + 2; } - packet -> options_valid = 1; + packet->options_valid = 1; } -/* cons options into a big buffer, and then split them out into the - three separate buffers if needed. This allows us to cons up a set - of vendor options using the same routine. */ - -int cons_options (inpacket, outpacket, mms, - options, overload, terminate, bootpp, prl, prl_len) - struct packet *inpacket; - struct dhcp_packet *outpacket; - int mms; - struct tree_cache **options; - int overload; /* Overload flags that may be set. */ - int terminate; - int bootpp; - u_int8_t *prl; - int prl_len; +/* + * cons options into a big buffer, and then split them out into the + * three separate buffers if needed. This allows us to cons up a set of + * vendor options using the same routine. + */ +int +cons_options(struct packet *inpacket, struct dhcp_packet *outpacket, + int mms, struct tree_cache **options, + int overload, /* Overload flags that may be set. */ + int terminate, int bootpp, u_int8_t *prl, int prl_len) { - unsigned char priority_list [300]; + unsigned char priority_list[300]; int priority_len; - unsigned char buffer [4096]; /* Really big buffer... */ + unsigned char buffer[4096]; /* Really big buffer... */ int main_buffer_size; int mainbufix, bufix; int option_size; int length; - /* If the client has provided a maximum DHCP message size, - use that; otherwise, if it's BOOTP, only 64 bytes; otherwise - use up to the minimum IP MTU size (576 bytes). */ - /* XXX if a BOOTP client specifies a max message size, we will - honor it. */ + /* + * If the client has provided a maximum DHCP message size, use + * that; otherwise, if it's BOOTP, only 64 bytes; otherwise use + * up to the minimum IP MTU size (576 bytes). + * + * XXX if a BOOTP client specifies a max message size, we will + * honor it. + */ if (!mms && inpacket && - inpacket -> options [DHO_DHCP_MAX_MESSAGE_SIZE].data && - (inpacket -> options [DHO_DHCP_MAX_MESSAGE_SIZE].len >= - sizeof (u_int16_t))) - mms = getUShort (inpacket -> options - [DHO_DHCP_MAX_MESSAGE_SIZE].data); - - /* If the client has provided a maximum DHCP message size, - use that; otherwise, if it's BOOTP, only 64 bytes; otherwise - use up to the minimum IP MTU size (576 bytes). */ - /* XXX if a BOOTP client specifies a max message size, we will - honor it. */ + inpacket->options[DHO_DHCP_MAX_MESSAGE_SIZE].data && + (inpacket->options[DHO_DHCP_MAX_MESSAGE_SIZE].len >= + sizeof(u_int16_t))) + mms = getUShort( + inpacket->options[DHO_DHCP_MAX_MESSAGE_SIZE].data); + if (mms) main_buffer_size = mms - DHCP_FIXED_LEN; else if (bootpp) @@ -225,242 +236,239 @@ int cons_options (inpacket, outpacket, mms, else main_buffer_size = 576 - DHCP_FIXED_LEN; - if (main_buffer_size > sizeof buffer) - main_buffer_size = sizeof buffer; + if (main_buffer_size > sizeof(buffer)) + main_buffer_size = sizeof(buffer); /* Preload the option priority list with mandatory options. */ priority_len = 0; - priority_list [priority_len++] = DHO_DHCP_MESSAGE_TYPE; - priority_list [priority_len++] = DHO_DHCP_SERVER_IDENTIFIER; - priority_list [priority_len++] = DHO_DHCP_LEASE_TIME; - priority_list [priority_len++] = DHO_DHCP_MESSAGE; - - /* If the client has provided a list of options that it wishes - returned, use it to prioritize. Otherwise, prioritize - based on the default priority list. */ - + priority_list[priority_len++] = DHO_DHCP_MESSAGE_TYPE; + priority_list[priority_len++] = DHO_DHCP_SERVER_IDENTIFIER; + priority_list[priority_len++] = DHO_DHCP_LEASE_TIME; + priority_list[priority_len++] = DHO_DHCP_MESSAGE; + + /* + * If the client has provided a list of options that it wishes + * returned, use it to prioritize. Otherwise, prioritize based + * on the default priority list. + */ if (inpacket && - inpacket -> options [DHO_DHCP_PARAMETER_REQUEST_LIST].data) { - int prlen = (inpacket -> - options [DHO_DHCP_PARAMETER_REQUEST_LIST].len); - if (prlen + priority_len > sizeof priority_list) - prlen = (sizeof priority_list) - priority_len; - - memcpy (&priority_list [priority_len], - (inpacket -> options - [DHO_DHCP_PARAMETER_REQUEST_LIST].data), prlen); + inpacket->options[DHO_DHCP_PARAMETER_REQUEST_LIST].data) { + int prlen = + inpacket->options[DHO_DHCP_PARAMETER_REQUEST_LIST].len; + if (prlen + priority_len > sizeof(priority_list)) + prlen = sizeof(priority_list) - priority_len; + + memcpy(&priority_list[priority_len], + inpacket->options[DHO_DHCP_PARAMETER_REQUEST_LIST].data, + prlen); priority_len += prlen; prl = priority_list; } else if (prl) { - if (prl_len + priority_len > sizeof priority_list) - prl_len = (sizeof priority_list) - priority_len; - - memcpy (&priority_list [priority_len], prl, prl_len); + if (prl_len + priority_len > sizeof(priority_list)) + prl_len = sizeof(priority_list) - priority_len; + + memcpy(&priority_list[priority_len], prl, prl_len); priority_len += prl_len; prl = priority_list; } else { - memcpy (&priority_list [priority_len], - dhcp_option_default_priority_list, - sizeof_dhcp_option_default_priority_list); + memcpy(&priority_list[priority_len], + dhcp_option_default_priority_list, + sizeof_dhcp_option_default_priority_list); priority_len += sizeof_dhcp_option_default_priority_list; } /* Copy the options into the big buffer... */ - option_size = store_options (buffer, - (main_buffer_size - 7 + - ((overload & 1) ? DHCP_FILE_LEN : 0) + - ((overload & 2) ? DHCP_SNAME_LEN : 0)), - options, priority_list, priority_len, - main_buffer_size, - (main_buffer_size + - ((overload & 1) ? DHCP_FILE_LEN : 0)), - terminate); + option_size = store_options( + buffer, + (main_buffer_size - 7 + ((overload & 1) ? DHCP_FILE_LEN : 0) + + ((overload & 2) ? DHCP_SNAME_LEN : 0)), + options, priority_list, priority_len, main_buffer_size, + (main_buffer_size + ((overload & 1) ? DHCP_FILE_LEN : 0)), + terminate); /* Put the cookie up front... */ - memcpy (outpacket -> options, DHCP_OPTIONS_COOKIE, 4); + memcpy(outpacket->options, DHCP_OPTIONS_COOKIE, 4); mainbufix = 4; - /* If we're going to have to overload, store the overload - option at the beginning. If we can, though, just store the - whole thing in the packet's option buffer and leave it at - that. */ + /* + * If we're going to have to overload, store the overload option + * at the beginning. If we can, though, just store the whole + * thing in the packet's option buffer and leave it at that. + */ if (option_size <= main_buffer_size - mainbufix) { - memcpy (&outpacket -> options [mainbufix], - buffer, option_size); + memcpy(&outpacket->options[mainbufix], + buffer, option_size); mainbufix += option_size; if (mainbufix < main_buffer_size) - outpacket -> options [mainbufix++] - = DHO_END; + outpacket->options[mainbufix++] = DHO_END; length = DHCP_FIXED_NON_UDP + mainbufix; } else { - outpacket -> options [mainbufix++] = - DHO_DHCP_OPTION_OVERLOAD; - outpacket -> options [mainbufix++] = 1; - if (option_size > main_buffer_size - mainbufix + DHCP_FILE_LEN) - outpacket -> options [mainbufix++] = 3; + outpacket->options[mainbufix++] = DHO_DHCP_OPTION_OVERLOAD; + outpacket->options[mainbufix++] = 1; + if (option_size > + main_buffer_size - mainbufix + DHCP_FILE_LEN) + outpacket->options[mainbufix++] = 3; else - outpacket -> options [mainbufix++] = 1; + outpacket->options[mainbufix++] = 1; - memcpy (&outpacket -> options [mainbufix], - buffer, main_buffer_size - mainbufix); + memcpy(&outpacket->options[mainbufix], + buffer, main_buffer_size - mainbufix); bufix = main_buffer_size - mainbufix; length = DHCP_FIXED_NON_UDP + mainbufix; if (overload & 1) { if (option_size - bufix <= DHCP_FILE_LEN) { - memcpy (outpacket -> file, - &buffer [bufix], option_size - bufix); + memcpy(outpacket->file, + &buffer[bufix], option_size - bufix); mainbufix = option_size - bufix; if (mainbufix < DHCP_FILE_LEN) - outpacket -> file [mainbufix++] - = DHO_END; + outpacket->file[mainbufix++] = DHO_END; while (mainbufix < DHCP_FILE_LEN) - outpacket -> file [mainbufix++] - = DHO_PAD; + outpacket->file[mainbufix++] = DHO_PAD; } else { - memcpy (outpacket -> file, - &buffer [bufix], DHCP_FILE_LEN); + memcpy(outpacket->file, + &buffer[bufix], DHCP_FILE_LEN); bufix += DHCP_FILE_LEN; } } if ((overload & 2) && option_size < bufix) { - memcpy (outpacket -> sname, - &buffer [bufix], option_size - bufix); + memcpy(outpacket->sname, + &buffer[bufix], option_size - bufix); mainbufix = option_size - bufix; if (mainbufix < DHCP_SNAME_LEN) - outpacket -> file [mainbufix++] - = DHO_END; + outpacket->file[mainbufix++] = DHO_END; while (mainbufix < DHCP_SNAME_LEN) - outpacket -> file [mainbufix++] - = DHO_PAD; + outpacket->file[mainbufix++] = DHO_PAD; } } - return length; + return (length); } -/* Store all the requested options into the requested buffer. */ - -int store_options (buffer, buflen, options, priority_list, priority_len, - first_cutoff, second_cutoff, terminate) - unsigned char *buffer; - int buflen; - struct tree_cache **options; - unsigned char *priority_list; - int priority_len; - int first_cutoff, second_cutoff; - int terminate; +/* + * Store all the requested options into the requested buffer. + */ +int +store_options(unsigned char *buffer, int buflen, struct tree_cache **options, + unsigned char *priority_list, int priority_len, int first_cutoff, + int second_cutoff, int terminate) { int bufix = 0; - int option_stored [256]; + int option_stored[256]; int i; int ix; int tto; /* Zero out the stored-lengths array. */ - memset (option_stored, 0, sizeof option_stored); + memset(option_stored, 0, sizeof(option_stored)); - /* Copy out the options in the order that they appear in the - priority list... */ + /* + * Copy out the options in the order that they appear in the + * priority list... + */ for (i = 0; i < priority_len; i++) { /* Code for next option to try to store. */ - int code = priority_list [i]; + int code = priority_list[i]; int optstart; - /* Number of bytes left to store (some may already - have been stored by a previous pass). */ + /* + * Number of bytes left to store (some may already have + * been stored by a previous pass). + */ int length; /* If no data is available for this option, skip it. */ - if (!options [code]) { + if (!options[code]) { continue; } - /* The client could ask for things that are mandatory, - in which case we should avoid storing them twice... */ - if (option_stored [code]) + /* + * The client could ask for things that are mandatory, + * in which case we should avoid storing them twice... + */ + if (option_stored[code]) continue; - option_stored [code] = 1; + option_stored[code] = 1; /* Find the value of the option... */ - if (!tree_evaluate (options [code])) { + if (!tree_evaluate(options[code])) continue; - } /* We should now have a constant length for the option. */ - length = options [code] -> len; + length = options[code]->len; /* Do we add a NUL? */ - if (terminate && dhcp_options [code].format [0] == 't') { + if (terminate && dhcp_options[code].format[0] == 't') { length++; tto = 1; - } else { + } else tto = 0; - } /* Try to store the option. */ - /* If the option's length is more than 255, we must store it - in multiple hunks. Store 255-byte hunks first. However, - in any case, if the option data will cross a buffer - boundary, split it across that boundary. */ - + /* + * If the option's length is more than 255, we must + * store it in multiple hunks. Store 255-byte hunks + * first. However, in any case, if the option data will + * cross a buffer boundary, split it across that + * boundary. + */ ix = 0; optstart = bufix; while (length) { unsigned char incr = length > 255 ? 255 : length; - /* If this hunk of the buffer will cross a - boundary, only go up to the boundary in this - pass. */ + /* + * If this hunk of the buffer will cross a + * boundary, only go up to the boundary in this + * pass. + */ if (bufix < first_cutoff && bufix + incr > first_cutoff) incr = first_cutoff - bufix; else if (bufix < second_cutoff && - bufix + incr > second_cutoff) + bufix + incr > second_cutoff) incr = second_cutoff - bufix; - /* If this option is going to overflow the buffer, - skip it. */ + /* + * If this option is going to overflow the + * buffer, skip it. + */ if (bufix + 2 + incr > buflen) { bufix = optstart; break; } /* Everything looks good - copy it in! */ - buffer [bufix] = code; - buffer [bufix + 1] = incr; + buffer[bufix] = code; + buffer[bufix + 1] = incr; if (tto && incr == length) { - memcpy (buffer + bufix + 2, - options [code] -> value + ix, - incr - 1); - buffer [bufix + 2 + incr - 1] = 0; - } else { - memcpy (buffer + bufix + 2, - options [code] -> value + ix, incr); - } + memcpy(buffer + bufix + 2, + options[code]->value + ix, incr - 1); + buffer[bufix + 2 + incr - 1] = 0; + } else + memcpy(buffer + bufix + 2, + options[code]->value + ix, incr); length -= incr; ix += incr; bufix += 2 + incr; } } - return bufix; + return (bufix); } -/* Format the specified option so that a human can easily read it. */ - -char *pretty_print_option (code, data, len, emit_commas, emit_quotes) - unsigned int code; - unsigned char *data; - int len; - int emit_commas; - int emit_quotes; +/* + * Format the specified option so that a human can easily read it. + */ +char * +pretty_print_option(unsigned int code, unsigned char *data, int len, + int emit_commas, int emit_quotes) { - static char optbuf [32768]; /* XXX */ + static char optbuf[32768]; /* XXX */ int hunksize = 0; int numhunk = -1; int numelem = 0; - char fmtbuf [32]; + char fmtbuf[32]; int i, j, k; char *op = optbuf; int opleft = sizeof(optbuf); @@ -471,96 +479,92 @@ char *pretty_print_option (code, data, len, emit_commas, emit_quotes) /* Code should be between 0 and 255. */ if (code > 255) - error ("pretty_print_option: bad code %d\n", code); + error("pretty_print_option: bad code %d\n", code); if (emit_commas) comma = ','; else comma = ' '; - + /* Figure out the size of the data. */ - for (i = 0; dhcp_options [code].format [i]; i++) { + for (i = 0; dhcp_options[code].format[i]; i++) { if (!numhunk) { - warn ("%s: Excess information in format string: %s", - dhcp_options [code].name, - &(dhcp_options [code].format [i])); + warn("%s: Excess information in format string: %s", + dhcp_options[code].name, + &(dhcp_options[code].format[i])); break; } numelem++; - fmtbuf [i] = dhcp_options [code].format [i]; - switch (dhcp_options [code].format [i]) { - case 'A': + fmtbuf[i] = dhcp_options[code].format[i]; + switch (dhcp_options[code].format[i]) { + case 'A': --numelem; - fmtbuf [i] = 0; + fmtbuf[i] = 0; numhunk = 0; break; - case 'X': - for (k = 0; k < len; k++) { - if (!isascii (data [k]) || - !isprint (data [k])) + case 'X': + for (k = 0; k < len; k++) + if (!isascii(data[k]) || + !isprint(data[k])) break; - } if (k == len) { - fmtbuf [i] = 't'; + fmtbuf[i] = 't'; numhunk = -2; } else { - fmtbuf [i] = 'x'; + fmtbuf[i] = 'x'; hunksize++; comma = ':'; numhunk = 0; } - fmtbuf [i + 1] = 0; + fmtbuf[i + 1] = 0; break; - case 't': - fmtbuf [i] = 't'; - fmtbuf [i + 1] = 0; + case 't': + fmtbuf[i] = 't'; + fmtbuf[i + 1] = 0; numhunk = -2; break; - case 'I': - case 'l': - case 'L': + case 'I': + case 'l': + case 'L': hunksize += 4; break; - case 's': - case 'S': + case 's': + case 'S': hunksize += 2; break; - case 'b': - case 'B': - case 'f': + case 'b': + case 'B': + case 'f': hunksize++; break; - case 'e': + case 'e': break; - default: - warn ("%s: garbage in format string: %s", - dhcp_options [code].name, - &(dhcp_options [code].format [i])); + default: + warn("%s: garbage in format string: %s", + dhcp_options[code].name, + &(dhcp_options[code].format[i])); break; - } + } } /* Check for too few bytes... */ if (hunksize > len) { - warn ("%s: expecting at least %d bytes; got %d", - dhcp_options [code].name, - hunksize, len); - return "<error>"; + warn("%s: expecting at least %d bytes; got %d", + dhcp_options[code].name, hunksize, len); + return ("<error>"); } /* Check for too many bytes... */ if (numhunk == -1 && hunksize < len) - warn ("%s: %d extra bytes", - dhcp_options [code].name, - len - hunksize); + warn("%s: %d extra bytes", + dhcp_options[code].name, len - hunksize); /* If this is an array, compute its size. */ if (!numhunk) numhunk = len / hunksize; /* See if we got an exact number of hunks. */ if (numhunk > 0 && numhunk * hunksize < len) - warn ("%s: %d extra bytes at end of array", - dhcp_options [code].name, - len - numhunk * hunksize); + warn("%s: %d extra bytes at end of array", + dhcp_options[code].name, len - numhunk * hunksize); /* A one-hunk array prints the same as a single hunk. */ if (numhunk < 0) @@ -569,16 +573,16 @@ char *pretty_print_option (code, data, len, emit_commas, emit_quotes) /* Cycle through the array (or hunk) printing the data. */ for (i = 0; i < numhunk; i++) { for (j = 0; j < numelem; j++) { - int opcount; - switch (fmtbuf [j]) { - case 't': + int opcount; + switch (fmtbuf[j]) { + case 't': if (emit_quotes) { *op++ = '"'; opleft--; } for (; dp < data + len; dp++) { - if (!isascii (*dp) || - !isprint (*dp)) { + if (!isascii(*dp) || + !isprint(*dp)) { if (dp + 1 != data + len || *dp != 0) { snprintf(op, opleft, @@ -587,10 +591,10 @@ char *pretty_print_option (code, data, len, emit_commas, emit_quotes) opleft -= 4; } } else if (*dp == '"' || - *dp == '\'' || - *dp == '$' || - *dp == '`' || - *dp == '\\') { + *dp == '\'' || + *dp == '$' || + *dp == '`' || + *dp == '\\') { *op++ = '\\'; *op++ = *dp; opleft -= 2; @@ -603,80 +607,79 @@ char *pretty_print_option (code, data, len, emit_commas, emit_quotes) *op++ = '"'; opleft--; } - + *op = 0; break; - case 'I': - foo.s_addr = htonl(getULong (dp)); - opcount = strlcpy(op, inet_ntoa (foo), - opleft); - if (opcount >= opleft) + case 'I': + foo.s_addr = htonl(getULong(dp)); + opcount = strlcpy(op, inet_ntoa(foo), opleft); + if (opcount >= opleft) goto toobig; opleft -= opcount; dp += 4; break; - case 'l': - opcount = snprintf(op, opleft,"%ld", - (long)getLong (dp)); - if (opcount >= opleft) + case 'l': + opcount = snprintf(op, opleft, "%ld", + (long)getLong(dp)); + if (opcount >= opleft) goto toobig; opleft -= opcount; dp += 4; break; - case 'L': + case 'L': opcount = snprintf(op, opleft, "%ld", - (unsigned long)getULong (dp)); - if (opcount >= opleft) + (unsigned long)getULong(dp)); + if (opcount >= opleft) goto toobig; opleft -= opcount; dp += 4; break; - case 's': + case 's': opcount = snprintf(op, opleft, "%d", - getShort (dp)); - if (opcount >= opleft) + getShort(dp)); + if (opcount >= opleft) goto toobig; opleft -= opcount; dp += 2; break; - case 'S': + case 'S': opcount = snprintf(op, opleft, "%d", - getUShort (dp)); - if (opcount >= opleft) + getUShort(dp)); + if (opcount >= opleft) goto toobig; opleft -= opcount; dp += 2; break; - case 'b': - opcount = snprintf(op, opleft, "%d", - *(char *)dp++); - if (opcount >= opleft) + case 'b': + opcount = snprintf(op, opleft, "%d", + *(char *)dp++); + if (opcount >= opleft) goto toobig; opleft -= opcount; break; - case 'B': + case 'B': opcount = snprintf(op, opleft, "%d", *dp++); - if (opcount >= opleft) + if (opcount >= opleft) goto toobig; opleft -= opcount; break; - case 'x': + case 'x': opcount = snprintf(op, opleft, "%x", *dp++); - if (opcount >= opleft) + if (opcount >= opleft) goto toobig; opleft -= opcount; break; - case 'f': - opcount = strlcpy(op, - *dp++ ? "true" : "false", opleft); - if (opcount >= opleft) + case 'f': + opcount = strlcpy(op, + *dp++ ? "true" : "false", opleft); + if (opcount >= opleft) goto toobig; opleft -= opcount; break; - default: - warn ("Unexpected format code %c", fmtbuf [j]); + default: + warn("Unexpected format code %c", fmtbuf[j]); } - op += strlen (op); + op += strlen(op); opleft -= strlen(op); if (opleft < 1) goto toobig; @@ -691,52 +694,45 @@ char *pretty_print_option (code, data, len, emit_commas, emit_quotes) } if (opleft < 1) goto toobig; - + } - return optbuf; + return (optbuf); toobig: - warn ("dhcp option too large"); - return "<error>"; + warn("dhcp option too large"); + return ("<error>"); } -void do_packet (interface, packet, len, from_port, from, hfrom) - struct interface_info *interface; - struct dhcp_packet *packet; - int len; - unsigned int from_port; - struct iaddr from; - struct hardware *hfrom; +void +do_packet(struct interface_info *interface, struct dhcp_packet *packet, + int len, unsigned int from_port, struct iaddr from, struct hardware *hfrom) { struct packet tp; int i; - if (packet -> hlen > sizeof packet -> chaddr) { - note ("Discarding packet with invalid hlen."); + if (packet->hlen > sizeof(packet->chaddr)) { + note("Discarding packet with invalid hlen."); return; } - memset (&tp, 0, sizeof tp); + memset(&tp, 0, sizeof(tp)); tp.raw = packet; tp.packet_length = len; tp.client_port = from_port; tp.client_addr = from; tp.interface = interface; tp.haddr = hfrom; - - parse_options (&tp); + + parse_options(&tp); if (tp.options_valid && - tp.options [DHO_DHCP_MESSAGE_TYPE].data) - tp.packet_type = - tp.options [DHO_DHCP_MESSAGE_TYPE].data [0]; + tp.options[DHO_DHCP_MESSAGE_TYPE].data) + tp.packet_type = tp.options[DHO_DHCP_MESSAGE_TYPE].data[0]; if (tp.packet_type) - dhcp (&tp); + dhcp(&tp); else - bootp (&tp); + bootp(&tp); /* Free the data associated with the options. */ - for (i = 0; i < 256; i++) { - if (tp.options [i].len && tp.options [i].data) - dfree (tp.options [i].data, "do_packet"); - } + for (i = 0; i < 256; i++) + if (tp.options[i].len && tp.options[i].data) + dfree(tp.options[i].data, "do_packet"); } - diff --git a/usr.sbin/dhcpd/parse.c b/usr.sbin/dhcpd/parse.c index 05bce05ba72..853c6ae8ff0 100644 --- a/usr.sbin/dhcpd/parse.c +++ b/usr.sbin/dhcpd/parse.c @@ -1,6 +1,6 @@ -/* parse.c +/* $OpenBSD: parse.c,v 1.3 2004/04/14 01:27:49 henning Exp $ */ - Common parser code for dhcpd and dhclient. */ +/* Common parser code for dhcpd and dhclient. */ /* * Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. @@ -44,31 +44,31 @@ #include "dhctoken.h" /* Skip to the semicolon ending the current statement. If we encounter - braces, the matching closing brace terminates the statement. If we - encounter a right brace but haven't encountered a left brace, return - leaving the brace in the token buffer for the caller. If we see a - semicolon and haven't seen a left brace, return. This lets us skip - over: - - statement; - statement foo bar { } - statement foo bar { statement { } } - statement} - - ...et cetera. */ - -void skip_to_semi (cfile) - FILE *cfile; + * braces, the matching closing brace terminates the statement. If we + * encounter a right brace but haven't encountered a left brace, return + * leaving the brace in the token buffer for the caller. If we see a + * semicolon and haven't seen a left brace, return. This lets us skip + * over: + * + * statement; + * statement foo bar { } + * statement foo bar { statement { } } + * statement} + * + * ...et cetera. + */ +void +skip_to_semi(FILE *cfile) { int token; char *val; int brace_count = 0; do { - token = peek_token (&val, cfile); + token = peek_token(&val, cfile); if (token == RBRACE) { if (brace_count) { - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (!--brace_count) return; } else @@ -76,306 +76,307 @@ void skip_to_semi (cfile) } else if (token == LBRACE) { brace_count++; } else if (token == SEMI && !brace_count) { - token = next_token (&val, cfile); + token = next_token(&val, cfile); return; } else if (token == '\n') { - /* EOL only happens when parsing /etc/resolv.conf, - and we treat it like a semicolon because the - resolv.conf file is line-oriented. */ - token = next_token (&val, cfile); + /* + * EOL only happens when parsing + * /etc/resolv.conf, and we treat it like a + * semicolon because the resolv.conf file is + * line-oriented. + */ + token = next_token(&val, cfile); return; } - token = next_token (&val, cfile); + token = next_token(&val, cfile); } while (token != EOF); } -int parse_semi (cfile) - FILE *cfile; +int +parse_semi(FILE *cfile) { int token; char *val; - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != SEMI) { - parse_warn ("semicolon expected."); - skip_to_semi (cfile); - return 0; + parse_warn("semicolon expected."); + skip_to_semi(cfile); + return (0); } - return 1; + return (1); } -/* string-parameter :== STRING SEMI */ - -char *parse_string (cfile) - FILE *cfile; +/* + * string-parameter :== STRING SEMI + */ +char * +parse_string(FILE *cfile) { char *val; int token; char *s; - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != STRING) { - parse_warn ("filename must be a string"); - skip_to_semi (cfile); - return (char *)0; + parse_warn("filename must be a string"); + skip_to_semi(cfile); + return (NULL); } - if (!parse_semi (cfile)) - return (char *)0; - - s = (char *)malloc (strlen (val) + 1); + s = malloc(strlen(val) + 1); if (!s) - error ("no memory for string %s.", val); - strlcpy (s, val, strlen(val) + 1); + error("no memory for string %s.", val); + strlcpy(s, val, strlen(val) + 1); - return s; + if (!parse_semi(cfile)) + return (NULL); + return (s); } -/* hostname :== identifier | hostname DOT identifier */ - -char *parse_host_name (cfile) - FILE *cfile; +/* + * hostname :== identifier | hostname DOT identifier + */ +char * +parse_host_name(FILE *cfile) { char *val; int token; int len = 0; char *s; char *t; - pair c = (pair)0; - + pair c = NULL; + /* Read a dotted hostname... */ do { /* Read a token, which should be an identifier. */ - token = next_token (&val, cfile); - if (!is_identifier (token) && token != NUMBER) { - parse_warn ("expecting an identifier in hostname"); - skip_to_semi (cfile); - return (char *)0; + token = next_token(&val, cfile); + if (!is_identifier(token) && token != NUMBER) { + parse_warn("expecting an identifier in hostname"); + skip_to_semi(cfile); + return (NULL); } /* Store this identifier... */ - if (!(s = (char *)malloc (strlen (val) + 1))) - error ("can't allocate temp space for hostname."); - strlcpy (s, val, strlen(val) + 1); - c = cons ((caddr_t)s, c); - len += strlen (s) + 1; - /* Look for a dot; if it's there, keep going, otherwise - we're done. */ - token = peek_token (&val, cfile); + if (!(s = malloc(strlen(val) + 1))) + error("can't allocate temp space for hostname."); + strlcpy(s, val, strlen(val) + 1); + c = cons((caddr_t)s, c); + len += strlen(s) + 1; + /* + * Look for a dot; if it's there, keep going, otherwise + * we're done. + */ + token = peek_token(&val, cfile); if (token == DOT) - token = next_token (&val, cfile); + token = next_token(&val, cfile); } while (token == DOT); /* Assemble the hostname together into a string. */ - if (!(s = (char *)malloc (len))) - error ("can't allocate space for hostname."); + if (!(s = malloc(len))) + error("can't allocate space for hostname."); t = s + len; - *--t = 0; + *--t = '\0'; while (c) { - pair cdr = c -> cdr; - int l = strlen ((char *)(c -> car)); + pair cdr = c->cdr; + int l = strlen((char *)c->car); t -= l; - memcpy (t, (char *)(c -> car), l); + memcpy(t, (char *)c->car, l); /* Free up temp space. */ - free (c -> car); - free (c); + free(c->car); + free(c); c = cdr; if (t != s) *--t = '.'; } - return s; + return (s); } -int parse_ip_addr (cfile, addr) - FILE *cfile; - struct iaddr *addr; +int +parse_ip_addr(FILE *cfile, struct iaddr *addr) { - addr -> len = 4; - if (parse_numeric_aggregate (cfile, addr -> iabuf, - &addr -> len, DOT, 10, 8)) - return 1; - return 0; -} - -/* hardware-parameter :== HARDWARE ETHERNET csns SEMI - csns :== NUMBER | csns COLON NUMBER */ - -void parse_hardware_param (cfile, hardware) - FILE *cfile; - struct hardware *hardware; + addr->len = 4; + if (parse_numeric_aggregate(cfile, addr->iabuf, + &addr->len, DOT, 10, 8)) + return (1); + return (0); +} + +/* + * hardware-parameter :== HARDWARE ETHERNET csns SEMI + * csns :== NUMBER | csns COLON NUMBER + */ +void +parse_hardware_param(FILE *cfile, struct hardware *hardware) { char *val; int token; int hlen; unsigned char *t; - token = next_token (&val, cfile); + token = next_token(&val, cfile); switch (token) { - case ETHERNET: - hardware -> htype = HTYPE_ETHER; + case ETHERNET: + hardware->htype = HTYPE_ETHER; break; - case TOKEN_RING: - hardware -> htype = HTYPE_IEEE802; + case TOKEN_RING: + hardware->htype = HTYPE_IEEE802; break; - case FDDI: - hardware -> htype = HTYPE_FDDI; + case FDDI: + hardware->htype = HTYPE_FDDI; break; - default: - parse_warn ("expecting a network hardware type"); - skip_to_semi (cfile); + default: + parse_warn("expecting a network hardware type"); + skip_to_semi(cfile); return; } - /* Parse the hardware address information. Technically, - it would make a lot of sense to restrict the length of the - data we'll accept here to the length of a particular hardware - address type. Unfortunately, there are some broken clients - out there that put bogus data in the chaddr buffer, and we accept - that data in the lease file rather than simply failing on such - clients. Yuck. */ + /* + * Parse the hardware address information. Technically, it + * would make a lot of sense to restrict the length of the data + * we'll accept here to the length of a particular hardware + * address type. Unfortunately, there are some broken clients + * out there that put bogus data in the chaddr buffer, and we + * accept that data in the lease file rather than simply failing + * on such clients. Yuck. + */ hlen = 0; - t = parse_numeric_aggregate (cfile, (unsigned char *)0, &hlen, - COLON, 16, 8); + t = parse_numeric_aggregate(cfile, NULL, &hlen, COLON, 16, 8); if (!t) return; - if (hlen > sizeof hardware -> haddr) { - free (t); - parse_warn ("hardware address too long"); + if (hlen > sizeof(hardware->haddr)) { + free(t); + parse_warn("hardware address too long"); } else { - hardware -> hlen = hlen; - memcpy ((unsigned char *)&hardware -> haddr [0], - t, hardware -> hlen); - if (hlen < sizeof hardware -> haddr) - memset (&hardware -> haddr [hlen], 0, - (sizeof hardware -> haddr) - hlen); - free (t); + hardware->hlen = hlen; + memcpy((unsigned char *)&hardware->haddr[0], + t, hardware->hlen); + if (hlen < sizeof(hardware->haddr)) + memset(&hardware->haddr[hlen], 0, + sizeof(hardware->haddr) - hlen); + free(t); } - - token = next_token (&val, cfile); + + token = next_token(&val, cfile); if (token != SEMI) { - parse_warn ("expecting semicolon."); - skip_to_semi (cfile); + parse_warn("expecting semicolon."); + skip_to_semi(cfile); } } -/* lease-time :== NUMBER SEMI */ - -void parse_lease_time (cfile, timep) - FILE *cfile; - time_t *timep; +/* + * lease-time :== NUMBER SEMI + */ +void +parse_lease_time(FILE *cfile, time_t *timep) { char *val; int token; - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("Expecting numeric lease time"); - skip_to_semi (cfile); + parse_warn("Expecting numeric lease time"); + skip_to_semi(cfile); return; } - convert_num ((unsigned char *)timep, val, 10, 32); + convert_num((unsigned char *)timep, val, 10, 32); /* Unswap the number - convert_num returns stuff in NBO. */ - *timep = ntohl (*timep); /* XXX */ + *timep = ntohl(*timep); /* XXX */ - parse_semi (cfile); + parse_semi(cfile); } -/* No BNF for numeric aggregates - that's defined by the caller. What - this function does is to parse a sequence of numbers separated by - the token specified in separator. If max is zero, any number of - numbers will be parsed; otherwise, exactly max numbers are - expected. Base and size tell us how to internalize the numbers - once they've been tokenized. */ - -unsigned char *parse_numeric_aggregate (cfile, buf, - max, separator, base, size) - FILE *cfile; - unsigned char *buf; - int *max; - int separator; - int base; - int size; +/* + * No BNF for numeric aggregates - that's defined by the caller. What + * this function does is to parse a sequence of numbers separated by the + * token specified in separator. If max is zero, any number of numbers + * will be parsed; otherwise, exactly max numbers are expected. Base + * and size tell us how to internalize the numbers once they've been + * tokenized. + */ +unsigned char * +parse_numeric_aggregate(FILE *cfile, unsigned char *buf, int *max, + int separator, int base, int size) { char *val; int token; unsigned char *bufp = buf, *s = NULL; char *t; int count = 0; - pair c = (pair)0; + pair c = NULL; if (!bufp && *max) { - bufp = (unsigned char *)malloc (*max * size / 8); + bufp = malloc(*max * size / 8); if (!bufp) - error ("can't allocate space for numeric aggregate"); + error("can't allocate space for numeric aggregate"); } else s = bufp; do { if (count) { - token = peek_token (&val, cfile); + token = peek_token(&val, cfile); if (token != separator) { if (!*max) break; if (token != RBRACE && token != LBRACE) - token = next_token (&val, cfile); - parse_warn ("too few numbers."); + token = next_token(&val, cfile); + parse_warn("too few numbers."); if (token != SEMI) - skip_to_semi (cfile); - return (unsigned char *)0; + skip_to_semi(cfile); + return (NULL); } - token = next_token (&val, cfile); + token = next_token(&val, cfile); } - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token == EOF) { - parse_warn ("unexpected end of file"); + parse_warn("unexpected end of file"); break; } /* Allow NUMBER_OR_NAME if base is 16. */ if (token != NUMBER && (base != 16 || token != NUMBER_OR_NAME)) { - parse_warn ("expecting numeric value."); - skip_to_semi (cfile); - return (unsigned char *)0; + parse_warn("expecting numeric value."); + skip_to_semi(cfile); + return (NULL); } - /* If we can, convert the number now; otherwise, build - a linked list of all the numbers. */ + /* + * If we can, convert the number now; otherwise, build a + * linked list of all the numbers. + */ if (s) { - convert_num (s, val, base, size); + convert_num(s, val, base, size); s += size / 8; } else { - t = (char *)malloc (strlen (val) + 1); + t = malloc(strlen(val) + 1); if (!t) - error ("no temp space for number."); - strlcpy (t, val, strlen(val)+1); - c = cons (t, c); + error("no temp space for number."); + strlcpy(t, val, strlen(val) + 1); + c = cons(t, c); } } while (++count != *max); /* If we had to cons up a list, convert it now. */ if (c) { - bufp = (unsigned char *)malloc (count * size / 8); + bufp = malloc(count * size / 8); if (!bufp) - error ("can't allocate space for numeric aggregate."); + error("can't allocate space for numeric aggregate."); s = bufp + count - size / 8; *max = count; } while (c) { - pair cdr = c -> cdr; - convert_num (s, (char *)(c -> car), base, size); + pair cdr = c->cdr; + convert_num(s, (char *)c->car, base, size); s -= size / 8; /* Free up temp space. */ - free (c -> car); - free (c); + free(c->car); + free(c); c = cdr; } - return bufp; + return (bufp); } -void convert_num (buf, str, base, size) - unsigned char *buf; - char *str; - int base; - int size; +void +convert_num(unsigned char *buf, char *str, int base, int size) { char *ptr = str; int negative = 0; @@ -385,24 +386,22 @@ void convert_num (buf, str, base, size) if (*ptr == '-') { negative = 1; - ++ptr; + ptr++; } /* If base wasn't specified, figure it out from the data. */ if (!base) { - if (ptr [0] == '0') { - if (ptr [1] == 'x') { + if (ptr[0] == '0') { + if (ptr[1] == 'x') { base = 16; ptr += 2; - } else if (isascii (ptr [1]) && isdigit (ptr [1])) { + } else if (isascii(ptr[1]) && isdigit(ptr[1])) { base = 8; ptr += 1; - } else { + } else base = 10; - } - } else { + } else base = 10; - } } do { @@ -415,12 +414,12 @@ void convert_num (buf, str, base, size) else if (tval >= '0') tval -= '0'; else { - warn ("Bogus number: %s.", str); + warn("Bogus number: %s.", str); break; } if (tval >= base) { - warn ("Bogus number: %s: digit %d not in base %d", - str, tval, base); + warn("Bogus number: %s: digit %d not in base %d", + str, tval, base); break; } val = val * base + tval; @@ -432,211 +431,212 @@ void convert_num (buf, str, base, size) max = (1 << (size - 1)) + ((1 << (size - 1)) - 1); if (val > max) { switch (base) { - case 8: - warn ("value %s%o exceeds max (%d) for precision.", - negative ? "-" : "", val, max); + case 8: + warn("value %s%o exceeds max (%d) for precision.", + negative ? "-" : "", val, max); break; - case 16: - warn ("value %s%x exceeds max (%d) for precision.", - negative ? "-" : "", val, max); + case 16: + warn("value %s%x exceeds max (%d) for precision.", + negative ? "-" : "", val, max); break; - default: - warn ("value %s%u exceeds max (%d) for precision.", - negative ? "-" : "", val, max); + default: + warn("value %s%u exceeds max (%d) for precision.", + negative ? "-" : "", val, max); break; } } - if (negative) { + if (negative) switch (size) { - case 8: + case 8: *buf = -(unsigned long)val; break; - case 16: - putShort (buf, -(unsigned long)val); + case 16: + putShort(buf, -(unsigned long)val); break; - case 32: - putLong (buf, -(unsigned long)val); + case 32: + putLong(buf, -(unsigned long)val); break; - default: - warn ("Unexpected integer size: %d", size); + default: + warn("Unexpected integer size: %d", size); break; } - } else { + else switch (size) { - case 8: + case 8: *buf = (u_int8_t)val; break; - case 16: - putUShort (buf, (u_int16_t)val); + case 16: + putUShort(buf, (u_int16_t)val); break; - case 32: - putULong (buf, val); + case 32: + putULong(buf, val); break; - default: - warn ("Unexpected integer size: %d", size); + default: + warn("Unexpected integer size: %d", size); break; } - } } -/* date :== NUMBER NUMBER SLASH NUMBER SLASH NUMBER - NUMBER COLON NUMBER COLON NUMBER SEMI - - Dates are always in GMT; first number is day of week; next is - year/month/day; next is hours:minutes:seconds on a 24-hour - clock. */ - -time_t parse_date (cfile) - FILE *cfile; +/* + * date :== NUMBER NUMBER SLASH NUMBER SLASH NUMBER + * NUMBER COLON NUMBER COLON NUMBER SEMI + * + * Dates are always in GMT; first number is day of week; next is + * year/month/day; next is hours:minutes:seconds on a 24-hour + * clock. + */ +time_t +parse_date(FILE *cfile) { struct tm tm; int guess; char *val; int token; - static int months [11] = { 31, 59, 90, 120, 151, 181, - 212, 243, 273, 304, 334 }; + static int months[11] = { 31, 59, 90, 120, 151, 181, + 212, 243, 273, 304, 334 }; /* Day of week... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric day of week expected."); + parse_warn("numeric day of week expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_wday = atoi (val); + tm.tm_wday = atoi(val); /* Year... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric year expected."); + parse_warn("numeric year expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_year = atoi (val); + tm.tm_year = atoi(val); if (tm.tm_year > 1900) tm.tm_year -= 1900; /* Slash separating year from month... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != SLASH) { - parse_warn ("expected slash separating year from month."); + parse_warn("expected slash separating year from month."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } /* Month... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric month expected."); + parse_warn("numeric month expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_mon = atoi (val) - 1; + tm.tm_mon = atoi(val) - 1; /* Slash separating month from day... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != SLASH) { - parse_warn ("expected slash separating month from day."); + parse_warn("expected slash separating month from day."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } /* Month... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric day of month expected."); + parse_warn("numeric day of month expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_mday = atoi (val); + tm.tm_mday = atoi(val); /* Hour... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric hour expected."); + parse_warn("numeric hour expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_hour = atoi (val); + tm.tm_hour = atoi(val); /* Colon separating hour from minute... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != COLON) { - parse_warn ("expected colon separating hour from minute."); + parse_warn("expected colon separating hour from minute."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } /* Minute... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric minute expected."); + parse_warn("numeric minute expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_min = atoi (val); + tm.tm_min = atoi(val); /* Colon separating minute from second... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != COLON) { - parse_warn ("expected colon separating hour from minute."); + parse_warn("expected colon separating hour from minute."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } /* Minute... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != NUMBER) { - parse_warn ("numeric minute expected."); + parse_warn("numeric minute expected."); if (token != SEMI) - skip_to_semi (cfile); + skip_to_semi(cfile); return (NULL); } - tm.tm_sec = atoi (val); + tm.tm_sec = atoi(val); tm.tm_isdst = 0; - /* XXX */ /* We assume that mktime does not use tm_yday. */ + /* XXX: We assume that mktime does not use tm_yday. */ tm.tm_yday = 0; /* Make sure the date ends in a semicolon... */ - token = next_token (&val, cfile); + token = next_token(&val, cfile); if (token != SEMI) { - parse_warn ("semicolon expected."); - skip_to_semi (cfile); - return 0; + parse_warn("semicolon expected."); + skip_to_semi(cfile); + return (NULL); } /* Guess the time value... */ guess = ((((((365 * (tm.tm_year - 70) + /* Days in years since '70 */ - (tm.tm_year - 69) / 4 + /* Leap days since '70 */ - (tm.tm_mon /* Days in months this year */ - ? months [tm.tm_mon - 1] - : 0) + - (tm.tm_mon > 1 && /* Leap day this year */ - !((tm.tm_year - 72) & 3)) + - tm.tm_mday - 1) * 24) + /* Day of month */ + (tm.tm_year - 69) / 4 + /* Leap days since '70 */ + (tm.tm_mon /* Days in months this year */ + ? months[tm.tm_mon - 1] + : 0) + + (tm.tm_mon > 1 && /* Leap day this year */ + !((tm.tm_year - 72) & 3)) + + tm.tm_mday - 1) * 24) + /* Day of month */ tm.tm_hour) * 60) + - tm.tm_min) * 60) + tm.tm_sec; - - /* This guess could be wrong because of leap seconds or other - weirdness we don't know about that the system does. For - now, we're just going to accept the guess, but at some point - it might be nice to do a successive approximation here to - get an exact value. Even if the error is small, if the - server is restarted frequently (and thus the lease database - is reread), the error could accumulate into something - significant. */ - - return guess; + tm.tm_min) * 60) + tm.tm_sec; + + /* + * This guess could be wrong because of leap seconds or other + * weirdness we don't know about that the system does. For + * now, we're just going to accept the guess, but at some point + * it might be nice to do a successive approximation here to get + * an exact value. Even if the error is small, if the server + * is restarted frequently (and thus the lease database is + * reread), the error could accumulate into something + * significant. + */ + return (guess); } diff --git a/usr.sbin/dhcpd/tables.c b/usr.sbin/dhcpd/tables.c index d336516c01c..eafe86650c3 100644 --- a/usr.sbin/dhcpd/tables.c +++ b/usr.sbin/dhcpd/tables.c @@ -1,6 +1,6 @@ -/* tables.c +/* $OpenBSD: tables.c,v 1.2 2004/04/14 01:27:49 henning Exp $ */ - Tables of information... */ +/* Tables of information... */ /* * Copyright (c) 1995, 1996 The Internet Software Consortium. @@ -42,25 +42,26 @@ #include "dhcpd.h" -/* DHCP Option names, formats and codes, from RFC1533. - - Format codes: - - e - end of data - I - IP address - l - 32-bit signed integer - L - 32-bit unsigned integer - s - 16-bit signed integer - S - 16-bit unsigned integer - b - 8-bit signed integer - B - 8-bit unsigned integer - t - ASCII text - f - flag (true or false) - A - array of whatever precedes (e.g., IA means array of IP addresses) -*/ +/* + * DHCP Option names, formats and codes, from RFC1533. + * + * Format codes: + * + * e - end of data + * I - IP address + * l - 32-bit signed integer + * L - 32-bit unsigned integer + * s - 16-bit signed integer + * S - 16-bit unsigned integer + * b - 8-bit signed integer + * B - 8-bit unsigned integer + * t - ASCII text + * f - flag (true or false) + * A - array of whatever precedes (e.g., IA means array of IP addresses) + */ struct universe dhcp_universe; -struct option dhcp_options [256] = { +struct option dhcp_options[256] = { { "pad", "", &dhcp_universe, 0 }, { "subnet-mask", "I", &dhcp_universe, 1 }, { "time-offset", "l", &dhcp_universe, 2 }, @@ -319,9 +320,11 @@ struct option dhcp_options [256] = { { "option-end", "e", &dhcp_universe, 255 }, }; -/* Default dhcp option priority list (this is ad hoc and should not be - mistaken for a carefully crafted and optimized list). */ -unsigned char dhcp_option_default_priority_list [] = { +/* + * Default dhcp option priority list (this is ad hoc and should not be + * mistaken for a carefully crafted and optimized list). + */ +unsigned char dhcp_option_default_priority_list[] = { DHO_DHCP_REQUESTED_ADDRESS, DHO_DHCP_OPTION_OVERLOAD, DHO_DHCP_MAX_MESSAGE_SIZE, @@ -401,10 +404,10 @@ unsigned char dhcp_option_default_priority_list [] = { }; int sizeof_dhcp_option_default_priority_list = - sizeof dhcp_option_default_priority_list; + sizeof(dhcp_option_default_priority_list); -char *hardware_types [] = { +char *hardware_types[] = { "unknown-0", "ethernet", "unknown-2", @@ -660,28 +663,30 @@ char *hardware_types [] = { "unknown-252", "unknown-253", "unknown-254", - "unknown-255" }; + "unknown-255" +}; struct hash_table universe_hash; -void initialize_universes() +void +initialize_universes(void) { int i; dhcp_universe.name = "dhcp"; - dhcp_universe.hash = new_hash (); + dhcp_universe.hash = new_hash(); if (!dhcp_universe.hash) - error ("Can't allocate dhcp option hash table."); + error("Can't allocate dhcp option hash table."); for (i = 0; i < 256; i++) { - dhcp_universe.options [i] = &dhcp_options [i]; - add_hash (dhcp_universe.hash, - (unsigned char *)dhcp_options [i].name, 0, - (unsigned char *)&dhcp_options [i]); + dhcp_universe.options[i] = &dhcp_options[i]; + add_hash(dhcp_universe.hash, + (unsigned char *)dhcp_options[i].name, 0, + (unsigned char *)&dhcp_options[i]); } universe_hash.hash_count = DEFAULT_HASH_SIZE; - add_hash (&universe_hash, - (unsigned char *)dhcp_universe.name, 0, - (unsigned char *)&dhcp_universe); + add_hash(&universe_hash, + (unsigned char *)dhcp_universe.name, 0, + (unsigned char *)&dhcp_universe); } |