1/* $OpenBSD: ypldap_dns.c,v 1.8 2015/01/16 06:40:22 deraadt Exp $ */
2/* $FreeBSD: head/usr.sbin/ypldap/ypldap_dns.c 297907 2016-04-13 03:36:34Z araujo $ */
3
4/*
5 * Copyright (c) 2003-2008 Henning Brauer <henning@openbsd.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
--- 32 unchanged lines hidden (view full) ---
43#include "ypldap.h"
44
45volatile sig_atomic_t quit_dns = 0;
46struct imsgev *iev_dns;
47
48void dns_dispatch_imsg(int, short, void *);
49void dns_sig_handler(int, short, void *);
50void dns_shutdown(void);
51int host_dns(const char *, struct ypldap_addr_list *);
52
53void
54dns_sig_handler(int sig, short event, void *p)
55{
56 switch (sig) {
57 case SIGINT:
58 case SIGTERM:
59 dns_shutdown();
--- 64 unchanged lines hidden (view full) ---
124}
125
126void
127dns_dispatch_imsg(int fd, short events, void *p)
128{
129 struct imsg imsg;
130 int n, cnt;
131 char *name;
132 struct ypldap_addr_list hn = TAILQ_HEAD_INITIALIZER(hn);
133 struct ypldap_addr *h;
134 struct ibuf *buf;
135 struct env *env = p;
136 struct imsgev *iev = env->sc_iev;
137 struct imsgbuf *ibuf = &iev->ibuf;
138 int shut = 0;
139
140 if ((events & (EV_READ | EV_WRITE)) == 0)
141 fatalx("unknown event");
--- 30 unchanged lines hidden (view full) ---
172 if ((cnt = host_dns(name, &hn)) == -1)
173 break;
174 buf = imsg_create(ibuf, IMSG_HOST_DNS,
175 imsg.hdr.peerid, 0,
176 cnt * sizeof(struct sockaddr_storage));
177 if (buf == NULL)
178 break;
179 if (cnt > 0) {
180 while(!TAILQ_EMPTY(&hn)) {
181 h = TAILQ_FIRST(&hn);
182 TAILQ_REMOVE(&hn, h, next);
183 imsg_add(buf, &h->ss, sizeof(h->ss));
184 free(h);
185 }
186 }
187
188 imsg_close(ibuf, buf);
189 break;
190 default:
191 break;
192 }
--- 6 unchanged lines hidden (view full) ---
199 else {
200 /* this pipe is dead, so remove the event handler */
201 event_del(&iev->ev);
202 event_loopexit(NULL);
203 }
204}
205
206int
207host_dns(const char *s, struct ypldap_addr_list *hn)
208{
209 struct addrinfo hints, *res0, *res;
210 int error, cnt = 0;
211 struct sockaddr_in *sa_in;
212 struct sockaddr_in6 *sa_in6;
213 struct ypldap_addr *h;
214
215 bzero(&hints, sizeof(hints));
216 hints.ai_family = PF_UNSPEC;
217 hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
218 error = getaddrinfo(s, NULL, &hints, &res0);
219 if (error == EAI_AGAIN || error == EAI_NONAME)
220 return (0);
221 if (error) {
--- 16 unchanged lines hidden (view full) ---
238 res->ai_addr)->sin_addr.s_addr;
239 } else {
240 sa_in6 = (struct sockaddr_in6 *)&h->ss;
241 sa_in6->sin6_len = sizeof(struct sockaddr_in6);
242 memcpy(&sa_in6->sin6_addr, &((struct sockaddr_in6 *)
243 res->ai_addr)->sin6_addr, sizeof(struct in6_addr));
244 }
245
246 TAILQ_INSERT_HEAD(hn, h, next);
247 cnt++;
248 }
249 freeaddrinfo(res0);
250 return (cnt);
251}
2/* $FreeBSD: head/usr.sbin/ypldap/ypldap_dns.c 297907 2016-04-13 03:36:34Z araujo $ */
3
4/*
5 * Copyright (c) 2003-2008 Henning Brauer <henning@openbsd.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
--- 32 unchanged lines hidden (view full) ---
43#include "ypldap.h"
44
45volatile sig_atomic_t quit_dns = 0;
46struct imsgev *iev_dns;
47
48void dns_dispatch_imsg(int, short, void *);
49void dns_sig_handler(int, short, void *);
50void dns_shutdown(void);
51int host_dns(const char *, struct ypldap_addr_list *);
52
53void
54dns_sig_handler(int sig, short event, void *p)
55{
56 switch (sig) {
57 case SIGINT:
58 case SIGTERM:
59 dns_shutdown();
--- 64 unchanged lines hidden (view full) ---
124}
125
126void
127dns_dispatch_imsg(int fd, short events, void *p)
128{
129 struct imsg imsg;
130 int n, cnt;
131 char *name;
132 struct ypldap_addr_list hn = TAILQ_HEAD_INITIALIZER(hn);
133 struct ypldap_addr *h;
134 struct ibuf *buf;
135 struct env *env = p;
136 struct imsgev *iev = env->sc_iev;
137 struct imsgbuf *ibuf = &iev->ibuf;
138 int shut = 0;
139
140 if ((events & (EV_READ | EV_WRITE)) == 0)
141 fatalx("unknown event");
--- 30 unchanged lines hidden (view full) ---
172 if ((cnt = host_dns(name, &hn)) == -1)
173 break;
174 buf = imsg_create(ibuf, IMSG_HOST_DNS,
175 imsg.hdr.peerid, 0,
176 cnt * sizeof(struct sockaddr_storage));
177 if (buf == NULL)
178 break;
179 if (cnt > 0) {
180 while(!TAILQ_EMPTY(&hn)) {
181 h = TAILQ_FIRST(&hn);
182 TAILQ_REMOVE(&hn, h, next);
183 imsg_add(buf, &h->ss, sizeof(h->ss));
184 free(h);
185 }
186 }
187
188 imsg_close(ibuf, buf);
189 break;
190 default:
191 break;
192 }
--- 6 unchanged lines hidden (view full) ---
199 else {
200 /* this pipe is dead, so remove the event handler */
201 event_del(&iev->ev);
202 event_loopexit(NULL);
203 }
204}
205
206int
207host_dns(const char *s, struct ypldap_addr_list *hn)
208{
209 struct addrinfo hints, *res0, *res;
210 int error, cnt = 0;
211 struct sockaddr_in *sa_in;
212 struct sockaddr_in6 *sa_in6;
213 struct ypldap_addr *h;
214
215 bzero(&hints, sizeof(hints));
216 hints.ai_family = PF_UNSPEC;
217 hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
218 error = getaddrinfo(s, NULL, &hints, &res0);
219 if (error == EAI_AGAIN || error == EAI_NONAME)
220 return (0);
221 if (error) {
--- 16 unchanged lines hidden (view full) ---
238 res->ai_addr)->sin_addr.s_addr;
239 } else {
240 sa_in6 = (struct sockaddr_in6 *)&h->ss;
241 sa_in6->sin6_len = sizeof(struct sockaddr_in6);
242 memcpy(&sa_in6->sin6_addr, &((struct sockaddr_in6 *)
243 res->ai_addr)->sin6_addr, sizeof(struct in6_addr));
244 }
245
246 TAILQ_INSERT_HEAD(hn, h, next);
247 cnt++;
248 }
249 freeaddrinfo(res0);
250 return (cnt);
251}