Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/networking/udhcp/socket.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/networking/udhcp/socket.c
r1765 r2725 1 1 /* vi: set sw=4 ts=4: */ 2 2 /* 3 * socket.c --DHCP server client/server socket creation3 * DHCP server client/server socket creation 4 4 * 5 5 * udhcp client/server … … 23 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 24 24 */ 25 26 25 #include <net/if.h> 27 #include <features.h>28 26 #if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION 29 # include <netpacket/packet.h>30 # include <net/ethernet.h>27 # include <netpacket/packet.h> 28 # include <net/ethernet.h> 31 29 #else 32 # include <asm/types.h>33 # include <linux/if_packet.h>34 # include <linux/if_ether.h>30 # include <asm/types.h> 31 # include <linux/if_packet.h> 32 # include <linux/if_ether.h> 35 33 #endif 36 34 37 35 #include "common.h" 38 36 39 40 int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) 37 int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) 41 38 { 42 39 int fd; … … 48 45 49 46 ifr.ifr_addr.sa_family = AF_INET; 50 strncpy (ifr.ifr_name, interface, sizeof(ifr.ifr_name));51 if ( addr) {47 strncpy_IFNAMSIZ(ifr.ifr_name, interface); 48 if (nip) { 52 49 if (ioctl_or_perror(fd, SIOCGIFADDR, &ifr, 53 50 "is interface %s up and configured?", interface) … … 57 54 } 58 55 our_ip = (struct sockaddr_in *) &ifr.ifr_addr; 59 * addr= our_ip->sin_addr.s_addr;60 DEBUG("%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr));56 *nip = our_ip->sin_addr.s_addr; 57 log1("IP %s", inet_ntoa(our_ip->sin_addr)); 61 58 } 62 59 … … 66 63 return -1; 67 64 } 68 DEBUG("adapter index %d", ifr.ifr_ifindex);65 log1("Adapter index %d", ifr.ifr_ifindex); 69 66 *ifindex = ifr.ifr_ifindex; 70 67 } 71 68 72 if ( arp) {69 if (mac) { 73 70 if (ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr) != 0) { 74 71 close(fd); 75 72 return -1; 76 73 } 77 memcpy( arp, ifr.ifr_hwaddr.sa_data, 6);78 DEBUG("adapter hardware address%02x:%02x:%02x:%02x:%02x:%02x",79 arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]);74 memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); 75 log1("MAC %02x:%02x:%02x:%02x:%02x:%02x", 76 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 80 77 } 81 78 … … 86 83 /* 1. None of the callers expects it to ever fail */ 87 84 /* 2. ip was always INADDR_ANY */ 88 int listen_socket(/*uint32_t ip,*/ int port, const char *inf)85 int FAST_FUNC udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf) 89 86 { 90 87 int fd; 91 struct ifreq interface;92 88 struct sockaddr_in addr; 93 89 94 DEBUG("Opening listen socket on *:%d %s", port, inf);90 log1("Opening listen socket on *:%d %s", port, inf); 95 91 fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 96 92 … … 99 95 bb_perror_msg_and_die("SO_BROADCAST"); 100 96 101 strncpy(interface.ifr_name, inf, IFNAMSIZ);102 if (setsockopt (fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) == -1)103 bb_perror_msg_and_die("SO_BINDTODEVICE");97 /* NB: bug 1032 says this doesn't work on ethernet aliases (ethN:M) */ 98 if (setsockopt_bindtodevice(fd, inf)) 99 xfunc_die(); /* warning is already printed */ 104 100 105 101 memset(&addr, 0, sizeof(addr));
Note:
See TracChangeset
for help on using the changeset viewer.