diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-07-13 14:53:30 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-07-13 14:53:30 +0000 |
commit | 3104aa430ae360599dd54369a8cb1fd61f07894c (patch) | |
tree | 6b8d87ddc782d50e51d1107bb13597218b5e9a1f /src/arm | |
parent | 13a3089d561ed7332da25a7c461cdcc633c6b855 (diff) | |
download | gnunet-3104aa430ae360599dd54369a8cb1fd61f07894c.tar.gz gnunet-3104aa430ae360599dd54369a8cb1fd61f07894c.zip |
automatically clean up left-over Unix domain socket files when trying to bind (fixes #3723)
Diffstat (limited to 'src/arm')
-rw-r--r-- | src/arm/gnunet-service-arm.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/arm/gnunet-service-arm.c b/src/arm/gnunet-service-arm.c index 0dffafeeb..a411546d7 100644 --- a/src/arm/gnunet-service-arm.c +++ b/src/arm/gnunet-service-arm.c | |||
@@ -603,7 +603,8 @@ accept_connection (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
603 | * @param sl service entry for the service in question | 603 | * @param sl service entry for the service in question |
604 | */ | 604 | */ |
605 | static void | 605 | static void |
606 | create_listen_socket (struct sockaddr *sa, socklen_t addr_len, | 606 | create_listen_socket (struct sockaddr *sa, |
607 | socklen_t addr_len, | ||
607 | struct ServiceList *sl) | 608 | struct ServiceList *sl) |
608 | { | 609 | { |
609 | static int on = 1; | 610 | static int on = 1; |
@@ -652,14 +653,18 @@ create_listen_socket (struct sockaddr *sa, socklen_t addr_len, | |||
652 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, | 653 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, |
653 | "setsockopt"); | 654 | "setsockopt"); |
654 | #endif | 655 | #endif |
655 | 656 | #ifndef WINDOWS | |
657 | if (AF_UNIX == sa->sa_family) | ||
658 | GNUNET_NETWORK_unix_precheck ((struct sockaddr_un *) sa); | ||
659 | #endif | ||
656 | if (GNUNET_OK != | 660 | if (GNUNET_OK != |
657 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) sa, addr_len)) | 661 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) sa, addr_len)) |
658 | { | 662 | { |
659 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 663 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
660 | _ | 664 | _("Unable to bind listening socket for service `%s' to address `%s': %s\n"), |
661 | ("Unable to bind listening socket for service `%s' to address `%s': %s\n"), | 665 | sl->name, |
662 | sl->name, GNUNET_a2s (sa, addr_len), STRERROR (errno)); | 666 | GNUNET_a2s (sa, addr_len), |
667 | STRERROR (errno)); | ||
663 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock)); | 668 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock)); |
664 | GNUNET_free (sa); | 669 | GNUNET_free (sa); |
665 | return; | 670 | return; |
@@ -1394,11 +1399,11 @@ setup_service (void *cls, | |||
1394 | "FORCESTART")) | 1399 | "FORCESTART")) |
1395 | { | 1400 | { |
1396 | sl->force_start = GNUNET_YES; | 1401 | sl->force_start = GNUNET_YES; |
1397 | /* FIXME: we might like the pre-binding even for | 1402 | if (GNUNET_YES == |
1398 | _certain_ services that have force_start set, | 1403 | GNUNET_CONFIGURATION_get_value_yesno (cfg, |
1399 | otherwise interdependencies may again force | 1404 | section, |
1400 | client's to retry connections during startup. */ | 1405 | "NOARMBIND")) |
1401 | return; | 1406 | return; |
1402 | } | 1407 | } |
1403 | else | 1408 | else |
1404 | { | 1409 | { |