diff options
Diffstat (limited to 'src/gns/nss/nss_gns_query.c')
-rw-r--r-- | src/gns/nss/nss_gns_query.c | 57 |
1 files changed, 12 insertions, 45 deletions
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c index 7f6bef90d..11e46ad7f 100644 --- a/src/gns/nss/nss_gns_query.c +++ b/src/gns/nss/nss_gns_query.c | |||
@@ -60,16 +60,16 @@ gns_resolve_name (int af, const char *name, struct userdata *u) | |||
60 | FILE *p; | 60 | FILE *p; |
61 | char line[128]; | 61 | char line[128]; |
62 | int ret; | 62 | int ret; |
63 | int retry = 0; | ||
63 | int out[2]; | 64 | int out[2]; |
64 | int tried_arm_start = 0; | ||
65 | pid_t pid; | 65 | pid_t pid; |
66 | 66 | ||
67 | if (0 == getuid ()) | 67 | if (0 == getuid ()) |
68 | return -2; /* GNS via NSS is NEVER for root */ | 68 | return -2; /* GNS via NSS is NEVER for root */ |
69 | if (0 != pipe (out)) | ||
70 | return -1; | ||
71 | 69 | ||
72 | query_gns: | 70 | query_gns: |
71 | if (0 != pipe (out)) | ||
72 | return -1; | ||
73 | pid = fork (); | 73 | pid = fork (); |
74 | if (-1 == pid) | 74 | if (-1 == pid) |
75 | return -1; | 75 | return -1; |
@@ -141,56 +141,23 @@ query_gns: | |||
141 | } | 141 | } |
142 | (void) fclose (p); | 142 | (void) fclose (p); |
143 | waitpid (pid, &ret, 0); | 143 | waitpid (pid, &ret, 0); |
144 | |||
145 | if (! WIFEXITED (ret)) | 144 | if (! WIFEXITED (ret)) |
146 | return -1; | 145 | return -1; |
147 | if (4 == WEXITSTATUS (ret)) | 146 | if (4 == WEXITSTATUS (ret)) |
148 | return -2; /* not for GNS */ | 147 | return -2; /* not for GNS */ |
149 | if ((3 == ret) && | 148 | if (5 == WEXITSTATUS (ret)) |
150 | (1 != tried_arm_start)) | 149 | { |
151 | return -3; /* timeout -> try restart */ | 150 | if (1 == retry) |
152 | if ((3 == ret) && | 151 | return -2; /* no go -> service unavailable */ |
153 | (1 == tried_arm_start)) | 152 | retry = 1; |
153 | system("gnunet-arm -s"); | ||
154 | goto query_gns; /* Try again */ | ||
155 | } | ||
156 | if (3 == WEXITSTATUS (ret)) | ||
154 | return -2; /* timeout -> service unavailable */ | 157 | return -2; /* timeout -> service unavailable */ |
155 | if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret))) | 158 | if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret))) |
156 | return -2; /* launch failure -> service unavailable */ | 159 | return -2; /* launch failure -> service unavailable */ |
157 | return 0; | 160 | 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 | |||
194 | } | 161 | } |
195 | 162 | ||
196 | 163 | ||