diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2002-08-23 14:31:28 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2002-08-23 14:31:28 +0000 |
commit | 0be933b5057d33e61aa8b1e3806666765b621f2f (patch) | |
tree | 773d0e2464aa351f8fc2806199fead56d0a04a9d /networking | |
parent | 50812fff219a3d0b9eccb9ff9647d6d66a7934c7 (diff) | |
download | busybox-0be933b5057d33e61aa8b1e3806666765b621f2f.tar.gz |
Use static instead of extern, braces around if's, run through indent
Diffstat (limited to 'networking')
-rw-r--r-- | networking/udhcpc.c | 702 |
1 files changed, 372 insertions, 330 deletions
diff --git a/networking/udhcpc.c b/networking/udhcpc.c index 5f9b5c488..01e6f5ef9 100644 --- a/networking/udhcpc.c +++ b/networking/udhcpc.c @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #include <stdio.h> #include <sys/time.h> #include <sys/types.h> @@ -41,7 +41,7 @@ #include <netinet/udp.h> #include <sys/types.h> #include <sys/wait.h> - + #if __GLIBC__ >=2 && __GLIBC_MINOR >= 1 #include <netpacket/packet.h> #include <net/ethernet.h> @@ -53,11 +53,12 @@ #include "libbb.h" static int state; -static unsigned long requested_ip; /* = 0 */ +static unsigned long requested_ip; /* = 0 */ static unsigned long server_addr; static unsigned long timeout; -static int packet_num; /* = 0 */ +static int packet_num; /* = 0 */ static int fd_main; + /* #define DEBUG */ #define VERSION "0.9.7" @@ -148,7 +149,7 @@ static int listen_mode; #define OPT_DATA 2 enum { - OPTION_IP=1, + OPTION_IP = 1, OPTION_IP_PAIR, OPTION_STRING, OPTION_BOOLEAN, @@ -159,8 +160,8 @@ enum { OPTION_S32 }; -#define OPTION_REQ 0x10 /* have the client request this option */ -#define OPTION_LIST 0x20 /* There can be a list of 1 or more of these */ +#define OPTION_REQ 0x10 /* have the client request this option */ +#define OPTION_LIST 0x20 /* There can be a list of 1 or more of these */ #ifdef SYSLOG # define LOG(level, str, args...) do { printf(str, ## args); \ @@ -189,20 +190,6 @@ enum { # define DEBUG(level, str, args...) do {;} while(0) #endif -struct client_config_t { - char foreground; /* Do not fork */ - char quit_after_lease; /* Quit after obtaining lease */ - char abort_if_no_lease; /* Abort if no lease */ - char *interface; /* The name of the interface to use */ - char *pidfile; /* Optionally store the process ID */ - char *script; /* User script to run at dhcp events */ - unsigned char *clientid; /* Optional client id to use */ - unsigned char *hostname; /* Optional hostname to use */ - int ifindex; /* Index number of the interface to use */ - unsigned char arp[6]; /* Our arp address */ -}; -extern struct client_config_t client_config; - struct dhcpMessage { u_int8_t op; u_int8_t htype; @@ -219,21 +206,34 @@ struct dhcpMessage { u_int8_t sname[64]; u_int8_t file[128]; u_int32_t cookie; - u_int8_t options[308]; /* 312 - cookie */ + u_int8_t options[308]; /* 312 - cookie */ +}; + +struct client_config_t { + char foreground; /* Do not fork */ + char quit_after_lease; /* Quit after obtaining lease */ + char abort_if_no_lease; /* Abort if no lease */ + char *interface; /* The name of the interface to use */ + char *pidfile; /* Optionally store the process ID */ + char *script; /* User script to run at dhcp events */ + unsigned char *clientid; /* Optional client id to use */ + unsigned char *hostname; /* Optional hostname to use */ + int ifindex; /* Index number of the interface to use */ + unsigned char arp[6]; /* Our arp address */ }; struct client_config_t client_config = { /* Default options. */ - abort_if_no_lease: 0, - foreground: 0, - quit_after_lease: 0, - interface: "eth0", - pidfile: NULL, - script: DEFAULT_SCRIPT, - clientid: NULL, - hostname: NULL, - ifindex: 0, - arp: "\0\0\0\0\0\0", /* appease gcc-3.0 */ + abort_if_no_lease:0, + foreground:0, + quit_after_lease:0, + interface:"eth0", + pidfile:NULL, + script:DEFAULT_SCRIPT, + clientid:NULL, + hostname:NULL, + ifindex:0, + arp:"\0\0\0\0\0\0", /* appease gcc-3.0 */ }; struct dhcp_option { @@ -249,70 +249,72 @@ struct udp_dhcp_packet { }; static const struct dhcp_option options[] = { - /* name[10] flags code */ - {"subnet", OPTION_IP | OPTION_REQ, 0x01}, - {"timezone", OPTION_S32, 0x02}, - {"router", OPTION_IP | OPTION_LIST | OPTION_REQ, 0x03}, - {"timesvr", OPTION_IP | OPTION_LIST, 0x04}, - {"namesvr", OPTION_IP | OPTION_LIST, 0x05}, - {"dns", OPTION_IP | OPTION_LIST | OPTION_REQ, 0x06}, - {"logsvr", OPTION_IP | OPTION_LIST, 0x07}, - {"cookiesvr", OPTION_IP | OPTION_LIST, 0x08}, - {"lprsvr", OPTION_IP | OPTION_LIST, 0x09}, - {"hostname", OPTION_STRING | OPTION_REQ, 0x0c}, - {"bootsize", OPTION_U16, 0x0d}, - {"domain", OPTION_STRING | OPTION_REQ, 0x0f}, - {"swapsvr", OPTION_IP, 0x10}, - {"rootpath", OPTION_STRING, 0x11}, - {"ipttl", OPTION_U8, 0x17}, - {"mtu", OPTION_U16, 0x1a}, - {"broadcast", OPTION_IP | OPTION_REQ, 0x1c}, - {"ntpsrv", OPTION_IP | OPTION_LIST, 0x2a}, - {"wins", OPTION_IP | OPTION_LIST, 0x2c}, - {"requestip", OPTION_IP, 0x32}, - {"lease", OPTION_U32, 0x33}, - {"dhcptype", OPTION_U8, 0x35}, - {"serverid", OPTION_IP, 0x36}, - {"message", OPTION_STRING, 0x38}, - {"tftp", OPTION_STRING, 0x42}, - {"bootfile", OPTION_STRING, 0x43}, - {"", 0x00, 0x00} + /* name[10] flags code */ + {"subnet", OPTION_IP | OPTION_REQ, 0x01}, + {"timezone", OPTION_S32, 0x02}, + {"router", OPTION_IP | OPTION_LIST | OPTION_REQ, 0x03}, + {"timesvr", OPTION_IP | OPTION_LIST, 0x04}, + {"namesvr", OPTION_IP | OPTION_LIST, 0x05}, + {"dns", OPTION_IP | OPTION_LIST | OPTION_REQ, 0x06}, + {"logsvr", OPTION_IP | OPTION_LIST, 0x07}, + {"cookiesvr", OPTION_IP | OPTION_LIST, 0x08}, + {"lprsvr", OPTION_IP | OPTION_LIST, 0x09}, + {"hostname", OPTION_STRING | OPTION_REQ, 0x0c}, + {"bootsize", OPTION_U16, 0x0d}, + {"domain", OPTION_STRING | OPTION_REQ, 0x0f}, + {"swapsvr", OPTION_IP, 0x10}, + {"rootpath", OPTION_STRING, 0x11}, + {"ipttl", OPTION_U8, 0x17}, + {"mtu", OPTION_U16, 0x1a}, + {"broadcast", OPTION_IP | OPTION_REQ, 0x1c}, + {"ntpsrv", OPTION_IP | OPTION_LIST, 0x2a}, + {"wins", OPTION_IP | OPTION_LIST, 0x2c}, + {"requestip", OPTION_IP, 0x32}, + {"lease", OPTION_U32, 0x33}, + {"dhcptype", OPTION_U8, 0x35}, + {"serverid", OPTION_IP, 0x36}, + {"message", OPTION_STRING, 0x38}, + {"tftp", OPTION_STRING, 0x42}, + {"bootfile", OPTION_STRING, 0x43}, + {"", 0x00, 0x00} }; /* Lengths of the different option types */ static const unsigned char option_lengths[] = { - [OPTION_IP] = 4, - [OPTION_IP_PAIR] = 8, - [OPTION_BOOLEAN] = 1, - [OPTION_STRING] = 1, - [OPTION_U8] = 1, - [OPTION_U16] = 2, - [OPTION_S16] = 2, - [OPTION_U32] = 4, - [OPTION_S32] = 4 + [OPTION_IP] = 4, + [OPTION_IP_PAIR] = 8, + [OPTION_BOOLEAN] = 1, + [OPTION_STRING] = 1, + [OPTION_U8] = 1, + [OPTION_U16] = 2, + [OPTION_S16] = 2, + [OPTION_U32] = 4, + [OPTION_S32] = 4 }; /* get a rough idea of how long an option will be (rounding up...) */ static const unsigned char max_option_length[] = { - [OPTION_IP] = sizeof("255.255.255.255 "), - [OPTION_IP_PAIR] = sizeof("255.255.255.255 ") * 2, - [OPTION_STRING] = 1, - [OPTION_BOOLEAN] = sizeof("yes "), - [OPTION_U8] = sizeof("255 "), - [OPTION_U16] = sizeof("65535 "), - [OPTION_S16] = sizeof("-32768 "), - [OPTION_U32] = sizeof("4294967295 "), - [OPTION_S32] = sizeof("-2147483684 "), + [OPTION_IP] = sizeof("255.255.255.255 "), + [OPTION_IP_PAIR] = sizeof("255.255.255.255 ") * 2, + [OPTION_STRING] = 1, + [OPTION_BOOLEAN] = sizeof("yes "), + [OPTION_U8] = sizeof("255 "), + [OPTION_U16] = sizeof("65535 "), + [OPTION_S16] = sizeof("-32768 "), + [OPTION_U32] = sizeof("4294967295 "), + [OPTION_S32] = sizeof("-2147483684 "), }; /* return the position of the 'end' option (no bounds checking) */ -static int end_option(unsigned char *optionptr) +static int end_option(unsigned char *optionptr) { int i = 0; - + while (optionptr[i] != DHCP_END) { - if (optionptr[i] == DHCP_PADDING) i++; - else i += optionptr[i + OPT_LEN] + 2; + if (optionptr[i] == DHCP_PADDING) + i++; + else + i += optionptr[i + OPT_LEN] + 2; } return i; } @@ -322,10 +324,11 @@ static int end_option(unsigned char *optionptr) static int add_option_string(unsigned char *optionptr, unsigned char *string) { int end = end_option(optionptr); - + /* end position + string length + option code/length + end option */ if (end + string[OPT_LEN] + 2 + 1 >= 308) { - LOG(LOG_ERR, "Option 0x%02x did not fit into the packet!", string[OPT_CODE]); + LOG(LOG_ERR, "Option 0x%02x did not fit into the packet!", + string[OPT_CODE]); return 0; } DEBUG(LOG_INFO, "adding option 0x%02x", string[OPT_CODE]); @@ -335,7 +338,8 @@ static int add_option_string(unsigned char *optionptr, unsigned char *string) } /* add a one to four byte option to a packet */ -static int add_simple_option(unsigned char *optionptr, unsigned char code, u_int32_t data) +static int add_simple_option(unsigned char *optionptr, unsigned char code, + u_int32_t data) { char length = 0; int i; @@ -344,55 +348,40 @@ static int add_simple_option(unsigned char *optionptr, unsigned char code, u_int u_int16_t *u16; u_int32_t *u32; u_int32_t aligned; + u8 = (unsigned char *) &aligned; - u16 = (u_int16_t *) &aligned; + u16 = (u_int16_t *) & aligned; u32 = &aligned; for (i = 0; options[i].code; i++) if (options[i].code == code) { length = option_lengths[options[i].flags & TYPE_MASK]; } - + if (!length) { DEBUG(LOG_ERR, "Could not add option 0x%02x", code); return 0; } - + option[OPT_CODE] = code; option[OPT_LEN] = length; switch (length) { - case 1: *u8 = data; break; - case 2: *u16 = data; break; - case 4: *u32 = data; break; + case 1: + *u8 = data; + break; + case 2: + *u16 = data; + break; + case 4: + *u32 = data; + break; } memcpy(option + 2, &aligned, length); return add_option_string(optionptr, option); } -#if 0 -void init_header(struct dhcpMessage *packet, char type) -{ - memset(packet, 0, sizeof(struct dhcpMessage)); - switch (type) { - case DHCPDISCOVER: - case DHCPREQUEST: - case DHCPRELEASE: - case DHCPINFORM: - packet->op = BOOTREQUEST; - break; - case DHCPOFFER: - case DHCPACK: - case DHCPNAK: - packet->op = BOOTREPLY; - } - packet->htype = ETH_10MB; - packet->hlen = ETH_10MB_LEN; - packet->cookie = htonl(DHCP_MAGIC); - packet->options[0] = DHCP_END; - add_simple_option(packet->options, DHCP_MESSAGE_TYPE, type); -} -#endif + static u_int16_t checksum(void *addr, int count) { /* Compute Internet Checksum for "count" bytes @@ -401,26 +390,29 @@ static u_int16_t checksum(void *addr, int count) register int32_t sum = 0; u_int16_t *source = (u_int16_t *) addr; - while( count > 1 ) { + while (count > 1) { /* This is the inner loop */ sum += *source++; count -= 2; } /* Add left-over byte, if any */ - if( count > 0 ) - sum += * (unsigned char *) source; + if (count > 0) { + sum += *(unsigned char *) source; + } /* Fold 32-bit sum to 16 bits */ - while (sum>>16) + while (sum >> 16) { sum = (sum & 0xffff) + (sum >> 16); + } return ~sum; } /* Constuct a ip/udp header for a packet, and specify the source and dest hardware address */ -static int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port, - u_int32_t dest_ip, int dest_port, unsigned char *dest_arp, int ifindex) +static int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, + int source_port, u_int32_t dest_ip, int dest_port, + unsigned char *dest_arp, int ifindex) { int l_fd; int result; @@ -431,16 +423,16 @@ static int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int sour DEBUG(LOG_ERR, "socket call failed: %s", sys_errlist[errno]); return -1; } - + memset(&dest, 0, sizeof(dest)); memset(&packet, 0, sizeof(packet)); - + dest.sll_family = AF_PACKET; dest.sll_protocol = htons(ETH_P_IP); dest.sll_ifindex = ifindex; dest.sll_halen = 6; memcpy(dest.sll_addr, dest_arp, 6); - if (bind(l_fd, (struct sockaddr *)&dest, sizeof(struct sockaddr_ll)) < 0) { + if (bind(l_fd, (struct sockaddr *) &dest, sizeof(struct sockaddr_ll)) < 0) { DEBUG(LOG_ERR, "bind call failed: %s", sys_errlist[errno]); close(l_fd); return -1; @@ -451,18 +443,20 @@ static int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int sour packet.ip.daddr = dest_ip; packet.udp.source = htons(source_port); packet.udp.dest = htons(dest_port); - packet.udp.len = htons(sizeof(packet.udp) + sizeof(struct dhcpMessage)); /* cheat on the psuedo-header */ + packet.udp.len = htons(sizeof(packet.udp) + sizeof(struct dhcpMessage)); /* cheat on the psuedo-header */ packet.ip.tot_len = packet.udp.len; memcpy(&(packet.data), payload, sizeof(struct dhcpMessage)); packet.udp.check = checksum(&packet, sizeof(struct udp_dhcp_packet)); - + packet.ip.tot_len = htons(sizeof(struct udp_dhcp_packet)); packet.ip.ihl = sizeof(packet.ip) >> 2; packet.ip.version = IPVERSION; packet.ip.ttl = IPDEFTTL; packet.ip.check = checksum(&(packet.ip), sizeof(packet.ip)); - result = sendto(l_fd, &packet, sizeof(struct udp_dhcp_packet), 0, (struct sockaddr *) &dest, sizeof(dest)); + result = + sendto(l_fd, &packet, sizeof(struct udp_dhcp_packet), 0, + (struct sockaddr *) &dest, sizeof(dest)); if (result <= 0) { DEBUG(LOG_ERR, "write on socket failed: %s", sys_errlist[errno]); } @@ -471,34 +465,41 @@ static int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int sour } /* Let the kernel do all the work for packet generation */ -static int kernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port, - u_int32_t dest_ip, int dest_port) +static int kernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, + int source_port, u_int32_t dest_ip, int dest_port) { int n = 1; int l_fd, result; struct sockaddr_in client; - - if ((l_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) + + if ((l_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { return -1; - - if (setsockopt(l_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) + } + + if (setsockopt(l_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == + -1) { return -1; + } memset(&client, 0, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(source_port); client.sin_addr.s_addr = source_ip; - if (bind(l_fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) + if (bind(l_fd, (struct sockaddr *) &client, sizeof(struct sockaddr)) == + -1) { return -1; + } memset(&client, 0, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(dest_port); - client.sin_addr.s_addr = dest_ip; + client.sin_addr.s_addr = dest_ip; - if (connect(l_fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) + if (connect(l_fd, (struct sockaddr *) &client, sizeof(struct sockaddr)) == + -1) { return -1; + } result = write(l_fd, payload, sizeof(struct dhcpMessage)); close(l_fd); @@ -508,12 +509,13 @@ static int kernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, int s /* initialize a packet with the proper defaults */ static void init_packet(struct dhcpMessage *packet, char type) { - struct vendor { + struct vendor { char vendor, length; - char str[sizeof("udhcp "VERSION)]; - } vendor_id = { DHCP_VENDOR, sizeof("udhcp "VERSION) - 1, "udhcp "VERSION}; - -// init_header(packet, type); + char str[sizeof("udhcp " VERSION)]; + } + vendor_id = { + DHCP_VENDOR, sizeof("udhcp " VERSION) - 1, "udhcp " VERSION}; + memset(packet, 0, sizeof(struct dhcpMessage)); switch (type) { case DHCPDISCOVER: @@ -535,7 +537,9 @@ static void init_packet(struct dhcpMessage *packet, char type) memcpy(packet->chaddr, client_config.arp, 6); add_option_string(packet->options, client_config.clientid); - if (client_config.hostname) add_option_string(packet->options, client_config.hostname); + if (client_config.hostname) { + add_option_string(packet->options, client_config.hostname); + } add_option_string(packet->options, (unsigned char *) &vendor_id); } @@ -547,11 +551,13 @@ static void add_requests(struct dhcpMessage *packet) { int end = end_option(packet->options); int i, len = 0; - + packet->options[end + OPT_CODE] = DHCP_PARAM_REQ; - for (i = 0; options[i].code; i++) - if (options[i].flags & OPTION_REQ) + for (i = 0; options[i].code; i++) { + if (options[i].flags & OPTION_REQ) { packet->options[end + OPT_DATA + len++] = options[i].code; + } + } packet->options[end + OPT_LEN] = len; packet->options[end + OPT_DATA + len] = DHCP_END; @@ -564,17 +570,18 @@ static inline int send_discover(unsigned long xid, unsigned long requested) init_packet(&packet, DHCPDISCOVER); packet.xid = xid; - if (requested) + if (requested) { add_simple_option(packet.options, DHCP_REQUESTED_IP, requested); - + } add_requests(&packet); DEBUG(LOG_DEBUG, "Sending discover..."); - return raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, - SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); + return raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, + SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); } /* Broadcasts a DHCP request message */ -static inline int send_selecting(unsigned long xid, unsigned long server, unsigned long requested) +static inline int send_selecting(unsigned long xid, unsigned long server, + unsigned long requested) { struct dhcpMessage packet; struct in_addr addr; @@ -584,17 +591,18 @@ static inline int send_selecting(unsigned long xid, unsigned long server, unsign add_simple_option(packet.options, DHCP_REQUESTED_IP, requested); add_simple_option(packet.options, DHCP_SERVER_ID, server); - + add_requests(&packet); addr.s_addr = requested; DEBUG(LOG_DEBUG, "Sending select for %s...", inet_ntoa(addr)); - return raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, - SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); + return raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, + SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); } /* Unicasts or broadcasts a DHCP renew message */ -static int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr) +static int send_renew(unsigned long xid, unsigned long server, + unsigned long ciaddr) { struct dhcpMessage packet; @@ -604,45 +612,31 @@ static int send_renew(unsigned long xid, unsigned long server, unsigned long cia add_requests(&packet); DEBUG(LOG_DEBUG, "Sending renew..."); - if (server) - return kernel_packet(&packet, ciaddr, CLIENT_PORT, server, SERVER_PORT); + if (server) { + return kernel_packet(&packet, ciaddr, CLIENT_PORT, server, + SERVER_PORT); + } return raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, - SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); -} + SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); +} /* Create a random xid */ static unsigned long random_xid(void) { static int initialized; + if (!initialized) { srand(time(0)); initialized++; } return rand(); } -#if 0 -/* Unicasts a DHCP release message */ -int send_release(unsigned long server, unsigned long ciaddr) -{ - struct dhcpMessage packet; - - init_packet(&packet, DHCPRELEASE); - packet.xid = random_xid(); - packet.ciaddr = ciaddr; - - add_simple_option(packet.options, DHCP_REQUESTED_IP, ciaddr); - add_simple_option(packet.options, DHCP_SERVER_ID, server); - - LOG(LOG_DEBUG, "Sending release..."); - return kernel_packet(&packet, ciaddr, CLIENT_PORT, server, SERVER_PORT); -} -#endif /* just a little helper */ static void change_mode(int new_mode) { DEBUG(LOG_INFO, "entering %s listen mode", - new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none"); + new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none"); close(fd_main); fd_main = -1; listen_mode = new_mode; @@ -655,8 +649,8 @@ static void renew_requested(int sig) sig = 0; LOG(LOG_INFO, "Received SIGUSR1"); if (state == BOUND || state == RENEWING || state == REBINDING || - state == RELEASED) { - change_mode(LISTEN_KERNEL); + state == RELEASED) { + change_mode(LISTEN_KERNEL); packet_num = 0; state = RENEW_REQUESTED; } @@ -676,7 +670,7 @@ static unsigned char *get_option(struct dhcpMessage *packet, int code) int i, length; unsigned char *optionptr; int over = 0, done = 0, curr = OPTION_FIELD; - + optionptr = packet->options; i = 0; length = 308; @@ -691,7 +685,7 @@ static unsigned char *get_option(struct dhcpMessage *packet, int code) return NULL; } return optionptr + i + 2; - } + } switch (optionptr[i + OPT_CODE]) { case DHCP_PADDING: i++; @@ -715,7 +709,9 @@ static unsigned char *get_option(struct dhcpMessage *packet, int code) i = 0; length = 64; curr = SNAME_FIELD; - } else done = 1; + } else { + done = 1; + } break; default: i += optionptr[OPT_LEN + i] + 2; @@ -723,21 +719,16 @@ static unsigned char *get_option(struct dhcpMessage *packet, int code) } return NULL; } -#if 0 -static int upper_length(int length, struct dhcp_option *option) -{ - return max_option_length[option->flags & TYPE_MASK] * - (length / option_lengths[option->flags & TYPE_MASK]); -} -#endif -static int sprintip(char *dest, char *pre, unsigned char *ip) { +static int sprintip(char *dest, char *pre, unsigned char *ip) +{ return sprintf(dest, "%s%d.%d.%d.%d ", pre, ip[0], ip[1], ip[2], ip[3]); } /* Fill dest with the text of option 'option'. */ -extern inline void fill_options(char *dest, unsigned char *option, const struct dhcp_option *type_p) +static inline void fill_options(char *dest, unsigned char *option, + const struct dhcp_option *type_p) { int type, optlen; u_int16_t val_u16; @@ -750,7 +741,7 @@ extern inline void fill_options(char *dest, unsigned char *option, const struct type = type_p->flags & TYPE_MASK; optlen = option_lengths[type]; - for(;;) { + for (;;) { switch (type) { case OPTION_IP_PAIR: dest += sprintip(dest, "", option); @@ -759,7 +750,7 @@ extern inline void fill_options(char *dest, unsigned char *option, const struct optlen = 4; case OPTION_IP: /* Works regardless of host byte order. */ dest += sprintip(dest, "", option); - break; + break; case OPTION_BOOLEAN: dest += sprintf(dest, *option ? "yes " : "no "); break; @@ -785,11 +776,13 @@ extern inline void fill_options(char *dest, unsigned char *option, const struct case OPTION_STRING: memcpy(dest, option, len); dest[len] = '\0'; - return; /* Short circuit this case */ + return; /* Short circuit this case */ } option += optlen; len -= optlen; - if (len <= 0) break; + if (len <= 0) { + break; + } } } @@ -800,8 +793,9 @@ static char *find_env(const char *prefix, char *defaultstr) const int len = strlen(prefix); for (ptr = environ; *ptr != NULL; ptr++) { - if (strncmp(prefix, *ptr, len) == 0) + if (strncmp(prefix, *ptr, len) == 0) { return *ptr; + } } return defaultstr; } @@ -816,19 +810,28 @@ static char **fill_envp(struct dhcpMessage *packet) unsigned char *temp; char over = 0; - if (packet == NULL) + if (packet == NULL) { num_options = 0; - else { - for (i = 0; options[i].code; i++) - if (get_option(packet, options[i].code)) + } else { + for (i = 0; options[i].code; i++) { + if (get_option(packet, options[i].code)) { num_options++; - if (packet->siaddr) num_options++; - if ((temp = get_option(packet, DHCP_OPTION_OVER))) + } + } + if (packet->siaddr) { + num_options++; + } + if ((temp = get_option(packet, DHCP_OPTION_OVER))) { over = *temp; - if (!(over & FILE_FIELD) && packet->file[0]) num_options++; - if (!(over & SNAME_FIELD) && packet->sname[0]) num_options++; + } + if (!(over & FILE_FIELD) && packet->file[0]) { + num_options++; + } + if (!(over & SNAME_FIELD) && packet->sname[0]) { + num_options++; + } } - + envp = xmalloc((num_options + 5) * sizeof(char *)); envp[0] = xmalloc(sizeof("interface=") + strlen(client_config.interface)); sprintf(envp[0], "interface=%s", client_config.interface); @@ -844,8 +847,11 @@ static char **fill_envp(struct dhcpMessage *packet) sprintip(envp[3], "ip=", (unsigned char *) &packet->yiaddr); for (i = 0, j = 4; options[i].code; i++) { if ((temp = get_option(packet, options[i].code))) { - envp[j] = xmalloc(max_option_length[(&options[i])->flags & TYPE_MASK] * (temp[OPT_LEN - 2] / option_lengths[(&options[i])->flags & TYPE_MASK]) + strlen((&options[i])->name) + 2); -// envp[j] = xmalloc(upper_length(temp[OPT_LEN - 2], &options[i]) + strlen(options[i].name) + 2); + envp[j] = + xmalloc(max_option_length[(&options[i])->flags & TYPE_MASK] * + (temp[OPT_LEN - 2] / + option_lengths[(&options[i])->flags & TYPE_MASK]) + + strlen((&options[i])->name) + 2); fill_options(envp[j], temp, &options[i]); j++; } @@ -865,7 +871,7 @@ static char **fill_envp(struct dhcpMessage *packet) packet->sname[sizeof(packet->sname) - 1] = '\0'; envp[j] = xmalloc(sizeof("sname=") + strlen(packet->sname)); sprintf(envp[j++], "sname=%s", packet->sname); - } + } envp[j] = NULL; return envp; } @@ -876,8 +882,9 @@ static void run_script(struct dhcpMessage *packet, const char *name) int pid; char **envp; - if (client_config.script == NULL) + if (client_config.script == NULL) { return; + } /* call script */ pid = fork(); @@ -886,17 +893,16 @@ static void run_script(struct dhcpMessage *packet, const char *name) return; } else if (pid == 0) { envp = fill_envp(packet); - + /* close fd's? */ - + /* exec script */ DEBUG(LOG_INFO, "execle'ing %s", client_config.script); - execle(client_config.script, client_config.script, - name, NULL, envp); + execle(client_config.script, client_config.script, name, NULL, envp); LOG(LOG_ERR, "script %s failed: %s", - client_config.script, sys_errlist[errno]); + client_config.script, sys_errlist[errno]); exit(1); - } + } } /* SIGUSR2 handler (release) */ @@ -911,12 +917,13 @@ static void release_requested(int sig) init_packet(&packet, DHCPRELEASE); packet.xid = random_xid(); packet.ciaddr = requested_ip; - + add_simple_option(packet.options, DHCP_REQUESTED_IP, requested_ip); add_simple_option(packet.options, DHCP_SERVER_ID, server_addr); DEBUG(LOG_DEBUG, "Sending release..."); - kernel_packet(&packet, requested_ip, CLIENT_PORT, server_addr, SERVER_PORT); + kernel_packet(&packet, requested_ip, CLIENT_PORT, server_addr, + SERVER_PORT); run_script(NULL, "deconfig"); } @@ -929,16 +936,18 @@ static void release_requested(int sig) static int pidfile_acquire(char *pidfile) { int pid_fd; - if (pidfile == NULL) return -1; + if (pidfile == NULL) { + return -1; + } pid_fd = open(pidfile, O_CREAT | O_WRONLY, 0644); if (pid_fd < 0) { LOG(LOG_ERR, "Unable to open pidfile %s: %s\n", - pidfile, strerror(errno)); + pidfile, strerror(errno)); } else { lockf(pid_fd, F_LOCK, 0); } - + return pid_fd; } @@ -947,8 +956,9 @@ static void pidfile_write_release(int pid_fd) { FILE *out; - if (pid_fd < 0) return; - + if (pid_fd < 0) { + return; + } if ((out = fdopen(pid_fd, "w")) != NULL) { fprintf(out, "%d\n", getpid()); fclose(out); @@ -961,7 +971,9 @@ static void pidfile_write_release(int pid_fd) static void exit_client(int retval) { unlink(client_config.pidfile); - if (client_config.pidfile) unlink(client_config.pidfile); + if (client_config.pidfile) { + unlink(client_config.pidfile); + } CLOSE_LOG(); exit(retval); } @@ -976,28 +988,30 @@ static void terminate(int sig) } -extern inline int read_interface(char *interface, int *ifindex, u_int32_t *addr, unsigned char *arp) +static inline int read_interface(char *interface, int *ifindex, + u_int32_t * addr, unsigned char *arp) { int l_fd; struct ifreq ifr; struct sockaddr_in *s_in; memset(&ifr, 0, sizeof(struct ifreq)); - if((l_fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) >= 0) { + if ((l_fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) >= 0) { ifr.ifr_addr.sa_family = AF_INET; strcpy(ifr.ifr_name, interface); - if (addr) { + if (addr) { if (ioctl(l_fd, SIOCGIFADDR, &ifr) == 0) { s_in = (struct sockaddr_in *) &ifr.ifr_addr; *addr = s_in->sin_addr.s_addr; - DEBUG(LOG_INFO, "%s (our ip) = %s", ifr.ifr_name, inet_ntoa(s_in->sin_addr)); + DEBUG(LOG_INFO, "%s (our ip) = %s", ifr.ifr_name, + inet_ntoa(s_in->sin_addr)); } else { LOG(LOG_ERR, "SIOCGIFADDR failed!: %s", sys_errlist[errno]); return -1; } } - + if (ioctl(l_fd, SIOCGIFINDEX, &ifr) == 0) { DEBUG(LOG_INFO, "adapter index %d", ifr.ifr_ifindex); *ifindex = ifr.ifr_ifindex; @@ -1007,8 +1021,9 @@ extern inline int read_interface(char *interface, int *ifindex, u_int32_t *addr, } if (ioctl(l_fd, SIOCGIFHWADDR, &ifr) == 0) { memcpy(arp, ifr.ifr_hwaddr.sa_data, 6); - DEBUG(LOG_INFO, "adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x", - arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]); + DEBUG(LOG_INFO, + "adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x", + arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]); } else { LOG(LOG_ERR, "SIOCGIFHWADDR failed!: %s", sys_errlist[errno]); return -1; @@ -1022,7 +1037,7 @@ extern inline int read_interface(char *interface, int *ifindex, u_int32_t *addr, } -extern inline int listen_socket(unsigned int ip, int port, char *inf) +static inline int listen_socket(unsigned int ip, int port, char *inf) { struct ifreq interface; int l_fd; @@ -1034,32 +1049,36 @@ extern inline int listen_socket(unsigned int ip, int port, char *inf) DEBUG(LOG_ERR, "socket call failed: %s", sys_errlist[errno]); return -1; } - + memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = ip; - if (setsockopt(l_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) { + if (setsockopt(l_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == + -1) { close(l_fd); return -1; } - if (setsockopt(l_fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) { + if (setsockopt(l_fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == + -1) { close(l_fd); return -1; } strncpy(interface.ifr_ifrn.ifrn_name, inf, IFNAMSIZ); - if (setsockopt(l_fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) { + if (setsockopt + (l_fd, SOL_SOCKET, SO_BINDTODEVICE, (char *) &interface, + sizeof(interface)) < 0) { close(l_fd); return -1; } - if (bind(l_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { + if (bind(l_fd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) == -1) { close(l_fd); return -1; } - + return l_fd; } @@ -1074,7 +1093,7 @@ static int raw_socket(int ifindex) DEBUG(LOG_ERR, "socket call failed: %s", sys_errlist[errno]); return -1; } - + sock.sll_family = AF_PACKET; sock.sll_protocol = htons(ETH_P_IP); sock.sll_ifindex = ifindex; @@ -1111,23 +1130,24 @@ static int get_packet(struct dhcpMessage *packet, int l_fd) return -2; } DEBUG(LOG_INFO, "Received a packet"); - - if (packet->op == BOOTREQUEST && (vendor = get_option(packet, DHCP_VENDOR))) { + + if (packet->op == BOOTREQUEST + && (vendor = get_option(packet, DHCP_VENDOR))) { for (i = 0; broken_vendors[i][0]; i++) { - if (vendor[OPT_LEN - 2] == (unsigned char) strlen(broken_vendors[i]) && - !strncmp(vendor, broken_vendors[i], vendor[OPT_LEN - 2])) { - DEBUG(LOG_INFO, "broken client (%s), forcing broadcast", - broken_vendors[i]); - packet->flags |= htons(BROADCAST_FLAG); + if (vendor[OPT_LEN - 2] == + (unsigned char) strlen(broken_vendors[i]) + && !strncmp(vendor, broken_vendors[i], vendor[OPT_LEN - 2])) { + DEBUG(LOG_INFO, "broken client (%s), forcing broadcast", + broken_vendors[i]); + packet->flags |= htons(BROADCAST_FLAG); } } } - return bytes; } -extern inline int get_raw_packet(struct dhcpMessage *payload, int l_fd) +static inline int get_raw_packet(struct dhcpMessage *payload, int l_fd) { int bytes; struct udp_dhcp_packet packet; @@ -1138,30 +1158,31 @@ extern inline int get_raw_packet(struct dhcpMessage *payload, int l_fd) bytes = read(l_fd, &packet, sizeof(struct udp_dhcp_packet)); if (bytes < 0) { DEBUG(LOG_INFO, "couldn't read on raw listening socket -- ignoring"); - usleep(500000); /* possible down interface, looping condition */ + usleep(500000); /* possible down interface, looping condition */ return -1; } - + if (bytes < (int) (sizeof(struct iphdr) + sizeof(struct udphdr))) { DEBUG(LOG_INFO, "message too short, ignoring"); return -1; } - + if (bytes < ntohs(packet.ip.tot_len)) { DEBUG(LOG_INFO, "Truncated packet"); return -1; } - + /* ignore any extra garbage bytes */ bytes = ntohs(packet.ip.tot_len); - + /* Make sure its the right packet for us, and that it passes sanity checks */ if (packet.ip.protocol != IPPROTO_UDP || packet.ip.version != IPVERSION || - packet.ip.ihl != sizeof(packet.ip) >> 2 || packet.udp.dest != htons(CLIENT_PORT) || - bytes > (int) sizeof(struct udp_dhcp_packet) || - ntohs(packet.udp.len) != (short) (bytes - sizeof(packet.ip))) { - DEBUG(LOG_INFO, "unrelated/bogus packet"); - return -1; + packet.ip.ihl != sizeof(packet.ip) >> 2 + || packet.udp.dest != htons(CLIENT_PORT) + || bytes > (int) sizeof(struct udp_dhcp_packet) + || ntohs(packet.udp.len) != (short) (bytes - sizeof(packet.ip))) { + DEBUG(LOG_INFO, "unrelated/bogus packet"); + return -1; } /* check IP checksum */ @@ -1171,7 +1192,7 @@ extern inline int get_raw_packet(struct dhcpMessage *payload, int l_fd) DEBUG(LOG_INFO, "bad IP header checksum, ignoring"); return -1; } - + /* verify the UDP checksum by replacing the header with a psuedo header */ source = packet.ip.saddr; dest = packet.ip.daddr; @@ -1182,14 +1203,15 @@ extern inline int get_raw_packet(struct dhcpMessage *payload, int l_fd) packet.ip.protocol = IPPROTO_UDP; packet.ip.saddr = source; packet.ip.daddr = dest; - packet.ip.tot_len = packet.udp.len; /* cheat on the psuedo-header */ + packet.ip.tot_len = packet.udp.len; /* cheat on the psuedo-header */ if (check && check != checksum(&packet, bytes)) { DEBUG(LOG_ERR, "packet with bad UDP checksum received, ignoring"); return -1; } - - memcpy(payload, &(packet.data), bytes - (sizeof(packet.ip) + sizeof(packet.udp))); - + + memcpy(payload, &(packet.data), + bytes - (sizeof(packet.ip) + sizeof(packet.udp))); + if (ntohl(payload->cookie) != DHCP_MAGIC) { LOG(LOG_ERR, "received bogus message (bad magic) -- ignoring"); return -1; @@ -1214,31 +1236,39 @@ int udhcpc_main(int argc, char *argv[]) time_t now; static struct option l_options[] = { - {"clientid", required_argument, 0, 'c'}, - {"foreground", no_argument, 0, 'f'}, - {"hostname", required_argument, 0, 'H'}, - {"help", no_argument, 0, 'h'}, - {"interface", required_argument, 0, 'i'}, - {"now", no_argument, 0, 'n'}, - {"pidfile", required_argument, 0, 'p'}, - {"quit", no_argument, 0, 'q'}, - {"request", required_argument, 0, 'r'}, - {"script", required_argument, 0, 's'}, - {"version", no_argument, 0, 'v'}, + {"clientid", required_argument, 0, 'c'}, + {"foreground", no_argument, 0, 'f'}, + {"hostname", required_argument, 0, 'H'}, + {"help", no_argument, 0, 'h'}, + {"interface", required_argument, 0, 'i'}, + {"now", no_argument, 0, 'n'}, + {"pidfile", required_argument, 0, 'p'}, + {"quit", no_argument, 0, 'q'}, + {"request", required_argument, 0, 'r'}, + {"script", required_argument, 0, 's'}, + {"version", no_argument, 0, 'v'}, {0, 0, 0, 0} }; /* get options */ while (1) { int option_index = 0; - c = getopt_long(argc, argv, "c:fH:hi:np:qr:s:v", l_options, &option_index); - if (c == -1) break; - + + c = getopt_long(argc, argv, "c:fH:hi:np:qr:s:v", l_options, + &option_index); + if (c == -1) { + break; + } + switch (c) { case 'c': len = strlen(optarg); - if (len > 255) len = 255; - if (client_config.clientid) free(client_config.clientid); + if (len > 255) { + len = 255; + } + if (client_config.clientid) { + free(client_config.clientid); + } client_config.clientid = xmalloc(len + 2); client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID; client_config.clientid[OPT_LEN] = len; @@ -1250,32 +1280,34 @@ int udhcpc_main(int argc, char *argv[]) break; case 'H': len = strlen(optarg); - if (len > 255) len = 255; - if (client_config.hostname) free(client_config.hostname); + if (len > 255) { + len = 255; + } + if (client_config.hostname) { + free(client_config.hostname); + } client_config.hostname = xmalloc(len + 2); client_config.hostname[OPT_CODE] = DHCP_HOST_NAME; client_config.hostname[OPT_LEN] = len; strncpy(client_config.hostname + 2, optarg, len); break; case 'h': - puts( -"Usage: udhcpcd [OPTIONS]\n\n" -" -c, --clientid=CLIENTID Client identifier\n" -" -H, --hostname=HOSTNAME Client hostname\n" -" -f, --foreground Do not fork after getting lease\n" -" -i, --interface=INTERFACE Interface to use (default: eth0)\n" -" -n, --now Exit with failure if lease cannot be\n" -" immediately negotiated.\n" -" -p, --pidfile=file Store process ID of daemon in file\n" -" -q, --quit Quit after obtaining lease\n" -" -r, --request=IP IP address to request (default: none)\n" -" -s, --script=file Run file at dhcp events (default:\n" -" " DEFAULT_SCRIPT ")\n" -" -v, --version Display version" - ); + puts("Usage: udhcpcd [OPTIONS]\n\n" + " -c, --clientid=CLIENTID Client identifier\n" + " -H, --hostname=HOSTNAME Client hostname\n" + " -f, --foreground Do not fork after getting lease\n" + " -i, --interface=INTERFACE Interface to use (default: eth0)\n" + " -n, --now Exit with failure if lease cannot be\n" + " immediately negotiated.\n" + " -p, --pidfile=file Store process ID of daemon in file\n" + " -q, --quit Quit after obtaining lease\n" + " -r, --request=IP IP address to request (default: none)\n" + " -s, --script=file Run file at dhcp events (default:\n" + " " DEFAULT_SCRIPT ")\n" + " -v, --version Display version"); return 0; case 'i': - client_config.interface = optarg; + client_config.interface = optarg; break; case 'n': client_config.abort_if_no_lease = 1; @@ -1305,10 +1337,12 @@ int udhcpc_main(int argc, char *argv[]) pid_fd = pidfile_acquire(client_config.pidfile); pidfile_write_release(pid_fd); - if (read_interface(client_config.interface, &client_config.ifindex, NULL, client_config.arp) < 0) { + if (read_interface + (client_config.interface, &client_config.ifindex, NULL, + client_config.arp) < 0) { exit_client(1); } - + if (!client_config.clientid) { client_config.clientid = xmalloc(6 + 3); client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID; @@ -1321,7 +1355,7 @@ int udhcpc_main(int argc, char *argv[]) signal(SIGUSR1, renew_requested); signal(SIGUSR2, release_requested); signal(SIGTERM, terminate); - + state = INIT_SELECTING; run_script(NULL, "deconfig"); change_mode(LISTEN_RAW); @@ -1333,12 +1367,15 @@ int udhcpc_main(int argc, char *argv[]) if (listen_mode != LISTEN_NONE && fd_main < 0) { if (listen_mode == LISTEN_KERNEL) { - fd_main = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface); + fd_main = + listen_socket(INADDR_ANY, CLIENT_PORT, + client_config.interface); } else { fd_main = raw_socket(client_config.ifindex); } if (fd_main < 0) { - LOG(LOG_ERR, "FATAL: couldn't listen on socket, %s", sys_errlist[errno]); + LOG(LOG_ERR, "FATAL: couldn't listen on socket, %s", + sys_errlist[errno]); exit_client(0); } } @@ -1350,7 +1387,7 @@ int udhcpc_main(int argc, char *argv[]) DEBUG(LOG_INFO, "Waiting on select...\n"); retval = select(fd_main + 1, &rfds, NULL, NULL, &tv); } else { - retval = 0; /* If we already timed out, fall through */ + retval = 0; /* If we already timed out, fall through */ } now = time(0); @@ -1363,7 +1400,7 @@ int udhcpc_main(int argc, char *argv[]) xid = random_xid(); } /* send discover packet */ - send_discover(xid, requested_ip); /* broadcast */ + send_discover(xid, requested_ip); /* broadcast */ timeout = now + ((packet_num == 2) ? 10 : 2); packet_num++; @@ -1382,9 +1419,9 @@ int udhcpc_main(int argc, char *argv[]) if (packet_num < 3) { /* send request packet */ if (state == RENEW_REQUESTED) { - send_renew(xid, server_addr, requested_ip); /* unicast */ + send_renew(xid, server_addr, requested_ip); /* unicast */ } else { - send_selecting(xid, server_addr, requested_ip); /* broadcast */ + send_selecting(xid, server_addr, requested_ip); /* broadcast */ } timeout = now + ((packet_num == 2) ? 10 : 2); packet_num++; @@ -1411,8 +1448,8 @@ int udhcpc_main(int argc, char *argv[]) DEBUG(LOG_INFO, "Entering rebinding state"); } else { /* send a request packet */ - send_renew(xid, server_addr, requested_ip); /* unicast */ - + send_renew(xid, server_addr, requested_ip); /* unicast */ + t1 = (t2 - t1) / 2 + t1; timeout = t1 + start; } @@ -1429,7 +1466,7 @@ int udhcpc_main(int argc, char *argv[]) change_mode(LISTEN_RAW); } else { /* send a request packet */ - send_renew(xid, 0, requested_ip); /* broadcast */ + send_renew(xid, 0, requested_ip); /* broadcast */ t2 = (lease - t2) / 2 + t2; timeout = t2 + start; @@ -1440,17 +1477,19 @@ int udhcpc_main(int argc, char *argv[]) timeout = 0x7fffffff; break; } - } else if (retval > 0 && listen_mode != LISTEN_NONE && FD_ISSET(fd_main, &rfds)) { + } else if (retval > 0 && listen_mode != LISTEN_NONE + && FD_ISSET(fd_main, &rfds)) { /* a packet is ready, read it */ - + if (listen_mode == LISTEN_KERNEL) { len = get_packet(&packet, fd_main); } else { len = get_raw_packet(&packet, fd_main); } if (len == -1 && errno != EINTR) { - DEBUG(LOG_INFO, "error on read, %s, reopening socket", sys_errlist[errno]); - change_mode(listen_mode); /* just close and reopen */ + DEBUG(LOG_INFO, "error on read, %s, reopening socket", + sys_errlist[errno]); + change_mode(listen_mode); /* just close and reopen */ } if (len < 0) { continue; @@ -1458,15 +1497,15 @@ int udhcpc_main(int argc, char *argv[]) if (packet.xid != xid) { DEBUG(LOG_INFO, "Ignoring XID %lx (our xid is %lx)", - (unsigned long) packet.xid, xid); + (unsigned long) packet.xid, xid); continue; } - + if ((message = get_option(&packet, DHCP_MESSAGE_TYPE)) == NULL) { DEBUG(LOG_ERR, "couldnt get option from packet -- ignoring"); continue; } - + switch (state) { case INIT_SELECTING: /* Must be a DHCPOFFER to one of our xid's */ @@ -1475,7 +1514,7 @@ int udhcpc_main(int argc, char *argv[]) memcpy(&server_addr, temp, 4); xid = packet.xid; requested_ip = packet.yiaddr; - + /* enter requesting state */ state = REQUESTING; timeout = now; @@ -1491,43 +1530,47 @@ int udhcpc_main(int argc, char *argv[]) case REBINDING: if (*message == DHCPACK) { if (!(temp = get_option(&packet, DHCP_LEASE_TIME))) { - LOG(LOG_ERR, "No lease time with ACK, using 1 hour lease"); + LOG(LOG_ERR, + "No lease time with ACK, using 1 hour lease"); lease = 60 * 60; } else { memcpy(&lease, temp, 4); lease = ntohl(lease); } - + /* enter bound state */ t1 = lease / 2; - + /* little fixed point for n * .875 */ t2 = (lease * 0x7) >> 3; temp_addr.s_addr = packet.yiaddr; - LOG(LOG_INFO, "Lease of %s obtained, lease time %ld", inet_ntoa(temp_addr), lease); + LOG(LOG_INFO, "Lease of %s obtained, lease time %ld", + inet_ntoa(temp_addr), lease); start = now; timeout = t1 + start; requested_ip = packet.yiaddr; - run_script(&packet, ((state == RENEWING || state == REBINDING) ? "renew" : "bound")); + run_script(&packet, + ((state == RENEWING + || state == REBINDING) ? "renew" : "bound")); state = BOUND; change_mode(LISTEN_NONE); { int pid_fd2; + if (client_config.quit_after_lease) { exit_client(0); } else if (!client_config.foreground) { - pid_fd2 = pidfile_acquire(client_config.pidfile); /* hold lock during fork. */ + pid_fd2 = pidfile_acquire(client_config.pidfile); /* hold lock during fork. */ if (daemon(0, 0) == -1) { perror("fork"); exit_client(1); } - client_config.foreground = 1; /* Do not fork again. */ + client_config.foreground = 1; /* Do not fork again. */ pidfile_write_release(pid_fd2); } } - } - else if (*message == DHCPNAK) { + } else if (*message == DHCPNAK) { /* return to init state */ LOG(LOG_INFO, "Received DHCP NAK"); run_script(&packet, "nak"); @@ -1539,20 +1582,19 @@ int udhcpc_main(int argc, char *argv[]) requested_ip = 0; packet_num = 0; change_mode(LISTEN_RAW); - sleep(3); /* avoid excessive network traffic */ + sleep(3); /* avoid excessive network traffic */ } break; - /* case BOUND, RELEASED: - ignore all packets */ - } - } - else if (retval == -1 && errno == EINTR) { + /* case BOUND, RELEASED: - ignore all packets */ + } + } else if (retval == -1 && errno == EINTR) { /* a signal was caught */ - + } else { /* An error occured */ DEBUG(LOG_ERR, "Error on select"); } - + } return 0; } |