aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchanzenbach, Martin <mschanzenbach@posteo.de>2020-05-09 23:35:32 +0200
committerSchanzenbach, Martin <mschanzenbach@posteo.de>2020-05-09 23:35:32 +0200
commit2cd529519d3f9d5034ed222536f8c79ef9e6b86d (patch)
treeda13757c654d6466f84b028c9383bb3e7ddf2138 /src
parentada94c2742c8dd5a38ca88d47de6fb13ac2b83cb (diff)
downloadgnunet-2cd529519d3f9d5034ed222536f8c79ef9e6b86d.tar.gz
gnunet-2cd529519d3f9d5034ed222536f8c79ef9e6b86d.zip
towards bettwe nss handling
Diffstat (limited to 'src')
-rw-r--r--src/gns/nss/nss_gns_query.c48
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
72query_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