diff options
author | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2020-05-09 23:35:32 +0200 |
---|---|---|
committer | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2020-05-09 23:35:32 +0200 |
commit | 2cd529519d3f9d5034ed222536f8c79ef9e6b86d (patch) | |
tree | da13757c654d6466f84b028c9383bb3e7ddf2138 /src/gns/nss | |
parent | ada94c2742c8dd5a38ca88d47de6fb13ac2b83cb (diff) | |
download | gnunet-2cd529519d3f9d5034ed222536f8c79ef9e6b86d.tar.gz gnunet-2cd529519d3f9d5034ed222536f8c79ef9e6b86d.zip |
towards bettwe nss handling
Diffstat (limited to 'src/gns/nss')
-rw-r--r-- | src/gns/nss/nss_gns_query.c | 48 |
1 files changed, 46 insertions, 2 deletions
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) | |||
61 | char line[128]; | 61 | char line[128]; |
62 | int ret; | 62 | int ret; |
63 | int out[2]; | 63 | int out[2]; |
64 | int tried_arm_start = 0; | ||
64 | pid_t pid; | 65 | pid_t pid; |
65 | 66 | ||
66 | if (0 == getuid ()) | 67 | if (0 == getuid ()) |
67 | return -2; /* GNS via NSS is NEVER for root */ | 68 | return -2; /* GNS via NSS is NEVER for root */ |
68 | if (0 != pipe (out)) | 69 | if (0 != pipe (out)) |
69 | return -1; | 70 | return -1; |
71 | |||
72 | query_gns: | ||
70 | pid = fork (); | 73 | pid = fork (); |
71 | if (-1 == pid) | 74 | if (-1 == pid) |
72 | return -1; | 75 | return -1; |
@@ -138,15 +141,56 @@ gns_resolve_name (int af, const char *name, struct userdata *u) | |||
138 | } | 141 | } |
139 | (void) fclose (p); | 142 | (void) fclose (p); |
140 | waitpid (pid, &ret, 0); | 143 | waitpid (pid, &ret, 0); |
144 | |||
141 | if (! WIFEXITED (ret)) | 145 | if (! WIFEXITED (ret)) |
142 | return -1; | 146 | return -1; |
143 | if (4 == WEXITSTATUS (ret)) | 147 | if (4 == WEXITSTATUS (ret)) |
144 | return -2; /* not for GNS */ | 148 | return -2; /* not for GNS */ |
145 | if (3 == ret) | 149 | if ((3 == ret) && |
146 | return -3; /* timeout -> not found */ | 150 | (1 != tried_arm_start)) |
151 | return -3; /* timeout -> try restart */ | ||
152 | if ((3 == ret) && | ||
153 | (1 == tried_arm_start)) | ||
154 | return -2; /* timeout -> service unavailable */ | ||
147 | if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret))) | 155 | if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret))) |
148 | return -2; /* launch failure -> service unavailable */ | 156 | return -2; /* launch failure -> service unavailable */ |
149 | return 0; | 157 | return 0; |
158 | |||
159 | pid = fork (); | ||
160 | if (-1 == pid) | ||
161 | return -1; | ||
162 | if (0 == pid) | ||
163 | { | ||
164 | char *argv[] = { "gnunet-arm", | ||
165 | "-s", /* Raw output for easier parsing */ | ||
166 | NULL }; | ||
167 | |||
168 | (void) close (STDOUT_FILENO); | ||
169 | if ((0 != close (out[0])) || | ||
170 | (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO))) | ||
171 | _exit (1); | ||
172 | (void) execvp ("gnunet-arm", argv); | ||
173 | _exit (1); | ||
174 | } | ||
175 | (void) close (out[1]); | ||
176 | p = fdopen (out[0], "r"); | ||
177 | if (NULL == p) | ||
178 | { | ||
179 | kwait (pid); | ||
180 | return -1; | ||
181 | } | ||
182 | while (NULL != fgets (line, sizeof(line), p)) | ||
183 | { | ||
184 | /** | ||
185 | * Read output | ||
186 | */ | ||
187 | } | ||
188 | (void) fclose (p); | ||
189 | waitpid (pid, &ret, 0); | ||
190 | tried_arm_start = 1; | ||
191 | goto query_gns; | ||
192 | |||
193 | |||
150 | } | 194 | } |
151 | 195 | ||
152 | 196 | ||