Skip to content

Commit 5132328

Browse files
committed
resolved: allow passing on which protocol, family and interface to look something up
Also, return on which protocol/family/interface we found something.
1 parent 12e34d9 commit 5132328

File tree

10 files changed

+284
-103
lines changed

10 files changed

+284
-103
lines changed

Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4781,6 +4781,7 @@ systemd_resolved_SOURCES = \
47814781
src/resolve/resolved-bus.h \
47824782
src/resolve/resolved-link.h \
47834783
src/resolve/resolved-link.c \
4784+
src/resolve/resolved-def.h \
47844785
src/resolve/resolved-dns-domain.h \
47854786
src/resolve/resolved-dns-domain.c \
47864787
src/resolve/resolved-dns-rr.h \

src/nss-resolve/nss-resolve.c

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -66,23 +66,27 @@ static bool bus_error_shall_fallback(sd_bus_error *e) {
6666
}
6767

6868
static int count_addresses(sd_bus_message *m, int af, const char **canonical) {
69-
int c = 0, r;
69+
int c = 0, r, ifindex;
7070

7171
assert(m);
7272
assert(canonical);
7373

74-
r = sd_bus_message_enter_container(m, 'a', "(iayi)");
74+
r = sd_bus_message_read(m, "i", &ifindex);
7575
if (r < 0)
7676
return r;
7777

78-
while ((r = sd_bus_message_enter_container(m, 'r', "iayi")) > 0) {
78+
r = sd_bus_message_enter_container(m, 'a', "(iay)");
79+
if (r < 0)
80+
return r;
81+
82+
while ((r = sd_bus_message_enter_container(m, 'r', "iay")) > 0) {
7983
int family;
8084

8185
r = sd_bus_message_read(m, "i", &family);
8286
if (r < 0)
8387
return r;
8488

85-
r = sd_bus_message_skip(m, "ayi");
89+
r = sd_bus_message_skip(m, "ay");
8690
if (r < 0)
8791
return r;
8892

@@ -127,7 +131,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
127131
const char *canonical = NULL;
128132
size_t l, ms, idx;
129133
char *r_name;
130-
int c, r, i = 0;
134+
int c, r, i = 0, ifindex;
131135

132136
assert(name);
133137
assert(pat);
@@ -153,7 +157,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
153157
if (r < 0)
154158
goto fail;
155159

156-
r = sd_bus_message_append(req, "si", name, AF_UNSPEC);
160+
r = sd_bus_message_append(req, "isit", 0, name, AF_UNSPEC, (uint64_t) 0);
157161
if (r < 0)
158162
goto fail;
159163

@@ -219,12 +223,21 @@ enum nss_status _nss_resolve_gethostbyname4_r(
219223
/* Second, append addresses */
220224
r_tuple_first = (struct gaih_addrtuple*) (buffer + idx);
221225

222-
r = sd_bus_message_enter_container(reply, 'a', "(iayi)");
226+
r = sd_bus_message_read(reply, "i", &ifindex);
227+
if (r < 0)
228+
goto fail;
229+
230+
if (ifindex < 0) {
231+
r = -EINVAL;
232+
goto fail;
233+
}
234+
235+
r = sd_bus_message_enter_container(reply, 'a', "(iay)");
223236
if (r < 0)
224237
goto fail;
225238

226-
while ((r = sd_bus_message_enter_container(reply, 'r', "iayi")) > 0) {
227-
int family, ifindex;
239+
while ((r = sd_bus_message_enter_container(reply, 'r', "iay")) > 0) {
240+
int family;
228241
const void *a;
229242
size_t sz;
230243

@@ -236,10 +249,6 @@ enum nss_status _nss_resolve_gethostbyname4_r(
236249
if (r < 0)
237250
goto fail;
238251

239-
r = sd_bus_message_read(reply, "i", &ifindex);
240-
if (r < 0)
241-
goto fail;
242-
243252
r = sd_bus_message_exit_container(reply);
244253
if (r < 0)
245254
goto fail;
@@ -252,11 +261,6 @@ enum nss_status _nss_resolve_gethostbyname4_r(
252261
goto fail;
253262
}
254263

255-
if (ifindex < 0) {
256-
r = -EINVAL;
257-
goto fail;
258-
}
259-
260264
r_tuple = (struct gaih_addrtuple*) (buffer + idx);
261265
r_tuple->next = i == c-1 ? NULL : (struct gaih_addrtuple*) ((char*) r_tuple + ALIGN(sizeof(struct gaih_addrtuple)));
262266
r_tuple->name = r_name;
@@ -309,7 +313,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
309313
_cleanup_bus_close_unref_ sd_bus *bus = NULL;
310314
size_t l, idx, ms, alen;
311315
const char *canonical;
312-
int c, r, i = 0;
316+
int c, r, i = 0, ifindex;
313317

314318
assert(name);
315319
assert(result);
@@ -343,7 +347,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
343347
if (r < 0)
344348
goto fail;
345349

346-
r = sd_bus_message_append(req, "si", name, af);
350+
r = sd_bus_message_append(req, "isit", 0, name, af, (uint64_t) 0);
347351
if (r < 0)
348352
goto fail;
349353

@@ -424,12 +428,21 @@ enum nss_status _nss_resolve_gethostbyname3_r(
424428
/* Third, append addresses */
425429
r_addr = buffer + idx;
426430

427-
r = sd_bus_message_enter_container(reply, 'a', "(iayi)");
431+
r = sd_bus_message_read(reply, "i", &ifindex);
428432
if (r < 0)
429433
goto fail;
430434

431-
while ((r = sd_bus_message_enter_container(reply, 'r', "iayi")) > 0) {
432-
int family, ifindex;
435+
if (ifindex < 0) {
436+
r = -EINVAL;
437+
goto fail;
438+
}
439+
440+
r = sd_bus_message_enter_container(reply, 'a', "(iay)");
441+
if (r < 0)
442+
goto fail;
443+
444+
while ((r = sd_bus_message_enter_container(reply, 'r', "iay")) > 0) {
445+
int family;
433446
const void *a;
434447
size_t sz;
435448

@@ -441,10 +454,6 @@ enum nss_status _nss_resolve_gethostbyname3_r(
441454
if (r < 0)
442455
goto fail;
443456

444-
r = sd_bus_message_read(reply, "i", &ifindex);
445-
if (r < 0)
446-
goto fail;
447-
448457
r = sd_bus_message_exit_container(reply);
449458
if (r < 0)
450459
goto fail;
@@ -521,7 +530,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
521530
unsigned c = 0, i = 0;
522531
size_t ms = 0, idx;
523532
const char *n;
524-
int r;
533+
int r, ifindex;
525534

526535
assert(addr);
527536
assert(result);
@@ -559,15 +568,15 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
559568
if (r < 0)
560569
goto fail;
561570

562-
r = sd_bus_message_append(req, "i", af);
571+
r = sd_bus_message_append(req, "ii", 0, af);
563572
if (r < 0)
564573
goto fail;
565574

566575
r = sd_bus_message_append_array(req, 'y', addr, len);
567576
if (r < 0)
568577
goto fail;
569578

570-
r = sd_bus_message_append(req, "i", 0);
579+
r = sd_bus_message_append(req, "t", (uint64_t) 0);
571580
if (r < 0)
572581
goto fail;
573582

@@ -607,6 +616,15 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
607616
return NSS_STATUS_UNAVAIL;
608617
}
609618

619+
r = sd_bus_message_read(reply, "i", &ifindex);
620+
if (r < 0)
621+
goto fail;
622+
623+
if (ifindex < 0) {
624+
r = -EINVAL;
625+
goto fail;
626+
}
627+
610628
r = sd_bus_message_enter_container(reply, 'a', "s");
611629
if (r < 0)
612630
goto fail;

0 commit comments

Comments
 (0)