summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'libnetutils')
-rw-r--r--libnetutils/dhcptool.c7
-rw-r--r--libnetutils/ifc_utils.c9
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
58static int ifc_ctl_sock = -1; 59static int ifc_ctl_sock = -1;
59static int ifc_ctl_sock6 = -1; 60static int ifc_ctl_sock6 = -1;
61static pthread_mutex_t ifc_sock_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
62static pthread_mutex_t ifc_sock6_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
60void printerr(char *fmt, ...); 63void 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) {
122int ifc_init(void) 125int 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
137int ifc_init6(void) 142int 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
157void ifc_close6(void) 164void 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
165static void ifc_init_ifr(const char *name, struct ifreq *ifr) 173static 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