1 /* Copyright (c) 2006-2009 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
2 * Copyright (c) 2007 Albert Lee <trisk@acm.jhu.edu>.
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <arpa/inet.h>
18 #include <arpa/nameser.h>
19 #include <netinet/in.h>
21 #include <arpa/nameser8_compat.h>
25 #include <sys/types.h>
26 #include <sys/param.h>
40 /* daemon(3) exists only in 4.4BSD or later, and in GNU libc */
41 #if !(defined(BSD) && (BSD >= 199306)) && !defined(__GLIBC__)
42 static int daemon(int nochdir, int noclose)
64 if ((fd = open("/dev/null", O_RDWR)) >= 0) {
65 for (i = 0; i < 3; i++) {
77 #if defined(__BEOS__) && !defined(__HAIKU__)
78 int setgroups(int count, int *groups)
86 open_dns(int localport, in_addr_t listen_ip)
88 struct sockaddr_in addr;
92 memset(&addr, 0, sizeof(addr));
93 addr.sin_family = AF_INET;
94 addr.sin_port = htons(localport);
95 /* listen_ip already in network byte order from inet_addr, or 0 */
96 addr.sin_addr.s_addr = listen_ip;
98 if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
103 setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag));
105 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
107 /* To get destination address from each UDP datagram, see iodined.c:read_dns() */
108 setsockopt(fd, IPPROTO_IP, DSTADDR_SOCKOPT, &flag, sizeof(flag));
110 if(bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0)
113 printf("Opened UDP socket\n");
125 do_chroot(char *newroot)
127 #if !defined(__BEOS__) || defined(__HAIKU__)
128 if (chroot(newroot) != 0 || chdir("/") != 0)
129 err(1, "%s", newroot);
134 warnx("chroot not available");
141 printf("Detaching from terminal...\n");
148 read_password(char *buf, size_t len)
157 tp.c_lflag &= (~ECHO);
158 tcsetattr(0, TCSANOW, &tp);
160 printf("Enter password: ");
165 tcsetattr(0, TCSANOW, &old);
167 strncpy(buf, pwd, len);
172 check_topdomain(char *str)
176 if(str[0] == '.') /* special case */
179 for( i = 0; i < strlen(str); i++) {
180 if( isalpha(str[i]) || isdigit(str[i]) || str[i] == '-' || str[i] == '.' )