aboutsummaryrefslogtreecommitdiff
path: root/src/gns/nss/nss_gns_query.c
diff options
context:
space:
mode:
authorSchanzenbach, Martin <mschanzenbach@posteo.de>2019-06-27 09:08:06 +0200
committerSchanzenbach, Martin <mschanzenbach@posteo.de>2019-06-27 09:08:06 +0200
commit92a2b1758aa56383360603567c17646a1a7fb443 (patch)
tree7652e270ce7f894fe1d76f5dfce62cc6dab1b277 /src/gns/nss/nss_gns_query.c
parente0698f82e63b071772217f36aeeb53703f86a19d (diff)
downloadgnunet-92a2b1758aa56383360603567c17646a1a7fb443.tar.gz
gnunet-92a2b1758aa56383360603567c17646a1a7fb443.zip
fix #5782
Diffstat (limited to 'src/gns/nss/nss_gns_query.c')
-rw-r--r--src/gns/nss/nss_gns_query.c99
1 files changed, 43 insertions, 56 deletions
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c
index 380788d35..253bb0f02 100644
--- a/src/gns/nss/nss_gns_query.c
+++ b/src/gns/nss/nss_gns_query.c
@@ -30,6 +30,7 @@
30#include <unistd.h> 30#include <unistd.h>
31#include <signal.h> 31#include <signal.h>
32 32
33#define TIMEOUT "5s"
33 34
34static void 35static void
35kwait (pid_t chld) 36kwait (pid_t chld)
@@ -37,9 +38,7 @@ kwait (pid_t chld)
37 int ret; 38 int ret;
38 39
39 kill (chld, SIGKILL); 40 kill (chld, SIGKILL);
40 waitpid (chld, 41 waitpid (chld, &ret, 0);
41 &ret,
42 0);
43} 42}
44 43
45 44
@@ -56,9 +55,7 @@ kwait (pid_t chld)
56 * else 0 55 * else 0
57 */ 56 */
58int 57int
59gns_resolve_name (int af, 58gns_resolve_name (int af, const char *name, struct userdata *u)
60 const char *name,
61 struct userdata *u)
62{ 59{
63 FILE *p; 60 FILE *p;
64 char line[128]; 61 char line[128];
@@ -73,88 +70,78 @@ gns_resolve_name (int af,
73 return -1; 70 return -1;
74 if (0 == pid) 71 if (0 == pid)
75 { 72 {
76 char *argv[] = { 73 char *argv[] = {"gnunet-gns",
77 "gnunet-gns", 74 "-r",
78 "-r", 75 "-t",
79 "-t", 76 (AF_INET6 == af) ? "AAAA" : "A",
80 (AF_INET6 == af) ? "AAAA" : "A", 77 "-u",
81 "-u", 78 (char *) name,
82 (char *) name, 79 "-T",
83 NULL 80 TIMEOUT,
84 }; 81 NULL};
85 82
86 (void) close (STDOUT_FILENO); 83 (void) close (STDOUT_FILENO);
87 if ( (0 != close (out[0])) || 84 if ((0 != close (out[0])) ||
88 (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO)) ) 85 (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO)))
89 _exit (1); 86 _exit (1);
90 (void) execvp ("gnunet-gns", 87 (void) execvp ("gnunet-gns", argv);
91 argv);
92 _exit (1); 88 _exit (1);
93 } 89 }
94 (void) close (out[1]); 90 (void) close (out[1]);
95 p = fdopen (out[0], "r"); 91 p = fdopen (out[0], "r");
96 if (NULL == p) 92 if (NULL == p)
97 { 93 {
98 kwait (pid); 94 kwait (pid);
99 return -1; 95 return -1;
100 } 96 }
101 while (NULL != fgets (line, 97 while (NULL != fgets (line, sizeof (line), p))
102 sizeof (line),
103 p))
104 { 98 {
105 if (u->count >= MAX_ENTRIES) 99 if (u->count >= MAX_ENTRIES)
106 break; 100 break;
107 if (line[strlen(line)-1] == '\n') 101 if (line[strlen (line) - 1] == '\n')
108 { 102 {
109 line[strlen(line)-1] = '\0'; 103 line[strlen (line) - 1] = '\0';
110 if (AF_INET == af) 104 if (AF_INET == af)
111 { 105 {
112 if (inet_pton(af, 106 if (inet_pton (af, line, &u->data.ipv4[u->count]))
113 line, 107 {
114 &u->data.ipv4[u->count])) 108 u->count++;
109 u->data_len += sizeof (ipv4_address_t);
110 }
111 else
115 { 112 {
116 u->count++; 113 (void) fclose (p);
117 u->data_len += sizeof(ipv4_address_t);
118 }
119 else
120 {
121 (void) fclose (p);
122 kwait (pid); 114 kwait (pid);
123 errno = EINVAL; 115 errno = EINVAL;
124 return -1; 116 return -1;
125 } 117 }
126 } 118 }
127 else if (AF_INET6 == af) 119 else if (AF_INET6 == af)
128 { 120 {
129 if (inet_pton(af, 121 if (inet_pton (af, line, &u->data.ipv6[u->count]))
130 line,
131 &u->data.ipv6[u->count]))
132 { 122 {
133 u->count++; 123 u->count++;
134 u->data_len += sizeof(ipv6_address_t); 124 u->data_len += sizeof (ipv6_address_t);
135 } 125 }
136 else 126 else
137 { 127 {
138 (void) fclose (p); 128 (void) fclose (p);
139 kwait (pid); 129 kwait (pid);
140 errno = EINVAL; 130 errno = EINVAL;
141 return -1; 131 return -1;
142 } 132 }
143 } 133 }
144 } 134 }
145 } 135 }
146 (void) fclose (p); 136 (void) fclose (p);
147 waitpid (pid, 137 waitpid (pid, &ret, 0);
148 &ret,
149 0);
150 if (! WIFEXITED (ret)) 138 if (! WIFEXITED (ret))
151 return -1; 139 return -1;
152 if (4 == WEXITSTATUS (ret)) 140 if (4 == WEXITSTATUS (ret))
153 return -2; /* not for GNS */ 141 return -2; /* not for GNS */
154 if (3 == ret) 142 if (3 == ret)
155 return -3; /* timeout -> not found */ 143 return -3; /* timeout -> not found */
156 if ( (2 == WEXITSTATUS (ret)) || 144 if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret)))
157 (1 == WEXITSTATUS (ret)) )
158 return -2; /* launch failure -> service unavailable */ 145 return -2; /* launch failure -> service unavailable */
159 return 0; 146 return 0;
160} 147}