From: Roy Marples Date: Thu, 15 Oct 2009 00:30:54 +0000 (+0000) Subject: Just have one open socket for AF_NET. X-Git-Tag: v5.1.2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ab2df96b15b06f0ca91e66e09db779522b16c5b;p=thirdparty%2Fdhcpcd.git Just have one open socket for AF_NET. --- diff --git a/dhcpcd.c b/dhcpcd.c index 46ed8138..a207eefc 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -1749,7 +1749,7 @@ main(int argc, char **argv) } } - if (init_socket() == -1) { + if (init_sockets() == -1) { syslog(LOG_ERR, "init_socket: %m"); exit(EXIT_FAILURE); } diff --git a/if-bsd.c b/if-bsd.c index e8c16f8f..58c405f8 100644 --- a/if-bsd.c +++ b/if-bsd.c @@ -70,15 +70,14 @@ ? \ (((struct sockaddr_in *)(void *)sa)->sin_addr).s_addr : 0 -static int a_fd = -1; static int r_fd = -1; int -init_socket(void) +init_sockets(void) { - if ((a_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + if ((socket_afnet = socket(AF_INET, SOCK_DGRAM, 0)) == -1) return -1; - set_cloexec(a_fd); + set_cloexec(socket_afnet); if ((r_fd = socket(PF_ROUTE, SOCK_RAW, 0)) == -1) return -1; set_cloexec(r_fd); @@ -102,7 +101,7 @@ getifssid(const char *ifname, char *ssid) strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); memset(&nwid, 0, sizeof(nwid)); ifr.ifr_data = (void *)&nwid; - if (ioctl(a_fd, SIOCG80211NWID, &ifr) == 0) { + if (ioctl(socket_afnet, SIOCG80211NWID, &ifr) == 0) { retval = nwid.i_len; memcpy(ssid, nwid.i_nwid, nwid.i_len); ssid[nwid.i_len] = '\0'; @@ -113,7 +112,7 @@ getifssid(const char *ifname, char *ssid) ireq.i_type = IEEE80211_IOC_SSID; ireq.i_val = -1; ireq.i_data = &nwid; - if (ioctl(a_fd, SIOCG80211, &ireq) == 0) { + if (ioctl(socket_afnet, SIOCG80211, &ireq) == 0) { retval = ireq.i_len; memcpy(ssid, nwid, ireq.i_len); ssid[ireq.i_len] = '\0'; @@ -152,9 +151,9 @@ if_address(const struct interface *iface, const struct in_addr *address, #undef ADDADDR if (action < 0) - retval = ioctl(a_fd, SIOCDIFADDR, &ifa); + retval = ioctl(socket_afnet, SIOCDIFADDR, &ifa); else - retval = ioctl(a_fd, SIOCAIFADDR, &ifa); + retval = ioctl(socket_afnet, SIOCAIFADDR, &ifa); return retval; } diff --git a/if-linux.c b/if-linux.c index 8a4eb362..8e502207 100644 --- a/if-linux.c +++ b/if-linux.c @@ -74,8 +74,11 @@ _open_link_socket(struct sockaddr_nl *nl) } int -init_socket(void) +init_sockets(void) { + if ((socket_afnet = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return -1; + set_cloexec(socket_afnet); sock_fd = _open_link_socket(&sock_nl); set_cloexec(sock_fd); return sock_fd; diff --git a/net.c b/net.c index bb464142..4d693494 100644 --- a/net.c +++ b/net.c @@ -71,6 +71,8 @@ static char hwaddr_buffer[(HWADDR_LEN * 3) + 1]; +int socket_afnet = -1; + int inet_ntocidr(struct in_addr address) { @@ -183,18 +185,12 @@ hwaddr_aton(unsigned char *buffer, const char *addr) struct interface * init_interface(const char *ifname) { - int s; struct ifreq ifr; struct interface *iface = NULL; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - return NULL; - - strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); - if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) + if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == -1) goto eexit; iface = xzalloc(sizeof(*iface)); @@ -208,13 +204,13 @@ init_interface(const char *ifname) iface->metric += 100; } - if (ioctl(s, SIOCGIFMTU, &ifr) == -1) + if (ioctl(socket_afnet, SIOCGIFMTU, &ifr) == -1) goto eexit; /* Ensure that the MTU is big enough for DHCP */ if (ifr.ifr_mtu < MTU_MIN) { ifr.ifr_mtu = MTU_MIN; strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); - if (ioctl(s, SIOCSIFMTU, &ifr) == -1) + if (ioctl(socket_afnet, SIOCSIFMTU, &ifr) == -1) goto eexit; } @@ -230,7 +226,6 @@ eexit: free(iface); iface = NULL; exit: - close(s); return iface; } @@ -253,7 +248,7 @@ free_interface(struct interface *iface) int carrier_status(struct interface *iface) { - int s, ret; + int ret; struct ifreq ifr; #ifdef SIOCGIFMEDIA struct ifmediareq ifmr; @@ -262,8 +257,6 @@ carrier_status(struct interface *iface) char *p; #endif - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - return -1; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name)); #ifdef __linux__ @@ -272,21 +265,18 @@ carrier_status(struct interface *iface) *p = '\0'; #endif - if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) { - close(s); + if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == -1) return -1; - } iface->flags = ifr.ifr_flags; ret = -1; #ifdef SIOCGIFMEDIA memset(&ifmr, 0, sizeof(ifmr)); strlcpy(ifmr.ifm_name, iface->name, sizeof(ifmr.ifm_name)); - if (ioctl(s, SIOCGIFMEDIA, &ifmr) != -1 && + if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) != -1 && ifmr.ifm_status & IFM_AVALID) ret = (ifmr.ifm_status & IFM_ACTIVE) ? 1 : 0; #endif - close(s); if (ret == -1) ret = (ifr.ifr_flags & IFF_RUNNING) ? 1 : 0; return ret; @@ -295,15 +285,12 @@ carrier_status(struct interface *iface) int up_interface(struct interface *iface) { - int s; struct ifreq ifr; int retval = -1; #ifdef __linux__ char *p; #endif - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - return -1; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name)); #ifdef __linux__ @@ -311,17 +298,16 @@ up_interface(struct interface *iface) if ((p = strchr(ifr.ifr_name, ':'))) *p = '\0'; #endif - if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { + if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == 0) { if ((ifr.ifr_flags & IFF_UP)) retval = 0; else { ifr.ifr_flags |= IFF_UP; - if (ioctl(s, SIOCSIFFLAGS, &ifr) == 0) + if (ioctl(socket_afnet, SIOCSIFFLAGS, &ifr) == 0) retval = 0; } iface->flags = ifr.ifr_flags; } - close(s); return retval; } @@ -439,7 +425,6 @@ discover_interfaces(int argc, char * const *argv) if (ifp->hwlen != 0) memcpy(ifp->hwaddr, sll->sll_addr, ifp->hwlen); #endif - } if (!(ifp->flags & IFF_POINTOPOINT)) { @@ -514,16 +499,11 @@ do_mtu(const char *ifname, short int mtu) { struct ifreq ifr; int r; - int s; - - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - return -1; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ifr.ifr_mtu = mtu; - r = ioctl(s, mtu ? SIOCSIFMTU : SIOCGIFMTU, &ifr); - close(s); + r = ioctl(socket_afnet, mtu ? SIOCSIFMTU : SIOCGIFMTU, &ifr); if (r == -1) return -1; return ifr.ifr_mtu; diff --git a/net.h b/net.h index ade4ca17..d1e9c066 100644 --- a/net.h +++ b/net.h @@ -87,6 +87,8 @@ struct rt { struct rt *next; }; +extern int socket_afnet; + uint32_t get_netmask(uint32_t); char *hwaddr_ntoa(const unsigned char *, size_t); size_t hwaddr_aton(unsigned char *, const char *); @@ -143,7 +145,7 @@ ssize_t send_raw_packet(const struct interface *, int, const void *, ssize_t); ssize_t get_raw_packet(struct interface *, int, void *, ssize_t); -int init_socket(void); +int init_sockets(void); int open_link_socket(void); int manage_link(int); int carrier_status(struct interface *);