]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Just have one open socket for AF_NET.
authorRoy Marples <roy@marples.name>
Thu, 15 Oct 2009 00:30:54 +0000 (00:30 +0000)
committerRoy Marples <roy@marples.name>
Thu, 15 Oct 2009 00:30:54 +0000 (00:30 +0000)
dhcpcd.c
if-bsd.c
if-linux.c
net.c
net.h

index 46ed8138805789c853bcba2e9c3effaf63e729a9..a207eefcf2192939f0e9ffa87c7d396db98b1089 100644 (file)
--- 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);
        }
index e8c16f8f968df8134ecaf61cc0a168129d16211f..58c405f83d8b33f35e1c3beeb0d1bc6ac46908c1 100644 (file)
--- a/if-bsd.c
+++ b/if-bsd.c
            ?                                                                 \
            (((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;
 }
 
index 8a4eb36235bf7576b0f058d443c2f865df56dd36..8e5022071b0e9dbcea5bf5111bcb20ac07dbd965 100644 (file)
@@ -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 bb464142aaf13c54cffc2818bfe9f51d82e61af0..4d6934949c2a20e8445470179c905f1d59d0d34b 100644 (file)
--- 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 ade4ca17f8b85ba109c635fc83c4e16f00bcc9b9..d1e9c066288766d34500438a54f3c3b731816d20 100644 (file)
--- 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 *);