Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/networking/udhcp/socket.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/networking/udhcp/socket.c
r821 r1770 1 /* vi: set sw=4 ts=4: */ 1 2 /* 2 3 * socket.c -- DHCP server client/server socket creation … … 23 24 */ 24 25 25 #include <sys/types.h>26 #include <sys/socket.h>27 #include <sys/ioctl.h>28 #include <netinet/in.h>29 #include <unistd.h>30 #include <string.h>31 #include <arpa/inet.h>32 26 #include <net/if.h> 33 #include <errno.h>34 27 #include <features.h> 35 #if ( __GLIBC__ >= 2 && __GLIBC_MINOR>= 1) || defined _NEWLIB_VERSION28 #if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION 36 29 #include <netpacket/packet.h> 37 30 #include <net/ethernet.h> … … 43 36 44 37 #include "common.h" 45 #include "socket.h"46 38 47 int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) 39 40 int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) 48 41 { 49 42 int fd; … … 51 44 struct sockaddr_in *our_ip; 52 45 53 memset(&ifr, 0, sizeof(struct ifreq)); 54 if((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) >= 0) { 55 ifr.ifr_addr.sa_family = AF_INET; 56 strcpy(ifr.ifr_name, interface); 46 memset(&ifr, 0, sizeof(ifr)); 47 fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); 57 48 58 if (addr) { 59 if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { 60 our_ip = (struct sockaddr_in *) &ifr.ifr_addr; 61 *addr = our_ip->sin_addr.s_addr; 62 DEBUG(LOG_INFO, "%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr)); 63 } else { 64 LOG(LOG_ERR, "SIOCGIFADDR failed, is the interface up and configured?: %m"); 65 close(fd); 66 return -1; 67 } 68 } 69 70 if (ioctl(fd, SIOCGIFINDEX, &ifr) == 0) { 71 DEBUG(LOG_INFO, "adapter index %d", ifr.ifr_ifindex); 72 *ifindex = ifr.ifr_ifindex; 73 } else { 74 LOG(LOG_ERR, "SIOCGIFINDEX failed!: %m"); 49 ifr.ifr_addr.sa_family = AF_INET; 50 strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); 51 if (addr) { 52 if (ioctl_or_perror(fd, SIOCGIFADDR, &ifr, 53 "is interface %s up and configured?", interface) 54 ) { 75 55 close(fd); 76 56 return -1; 77 57 } 78 if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) { 79 memcpy(arp, ifr.ifr_hwaddr.sa_data, 6); 80 DEBUG(LOG_INFO, "adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x", 81 arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]); 82 } else { 83 LOG(LOG_ERR, "SIOCGIFHWADDR failed!: %m"); 58 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)); 61 } 62 63 if (ifindex) { 64 if (ioctl_or_warn(fd, SIOCGIFINDEX, &ifr) != 0) { 84 65 close(fd); 85 66 return -1; 86 67 } 87 } else { 88 LOG(LOG_ERR, "socket failed!: %m"); 89 return -1; 68 DEBUG("adapter index %d", ifr.ifr_ifindex); 69 *ifindex = ifr.ifr_ifindex; 90 70 } 71 72 if (arp) { 73 if (ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr) != 0) { 74 close(fd); 75 return -1; 76 } 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]); 80 } 81 91 82 close(fd); 92 83 return 0; 93 84 } 94 85 86 /* 1. None of the callers expects it to ever fail */ 87 /* 2. ip was always INADDR_ANY */ 88 int listen_socket(/*uint32_t ip,*/ int port, const char *inf) 89 { 90 int fd; 91 struct ifreq interface; 92 struct sockaddr_in addr; 95 93 96 int listen_socket(uint32_t ip, int port, char *inf) 97 { 98 struct ifreq interface; 99 int fd; 100 struct sockaddr_in addr; 101 int n = 1; 94 DEBUG("Opening listen socket on *:%d %s", port, inf); 95 fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 102 96 103 DEBUG(LOG_INFO, "Opening listen socket on 0x%08x:%d %s", ip, port, inf); 104 if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 105 DEBUG(LOG_ERR, "socket call failed: %m"); 106 return -1; 107 } 97 setsockopt_reuseaddr(fd); 98 if (setsockopt_broadcast(fd) == -1) 99 bb_perror_msg_and_die("SO_BROADCAST"); 100 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"); 108 104 109 105 memset(&addr, 0, sizeof(addr)); 110 106 addr.sin_family = AF_INET; 111 107 addr.sin_port = htons(port); 112 addr.sin_addr.s_addr = ip; 113 114 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) { 115 close(fd); 116 return -1; 117 } 118 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) { 119 close(fd); 120 return -1; 121 } 122 123 strncpy(interface.ifr_name, inf, IFNAMSIZ); 124 if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) { 125 close(fd); 126 return -1; 127 } 128 129 if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { 130 close(fd); 131 return -1; 132 } 108 /* addr.sin_addr.s_addr = ip; - all-zeros is INADDR_ANY */ 109 xbind(fd, (struct sockaddr *)&addr, sizeof(addr)); 133 110 134 111 return fd;
Note:
See TracChangeset
for help on using the changeset viewer.