Lines Matching +full:- +full:- +full:daemon
1 /* dnsmasq is Copyright (c) 2000-2009 Simon Kelley
52 if ((daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) != -1) { in netlink_init()
53 if (bind(daemon->netlinkfd, (struct sockaddr*) &addr, sizeof(addr)) == -1) { in netlink_init()
56 bind(daemon->netlinkfd, (struct sockaddr*) &addr, sizeof(addr)) == -1) in netlink_init()
57 daemon->netlinkfd = -1; in netlink_init()
61 if (daemon->netlinkfd == -1 || in netlink_init()
62 getsockname(daemon->netlinkfd, (struct sockaddr*) &addr, &slen) == 1) in netlink_init()
86 … while ((rc = recvmsg(daemon->netlinkfd, &msg, MSG_PEEK | MSG_TRUNC)) == -1 && errno == EINTR) in netlink_recv()
90 if (rc != -1 && (msg.msg_flags & MSG_TRUNC)) { in netlink_recv()
101 while ((rc = recvmsg(daemon->netlinkfd, &msg, 0)) == -1 && errno == EINTR) in netlink_recv()
105 if (rc == -1 || nladdr.nl_pid == 0) break; in netlink_recv()
110 rc = -1; in netlink_recv()
143 while ((len = sendto(daemon->netlinkfd, (void*) &req, sizeof(req), 0, (struct sockaddr*) &addr, in iface_enumerate()
144 sizeof(addr))) == -1 && in iface_enumerate()
148 if (len == -1) return 0; in iface_enumerate()
151 if ((len = netlink_recv()) == -1) { in iface_enumerate()
160 if (h->nlmsg_seq != seq || h->nlmsg_pid != netlink_pid) in iface_enumerate()
162 else if (h->nlmsg_type == NLMSG_ERROR) in iface_enumerate()
164 else if (h->nlmsg_type == NLMSG_DONE) { in iface_enumerate()
172 } else if (h->nlmsg_type == RTM_NEWADDR) { in iface_enumerate()
175 unsigned int len1 = h->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)); in iface_enumerate()
177 if (ifa->ifa_family == AF_INET) { in iface_enumerate()
180 netmask.s_addr = htonl(0xffffffff << (32 - ifa->ifa_prefixlen)); in iface_enumerate()
185 if (rta->rta_type == IFA_LOCAL) in iface_enumerate()
187 else if (rta->rta_type == IFA_BROADCAST) in iface_enumerate()
194 if (!((*ipv4_callback)(addr, ifa->ifa_index, netmask, broadcast, parm))) in iface_enumerate()
198 else if (ifa->ifa_family == AF_INET6) { in iface_enumerate()
201 if (rta->rta_type == IFA_ADDRESS) addrp = ((struct in6_addr*) (rta + 1)); in iface_enumerate()
207 if (!((*ipv6_callback)(addrp, ifa->ifa_index, ifa->ifa_index, parm))) in iface_enumerate()
221 if ((flags = fcntl(daemon->netlinkfd, F_GETFL)) == -1 || in netlink_multicast()
222 fcntl(daemon->netlinkfd, F_SETFL, flags | O_NONBLOCK) == -1) in netlink_multicast()
225 if ((len = netlink_recv()) != -1) { in netlink_multicast()
227 if (h->nlmsg_type == NLMSG_ERROR) in netlink_multicast()
233 /* restore non-blocking status */ in netlink_multicast()
234 fcntl(daemon->netlinkfd, F_SETFL, flags); in netlink_multicast()
240 if (err->error != 0) in nl_err()
241 my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error))); in nl_err()
245 If this happens and we still have a DNS packet in the buffer, we re-send it.
247 a DNS query, which then gets lost. By re-sending, we can avoid the lookup
250 if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE) { in nl_routechange()
254 if (rtm->rtm_type != RTN_UNICAST || rtm->rtm_scope != RT_SCOPE_LINK) return; in nl_routechange()
256 /* Force re-reading resolv file right now, for luck. */ in nl_routechange()
257 daemon->last_resolv = 0; in nl_routechange()
259 if (daemon->srv_save) { in nl_routechange()
260 if (daemon->srv_save->sfd) in nl_routechange()
261 fd = daemon->srv_save->sfd->fd; in nl_routechange()
262 else if (daemon->rfd_save && daemon->rfd_save->refcount != 0) in nl_routechange()
263 fd = daemon->rfd_save->fd; in nl_routechange()
267 while (sendto(fd, daemon->packet, daemon->packet_len, 0, &daemon->srv_save->addr.sa, in nl_routechange()
268 sa_len(&daemon->srv_save->addr)) == -1 && in nl_routechange()