diff options
Diffstat (limited to 'libnetutils')
-rw-r--r-- | libnetutils/dhcptool.c | 7 | ||||
-rw-r--r-- | libnetutils/ifc_utils.c | 9 |
2 files changed, 14 insertions, 2 deletions
diff --git a/libnetutils/dhcptool.c b/libnetutils/dhcptool.c index 352ac5e57..a2d3869b4 100644 --- a/libnetutils/dhcptool.c +++ b/libnetutils/dhcptool.c | |||
@@ -14,6 +14,7 @@ | |||
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <err.h> | ||
17 | #include <errno.h> | 18 | #include <errno.h> |
18 | #include <error.h> | 19 | #include <error.h> |
19 | #include <stdbool.h> | 20 | #include <stdbool.h> |
@@ -29,12 +30,14 @@ int main(int argc, char* argv[]) { | |||
29 | 30 | ||
30 | char* interface = argv[1]; | 31 | char* interface = argv[1]; |
31 | if (ifc_init()) { | 32 | if (ifc_init()) { |
32 | error(EXIT_FAILURE, errno, "dhcptool %s: ifc_init failed", interface); | 33 | err(errno, "dhcptool %s: ifc_init failed", interface); |
34 | ifc_close(); | ||
35 | return EXIT_FAILURE; | ||
33 | } | 36 | } |
34 | 37 | ||
35 | int rc = do_dhcp(interface); | 38 | int rc = do_dhcp(interface); |
36 | if (rc) { | 39 | if (rc) { |
37 | error(0, errno, "dhcptool %s: do_dhcp failed", interface); | 40 | err(errno, "dhcptool %s: do_dhcp failed", interface); |
38 | } | 41 | } |
39 | 42 | ||
40 | ifc_close(); | 43 | ifc_close(); |
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c index e0a9f7f88..85ff070a7 100644 --- a/libnetutils/ifc_utils.c +++ b/libnetutils/ifc_utils.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <unistd.h> | 19 | #include <unistd.h> |
20 | #include <string.h> | 20 | #include <string.h> |
21 | #include <errno.h> | 21 | #include <errno.h> |
22 | #include <pthread.h> | ||
22 | 23 | ||
23 | #include <sys/socket.h> | 24 | #include <sys/socket.h> |
24 | #include <sys/select.h> | 25 | #include <sys/select.h> |
@@ -57,6 +58,8 @@ | |||
57 | 58 | ||
58 | static int ifc_ctl_sock = -1; | 59 | static int ifc_ctl_sock = -1; |
59 | static int ifc_ctl_sock6 = -1; | 60 | static int ifc_ctl_sock6 = -1; |
61 | static pthread_mutex_t ifc_sock_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; | ||
62 | static pthread_mutex_t ifc_sock6_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; | ||
60 | void printerr(char *fmt, ...); | 63 | void printerr(char *fmt, ...); |
61 | 64 | ||
62 | #define DBG 0 | 65 | #define DBG 0 |
@@ -122,6 +125,8 @@ int string_to_ip(const char *string, struct sockaddr_storage *ss) { | |||
122 | int ifc_init(void) | 125 | int ifc_init(void) |
123 | { | 126 | { |
124 | int ret; | 127 | int ret; |
128 | |||
129 | pthread_mutex_lock(&ifc_sock_mutex); | ||
125 | if (ifc_ctl_sock == -1) { | 130 | if (ifc_ctl_sock == -1) { |
126 | ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); | 131 | ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); |
127 | if (ifc_ctl_sock < 0) { | 132 | if (ifc_ctl_sock < 0) { |
@@ -136,6 +141,7 @@ int ifc_init(void) | |||
136 | 141 | ||
137 | int ifc_init6(void) | 142 | int ifc_init6(void) |
138 | { | 143 | { |
144 | pthread_mutex_lock(&ifc_sock6_mutex); | ||
139 | if (ifc_ctl_sock6 == -1) { | 145 | if (ifc_ctl_sock6 == -1) { |
140 | ifc_ctl_sock6 = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0); | 146 | ifc_ctl_sock6 = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0); |
141 | if (ifc_ctl_sock6 < 0) { | 147 | if (ifc_ctl_sock6 < 0) { |
@@ -152,6 +158,7 @@ void ifc_close(void) | |||
152 | (void)close(ifc_ctl_sock); | 158 | (void)close(ifc_ctl_sock); |
153 | ifc_ctl_sock = -1; | 159 | ifc_ctl_sock = -1; |
154 | } | 160 | } |
161 | pthread_mutex_unlock(&ifc_sock_mutex); | ||
155 | } | 162 | } |
156 | 163 | ||
157 | void ifc_close6(void) | 164 | void ifc_close6(void) |
@@ -160,6 +167,7 @@ void ifc_close6(void) | |||
160 | (void)close(ifc_ctl_sock6); | 167 | (void)close(ifc_ctl_sock6); |
161 | ifc_ctl_sock6 = -1; | 168 | ifc_ctl_sock6 = -1; |
162 | } | 169 | } |
170 | pthread_mutex_unlock(&ifc_sock6_mutex); | ||
163 | } | 171 | } |
164 | 172 | ||
165 | static void ifc_init_ifr(const char *name, struct ifreq *ifr) | 173 | static void ifc_init_ifr(const char *name, struct ifreq *ifr) |
@@ -541,6 +549,7 @@ int ifc_act_on_ipv4_route(int action, const char *ifname, struct in_addr dst, in | |||
541 | ifc_init(); | 549 | ifc_init(); |
542 | 550 | ||
543 | if (ifc_ctl_sock < 0) { | 551 | if (ifc_ctl_sock < 0) { |
552 | ifc_close(); | ||
544 | return -errno; | 553 | return -errno; |
545 | } | 554 | } |
546 | 555 | ||