Changeset b4049f9 in code
- Timestamp:
- Mar 4, 2014, 10:34:57 AM (11 years ago)
- Branches:
- master
- Children:
- 5815eef
- Parents:
- fa271b8
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
dns.c
rfa271b8 rb4049f9 1 1 /* 2 * Copyright (c) 2013 Mike Belopuhov 2 3 * Copyright (c) 2009 Michael Shalayeff 3 4 * All rights reserved. … … 23 24 #include <errno.h> 24 25 #include <stdlib.h> 26 #include <string.h> 25 27 #include <unistd.h> 26 28 #include <syslog.h> … … 35 37 36 38 void dns_dispatch(int, short, void *); 39 void dns_done(int, short, void *); 37 40 int dns_pipe; 38 41 42 43 struct icbd_dnsquery { 44 uint64_t sid; 45 union { 46 struct sockaddr_storage req; 47 char rep[MAXHOSTNAMELEN]; 48 } u; 49 }; 50 39 51 int 40 icbd_dns_init(void)52 dns_init(void) 41 53 { 42 st ruct eventev;43 int pipe[2];44 struct passwd *pw;54 static struct event ev; 55 struct passwd *pw; 56 int pipes[2]; 45 57 46 if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe ) == -1) {58 if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipes) == -1) { 47 59 syslog(LOG_ERR, "socketpair: %m"); 48 60 exit(EX_OSERR); … … 57 69 58 70 default: 59 close(pipe[1]); 60 dns_pipe = pipe[0]; 71 close(pipes[1]); 72 dns_pipe = pipes[0]; 73 74 /* event for the reply */ 75 event_set(&ev, dns_pipe, EV_READ | EV_PERSIST, 76 dns_done, NULL); 77 if (event_add(&ev, NULL) < 0) { 78 syslog(LOG_ERR, "event_add: %m"); 79 exit (EX_UNAVAILABLE); 80 } 61 81 return (0); 62 82 } 63 83 64 84 setproctitle("dns resolver"); 65 close(pipe [0]);85 close(pipes[0]); 66 86 67 87 if ((pw = getpwnam(ICBD_USER)) == NULL) { … … 86 106 event_init(); 87 107 88 event_set(&ev, pipe[1], EV_READ | EV_PERSIST, dns_dispatch, NULL); 108 /* event for the request */ 109 event_set(&ev, pipes[1], EV_READ | EV_PERSIST, dns_dispatch, NULL); 89 110 if (event_add(&ev, NULL) < 0) { 90 111 syslog(LOG_ERR, "event_add: %m"); … … 96 117 97 118 void 98 dns_dispatch(int fd, short event, void *arg )119 dns_dispatch(int fd, short event, void *arg __attribute__((unused))) 99 120 { 100 121 char host[NI_MAXHOST]; 101 struct sockaddr _storage ss;102 struct sockaddr *sa = (struct sockaddr *)&ss;103 int gerr , ss_len = sizeof ss;122 struct sockaddr *sa; 123 struct icbd_dnsquery q; 124 int gerr; 104 125 105 126 arg = NULL; … … 107 128 return; 108 129 109 if (read(fd, & ss, ss_len) != ss_len) {130 if (read(fd, &q, sizeof q) != sizeof q) { 110 131 syslog(LOG_ERR, "dns read: %m"); 111 132 exit(1); 112 133 } 113 134 135 sa = (struct sockaddr *)&q.u.req; 114 136 if ((gerr = getnameinfo(sa, sa->sa_len, 115 137 host, sizeof host, NULL, 0, NI_NOFQDN))) { 116 138 syslog(LOG_ERR, "getnameinfo: %s", gai_strerror(gerr)); 117 write(fd, host, sizeof host);118 139 return; 119 140 } … … 122 143 syslog(LOG_DEBUG, "dns_dispatch: resolved %s", host); 123 144 124 if (write(fd, host, sizeof host) != sizeof host) 145 memcpy(&q.u.rep, host, sizeof host); 146 if (write(fd, &q, sizeof q) != sizeof q) 125 147 syslog(LOG_ERR, "dns write: %m"); 148 } 149 150 void 151 dns_done(int fd, short event, void *arg __attribute__((unused))) 152 { 153 struct icb_session *is; 154 struct icbd_dnsquery q; 155 156 if (event != EV_READ) 157 return; 158 159 if (read(fd, &q, sizeof q) != sizeof q) { 160 syslog(LOG_ERR, "read: %m"); 161 return; 162 } 163 164 if ((is = icbd_session_lookup(q.sid)) == NULL) { 165 syslog(LOG_ERR, "failed to find session %llu", q.sid); 166 return; 167 } 168 169 memcpy(is->host, q.u.rep, MAXHOSTNAMELEN); 170 is->host[sizeof is->host - 1] = '\0'; 171 172 if (verbose) 173 syslog(LOG_DEBUG, "icbd_dns: resolved %s", is->host); 126 174 } 127 175 … … 129 177 dns_rresolv(struct icb_session *is, struct sockaddr_storage *ss) 130 178 { 131 /* one-shot event for the reply */ 132 event_set(&is->ev, dns_pipe, EV_READ, icbd_dns, is); 133 if (event_add(&is->ev, NULL) < 0) { 134 syslog(LOG_ERR, "event_add: %m"); 135 exit (EX_UNAVAILABLE); 136 } 137 138 inet_ntop(ss->ss_family, ss->ss_family == AF_INET ? 139 (void *)&((struct sockaddr_in *)ss)->sin_addr : 140 (void *)&((struct sockaddr_in6 *)ss)->sin6_addr, 141 is->host, sizeof is->host); 179 struct icbd_dnsquery q; 142 180 143 181 if (verbose) 144 182 syslog(LOG_DEBUG, "resolving: %s", is->host); 145 183 146 if (write(dns_pipe, ss, sizeof *ss) != sizeof *ss) { 184 memset(&q, 0, sizeof q); 185 q.sid = is->id; 186 memcpy(&q.u.req, ss, sizeof *ss); 187 if (write(dns_pipe, &q, sizeof q) != sizeof q) { 147 188 syslog(LOG_ERR, "write: %m"); 148 189 exit (EX_OSERR); -
icbd.c
rfa271b8 rb4049f9 213 213 214 214 /* start a dns resolver thread */ 215 icbd_dns_init();215 dns_init(); 216 216 217 217 if (!foreground) … … 225 225 226 226 return (EX_UNAVAILABLE); 227 }228 229 void230 icbd_dns(int fd, short event, void *arg)231 {232 struct icb_session *is = arg;233 234 if (event != EV_READ)235 return;236 237 if (read(fd, is->host, sizeof is->host) < 0)238 syslog(LOG_ERR, "read: %m");239 240 is->host[sizeof is->host - 1] = '\0';241 242 if (verbose)243 syslog(LOG_DEBUG, "icbd_dns: resolved %s", is->host);244 227 } 245 228 … … 547 530 { 548 531 struct sockaddr_storage ss; 532 struct sockaddr_in *sin = (struct sockaddr_in *)&ss; 533 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss; 549 534 socklen_t ss_len = sizeof ss; 550 535 … … 557 542 switch (ss.ss_family) { 558 543 case AF_INET: 559 is->port = ntohs( ((struct sockaddr_in *)&ss)->sin_port);544 is->port = ntohs(sin->sin_port); 560 545 break; 561 546 562 547 case AF_INET6: 563 is->port = ntohs( ((struct sockaddr_in6 *)&ss)->sin6_port);548 is->port = ntohs(sin6->sin6_port); 564 549 break; 565 550 } 566 551 552 inet_ntop(ss.ss_family, ss.ss_family == AF_INET ? 553 (void *)&sin->sin_addr : (void *)&sin6->sin6_addr, 554 is->host, sizeof is->host); 555 567 556 dns_rresolv(is, &ss); 568 557 } -
icbd.h
rfa271b8 rb4049f9 29 29 /* dns.c */ 30 30 struct sockaddr_storage; 31 int icbd_dns_init(void); 32 void icbd_dns(int, short, void *); 31 int dns_init(void); 33 32 int dns_rresolv(struct icb_session *, struct sockaddr_storage *);
Note:
See TracChangeset
for help on using the changeset viewer.