aboutsummaryrefslogtreecommitdiff
path: root/src/gns/nss/nss_gns_query.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gns/nss/nss_gns_query.c')
-rw-r--r--src/gns/nss/nss_gns_query.c57
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
72query_gns: 70query_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