From: Schanzenbach, Martin Date: Sat, 9 May 2020 21:35:32 +0000 (+0200) Subject: towards bettwe nss handling X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2cd529519d3f9d5034ed222536f8c79ef9e6b86d;p=oweals%2Fgnunet.git towards bettwe nss handling --- diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c index 77ad3a358..7f6bef90d 100644 --- a/src/gns/nss/nss_gns_query.c +++ b/src/gns/nss/nss_gns_query.c @@ -61,12 +61,15 @@ gns_resolve_name (int af, const char *name, struct userdata *u) char line[128]; int ret; int out[2]; + int tried_arm_start = 0; pid_t pid; if (0 == getuid ()) return -2; /* GNS via NSS is NEVER for root */ if (0 != pipe (out)) return -1; + +query_gns: pid = fork (); if (-1 == pid) return -1; @@ -138,15 +141,56 @@ gns_resolve_name (int af, const char *name, struct userdata *u) } (void) fclose (p); waitpid (pid, &ret, 0); + if (! WIFEXITED (ret)) return -1; if (4 == WEXITSTATUS (ret)) return -2; /* not for GNS */ - if (3 == ret) - return -3; /* timeout -> not found */ + if ((3 == ret) && + (1 != tried_arm_start)) + return -3; /* timeout -> try restart */ + if ((3 == ret) && + (1 == tried_arm_start)) + return -2; /* timeout -> service unavailable */ if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret))) return -2; /* launch failure -> service unavailable */ return 0; + + pid = fork (); + if (-1 == pid) + return -1; + if (0 == pid) + { + char *argv[] = { "gnunet-arm", + "-s", /* Raw output for easier parsing */ + NULL }; + + (void) close (STDOUT_FILENO); + if ((0 != close (out[0])) || + (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO))) + _exit (1); + (void) execvp ("gnunet-arm", argv); + _exit (1); + } + (void) close (out[1]); + p = fdopen (out[0], "r"); + if (NULL == p) + { + kwait (pid); + return -1; + } + while (NULL != fgets (line, sizeof(line), p)) + { + /** + * Read output + */ + } + (void) fclose (p); + waitpid (pid, &ret, 0); + tried_arm_start = 1; + goto query_gns; + + }