aboutsummaryrefslogtreecommitdiff
path: root/src/gns/nss
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2019-10-05 15:09:28 +0200
committerChristian Grothoff <christian@grothoff.org>2019-10-05 15:09:28 +0200
commitc4e9ba925ffd758aaa3feee2ccfc0b76f26fe207 (patch)
treecac3ce030d77b4cbe7c7dc62ed58cfe6d24f73e1 /src/gns/nss
parentfbb71d527c7d6babf269a8fefce1db291b9f7068 (diff)
downloadgnunet-c4e9ba925ffd758aaa3feee2ccfc0b76f26fe207.tar.gz
gnunet-c4e9ba925ffd758aaa3feee2ccfc0b76f26fe207.zip
global reindent, now with uncrustify hook enabled
Diffstat (limited to 'src/gns/nss')
-rw-r--r--src/gns/nss/nss_gns.c193
-rw-r--r--src/gns/nss/nss_gns_query.c138
-rw-r--r--src/gns/nss/nss_gns_query.h18
3 files changed, 177 insertions, 172 deletions
diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c
index 43fc030b9..beae4d15e 100644
--- a/src/gns/nss/nss_gns.c
+++ b/src/gns/nss/nss_gns.c
@@ -37,9 +37,9 @@
37 37
38/** macro to align idx to 32bit boundary */ 38/** macro to align idx to 32bit boundary */
39#define ALIGN(idx) do { \ 39#define ALIGN(idx) do { \
40 if (idx % sizeof(void*)) \ 40 if (idx % sizeof(void*)) \
41 idx += (sizeof(void*) - idx % sizeof(void*)); /* Align on 32 bit boundary */ \ 41 idx += (sizeof(void*) - idx % sizeof(void*)); /* Align on 32 bit boundary */ \
42 } while (0) 42} while (0)
43 43
44 44
45/** 45/**
@@ -55,13 +55,13 @@
55 * @return a nss_status code 55 * @return a nss_status code
56 */ 56 */
57enum nss_status 57enum nss_status
58_nss_gns_gethostbyname2_r(const char *name, 58_nss_gns_gethostbyname2_r (const char *name,
59 int af, 59 int af,
60 struct hostent *result, 60 struct hostent *result,
61 char *buffer, 61 char *buffer,
62 size_t buflen, 62 size_t buflen,
63 int *errnop, 63 int *errnop,
64 int *h_errnop) 64 int *h_errnop)
65{ 65{
66 struct userdata u; 66 struct userdata u;
67 enum nss_status status = NSS_STATUS_UNAVAIL; 67 enum nss_status status = NSS_STATUS_UNAVAIL;
@@ -86,97 +86,98 @@ _nss_gns_gethostbyname2_r(const char *name,
86 if ((af != AF_INET) && 86 if ((af != AF_INET) &&
87 (af != AF_INET6)) 87 (af != AF_INET6))
88#endif 88#endif
89 { 89 {
90 *errnop = EINVAL; 90 *errnop = EINVAL;
91 *h_errnop = NO_RECOVERY; 91 *h_errnop = NO_RECOVERY;
92 92
93 goto finish; 93 goto finish;
94 } 94 }
95 95
96 address_length = (af == AF_INET) ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t); 96 address_length = (af == AF_INET) ? sizeof(ipv4_address_t) :
97 sizeof(ipv6_address_t);
97 if (buflen < 98 if (buflen <
98 sizeof(char*) + /* alias names */ 99 sizeof(char*) /* alias names */
99 strlen(name) + 1) 100 + strlen (name) + 1)
100 { /* official name */ 101 { /* official name */
101 *errnop = ERANGE; 102 *errnop = ERANGE;
102 *h_errnop = NO_RECOVERY; 103 *h_errnop = NO_RECOVERY;
103 status = NSS_STATUS_TRYAGAIN; 104 status = NSS_STATUS_TRYAGAIN;
104 105
105 goto finish; 106 goto finish;
106 } 107 }
107 u.count = 0; 108 u.count = 0;
108 u.data_len = 0; 109 u.data_len = 0;
109 i = gns_resolve_name(af, 110 i = gns_resolve_name (af,
110 name, 111 name,
111 &u); 112 &u);
112 if (-1 == i) 113 if (-1 == i)
113 { 114 {
114 *errnop = errno; 115 *errnop = errno;
115 status = NSS_STATUS_UNAVAIL; 116 status = NSS_STATUS_UNAVAIL;
116 *h_errnop = NO_RECOVERY; 117 *h_errnop = NO_RECOVERY;
117 goto finish; 118 goto finish;
118 } 119 }
119 if (-2 == i) 120 if (-2 == i)
120 { 121 {
121 *errnop = ENOENT; 122 *errnop = ENOENT;
122 *h_errnop = NO_RECOVERY; 123 *h_errnop = NO_RECOVERY;
123 status = NSS_STATUS_UNAVAIL; 124 status = NSS_STATUS_UNAVAIL;
124 goto finish; 125 goto finish;
125 } 126 }
126 if (-3 == i) 127 if (-3 == i)
127 { 128 {
128 *errnop = ETIMEDOUT; 129 *errnop = ETIMEDOUT;
129 *h_errnop = HOST_NOT_FOUND; 130 *h_errnop = HOST_NOT_FOUND;
130 status = NSS_STATUS_NOTFOUND; 131 status = NSS_STATUS_NOTFOUND;
131 goto finish; 132 goto finish;
132 } 133 }
133 if (0 == u.count) 134 if (0 == u.count)
134 { 135 {
135 *errnop = 0; /* success */ 136 *errnop = 0; /* success */
136 *h_errnop = NO_DATA; /* success */ 137 *h_errnop = NO_DATA; /* success */
137 status = NSS_STATUS_NOTFOUND; 138 status = NSS_STATUS_NOTFOUND;
138 goto finish; 139 goto finish;
139 } 140 }
140 /* Alias names */ 141 /* Alias names */
141 *((char**)buffer) = NULL; 142 *((char**) buffer) = NULL;
142 result->h_aliases = (char**)buffer; 143 result->h_aliases = (char**) buffer;
143 idx = sizeof(char*); 144 idx = sizeof(char*);
144 145
145 /* Official name */ 146 /* Official name */
146 strcpy(buffer + idx, 147 strcpy (buffer + idx,
147 name); 148 name);
148 result->h_name = buffer + idx; 149 result->h_name = buffer + idx;
149 idx += strlen(name) + 1; 150 idx += strlen (name) + 1;
150 151
151 ALIGN(idx); 152 ALIGN (idx);
152 153
153 result->h_addrtype = af; 154 result->h_addrtype = af;
154 result->h_length = address_length; 155 result->h_length = address_length;
155 156
156 /* Check if there's enough space for the addresses */ 157 /* Check if there's enough space for the addresses */
157 if (buflen < idx + u.data_len + sizeof(char*) * (u.count + 1)) 158 if (buflen < idx + u.data_len + sizeof(char*) * (u.count + 1))
158 { 159 {
159 *errnop = ERANGE; 160 *errnop = ERANGE;
160 *h_errnop = NO_RECOVERY; 161 *h_errnop = NO_RECOVERY;
161 status = NSS_STATUS_TRYAGAIN; 162 status = NSS_STATUS_TRYAGAIN;
162 goto finish; 163 goto finish;
163 } 164 }
164 /* Addresses */ 165 /* Addresses */
165 astart = idx; 166 astart = idx;
166 l = u.count * address_length; 167 l = u.count * address_length;
167 if (0 != l) 168 if (0 != l)
168 memcpy(buffer + astart, 169 memcpy (buffer + astart,
169 &u.data, 170 &u.data,
170 l); 171 l);
171 /* address_length is a multiple of 32bits, so idx is still aligned 172 /* address_length is a multiple of 32bits, so idx is still aligned
172 * correctly */ 173 * correctly */
173 idx += l; 174 idx += l;
174 175
175 /* Address array address_length is always a multiple of 32bits */ 176 /* Address array address_length is always a multiple of 32bits */
176 for (i = 0; i < u.count; i++) 177 for (i = 0; i < u.count; i++)
177 ((char**)(buffer + idx))[i] = buffer + astart + address_length * i; 178 ((char**) (buffer + idx))[i] = buffer + astart + address_length * i;
178 ((char**)(buffer + idx))[i] = NULL; 179 ((char**) (buffer + idx))[i] = NULL;
179 result->h_addr_list = (char**)(buffer + idx); 180 result->h_addr_list = (char**) (buffer + idx);
180 181
181 status = NSS_STATUS_SUCCESS; 182 status = NSS_STATUS_SUCCESS;
182 183
@@ -197,20 +198,20 @@ finish:
197 * @return a nss_status code 198 * @return a nss_status code
198 */ 199 */
199enum nss_status 200enum nss_status
200_nss_gns_gethostbyname_r(const char *name, 201_nss_gns_gethostbyname_r (const char *name,
201 struct hostent *result, 202 struct hostent *result,
202 char *buffer, 203 char *buffer,
203 size_t buflen, 204 size_t buflen,
204 int *errnop, 205 int *errnop,
205 int *h_errnop) 206 int *h_errnop)
206{ 207{
207 return _nss_gns_gethostbyname2_r(name, 208 return _nss_gns_gethostbyname2_r (name,
208 AF_UNSPEC, 209 AF_UNSPEC,
209 result, 210 result,
210 buffer, 211 buffer,
211 buflen, 212 buflen,
212 errnop, 213 errnop,
213 h_errnop); 214 h_errnop);
214} 215}
215 216
216 217
@@ -229,21 +230,21 @@ _nss_gns_gethostbyname_r(const char *name,
229 * @return NSS_STATUS_UNAVAIL 230 * @return NSS_STATUS_UNAVAIL
230 */ 231 */
231enum nss_status 232enum nss_status
232_nss_gns_gethostbyaddr_r(const void* addr, 233_nss_gns_gethostbyaddr_r (const void*addr,
233 int len, 234 int len,
234 int af, 235 int af,
235 struct hostent *result, 236 struct hostent *result,
236 char *buffer, 237 char *buffer,
237 size_t buflen, 238 size_t buflen,
238 int *errnop, 239 int *errnop,
239 int *h_errnop) 240 int *h_errnop)
240{ 241{
241 (void)addr; 242 (void) addr;
242 (void)len; 243 (void) len;
243 (void)af; 244 (void) af;
244 (void)result; 245 (void) result;
245 (void)buffer; 246 (void) buffer;
246 (void)buflen; 247 (void) buflen;
247 *errnop = EINVAL; 248 *errnop = EINVAL;
248 *h_errnop = NO_RECOVERY; 249 *h_errnop = NO_RECOVERY;
249 /* NOTE we allow to leak this into DNS so no NOTFOUND */ 250 /* NOTE we allow to leak this into DNS so no NOTFOUND */
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c
index 8af618618..fb431919b 100644
--- a/src/gns/nss/nss_gns_query.c
+++ b/src/gns/nss/nss_gns_query.c
@@ -33,12 +33,12 @@
33#define TIMEOUT "5s" 33#define TIMEOUT "5s"
34 34
35static void 35static void
36kwait(pid_t chld) 36kwait (pid_t chld)
37{ 37{
38 int ret; 38 int ret;
39 39
40 kill(chld, SIGKILL); 40 kill (chld, SIGKILL);
41 waitpid(chld, &ret, 0); 41 waitpid (chld, &ret, 0);
42} 42}
43 43
44 44
@@ -55,7 +55,7 @@ kwait(pid_t chld)
55 * else 0 55 * else 0
56 */ 56 */
57int 57int
58gns_resolve_name(int af, const char *name, struct userdata *u) 58gns_resolve_name (int af, const char *name, struct userdata *u)
59{ 59{
60 FILE *p; 60 FILE *p;
61 char line[128]; 61 char line[128];
@@ -63,85 +63,85 @@ gns_resolve_name(int af, const char *name, struct userdata *u)
63 int out[2]; 63 int out[2];
64 pid_t pid; 64 pid_t pid;
65 65
66 if (0 != pipe(out)) 66 if (0 != pipe (out))
67 return -1; 67 return -1;
68 pid = fork(); 68 pid = fork ();
69 if (-1 == pid) 69 if (-1 == pid)
70 return -1; 70 return -1;
71 if (0 == pid) 71 if (0 == pid)
72 { 72 {
73 char *argv[] = { "gnunet-gns", 73 char *argv[] = { "gnunet-gns",
74 "-r", 74 "-r",
75 "-t", 75 "-t",
76 (AF_INET6 == af) ? "AAAA" : "A", 76 (AF_INET6 == af) ? "AAAA" : "A",
77 "-u", 77 "-u",
78 (char *)name, 78 (char *) name,
79 "-T", 79 "-T",
80 TIMEOUT, 80 TIMEOUT,
81 NULL }; 81 NULL };
82 82
83 (void)close(STDOUT_FILENO); 83 (void) close (STDOUT_FILENO);
84 if ((0 != close(out[0])) || 84 if ((0 != close (out[0])) ||
85 (STDOUT_FILENO != dup2(out[1], STDOUT_FILENO))) 85 (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO)))
86 _exit(1); 86 _exit (1);
87 (void)execvp("gnunet-gns", argv); 87 (void) execvp ("gnunet-gns", argv);
88 _exit(1); 88 _exit (1);
89 } 89 }
90 (void)close(out[1]); 90 (void) close (out[1]);
91 p = fdopen(out[0], "r"); 91 p = fdopen (out[0], "r");
92 if (NULL == p) 92 if (NULL == p)
93 {
94 kwait (pid);
95 return -1;
96 }
97 while (NULL != fgets (line, sizeof(line), p))
98 {
99 if (u->count >= MAX_ENTRIES)
100 break;
101 if (line[strlen (line) - 1] == '\n')
93 { 102 {
94 kwait(pid); 103 line[strlen (line) - 1] = '\0';
95 return -1; 104 if (AF_INET == af)
96 } 105 {
97 while (NULL != fgets(line, sizeof(line), p)) 106 if (inet_pton (af, line, &u->data.ipv4[u->count]))
98 { 107 {
99 if (u->count >= MAX_ENTRIES) 108 u->count++;
100 break; 109 u->data_len += sizeof(ipv4_address_t);
101 if (line[strlen(line) - 1] == '\n') 110 }
111 else
112 {
113 (void) fclose (p);
114 kwait (pid);
115 errno = EINVAL;
116 return -1;
117 }
118 }
119 else if (AF_INET6 == af)
120 {
121 if (inet_pton (af, line, &u->data.ipv6[u->count]))
122 {
123 u->count++;
124 u->data_len += sizeof(ipv6_address_t);
125 }
126 else
102 { 127 {
103 line[strlen(line) - 1] = '\0'; 128 (void) fclose (p);
104 if (AF_INET == af) 129 kwait (pid);
105 { 130 errno = EINVAL;
106 if (inet_pton(af, line, &u->data.ipv4[u->count])) 131 return -1;
107 {
108 u->count++;
109 u->data_len += sizeof(ipv4_address_t);
110 }
111 else
112 {
113 (void)fclose(p);
114 kwait(pid);
115 errno = EINVAL;
116 return -1;
117 }
118 }
119 else if (AF_INET6 == af)
120 {
121 if (inet_pton(af, line, &u->data.ipv6[u->count]))
122 {
123 u->count++;
124 u->data_len += sizeof(ipv6_address_t);
125 }
126 else
127 {
128 (void)fclose(p);
129 kwait(pid);
130 errno = EINVAL;
131 return -1;
132 }
133 }
134 } 132 }
133 }
135 } 134 }
136 (void)fclose(p); 135 }
137 waitpid(pid, &ret, 0); 136 (void) fclose (p);
138 if (!WIFEXITED(ret)) 137 waitpid (pid, &ret, 0);
138 if (! WIFEXITED (ret))
139 return -1; 139 return -1;
140 if (4 == WEXITSTATUS(ret)) 140 if (4 == WEXITSTATUS (ret))
141 return -2; /* not for GNS */ 141 return -2; /* not for GNS */
142 if (3 == ret) 142 if (3 == ret)
143 return -3; /* timeout -> not found */ 143 return -3; /* timeout -> not found */
144 if ((2 == WEXITSTATUS(ret)) || (1 == WEXITSTATUS(ret))) 144 if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret)))
145 return -2; /* launch failure -> service unavailable */ 145 return -2; /* launch failure -> service unavailable */
146 return 0; 146 return 0;
147} 147}
diff --git a/src/gns/nss/nss_gns_query.h b/src/gns/nss/nss_gns_query.h
index 1901dd6c4..43bf21646 100644
--- a/src/gns/nss/nss_gns_query.h
+++ b/src/gns/nss/nss_gns_query.h
@@ -28,20 +28,24 @@
28/* Maximum number of entries to return */ 28/* Maximum number of entries to return */
29#define MAX_ENTRIES 16 29#define MAX_ENTRIES 16
30 30
31typedef struct { 31typedef struct
32{
32 uint32_t address; 33 uint32_t address;
33} ipv4_address_t; 34} ipv4_address_t;
34 35
35 36
36typedef struct { 37typedef struct
38{
37 uint8_t address[16]; 39 uint8_t address[16];
38} ipv6_address_t; 40} ipv6_address_t;
39 41
40 42
41struct userdata { 43struct userdata
44{
42 int count; 45 int count;
43 int data_len; /* only valid when doing reverse lookup */ 46 int data_len; /* only valid when doing reverse lookup */
44 union { 47 union
48 {
45 ipv4_address_t ipv4[MAX_ENTRIES]; 49 ipv4_address_t ipv4[MAX_ENTRIES];
46 ipv6_address_t ipv6[MAX_ENTRIES]; 50 ipv6_address_t ipv6[MAX_ENTRIES];
47 char *name[MAX_ENTRIES]; 51 char *name[MAX_ENTRIES];
@@ -62,8 +66,8 @@ struct userdata {
62 * else 0 66 * else 0
63 */ 67 */
64int 68int
65gns_resolve_name(int af, 69gns_resolve_name (int af,
66 const char *name, 70 const char *name,
67 struct userdata *userdata); 71 struct userdata *userdata);
68 72
69#endif 73#endif