udhcp: fix indentation and style. Eliminate (group) a lot of smallish *.h files Remove lots of unneeded #includes
No binary (build failed)
—
(log yok)
| @@ -6,18 +6,31 @@ | |
| * by Yoichi Hariguchi <[email protected]> | |
| */ | |
| - | #include <time.h> |
| - | #include <sys/socket.h> |
| #include <netinet/if_ether.h> | |
| #include <net/if_arp.h> | |
| - | #include <netinet/in.h> |
| - | #include <string.h> |
| - | #include <unistd.h> |
| - | #include <errno.h> |
| - | #include "dhcpd.h" |
| - | #include "arpping.h" |
| #include "common.h" | |
| + | #include "dhcpd.h" |
| + | |
| + | |
| + | struct arpMsg { |
| + | /* Ethernet header */ |
| + | u_char h_dest[6]; /* destination ether addr */ |
| + | u_char h_source[6]; /* source ether addr */ |
| + | u_short h_proto; /* packet type ID field */ |
| + | |
| + | /* ARP packet */ |
| + | uint16_t htype; /* hardware type (must be ARPHRD_ETHER) */ |
| + | uint16_t ptype; /* protocol type (must be ETH_P_IP) */ |
| + | uint8_t hlen; /* hardware address length (must be 6) */ |
| + | uint8_t plen; /* protocol address length (must be 4) */ |
| + | uint16_t operation; /* ARP opcode */ |
| + | uint8_t sHaddr[6]; /* sender's hardware address */ |
| + | uint8_t sInaddr[4]; /* sender's IP address */ |
| + | uint8_t tHaddr[6]; /* target's hardware address */ |
| + | uint8_t tInaddr[4]; /* target's IP address */ |
| + | uint8_t pad[18]; /* pad for min. Ethernet payload (60 bytes) */ |
| + | } ATTRIBUTE_PACKED; |
| /* args: yiaddr - what IP to ping | |
| * ip - our ip | |
| @@ -1,36 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* |
| - | * arpping .h |
| - | */ |
| - | |
| - | #ifndef ARPPING_H |
| - | #define ARPPING_H |
| - | |
| - | #include <netinet/if_ether.h> |
| - | #include <net/if_arp.h> |
| - | #include <net/if.h> |
| - | #include <netinet/in.h> |
| - | |
| - | struct arpMsg { |
| - | /* Ethernet header */ |
| - | u_char h_dest[6]; /* destination ether addr */ |
| - | u_char h_source[6]; /* source ether addr */ |
| - | u_short h_proto; /* packet type ID field */ |
| - | |
| - | /* ARP packet */ |
| - | uint16_t htype; /* hardware type (must be ARPHRD_ETHER) */ |
| - | uint16_t ptype; /* protocol type (must be ETH_P_IP) */ |
| - | uint8_t hlen; /* hardware address length (must be 6) */ |
| - | uint8_t plen; /* protocol address length (must be 4) */ |
| - | uint16_t operation; /* ARP opcode */ |
| - | uint8_t sHaddr[6]; /* sender's hardware address */ |
| - | uint8_t sInaddr[4]; /* sender's IP address */ |
| - | uint8_t tHaddr[6]; /* target's hardware address */ |
| - | uint8_t tInaddr[4]; /* target's IP address */ |
| - | uint8_t pad[18]; /* pad for min. Ethernet payload (60 bytes) */ |
| - | } ATTRIBUTE_PACKED; |
| - | |
| - | /* function prototypes */ |
| - | int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *arp, char *interface); |
| - | |
| - | #endif |
| @@ -8,8 +8,6 @@ | |
| * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | |
| */ | |
| - | #include <string.h> |
| - | #include <sys/socket.h> |
| #include <features.h> | |
| #if (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION | |
| #include <netpacket/packet.h> | |
| @@ -19,19 +17,11 @@ | |
| #include <linux/if_packet.h> | |
| #include <linux/if_ether.h> | |
| #endif | |
| - | #include <stdlib.h> |
| - | #include <time.h> |
| - | #include <unistd.h> |
| - | #include <netinet/in.h> |
| - | #include <arpa/inet.h> |
| - | #include <fcntl.h> |
| - | |
| + | #include "common.h" |
| #include "dhcpd.h" | |
| - | #include "clientpacket.h" |
| - | #include "options.h" |
| #include "dhcpc.h" | |
| - | #include "common.h" |
| + | #include "options.h" |
| /* Create a random xid */ | |
| @@ -59,7 +49,7 @@ static void init_packet(struct dhcpMessage *packet, char type) | |
| udhcp_init_header(packet, type); | |
| memcpy(packet->chaddr, client_config.arp, 6); | |
| if (client_config.clientid) | |
| - | add_option_string(packet->options, client_config.clientid); |
| + | add_option_string(packet->options, client_config.clientid); |
| if (client_config.hostname) add_option_string(packet->options, client_config.hostname); | |
| if (client_config.fqdn) add_option_string(packet->options, client_config.fqdn); | |
| add_option_string(packet->options, client_config.vendorclass); | |
| @@ -97,7 +87,7 @@ int send_discover(unsigned long xid, unsigned long requested) | |
| add_requests(&packet); | |
| bb_info_msg("Sending discover..."); | |
| return udhcp_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); |
| } | |
| @@ -188,10 +178,12 @@ int get_raw_packet(struct dhcpMessage *payload, int fd) | |
| 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) != (uint16_t) (bytes - sizeof(packet.ip))) { |
| + | 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) != (uint16_t)(bytes - sizeof(packet.ip)) |
| + | ) { |
| DEBUG("Unrelated/bogus packet"); | |
| return -2; | |
| } | |
| @@ -1,15 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | #ifndef _CLIENTPACKET_H |
| - | #define _CLIENTPACKET_H |
| - | |
| - | #include "packet.h" |
| - | |
| - | unsigned long random_xid(void); |
| - | int send_discover(unsigned long xid, unsigned long requested); |
| - | int send_selecting(unsigned long xid, unsigned long server, unsigned long requested); |
| - | int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr); |
| - | int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr); |
| - | int send_release(unsigned long server, unsigned long ciaddr); |
| - | int get_raw_packet(struct dhcpMessage *payload, int fd); |
| - | |
| - | #endif |
| @@ -21,10 +21,6 @@ | |
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| */ | |
| - | #include <sys/types.h> |
| - | #include <sys/socket.h> |
| - | #include <unistd.h> |
| - | #include <netinet/in.h> |
| #include <features.h> | |
| #if (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined(_NEWLIB_VERSION) | |
| #include <netpacket/packet.h> | |
| @@ -35,7 +31,6 @@ | |
| #include <linux/if_ether.h> | |
| #endif | |
| - | #include "clientsocket.h" |
| #include "common.h" | |
| @@ -45,7 +40,8 @@ int raw_socket(int ifindex) | |
| struct sockaddr_ll sock; | |
| DEBUG("Opening raw socket on ifindex %d", ifindex); | |
| - | if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) { |
| + | fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); |
| + | if (fd < 0) { |
| bb_perror_msg("socket"); | |
| return -1; | |
| } | |
| @@ -54,7 +50,7 @@ int raw_socket(int ifindex) | |
| sock.sll_protocol = htons(ETH_P_IP); | |
| sock.sll_ifindex = ifindex; | |
| if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) < 0) { | |
| - | bb_perror_msg("bind:"); |
| + | bb_perror_msg("bind"); |
| close(fd); | |
| return -1; | |
| } | |
| @@ -1,8 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* clientsocket.h */ |
| - | #ifndef _CLIENTSOCKET_H |
| - | #define _CLIENTSOCKET_H |
| - | |
| - | int raw_socket(int ifindex); |
| - | |
| - | #endif |
| @@ -10,23 +10,11 @@ | |
| * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | |
| */ | |
| - | #include <fcntl.h> |
| - | #include <unistd.h> |
| - | #include <errno.h> |
| - | #include <string.h> |
| - | #include <stdlib.h> |
| - | #include <signal.h> |
| - | #include <paths.h> |
| - | #include <sys/socket.h> |
| - | #include <stdarg.h> |
| #include <syslog.h> | |
| #include "common.h" | |
| - | #include "pidfile.h" |
| - | static int daemonized; |
| - | |
| long uptime(void) | |
| { | |
| struct sysinfo info; | |
| @@ -61,7 +49,6 @@ void udhcp_background(const char *pidfile) | |
| pid_fd = pidfile_acquire(pidfile); | |
| setsid(); | |
| xdaemon(0, 0); | |
| - | daemonized++; |
| logmode &= ~LOGMODE_STDIO; | |
| pidfile_write_release(pid_fd); | |
| #endif /* __uClinux__ */ | |
| @@ -10,14 +10,99 @@ | |
| #ifndef _COMMON_H | |
| #define _COMMON_H | |
| - | #include "libbb_udhcp.h" |
| + | #include "busybox.h" |
| + | |
| + | #ifdef CONFIG_INSTALL_NO_USR |
| + | # define DEFAULT_SCRIPT "/share/udhcpc/default.script" |
| + | #else |
| + | # define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script" |
| + | #endif |
| + | |
| + | #define COMBINED_BINARY |
| + | |
| + | |
| + | /*** packet.h ***/ |
| + | |
| + | #include <netinet/udp.h> |
| + | #include <netinet/ip.h> |
| + | |
| + | struct dhcpMessage { |
| + | uint8_t op; |
| + | uint8_t htype; |
| + | uint8_t hlen; |
| + | uint8_t hops; |
| + | uint32_t xid; |
| + | uint16_t secs; |
| + | uint16_t flags; |
| + | uint32_t ciaddr; |
| + | uint32_t yiaddr; |
| + | uint32_t siaddr; |
| + | uint32_t giaddr; |
| + | uint8_t chaddr[16]; |
| + | uint8_t sname[64]; |
| + | uint8_t file[128]; |
| + | uint32_t cookie; |
| + | uint8_t options[308]; /* 312 - cookie */ |
| + | }; |
| + | |
| + | struct udp_dhcp_packet { |
| + | struct iphdr ip; |
| + | struct udphdr udp; |
| + | struct dhcpMessage data; |
| + | }; |
| + | |
| + | void udhcp_init_header(struct dhcpMessage *packet, char type); |
| + | int udhcp_get_packet(struct dhcpMessage *packet, int fd); |
| + | uint16_t udhcp_checksum(void *addr, int count); |
| + | int udhcp_raw_packet(struct dhcpMessage *payload, |
| + | uint32_t source_ip, int source_port, |
| + | uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex); |
| + | int udhcp_kernel_packet(struct dhcpMessage *payload, |
| + | uint32_t source_ip, int source_port, |
| + | uint32_t dest_ip, int dest_port); |
| + | |
| + | |
| + | /**/ |
| + | |
| + | void udhcp_background(const char *pidfile); |
| + | void udhcp_start_log_and_pid(const char *pidfile); |
| + | |
| + | void udhcp_run_script(struct dhcpMessage *packet, const char *name); |
| + | |
| + | // Still need to clean these up... |
| + | |
| + | /* from pidfile.h */ |
| + | #define pidfile_acquire udhcp_pidfile_acquire |
| + | #define pidfile_write_release udhcp_pidfile_write_release |
| + | /* from options.h */ |
| + | #define get_option udhcp_get_option |
| + | #define end_option udhcp_end_option |
| + | #define add_option_string udhcp_add_option_string |
| + | #define add_simple_option udhcp_add_simple_option |
| + | #define option_lengths udhcp_option_lengths |
| + | /* from socket.h */ |
| + | #define listen_socket udhcp_listen_socket |
| + | #define read_interface udhcp_read_interface |
| + | /* from dhcpc.h */ |
| + | #define client_config udhcp_client_config |
| + | /* from dhcpd.h */ |
| + | #define server_config udhcp_server_config |
| long uptime(void); | |
| + | void udhcp_sp_setup(void); |
| + | int udhcp_sp_fd_set(fd_set *rfds, int extra_fd); |
| + | int udhcp_sp_read(fd_set *rfds); |
| + | int raw_socket(int ifindex); |
| + | int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp); |
| + | int listen_socket(uint32_t ip, int port, char *inf); |
| + | int pidfile_acquire(const char *pidfile); |
| + | void pidfile_write_release(int pid_fd); |
| + | int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *arp, char *interface); |
| #if ENABLE_FEATURE_UDHCP_DEBUG | |
| # define DEBUG(str, args...) bb_info_msg(str, ## args) | |
| #else | |
| - | # define DEBUG(str, args...) do {;} while(0) |
| + | # define DEBUG(str, args...) do {;} while (0) |
| #endif | |
| #endif | |
| @@ -8,28 +8,13 @@ | |
| * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | |
| */ | |
| - | #include <sys/file.h> |
| - | #include <unistd.h> |
| #include <getopt.h> | |
| - | #include <stdlib.h> |
| - | #include <sys/socket.h> |
| - | #include <netinet/in.h> |
| - | #include <arpa/inet.h> |
| - | #include <signal.h> |
| - | #include <time.h> |
| - | #include <string.h> |
| - | #include <sys/ioctl.h> |
| - | #include <net/if.h> |
| - | #include <errno.h> |
| #include "common.h" | |
| #include "dhcpd.h" | |
| #include "dhcpc.h" | |
| #include "options.h" | |
| - | #include "clientpacket.h" |
| - | #include "clientsocket.h" |
| - | #include "socket.h" |
| - | #include "signalpipe.h" |
| + | |
| static int state; | |
| /* Something is definitely wrong here. IPv4 addresses | |
| @@ -3,9 +3,6 @@ | |
| #ifndef _DHCPC_H | |
| #define _DHCPC_H | |
| - | /* grab define DEFAULT_SCRIPT */ |
| - | #include "libbb_udhcp.h" |
| - | |
| #define INIT_SELECTING 0 | |
| #define REQUESTING 1 | |
| #define BOUND 2 | |
| @@ -15,7 +12,6 @@ | |
| #define RENEW_REQUESTED 6 | |
| #define RELEASED 7 | |
| - | |
| struct client_config_t { | |
| char foreground; /* Do not fork */ | |
| char quit_after_lease; /* Quit after obtaining lease */ | |
| @@ -38,4 +34,15 @@ struct client_config_t { | |
| extern struct client_config_t client_config; | |
| + | /*** clientpacket.h ***/ |
| + | |
| + | unsigned long random_xid(void); |
| + | int send_discover(unsigned long xid, unsigned long requested); |
| + | int send_selecting(unsigned long xid, unsigned long server, unsigned long requested); |
| + | int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr); |
| + | int send_renew(unsigned long xid, unsigned long server, unsigned long ciaddr); |
| + | int send_release(unsigned long server, unsigned long ciaddr); |
| + | int get_raw_packet(struct dhcpMessage *payload, int fd); |
| + | |
| + | |
| #endif | |
| @@ -10,29 +10,9 @@ | |
| * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | |
| */ | |
| - | #include <fcntl.h> |
| - | #include <string.h> |
| - | #include <stdlib.h> |
| - | #include <sys/wait.h> |
| - | #include <arpa/inet.h> |
| - | #include <netdb.h> |
| - | #include <netinet/in.h> |
| - | #include <sys/socket.h> |
| - | #include <unistd.h> |
| - | #include <signal.h> |
| - | #include <errno.h> |
| - | #include <sys/ioctl.h> |
| - | #include <time.h> |
| - | |
| + | #include "common.h" |
| #include "dhcpd.h" | |
| - | #include "arpping.h" |
| - | #include "socket.h" |
| #include "options.h" | |
| - | #include "files.h" |
| - | #include "serverpacket.h" |
| - | #include "common.h" |
| - | #include "signalpipe.h" |
| - | #include "static_leases.h" |
| /* globals */ | |
| @@ -86,7 +66,7 @@ int udhcpd_main(int argc, char *argv[]) | |
| udhcp_sp_setup(); | |
| timeout_end = time(0) + server_config.auto_time; | |
| - | while(1) { /* loop until universe collapses */ |
| + | while (1) { /* loop until universe collapses */ |
| if (server_socket < 0) | |
| if ((server_socket = listen_socket(INADDR_ANY, SERVER_PORT, server_config.interface)) < 0) { | |
| @@ -144,8 +124,7 @@ int udhcpd_main(int argc, char *argv[]) | |
| /* Look for a static lease */ | |
| static_lease_ip = getIpByMac(server_config.static_leases, &packet.chaddr); | |
| - | if(static_lease_ip) |
| - | { |
| + | if (static_lease_ip) { |
| bb_info_msg("Found static lease: %x", static_lease_ip); | |
| memcpy(&static_lease.chaddr, &packet.chaddr, 16); | |
| @@ -154,10 +133,8 @@ int udhcpd_main(int argc, char *argv[]) | |
| lease = &static_lease; | |
| - | } |
| - | else |
| - | { |
| - | lease = find_lease_by_chaddr(packet.chaddr); |
| + | } else { |
| + | lease = find_lease_by_chaddr(packet.chaddr); |
| } | |
| switch (state[0]) { | |
| @@ -245,4 +222,3 @@ int udhcpd_main(int argc, char *argv[]) | |
| return 0; | |
| } | |
| - | |
| @@ -3,12 +3,6 @@ | |
| #ifndef _DHCPD_H | |
| #define _DHCPD_H | |
| - | #include <netinet/ip.h> |
| - | #include <netinet/udp.h> |
| - | |
| - | #include "libbb_udhcp.h" |
| - | #include "leases.h" |
| - | |
| /************************************/ | |
| /* Defaults _you_ may want to tweak */ | |
| /************************************/ | |
| @@ -138,4 +132,59 @@ extern struct server_config_t server_config; | |
| extern struct dhcpOfferedAddr *leases; | |
| + | /*** leases.h ***/ |
| + | |
| + | struct dhcpOfferedAddr { |
| + | uint8_t chaddr[16]; |
| + | uint32_t yiaddr; /* network order */ |
| + | uint32_t expires; /* host order */ |
| + | }; |
| + | |
| + | extern uint8_t blank_chaddr[]; |
| + | |
| + | void clear_lease(uint8_t *chaddr, uint32_t yiaddr); |
| + | struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease); |
| + | int lease_expired(struct dhcpOfferedAddr *lease); |
| + | struct dhcpOfferedAddr *oldest_expired_lease(void); |
| + | struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr); |
| + | struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr); |
| + | uint32_t find_address(int check_expired); |
| + | |
| + | |
| + | /*** static_leases.h ***/ |
| + | |
| + | /* Config file will pass static lease info to this function which will add it |
| + | * to a data structure that can be searched later */ |
| + | int addStaticLease(struct static_lease **lease_struct, uint8_t *mac, uint32_t *ip); |
| + | /* Check to see if a mac has an associated static lease */ |
| + | uint32_t getIpByMac(struct static_lease *lease_struct, void *arg); |
| + | /* Check to see if an ip is reserved as a static ip */ |
| + | uint32_t reservedIp(struct static_lease *lease_struct, uint32_t ip); |
| + | /* Print out static leases just to check what's going on (debug code) */ |
| + | void printStaticLeases(struct static_lease **lease_struct); |
| + | |
| + | |
| + | /*** serverpacket.h ***/ |
| + | |
| + | int sendOffer(struct dhcpMessage *oldpacket); |
| + | int sendNAK(struct dhcpMessage *oldpacket); |
| + | int sendACK(struct dhcpMessage *oldpacket, uint32_t yiaddr); |
| + | int send_inform(struct dhcpMessage *oldpacket); |
| + | |
| + | |
| + | /*** files.h ***/ |
| + | |
| + | struct config_keyword { |
| + | const char *keyword; |
| + | int (* const handler)(const char *line, void *var); |
| + | void *var; |
| + | const char *def; |
| + | }; |
| + | |
| + | int read_config(const char *file); |
| + | void write_leases(void); |
| + | void read_leases(const char *file); |
| + | struct option_set *find_option(struct option_set *opt_list, char code); |
| + | |
| + | |
| #endif | |
| @@ -2,23 +2,11 @@ | |
| /* | |
| * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | |
| */ | |
| - | #include <fcntl.h> |
| - | #include <string.h> |
| - | #include <stdlib.h> |
| - | #include <stdio.h> |
| - | #include <sys/wait.h> |
| - | #include <arpa/inet.h> |
| - | #include <netdb.h> |
| - | #include <netinet/in.h> |
| - | #include <stdio.h> |
| - | #include <sys/socket.h> |
| - | #include <unistd.h> |
| #include <getopt.h> | |
| - | #include <time.h> |
| + | #include "common.h" |
| #include "dhcpd.h" | |
| - | #include "leases.h" |
| - | #include "libbb_udhcp.h" |
| + | |
| #define REMAINING 0 | |
| #define ABSOLUTE 1 | |
| @@ -60,17 +48,16 @@ int dumpleases_main(int argc, char *argv[]) | |
| printf("Mac Address IP-Address Expires %s\n", mode == REMAINING ? "in" : "at"); | |
| /* "00:00:00:00:00:00 255.255.255.255 Wed Jun 30 21:49:08 1993" */ | |
| while (fread(&lease, sizeof(lease), 1, fp)) { | |
| - | |
| - | for (i = 0; i < 6; i++) { |
| - | printf("%02x", lease.chaddr[i]); |
| - | if (i != 5) printf(":"); |
| + | printf(":%02x"+1, lease.chaddr[0]); |
| + | for (i = 1; i < 6; i++) { |
| + | printf(":%02x", lease.chaddr[i]); |
| } | |
| addr.s_addr = lease.yiaddr; | |
| - | printf(" %-15s", inet_ntoa(addr)); |
| + | printf(" %-15s ", inet_ntoa(addr)); |
| expires = ntohl(lease.expires); | |
| - | printf(" "); |
| if (mode == REMAINING) { | |
| - | if (!expires) printf("expired\n"); |
| + | if (!expires) |
| + | printf("expired\n"); |
| else { | |
| if (expires > 60*60*24) { | |
| printf("%ld days, ", expires / (60*60*24)); | |
| @@ -4,21 +4,12 @@ | |
| * Rewrite by Russ Dill <[email protected]> July 2001 | |
| */ | |
| - | #include <sys/socket.h> |
| - | #include <arpa/inet.h> |
| - | #include <string.h> |
| - | #include <stdlib.h> |
| - | #include <time.h> |
| - | #include <ctype.h> |
| - | #include <netdb.h> |
| - | |
| #include <netinet/ether.h> | |
| - | #include "static_leases.h" |
| + | #include "common.h" |
| #include "dhcpd.h" | |
| #include "options.h" | |
| - | #include "files.h" |
| - | #include "common.h" |
| + | |
| /* | |
| * Domain names may have 254 chars, and string options can be 254 | |
| @@ -51,7 +42,7 @@ static int read_mac(const char *line, void *arg) | |
| temp_ether_addr = ether_aton(line); | |
| - | if(temp_ether_addr == NULL) |
| + | if (temp_ether_addr == NULL) |
| retval = 0; | |
| else | |
| memcpy(mac_bytes, temp_ether_addr, 6); | |
| @@ -217,7 +208,6 @@ static int read_opt(const char *const_line, void *arg) | |
| static int read_staticlease(const char *const_line, void *arg) | |
| { | |
| - | |
| char *line; | |
| char *mac_string; | |
| char *ip_string; | |
| @@ -243,7 +233,6 @@ static int read_staticlease(const char *const_line, void *arg) | |
| if (ENABLE_FEATURE_UDHCP_DEBUG) printStaticLeases(arg); | |
| return 1; | |
| - | |
| } | |
| @@ -308,9 +297,9 @@ int read_config(const char *file) | |
| for (i = 0; keywords[i].keyword[0]; i++) | |
| if (!strcasecmp(token, keywords[i].keyword)) | |
| if (!keywords[i].handler(line, keywords[i].var)) { | |
| - | bb_error_msg("failure parsing line %d of %s", lm, file); |
| + | bb_error_msg("cannot parse line %d of %s", lm, file); |
| if (ENABLE_FEATURE_UDHCP_DEBUG) | |
| - | bb_error_msg("unable to parse '%s'", debug_orig); |
| + | bb_error_msg("cannot parse '%s'", debug_orig); |
| /* reset back to the default value */ | |
| keywords[i].handler(keywords[i].def, keywords[i].var); | |
| } | |
| @@ -1,20 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* files.h */ |
| - | #ifndef _FILES_H |
| - | #define _FILES_H |
| - | |
| - | struct config_keyword { |
| - | const char *keyword; |
| - | int (* const handler)(const char *line, void *var); |
| - | void *var; |
| - | const char *def; |
| - | }; |
| - | |
| - | |
| - | int read_config(const char *file); |
| - | void write_leases(void); |
| - | void read_leases(const char *file); |
| - | |
| - | struct option_set *find_option(struct option_set *opt_list, char code); |
| - | |
| - | #endif |
| @@ -4,20 +4,8 @@ | |
| * Russ Dill <[email protected]> July 2001 | |
| */ | |
| - | #include <time.h> |
| - | #include <string.h> |
| - | #include <sys/socket.h> |
| - | #include <netinet/in.h> |
| - | #include <arpa/inet.h> |
| - | |
| - | #include "dhcpd.h" |
| - | #include "files.h" |
| - | #include "options.h" |
| - | #include "leases.h" |
| - | #include "arpping.h" |
| #include "common.h" | |
| - | |
| - | #include "static_leases.h" |
| + | #include "dhcpd.h" |
| uint8_t blank_chaddr[] = {[0 ... 15] = 0}; | |
| @@ -138,22 +126,20 @@ uint32_t find_address(int check_expired) | |
| if ((addr & 0xFF) == 0xFF) continue; | |
| /* Only do if it isn't an assigned as a static lease */ | |
| - | if(!reservedIp(server_config.static_leases, htonl(addr))) |
| - | { |
| - | |
| - | /* lease is not taken */ |
| - | ret = htonl(addr); |
| - | if ((!(lease = find_lease_by_yiaddr(ret)) || |
| - | |
| - | /* or it expired and we are checking for expired leases */ |
| - | (check_expired && lease_expired(lease))) && |
| - | |
| - | /* and it isn't on the network */ |
| - | !check_ip(ret)) { |
| - | return ret; |
| - | break; |
| + | if (!reservedIp(server_config.static_leases, htonl(addr))) { |
| + | |
| + | /* lease is not taken */ |
| + | ret = htonl(addr); |
| + | lease = find_lease_by_yiaddr(ret); |
| + | |
| + | /* no lease or it expired and we are checking for expired leases */ |
| + | if ( (!lease || (check_expired && lease_expired(lease))) |
| + | && /* and it isn't on the network */ !check_ip(ret) |
| + | ) { |
| + | return ret; |
| + | break; |
| + | } |
| } | |
| } | |
| - | } |
| return 0; | |
| } | |
| @@ -1,24 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* leases.h */ |
| - | #ifndef _LEASES_H |
| - | #define _LEASES_H |
| - | |
| - | |
| - | struct dhcpOfferedAddr { |
| - | uint8_t chaddr[16]; |
| - | uint32_t yiaddr; /* network order */ |
| - | uint32_t expires; /* host order */ |
| - | }; |
| - | |
| - | extern uint8_t blank_chaddr[]; |
| - | |
| - | void clear_lease(uint8_t *chaddr, uint32_t yiaddr); |
| - | struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease); |
| - | int lease_expired(struct dhcpOfferedAddr *lease); |
| - | struct dhcpOfferedAddr *oldest_expired_lease(void); |
| - | struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr); |
| - | struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr); |
| - | uint32_t find_address(int check_expired); |
| - | |
| - | |
| - | #endif |
| @@ -1,47 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* libbb_udhcp.h - busybox compatibility wrapper */ |
| - | |
| - | /* bit of a hack, do this no matter what the order of the includes. |
| - | * (for busybox) */ |
| - | |
| - | #ifndef _LIBBB_UDHCP_H |
| - | #define _LIBBB_UDHCP_H |
| - | |
| - | #include "packet.h" |
| - | #include "busybox.h" |
| - | |
| - | #ifdef CONFIG_INSTALL_NO_USR |
| - | # define DEFAULT_SCRIPT "/share/udhcpc/default.script" |
| - | #else |
| - | # define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script" |
| - | #endif |
| - | |
| - | |
| - | |
| - | #define COMBINED_BINARY |
| - | |
| - | void udhcp_background(const char *pidfile); |
| - | void udhcp_start_log_and_pid(const char *pidfile); |
| - | |
| - | void udhcp_run_script(struct dhcpMessage *packet, const char *name); |
| - | |
| - | // Still need to clean these up... |
| - | |
| - | /* from pidfile.h */ |
| - | #define pidfile_acquire udhcp_pidfile_acquire |
| - | #define pidfile_write_release udhcp_pidfile_write_release |
| - | /* from options.h */ |
| - | #define get_option udhcp_get_option |
| - | #define end_option udhcp_end_option |
| - | #define add_option_string udhcp_add_option_string |
| - | #define add_simple_option udhcp_add_simple_option |
| - | #define option_lengths udhcp_option_lengths |
| - | /* from socket.h */ |
| - | #define listen_socket udhcp_listen_socket |
| - | #define read_interface udhcp_read_interface |
| - | /* from dhcpc.h */ |
| - | #define client_config udhcp_client_config |
| - | /* from dhcpd.h */ |
| - | #define server_config udhcp_server_config |
| - | |
| - | #endif /* _LIBBB_UDHCP_H */ |
| @@ -4,13 +4,9 @@ | |
| * Rewrite by Russ Dill <[email protected]> July 2001 | |
| */ | |
| - | #include <stdlib.h> |
| - | #include <string.h> |
| - | |
| #include "common.h" | |
| #include "dhcpd.h" | |
| #include "options.h" | |
| - | #include "files.h" |
| /* supported options are easily added here */ | |
| @@ -3,8 +3,6 @@ | |
| #ifndef _OPTIONS_H | |
| #define _OPTIONS_H | |
| - | #include "packet.h" |
| - | |
| #define TYPE_MASK 0x0F | |
| enum { | |
| @@ -1,10 +1,6 @@ | |
| /* vi: set sw=4 ts=4: */ | |
| - | #include <unistd.h> |
| - | #include <string.h> |
| + | |
| #include <netinet/in.h> | |
| - | #include <sys/types.h> |
| - | #include <sys/socket.h> |
| - | #include <features.h> |
| #if (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION | |
| #include <netpacket/packet.h> | |
| #include <net/ethernet.h> | |
| @@ -13,10 +9,8 @@ | |
| #include <linux/if_packet.h> | |
| #include <linux/if_ether.h> | |
| #endif | |
| - | #include <errno.h> |
| #include "common.h" | |
| - | #include "packet.h" |
| #include "dhcpd.h" | |
| #include "options.h" | |
| @@ -70,8 +64,9 @@ int udhcp_get_packet(struct dhcpMessage *packet, int fd) | |
| if (packet->op == BOOTREQUEST && (vendor = get_option(packet, DHCP_VENDOR))) { | |
| for (i = 0; broken_vendors[i][0]; i++) { | |
| - | if (vendor[OPT_LEN - 2] == (uint8_t) strlen(broken_vendors[i]) && |
| - | !strncmp((char*)vendor, broken_vendors[i], vendor[OPT_LEN - 2])) { |
| + | if (vendor[OPT_LEN - 2] == (uint8_t)strlen(broken_vendors[i]) |
| + | && !strncmp((char*)vendor, broken_vendors[i], vendor[OPT_LEN - 2]) |
| + | ) { |
| DEBUG("broken client (%s), forcing broadcast", | |
| broken_vendors[i]); | |
| packet->flags |= htons(BROADCAST_FLAG); | |
| @@ -114,15 +109,17 @@ uint16_t udhcp_checksum(void *addr, int count) | |
| /* Construct a ip/udp header for a packet, and specify the source and dest hardware address */ | |
| - | int udhcp_raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port, |
| - | uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex) |
| + | int udhcp_raw_packet(struct dhcpMessage *payload, |
| + | uint32_t source_ip, int source_port, |
| + | uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex) |
| { | |
| int fd; | |
| int result; | |
| struct sockaddr_ll dest; | |
| struct udp_dhcp_packet packet; | |
| - | if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) { |
| + | fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); |
| + | if (fd < 0) { |
| bb_perror_msg("socket"); | |
| return -1; | |
| } | |
| @@ -157,7 +154,8 @@ int udhcp_raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source | |
| packet.ip.ttl = IPDEFTTL; | |
| packet.ip.check = udhcp_checksum(&(packet.ip), sizeof(packet.ip)); | |
| - | result = sendto(fd, &packet, sizeof(struct udp_dhcp_packet), 0, (struct sockaddr *) &dest, sizeof(dest)); |
| + | result = sendto(fd, &packet, sizeof(struct udp_dhcp_packet), 0, |
| + | (struct sockaddr *) &dest, sizeof(dest)); |
| if (result <= 0) { | |
| bb_perror_msg("sendto"); | |
| } | |
| @@ -167,14 +165,16 @@ int udhcp_raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source | |
| /* Let the kernel do all the work for packet generation */ | |
| - | int udhcp_kernel_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port, |
| - | uint32_t dest_ip, int dest_port) |
| + | int udhcp_kernel_packet(struct dhcpMessage *payload, |
| + | uint32_t source_ip, int source_port, |
| + | uint32_t dest_ip, int dest_port) |
| { | |
| int n = 1; | |
| int fd, result; | |
| struct sockaddr_in client; | |
| - | if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) |
| + | fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); |
| + | if (fd < 0) |
| return -1; | |
| if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) { | |
| @@ -1,42 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | #ifndef _PACKET_H |
| - | #define _PACKET_H |
| - | |
| - | #include <netinet/udp.h> |
| - | #include <netinet/ip.h> |
| - | |
| - | struct dhcpMessage { |
| - | uint8_t op; |
| - | uint8_t htype; |
| - | uint8_t hlen; |
| - | uint8_t hops; |
| - | uint32_t xid; |
| - | uint16_t secs; |
| - | uint16_t flags; |
| - | uint32_t ciaddr; |
| - | uint32_t yiaddr; |
| - | uint32_t siaddr; |
| - | uint32_t giaddr; |
| - | uint8_t chaddr[16]; |
| - | uint8_t sname[64]; |
| - | uint8_t file[128]; |
| - | uint32_t cookie; |
| - | uint8_t options[308]; /* 312 - cookie */ |
| - | }; |
| - | |
| - | struct udp_dhcp_packet { |
| - | struct iphdr ip; |
| - | struct udphdr udp; |
| - | struct dhcpMessage data; |
| - | }; |
| - | |
| - | void udhcp_init_header(struct dhcpMessage *packet, char type); |
| - | int udhcp_get_packet(struct dhcpMessage *packet, int fd); |
| - | uint16_t udhcp_checksum(void *addr, int count); |
| - | int udhcp_raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port, |
| - | uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex); |
| - | int udhcp_kernel_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port, |
| - | uint32_t dest_ip, int dest_port); |
| - | |
| - | |
| - | #endif |
| @@ -20,15 +20,8 @@ | |
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| */ | |
| - | #include <sys/types.h> |
| - | #include <sys/stat.h> |
| - | #include <fcntl.h> |
| - | #include <unistd.h> |
| - | #include <stdio.h> |
| - | #include <stdlib.h> |
| - | |
| #include "common.h" | |
| - | #include "pidfile.h" |
| + | |
| static char *saved_pidfile; | |
| @@ -1,26 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* pidfile.h |
| - | * |
| - | * Functions to assist in the writing and removing of pidfiles. |
| - | * |
| - | * Russ Dill <[email protected]> September 2001 |
| - | * |
| - | * This program is free software; you can redistribute it and/or modify |
| - | * it under the terms of the GNU General Public License as published by |
| - | * the Free Software Foundation; either version 2 of the License, or |
| - | * (at your option) any later version. |
| - | * |
| - | * This program is distributed in the hope that it will be useful, |
| - | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| - | * GNU General Public License for more details. |
| - | * |
| - | * You should have received a copy of the GNU General Public License |
| - | * along with this program; if not, write to the Free Software |
| - | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| - | */ |
| - | |
| - | |
| - | int pidfile_acquire(const char *pidfile); |
| - | void pidfile_write_release(int pid_fd); |
| - | |
| @@ -8,20 +8,11 @@ | |
| * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | |
| */ | |
| - | #include <string.h> |
| - | #include <unistd.h> |
| - | #include <stdio.h> |
| - | #include <stdlib.h> |
| - | #include <sys/socket.h> |
| - | #include <netinet/in.h> |
| - | #include <arpa/inet.h> |
| - | #include <sys/types.h> |
| - | #include <sys/wait.h> |
| - | |
| #include "common.h" | |
| - | #include "options.h" |
| #include "dhcpd.h" | |
| #include "dhcpc.h" | |
| + | #include "options.h" |
| + | |
| /* get a rough idea of how long an option will be (rounding up...) */ | |
| static const int max_option_length[] = { | |
| @@ -76,7 +67,7 @@ static void fill_options(char *dest, uint8_t *option, struct dhcp_option *type_p | |
| type = type_p->flags & TYPE_MASK; | |
| optlen = option_lengths[type]; | |
| - | for(;;) { |
| + | for (;;) { |
| switch (type) { | |
| case OPTION_IP_PAIR: | |
| dest += sprintip(dest, "", option); | |
| @@ -20,17 +20,10 @@ | |
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| */ | |
| - | #include <sys/socket.h> |
| - | #include <netinet/in.h> |
| - | #include <arpa/inet.h> |
| - | #include <string.h> |
| - | #include <time.h> |
| - | |
| #include "common.h" | |
| - | #include "serverpacket.h" |
| #include "dhcpd.h" | |
| #include "options.h" | |
| - | #include "static_leases.h" |
| + | |
| /* send a packet to giaddr using the kernel ip stack */ | |
| static int send_packet_to_relay(struct dhcpMessage *payload) | |
| @@ -122,65 +115,57 @@ int sendOffer(struct dhcpMessage *oldpacket) | |
| static_lease_ip = getIpByMac(server_config.static_leases, oldpacket->chaddr); | |
| /* ADDME: if static, short circuit */ | |
| - | if(!static_lease_ip) |
| - | { |
| - | /* the client is in our lease/offered table */ |
| - | if ((lease = find_lease_by_chaddr(oldpacket->chaddr))) { |
| - | if (!lease_expired(lease)) |
| - | lease_time_align = lease->expires - time(0); |
| - | packet.yiaddr = lease->yiaddr; |
| - | |
| - | /* Or the client has a requested ip */ |
| - | } else if ((req = get_option(oldpacket, DHCP_REQUESTED_IP)) && |
| - | |
| - | /* Don't look here (ugly hackish thing to do) */ |
| - | memcpy(&req_align, req, 4) && |
| - | |
| - | /* and the ip is in the lease range */ |
| - | ntohl(req_align) >= ntohl(server_config.start) && |
| - | ntohl(req_align) <= ntohl(server_config.end) && |
| - | |
| - | !static_lease_ip && /* Check that its not a static lease */ |
| + | if (!static_lease_ip) { |
| + | /* the client is in our lease/offered table */ |
| + | lease = find_lease_by_chaddr(oldpacket->chaddr); |
| + | if (lease) { |
| + | if (!lease_expired(lease)) |
| + | lease_time_align = lease->expires - time(0); |
| + | packet.yiaddr = lease->yiaddr; |
| + | |
| + | /* Or the client has a requested ip */ |
| + | } else if ((req = get_option(oldpacket, DHCP_REQUESTED_IP)) |
| + | /* Don't look here (ugly hackish thing to do) */ |
| + | && memcpy(&req_align, req, 4) |
| + | /* and the ip is in the lease range */ |
| + | && ntohl(req_align) >= ntohl(server_config.start) |
| + | && ntohl(req_align) <= ntohl(server_config.end) |
| + | && !static_lease_ip /* Check that its not a static lease */ |
| /* and is not already taken/offered */ | |
| - | ((!(lease = find_lease_by_yiaddr(req_align)) || |
| - | |
| - | /* or its taken, but expired */ /* ADDME: or maybe in here */ |
| - | lease_expired(lease)))) { |
| - | packet.yiaddr = req_align; /* FIXME: oh my, is there a host using this IP? */ |
| - | |
| + | && (!(lease = find_lease_by_yiaddr(req_align)) |
| + | /* or its taken, but expired */ /* ADDME: or maybe in here */ |
| + | || lease_expired(lease)) |
| + | ) { |
| + | packet.yiaddr = req_align; /* FIXME: oh my, is there a host using this IP? */ |
| /* otherwise, find a free IP */ | |
| - | } else { |
| + | } else { |
| /* Is it a static lease? (No, because find_address skips static lease) */ | |
| - | packet.yiaddr = find_address(0); |
| - | |
| - | /* try for an expired lease */ |
| - | if (!packet.yiaddr) packet.yiaddr = find_address(1); |
| - | } |
| - | |
| - | if(!packet.yiaddr) { |
| - | bb_error_msg("no IP addresses to give - OFFER abandoned"); |
| - | return -1; |
| - | } |
| - | |
| - | if (!add_lease(packet.chaddr, packet.yiaddr, server_config.offer_time)) { |
| - | bb_error_msg("lease pool is full - OFFER abandoned"); |
| - | return -1; |
| - | } |
| - | |
| - | if ((lease_time = get_option(oldpacket, DHCP_LEASE_TIME))) { |
| - | memcpy(&lease_time_align, lease_time, 4); |
| - | lease_time_align = ntohl(lease_time_align); |
| - | if (lease_time_align > server_config.lease) |
| + | packet.yiaddr = find_address(0); |
| + | /* try for an expired lease */ |
| + | if (!packet.yiaddr) packet.yiaddr = find_address(1); |
| + | } |
| + | |
| + | if (!packet.yiaddr) { |
| + | bb_error_msg("no IP addresses to give - OFFER abandoned"); |
| + | return -1; |
| + | } |
| + | if (!add_lease(packet.chaddr, packet.yiaddr, server_config.offer_time)) { |
| + | bb_error_msg("lease pool is full - OFFER abandoned"); |
| + | return -1; |
| + | } |
| + | lease_time = get_option(oldpacket, DHCP_LEASE_TIME); |
| + | if (lease_time) { |
| + | memcpy(&lease_time_align, lease_time, 4); |
| + | lease_time_align = ntohl(lease_time_align); |
| + | if (lease_time_align > server_config.lease) |
| + | lease_time_align = server_config.lease; |
| + | } |
| + | |
| + | /* Make sure we aren't just using the lease time from the previous offer */ |
| + | if (lease_time_align < server_config.min_lease) |
| lease_time_align = server_config.lease; | |
| - | } |
| - | |
| - | /* Make sure we aren't just using the lease time from the previous offer */ |
| - | if (lease_time_align < server_config.min_lease) |
| - | lease_time_align = server_config.lease; |
| - | } |
| - | /* ADDME: end of short circuit */ |
| - | else |
| - | { |
| + | /* ADDME: end of short circuit */ |
| + | } else { |
| /* It is a static lease... use it */ | |
| packet.yiaddr = static_lease_ip; | |
| } | |
| @@ -1,13 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | #ifndef _SERVERPACKET_H |
| - | #define _SERVERPACKET_H |
| - | |
| - | #include "packet.h" |
| - | |
| - | int sendOffer(struct dhcpMessage *oldpacket); |
| - | int sendNAK(struct dhcpMessage *oldpacket); |
| - | int sendACK(struct dhcpMessage *oldpacket, uint32_t yiaddr); |
| - | int send_inform(struct dhcpMessage *oldpacket); |
| - | |
| - | |
| - | #endif |
| @@ -20,17 +20,9 @@ | |
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| */ | |
| - | #include <unistd.h> |
| - | #include <fcntl.h> |
| - | #include <signal.h> |
| - | #include <sys/types.h> |
| - | #include <sys/socket.h> |
| - | #include <sys/select.h> |
| - | |
| - | |
| - | #include "signalpipe.h" |
| #include "common.h" | |
| + | |
| static int signal_pipe[2]; | |
| static void signal_handler(int sig) | |
| @@ -1,23 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* signalpipe.h |
| - | * |
| - | * Russ Dill <[email protected]> December 2003 |
| - | * |
| - | * This program is free software; you can redistribute it and/or modify |
| - | * it under the terms of the GNU General Public License as published by |
| - | * the Free Software Foundation; either version 2 of the License, or |
| - | * (at your option) any later version. |
| - | * |
| - | * This program is distributed in the hope that it will be useful, |
| - | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| - | * GNU General Public License for more details. |
| - | * |
| - | * You should have received a copy of the GNU General Public License |
| - | * along with this program; if not, write to the Free Software |
| - | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| - | */ |
| - | |
| - | void udhcp_sp_setup(void); |
| - | int udhcp_sp_fd_set(fd_set *rfds, int extra_fd); |
| - | int udhcp_sp_read(fd_set *rfds); |
| @@ -23,15 +23,7 @@ | |
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| */ | |
| - | #include <sys/types.h> |
| - | #include <sys/socket.h> |
| - | #include <sys/ioctl.h> |
| - | #include <netinet/in.h> |
| - | #include <unistd.h> |
| - | #include <string.h> |
| - | #include <arpa/inet.h> |
| #include <net/if.h> | |
| - | #include <errno.h> |
| #include <features.h> | |
| #if (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION | |
| #include <netpacket/packet.h> | |
| @@ -43,7 +35,7 @@ | |
| #endif | |
| #include "common.h" | |
| - | #include "socket.h" |
| + | |
| int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) | |
| { | |
| @@ -52,44 +44,42 @@ int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) | |
| struct sockaddr_in *our_ip; | |
| memset(&ifr, 0, sizeof(struct ifreq)); | |
| - | if((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) >= 0) { |
| - | ifr.ifr_addr.sa_family = AF_INET; |
| - | strcpy(ifr.ifr_name, interface); |
| - | |
| - | if (addr) { |
| - | if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { |
| - | our_ip = (struct sockaddr_in *) &ifr.ifr_addr; |
| - | *addr = our_ip->sin_addr.s_addr; |
| - | DEBUG("%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr)); |
| - | } else { |
| - | bb_perror_msg("SIOCGIFADDR failed, is the interface up and configured?"); |
| - | close(fd); |
| - | return -1; |
| - | } |
| - | } |
| + | fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); |
| + | if (fd < 0) { |
| + | bb_perror_msg("socket failed"); |
| + | return -1; |
| + | } |
| - | if (ioctl(fd, SIOCGIFINDEX, &ifr) == 0) { |
| - | DEBUG("adapter index %d", ifr.ifr_ifindex); |
| - | *ifindex = ifr.ifr_ifindex; |
| - | } else { |
| - | bb_perror_msg("SIOCGIFINDEX failed"); |
| + | ifr.ifr_addr.sa_family = AF_INET; |
| + | strcpy(ifr.ifr_name, interface); |
| + | if (addr) { |
| + | if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { |
| + | bb_perror_msg("SIOCGIFADDR failed, is the interface up and configured?"); |
| close(fd); | |
| return -1; | |
| } | |
| - | if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) { |
| - | memcpy(arp, ifr.ifr_hwaddr.sa_data, 6); |
| - | DEBUG("adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x", |
| - | arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]); |
| - | } else { |
| - | bb_perror_msg("SIOCGIFHWADDR failed"); |
| - | close(fd); |
| - | return -1; |
| - | } |
| - | } else { |
| - | bb_perror_msg("socket failed"); |
| + | our_ip = (struct sockaddr_in *) &ifr.ifr_addr; |
| + | *addr = our_ip->sin_addr.s_addr; |
| + | DEBUG("%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr)); |
| + | } |
| + | |
| + | if (ioctl(fd, SIOCGIFINDEX, &ifr) == 0) { |
| + | bb_perror_msg("SIOCGIFINDEX failed"); |
| + | close(fd); |
| + | return -1; |
| + | } |
| + | |
| + | DEBUG("adapter index %d", ifr.ifr_ifindex); |
| + | *ifindex = ifr.ifr_ifindex; |
| + | if (ioctl(fd, SIOCGIFHWADDR, &ifr) != 0) { |
| + | bb_perror_msg("SIOCGIFHWADDR failed"); |
| + | close(fd); |
| return -1; | |
| } | |
| - | close(fd); |
| + | |
| + | memcpy(arp, ifr.ifr_hwaddr.sa_data, 6); |
| + | DEBUG("adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x", |
| + | arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]); |
| return 0; | |
| } | |
| @@ -102,7 +92,8 @@ int listen_socket(uint32_t ip, int port, char *inf) | |
| int n = 1; | |
| DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf); | |
| - | if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { |
| + | fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); |
| + | if (fd < 0) { |
| bb_perror_msg("socket"); | |
| return -1; | |
| } | |
| @@ -1,9 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* socket.h */ |
| - | #ifndef _SOCKET_H |
| - | #define _SOCKET_H |
| - | |
| - | int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp); |
| - | int listen_socket(uint32_t ip, int port, char *inf); |
| - | |
| - | #endif |
| @@ -7,20 +7,15 @@ | |
| * | |
| */ | |
| - | |
| - | #include <stdlib.h> |
| - | #include <stdio.h> |
| - | #include <string.h> |
| - | |
| - | #include "static_leases.h" |
| + | #include "common.h" |
| #include "dhcpd.h" | |
| + | |
| /* Takes the address of the pointer to the static_leases linked list, | |
| * Address to a 6 byte mac address | |
| * Address to a 4 byte ip address */ | |
| int addStaticLease(struct static_lease **lease_struct, uint8_t *mac, uint32_t *ip) | |
| { | |
| - | |
| struct static_lease *cur; | |
| struct static_lease *new_static_lease; | |
| @@ -31,15 +26,11 @@ int addStaticLease(struct static_lease **lease_struct, uint8_t *mac, uint32_t *i | |
| new_static_lease->next = NULL; | |
| /* If it's the first node to be added... */ | |
| - | if(*lease_struct == NULL) |
| - | { |
| + | if (*lease_struct == NULL) { |
| *lease_struct = new_static_lease; | |
| - | } |
| - | else |
| - | { |
| + | } else { |
| cur = *lease_struct; | |
| - | while(cur->next != NULL) |
| - | { |
| + | while (cur->next) { |
| cur = cur->next; | |
| } | |
| @@ -47,7 +38,6 @@ int addStaticLease(struct static_lease **lease_struct, uint8_t *mac, uint32_t *i | |
| } | |
| return 1; | |
| - | |
| } | |
| /* Check to see if a mac has an associated static lease */ | |
| @@ -59,11 +49,9 @@ uint32_t getIpByMac(struct static_lease *lease_struct, void *arg) | |
| return_ip = 0; | |
| - | while(cur != NULL) |
| - | { |
| + | while (cur) { |
| /* If the client has the correct mac */ | |
| - | if(memcmp(cur->mac, mac, 6) == 0) |
| - | { |
| + | if (memcmp(cur->mac, mac, 6) == 0) { |
| return_ip = *(cur->ip); | |
| } | |
| @@ -71,7 +59,6 @@ uint32_t getIpByMac(struct static_lease *lease_struct, void *arg) | |
| } | |
| return return_ip; | |
| - | |
| } | |
| /* Check to see if an ip is reserved as a static ip */ | |
| @@ -81,17 +68,15 @@ uint32_t reservedIp(struct static_lease *lease_struct, uint32_t ip) | |
| uint32_t return_val = 0; | |
| - | while(cur != NULL) |
| - | { |
| + | while (cur) { |
| /* If the client has the correct ip */ | |
| - | if(*cur->ip == ip) |
| + | if (*cur->ip == ip) |
| return_val = 1; | |
| cur = cur->next; | |
| } | |
| return return_val; | |
| - | |
| } | |
| #ifdef CONFIG_FEATURE_UDHCP_DEBUG | |
| @@ -102,8 +87,7 @@ void printStaticLeases(struct static_lease **arg) | |
| /* Get a pointer to the linked list */ | |
| struct static_lease *cur = *arg; | |
| - | while(cur != NULL) |
| - | { |
| + | while (cur) { |
| /* printf("PrintStaticLeases: Lease mac Address: %x\n", cur->mac); */ | |
| printf("PrintStaticLeases: Lease mac Value: %x\n", *(cur->mac)); | |
| /* printf("PrintStaticLeases: Lease ip Address: %x\n", cur->ip); */ | |
| @@ -111,10 +95,5 @@ void printStaticLeases(struct static_lease **arg) | |
| cur = cur->next; | |
| } | |
| - | |
| - | |
| } | |
| #endif | |
| - | |
| - | |
| - | |
| @@ -1,24 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* static_leases.h */ |
| - | #ifndef _STATIC_LEASES_H |
| - | #define _STATIC_LEASES_H |
| - | |
| - | #include "dhcpd.h" |
| - | |
| - | /* Config file will pass static lease info to this function which will add it |
| - | * to a data structure that can be searched later */ |
| - | int addStaticLease(struct static_lease **lease_struct, uint8_t *mac, uint32_t *ip); |
| - | |
| - | /* Check to see if a mac has an associated static lease */ |
| - | uint32_t getIpByMac(struct static_lease *lease_struct, void *arg); |
| - | |
| - | /* Check to see if an ip is reserved as a static ip */ |
| - | uint32_t reservedIp(struct static_lease *lease_struct, uint32_t ip); |
| - | |
| - | /* Print out static leases just to check what's going on (debug code) */ |
| - | void printStaticLeases(struct static_lease **lease_struct); |
| - | |
| - | #endif |
| - | |
| - | |
| - | |