diff options
Diffstat (limited to 'networking/udhcp/socket.c')
-rw-r--r-- | networking/udhcp/socket.c | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c index 1e62f8e40..79ddfb1e2 100644 --- a/networking/udhcp/socket.c +++ b/networking/udhcp/socket.c | |||
@@ -45,10 +45,6 @@ int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t | |||
45 | 45 | ||
46 | memset(&ifr, 0, sizeof(ifr)); | 46 | memset(&ifr, 0, sizeof(ifr)); |
47 | fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); | 47 | fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); |
48 | // if (fd < 0) { | ||
49 | // bb_perror_msg("socket failed"); | ||
50 | // return -1; | ||
51 | // } | ||
52 | 48 | ||
53 | ifr.ifr_addr.sa_family = AF_INET; | 49 | ifr.ifr_addr.sa_family = AF_INET; |
54 | strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); | 50 | strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); |
@@ -87,40 +83,30 @@ int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t | |||
87 | return 0; | 83 | return 0; |
88 | } | 84 | } |
89 | 85 | ||
90 | 86 | /* 1. None of the callers expects it to ever fail */ | |
91 | int listen_socket(uint32_t ip, int port, const char *inf) | 87 | /* 2. ip was always INADDR_ANY */ |
88 | int listen_socket(/*uint32_t ip,*/ int port, const char *inf) | ||
92 | { | 89 | { |
93 | struct ifreq interface; | ||
94 | int fd; | 90 | int fd; |
91 | struct ifreq interface; | ||
95 | struct sockaddr_in addr; | 92 | struct sockaddr_in addr; |
96 | 93 | ||
97 | DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf); | 94 | DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf); |
98 | fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); | 95 | fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); |
99 | 96 | ||
100 | memset(&addr, 0, sizeof(addr)); | 97 | setsockopt_reuseaddr(fd); |
101 | addr.sin_family = AF_INET; | 98 | if (setsockopt_broadcast(fd) == -1) |
102 | addr.sin_port = htons(port); | 99 | bb_perror_msg_and_die("SO_BROADCAST"); |
103 | addr.sin_addr.s_addr = ip; | ||
104 | |||
105 | if (setsockopt_reuseaddr(fd) == -1) { | ||
106 | close(fd); | ||
107 | return -1; | ||
108 | } | ||
109 | if (setsockopt_broadcast(fd) == -1) { | ||
110 | close(fd); | ||
111 | return -1; | ||
112 | } | ||
113 | 100 | ||
114 | strncpy(interface.ifr_name, inf, IFNAMSIZ); | 101 | strncpy(interface.ifr_name, inf, IFNAMSIZ); |
115 | if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) < 0) { | 102 | if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) == -1) |
116 | close(fd); | 103 | bb_perror_msg_and_die("SO_BINDTODEVICE"); |
117 | return -1; | ||
118 | } | ||
119 | 104 | ||
120 | if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { | 105 | memset(&addr, 0, sizeof(addr)); |
121 | close(fd); | 106 | addr.sin_family = AF_INET; |
122 | return -1; | 107 | addr.sin_port = htons(port); |
123 | } | 108 | /* addr.sin_addr.s_addr = ip; - all-zeros is INADDR_ANY */ |
109 | xbind(fd, (struct sockaddr *)&addr, sizeof(addr)); | ||
124 | 110 | ||
125 | return fd; | 111 | return fd; |
126 | } | 112 | } |