diff options
Diffstat (limited to 'client/dhclient.c')
-rw-r--r-- | client/dhclient.c | 402 |
1 files changed, 0 insertions, 402 deletions
diff --git a/client/dhclient.c b/client/dhclient.c deleted file mode 100644 index ff22faf0..00000000 --- a/client/dhclient.c +++ /dev/null @@ -1,402 +0,0 @@ -/* dhcp.c - - DHCP Client (really lame DHCP client). */ - -/* - * Copyright (c) 1995, 1996 The Internet Software Consortium. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of The Internet Software Consortium nor the names - * of its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND - * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This software has been written for the Internet Software Consortium - * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie - * Enterprises. To learn more about the Internet Software Consortium, - * see ``http://www.vix.com/isc''. To learn more about Vixie - * Enterprises, see ``http://www.vix.com''. - */ - -#ifndef lint -static char copyright[] = -"$Id: dhclient.c,v 1.19 1996/08/29 09:15:35 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n"; -#endif /* not lint */ - -#include "dhcpd.h" - -TIME cur_time; -TIME default_lease_time = 43200; /* 12 hours... */ -TIME max_lease_time = 86400; /* 24 hours... */ -struct tree_cache *global_options [256]; - -struct iaddr server_identifier; -int server_identifier_matched; -int log_perror = 1; - -#ifdef USE_FALLBACK -struct interface_info fallback_interface; -#endif - -u_int16_t server_port; -int log_priority; - -int lexline, lexchar; -char *tlname, *token_line; - -static void usage PROTO ((void)); - -int main (argc, argv, envp) - int argc; - char **argv, **envp; -{ - int i; - struct servent *ent; - struct interface_info *interface; - -#ifdef SYSLOG_4_2 - openlog ("dhclient", LOG_NDELAY); - log_priority = LOG_DAEMON; -#else - openlog ("dhclient", LOG_NDELAY, LOG_DAEMON); -#endif - -#ifndef NO_PUTENV - /* ensure mktime() calls are processed in UTC */ - putenv("TZ=GMT0"); -#endif /* !NO_PUTENV */ - -#if !(defined (DEBUG) || defined (SYSLOG_4_2)) - setlogmask (LOG_UPTO (LOG_INFO)); -#endif - - for (i = 1; i < argc; i++) { - if (!strcmp (argv [i], "-p")) { - if (++i == argc) - usage (); - server_port = htons (atoi (argv [i])); - debug ("binding to user-specified port %d", - ntohs (server_port)); - } else - usage (); - } - - /* Default to the DHCP/BOOTP port. */ - if (!server_port) - { - ent = getservbyname ("dhcpc", "udp"); - if (!ent) - server_port = htons (68); - else - server_port = ent -> s_port; - endservent (); - } - - /* Get the current time... */ - GET_TIME (&cur_time); - - /* Discover all the network interfaces and initialize them. */ - discover_interfaces (); - - for (interface = interfaces; interface; interface = interface -> next) - send_discover (interface); - - /* Receive packets and dispatch them... */ - dispatch (); - - /* Not reached */ - return 0; -} - -static void usage () -{ - error ("Usage: dhclient [-p <port>]"); -} - -void cleanup () -{ -} - -int commit_leases () -{ - return 0; -} - -int write_lease (lease) - struct lease *lease; -{ - return 0; -} - -void db_startup () -{ -} - -void bootp (packet) - struct packet *packet; -{ - note ("BOOTREPLY from %s", - print_hw_addr (packet -> raw -> htype, - packet -> raw -> hlen, - packet -> raw -> chaddr)); -} - -void dhcp (packet) - struct packet *packet; -{ - switch (packet -> packet_type) { - case DHCPOFFER: - dhcpoffer (packet); - break; - - case DHCPNAK: - dhcpnak (packet); - break; - - case DHCPACK: - dhcpack (packet); - break; - - default: - break; - } -} - -void dhcpoffer (packet) - struct packet *packet; -{ - note ("DHCPOFFER from %s", - print_hw_addr (packet -> raw -> htype, - packet -> raw -> hlen, - packet -> raw -> chaddr)); - - dump_packet (packet); - send_request (packet); -} - -void dhcpack (packet) - struct packet *packet; -{ - note ("DHCPACK from %s", - print_hw_addr (packet -> raw -> htype, - packet -> raw -> hlen, - packet -> raw -> chaddr)); - dump_packet (packet); -} - -void dhcpnak (packet) - struct packet *packet; -{ - note ("DHCPNAK from %s", - print_hw_addr (packet -> raw -> htype, - packet -> raw -> hlen, - packet -> raw -> chaddr)); -} - -static u_int8_t requested_options [] = { - DHO_DHCP_REQUESTED_ADDRESS, - DHO_SUBNET_MASK, - DHO_ROUTERS, - DHO_DOMAIN_NAME_SERVERS, - DHO_HOST_NAME, - DHO_DOMAIN_NAME, - DHO_BROADCAST_ADDRESS }; - -void send_discover (interface) - struct interface_info *interface; -{ - struct sockaddr_in to; - int result; - struct dhcp_packet raw; - unsigned char discover = DHCPDISCOVER; - struct packet outgoing; - - struct tree_cache *options [256]; - struct tree_cache dhcpdiscover_tree; - struct tree_cache dhcprqo_tree; - - memset (options, 0, sizeof options); - memset (&outgoing, 0, sizeof outgoing); - memset (&raw, 0, sizeof raw); - outgoing.raw = &raw; - - /* Set DHCP_MESSAGE_TYPE to DHCPNAK */ - options [DHO_DHCP_MESSAGE_TYPE] = &dhcpdiscover_tree; - options [DHO_DHCP_MESSAGE_TYPE] -> value = &discover; - options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof discover; - options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof discover; - options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF; - options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0; - - /* Set DHCP_MESSAGE to whatever the message is */ - options [DHO_DHCP_MESSAGE] = &dhcprqo_tree; - options [DHO_DHCP_MESSAGE] -> value = requested_options; - options [DHO_DHCP_MESSAGE] -> len = sizeof requested_options; - options [DHO_DHCP_MESSAGE] -> buf_size = sizeof requested_options; - options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF; - options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0; - - /* Set up the option buffer... */ - cons_options ((struct packet *)0, &outgoing, options, 0); - - memset (&raw.ciaddr, 0, sizeof raw.ciaddr); - memset (&raw.siaddr, 0, sizeof raw.siaddr); - memset (&raw.giaddr, 0, sizeof raw.giaddr); - memcpy (raw.chaddr, - interface -> hw_address.haddr, interface -> hw_address.hlen); - raw.hlen = interface -> hw_address.hlen; - raw.htype = interface -> hw_address.htype; - - raw.xid = random (); - raw.secs = 1; - raw.flags = htons (BOOTP_BROADCAST); - raw.hops = 0; - raw.op = BOOTREQUEST; - - /* Report what we're sending... */ - note ("DHCPDISCOVER to %s", interface -> name); - -#ifdef DEBUG_PACKET - dump_packet (&outgoing); - dump_raw ((unsigned char *)&raw, outgoing.packet_length); -#endif - - /* Set up the common stuff... */ - to.sin_family = AF_INET; -#ifdef HAVE_SA_LEN - to.sin_len = sizeof to; -#endif - memset (to.sin_zero, 0, sizeof to.sin_zero); - - to.sin_addr.s_addr = htonl (INADDR_BROADCAST); - to.sin_port = htons (ntohs (server_port) - 1); /* XXX */ - - errno = 0; - result = send_packet (interface, (struct packet *)0, - &raw, outgoing.packet_length, - raw.siaddr, &to, (struct hardware *)0); - if (result < 0) - warn ("send_packet: %m"); -} - -void send_request (packet) - struct packet *packet; -{ - struct sockaddr_in to; - int result; - struct dhcp_packet raw; - unsigned char request = DHCPREQUEST; - struct packet outgoing; - - struct tree_cache *options [256]; - struct tree_cache dhcprequest_tree; - struct tree_cache dhcprqo_tree; - struct tree_cache dhcprqa_tree; - struct tree_cache dhcpsid_tree; - - memset (options, 0, sizeof options); - memset (&outgoing, 0, sizeof outgoing); - memset (&raw, 0, sizeof raw); - outgoing.raw = &raw; - - /* Set DHCP_MESSAGE_TYPE to DHCPNAK */ - options [DHO_DHCP_MESSAGE_TYPE] = &dhcprequest_tree; - options [DHO_DHCP_MESSAGE_TYPE] -> value = &request; - options [DHO_DHCP_MESSAGE_TYPE] -> len = sizeof request; - options [DHO_DHCP_MESSAGE_TYPE] -> buf_size = sizeof request; - options [DHO_DHCP_MESSAGE_TYPE] -> timeout = 0xFFFFFFFF; - options [DHO_DHCP_MESSAGE_TYPE] -> tree = (struct tree *)0; - - /* Set DHCP_MESSAGE to whatever the message is */ - options [DHO_DHCP_MESSAGE] = &dhcprqo_tree; - options [DHO_DHCP_MESSAGE] -> value = requested_options; - options [DHO_DHCP_MESSAGE] -> len = sizeof requested_options; - options [DHO_DHCP_MESSAGE] -> buf_size = sizeof requested_options; - options [DHO_DHCP_MESSAGE] -> timeout = 0xFFFFFFFF; - options [DHO_DHCP_MESSAGE] -> tree = (struct tree *)0; - - /* Request the address we were offered... */ - options [DHO_DHCP_REQUESTED_ADDRESS] = &dhcprqa_tree; - options [DHO_DHCP_REQUESTED_ADDRESS] -> value = - (unsigned char *)&packet -> raw -> yiaddr; - options [DHO_DHCP_REQUESTED_ADDRESS] -> len = 4; - options [DHO_DHCP_REQUESTED_ADDRESS] -> buf_size = 4; - options [DHO_DHCP_REQUESTED_ADDRESS] -> timeout = 0xFFFFFFFF; - options [DHO_DHCP_REQUESTED_ADDRESS] -> tree = (struct tree *)0; - - /* Send back the server identifier... */ - options [DHO_DHCP_SERVER_IDENTIFIER] = &dhcpsid_tree; - options [DHO_DHCP_SERVER_IDENTIFIER] -> value = - packet -> options [DHO_DHCP_SERVER_IDENTIFIER].data; - options [DHO_DHCP_SERVER_IDENTIFIER] -> len = - packet -> options [DHO_DHCP_SERVER_IDENTIFIER].len; - options [DHO_DHCP_SERVER_IDENTIFIER] -> buf_size = - packet -> options [DHO_DHCP_SERVER_IDENTIFIER].len; - options [DHO_DHCP_SERVER_IDENTIFIER] -> timeout = 0xFFFFFFFF; - options [DHO_DHCP_SERVER_IDENTIFIER] -> tree = (struct tree *)0; - - /* Set up the option buffer... */ - cons_options ((struct packet *)0, &outgoing, options, 0); - - memset (&raw.ciaddr, 0, sizeof raw.ciaddr); - raw.siaddr = packet -> raw -> siaddr; - raw.giaddr = packet -> raw -> giaddr; - memcpy (raw.chaddr, - packet -> interface -> hw_address.haddr, - packet -> interface -> hw_address.hlen); - raw.hlen = packet -> interface -> hw_address.hlen; - raw.htype = packet -> interface -> hw_address.htype; - - raw.xid = packet -> raw -> xid; - raw.secs = packet -> raw -> secs; - raw.flags = htons (BOOTP_BROADCAST); - raw.hops = packet -> raw -> hops; - raw.op = BOOTREQUEST; - - /* Report what we're sending... */ - note ("DHCPREQUEST to %s", packet -> interface -> name); - -#ifdef DEBUG_PACKET - dump_packet (&outgoing); - dump_raw ((unsigned char *)&raw, outgoing.packet_length); -#endif - - /* Set up the common stuff... */ - to.sin_family = AF_INET; -#ifdef HAVE_SA_LEN - to.sin_len = sizeof to; -#endif - memset (to.sin_zero, 0, sizeof to.sin_zero); - - to.sin_addr.s_addr = htonl (INADDR_BROADCAST); - to.sin_port = htons (ntohs (server_port) - 1); /* XXX */ - - errno = 0; - result = send_packet (packet -> interface, (struct packet *)0, - &raw, outgoing.packet_length, - raw.siaddr, &to, (struct hardware *)0); - if (result < 0) - warn ("send_packet: %m"); -} |