remove redundant code from old ant build format (not in gradle modules)
This commit is contained in:
parent
18682e4b97
commit
54b3349344
|
@ -1,22 +0,0 @@
|
||||||
obfs3 83.212.101.3:80 A09D536DD1752D542E1FBB3C9CE4449D51298239
|
|
||||||
obfs3 169.229.59.74:31493 AF9F66B7B04F8FF6F32D455F05135250A16543C9
|
|
||||||
obfs3 169.229.59.75:46328 AF9F66B7B04F8FF6F32D455F05135250A16543C9
|
|
||||||
obfs3 109.105.109.163:38980 1E05F577A0EC0213F971D81BF4D86A9E4E8229ED
|
|
||||||
obfs3 109.105.109.163:47779 4C331FA9B3D1D6D8FB0D8FBBF0C259C360D97E6A
|
|
||||||
scramblesuit 83.212.101.3:443 A09D536DD1752D542E1FBB3C9CE4449D51298239 password=XTCXLG2JAMJKZW2POLBAOWOQETQSMASH
|
|
||||||
obfs4 198.245.60.50:443 752CF7825B3B9EA6A98C83AC41F7099D67007EA5 cert=xpmQtKUqQ/6v5X7ijgYE/f03+l2/EuQ1dexjyUhh16wQlu/cpXUGalmhDIlhuiQPNEKmKw iat-mode=0
|
|
||||||
obfs4 109.105.109.165:10527 8DFCD8FB3285E855F5A55EDDA35696C743ABFC4E cert=Bvg/itxeL4TWKLP6N1MaQzSOC6tcRIBv6q57DYAZc3b2AzuM+/TfB7mqTFEfXILCjEwzVA iat-mode=0
|
|
||||||
obfs4 83.212.101.3:41213 A09D536DD1752D542E1FBB3C9CE4449D51298239 cert=lPRQ/MXdD1t5SRZ9MquYQNT9m5DV757jtdXdlePmRCudUU9CFUOX1Tm7/meFSyPOsud7Cw iat-mode=0
|
|
||||||
obfs4 104.131.108.182:56880 EF577C30B9F788B0E1801CF7E433B3B77792B77A cert=0SFhfDQrKjUJP8Qq6wrwSICEPf3Vl/nJRsYxWbg3QRoSqhl2EB78MPS2lQxbXY4EW1wwXA iat-mode=0
|
|
||||||
obfs4 109.105.109.147:13764 BBB28DF0F201E706BE564EFE690FE9577DD8386D cert=KfMQN/tNMFdda61hMgpiMI7pbwU1T+wxjTulYnfw+4sgvG0zSH7N7fwT10BI8MUdAD7iJA iat-mode=0
|
|
||||||
obfs4 154.35.22.10:41835 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0
|
|
||||||
obfs4 154.35.22.11:49868 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0
|
|
||||||
obfs4 154.35.22.12:80 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0
|
|
||||||
obfs4 154.35.22.13:443 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0
|
|
||||||
obfs4 154.35.22.10:1984 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0
|
|
||||||
obfs4 154.35.22.11:1984 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0
|
|
||||||
obfs4 154.35.22.12:1984 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0
|
|
||||||
obfs4 154.35.22.13:1984 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0
|
|
||||||
meek 0.0.2.0:1 46D4A71197B8FA515A826C6B017C522FE264655B url=https://meek-reflect.appspot.com/ front=www.google.com
|
|
||||||
meek 0.0.2.0:2 B9E7141C594AF25699E0079C1F0146F409495296 url=https://d2zfqthxsdq309.cloudfront.net/ front=a0.awsstatic.com
|
|
||||||
meek 0.0.2.0:3 A2C13B7DFCAB1CBF3A884B6EB99A98067AB6EF44 url=https://az786092.vo.msecnd.net/ front=ajax.aspnetcdn.com
|
|
145
jni/Android.mk
145
jni/Android.mk
|
@ -1,145 +0,0 @@
|
||||||
# Copyright (C) 2009 The Android Open Source Project
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
ROOT_PATH := $(LOCAL_PATH)
|
|
||||||
EXTERN_PATH := $(LOCAL_PATH)/../external
|
|
||||||
|
|
||||||
########################################################
|
|
||||||
## pdnsd library
|
|
||||||
########################################################
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
PDNSD_SOURCES := $(wildcard $(LOCAL_PATH)/pdnsd/src/*.c)
|
|
||||||
|
|
||||||
LOCAL_MODULE := pdnsd
|
|
||||||
LOCAL_SRC_FILES := $(PDNSD_SOURCES:$(LOCAL_PATH)/%=%)
|
|
||||||
LOCAL_CFLAGS := -Wall -O2 -I$(LOCAL_PATH)/pdnsd -DHAVE_STPCPY
|
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
|
||||||
|
|
||||||
########################################################
|
|
||||||
## libancillary
|
|
||||||
########################################################
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
ANCILLARY_SOURCE := fd_recv.c fd_send.c
|
|
||||||
|
|
||||||
LOCAL_MODULE := libancillary
|
|
||||||
LOCAL_CFLAGS := -O2 -I$(LOCAL_PATH)/libancillary
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(addprefix libancillary/, $(ANCILLARY_SOURCE))
|
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
|
|
||||||
########################################################
|
|
||||||
## tun2socks
|
|
||||||
########################################################
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_CFLAGS := -std=gnu99
|
|
||||||
LOCAL_CFLAGS += -DBADVPN_THREADWORK_USE_PTHREAD -DBADVPN_LINUX -DBADVPN_BREACTOR_BADVPN -D_GNU_SOURCE
|
|
||||||
LOCAL_CFLAGS += -DBADVPN_USE_SELFPIPE -DBADVPN_USE_EPOLL
|
|
||||||
LOCAL_CFLAGS += -DBADVPN_LITTLE_ENDIAN -DBADVPN_THREAD_SAFE
|
|
||||||
LOCAL_CFLAGS += -DNDEBUG -DANDROID
|
|
||||||
LOCAL_CFLAGS += -DTUN2SOCKS_JNI
|
|
||||||
LOCAL_CFLAGS += -DPSIPHON
|
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := libancillary
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES:= \
|
|
||||||
$(LOCAL_PATH)/libancillary \
|
|
||||||
$(EXTERN_PATH)/badvpn/ \
|
|
||||||
$(EXTERN_PATH)/badvpn/lwip/src/include/ipv4 \
|
|
||||||
$(EXTERN_PATH)/badvpn/lwip/src/include/ipv6 \
|
|
||||||
$(EXTERN_PATH)/badvpn/lwip/src/include \
|
|
||||||
$(EXTERN_PATH)/badvpn/lwip/custom \
|
|
||||||
|
|
||||||
TUN2SOCKS_SOURCES := \
|
|
||||||
base/BLog_syslog.c \
|
|
||||||
system/BReactor_badvpn.c \
|
|
||||||
system/BSignal.c \
|
|
||||||
system/BConnection_unix.c \
|
|
||||||
system/BTime.c \
|
|
||||||
system/BUnixSignal.c \
|
|
||||||
system/BNetwork.c \
|
|
||||||
flow/StreamRecvInterface.c \
|
|
||||||
flow/PacketRecvInterface.c \
|
|
||||||
flow/PacketPassInterface.c \
|
|
||||||
flow/StreamPassInterface.c \
|
|
||||||
flow/SinglePacketBuffer.c \
|
|
||||||
flow/BufferWriter.c \
|
|
||||||
flow/PacketBuffer.c \
|
|
||||||
flow/PacketStreamSender.c \
|
|
||||||
flow/PacketPassConnector.c \
|
|
||||||
flow/PacketProtoFlow.c \
|
|
||||||
flow/PacketPassFairQueue.c \
|
|
||||||
flow/PacketProtoEncoder.c \
|
|
||||||
flow/PacketProtoDecoder.c \
|
|
||||||
socksclient/BSocksClient.c \
|
|
||||||
tuntap/BTap.c \
|
|
||||||
lwip/src/core/timers.c \
|
|
||||||
lwip/src/core/udp.c \
|
|
||||||
lwip/src/core/memp.c \
|
|
||||||
lwip/src/core/init.c \
|
|
||||||
lwip/src/core/pbuf.c \
|
|
||||||
lwip/src/core/tcp.c \
|
|
||||||
lwip/src/core/tcp_out.c \
|
|
||||||
lwip/src/core/netif.c \
|
|
||||||
lwip/src/core/def.c \
|
|
||||||
lwip/src/core/mem.c \
|
|
||||||
lwip/src/core/tcp_in.c \
|
|
||||||
lwip/src/core/stats.c \
|
|
||||||
lwip/src/core/inet_chksum.c \
|
|
||||||
lwip/src/core/ipv4/icmp.c \
|
|
||||||
lwip/src/core/ipv4/igmp.c \
|
|
||||||
lwip/src/core/ipv4/ip4_addr.c \
|
|
||||||
lwip/src/core/ipv4/ip_frag.c \
|
|
||||||
lwip/src/core/ipv4/ip4.c \
|
|
||||||
lwip/src/core/ipv4/autoip.c \
|
|
||||||
lwip/src/core/ipv6/ethip6.c \
|
|
||||||
lwip/src/core/ipv6/inet6.c \
|
|
||||||
lwip/src/core/ipv6/ip6_addr.c \
|
|
||||||
lwip/src/core/ipv6/mld6.c \
|
|
||||||
lwip/src/core/ipv6/dhcp6.c \
|
|
||||||
lwip/src/core/ipv6/icmp6.c \
|
|
||||||
lwip/src/core/ipv6/ip6.c \
|
|
||||||
lwip/src/core/ipv6/ip6_frag.c \
|
|
||||||
lwip/src/core/ipv6/nd6.c \
|
|
||||||
lwip/custom/sys.c \
|
|
||||||
tun2socks/tun2socks.c \
|
|
||||||
base/DebugObject.c \
|
|
||||||
base/BLog.c \
|
|
||||||
base/BPending.c \
|
|
||||||
system/BDatagram_unix.c \
|
|
||||||
flowextra/PacketPassInactivityMonitor.c \
|
|
||||||
tun2socks/SocksUdpGwClient.c \
|
|
||||||
udpgw_client/UdpGwClient.c
|
|
||||||
|
|
||||||
LOCAL_MODULE := tun2socks
|
|
||||||
|
|
||||||
LOCAL_LDLIBS := -ldl -llog
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(addprefix ../external/badvpn/, $(TUN2SOCKS_SOURCES))
|
|
||||||
|
|
||||||
##include $(BUILD_EXECUTABLE)
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
# Import cpufeatures
|
|
||||||
$(call import-module,android/cpufeatures)
|
|
|
@ -1,4 +0,0 @@
|
||||||
APP_ABI := armeabi x86
|
|
||||||
APP_PLATFORM := android-16
|
|
||||||
APP_STL := stlport_static
|
|
||||||
NDK_TOOLCHAIN_VERSION := 4.8
|
|
|
@ -1,139 +0,0 @@
|
||||||
This library provide an easy interface to the black magic that can be done
|
|
||||||
on Unix domain sockets, like passing file descriptors from one process to
|
|
||||||
another.
|
|
||||||
|
|
||||||
Programs that uses this library should include the ancillary.h header file.
|
|
||||||
Nothing else is required.
|
|
||||||
|
|
||||||
All functions of this library require the following header:
|
|
||||||
|
|
||||||
#include <ancillary.h>
|
|
||||||
|
|
||||||
At this time, the only ancillary data defined by the Single Unix
|
|
||||||
Specification (v3) is file descriptors.
|
|
||||||
|
|
||||||
Passing file descriptors
|
|
||||||
|
|
||||||
int ancil_send_fd(socket, file_descriptor)
|
|
||||||
int socket: the Unix socket
|
|
||||||
int file_descriptor: the file descriptor
|
|
||||||
Return value: 0 for success, -1 for failure.
|
|
||||||
|
|
||||||
Sends one file descriptor on a socket.
|
|
||||||
In case of failure, errno is set; the possible values are the ones of the
|
|
||||||
sendmsg(2) system call.
|
|
||||||
|
|
||||||
|
|
||||||
int ancil_recv_fd(socket, file_descriptor)
|
|
||||||
int socket: the Unix socket
|
|
||||||
int *file_descriptor: pointer to the returned file descriptor
|
|
||||||
Return value: 0 for success, -1 for failure
|
|
||||||
|
|
||||||
Receives one file descriptor from a socket.
|
|
||||||
In case of success, the file descriptor is stored in the integer pointed
|
|
||||||
to by file_descriptor.
|
|
||||||
In case of failure, errno is set; the possible values are the ones of the
|
|
||||||
recvmsg(2) system call.
|
|
||||||
The behavior is undefined if the recv_fd does not match a send_fd* on the
|
|
||||||
other side.
|
|
||||||
|
|
||||||
|
|
||||||
int ancil_send_fds(socket, file_descriptors, num_file_descriptors)
|
|
||||||
int socket: the Unix socket
|
|
||||||
const int *file_descriptors: array of file descriptors
|
|
||||||
unsigned num_file_descriptors: number of file descriptors
|
|
||||||
Return value: 0 for success, -1 for failure
|
|
||||||
|
|
||||||
Sends several file descriptors on a socket.
|
|
||||||
In case of failure, errno is set; the possible values are the ones of the
|
|
||||||
sendmsg(2) system call.
|
|
||||||
The maximum number of file descriptors that can be sent using this
|
|
||||||
function is ANCIL_MAX_N_FDS; the behavior is undefined in case of
|
|
||||||
overflow, probably a stack corruption.
|
|
||||||
|
|
||||||
|
|
||||||
int ancil_recv_fds(socket, file_descriptors, num_file_descriptors)
|
|
||||||
int socket: the Unix socket
|
|
||||||
int *file_descriptors: return array of file descriptors
|
|
||||||
unsigned num_file_descriptors: number of file descriptors
|
|
||||||
Return value: number of received fd for success, -1 for failure
|
|
||||||
|
|
||||||
Receives several file descriptors from a socket, no more than
|
|
||||||
num_file_descriptors.
|
|
||||||
In case of success, the received file descriptors are stored in the array
|
|
||||||
pointed to by file_descriptors.
|
|
||||||
In case of failure, errno is set; the possible values are the ones of the
|
|
||||||
recvmsg(2) system call.
|
|
||||||
The maximum number of file descriptors that can be received using this
|
|
||||||
function is ANCIL_MAX_N_FDS; the behavior is undefined in case of
|
|
||||||
overflow, probably a stack corruption.
|
|
||||||
The behavior is undefined if the recv_fds does not match a send_fd* on
|
|
||||||
the other side, or if the number of received file descriptors is more than
|
|
||||||
num_file_descriptors.
|
|
||||||
|
|
||||||
|
|
||||||
int ancil_send_fds_with_buffer(socket, fds, num, buffer)
|
|
||||||
int socket: the Unix socket
|
|
||||||
const int *fds: array of file descriptors
|
|
||||||
unsigned num: number of file descriptors
|
|
||||||
void *buffer: buffer to hold the system data structures
|
|
||||||
Return value: 0 for success, -1 for failure
|
|
||||||
|
|
||||||
Sends several file descriptors on a socket.
|
|
||||||
In case of failure, errno is set; the possible values are the ones of the
|
|
||||||
sendmsg(2) system call.
|
|
||||||
The buffer argument must point to a memory area large enough to hold the
|
|
||||||
system data structures, see ANCIL_FD_BUFFER.
|
|
||||||
|
|
||||||
|
|
||||||
int ancil_send_fds_with_buffer(socket, fds, num, buffer)
|
|
||||||
int socket: the Unix socket
|
|
||||||
int *fds: return array of file descriptors
|
|
||||||
unsigned num: number of file descriptors
|
|
||||||
void *buffer: buffer to hold the system data structures
|
|
||||||
Return value: number of received fd for success, -1 for failure
|
|
||||||
|
|
||||||
Receives several file descriptors from a socket, no more than
|
|
||||||
num_file_descriptors.
|
|
||||||
In case of success, the received file descriptors are stored in the array
|
|
||||||
pointed to by file_descriptors.
|
|
||||||
In case of failure, errno is set; the possible values are the ones of the
|
|
||||||
recvmsg(2) system call.
|
|
||||||
The behavior is undefined if the recv_fds does not match a send_fd* on
|
|
||||||
the other side, or if the number of received file descriptors is more than
|
|
||||||
num_file_descriptors.
|
|
||||||
The buffer argument must point to a memory area large enough to hold the
|
|
||||||
system data structures, see ANCIL_FD_BUFFER.
|
|
||||||
|
|
||||||
|
|
||||||
ANCIL_MAX_N_FDS
|
|
||||||
|
|
||||||
Maximum number of file descriptors that can be sent with the sent_fds and
|
|
||||||
recv_fds functions. If you have to send more at once, use the
|
|
||||||
*_with_buffer versions. The value is enough to send "quite a few" file
|
|
||||||
descriptors.
|
|
||||||
|
|
||||||
|
|
||||||
ANCIL_FD_BUFFER(n)
|
|
||||||
int n: number of file descriptors
|
|
||||||
|
|
||||||
Expands to a structure data type large enough to hold the system data
|
|
||||||
structures for n file descriptors. So the address of a variable declared
|
|
||||||
of type ANCIL_FD_BUFFER(n) is suitable as the buffer argument for
|
|
||||||
*_with_buffer on n file descriptors.
|
|
||||||
To use this macro, you need <sys/types.h> and <sys/socket.h>. Bevare: with
|
|
||||||
Solaris, the _XPG4_2 macro must be defined before sys/socket is included.
|
|
||||||
|
|
||||||
|
|
||||||
Tuning the compilation
|
|
||||||
|
|
||||||
This library is designed to be included in projects, not installed in
|
|
||||||
/usr/lib. If your project does not use some of the functions, the
|
|
||||||
TUNE_OPTS variable in the Makefile allows not to build them. It is a list
|
|
||||||
of proprocessor options:
|
|
||||||
|
|
||||||
-DNDEBUG: turn assertions off (see assert(3))
|
|
||||||
-DSPARE_SEND_FDS: do not build ancil_send_fds
|
|
||||||
-DSPARE_SEND_FD: do not build ancil_send_fd
|
|
||||||
-DSPARE_RECV_FDS: do not build ancil_recv_fds
|
|
||||||
-DSPARE_RECV_FD: do not build ancil_recv_fd
|
|
|
@ -1,21 +0,0 @@
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1,73 +0,0 @@
|
||||||
###########################################################################
|
|
||||||
# libancillary - black magic on Unix domain sockets
|
|
||||||
# (C) Nicolas George
|
|
||||||
# Makefile - guess what
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
# 3. The name of the author may not be used to endorse or promote products
|
|
||||||
# derived from this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
CC=gcc
|
|
||||||
CFLAGS=-Wall -g -O2
|
|
||||||
LDFLAGS=
|
|
||||||
LIBS=
|
|
||||||
AR=ar
|
|
||||||
RANLIB=ranlib
|
|
||||||
RM=rm
|
|
||||||
CP=cp
|
|
||||||
MKDIR=mkdir
|
|
||||||
TAR=tar
|
|
||||||
GZIP=gzip -9
|
|
||||||
|
|
||||||
NAME=libancillary
|
|
||||||
DISTRIBUTION=API COPYING Makefile ancillary.h fd_send.c fd_recv.c test.c
|
|
||||||
VERSION=0.9.1
|
|
||||||
|
|
||||||
OBJECTS=fd_send.o fd_recv.o
|
|
||||||
|
|
||||||
TUNE_OPTS=-DNDEBUG
|
|
||||||
#TUNE_OPTS=-DNDEBUG \
|
|
||||||
-DSPARE_SEND_FDS -DSPARE_SEND_FD -DSPARE_RECV_FDS -DSPARE_RECV_FD
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
$(CC) -c $(CFLAGS) $(TUNE_OPTS) $<
|
|
||||||
|
|
||||||
all: libancillary.a
|
|
||||||
|
|
||||||
libancillary.a: $(OBJECTS)
|
|
||||||
$(AR) cr $@ $(OBJECTS)
|
|
||||||
$(RANLIB) $@
|
|
||||||
|
|
||||||
fd_send.o: ancillary.h
|
|
||||||
fd_recv.o: ancillary.h
|
|
||||||
|
|
||||||
test: test.c libancillary.a
|
|
||||||
$(CC) -o $@ $(CFLAGS) $(LDFLAGS) -L. test.c -lancillary $(LIBS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-$(RM) -f *.o *.a test
|
|
||||||
|
|
||||||
dist:
|
|
||||||
$(MKDIR) $(NAME)-$(VERSION)
|
|
||||||
$(CP) $(DISTRIBUTION) $(NAME)-$(VERSION)
|
|
||||||
$(TAR) -cf - $(NAME)-$(VERSION) | $(GZIP) > $(NAME)-$(VERSION).tar.gz
|
|
||||||
$(RM) -rf $(NAME)-$(VERSION)
|
|
|
@ -1,131 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* libancillary - black magic on Unix domain sockets
|
|
||||||
* (C) Nicolas George
|
|
||||||
* ancillary.c - public header
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ANCILLARY_H__
|
|
||||||
#define ANCILLARY_H__
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
* Start of the readable part.
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#define ANCIL_MAX_N_FDS 960
|
|
||||||
/*
|
|
||||||
* Maximum number of fds that can be sent or received using the "esay"
|
|
||||||
* functions; this is so that all can fit in one page.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int
|
|
||||||
ancil_send_fds_with_buffer(int, const int *, unsigned, void *);
|
|
||||||
/*
|
|
||||||
* ancil_send_fds_with_buffer(sock, n_fds, fds, buffer)
|
|
||||||
*
|
|
||||||
* Sends the file descriptors in the array pointed by fds, of length n_fds
|
|
||||||
* on the socket sock.
|
|
||||||
* buffer is a writeable memory area large enough to hold the required data
|
|
||||||
* structures.
|
|
||||||
* Returns: -1 and errno in case of error, 0 in case of success.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int
|
|
||||||
ancil_recv_fds_with_buffer(int, int *, unsigned, void *);
|
|
||||||
/*
|
|
||||||
* ancil_recv_fds_with_buffer(sock, n_fds, fds, buffer)
|
|
||||||
*
|
|
||||||
* Receives *n_fds file descriptors into the array pointed by fds
|
|
||||||
* from the socket sock.
|
|
||||||
* buffer is a writeable memory area large enough to hold the required data
|
|
||||||
* structures.
|
|
||||||
* Returns: -1 and errno in case of error, the actual number of received fd
|
|
||||||
* in case of success
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ANCIL_FD_BUFFER(n) \
|
|
||||||
struct { \
|
|
||||||
struct cmsghdr h; \
|
|
||||||
int fd[n]; \
|
|
||||||
}
|
|
||||||
/* ANCIL_FD_BUFFER(n)
|
|
||||||
*
|
|
||||||
* A structure type suitable to be used as buffer for n file descriptors.
|
|
||||||
* Requires <sys/socket.h>.
|
|
||||||
* Example:
|
|
||||||
* ANCIL_FD_BUFFER(42) buffer;
|
|
||||||
* ancil_recv_fds_with_buffer(sock, 42, my_fds, &buffer);
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int
|
|
||||||
ancil_send_fds(int, const int *, unsigned);
|
|
||||||
/*
|
|
||||||
* ancil_send_fds(sock, n_fds, fds)
|
|
||||||
*
|
|
||||||
* Sends the file descriptors in the array pointed by fds, of length n_fds
|
|
||||||
* on the socket sock.
|
|
||||||
* n_fds must not be greater than ANCIL_MAX_N_FDS.
|
|
||||||
* Returns: -1 and errno in case of error, 0 in case of success.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int
|
|
||||||
ancil_recv_fds(int, int *, unsigned);
|
|
||||||
/*
|
|
||||||
* ancil_recv_fds(sock, n_fds, fds)
|
|
||||||
*
|
|
||||||
* Receives *n_fds file descriptors into the array pointed by fds
|
|
||||||
* from the socket sock.
|
|
||||||
* *n_fds must not be greater than ANCIL_MAX_N_FDS.
|
|
||||||
* Returns: -1 and errno in case of error, the actual number of received fd
|
|
||||||
* in case of success.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
ancil_send_fd(int, int);
|
|
||||||
/* ancil_recv_fd(sock, fd);
|
|
||||||
*
|
|
||||||
* Sends the file descriptor fd on the socket sock.
|
|
||||||
* Returns : -1 and errno in case of error, 0 in case of success.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int
|
|
||||||
ancil_recv_fd(int, int *);
|
|
||||||
/* ancil_send_fd(sock, &fd);
|
|
||||||
*
|
|
||||||
* Receives the file descriptor fd from the socket sock.
|
|
||||||
* Returns : -1 and errno in case of error, 0 in case of success.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ANCILLARY_H__ */
|
|
|
@ -1,98 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* libancillary - black magic on Unix domain sockets
|
|
||||||
* (C) Nicolas George
|
|
||||||
* fd_send.c - receiving file descriptors
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _XPG4_2 /* Solaris sucks */
|
|
||||||
# define _XPG4_2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#if defined(__FreeBSD__)
|
|
||||||
# include <sys/param.h> /* FreeBSD sucks */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ancillary.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
ancil_recv_fds_with_buffer(int sock, int *fds, unsigned n_fds, void *buffer)
|
|
||||||
{
|
|
||||||
struct msghdr msghdr;
|
|
||||||
char nothing;
|
|
||||||
struct iovec nothing_ptr;
|
|
||||||
struct cmsghdr *cmsg;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
nothing_ptr.iov_base = ¬hing;
|
|
||||||
nothing_ptr.iov_len = 1;
|
|
||||||
msghdr.msg_name = NULL;
|
|
||||||
msghdr.msg_namelen = 0;
|
|
||||||
msghdr.msg_iov = ¬hing_ptr;
|
|
||||||
msghdr.msg_iovlen = 1;
|
|
||||||
msghdr.msg_flags = 0;
|
|
||||||
msghdr.msg_control = buffer;
|
|
||||||
msghdr.msg_controllen = sizeof(struct cmsghdr) + sizeof(int) * n_fds;
|
|
||||||
cmsg = CMSG_FIRSTHDR(&msghdr);
|
|
||||||
cmsg->cmsg_len = msghdr.msg_controllen;
|
|
||||||
cmsg->cmsg_level = SOL_SOCKET;
|
|
||||||
cmsg->cmsg_type = SCM_RIGHTS;
|
|
||||||
for(i = 0; i < n_fds; i++)
|
|
||||||
((int *)CMSG_DATA(cmsg))[i] = -1;
|
|
||||||
|
|
||||||
if(recvmsg(sock, &msghdr, 0) < 0)
|
|
||||||
return(-1);
|
|
||||||
for(i = 0; i < n_fds; i++)
|
|
||||||
fds[i] = ((int *)CMSG_DATA(cmsg))[i];
|
|
||||||
n_fds = (msghdr.msg_controllen - sizeof(struct cmsghdr)) / sizeof(int);
|
|
||||||
return(n_fds);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SPARE_RECV_FDS
|
|
||||||
int
|
|
||||||
ancil_recv_fds(int sock, int *fd, unsigned n_fds)
|
|
||||||
{
|
|
||||||
ANCIL_FD_BUFFER(ANCIL_MAX_N_FDS) buffer;
|
|
||||||
|
|
||||||
assert(n_fds <= ANCIL_MAX_N_FDS);
|
|
||||||
return(ancil_recv_fds_with_buffer(sock, fd, n_fds, &buffer));
|
|
||||||
}
|
|
||||||
#endif /* SPARE_RECV_FDS */
|
|
||||||
|
|
||||||
#ifndef SPARE_RECV_FD
|
|
||||||
int
|
|
||||||
ancil_recv_fd(int sock, int *fd)
|
|
||||||
{
|
|
||||||
ANCIL_FD_BUFFER(1) buffer;
|
|
||||||
|
|
||||||
return(ancil_recv_fds_with_buffer(sock, fd, 1, &buffer) == 1 ? 0 : -1);
|
|
||||||
}
|
|
||||||
#endif /* SPARE_RECV_FD */
|
|
|
@ -1,92 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* libancillary - black magic on Unix domain sockets
|
|
||||||
* (C) Nicolas George
|
|
||||||
* fd_send.c - sending file descriptors
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _XPG4_2 /* Solaris sucks */
|
|
||||||
# define _XPG4_2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#if defined(__FreeBSD__)
|
|
||||||
# include <sys/param.h> /* FreeBSD sucks */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ancillary.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
ancil_send_fds_with_buffer(int sock, const int *fds, unsigned n_fds, void *buffer)
|
|
||||||
{
|
|
||||||
struct msghdr msghdr;
|
|
||||||
char nothing = '!';
|
|
||||||
struct iovec nothing_ptr;
|
|
||||||
struct cmsghdr *cmsg;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
nothing_ptr.iov_base = ¬hing;
|
|
||||||
nothing_ptr.iov_len = 1;
|
|
||||||
msghdr.msg_name = NULL;
|
|
||||||
msghdr.msg_namelen = 0;
|
|
||||||
msghdr.msg_iov = ¬hing_ptr;
|
|
||||||
msghdr.msg_iovlen = 1;
|
|
||||||
msghdr.msg_flags = 0;
|
|
||||||
msghdr.msg_control = buffer;
|
|
||||||
msghdr.msg_controllen = sizeof(struct cmsghdr) + sizeof(int) * n_fds;
|
|
||||||
cmsg = CMSG_FIRSTHDR(&msghdr);
|
|
||||||
cmsg->cmsg_len = msghdr.msg_controllen;
|
|
||||||
cmsg->cmsg_level = SOL_SOCKET;
|
|
||||||
cmsg->cmsg_type = SCM_RIGHTS;
|
|
||||||
for(i = 0; i < n_fds; i++)
|
|
||||||
((int *)CMSG_DATA(cmsg))[i] = fds[i];
|
|
||||||
return(sendmsg(sock, &msghdr, 0) >= 0 ? 0 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef SPARE_SEND_FDS
|
|
||||||
int
|
|
||||||
ancil_send_fds(int sock, const int *fds, unsigned n_fds)
|
|
||||||
{
|
|
||||||
ANCIL_FD_BUFFER(ANCIL_MAX_N_FDS) buffer;
|
|
||||||
|
|
||||||
assert(n_fds <= ANCIL_MAX_N_FDS);
|
|
||||||
return(ancil_send_fds_with_buffer(sock, fds, n_fds, &buffer));
|
|
||||||
}
|
|
||||||
#endif /* SPARE_SEND_FDS */
|
|
||||||
|
|
||||||
#ifndef SPARE_SEND_FD
|
|
||||||
int
|
|
||||||
ancil_send_fd(int sock, int fd)
|
|
||||||
{
|
|
||||||
ANCIL_FD_BUFFER(1) buffer;
|
|
||||||
|
|
||||||
return(ancil_send_fds_with_buffer(sock, &fd, 1, &buffer));
|
|
||||||
}
|
|
||||||
#endif /* SPARE_SEND_FD */
|
|
|
@ -1,112 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* libancillary - black magic on Unix domain sockets
|
|
||||||
* (C) Nicolas George
|
|
||||||
* test.c - testing and example program
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include "ancillary.h"
|
|
||||||
|
|
||||||
void child_process(int sock)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
int fds[3], nfds;
|
|
||||||
char b[] = "This is on the received fd!\n";
|
|
||||||
|
|
||||||
if(ancil_recv_fd(sock, &fd)) {
|
|
||||||
perror("ancil_recv_fd");
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
printf("Received fd: %d\n", fd);
|
|
||||||
}
|
|
||||||
write(fd, b, sizeof(b));
|
|
||||||
close(fd);
|
|
||||||
sleep(2);
|
|
||||||
|
|
||||||
nfds = ancil_recv_fds(sock, fds, 3);
|
|
||||||
if(nfds < 0) {
|
|
||||||
perror("ancil_recv_fds");
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
printf("Received %d/3 fds : %d %d %d.\n", nfds,
|
|
||||||
fds[0], fds[1], fds[2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void parent_process(int sock)
|
|
||||||
{
|
|
||||||
int fds[2] = { 1, 2 };
|
|
||||||
|
|
||||||
if(ancil_send_fd(sock, 1)) {
|
|
||||||
perror("ancil_send_fd");
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
printf("Sent fd.\n");
|
|
||||||
}
|
|
||||||
sleep(1);
|
|
||||||
|
|
||||||
if(ancil_send_fds(sock, fds, 2)) {
|
|
||||||
perror("ancil_send_fds");
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
printf("Sent two fds.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int sock[2];
|
|
||||||
|
|
||||||
if(socketpair(PF_UNIX, SOCK_STREAM, 0, sock)) {
|
|
||||||
perror("socketpair");
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
printf("Established socket pair: (%d, %d)\n", sock[0], sock[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(fork()) {
|
|
||||||
case 0:
|
|
||||||
close(sock[0]);
|
|
||||||
child_process(sock[1]);
|
|
||||||
break;
|
|
||||||
case -1:
|
|
||||||
perror("fork");
|
|
||||||
exit(1);
|
|
||||||
default:
|
|
||||||
close(sock[1]);
|
|
||||||
parent_process(sock[0]);
|
|
||||||
wait(NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
Most of pdnsd was written by Thomas Moestl (tmoestl@gmx.net).
|
|
||||||
In the "par" versions large parts of the code have been revised
|
|
||||||
and several features have been added by Paul Rombouts.
|
|
||||||
|
|
||||||
Small parts of this program are based on code that was taken from nmap (IP
|
|
||||||
checksumming), the isdn4k-utils (ippp interface uptest), glibc 2.1.2 (some
|
|
||||||
definitions for kernel 2.2.x missing in 2.0 glibcs) and FreeBSD
|
|
||||||
(SIZEOF_ADDR_IFREQ in netdev.c).
|
|
||||||
nmap was written by Fyodor. The insd4k-utils were written by Fritz Elfert and
|
|
||||||
others. The GNU C library (glibc) is copyright by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
The following people have contributed code:
|
|
||||||
Andrew M. Bishop contributed support for server labels
|
|
||||||
Carsten Block contributed 'configure'-able rc scripts
|
|
||||||
Stephan Boettcher contributed the SCHEME= option.
|
|
||||||
P.J. Bostley contributed patches to get pdnsd working on
|
|
||||||
alpha
|
|
||||||
Frank Elsner contributed rc script fixes
|
|
||||||
Christian Engstler contributed patches for SuSE compatability
|
|
||||||
Bjoern Fischer contributed code to make pdnsd leave the case of names
|
|
||||||
in the cache unchanged
|
|
||||||
Torben Janssen contributed RedHat rc scripts
|
|
||||||
Olaf Kirch contributed a security fix for the run_as()
|
|
||||||
function
|
|
||||||
Bernd Leibing contributed fixes to the spec file.
|
|
||||||
Sourav K. Mandal contributed the autoconf/automake code, gdbm
|
|
||||||
caching facility and many suggestions
|
|
||||||
Markus Mohr contributed Debian rc scripts
|
|
||||||
Alexandre Nunes contributed autoconf fixes
|
|
||||||
Wolfgang Ocker contributed the server_ip option
|
|
||||||
Soenke J. Peters contributed patches and suggestions for RedHat
|
|
||||||
compatability
|
|
||||||
Roman Shterenzon contributed many helpful hints and patches for
|
|
||||||
FreeBSD compatability.
|
|
||||||
Andreas Steinmetz contributed the code for the query_port_start and
|
|
||||||
query_port_end options (which I changed slightly,
|
|
||||||
so blame any breakage on me ;)
|
|
||||||
Marko Stolle contributed the contrib/pdnsd_update.pl script that
|
|
||||||
makes pdnsd usable in a DHCP setup.
|
|
||||||
Lyonel Vincent extended the serve_aliases option to support an
|
|
||||||
arbitrary number of aliases
|
|
||||||
Paul Wagland contributed a patches for bind9-compatability
|
|
||||||
and for some memory leaks on error paths.
|
|
||||||
Sverker Wiberg contributed IPv6 build fixes
|
|
||||||
Michael Wiedmann contributed the pdnsd-ctl.8 man page.
|
|
||||||
Ron Yorston contributed the dev-uptest for Linux ppp dial-
|
|
||||||
on-demand devices
|
|
||||||
Nikita V. Youshchenko contributed extensions to the "if" uptest
|
|
||||||
Mahesh T. Pai contributed the pdnsd.8 man page.
|
|
||||||
Nikola Kotur contributed the Slackware start-up script.
|
|
||||||
Kiyo Kelvin Lee contributed a patch for Cygwin support.
|
|
||||||
Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support.
|
|
||||||
Jan-Marek Glogowski contributed a patch implementing the "use_nss" option.
|
|
||||||
|
|
||||||
Please look into the THANKS file for people who helped me in various ways on
|
|
||||||
this project.
|
|
||||||
If this list is incomplete, pease drop me a mail!
|
|
|
@ -1,674 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
|
@ -1,26 +0,0 @@
|
||||||
A small part of the pdnsd source is licensed under the following BSD-style
|
|
||||||
license:
|
|
||||||
|
|
||||||
Copyright (C) 2001 Thomas Moestl
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
||||||
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3304
jni/pdnsd/ChangeLog
3304
jni/pdnsd/ChangeLog
File diff suppressed because it is too large
Load Diff
|
@ -1,161 +0,0 @@
|
||||||
2000-02-15
|
|
||||||
Version 0.2. First working alpha with the extended feature set.
|
|
||||||
|
|
||||||
2000-02-16
|
|
||||||
Version 0.3 with many bugfixes, better standard conformity and
|
|
||||||
some new features.
|
|
||||||
|
|
||||||
2000-02-17
|
|
||||||
Did a lint on the code, implemented soft timeouts, again bugfixes,
|
|
||||||
drastically reduced cache memory requirements, implemented local
|
|
||||||
records.
|
|
||||||
Version 0.4 released.
|
|
||||||
|
|
||||||
2000-02-19
|
|
||||||
Recursive query finally implemented. Version 0.5 out.
|
|
||||||
|
|
||||||
2000-02-20
|
|
||||||
Various bugfixes. The server now always tries to get an AA answer
|
|
||||||
if possible; this implies recursion. This is to deal better with
|
|
||||||
caching servers that may return incomplete results on * queries.
|
|
||||||
This may be a little sub-optimal since it may not take the full
|
|
||||||
effect of caching, but it is the only real possibility of getting
|
|
||||||
complete records.
|
|
||||||
Redid the deps in the makefile for now.
|
|
||||||
Version is now 0.6.
|
|
||||||
|
|
||||||
2000-02-21
|
|
||||||
Another set of bugfixes. Version is 0.6.1.
|
|
||||||
|
|
||||||
2000-02-22
|
|
||||||
Another set of bugfixes. It should stabilize by now. Answer compression
|
|
||||||
is there finally. Version is therefore up again, 0.7 by now.
|
|
||||||
|
|
||||||
2000-02-23
|
|
||||||
Minor bugfixes, isdn interface uptest added. The new record types as of
|
|
||||||
rfc1700 are implemented, but as a compile-time option, since normally
|
|
||||||
there is no need to waste space for them.
|
|
||||||
Version is 0.7.1.
|
|
||||||
|
|
||||||
2000-02-24
|
|
||||||
Version 0.7.2 with all rrs up to KX (36). #define DNS_NEW_RRS in
|
|
||||||
config.h and (re)compile if you want to use them. Delete the cache
|
|
||||||
file before using a version with this option changed!
|
|
||||||
NSAP-PTR does NOT WORK (any incoming answer containing it may cause
|
|
||||||
a format error) because it is ill-designed (see TODO). Never mind, it
|
|
||||||
is officially deprecated anyway.
|
|
||||||
The secure DNS extension record types defined in RFC 2065 (KEY, SIG,
|
|
||||||
NXT) are cached only and therefore useless.
|
|
||||||
|
|
||||||
2000-02-26
|
|
||||||
Version 0.8 with parallel query (and probably new bugs) introduced.
|
|
||||||
|
|
||||||
2000-02-27
|
|
||||||
Version 0.8.1 with minor bugfixes on the new features.
|
|
||||||
|
|
||||||
2000-02-27
|
|
||||||
Version 0.8.5 with authority support and the usual bugifxes. Some issues
|
|
||||||
with standard conformity were also fixed (wow, two versions a day).
|
|
||||||
|
|
||||||
2000-02-28
|
|
||||||
Implemented caching of non-authoritative records. This allows better
|
|
||||||
usage of other caching name servers. This may return non-authoritative
|
|
||||||
records to any non-wildcard query. If a wildcard query arrives, we
|
|
||||||
always look for authoritative records, so we do if the non-authoritative
|
|
||||||
answer does not contain at least one answering record to the query.
|
|
||||||
This fixes the sub-optimal behaviour since 0.6.
|
|
||||||
Version is therefore up to 0.8.7 (0.8.6 was also released today
|
|
||||||
containing bugfixes)
|
|
||||||
|
|
||||||
2000-02-29
|
|
||||||
Better thread support, avoiding deadlocks in signal handling. The cost
|
|
||||||
is unfortunately one more thread.
|
|
||||||
New option server_port in config file.
|
|
||||||
Version is 0.8.8.
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
Nailed a renitent memory leak bug to the wall (shame, what a trivial
|
|
||||||
mistake). Also improved handling of error conditions slightly.
|
|
||||||
Version is 0.8.9.
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
Cache code cleanup. The development of the non-parallel query code
|
|
||||||
is discontinued, although it still works. If you want serial query,
|
|
||||||
just set PAR_QUERIES to 1.
|
|
||||||
Additional information finally implemented.
|
|
||||||
We are up to 0.9.
|
|
||||||
|
|
||||||
2000-03-02
|
|
||||||
Fixed a DoS possibility.
|
|
||||||
More rfc compatability fixups and a smarter resolver logic.
|
|
||||||
Version 0.9.1
|
|
||||||
|
|
||||||
2000-03-02
|
|
||||||
Added the source section to the config file handling. This allows to
|
|
||||||
source your /etc/hosts file. Version 0.9.2.
|
|
||||||
|
|
||||||
2000-03-02
|
|
||||||
Avoiding double additional records now. Version 0.9.3.
|
|
||||||
|
|
||||||
2000-03-09
|
|
||||||
Fixed some REALLY STUPID bugs. Uuummph, thought it was finished.
|
|
||||||
However, the number of bugs remaining is always n+1...
|
|
||||||
Anyway, we are up to 0.9.4. Hope that there are no mean bugs left.
|
|
||||||
|
|
||||||
2000-03-14
|
|
||||||
Added another uptest, exec. See README for details. Also grained the
|
|
||||||
cache size finer (it's now specified in kB). Version 0.9.5
|
|
||||||
|
|
||||||
2000-04-07
|
|
||||||
Fixed some really stupid bugs, what else? Version is 0.9.6
|
|
||||||
To be more exact: fixed misc bugs, cleaned up hash.c and cache.c
|
|
||||||
|
|
||||||
2000-04-20
|
|
||||||
Again fixed some bugs, version is now 0.9.7.
|
|
||||||
|
|
||||||
2000-04-29
|
|
||||||
Fixed a build problem caused by some missing #defines in glibc2.0 and a
|
|
||||||
minor bug.
|
|
||||||
Version is up to 0.9.8
|
|
||||||
|
|
||||||
2000-04-30
|
|
||||||
Fixed some unclean C code and did a general C lint. Thanks to Byrial
|
|
||||||
Jensen for pointing out some issues. Now using stricter compiler flags.
|
|
||||||
Also replaced the daemon() call in main.c for improved portability.
|
|
||||||
Pre-Released 0.9.9p1
|
|
||||||
|
|
||||||
2000-05-03
|
|
||||||
Released 0.9.9p2 with the changes of 0.9.9p1, Documentation updates,
|
|
||||||
bugfixes, and the Red Hat rc scripts contributed by Torben Janssen.
|
|
||||||
Also, the meaning of the command line option -v has changed.
|
|
||||||
There is a new config file option "lean_query" that is on by
|
|
||||||
default. It is an optimization, so please look in the docs when
|
|
||||||
updating whether you want it switched on or not.
|
|
||||||
Removed the long-dead serial query code from the distribution tree.
|
|
||||||
Some resolvers seem to be broken somehow in a respect that it cares
|
|
||||||
about order in which the records appear. In particular, it wants
|
|
||||||
cname to appear before other records. Ok, so it be...
|
|
||||||
|
|
||||||
|
|
||||||
2000-05-04
|
|
||||||
Save all names in lower case in the rrs.
|
|
||||||
Tidying up the source tree.
|
|
||||||
The long-awaited cache structure changes have been started. Please
|
|
||||||
delete you cache files before using this new release.
|
|
||||||
|
|
||||||
2000-05-05
|
|
||||||
Fixed several bugs in the old and in the new source tree.
|
|
||||||
Use time_t instead of long for internal time storage for compatibility.
|
|
||||||
|
|
||||||
|
|
||||||
2000-05-06
|
|
||||||
Version 0.9.10.
|
|
||||||
This fixes a bug in uptest=if. Red Hat and configuration fixes
|
|
||||||
suggested by Soeren J. Peters were included.
|
|
||||||
|
|
||||||
2000-05-08
|
|
||||||
Version 0.9.11
|
|
||||||
This fixes a locally exploitable security problem (pdnsd.cache was
|
|
||||||
world-writeable). This is actually a one-line fix; for a description of
|
|
||||||
possible dangers, please refer to the html documentation.
|
|
||||||
Thanks to Alan Swanson for reporting.
|
|
|
@ -1,190 +0,0 @@
|
||||||
The installation instructions are in doc/html/doc.html and doc/txt/manual.txt.
|
|
||||||
The system requirements are listed in doc/html/index.html and doc/txt/intro.txt.
|
|
||||||
I recommend using the html version.
|
|
||||||
Following are generic installation instructions for autoconf programs.
|
|
||||||
I strongly recommend to read the Installation section in the docs!
|
|
||||||
|
|
||||||
|
|
||||||
Basic Installation
|
|
||||||
==================
|
|
||||||
|
|
||||||
These are generic installation instructions.
|
|
||||||
|
|
||||||
The `configure' shell script attempts to guess correct values for
|
|
||||||
various system-dependent variables used during compilation. It uses
|
|
||||||
those values to create a `Makefile' in each directory of the package.
|
|
||||||
It may also create one or more `.h' files containing system-dependent
|
|
||||||
definitions. Finally, it creates a shell script `config.status' that
|
|
||||||
you can run in the future to recreate the current configuration, a file
|
|
||||||
`config.cache' that saves the results of its tests to speed up
|
|
||||||
reconfiguring, and a file `config.log' containing compiler output
|
|
||||||
(useful mainly for debugging `configure').
|
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
|
||||||
to figure out how `configure' could check whether to do them, and mail
|
|
||||||
diffs or instructions to the address given in the `README' so they can
|
|
||||||
be considered for the next release. If at some point `config.cache'
|
|
||||||
contains results you don't want to keep, you may remove or edit it.
|
|
||||||
|
|
||||||
The file `configure.in' is used to create `configure' by a program
|
|
||||||
called `autoconf'. You only need `configure.in' if you want to change
|
|
||||||
it or regenerate `configure' using a newer version of `autoconf'.
|
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
|
||||||
|
|
||||||
1. `cd' to the directory containing the package's source code and type
|
|
||||||
`./configure' to configure the package for your system. If you're
|
|
||||||
using `csh' on an old version of System V, you might need to type
|
|
||||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
|
||||||
`configure' itself.
|
|
||||||
|
|
||||||
Running `configure' takes awhile. While running, it prints some
|
|
||||||
messages telling which features it is checking for.
|
|
||||||
|
|
||||||
2. Type `make' to compile the package.
|
|
||||||
|
|
||||||
3. Optionally, type `make check' to run any self-tests that come with
|
|
||||||
the package.
|
|
||||||
|
|
||||||
4. Type `make install' to install the programs and any data files and
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
5. You can remove the program binaries and object files from the
|
|
||||||
source code directory by typing `make clean'. To also remove the
|
|
||||||
files that `configure' created (so you can compile the package for
|
|
||||||
a different kind of computer), type `make distclean'. There is
|
|
||||||
also a `make maintainer-clean' target, but that is intended mainly
|
|
||||||
for the package's developers. If you use it, you may have to get
|
|
||||||
all sorts of other programs in order to regenerate files that came
|
|
||||||
with the distribution.
|
|
||||||
|
|
||||||
Compilers and Options
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
|
||||||
the `configure' script does not know about. You can give `configure'
|
|
||||||
initial values for variables by setting them in the environment. Using
|
|
||||||
a Bourne-compatible shell, you can do that on the command line like
|
|
||||||
this:
|
|
||||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
|
||||||
|
|
||||||
Or on systems that have the `env' program, you can do it like this:
|
|
||||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
|
||||||
|
|
||||||
Compiling For Multiple Architectures
|
|
||||||
====================================
|
|
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the
|
|
||||||
same time, by placing the object files for each architecture in their
|
|
||||||
own directory. To do this, you must use a version of `make' that
|
|
||||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
|
||||||
directory where you want the object files and executables to go and run
|
|
||||||
the `configure' script. `configure' automatically checks for the
|
|
||||||
source code in the directory that `configure' is in and in `..'.
|
|
||||||
|
|
||||||
If you have to use a `make' that does not supports the `VPATH'
|
|
||||||
variable, you have to compile the package for one architecture at a time
|
|
||||||
in the source code directory. After you have installed the package for
|
|
||||||
one architecture, use `make distclean' before reconfiguring for another
|
|
||||||
architecture.
|
|
||||||
|
|
||||||
Installation Names
|
|
||||||
==================
|
|
||||||
|
|
||||||
By default, `make install' will install the package's files in
|
|
||||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
|
||||||
installation prefix other than `/usr/local' by giving `configure' the
|
|
||||||
option `--prefix=PATH'.
|
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
|
||||||
architecture-specific files and architecture-independent files. If you
|
|
||||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
|
||||||
PATH as the prefix for installing programs and libraries.
|
|
||||||
Documentation and other data files will still use the regular prefix.
|
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
|
||||||
options like `--bindir=PATH' to specify different values for particular
|
|
||||||
kinds of files. Run `configure --help' for a list of the directories
|
|
||||||
you can set and what kinds of files go in them.
|
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
|
||||||
with an extra prefix or suffix on their names by giving `configure' the
|
|
||||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
|
||||||
|
|
||||||
Optional Features
|
|
||||||
=================
|
|
||||||
|
|
||||||
Some packages pay attention to `--enable-FEATURE' options to
|
|
||||||
`configure', where FEATURE indicates an optional part of the package.
|
|
||||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
|
||||||
is something like `gnu-as' or `x' (for the X Window System). The
|
|
||||||
`README' should mention any `--enable-' and `--with-' options that the
|
|
||||||
package recognizes.
|
|
||||||
|
|
||||||
For packages that use the X Window System, `configure' can usually
|
|
||||||
find the X include and library files automatically, but if it doesn't,
|
|
||||||
you can use the `configure' options `--x-includes=DIR' and
|
|
||||||
`--x-libraries=DIR' to specify their locations.
|
|
||||||
|
|
||||||
Specifying the System Type
|
|
||||||
==========================
|
|
||||||
|
|
||||||
There may be some features `configure' can not figure out
|
|
||||||
automatically, but needs to determine by the type of host the package
|
|
||||||
will run on. Usually `configure' can figure that out, but if it prints
|
|
||||||
a message saying it can not guess the host type, give it the
|
|
||||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
|
||||||
type, such as `sun4', or a canonical name with three fields:
|
|
||||||
CPU-COMPANY-SYSTEM
|
|
||||||
|
|
||||||
See the file `config.sub' for the possible values of each field. If
|
|
||||||
`config.sub' isn't included in this package, then this package doesn't
|
|
||||||
need to know the host type.
|
|
||||||
|
|
||||||
If you are building compiler tools for cross-compiling, you can also
|
|
||||||
use the `--target=TYPE' option to select the type of system they will
|
|
||||||
produce code for and the `--build=TYPE' option to select the type of
|
|
||||||
system on which you are compiling the package.
|
|
||||||
|
|
||||||
Sharing Defaults
|
|
||||||
================
|
|
||||||
|
|
||||||
If you want to set default values for `configure' scripts to share,
|
|
||||||
you can create a site shell script called `config.site' that gives
|
|
||||||
default values for variables like `CC', `cache_file', and `prefix'.
|
|
||||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
|
||||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
|
||||||
`CONFIG_SITE' environment variable to the location of the site script.
|
|
||||||
A warning: not all `configure' scripts look for a site script.
|
|
||||||
|
|
||||||
Operation Controls
|
|
||||||
==================
|
|
||||||
|
|
||||||
`configure' recognizes the following options to control how it
|
|
||||||
operates.
|
|
||||||
|
|
||||||
`--cache-file=FILE'
|
|
||||||
Use and save the results of the tests in FILE instead of
|
|
||||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
|
||||||
debugging `configure'.
|
|
||||||
|
|
||||||
`--help'
|
|
||||||
Print a summary of the options to `configure', and exit.
|
|
||||||
|
|
||||||
`--quiet'
|
|
||||||
`--silent'
|
|
||||||
`-q'
|
|
||||||
Do not print messages saying which checks are being made. To
|
|
||||||
suppress all normal output, redirect it to `/dev/null' (any error
|
|
||||||
messages will still be shown).
|
|
||||||
|
|
||||||
`--srcdir=DIR'
|
|
||||||
Look for the package's source code in directory DIR. Usually
|
|
||||||
`configure' can determine that directory automatically.
|
|
||||||
|
|
||||||
`--version'
|
|
||||||
Print the version of Autoconf used to generate the `configure'
|
|
||||||
script, and exit.
|
|
||||||
|
|
||||||
`configure' also accepts some other, not widely useful, options.
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
|
|
||||||
SUBDIRS = src doc contrib
|
|
||||||
|
|
||||||
EXTRA_DIST = version ChangeLog.old COPYING.BSD README.par README.par.old PKGBUILD
|
|
||||||
|
|
||||||
# The sample configuration is handled in doc/Makefile.am
|
|
||||||
install-data-hook:
|
|
||||||
$(mkinstalldirs) "$(DESTDIR)$(cachedir)"
|
|
||||||
test -f "$(DESTDIR)$(cachedir)/pdnsd.cache" || \
|
|
||||||
touch "$(DESTDIR)$(cachedir)/pdnsd.cache"
|
|
||||||
if test `whoami` = "root"; then \
|
|
||||||
chown $(def_id) "$(DESTDIR)$(cachedir)/pdnsd.cache"; \
|
|
||||||
chown $(def_id) "$(DESTDIR)$(cachedir)"; \
|
|
||||||
fi
|
|
||||||
chmod 0640 "$(DESTDIR)$(cachedir)/pdnsd.cache"
|
|
||||||
chmod 0750 "$(DESTDIR)$(cachedir)"
|
|
||||||
|
|
||||||
dist-hook: $(PACKAGE).spec.in
|
|
||||||
sed -e '/^%{!?distro: %define distro /c\
|
|
||||||
%if 0%{!?distro:1}\
|
|
||||||
%if "%{_vendor}" == "redhat"\
|
|
||||||
%define distro RedHat\
|
|
||||||
%else\
|
|
||||||
%if "%{_vendor}" == "suse"\
|
|
||||||
%define distro SuSE\
|
|
||||||
%else\
|
|
||||||
%if "%{_vendor}" == "SuSE"\
|
|
||||||
%define distro SuSE\
|
|
||||||
%endif\
|
|
||||||
%endif\
|
|
||||||
%endif\
|
|
||||||
%endif' \
|
|
||||||
-e 's:[@]PACKAGE[@]:$(PACKAGE):g' \
|
|
||||||
-e 's:[@]VERSION[@]:$(VERSION):g' \
|
|
||||||
-e 's:[@]fullversion[@]:$(fullversion):g' \
|
|
||||||
-e 's:[@]packagerelease[@]:$(packagerelease):g' \
|
|
||||||
-e 's:[@]cachedir[@]:/var/cache/$(PACKAGE):g' \
|
|
||||||
-e 's:[@]def_id[@]:$(PACKAGE):g' \
|
|
||||||
$(PACKAGE).spec.in > $(distdir)/$(PACKAGE).spec
|
|
||||||
|
|
|
@ -1,734 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
subdir = .
|
|
||||||
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
|
|
||||||
$(srcdir)/Makefile.in $(srcdir)/PKGBUILD.in \
|
|
||||||
$(srcdir)/config.h.in $(srcdir)/file-list.base.in \
|
|
||||||
$(srcdir)/pdnsd.spec.in $(top_srcdir)/configure AUTHORS \
|
|
||||||
COPYING ChangeLog INSTALL NEWS THANKS TODO acconfig.h compile \
|
|
||||||
depcomp install-sh missing
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
|
||||||
configure.lineno config.status.lineno
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = config.h
|
|
||||||
CONFIG_CLEAN_FILES = pdnsd.spec file-list.base PKGBUILD
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
|
||||||
html-recursive info-recursive install-data-recursive \
|
|
||||||
install-dvi-recursive install-exec-recursive \
|
|
||||||
install-html-recursive install-info-recursive \
|
|
||||||
install-pdf-recursive install-ps-recursive install-recursive \
|
|
||||||
installcheck-recursive installdirs-recursive pdf-recursive \
|
|
||||||
ps-recursive uninstall-recursive
|
|
||||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
|
||||||
distclean-recursive maintainer-clean-recursive
|
|
||||||
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
|
||||||
distdir dist dist-all distcheck
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
distdir = $(PACKAGE)-$(VERSION)
|
|
||||||
top_distdir = $(distdir)
|
|
||||||
am__remove_distdir = \
|
|
||||||
{ test ! -d "$(distdir)" \
|
|
||||||
|| { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
|
||||||
&& rm -fr "$(distdir)"; }; }
|
|
||||||
am__relativize = \
|
|
||||||
dir0=`pwd`; \
|
|
||||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
|
||||||
sed_rest='s,^[^/]*/*,,'; \
|
|
||||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
|
||||||
sed_butlast='s,/*[^/]*$$,,'; \
|
|
||||||
while test -n "$$dir1"; do \
|
|
||||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first" != "."; then \
|
|
||||||
if test "$$first" = ".."; then \
|
|
||||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
|
||||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
|
||||||
else \
|
|
||||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first2" = "$$first"; then \
|
|
||||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
|
||||||
else \
|
|
||||||
dir2="../$$dir2"; \
|
|
||||||
fi; \
|
|
||||||
dir0="$$dir0"/"$$first"; \
|
|
||||||
fi; \
|
|
||||||
fi; \
|
|
||||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
|
||||||
done; \
|
|
||||||
reldir="$$dir2"
|
|
||||||
DIST_ARCHIVES = $(distdir).tar.gz
|
|
||||||
GZIP_ENV = --best
|
|
||||||
distuninstallcheck_listfiles = find . -type f -print
|
|
||||||
distcleancheck_listfiles = find . -type f -print
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
ALLOCA = @ALLOCA@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
cachedir = @cachedir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
def_id = @def_id@
|
|
||||||
distribution = @distribution@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
fullversion = @fullversion@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
packagerelease = @packagerelease@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
specbuild = @specbuild@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
thread_CFLAGS = @thread_CFLAGS@
|
|
||||||
threadlib = @threadlib@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
SUBDIRS = src doc contrib
|
|
||||||
EXTRA_DIST = version ChangeLog.old COPYING.BSD README.par README.par.old PKGBUILD
|
|
||||||
all: config.h
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
am--refresh:
|
|
||||||
@:
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
|
|
||||||
$(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
|
|
||||||
&& exit 0; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
echo ' $(SHELL) ./config.status'; \
|
|
||||||
$(SHELL) ./config.status;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
$(SHELL) ./config.status --recheck
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
|
|
||||||
config.h: stamp-h1
|
|
||||||
@if test ! -f $@; then \
|
|
||||||
rm -f stamp-h1; \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
|
|
||||||
else :; fi
|
|
||||||
|
|
||||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
|
||||||
@rm -f stamp-h1
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
|
||||||
$(srcdir)/config.h.in: $(am__configure_deps) $(top_srcdir)/acconfig.h
|
|
||||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
|
||||||
rm -f stamp-h1
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
distclean-hdr:
|
|
||||||
-rm -f config.h stamp-h1
|
|
||||||
pdnsd.spec: $(top_builddir)/config.status $(srcdir)/pdnsd.spec.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
|
||||||
file-list.base: $(top_builddir)/config.status $(srcdir)/file-list.base.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
|
||||||
PKGBUILD: $(top_builddir)/config.status $(srcdir)/PKGBUILD.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
|
||||||
|
|
||||||
# This directory's subdirectories are mostly independent; you can cd
|
|
||||||
# into them and run `make' without going through this Makefile.
|
|
||||||
# To change the values of `make' variables: instead of editing Makefiles,
|
|
||||||
# (1) if the variable is set in `config.status', edit `config.status'
|
|
||||||
# (which will cause the Makefiles to be regenerated when you run `make');
|
|
||||||
# (2) otherwise, pass the desired values on the `make' command line.
|
|
||||||
$(RECURSIVE_TARGETS):
|
|
||||||
@fail= failcom='exit 1'; \
|
|
||||||
for f in x $$MAKEFLAGS; do \
|
|
||||||
case $$f in \
|
|
||||||
*=* | --[!k]*);; \
|
|
||||||
*k*) failcom='fail=yes';; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
dot_seen=no; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
dot_seen=yes; \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done; \
|
|
||||||
if test "$$dot_seen" = "no"; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
|
||||||
fi; test -z "$$fail"
|
|
||||||
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS):
|
|
||||||
@fail= failcom='exit 1'; \
|
|
||||||
for f in x $$MAKEFLAGS; do \
|
|
||||||
case $$f in \
|
|
||||||
*=* | --[!k]*);; \
|
|
||||||
*k*) failcom='fail=yes';; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
dot_seen=no; \
|
|
||||||
case "$@" in \
|
|
||||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
|
||||||
*) list='$(SUBDIRS)' ;; \
|
|
||||||
esac; \
|
|
||||||
rev=''; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = "."; then :; else \
|
|
||||||
rev="$$subdir $$rev"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
rev="$$rev ."; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
for subdir in $$rev; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done && test -z "$$fail"
|
|
||||||
tags-recursive:
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
|
||||||
done
|
|
||||||
ctags-recursive:
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
|
||||||
done
|
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
mkid -fID $$unique
|
|
||||||
tags: TAGS
|
|
||||||
|
|
||||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
|
||||||
include_option=--etags-include; \
|
|
||||||
empty_fix=.; \
|
|
||||||
else \
|
|
||||||
include_option=--include; \
|
|
||||||
empty_fix=; \
|
|
||||||
fi; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test ! -f $$subdir/TAGS || \
|
|
||||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
$(am__remove_distdir)
|
|
||||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test -d "$(distdir)/$$subdir" \
|
|
||||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_distdir=$$reldir; \
|
|
||||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_top_distdir=$$reldir; \
|
|
||||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
|
||||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
|
||||||
($(am__cd) $$subdir && \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="$$new_top_distdir" \
|
|
||||||
distdir="$$new_distdir" \
|
|
||||||
am__remove_distdir=: \
|
|
||||||
am__skip_length_check=: \
|
|
||||||
am__skip_mode_fix=: \
|
|
||||||
distdir) \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
|
||||||
dist-hook
|
|
||||||
-test -n "$(am__skip_mode_fix)" \
|
|
||||||
|| find "$(distdir)" -type d ! -perm -755 \
|
|
||||||
-exec chmod u+rwx,go+rx {} \; -o \
|
|
||||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
|
||||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
|
||||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
|
||||||
|| chmod -R a+r "$(distdir)"
|
|
||||||
dist-gzip: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist-bzip2: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist-lzma: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist-xz: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist-tarZ: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist-shar: distdir
|
|
||||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist-zip: distdir
|
|
||||||
-rm -f $(distdir).zip
|
|
||||||
zip -rq $(distdir).zip $(distdir)
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
dist dist-all: distdir
|
|
||||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
|
||||||
$(am__remove_distdir)
|
|
||||||
|
|
||||||
# This target untars the dist file and tries a VPATH configuration. Then
|
|
||||||
# it guarantees that the distribution is self-contained by making another
|
|
||||||
# tarfile.
|
|
||||||
distcheck: dist
|
|
||||||
case '$(DIST_ARCHIVES)' in \
|
|
||||||
*.tar.gz*) \
|
|
||||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
|
||||||
*.tar.bz2*) \
|
|
||||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
|
||||||
*.tar.lzma*) \
|
|
||||||
lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
|
|
||||||
*.tar.xz*) \
|
|
||||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
|
||||||
*.tar.Z*) \
|
|
||||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
|
||||||
*.shar.gz*) \
|
|
||||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
|
||||||
*.zip*) \
|
|
||||||
unzip $(distdir).zip ;;\
|
|
||||||
esac
|
|
||||||
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
|
||||||
mkdir $(distdir)/_build
|
|
||||||
mkdir $(distdir)/_inst
|
|
||||||
chmod a-w $(distdir)
|
|
||||||
test -d $(distdir)/_build || exit 0; \
|
|
||||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
|
||||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
|
||||||
&& am__cwd=`pwd` \
|
|
||||||
&& $(am__cd) $(distdir)/_build \
|
|
||||||
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
|
||||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
|
||||||
distuninstallcheck \
|
|
||||||
&& chmod -R a-w "$$dc_install_base" \
|
|
||||||
&& ({ \
|
|
||||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
|
||||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
|
||||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
|
||||||
&& rm -rf "$$dc_destdir" \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
|
||||||
&& rm -rf $(DIST_ARCHIVES) \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
|
||||||
&& cd "$$am__cwd" \
|
|
||||||
|| exit 1
|
|
||||||
$(am__remove_distdir)
|
|
||||||
@(echo "$(distdir) archives ready for distribution: "; \
|
|
||||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
|
||||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
|
||||||
distuninstallcheck:
|
|
||||||
@$(am__cd) '$(distuninstallcheck_dir)' \
|
|
||||||
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|
|
||||||
|| { echo "ERROR: files left after uninstall:" ; \
|
|
||||||
if test -n "$(DESTDIR)"; then \
|
|
||||||
echo " (check DESTDIR support)"; \
|
|
||||||
fi ; \
|
|
||||||
$(distuninstallcheck_listfiles) ; \
|
|
||||||
exit 1; } >&2
|
|
||||||
distcleancheck: distclean
|
|
||||||
@if test '$(srcdir)' = . ; then \
|
|
||||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
|
||||||
exit 1 ; \
|
|
||||||
fi
|
|
||||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
|
||||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
|
||||||
$(distcleancheck_listfiles) ; \
|
|
||||||
exit 1; } >&2
|
|
||||||
check-am: all-am
|
|
||||||
check: check-recursive
|
|
||||||
all-am: Makefile config.h
|
|
||||||
installdirs: installdirs-recursive
|
|
||||||
installdirs-am:
|
|
||||||
install: install-recursive
|
|
||||||
install-exec: install-exec-recursive
|
|
||||||
install-data: install-data-recursive
|
|
||||||
uninstall: uninstall-recursive
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-recursive
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-recursive
|
|
||||||
|
|
||||||
clean-am: clean-generic mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-recursive
|
|
||||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-recursive
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-recursive
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-recursive
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) install-data-hook
|
|
||||||
install-dvi: install-dvi-recursive
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-recursive
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-recursive
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-recursive
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-recursive
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-recursive
|
|
||||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
|
||||||
-rm -rf $(top_srcdir)/autom4te.cache
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-recursive
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-recursive
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-recursive
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am:
|
|
||||||
|
|
||||||
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
|
|
||||||
ctags-recursive install-am install-data-am install-strip \
|
|
||||||
tags-recursive
|
|
||||||
|
|
||||||
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
|
||||||
all all-am am--refresh check check-am clean clean-generic \
|
|
||||||
ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
|
|
||||||
dist-hook dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
|
|
||||||
distcheck distclean distclean-generic distclean-hdr \
|
|
||||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
|
||||||
dvi-am html html-am info info-am install install-am \
|
|
||||||
install-data install-data-am install-data-hook install-dvi \
|
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
|
||||||
install-html-am install-info install-info-am install-man \
|
|
||||||
install-pdf install-pdf-am install-ps install-ps-am \
|
|
||||||
install-strip installcheck installcheck-am installdirs \
|
|
||||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
|
||||||
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
|
|
||||||
tags-recursive uninstall uninstall-am
|
|
||||||
|
|
||||||
|
|
||||||
# The sample configuration is handled in doc/Makefile.am
|
|
||||||
install-data-hook:
|
|
||||||
$(mkinstalldirs) "$(DESTDIR)$(cachedir)"
|
|
||||||
test -f "$(DESTDIR)$(cachedir)/pdnsd.cache" || \
|
|
||||||
touch "$(DESTDIR)$(cachedir)/pdnsd.cache"
|
|
||||||
if test `whoami` = "root"; then \
|
|
||||||
chown $(def_id) "$(DESTDIR)$(cachedir)/pdnsd.cache"; \
|
|
||||||
chown $(def_id) "$(DESTDIR)$(cachedir)"; \
|
|
||||||
fi
|
|
||||||
chmod 0640 "$(DESTDIR)$(cachedir)/pdnsd.cache"
|
|
||||||
chmod 0750 "$(DESTDIR)$(cachedir)"
|
|
||||||
|
|
||||||
dist-hook: $(PACKAGE).spec.in
|
|
||||||
sed -e '/^%{!?distro: %define distro /c\
|
|
||||||
%if 0%{!?distro:1}\
|
|
||||||
%if "%{_vendor}" == "redhat"\
|
|
||||||
%define distro RedHat\
|
|
||||||
%else\
|
|
||||||
%if "%{_vendor}" == "suse"\
|
|
||||||
%define distro SuSE\
|
|
||||||
%else\
|
|
||||||
%if "%{_vendor}" == "SuSE"\
|
|
||||||
%define distro SuSE\
|
|
||||||
%endif\
|
|
||||||
%endif\
|
|
||||||
%endif\
|
|
||||||
%endif' \
|
|
||||||
-e 's:[@]PACKAGE[@]:$(PACKAGE):g' \
|
|
||||||
-e 's:[@]VERSION[@]:$(VERSION):g' \
|
|
||||||
-e 's:[@]fullversion[@]:$(fullversion):g' \
|
|
||||||
-e 's:[@]packagerelease[@]:$(packagerelease):g' \
|
|
||||||
-e 's:[@]cachedir[@]:/var/cache/$(PACKAGE):g' \
|
|
||||||
-e 's:[@]def_id[@]:$(PACKAGE):g' \
|
|
||||||
$(PACKAGE).spec.in > $(distdir)/$(PACKAGE).spec
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
324
jni/pdnsd/NEWS
324
jni/pdnsd/NEWS
|
@ -1,324 +0,0 @@
|
||||||
Version 1.2.9a fixes a bug in the 1.2.9 release that causes a build failure when
|
|
||||||
pdnsd is configured with --enable-strict-rfc2181. Unless you use this option to
|
|
||||||
compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a.
|
|
||||||
|
|
||||||
Version 1.2.9 has support for many additional RR types, in particular those
|
|
||||||
needed for DNSSEC (though no support for the DNSSEC protocol itself yet in
|
|
||||||
pdnsd). Caching data structures are now more efficient when they only store the
|
|
||||||
most commonly used RR types. Fine-grained configurability over which RR-types
|
|
||||||
are cache-able. Pdnsd now has support for EDNS (Extension mechanisms for DNS),
|
|
||||||
although its usefulness is currently limited to enabling UDP messages larger
|
|
||||||
than 512 bytes. Defining local TXT records in the configuration file is now
|
|
||||||
supported. A new configuration option provides a fix in case the query uptest
|
|
||||||
fails due to remote servers ignoring empty queries. Several bugs have been fixed
|
|
||||||
including a UDP socket descriptor leak that affected the FreeBSD platform, and
|
|
||||||
an IPv6 port binding bug.
|
|
||||||
|
|
||||||
Version 1.2.8 implements support for automatic discovery of root servers.
|
|
||||||
There are also some improvements in the resolver and a new default setting for
|
|
||||||
the neg_rrs_pol configuration option.
|
|
||||||
|
|
||||||
Version 1.2.7-par fixes some security problems. It contains a fix for a
|
|
||||||
"dangling pointer" bug that could cause pdnsd to crash when it received a long
|
|
||||||
reply. It also addresses some of the issues raised in the CERT vulnerability
|
|
||||||
note VU#800113 by making the default of query_port_start equal to 1024, thereby
|
|
||||||
ensuring that source ports are randomly selected by the pdnsd resolver in the
|
|
||||||
range 1024-65535. This release also fixes problems with compiling pdnsd for the
|
|
||||||
ARM architecture and for the Darwin platform (Max OS X). There are a number of
|
|
||||||
(minor) new features. pdnsd now supports "include" files, essentially
|
|
||||||
configuration files that only contain definitions for local records. It is now
|
|
||||||
possible to define interactively, using pdnsd-ctl, any local record that can be
|
|
||||||
defined in a configuration file.
|
|
||||||
|
|
||||||
Version 1.2.6-par has an upgraded license: GPL version 3.
|
|
||||||
A bug has been fixed which which caused pdnsd to handle NXDOMAIN replies
|
|
||||||
inefficiently when configured with neg_domain_pol=on. Also the code for the
|
|
||||||
ping test has been fixed, which was broken for 64-bit systems. A new option
|
|
||||||
randomize_servers can be used to give each server in a section of the
|
|
||||||
configuration file an equal chance of being queried. The new options reject,
|
|
||||||
reject_policy and reject_recursively make it possible to check for the presence
|
|
||||||
of certain IP addresses in the replies of name servers and to correct some types
|
|
||||||
of unwanted replies or to censor these IP addresses.
|
|
||||||
The pdnsd-ctl 'add a' and 'add aaaa' commands now allow multiple IP addresses to
|
|
||||||
be specified for the same name. There are some further improvements to pdnsd's
|
|
||||||
recursive resolver.
|
|
||||||
|
|
||||||
Version 1.2.5-par introduces a new query method: udp_tcp. With this method a UDP
|
|
||||||
query is tried first and, if the UDP answer is truncated, the query is repeated
|
|
||||||
using TCP, which is the behaviour that seems to be recommended by the DNS
|
|
||||||
standards. There is a new configuration option use_nss, which can be turned off
|
|
||||||
to prevent lengthy timeouts and stalls in certain situations. A bug has been
|
|
||||||
fixed which could cause pdnsd to crash if debug output was generated before the
|
|
||||||
debug output stream was properly initialized.
|
|
||||||
|
|
||||||
In version 1.2.4-par a memory leak and a minor buffer-overflow problem have been
|
|
||||||
fixed. There is now a fix for some situations that would previously cause pdnsd
|
|
||||||
to exit prematurely (such as ACPI S3 sleep or trying to attach strace to pdnsd).
|
|
||||||
Time intervals specified in the configuration file can now be expressed in
|
|
||||||
minutes, hours, days and weeks as well as seconds. Support for Apple Mac OS X
|
|
||||||
v10.4 Tiger has been improved. The "pdnsd-ctl status" command now also provides
|
|
||||||
some information about the status of the running threads. There are some further
|
|
||||||
improvements in the debugging information provided by pdnsd.
|
|
||||||
TCP-query support is now compiled in by default (but can still be disabled using
|
|
||||||
the configure option --disable-tcp-queries).
|
|
||||||
|
|
||||||
In version 1.2.3-par the "pdnsd-ctl empty-cache" command can be provided with an
|
|
||||||
include/exclude list, allowing the user to specify a selection of names to be
|
|
||||||
removed, instead of emptying the cache completely.
|
|
||||||
Additional improvements: pdnsd should now remain responsive while executing the
|
|
||||||
"pdnsd-ctl empty-cache" command. With the query_method=tcp_udp option pdnsd will
|
|
||||||
now also try a UDP query after a TCP connection times out, which should allow
|
|
||||||
pdnsd to resolve the same names with query_method=tcp_udp as with
|
|
||||||
query_method=udp_only, although perhaps with an occasional delay.
|
|
||||||
"pdnsd-ctl config" or "pdnsd-ctl server" commands should now run without delays,
|
|
||||||
even if pdnsd is performing ping or query uptests at the time. A problem with
|
|
||||||
resolving certain names using root servers has been fixed.
|
|
||||||
|
|
||||||
Version 1.2.2-par has a number of important portability improvements. A bug has
|
|
||||||
been fixed that prevented pdnsd from compiling successfully on some 64 bit
|
|
||||||
architectures. The code for determining endianness (most significant or least
|
|
||||||
significant byte first) should now be more portable. This release has
|
|
||||||
(experimental) support for the Darwin (Apple Mac OS X) platform. On Linux
|
|
||||||
systems, the configure script will now try to detect automatically whether the
|
|
||||||
system implements the Native POSIX Thread Library, but the method used may not
|
|
||||||
necessarily be foolproof. In addition, the debug features have been improved and
|
|
||||||
should make it easier to find out why pdnsd considers some queries or replies
|
|
||||||
malformed.
|
|
||||||
|
|
||||||
Version 1.2.1-par has improved support for non-Linux platforms. This release has
|
|
||||||
(experimental) support for the Cygwin platform, and should also fix some
|
|
||||||
compilation glitches that have been reported by FreeBSD users.
|
|
||||||
|
|
||||||
Version 1.2-par is a new and improved version of pdnsd! Most of the changes
|
|
||||||
effect the internal workings of pdnsd, but there are also a number of
|
|
||||||
interesting new features (well, I think they are interesting). Among the bugs
|
|
||||||
fixed are two rather nasty ones which involve the handling of NXT and NAPTR
|
|
||||||
records and which can cause pdnsd to crash or abort. The new features include a
|
|
||||||
new server availability test which can be specified with uptest=query, support
|
|
||||||
for reading the DNS configuration from resolv.conf files, a new option for
|
|
||||||
optimizing the use of root servers, a new option that makes defining local
|
|
||||||
records for reverse resolving easier, support for defining wildcard records, a
|
|
||||||
new pdnsd-ctl command for reloading the config file without restarting pdnsd,
|
|
||||||
and a new pdnsd-ctl command for dumping information about the names stored in
|
|
||||||
the cache.
|
|
||||||
The documentation has also been updated: there is now a pdnsd.conf man page. For
|
|
||||||
a more complete list of the changes I'll have to refer you to README.par and the
|
|
||||||
ChangeLog.
|
|
||||||
|
|
||||||
Version 1.1.11a-par contains a fix for FreeBSD users that bypasses a problem
|
|
||||||
with the macro ENONET, which can cause a compilation failure when it is
|
|
||||||
undefined. Linux users will notice no difference between 1.1.11a-par and
|
|
||||||
1.1.11-par.
|
|
||||||
|
|
||||||
Version 1.1.11-par has a rather large number of small changes, which are rather
|
|
||||||
difficult to summarize. Among the bugs fixed are a race condition in the cache
|
|
||||||
lookup code, a flaw in the code that caused a busy spin when a remote server
|
|
||||||
answered with "Not Implemented", and problems with the -4 and -6 command-line
|
|
||||||
options. Among the improvements are an alternative sorting algorithm which
|
|
||||||
should allow pdnsd to start up faster when reading a large cache file from disk,
|
|
||||||
automatic mapping of IPv4 to IPv6 addresses when running in IPv6 mode, somewhat
|
|
||||||
more efficient memory use, better compression of the replies and changes in the
|
|
||||||
parallel querying algorithm that should improve the chances of catching a reply
|
|
||||||
from a remote server. For a more complete list of the changes I'll have to
|
|
||||||
refer you to README.par and the ChangeLog.
|
|
||||||
|
|
||||||
Version 1.1.10-par has a new parser for configuration files, completely
|
|
||||||
rewritten from scratch in C. The main advantages are: (f)lex and yacc/bison are
|
|
||||||
no longer needed to build pdnsd, more informative error messages instead of
|
|
||||||
merely "parse error", and string literals no longer need to be enclosed in
|
|
||||||
quotes in most cases. Furthermore, a bug has been fixed that caused incorrect
|
|
||||||
IPV6-type PTR records to be generated when sourcing /etc/hosts like files.
|
|
||||||
There have been other small changes, more details can be found in the ChangeLog.
|
|
||||||
|
|
||||||
Version 1.1.9-par adds some missing pieces to the documentation (the pdnsd
|
|
||||||
manual and the man page for pdnsd-ctl). The changes to the code consist mostly
|
|
||||||
of optimizations, removal of some size limits due to fixed-size buffers, and
|
|
||||||
some cleaning up. I've also tried to make the error responses of pdnsd-ctl more
|
|
||||||
helpful. More details can be found in the ChangeLog.
|
|
||||||
|
|
||||||
Version 1.1.8b1-par8 introduces a "delegation-only" feature that may be useful
|
|
||||||
for blocking Verisign's Sitefinder. The parser for the configuration file now
|
|
||||||
tolerates domain names missing a dot at the end. I have provided alternative
|
|
||||||
implementations for some GNU extensions that I used in an effort to make the
|
|
||||||
code more portable. In particular, the code should build on FreeBSD again. More
|
|
||||||
details can be found in the README.par file.
|
|
||||||
|
|
||||||
Version 1.1.8b1-par7 fixing a number of bugs. I have also reworked some of the
|
|
||||||
code for adding and removing entries in the cache in an effort to improve
|
|
||||||
efficiency and stability. More details can be found in the ChangeLog.
|
|
||||||
|
|
||||||
Version 1.1.8b1-par6 introduces some further code cleanup. In addition the
|
|
||||||
documentation has been revised.
|
|
||||||
|
|
||||||
Version 1.1.8b1-par5 fixes a troublesome allocation size error that has been
|
|
||||||
discovered in Thomas Moestl's code. In practice this bug only wastes memory but
|
|
||||||
it could also potentially lead to memory corruption. Upgrading is
|
|
||||||
recommended. More details can be found in the ChangeLog.
|
|
||||||
|
|
||||||
Version 1.1.8b1-par4 has been released. Due to incompatibilities between
|
|
||||||
various implementations of the pthread library on Linux systems, problems can
|
|
||||||
occur with signal handling in pdnsd. The usual symptom is failure by pdnsd to
|
|
||||||
save the cache to disk, and /var/cache/pdnsd/pdnsd.cache remaining empty. If you
|
|
||||||
experience this kind of trouble, try reconfiguring with different values for the
|
|
||||||
new --with-thread-lib option. The allowable values are described in the
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
pdnsd is no longer maintained by Thomas Moestl: I have not had time to maintain
|
|
||||||
pdnsd for quite a while now, and have been very slow to respond to issues, or
|
|
||||||
did not respond at all. It is time that I officially announce that pdnsd is no
|
|
||||||
longer actively maintained; I apologize to all those who reported bugs or asked
|
|
||||||
questions without receiving any reply. However, Paul A. Rombouts has published a
|
|
||||||
patch set against the last released version at
|
|
||||||
http://www.phys.uu.nl/~rombouts/pdnsd.html, which cleans up a lot of code fixes
|
|
||||||
many bugs.
|
|
||||||
|
|
||||||
Version 1.1.7a fixes a reversed assertion that would cause pdnsd to terminate
|
|
||||||
if used with the ping uptest. No other changes were made.
|
|
||||||
|
|
||||||
Version 1.1.7 fixes some problems that might be remotely exploitable to
|
|
||||||
gain access as the user pdnsd runs as (an unprivileged user by default). To do
|
|
||||||
this, an attacker needs to control a name server that is queried by pdnsd, and
|
|
||||||
send a malicious reply to such a query. Upgrading is strongly recommended!
|
|
||||||
There are also minor bug fixes and stability improvements.
|
|
||||||
|
|
||||||
Version 1.1.6 adds the query_port_start and query_port_end options (contributed
|
|
||||||
by Andreas Steinmetz), that allow confining the ports pdnsd uses for outgoing
|
|
||||||
queries to a certain range. It also fixes numerous bugs, one of which could
|
|
||||||
cause pdnsd to hang; update is therefore recommended.
|
|
||||||
|
|
||||||
Version 1.1.5 contains a fix for a security bug that would allow local users
|
|
||||||
that are allowed to use pdnsd-ctl on a running pdnsd server to execute
|
|
||||||
arbitrary code as the user that pdnsd runs as (or on Linux, when strict_setuid
|
|
||||||
is not enabled, as the user that started pdnsd). The danger of this is usually
|
|
||||||
quite limited; the status socket is not enabled by default, it's default
|
|
||||||
permissions do only allow the user pdnsd runs as to use the socket,
|
|
||||||
strict_setuid is enabled by default and pdnsd runs as an unprivileged user.
|
|
||||||
There is also a new configure option, --enable-underscores, that will make
|
|
||||||
pdnsd allow underscores in domain names. Furthermore, the SRV record handling
|
|
||||||
has been fixed to allow underscores in any case (this was not allowed
|
|
||||||
previously, but is required by the RFC). SOA records are not put in the
|
|
||||||
answer section any more if no answers are found (this violates the RFC's).
|
|
||||||
It may be put in the authority section in a later version.
|
|
||||||
There are also various bugfixes in this release.
|
|
||||||
Upgrade is recommended.
|
|
||||||
|
|
||||||
Version 1.1.4 fixes various smaller bugs, and should also improve the cache
|
|
||||||
write performance especially for larger caches. There are also two new
|
|
||||||
features: servers can now be given a label (using the label server option)
|
|
||||||
which can be used to identify them for the pdnsd-ctl server command
|
|
||||||
(contributed by Andrew M. Bishop), and local records can be marked to make
|
|
||||||
the domain record authoritative in pdnsd's cache (which means that pdnsd will
|
|
||||||
assume that records that are not present in the cache for that domain are
|
|
||||||
non-existent); this is on by default now, and can be controlled using the new
|
|
||||||
authrec server option).
|
|
||||||
|
|
||||||
Version 1.1.3 added contrib/ and had a lot of robustness fixes.
|
|
||||||
This release addresses a security hole that affects only Linux systems. Due to
|
|
||||||
a bug in glibc, pdnsd could crash during a port scan. This release contains
|
|
||||||
a workaround for this, as well as a fix for a deadlock under heavy load
|
|
||||||
conditions. It also fixes a possible problem that could be triggered by
|
|
||||||
malicious servers, and contains numerous bug fixes.
|
|
||||||
A script, contributed by Marko Stolle, makes pdnsd useful in a DHCP setup.
|
|
||||||
pdnsd also preservers the case of names in the cache, and should work much
|
|
||||||
better on alpha machines (thanks for the contributions by Bjoern Fischer
|
|
||||||
and P.J. Bostley that made this possible). New types were dded for rr
|
|
||||||
sections and pdnsd-ctl.
|
|
||||||
Upgrade is recommended.
|
|
||||||
|
|
||||||
Version 1.1.2 has a fix for a bug that could cause SERVFAIL to be
|
|
||||||
returned when NXDOMAIN would be appropriate. The bug surfaced only when
|
|
||||||
pdnsd queried name servers with a behaviour different from BIND's in the
|
|
||||||
NXDOMAIN case, e.g. pdnsd querying another pdnsd or e.g. djbdns.
|
|
||||||
|
|
||||||
Version 1.1.1 fixes a possible race condition in status socket creation.
|
|
||||||
This race might be used by a local attacker to change the access
|
|
||||||
permissions of a certain file in /tmp. The risk of this is probably
|
|
||||||
negligible. The default setup uses a non-privileged user, default mode
|
|
||||||
0600, and the status socket is disabled normally, so this should be
|
|
||||||
relatively safe. I don't see any possibility to exploit this, it is
|
|
||||||
more of a paranoia fix.
|
|
||||||
There are also some other minor fixes and documentation improvements.
|
|
||||||
Upgrade is recommended.
|
|
||||||
|
|
||||||
Version 1.1.0 introduces negative cacheing, pdnsd-ctl enhancements and
|
|
||||||
a much improved FreeBSD support. The cache file format has changed from
|
|
||||||
prior releases. Some configuration defaults have changed, too.
|
|
||||||
|
|
||||||
Version 1.0.15 is mostly a bugfix release. It also has a new option:
|
|
||||||
randomize_recs in the global section.
|
|
||||||
|
|
||||||
Version 1.0.14 has a fix in icmp.c that will make it build properly
|
|
||||||
on FreeBSD and older Linux systems.
|
|
||||||
|
|
||||||
Version 1.0.13 has some code cleanup, a fix for the Debian rc install,
|
|
||||||
and a security fix (contributed by Olaf Kirch): when changing
|
|
||||||
user and group id, pdnsd did not drop supplementary group IDs that
|
|
||||||
the original user was member of.
|
|
||||||
|
|
||||||
Version 1.0.12 is a bugfix release and contains some security
|
|
||||||
enhancements. There are also inclusion/exclusion lists for servers
|
|
||||||
(new options include=, exclude=, policy= in the server
|
|
||||||
section).
|
|
||||||
|
|
||||||
Version 1.0.11 fixes two bugs that might be used for denial-of-service
|
|
||||||
attacks, upgrading is recommended.
|
|
||||||
|
|
||||||
Versions 1.0.9 and 1.0.10 are bugfix releases.
|
|
||||||
|
|
||||||
Version 1.0.8 introduces special linux ppp device support contributed
|
|
||||||
by Ron Yorston, and has some bugfixes.
|
|
||||||
|
|
||||||
Version 1.0.7 introduces autoconf support, many new config file options and
|
|
||||||
the new pdnsd-ctl run-time configuration program.
|
|
||||||
|
|
||||||
Version 1.0.6 has another set of bugfixes, in addition to higher compile-
|
|
||||||
time configurability and UDP query support. It also contains Debian rc
|
|
||||||
scripts contributed by Markus Mohr.
|
|
||||||
|
|
||||||
Version 1.0.5 has some bugfixes and the new "server_ip" option
|
|
||||||
contributed by Wolfgang Ocker.
|
|
||||||
|
|
||||||
Version 1.0.4 introduces the new options run_as, strict_setuid and
|
|
||||||
paranoid. These new options are optional security enhancements.
|
|
||||||
|
|
||||||
Versions 1.0.1, 1.0.2 and 1.0.3 are bugfix releases.
|
|
||||||
|
|
||||||
Version 1.0.0 has a lot of changes compared to the 0.9.x tree, but much of
|
|
||||||
them "under the hood":
|
|
||||||
- IPv6 support (experimental; compile- and run-time configurable)
|
|
||||||
- FreeBSD (and such hopefully *BSD) support
|
|
||||||
- better rfc2181 compatability
|
|
||||||
- new options:
|
|
||||||
- serve_aliases in source section
|
|
||||||
- linkdown_kluge in global section
|
|
||||||
- max_ttl in global section
|
|
||||||
- cache-code reorganization, only one unified hash (of variable depth)
|
|
||||||
- Optimizations & cleanups
|
|
||||||
- Automatic deps (only interesting for developers ;-)
|
|
||||||
|
|
||||||
Version 0.9.11 fixes a locally exploitable security hole (the cache file was
|
|
||||||
world writeable by default). Please see ChangeLog.old for details.
|
|
||||||
|
|
||||||
Version 0.9.10 fixes some bugs and improves build on Red Hat.
|
|
||||||
|
|
||||||
Version 0.9.9 contains the rc scripts for Red Hat Linux contributed by Torben
|
|
||||||
Janssen, in addition to code cleanups and bugfixes.
|
|
||||||
The meaning of the option -v has changed in this release.
|
|
||||||
There is also a new config file option "lean_query" that is on by default. It
|
|
||||||
is an optimization, so please look in the docs when updating whether you want
|
|
||||||
it switched on or not.
|
|
||||||
|
|
||||||
When compiling versions after 0.9.8, you will probably get more
|
|
||||||
compiler warningsthan before. This is because the C compiler settings
|
|
||||||
have been made stricter.
|
|
||||||
|
|
||||||
Version 0.9.8 fixes a minor bug some build problems with glibc2.0 systems.
|
|
||||||
|
|
||||||
The versions 0.9.6 and 0.9.7 are bugfix releases.
|
|
||||||
|
|
||||||
Version 0.9.5 introduces uptest=exec, and a modified config file syntax (cache
|
|
||||||
sizes are now specified in kB).
|
|
||||||
|
|
||||||
Version 0.9.4 was the first to be released to the public. For information on
|
|
||||||
changes, see ChangeLog.
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Package build script for Arch Linux,
|
|
||||||
# contributed by Alexander Drozdov.
|
|
||||||
|
|
||||||
pkgname=@PACKAGE@
|
|
||||||
pkgver=@VERSION@
|
|
||||||
pkgrel=@packagerelease@
|
|
||||||
pkgdesc="pdnsd is a proxy DNS server with permanent caching (the cache contents are written to hard disk on exit) that is designed to cope with unreachable or down DNS servers."
|
|
||||||
url="http://members.home.nl/p.a.rombouts/pdnsd.html"
|
|
||||||
license="GPLv3"
|
|
||||||
depends=()
|
|
||||||
makedepends=(glibc)
|
|
||||||
conflicts=()
|
|
||||||
replaces=()
|
|
||||||
backup=()
|
|
||||||
install=
|
|
||||||
source=(http://members.home.nl/p.a.rombouts/pdnsd/releases/$pkgname-$pkgver-$pkgrel.tar.gz)
|
|
||||||
md5sums=()
|
|
||||||
|
|
||||||
build() {
|
|
||||||
cd $startdir/src/$pkgname-$pkgver
|
|
||||||
./configure --prefix=/usr --enable-ipv6 --sysconfdir=/etc --with-distribution=ArchLinux
|
|
||||||
make || return 1
|
|
||||||
make DESTDIR=$startdir/pkg install
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
You can find the documentation for pdnsd in the doc/ directory. The html
|
|
||||||
documentation (which I recommend) is in the doc/html/ subdirectory.
|
|
||||||
The pure text documentation (which is generated automatically from the
|
|
||||||
html documentation) is in doc/txt/.
|
|
||||||
The following documents are available:
|
|
||||||
|
|
||||||
index.html / intro.txt Overview, system requirements
|
|
||||||
doc.html / manual.txt Building, installation and usage instructions
|
|
||||||
faq.html / faq.txt The FAQ
|
|
||||||
|
|
||||||
Share and enjoy!
|
|
||||||
Thomas <tmoestl@gmx.net>
|
|
||||||
|
|
||||||
|
|
||||||
For news about recent changes in pdnsd the following files may be of
|
|
||||||
interest to you:
|
|
||||||
|
|
||||||
README.par
|
|
||||||
ChangeLog
|
|
||||||
NEWS
|
|
||||||
|
|
||||||
Last revised: 08 July 2007 by Paul Rombouts
|
|
|
@ -1,216 +0,0 @@
|
||||||
pdnsd version 1.2.9a by Paul Rombouts
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
This file describes the version of pdnsd that I maintain personally and am
|
|
||||||
making available so other people can enjoy the latest features and fixes. Thomas
|
|
||||||
Moestl no longer maintains pdnsd himself, so I am effectively the new
|
|
||||||
maintainer. This README describes the new features in version 1.2. This version
|
|
||||||
has a rather large number of internal changes and also some new features, which
|
|
||||||
I am rather pleased with, even if I say so myself. I think the changes are
|
|
||||||
significant enough to warrant increasing the minor version number from 1.1 to
|
|
||||||
1.2. The differences between my previous "official" release 1.1.11 and Thomas'
|
|
||||||
last release 1.1.7a are described in my previous README, which I have renamed
|
|
||||||
REAME.par.old. In this README I restrict myself to describing changes between
|
|
||||||
1.1.11 and 1.2.
|
|
||||||
The main difference between versions 1.2 and 1.2.1, aside from some minor
|
|
||||||
changes, is that 1.2.1 has (experimental) support for the Cygwin platform.
|
|
||||||
Version 1.2.2 has further improvements in portability and should in
|
|
||||||
particular now also compile on the Darwin (Apple Mac OS X) platform.
|
|
||||||
Version 1.2.4 has some important fixes for a memory leak, a minor buffer-
|
|
||||||
overflow problem and some situations which could cause pdnsd to exit
|
|
||||||
prematurely. Note that TCP-query support is now compiled in by default, but can
|
|
||||||
still be disabled using a configure option.
|
|
||||||
The main new feature of version 1.2.5 is the new query method "udp_tcp".
|
|
||||||
Version 1.2.6 has an updated license: GPL version 3. The main new feature of
|
|
||||||
version 1.2.6 is the "reject" option, which makes it possible to censor or
|
|
||||||
correct for unwanted IP addresses in replies.
|
|
||||||
Version 1.2.7 contains an important fix for a "dangling pointer" bug and
|
|
||||||
attempts to make pdnsd less vulnerable to the issues raised in CERT
|
|
||||||
vulnerability note VU#800113. It also contains some improvements for defining
|
|
||||||
local records interactively using the pdnsd-ctl utility.
|
|
||||||
The main new feature of version 1.2.8 is automatic discovery of root servers,
|
|
||||||
as well as some minor improvements in the resolver.
|
|
||||||
Version 1.2.9 among other things supports many addtional RR types, uses data
|
|
||||||
structures that should be more slightly more memory efficient and has support
|
|
||||||
for EDNS, which allows DNS UDP messages to be larger than 512 bytes.
|
|
||||||
Version 1.2.9a is a simple bugfix release that fixes a problem with compiling
|
|
||||||
1.2.9 after configuring with --enable-strict-rfc2181. Unless you use this option
|
|
||||||
to compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a.
|
|
||||||
|
|
||||||
For instructions how to compile and install pdnsd see doc/html/doc.html or
|
|
||||||
doc/txt/manual.txt. Note that I am no longer distributing a patch w.r.t. Thomas'
|
|
||||||
version because the (compressed) patch file is barely smaller than the
|
|
||||||
(compressed) tar archive.
|
|
||||||
|
|
||||||
Here follows a list of some of changes in version 1.2 from a user's perspective.
|
|
||||||
For a more technical description of some of the changes in the code see the ChangeLog.
|
|
||||||
For a short history about recent releases have a look at NEWS or doc/html/index.html.
|
|
||||||
|
|
||||||
- First of all, two potentially rather nasty bugs have been fixed in the code
|
|
||||||
for the handling of NXT and NAPTR records. A response from a remote server
|
|
||||||
containing NXT records (even well-formed ones) will very likely cause pdnsd to
|
|
||||||
crash. The code for handling NAPTR records contained incorrect ASSERT
|
|
||||||
statements, which could cause pdnsd to abort in a controlled fashion, but
|
|
||||||
completely unnecessarily.
|
|
||||||
|
|
||||||
- Sampo Lehtinen has remarked that pdnsd sometimes failed to resolve classless
|
|
||||||
reversed-delegated IP addresses, and that this has something to do with the
|
|
||||||
fact that pdnsd didn't accept '/' characters in domain names. After reading
|
|
||||||
some of the relevant RFCs I decided to remove all restrictions on the types
|
|
||||||
of characters that pdnsd accepts in domain names. Of course for most
|
|
||||||
applications, there are many characters which don't make sense in domain
|
|
||||||
names, but I feel that it is the responsibility of the client application to
|
|
||||||
reject these, not the proxy server.
|
|
||||||
|
|
||||||
- At the suggestion of Dan Tihelka, I have expanded to the server_ip= option to
|
|
||||||
allow the name of an interface to be specified instead of an IP address.
|
|
||||||
Presently this has been tested on Linux only. Can someone running pdnsd on
|
|
||||||
*BSD tell me if the code for getting the address of an interface is different
|
|
||||||
for Linux and BSD-type systems?
|
|
||||||
|
|
||||||
- At the suggestion of Juliusz Chroboczek I've added an new server availability
|
|
||||||
test which can be specified with uptest=query. This can be useful as an
|
|
||||||
alternative to "uptest=ping" in case the remote server does not respond to
|
|
||||||
ICMP_ECHO requests at all, which unfortunately is quite common these days.
|
|
||||||
"uptest=query" causes pdnsd to send an empty query to remote name servers. Any
|
|
||||||
well-formed response (apart from SERVFAIL) within the timeout period will be
|
|
||||||
interpreted as a sign that the server is "up".
|
|
||||||
|
|
||||||
- Instead of specifying the IP addresses of the name servers that pdnsd should
|
|
||||||
query in a server section of the config file, you may also specify a
|
|
||||||
resolv.conf-style file. Preferably this should not be /etc/resolv.conf. If the
|
|
||||||
contents of the resolv.conf type file changes while pdnsd is running, you can
|
|
||||||
make pdnsd aware of the changes with the "pdnsd-ctl config" command, see
|
|
||||||
below. Example:
|
|
||||||
|
|
||||||
server {
|
|
||||||
label=myisp;
|
|
||||||
file=/etc/ppp/resolv.conf;
|
|
||||||
timeout=10;
|
|
||||||
}
|
|
||||||
|
|
||||||
- There is a new option for "server" sections in the config file:
|
|
||||||
root_server=on/off.
|
|
||||||
In case a server section contains only addresses of root servers, which
|
|
||||||
usually only give the name servers of top level domains in their reply,
|
|
||||||
setting root_server=on will enable certain optimizations. This involves using
|
|
||||||
cached information to reduce queries to the root servers, thus speeding up the
|
|
||||||
resolving of new names.
|
|
||||||
|
|
||||||
- New option for "rr" sections in the config file: reverse=on/off.
|
|
||||||
If you want a locally defined name to resolve to a numeric address and vice
|
|
||||||
versa, you can now achieve this by setting reverse=on before defining the A
|
|
||||||
record, making it unnecessary to define a separate PTR record for the reverse
|
|
||||||
resolving.
|
|
||||||
Example:
|
|
||||||
|
|
||||||
rr {
|
|
||||||
name = localhost;
|
|
||||||
reverse = on;
|
|
||||||
a = 127.0.0.1;
|
|
||||||
}
|
|
||||||
|
|
||||||
has the same effect as:
|
|
||||||
|
|
||||||
rr {
|
|
||||||
name = localhost;
|
|
||||||
a = 127.0.0.1;
|
|
||||||
}
|
|
||||||
rr {
|
|
||||||
name = 1.0.0.127.in-addr.arpa;
|
|
||||||
ptr = localhost;
|
|
||||||
}
|
|
||||||
|
|
||||||
- In rr sections it is now possible to specify a wildcard name, i.e. a name
|
|
||||||
starting with the label *. The * in a wildcard can match one or more labels in
|
|
||||||
a queried name, but only whole labels. For example, *.mydomain will match
|
|
||||||
a.mydomain or www.a.mydomain, but not mydomain. Before you can specify an rr
|
|
||||||
section with name=*.mydomain you must define some records for mydomain,
|
|
||||||
typically NS and/or SOA records.
|
|
||||||
Example:
|
|
||||||
|
|
||||||
rr {
|
|
||||||
name = mydomain;
|
|
||||||
ns = localhost;
|
|
||||||
soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400;
|
|
||||||
}
|
|
||||||
rr {
|
|
||||||
name = *.mydomain;
|
|
||||||
a = 192.168.1.10;
|
|
||||||
}
|
|
||||||
|
|
||||||
- There is a slight backwards compatibility problem which involves the name= and
|
|
||||||
owner= options in rr sections. The new version does not allow you to place
|
|
||||||
owner= before name=. On the other hand, you may now freely mix the owner
|
|
||||||
option with the a,ptr,cname,mx and soa options and define as many records of
|
|
||||||
this type as you like (including zero).
|
|
||||||
|
|
||||||
- pdnsd-ctl has three new commands:
|
|
||||||
|
|
||||||
config: Reloads pdnsd's configuration file. This is more efficient than
|
|
||||||
restarting pdnsd, and should not cause only noticeable interruption in DNS
|
|
||||||
service. However, some types of configuration changes cannot be put into
|
|
||||||
effect this way, and you will be prompted to restart pdnsd instead.
|
|
||||||
|
|
||||||
empty-cache: Empties the cache completely, freeing all existing entries.
|
|
||||||
In version 1.2.3 you can specify a selection of entries to delete by providing
|
|
||||||
a list of include/exclude patterns.
|
|
||||||
|
|
||||||
dump: Prints information about all the names stored in the cached. This is
|
|
||||||
mainly useful for diagnostic purposes.
|
|
||||||
|
|
||||||
- There is now a pdnsd.conf(5) man page, describing pdnsd's configuration file.
|
|
||||||
The man page has been generated from the html documentation using a customized
|
|
||||||
Perl script.
|
|
||||||
|
|
||||||
- New in version 1.2.4: Time intervals in the configuration files can now be
|
|
||||||
expressed in seconds, minutes, hours, days and weeks, using the suffixes
|
|
||||||
s,m,h,d,and w.
|
|
||||||
Example: 2h30m is interpreted as 2*60*60 + 30*60 = 9000 seconds.
|
|
||||||
|
|
||||||
- Version 1.2.5 introduces a new configuration option, contributed by Jan-Marek
|
|
||||||
Glogowski, called "use_nss" which can be turned off to prevent nasty delays in
|
|
||||||
certain situations.
|
|
||||||
Besides the query methods "udp_only", "tcp_only" and "tcp_udp" you can now
|
|
||||||
also specify "udp_tcp", which more closely adheres to the behaviour
|
|
||||||
recommended by DNS standards.
|
|
||||||
|
|
||||||
- Version 1.2.6 introduces the "randomize_servers" and "reject" options. By
|
|
||||||
setting "randomize_servers" on you can give each server in a server section an
|
|
||||||
equal chance of being queried, which is useful when resolving from root
|
|
||||||
servers, for instance. The "reject" option can be used to censor certain IP
|
|
||||||
addresses or correct for unwanted replies from servers you don't completely
|
|
||||||
trust.
|
|
||||||
|
|
||||||
- Version 1.2.7 contains support for "include" files which can be referenced
|
|
||||||
from configuration files or read interactively using pdnsd-ctl. These files
|
|
||||||
can be used to add local definitions to the cache without reconfiguring pdnsd.
|
|
||||||
The new "pdnsd-ctl eval" command can be used to interactively define local
|
|
||||||
records that could previously only be defined in configuration files but not
|
|
||||||
with the "pdnsd-ctl add" command.
|
|
||||||
|
|
||||||
- Version 1.2.8 contains support for automatic discovery of root servers.
|
|
||||||
Instead of supplying a complete list of IP addresses of root servers in a
|
|
||||||
server section of the configuration file, you need only enter one or two
|
|
||||||
addresses of name servers which know the names and addresses of the root
|
|
||||||
servers and set "root_server=discover".
|
|
||||||
The "neg_rrs_pol" option has a new default setting, which should allow
|
|
||||||
sensible negative caching of RRs in most situations, even if "proxy_only=on".
|
|
||||||
|
|
||||||
- Version 1.2.9 contains support for EDNS (Extension mechanisms for DNS), which
|
|
||||||
allows UDP messages to be larger than 512 bytes. Whether pdnsd uses EDNS in
|
|
||||||
outgoing queries is determined by the configuration option "edns_query". If
|
|
||||||
pdnsd receives a query using EDNS, it will reply using EDNS regardless of the
|
|
||||||
configuration settings.
|
|
||||||
Local TXT records can now be defined in the configuration file.
|
|
||||||
If the query uptest fails due to remote servers ignoring empty queries, this
|
|
||||||
can now be remedied using the new "query_test_name" config option.
|
|
||||||
|
|
||||||
The new features are described in greater detail in the manual doc/html/doc.html
|
|
||||||
or doc/txt/manual.txt.
|
|
||||||
|
|
||||||
Enjoy!
|
|
||||||
|
|
||||||
If you have any questions about my version of pdnsd, you can send these
|
|
||||||
to <p.a.rombouts@home.nl>. Questions about the original (unmaintained) pdnsd
|
|
||||||
version should be sent to <tmoestl@gmx.net> or <t.moestl@tu-bs.de>.
|
|
|
@ -1,249 +0,0 @@
|
||||||
pdnsd maintenance version 1.1.11-par by Paul Rombouts
|
|
||||||
=======================================================
|
|
||||||
|
|
||||||
This file describes the version of pdnsd that I maintain personally and am
|
|
||||||
making available so other people can enjoy the latest features and fixes.
|
|
||||||
Thomas Moestl no longer maintains pdnsd himself, so I am effectively the new
|
|
||||||
maintainer. The current version is 1.1.11-par, which has a rather large number
|
|
||||||
of small changes. Among the bugs fixed are a race condition in the cache lookup
|
|
||||||
code, a flaw in the code that caused a busy spin when a remote server answered
|
|
||||||
with "Not Implemented", and problems with the -4 and -6 command-line options.
|
|
||||||
Among the improvements are an alternative sorting algorithm which should allow
|
|
||||||
pdnsd to start up faster when reading a large cache file from disk, automatic
|
|
||||||
mapping of IPv4 to IPv6 addresses when running in IPv6 mode, somewhat more
|
|
||||||
efficient memory use, and better compression of the replies. Some of the new
|
|
||||||
features are described in the second half of this file (look for "new in version
|
|
||||||
1.1.11"). For the rest of the changes I will have to refer you to the ChangeLog.
|
|
||||||
For a short history about recent releases have a look at doc/html/index.html.
|
|
||||||
|
|
||||||
Since version 1.1.9 I've added some missing pieces to the documentation (the
|
|
||||||
manual doc/html/doc.html,doc/txt/manual.txt and the man page doc/pdnsd-ctl.8).
|
|
||||||
Version 1.1.11 finally has a man page doc/pdnsd.8, thanks to a contribution by
|
|
||||||
Mahesh T. Pai.
|
|
||||||
|
|
||||||
The first part of this file describes how to patch, compile, install and run
|
|
||||||
pdnsd. The second part describes some of the changes I've made to Thomas
|
|
||||||
Moestl's code.
|
|
||||||
|
|
||||||
Unless you're using the pre-patched source archive pdnsd-1.1.11-par.tar.gz you
|
|
||||||
must first apply my patch file pdnsd-1.1.11-par.diff.gz before compiling and
|
|
||||||
installing pdnsd according to Thomas Moestl's instructions described in the the
|
|
||||||
documentation. Use a freshly untarred copy of Thomas Moestl's original version
|
|
||||||
1.1.7a source, cd into the source directory pdnsd-1.1.7a and apply the command:
|
|
||||||
|
|
||||||
gzip -cd <path_to_patch>/pdnsd-1.1.11-par.diff.gz | patch -p2 -N -Z
|
|
||||||
|
|
||||||
Note: I have used GNU extensions so there may be some portability issues. I have
|
|
||||||
supplied alternatives for some of the less portable functions. There should be no
|
|
||||||
problem with most Linux distributions.
|
|
||||||
|
|
||||||
That's it! You should now be able to compile, install and run pdnsd. See the
|
|
||||||
documentation in doc/html/doc.html or doc/txt/manual.txt for more detailed
|
|
||||||
instructions.
|
|
||||||
|
|
||||||
Some people may want change the compiler optimization flag. I use the -O2 flag,
|
|
||||||
but it might be safer to use a lower level of optimization or no optimization at
|
|
||||||
all. In that case prefix the configure command with the desired compiler flags
|
|
||||||
like this (assuming you're using a bash shell):
|
|
||||||
|
|
||||||
CFLAGS="-O1 -g -Wall" ./configure ...
|
|
||||||
|
|
||||||
I have added a new configuration option "--with-thread-lib=<lib>", which you
|
|
||||||
should use if you experience problems with signal handling under Linux. The
|
|
||||||
usual symptom is failure by pdnsd to save the cache to disk, and
|
|
||||||
/var/cache/pdnsd/pdnsd.cache remaining empty. If you experience this kind of
|
|
||||||
trouble, try reconfiguring with different values for the --with-thread-lib
|
|
||||||
option. The allowable values are "linuxthreads" (the default), "linuxthreads2"
|
|
||||||
(or "lt2" for short), and "nptl". I recommend that you first configure and
|
|
||||||
compile without the --with-thread-lib option, then if you experience trouble try
|
|
||||||
again with --with-thread-lib=lt2 and recompile.
|
|
||||||
If your Linux system has an implementation of the Native POSIX Thread Library,
|
|
||||||
which is the case with Red Hat 9 for instance, you should use
|
|
||||||
--with-thread-lib=nptl .
|
|
||||||
Ideally, I would like to write a configure script which automatically detects
|
|
||||||
which kind of thread library is being used on a Linux system, but I don't have a
|
|
||||||
clue yet how to do this. If you can help me with this please write to me at the
|
|
||||||
email address listed at the end of this file.
|
|
||||||
|
|
||||||
The rest of this file describes some of the modifications I've made, but you
|
|
||||||
don't have to read it if you simply want to run pdnsd as you're used to.
|
|
||||||
|
|
||||||
|
|
||||||
- The main new feature I've added enables you to change the server addresses
|
|
||||||
that pdnsd uses at run-time using pdnsd-ctl. I've done this because the ISPs I
|
|
||||||
use do not specify fixed DNS server addresses, but expect their clients to use
|
|
||||||
dynamic DNS configuration (DHCP in the case of the cable connection, RFC1877
|
|
||||||
in case of isdn). I've extended the options that can be given with the
|
|
||||||
"server" command to pdnsd-ctl, to allow IP addresses to be specified as an
|
|
||||||
additional argument after "up|down|retest". This allows me to put something
|
|
||||||
like this in my ifup-local script:
|
|
||||||
|
|
||||||
pdnsd-ctl server isp-label up "$DNS1 $DNS2"
|
|
||||||
|
|
||||||
For more details how to use pdnsd-ctl read the updated documentation in
|
|
||||||
the doc/html directory. There is also a manpage for pdnsd-ctl.
|
|
||||||
This was quite tricky to implement because there might be pending queries
|
|
||||||
while the addresses are being changed. It certainly was an interesting
|
|
||||||
exercise in writing multi-threaded code for me.
|
|
||||||
|
|
||||||
|
|
||||||
- I've implemented a feature which allowed me to specify multiple IP addresses
|
|
||||||
per server section in the configuration file. This allowed for a much more
|
|
||||||
compact configuration file (3 server sections instead of 7 in my case),
|
|
||||||
because most configuration options are identical for servers belonging to the
|
|
||||||
same ISP. It also made the output of "pdnsd-ctl status" more compact. And it
|
|
||||||
was necessary to enable a satisfactory implementation of the previous feature.
|
|
||||||
Example of the new syntax:
|
|
||||||
|
|
||||||
ip = 123.456.789.001, 123.456.789.002, 123.456.789.003;
|
|
||||||
|
|
||||||
At the suggestion of Greg Norris server sections no longer have to specify IP
|
|
||||||
addresses. A server section without IP addresses will remain inactive until it
|
|
||||||
is assigned one more addresses at run-time with pdnsd-ctl.
|
|
||||||
|
|
||||||
- I've changed the implementation of dynamic arrays to make it slightly more
|
|
||||||
efficient, and improve type safety. I also got rid of several arrays of fixed
|
|
||||||
size in favor of dynamically allocated arrays. In particular, I got rid of
|
|
||||||
all occurrences of MAXPATH. I also made several static variables "automatic".
|
|
||||||
|
|
||||||
- The output of the "status" command of pdnsd-ctl now gives more meaningful
|
|
||||||
constant names "ping|none|if|exec" instead of numbers for the "uptest" option.
|
|
||||||
I've also added some information that was previously missing.
|
|
||||||
|
|
||||||
- I've fixed I a problem that caused pdnsd to use up a lot of CPU time and slow
|
|
||||||
down my system considerably when it received a query that took a long time to
|
|
||||||
resolve. It turned out that pdnsd can get into a "busy spin" when one of the
|
|
||||||
DNS servers pdnsd is querying refuses the connection. Apart from fixing this
|
|
||||||
bug, to speed things up additionally, I thought it would be a good idea to
|
|
||||||
mark a server down (without retesting it) after detecting errno==ECONNREFUSED.
|
|
||||||
This gives me very satisfactory performance, with the problematic server being
|
|
||||||
tried only once during every testing interval.
|
|
||||||
|
|
||||||
New in version 1.1.11: An additional busy spin condition, triggered when a
|
|
||||||
remote server answers with "Not Implemented", has been discovered and fixed.
|
|
||||||
In case there are remaining bugs in the multiplexing code, I've added a test
|
|
||||||
that checks if the number of events reported by poll/select matches the number
|
|
||||||
of events handled by pdnsd. If not, pdnsd will log an error message and give
|
|
||||||
up. Although the bugs still need to be reported and fixed, at least this
|
|
||||||
should prevent pdnsd from wasting CPU cycles.
|
|
||||||
|
|
||||||
- Due to a bug in Thomas' code, pdnsd tries, but fails, to remove the control
|
|
||||||
socket "pdnsd.status" before exiting. This has also been fixed. In version
|
|
||||||
1.1.8b1-par6 I have cleaned this up some more so that pdnsd will handle
|
|
||||||
situations where it can't open or bind the control socket more gracefully.
|
|
||||||
|
|
||||||
- I've rewritten some of the code that saves the contents of the cache to the
|
|
||||||
file "pdnsd.cache" just before pdnsd exits. This is because I noticed in my
|
|
||||||
logfiles that pdnsd occasionally had problems reading this file back at
|
|
||||||
startup. I eliminated the use of fseek() in Thomas' code. I could not find
|
|
||||||
anything that was demonstrably incorrect about his use of fseek(), but it
|
|
||||||
seemed better to me to do without it and write the file in a strictly
|
|
||||||
sequential order. Anyway, it turned out my hunch paid off: no more error
|
|
||||||
messages about "pdnsd.cache" in my logfile.
|
|
||||||
|
|
||||||
New in version 1.1.11: I've added some new code for sorting the queue used for
|
|
||||||
purging stale cache entries. This should allow pdnsd to start up faster when
|
|
||||||
reading large cache files from disk.
|
|
||||||
|
|
||||||
- I've extended the configuration options for policies of inclusion/exclusion
|
|
||||||
lists in server sections. The new policies options are "simple_only" and
|
|
||||||
"fqdn_only". Setting policy=simple_only will cause the server to used only for
|
|
||||||
simple hostnames if no other rule matches. On the other hand, setting
|
|
||||||
policy=fqdn_only will cause the server to be used only for fully qualified
|
|
||||||
domain names (i.e. the name has at least one dot in-between). I find these
|
|
||||||
options useful for controlling which name servers (if any) will be used by
|
|
||||||
pdnsd for simple host names.
|
|
||||||
|
|
||||||
- I've added a new "delegation_only" option that can be used to undo the
|
|
||||||
unwanted effects of DNS "wildcards". It works roughly as the feature by the
|
|
||||||
same name in BIND. It is turned off by default. To block Verisign's
|
|
||||||
Sitefinder, add the following line to the global section of the configuration
|
|
||||||
file:
|
|
||||||
|
|
||||||
delegation_only= com, net;
|
|
||||||
|
|
||||||
If you find that this feature blocks some legitimate domain names, you will
|
|
||||||
probably need to add the address of a nameserver that provides good authority
|
|
||||||
information. More information can be found at
|
|
||||||
http://www.phys.uu.nl/~rombouts/pdnsd/delegationonly.html
|
|
||||||
|
|
||||||
- It is no longer mandatory that domain names in the configuration file end in a
|
|
||||||
dot.
|
|
||||||
|
|
||||||
- The parser for configuration files has been rewritten purely in C, so (f)lex
|
|
||||||
and yacc/bison are no longer needed to build pdnsd.
|
|
||||||
It is no longer necessary to place strings between quotes in the configuration
|
|
||||||
file, unless a string contains a special character such as whitespace, a token
|
|
||||||
that normally starts a comment, or one of the characters ",;{}". Note that
|
|
||||||
these special characters are illegal in domain names anyway.
|
|
||||||
|
|
||||||
- New in version 1.1.11: Negating whole domains with a neg section in the
|
|
||||||
config file will result in all the subdomains being negated as well.
|
|
||||||
For example, adding the lines
|
|
||||||
|
|
||||||
neg {name=doubleclick.com; types=domain;}
|
|
||||||
neg {name=doubleclick.net; types=domain;}
|
|
||||||
|
|
||||||
will also negate ad.doubleclick.com, ad.fr.doubleclick.net, etc.
|
|
||||||
|
|
||||||
- New in version 1.1.11: When running in IPv6 mode, pdnsd will now automatically
|
|
||||||
map any IPv4 addresses it reads in the config file to IPv6 addresses.
|
|
||||||
When pdnsd has been compiled with IPv6 support and runs in IPv4 mode, it will
|
|
||||||
skip IPv6 addresses with a warning message. This may result in certain server
|
|
||||||
sections becoming inactive, though.
|
|
||||||
|
|
||||||
The -4 and -6 options should now work as advertised.
|
|
||||||
I've added two new command-line options, "-a" and "-i <prefix>".
|
|
||||||
With the -a flag pdnsd will try to detect automatically if IPv6 support is
|
|
||||||
available on a system, and fall back to IPv4 if not. The -a flag can be used
|
|
||||||
instead of -4 or -6.
|
|
||||||
The -i option can be used to specify a prefix for mapping IPv4 to IPv6
|
|
||||||
address. The default is ::ffff.0.0.0.0. There is also a corresponding
|
|
||||||
ipv4_6_prefix= option for the config file.
|
|
||||||
|
|
||||||
- New in version 1.1.11: I've slightly changed the way pdnsd does parallel
|
|
||||||
queries. Active queries or not canceled until we have received a useful
|
|
||||||
response from a remote name server, or all the queries have failed or timed
|
|
||||||
out. Thus the par_queries parameter is no longer the maximum number of
|
|
||||||
parallel queries, but rather the increment with which the number of parallel
|
|
||||||
queries is increased when the previous set has timed out. In the worst case
|
|
||||||
there will be pending queries to all the servers in the list of available
|
|
||||||
servers simultaneously. We may be wasting more system resources this way, but
|
|
||||||
the advantage is that we have a greater chance of catching a reply. After all,
|
|
||||||
if we wait longer anyway, why not for more servers.
|
|
||||||
I've also introduced a global timeout parameter. This is the minimum period of
|
|
||||||
time pdnsd will wait after sending the first query to a remote server before
|
|
||||||
giving up without having received a reply. The timeout options in the
|
|
||||||
configuration file are now only minimum timeout intervals. Setting the global
|
|
||||||
timeout option makes it possible to specify quite short timeout intervals in
|
|
||||||
the server sections. This will have the effect that pdnsd will start querying
|
|
||||||
additional servers fairly quickly if the first servers are slow to respond
|
|
||||||
(but will still continue to listen for responses from the first ones). This
|
|
||||||
may allow pdnsd to get an answer more quickly in certain situations.
|
|
||||||
|
|
||||||
After receiving a reply from a remote server the server is marked up and its
|
|
||||||
time stamp is updated. This will have the effect that pdnsd doesn't bother
|
|
||||||
testing this server for availability for a period of time, and thus the
|
|
||||||
overhead caused by testing is reduced. After server timeouts, uptests are
|
|
||||||
performed by the separate server status thread, not by threads that have to
|
|
||||||
answer queries. Unresponsive servers with uptest=ping will not be marked down
|
|
||||||
immediately any more, but only after the ping test has definitely failed.
|
|
||||||
|
|
||||||
I've also included a number of bug-fixes contained in a patch file supplied to
|
|
||||||
me by Thomas Moestl. In addition to the things I had already fixed, the
|
|
||||||
following issues are addressed: some memory leaks, dropping of root privileges
|
|
||||||
before calling uptest scripts in case pdnsd was started setuid root (which is a
|
|
||||||
bad idea anyway), passing on open fd's to uptests, integer overruns in the
|
|
||||||
status reporting code, fixing string passing from the lexer, more consistent
|
|
||||||
treatment of underscores in domain names.
|
|
||||||
|
|
||||||
In addition to the things I've listed above, I've made various little changes to
|
|
||||||
fix minor bugs, improve efficiency or elegance, or simply to suit my my own
|
|
||||||
coding style. These changes are too numerous to list here, but some of them are
|
|
||||||
listed in the ChangeLog. Of course if you are really interested in the
|
|
||||||
nitty-gritty you can always compare the source of my version with Thomas'
|
|
||||||
original code.
|
|
||||||
|
|
||||||
If you have any questions about the modifications I've made, you can send these
|
|
||||||
to <p.a.rombouts@home.nl>. Questions about the original pdnsd version should
|
|
||||||
be sent to <tmoestl@gmx.net> or <t.moestl@tu-bs.de>.
|
|
|
@ -1,66 +0,0 @@
|
||||||
This is a (hopefully complete) list of people I have to thank for helping me
|
|
||||||
develop and improve pdnsd:
|
|
||||||
|
|
||||||
David G. Andersen
|
|
||||||
Andrew M. Bishop
|
|
||||||
Daniel Black
|
|
||||||
Carsten Block
|
|
||||||
Stephan Boettcher
|
|
||||||
P.J. Bostley
|
|
||||||
Rodney Brown
|
|
||||||
Kevin A. Burton
|
|
||||||
Juliusz Chroboczek
|
|
||||||
Joachim Dorner
|
|
||||||
Frank Elsner
|
|
||||||
Christian Engstler
|
|
||||||
Stefan Erhardt
|
|
||||||
Bjoern Fischer
|
|
||||||
Stefan Förster
|
|
||||||
Bert Frederiks
|
|
||||||
Mike Hammer
|
|
||||||
Jonathan Hudson
|
|
||||||
Torben Janssen
|
|
||||||
Byrial Jensen
|
|
||||||
Olaf Kirch
|
|
||||||
Nikola Kotur
|
|
||||||
Kiyo Kelvin Lee
|
|
||||||
Bernd Leibing
|
|
||||||
Patrick Loschmidt
|
|
||||||
James MacLean
|
|
||||||
Sourav K. Mandal
|
|
||||||
Fraser McCrossan
|
|
||||||
Markus Mohr
|
|
||||||
Michael Müller
|
|
||||||
Gustavo Niemeyer
|
|
||||||
Alexandre Nunes
|
|
||||||
Wolfgang Ocker
|
|
||||||
Mahesh T. Pai
|
|
||||||
Bernhard Pelz
|
|
||||||
Soenke J. Peters
|
|
||||||
Erich Reitz
|
|
||||||
Paul A. Rombouts
|
|
||||||
Brian Schroeder
|
|
||||||
Roman Shterenzon
|
|
||||||
Daniel Smolik
|
|
||||||
Milan P. Stanic
|
|
||||||
Michael Steiner
|
|
||||||
Norbert Steinl
|
|
||||||
Andreas Steinmetz
|
|
||||||
Marko Stolle
|
|
||||||
Markus Storm
|
|
||||||
Michael Ströder
|
|
||||||
Thomas Stromberg
|
|
||||||
Alan Swanson
|
|
||||||
Lyonel Vincent
|
|
||||||
Eelco Vriezekolk
|
|
||||||
Paul Wagland
|
|
||||||
Sverker Wiberg
|
|
||||||
Michael Wiedmann
|
|
||||||
Ron Yorston
|
|
||||||
Nikita V. Youshchenko
|
|
||||||
Jan-Marek Glogowski
|
|
||||||
Thomas Cort
|
|
||||||
Pierre Habouzit
|
|
||||||
Dirk Armbrust
|
|
||||||
Georg Schwarz
|
|
||||||
Ashish Shukla
|
|
|
@ -1,20 +0,0 @@
|
||||||
- Implement a reference counter to ensure that newly entered records are not
|
|
||||||
purged immediately (really needed?)
|
|
||||||
- Perhaps do a two-step form of recursive query: first query those servers we
|
|
||||||
have got cached, then (if unsuccessful) look the others up and query again.
|
|
||||||
The impact of this optimisation may not be very big, because all sane servers
|
|
||||||
give A records for NS records if possible.
|
|
||||||
- Test for compatibility on other Unix-like Systems other than the BSDs and
|
|
||||||
Linux; rewrite the functions in netdev.c and icmp.c for those OSs if
|
|
||||||
necessary. Also try to get compatibility for other compilers than gcc.
|
|
||||||
- Write an install rule for the Slackware start-up script.
|
|
||||||
- Update the FAQ.
|
|
||||||
- Implement DNSSEC support. Since version 1.2.9, pdnsd is able to cache the RR
|
|
||||||
types necessary for DNSSEC, but the resolver is not yet security aware.
|
|
||||||
- Implement a lookup table (hash table) for queries in progress. This would
|
|
||||||
enable a thread that is resolving a query that is already being handled by
|
|
||||||
another thread to wait for that other thread to finish and copy its result
|
|
||||||
rather than independently query remote servers. It is very common for
|
|
||||||
resolvers to resend UDP queries if they don't get a reply within a timeout
|
|
||||||
period and if the answer is not yet cached, this will result in multiple
|
|
||||||
threads duplicating each others work in the current implementation.
|
|
|
@ -1,191 +0,0 @@
|
||||||
#ifndef _CONFIG_H_
|
|
||||||
#define _CONFIG_H_
|
|
||||||
|
|
||||||
/* ONLY EDIT acconfig.h, NEVER config.h or config.h.in!
|
|
||||||
* config.h MAY BE OVERWRITTEN BY make, config.h.in by autoheader! */
|
|
||||||
|
|
||||||
/* Define your Target here. Currently defined are TARGET_LINUX (any
|
|
||||||
* architecture), TARGET_BSD (experimental; tested on FreeBSD, hopefully
|
|
||||||
* works for other BSD variants) and TARGET_CYGWIN. */
|
|
||||||
#define TARGET TARGET_LINUX
|
|
||||||
|
|
||||||
/* change the #undef to #define if you do not want to compile with special
|
|
||||||
* ISDN support for Linux. Note that the ISDN support will not compile ok on
|
|
||||||
* unpatched kernerls earlier than 2.2.12 (if you did apply newer isdn patches,
|
|
||||||
* it may work fine). This is not on by default because it will cause compile
|
|
||||||
* problems on some systems */
|
|
||||||
#undef ISDN_SUPPORT
|
|
||||||
|
|
||||||
/* The following regulates the IP Protocol support. Supported types are IPv4
|
|
||||||
* and IPv6 (aka IPng). You may enable either or both of these protocols.
|
|
||||||
* Enabling in this context means that support for the respective protocol
|
|
||||||
* will be in the binary. When running the binary, one of the protocols may
|
|
||||||
* be activated via command line switches. Note that activating both IPv4 and
|
|
||||||
* IPv6 is pointless (and will not work because two UDP and two TCP threads
|
|
||||||
* will be started that concur for ports). Because of that, it is not allowed.
|
|
||||||
* When pdnsd runs with IPv6 activated it should be able to service queries
|
|
||||||
* from IPv6 as well as from IPv4 hosts, provided that you host is configured
|
|
||||||
* properly.
|
|
||||||
* For each of the protocols there are two options: ENABLE_IPV4 and ENABLE_IPV6
|
|
||||||
* control whether support for the respective protocol is available in the
|
|
||||||
* binary. DEFAULT_IPV4 selects which protocol is enabled on pdnsd
|
|
||||||
* startup by default. 1 means IPv4, while 0 means IPv6. If support for
|
|
||||||
* a protocol was included in the executable, you can specify command line
|
|
||||||
* parameters to activate or deactivate that protocol (the options are -4 and
|
|
||||||
* -6), but it makes more sense to use the run_ipv4=on/off option in the
|
|
||||||
* configuration file.
|
|
||||||
* Make your choice. Note that IPv6 support is experimental in pdnsd.
|
|
||||||
* In normal operation, you will currently only need IPv4. */
|
|
||||||
#undef ENABLE_IPV4
|
|
||||||
#define DEFAULT_IPV4 1
|
|
||||||
#undef ENABLE_IPV6
|
|
||||||
|
|
||||||
/* In all pdnsd versions before 1.0.6, DNS queries were always done over
|
|
||||||
* TCP. Now, you have the choice. You can control that behaviour using
|
|
||||||
* the -m command line switch, and you can give a preset here. There
|
|
||||||
* are 3 different modes:
|
|
||||||
* UDP_ONLY: This is undoubtedly the fastest query method, because
|
|
||||||
* no TCP negotiation needs to be done.
|
|
||||||
* TCP_ONLY: This is slower than uo, but generally more secure
|
|
||||||
* against DNS spoofing. Note that some name servers on the
|
|
||||||
* internet do not support TCP queries, notably dnscache.
|
|
||||||
* TCP_UDP: TCP, then UDP. If the TCP query fails with a "connection refused"-
|
|
||||||
* error or times out, the query is retried using UDP.
|
|
||||||
* UDP_TCP: UDP, then TCP. If the UDP reply is truncated (i.e. the tc flag is set),
|
|
||||||
* the query is retried using TCP. */
|
|
||||||
#define M_PRESET UDP_ONLY
|
|
||||||
|
|
||||||
/* In addition to choosing the presets, you may also completely disable
|
|
||||||
* one of the protocols (TCP for preset UDP_ONLY and UDP for preset TCP_ONLY).
|
|
||||||
* This saves some executable space. */
|
|
||||||
#undef NO_UDP_QUERIES
|
|
||||||
#undef NO_TCP_QUERIES
|
|
||||||
|
|
||||||
/* With the following option, you can disable the TCP server functionality
|
|
||||||
* of pdnsd. Nearly no program does TCP queries, so you probably can do
|
|
||||||
* this safely and save some executable space and one thread.
|
|
||||||
* You also can turn off the TCP server at runtime with the --notcp option. */
|
|
||||||
#undef NO_TCP_SERVER
|
|
||||||
|
|
||||||
/* By undefining the following, you can disable the UDP source address
|
|
||||||
* discovery code. This is not recommended, but you may need it when
|
|
||||||
* running into compilation problems. */
|
|
||||||
#undef SRC_ADDR_DISC
|
|
||||||
|
|
||||||
/* NO_POLL specifies not to use poll(2), but select(2) instead. If you are
|
|
||||||
* unsure about what this means, just leave this as it is.*/
|
|
||||||
#undef NO_POLL
|
|
||||||
|
|
||||||
/* Define this for "hard" RFC 2181 compliance: this RFC states that
|
|
||||||
* implementations should discard answers whose RR sets have multiple
|
|
||||||
* different time stamps. While correct answers are generated, incorrect
|
|
||||||
* ones are normally tolerated and corrected. Full RFC compliance is
|
|
||||||
* however only achieved by deactivating this behaviour and thus being
|
|
||||||
* intolerant. */
|
|
||||||
#undef RFC2181_ME_HARDER
|
|
||||||
|
|
||||||
/* Define this to the device you want to use for getting random numbers.
|
|
||||||
* Leave this undefined if you wand to use the standard C library random
|
|
||||||
* function, which basically should be sufficient.
|
|
||||||
* Linux and FreeBSD have two random number devices: /dev/random and
|
|
||||||
* /dev/urandom. /dev/urandom might be less secure in some cases, but
|
|
||||||
* should still be more than sufficient. The use of /dev/random is
|
|
||||||
* discouraged, as reading from this device blocks when new random bits
|
|
||||||
* need to be gathered. */
|
|
||||||
#undef RANDOM_DEVICE
|
|
||||||
#undef R_DEFAULT
|
|
||||||
#undef R_RANDOM
|
|
||||||
#undef R_ARC4RANDOM
|
|
||||||
/*#define RANDOM_DEVICE "/dev/urandom"*/
|
|
||||||
|
|
||||||
/* Designate which database manager to use for cacheing.
|
|
||||||
* default: native; others: gdbm */
|
|
||||||
#define CACHE_DBM DBM_NATIVE
|
|
||||||
|
|
||||||
#define CACHEDIR "/var/cache/pdnsd"
|
|
||||||
|
|
||||||
#define TEMPDIR "/tmp";
|
|
||||||
|
|
||||||
/* This is for various debugging facilities that produce debug output and
|
|
||||||
* double-check some values. You can enable debug messages with the -g option.
|
|
||||||
* Normally, you can switch this off safely by setting the number after DEBUG
|
|
||||||
* to 0. This will increase speed (although only marginally), save space
|
|
||||||
* in the executable (only about 12kB) and some stack space per thread
|
|
||||||
* (which may be significant if you have many threads running simultaneously).
|
|
||||||
* However, it may be an aid when debugging config files.
|
|
||||||
* The only defined debug levels by now are in the range 0 - 9.
|
|
||||||
* Define this to 9 if you want hex dumps of all the queries and replies pdnsd
|
|
||||||
* receives (you must also call pdnsd with -v9 to actually see the hex dumps).
|
|
||||||
* When in doubt, leave it defined to 1. */
|
|
||||||
#define DEBUG 1
|
|
||||||
|
|
||||||
/* This defines the default verbosity of informational messages you will get.
|
|
||||||
This has nothing to to with the debug option (-g), but may be set with -v
|
|
||||||
option. 0 is for normal operation, up to 3 for debugging.
|
|
||||||
Unlike the debug messages, these messages will also be written to the syslog.*/
|
|
||||||
#define VERBOSITY 0
|
|
||||||
|
|
||||||
/* Redefine this if you want another hash size.
|
|
||||||
* The number of hash buckets is computed as power of two (1<<HASH_SZ);
|
|
||||||
* so e.g. HASH_SZ set to 10 yields 1024 hash rows.
|
|
||||||
* HASH_SZ may not be bigger than 32 (if you set it even close to that value,
|
|
||||||
* you are nuts.) */
|
|
||||||
#define HASH_SZ 10
|
|
||||||
|
|
||||||
/* Set this to debug the hash tables. Turn this off normally, or you will get
|
|
||||||
* flooded with diagnostic messages */
|
|
||||||
#undef DEBUG_HASH
|
|
||||||
|
|
||||||
/* Define if you have working C99 Variadic macro support */
|
|
||||||
#undef CPP_C99_VARIADIC_MACROS
|
|
||||||
|
|
||||||
/* Define as int if socklen_t typedef is missing */
|
|
||||||
#undef socklen_t
|
|
||||||
|
|
||||||
/* Lock the UDP socket before using it? */
|
|
||||||
#undef SOCKET_LOCKING
|
|
||||||
|
|
||||||
/* Default TCP timeout when receiving queries */
|
|
||||||
#define TCP_TIMEOUT 30
|
|
||||||
|
|
||||||
/* Allow subsequent TCP queries on one connection? */
|
|
||||||
#undef TCP_SUBSEQ
|
|
||||||
|
|
||||||
/* Default value for parallel query number */
|
|
||||||
#define PAR_QUERIES 2
|
|
||||||
|
|
||||||
/* Maximum number of IP addresses used per nameserver obtained from NS records. */
|
|
||||||
#define MAXNAMESERVIPS 3
|
|
||||||
|
|
||||||
/* These are the possible targets. Normally no need to touch these
|
|
||||||
* definitions. */
|
|
||||||
#define TARGET_LINUX 0
|
|
||||||
#define TARGET_BSD 1
|
|
||||||
#define TARGET_CYGWIN 2
|
|
||||||
|
|
||||||
/* Assume the Native POSIX Thread Library instead of LinuxThreads ? */
|
|
||||||
#undef THREADLIB_NPTL
|
|
||||||
|
|
||||||
/* If we are using LinuxThreads, implement the fix needed for newer glibcs ? */
|
|
||||||
#undef THREADLIB_LINUXTHREADS2
|
|
||||||
|
|
||||||
/* The following is needed for using LinuxThreads. Better don't touch. */
|
|
||||||
#define _REENTRANT 1
|
|
||||||
#define _THREAD_SAFE 1
|
|
||||||
|
|
||||||
/* It appears the newer versions of gcc won't convert a pointer to char into
|
|
||||||
a pointer to unsigned char and vice versa without complaining.
|
|
||||||
By using casts these warning messages can be suppressed, but at the cost
|
|
||||||
of losing some type safety.
|
|
||||||
Define charp and ucharp to be empty if you are a developer and find type
|
|
||||||
safety more important.
|
|
||||||
Leave the definitions unchanged to avoid distracting warning messages. */
|
|
||||||
#define charp (char *)
|
|
||||||
#define ucharp (unsigned char *)
|
|
||||||
|
|
||||||
|
|
||||||
/* pdnsd version. DO NOT TOUCH THIS! It is replaced automatically by the
|
|
||||||
* contents of ./version */
|
|
||||||
#define VERSION "@VERSION@"
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,142 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand `-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2005-05-14.22
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand `-c -o'.
|
|
||||||
Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file `INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
eat=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as `compile cc -o foo foo.c'.
|
|
||||||
# So we strip `-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no `-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# `.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use `[/.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
|
@ -1,437 +0,0 @@
|
||||||
/* config.h. Generated from config.h.in by configure. */
|
|
||||||
/* config.h.in. Generated from configure.in by autoheader. */
|
|
||||||
#ifndef _CONFIG_H_
|
|
||||||
#define _CONFIG_H_
|
|
||||||
|
|
||||||
/* ONLY EDIT acconfig.h, NEVER config.h or config.h.in!
|
|
||||||
* config.h MAY BE OVERWRITTEN BY make, config.h.in by autoheader! */
|
|
||||||
|
|
||||||
/* Define your Target here. Currently defined are TARGET_LINUX (any
|
|
||||||
* architecture), TARGET_BSD (experimental; tested on FreeBSD, hopefully
|
|
||||||
* works for other BSD variants) and TARGET_CYGWIN. */
|
|
||||||
#define TARGET TARGET_LINUX
|
|
||||||
|
|
||||||
/* change the #undef to #define if you do not want to compile with special
|
|
||||||
* ISDN support for Linux. Note that the ISDN support will not compile ok on
|
|
||||||
* unpatched kernerls earlier than 2.2.12 (if you did apply newer isdn patches,
|
|
||||||
* it may work fine). This is not on by default because it will cause compile
|
|
||||||
* problems on some systems */
|
|
||||||
/* #undef ISDN_SUPPORT */
|
|
||||||
|
|
||||||
/* The following regulates the IP Protocol support. Supported types are IPv4
|
|
||||||
* and IPv6 (aka IPng). You may enable either or both of these protocols.
|
|
||||||
* Enabling in this context means that support for the respective protocol
|
|
||||||
* will be in the binary. When running the binary, one of the protocols may
|
|
||||||
* be activated via command line switches. Note that activating both IPv4 and
|
|
||||||
* IPv6 is pointless (and will not work because two UDP and two TCP threads
|
|
||||||
* will be started that concur for ports). Because of that, it is not allowed.
|
|
||||||
* When pdnsd runs with IPv6 activated it should be able to service queries
|
|
||||||
* from IPv6 as well as from IPv4 hosts, provided that you host is configured
|
|
||||||
* properly.
|
|
||||||
* For each of the protocols there are two options: ENABLE_IPV4 and ENABLE_IPV6
|
|
||||||
* control whether support for the respective protocol is available in the
|
|
||||||
* binary. DEFAULT_IPV4 selects which protocol is enabled on pdnsd
|
|
||||||
* startup by default. 1 means IPv4, while 0 means IPv6. If support for
|
|
||||||
* a protocol was included in the executable, you can specify command line
|
|
||||||
* parameters to activate or deactivate that protocol (the options are -4 and
|
|
||||||
* -6), but it makes more sense to use the run_ipv4=on/off option in the
|
|
||||||
* configuration file.
|
|
||||||
* Make your choice. Note that IPv6 support is experimental in pdnsd.
|
|
||||||
* In normal operation, you will currently only need IPv4. */
|
|
||||||
#define ENABLE_IPV4 1
|
|
||||||
#define DEFAULT_IPV4 1
|
|
||||||
#undef ENABLE_IPV6
|
|
||||||
|
|
||||||
/* In all pdnsd versions before 1.0.6, DNS queries were always done over
|
|
||||||
* TCP. Now, you have the choice. You can control that behaviour using
|
|
||||||
* the -m command line switch, and you can give a preset here. There
|
|
||||||
* are 3 different modes:
|
|
||||||
* UDP_ONLY: This is undoubtedly the fastest query method, because
|
|
||||||
* no TCP negotiation needs to be done.
|
|
||||||
* TCP_ONLY: This is slower than uo, but generally more secure
|
|
||||||
* against DNS spoofing. Note that some name servers on the
|
|
||||||
* internet do not support TCP queries, notably dnscache.
|
|
||||||
* TCP_UDP: TCP, then UDP. If the TCP query fails with a "connection refused"-
|
|
||||||
* error or times out, the query is retried using UDP.
|
|
||||||
* UDP_TCP: UDP, then TCP. If the UDP reply is truncated (i.e. the tc flag is set),
|
|
||||||
* the query is retried using TCP. */
|
|
||||||
#define M_PRESET TCP_ONLY
|
|
||||||
|
|
||||||
/* In addition to choosing the presets, you may also completely disable
|
|
||||||
* one of the protocols (TCP for preset UDP_ONLY and UDP for preset TCP_ONLY).
|
|
||||||
* This saves some executable space. */
|
|
||||||
/* #undef NO_UDP_QUERIES */
|
|
||||||
/* #undef NO_TCP_QUERIES */
|
|
||||||
|
|
||||||
/* With the following option, you can disable the TCP server functionality
|
|
||||||
* of pdnsd. Nearly no program does TCP queries, so you probably can do
|
|
||||||
* this safely and save some executable space and one thread.
|
|
||||||
* You also can turn off the TCP server at runtime with the --notcp option. */
|
|
||||||
/* #undef NO_TCP_SERVER */
|
|
||||||
|
|
||||||
/* By undefining the following, you can disable the UDP source address
|
|
||||||
* discovery code. This is not recommended, but you may need it when
|
|
||||||
* running into compilation problems. */
|
|
||||||
#define SRC_ADDR_DISC 1
|
|
||||||
|
|
||||||
/* NO_POLL specifies not to use poll(2), but select(2) instead. If you are
|
|
||||||
* unsure about what this means, just leave this as it is.*/
|
|
||||||
/* #undef NO_POLL */
|
|
||||||
|
|
||||||
/* Define this for "hard" RFC 2181 compliance: this RFC states that
|
|
||||||
* implementations should discard answers whose RR sets have multiple
|
|
||||||
* different time stamps. While correct answers are generated, incorrect
|
|
||||||
* ones are normally tolerated and corrected. Full RFC compliance is
|
|
||||||
* however only achieved by deactivating this behaviour and thus being
|
|
||||||
* intolerant. */
|
|
||||||
/* #undef RFC2181_ME_HARDER */
|
|
||||||
|
|
||||||
/* Define this to the device you want to use for getting random numbers.
|
|
||||||
* Leave this undefined if you wand to use the standard C library random
|
|
||||||
* function, which basically should be sufficient.
|
|
||||||
* Linux and FreeBSD have two random number devices: /dev/random and
|
|
||||||
* /dev/urandom. /dev/urandom might be less secure in some cases, but
|
|
||||||
* should still be more than sufficient. The use of /dev/random is
|
|
||||||
* discouraged, as reading from this device blocks when new random bits
|
|
||||||
* need to be gathered. */
|
|
||||||
/* #undef RANDOM_DEVICE */
|
|
||||||
#define R_DEFAULT 1
|
|
||||||
/* #undef R_RANDOM */
|
|
||||||
/* #undef R_ARC4RANDOM */
|
|
||||||
/*#define RANDOM_DEVICE "/dev/urandom"*/
|
|
||||||
|
|
||||||
/* Designate which database manager to use for cacheing.
|
|
||||||
* default: native; others: gdbm */
|
|
||||||
#define CACHE_DBM DBM_NATIVE
|
|
||||||
|
|
||||||
#define CONFDIR "/data/data/net.typeblog.socks"
|
|
||||||
|
|
||||||
#define CACHEDIR "/data/data/net.typeblog.socks"
|
|
||||||
|
|
||||||
#define TEMPDIR "/data/data/net.typeblog.socks/cache";
|
|
||||||
|
|
||||||
/* This is for various debugging facilities that produce debug output and
|
|
||||||
* double-check some values. You can enable debug messages with the -g option.
|
|
||||||
* Normally, you can switch this off safely by setting the number after DEBUG
|
|
||||||
* to 0. This will increase speed (although only marginally), save space
|
|
||||||
* in the executable (only about 12kB) and some stack space per thread
|
|
||||||
* (which may be significant if you have many threads running simultaneously).
|
|
||||||
* However, it may be an aid when debugging config files.
|
|
||||||
* The only defined debug levels by now are in the range 0 - 9.
|
|
||||||
* Define this to 9 if you want hex dumps of all the queries and replies pdnsd
|
|
||||||
* receives (you must also call pdnsd with -v9 to actually see the hex dumps).
|
|
||||||
* When in doubt, leave it defined to 1. */
|
|
||||||
#define DEBUG 1
|
|
||||||
|
|
||||||
/* This defines the default verbosity of informational messages you will get.
|
|
||||||
This has nothing to to with the debug option (-g), but may be set with -v
|
|
||||||
option. 0 is for normal operation, up to 3 for debugging.
|
|
||||||
Unlike the debug messages, these messages will also be written to the syslog.*/
|
|
||||||
#define VERBOSITY 0
|
|
||||||
|
|
||||||
/* Redefine this if you want another hash size.
|
|
||||||
* The number of hash buckets is computed as power of two (1<<HASH_SZ);
|
|
||||||
* so e.g. HASH_SZ set to 10 yields 1024 hash rows.
|
|
||||||
* HASH_SZ may not be bigger than 32 (if you set it even close to that value,
|
|
||||||
* you are nuts.) */
|
|
||||||
#define HASH_SZ 10
|
|
||||||
|
|
||||||
/* Set this to debug the hash tables. Turn this off normally, or you will get
|
|
||||||
* flooded with diagnostic messages */
|
|
||||||
/* #undef DEBUG_HASH */
|
|
||||||
|
|
||||||
/* Define if you have working C99 Variadic macro support */
|
|
||||||
#define CPP_C99_VARIADIC_MACROS 1
|
|
||||||
|
|
||||||
/* Define as int if socklen_t typedef is missing */
|
|
||||||
/* #undef socklen_t */
|
|
||||||
|
|
||||||
/* Lock the UDP socket before using it? */
|
|
||||||
/* #undef SOCKET_LOCKING */
|
|
||||||
|
|
||||||
/* Default TCP timeout when receiving queries */
|
|
||||||
#define TCP_TIMEOUT 5
|
|
||||||
|
|
||||||
/* Allow subsequent TCP queries on one connection? */
|
|
||||||
/* #undef TCP_SUBSEQ */
|
|
||||||
|
|
||||||
/* Default value for parallel query number */
|
|
||||||
#define PAR_QUERIES 4
|
|
||||||
|
|
||||||
/* Maximum number of IP addresses used per nameserver obtained from NS records. */
|
|
||||||
#define MAXNAMESERVIPS 3
|
|
||||||
|
|
||||||
/* These are the possible targets. Normally no need to touch these
|
|
||||||
* definitions. */
|
|
||||||
#define TARGET_LINUX 0
|
|
||||||
#define TARGET_BSD 1
|
|
||||||
#define TARGET_CYGWIN 2
|
|
||||||
|
|
||||||
/* Assume the Native POSIX Thread Library instead of LinuxThreads ? */
|
|
||||||
#define THREADLIB_NPTL 1
|
|
||||||
|
|
||||||
/* If we are using LinuxThreads, implement the fix needed for newer glibcs ? */
|
|
||||||
/* #undef THREADLIB_LINUXTHREADS2 */
|
|
||||||
|
|
||||||
/* The following is needed for using LinuxThreads. Better don't touch. */
|
|
||||||
#define _REENTRANT 1
|
|
||||||
#define _THREAD_SAFE 1
|
|
||||||
|
|
||||||
/* It appears the newer versions of gcc won't convert a pointer to char into
|
|
||||||
a pointer to unsigned char and vice versa without complaining.
|
|
||||||
By using casts these warning messages can be suppressed, but at the cost
|
|
||||||
of losing some type safety.
|
|
||||||
Define charp and ucharp to be empty if you are a developer and find type
|
|
||||||
safety more important.
|
|
||||||
Leave the definitions unchanged to avoid distracting warning messages. */
|
|
||||||
#define charp (char *)
|
|
||||||
#define ucharp (unsigned char *)
|
|
||||||
|
|
||||||
|
|
||||||
/* pdnsd version. DO NOT TOUCH THIS! It is replaced automatically by the
|
|
||||||
* contents of ./version */
|
|
||||||
#define VERSION "1.2.9a-par"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
|
|
||||||
systems. This function is required for `alloca.c' support on those systems.
|
|
||||||
*/
|
|
||||||
/* #undef CRAY_STACKSEG_END */
|
|
||||||
|
|
||||||
/* Define to 1 if using `alloca.c'. */
|
|
||||||
/* #undef C_ALLOCA */
|
|
||||||
|
|
||||||
/* Define to 1 if you have `alloca', as a function or macro. */
|
|
||||||
#define HAVE_ALLOCA 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
|
|
||||||
*/
|
|
||||||
#define HAVE_ALLOCA_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `asprintf' function. */
|
|
||||||
#define HAVE_ASPRINTF 1
|
|
||||||
|
|
||||||
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
|
||||||
/* #undef HAVE_DOPRNT */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
||||||
#define HAVE_FCNTL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getline' function. */
|
|
||||||
#if defined(__aarch64__) || defined(__x86_64__)
|
|
||||||
#define HAVE_GETLINE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getpwnam_r' function. */
|
|
||||||
//#define HAVE_GETPWNAM_R 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `gettimeofday' function. */
|
|
||||||
#define HAVE_GETTIMEOFDAY 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `inet_ntop' function. */
|
|
||||||
#define HAVE_INET_NTOP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `inet_pton' function. */
|
|
||||||
#define HAVE_INET_PTON 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
|
||||||
#define HAVE_LIBPTHREAD 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#define HAVE_MALLOC_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mempcpy' function. */
|
|
||||||
//#define HAVE_MEMPCPY 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mkfifo' function. */
|
|
||||||
#define HAVE_MKFIFO 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `nanosleep' function. */
|
|
||||||
#define HAVE_NANOSLEEP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
|
||||||
#define HAVE_NETINET_IN_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <net/if.h> header file. */
|
|
||||||
#define HAVE_NET_IF_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `poll' function. */
|
|
||||||
#define HAVE_POLL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `select' function. */
|
|
||||||
#define HAVE_SELECT 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `snprintf' function. */
|
|
||||||
#define HAVE_SNPRINTF 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `socket' function. */
|
|
||||||
#define HAVE_SOCKET 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `socklen_t'. */
|
|
||||||
#define HAVE_SOCKLEN_T 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#define HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `stpcpy' function. */
|
|
||||||
#if defined(__aarch64__) || defined(__x86_64__)
|
|
||||||
#define HAVE_STPCPY 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `stpncpy' function. */
|
|
||||||
//#define HAVE_STPNCPY 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strdup' function. */
|
|
||||||
#define HAVE_STRDUP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strerror' function. */
|
|
||||||
#define HAVE_STRERROR 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#define HAVE_STRINGS_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strlcpy' function. */
|
|
||||||
/* #undef HAVE_STRLCPY */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strndup' function. */
|
|
||||||
#define HAVE_STRNDUP 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct ifreq'. */
|
|
||||||
#define HAVE_STRUCT_IFREQ 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct in6_addr'. */
|
|
||||||
#define HAVE_STRUCT_IN6_ADDR 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct in_pktinfo'. */
|
|
||||||
#define HAVE_STRUCT_IN_PKTINFO 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <syslog.h> header file. */
|
|
||||||
#define HAVE_SYSLOG_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
|
||||||
#define HAVE_SYS_IOCTL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/poll.h> header file. */
|
|
||||||
#define HAVE_SYS_POLL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
|
||||||
#define HAVE_SYS_SOCKET_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
|
||||||
#define HAVE_SYS_TIME_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
|
|
||||||
#define HAVE_SYS_WAIT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `uname' function. */
|
|
||||||
#define HAVE_UNAME 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `vasprintf' function. */
|
|
||||||
#define HAVE_VASPRINTF 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `vprintf' function. */
|
|
||||||
#define HAVE_VPRINTF 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `vsnprintf' function. */
|
|
||||||
#define HAVE_VSNPRINTF 1
|
|
||||||
|
|
||||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
|
||||||
/* #undef NO_MINUS_C_MINUS_O */
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#define PACKAGE_BUGREPORT ""
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#define PACKAGE_NAME ""
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#define PACKAGE_STRING ""
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#define PACKAGE_TARNAME ""
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#define PACKAGE_VERSION ""
|
|
||||||
|
|
||||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
|
||||||
#define RETSIGTYPE void
|
|
||||||
|
|
||||||
/* If using the C implementation of alloca, define if you know the
|
|
||||||
direction of stack growth for your system; otherwise it will be
|
|
||||||
automatically deduced at runtime.
|
|
||||||
STACK_DIRECTION > 0 => grows toward higher addresses
|
|
||||||
STACK_DIRECTION < 0 => grows toward lower addresses
|
|
||||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
|
||||||
/* #undef STACK_DIRECTION */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
|
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
|
||||||
#define TIME_WITH_SYS_TIME 1
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
/* #undef TM_IN_SYS_TIME */
|
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
|
||||||
#ifndef _ALL_SOURCE
|
|
||||||
# define _ALL_SOURCE 1
|
|
||||||
#endif
|
|
||||||
/* Enable GNU extensions on systems that have them. */
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
# define _GNU_SOURCE 1
|
|
||||||
#endif
|
|
||||||
/* Enable threading extensions on Solaris. */
|
|
||||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
# define _POSIX_PTHREAD_SEMANTICS 1
|
|
||||||
#endif
|
|
||||||
/* Enable extensions on HP NonStop. */
|
|
||||||
#ifndef _TANDEM_SOURCE
|
|
||||||
# define _TANDEM_SOURCE 1
|
|
||||||
#endif
|
|
||||||
/* Enable general extensions on Solaris. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# define __EXTENSIONS__ 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Define to 1 if on MINIX. */
|
|
||||||
/* #undef _MINIX */
|
|
||||||
|
|
||||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
|
||||||
this defined. */
|
|
||||||
/* #undef _POSIX_1_SOURCE */
|
|
||||||
|
|
||||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
|
||||||
/* #undef _POSIX_SOURCE */
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
/* #undef const */
|
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef pid_t */
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef size_t */
|
|
|
@ -1,430 +0,0 @@
|
||||||
/* config.h.in. Generated from configure.in by autoheader. */
|
|
||||||
#ifndef _CONFIG_H_
|
|
||||||
#define _CONFIG_H_
|
|
||||||
|
|
||||||
/* ONLY EDIT acconfig.h, NEVER config.h or config.h.in!
|
|
||||||
* config.h MAY BE OVERWRITTEN BY make, config.h.in by autoheader! */
|
|
||||||
|
|
||||||
/* Define your Target here. Currently defined are TARGET_LINUX (any
|
|
||||||
* architecture), TARGET_BSD (experimental; tested on FreeBSD, hopefully
|
|
||||||
* works for other BSD variants) and TARGET_CYGWIN. */
|
|
||||||
#define TARGET TARGET_LINUX
|
|
||||||
|
|
||||||
/* change the #undef to #define if you do not want to compile with special
|
|
||||||
* ISDN support for Linux. Note that the ISDN support will not compile ok on
|
|
||||||
* unpatched kernerls earlier than 2.2.12 (if you did apply newer isdn patches,
|
|
||||||
* it may work fine). This is not on by default because it will cause compile
|
|
||||||
* problems on some systems */
|
|
||||||
#undef ISDN_SUPPORT
|
|
||||||
|
|
||||||
/* The following regulates the IP Protocol support. Supported types are IPv4
|
|
||||||
* and IPv6 (aka IPng). You may enable either or both of these protocols.
|
|
||||||
* Enabling in this context means that support for the respective protocol
|
|
||||||
* will be in the binary. When running the binary, one of the protocols may
|
|
||||||
* be activated via command line switches. Note that activating both IPv4 and
|
|
||||||
* IPv6 is pointless (and will not work because two UDP and two TCP threads
|
|
||||||
* will be started that concur for ports). Because of that, it is not allowed.
|
|
||||||
* When pdnsd runs with IPv6 activated it should be able to service queries
|
|
||||||
* from IPv6 as well as from IPv4 hosts, provided that you host is configured
|
|
||||||
* properly.
|
|
||||||
* For each of the protocols there are two options: ENABLE_IPV4 and ENABLE_IPV6
|
|
||||||
* control whether support for the respective protocol is available in the
|
|
||||||
* binary. DEFAULT_IPV4 selects which protocol is enabled on pdnsd
|
|
||||||
* startup by default. 1 means IPv4, while 0 means IPv6. If support for
|
|
||||||
* a protocol was included in the executable, you can specify command line
|
|
||||||
* parameters to activate or deactivate that protocol (the options are -4 and
|
|
||||||
* -6), but it makes more sense to use the run_ipv4=on/off option in the
|
|
||||||
* configuration file.
|
|
||||||
* Make your choice. Note that IPv6 support is experimental in pdnsd.
|
|
||||||
* In normal operation, you will currently only need IPv4. */
|
|
||||||
#undef ENABLE_IPV4
|
|
||||||
#define DEFAULT_IPV4 1
|
|
||||||
#undef ENABLE_IPV6
|
|
||||||
|
|
||||||
/* In all pdnsd versions before 1.0.6, DNS queries were always done over
|
|
||||||
* TCP. Now, you have the choice. You can control that behaviour using
|
|
||||||
* the -m command line switch, and you can give a preset here. There
|
|
||||||
* are 3 different modes:
|
|
||||||
* UDP_ONLY: This is undoubtedly the fastest query method, because
|
|
||||||
* no TCP negotiation needs to be done.
|
|
||||||
* TCP_ONLY: This is slower than uo, but generally more secure
|
|
||||||
* against DNS spoofing. Note that some name servers on the
|
|
||||||
* internet do not support TCP queries, notably dnscache.
|
|
||||||
* TCP_UDP: TCP, then UDP. If the TCP query fails with a "connection refused"-
|
|
||||||
* error or times out, the query is retried using UDP.
|
|
||||||
* UDP_TCP: UDP, then TCP. If the UDP reply is truncated (i.e. the tc flag is set),
|
|
||||||
* the query is retried using TCP. */
|
|
||||||
#define M_PRESET UDP_ONLY
|
|
||||||
|
|
||||||
/* In addition to choosing the presets, you may also completely disable
|
|
||||||
* one of the protocols (TCP for preset UDP_ONLY and UDP for preset TCP_ONLY).
|
|
||||||
* This saves some executable space. */
|
|
||||||
#undef NO_UDP_QUERIES
|
|
||||||
#undef NO_TCP_QUERIES
|
|
||||||
|
|
||||||
/* With the following option, you can disable the TCP server functionality
|
|
||||||
* of pdnsd. Nearly no program does TCP queries, so you probably can do
|
|
||||||
* this safely and save some executable space and one thread.
|
|
||||||
* You also can turn off the TCP server at runtime with the --notcp option. */
|
|
||||||
#undef NO_TCP_SERVER
|
|
||||||
|
|
||||||
/* By undefining the following, you can disable the UDP source address
|
|
||||||
* discovery code. This is not recommended, but you may need it when
|
|
||||||
* running into compilation problems. */
|
|
||||||
#undef SRC_ADDR_DISC
|
|
||||||
|
|
||||||
/* NO_POLL specifies not to use poll(2), but select(2) instead. If you are
|
|
||||||
* unsure about what this means, just leave this as it is.*/
|
|
||||||
#undef NO_POLL
|
|
||||||
|
|
||||||
/* Define this for "hard" RFC 2181 compliance: this RFC states that
|
|
||||||
* implementations should discard answers whose RR sets have multiple
|
|
||||||
* different time stamps. While correct answers are generated, incorrect
|
|
||||||
* ones are normally tolerated and corrected. Full RFC compliance is
|
|
||||||
* however only achieved by deactivating this behaviour and thus being
|
|
||||||
* intolerant. */
|
|
||||||
#undef RFC2181_ME_HARDER
|
|
||||||
|
|
||||||
/* Define this to the device you want to use for getting random numbers.
|
|
||||||
* Leave this undefined if you wand to use the standard C library random
|
|
||||||
* function, which basically should be sufficient.
|
|
||||||
* Linux and FreeBSD have two random number devices: /dev/random and
|
|
||||||
* /dev/urandom. /dev/urandom might be less secure in some cases, but
|
|
||||||
* should still be more than sufficient. The use of /dev/random is
|
|
||||||
* discouraged, as reading from this device blocks when new random bits
|
|
||||||
* need to be gathered. */
|
|
||||||
#undef RANDOM_DEVICE
|
|
||||||
#undef R_DEFAULT
|
|
||||||
#undef R_RANDOM
|
|
||||||
#undef R_ARC4RANDOM
|
|
||||||
/*#define RANDOM_DEVICE "/dev/urandom"*/
|
|
||||||
|
|
||||||
/* Designate which database manager to use for cacheing.
|
|
||||||
* default: native; others: gdbm */
|
|
||||||
#define CACHE_DBM DBM_NATIVE
|
|
||||||
|
|
||||||
#define CACHEDIR "/var/cache/pdnsd"
|
|
||||||
|
|
||||||
#define TEMPDIR "/tmp";
|
|
||||||
|
|
||||||
/* This is for various debugging facilities that produce debug output and
|
|
||||||
* double-check some values. You can enable debug messages with the -g option.
|
|
||||||
* Normally, you can switch this off safely by setting the number after DEBUG
|
|
||||||
* to 0. This will increase speed (although only marginally), save space
|
|
||||||
* in the executable (only about 12kB) and some stack space per thread
|
|
||||||
* (which may be significant if you have many threads running simultaneously).
|
|
||||||
* However, it may be an aid when debugging config files.
|
|
||||||
* The only defined debug levels by now are in the range 0 - 9.
|
|
||||||
* Define this to 9 if you want hex dumps of all the queries and replies pdnsd
|
|
||||||
* receives (you must also call pdnsd with -v9 to actually see the hex dumps).
|
|
||||||
* When in doubt, leave it defined to 1. */
|
|
||||||
#define DEBUG 1
|
|
||||||
|
|
||||||
/* This defines the default verbosity of informational messages you will get.
|
|
||||||
This has nothing to to with the debug option (-g), but may be set with -v
|
|
||||||
option. 0 is for normal operation, up to 3 for debugging.
|
|
||||||
Unlike the debug messages, these messages will also be written to the syslog.*/
|
|
||||||
#define VERBOSITY 0
|
|
||||||
|
|
||||||
/* Redefine this if you want another hash size.
|
|
||||||
* The number of hash buckets is computed as power of two (1<<HASH_SZ);
|
|
||||||
* so e.g. HASH_SZ set to 10 yields 1024 hash rows.
|
|
||||||
* HASH_SZ may not be bigger than 32 (if you set it even close to that value,
|
|
||||||
* you are nuts.) */
|
|
||||||
#define HASH_SZ 10
|
|
||||||
|
|
||||||
/* Set this to debug the hash tables. Turn this off normally, or you will get
|
|
||||||
* flooded with diagnostic messages */
|
|
||||||
#undef DEBUG_HASH
|
|
||||||
|
|
||||||
/* Define if you have working C99 Variadic macro support */
|
|
||||||
#undef CPP_C99_VARIADIC_MACROS
|
|
||||||
|
|
||||||
/* Define as int if socklen_t typedef is missing */
|
|
||||||
#undef socklen_t
|
|
||||||
|
|
||||||
/* Lock the UDP socket before using it? */
|
|
||||||
#undef SOCKET_LOCKING
|
|
||||||
|
|
||||||
/* Default TCP timeout when receiving queries */
|
|
||||||
#define TCP_TIMEOUT 30
|
|
||||||
|
|
||||||
/* Allow subsequent TCP queries on one connection? */
|
|
||||||
#undef TCP_SUBSEQ
|
|
||||||
|
|
||||||
/* Default value for parallel query number */
|
|
||||||
#define PAR_QUERIES 2
|
|
||||||
|
|
||||||
/* Maximum number of IP addresses used per nameserver obtained from NS records. */
|
|
||||||
#define MAXNAMESERVIPS 3
|
|
||||||
|
|
||||||
/* These are the possible targets. Normally no need to touch these
|
|
||||||
* definitions. */
|
|
||||||
#define TARGET_LINUX 0
|
|
||||||
#define TARGET_BSD 1
|
|
||||||
#define TARGET_CYGWIN 2
|
|
||||||
|
|
||||||
/* Assume the Native POSIX Thread Library instead of LinuxThreads ? */
|
|
||||||
#undef THREADLIB_NPTL
|
|
||||||
|
|
||||||
/* If we are using LinuxThreads, implement the fix needed for newer glibcs ? */
|
|
||||||
#undef THREADLIB_LINUXTHREADS2
|
|
||||||
|
|
||||||
/* The following is needed for using LinuxThreads. Better don't touch. */
|
|
||||||
#define _REENTRANT 1
|
|
||||||
#define _THREAD_SAFE 1
|
|
||||||
|
|
||||||
/* It appears the newer versions of gcc won't convert a pointer to char into
|
|
||||||
a pointer to unsigned char and vice versa without complaining.
|
|
||||||
By using casts these warning messages can be suppressed, but at the cost
|
|
||||||
of losing some type safety.
|
|
||||||
Define charp and ucharp to be empty if you are a developer and find type
|
|
||||||
safety more important.
|
|
||||||
Leave the definitions unchanged to avoid distracting warning messages. */
|
|
||||||
#define charp (char *)
|
|
||||||
#define ucharp (unsigned char *)
|
|
||||||
|
|
||||||
|
|
||||||
/* pdnsd version. DO NOT TOUCH THIS! It is replaced automatically by the
|
|
||||||
* contents of ./version */
|
|
||||||
#define VERSION "@VERSION@"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
|
|
||||||
systems. This function is required for `alloca.c' support on those systems.
|
|
||||||
*/
|
|
||||||
#undef CRAY_STACKSEG_END
|
|
||||||
|
|
||||||
/* Define to 1 if using `alloca.c'. */
|
|
||||||
#undef C_ALLOCA
|
|
||||||
|
|
||||||
/* Define to 1 if you have `alloca', as a function or macro. */
|
|
||||||
#undef HAVE_ALLOCA
|
|
||||||
|
|
||||||
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
|
|
||||||
*/
|
|
||||||
#undef HAVE_ALLOCA_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `asprintf' function. */
|
|
||||||
#undef HAVE_ASPRINTF
|
|
||||||
|
|
||||||
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
|
||||||
#undef HAVE_DOPRNT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
||||||
#undef HAVE_FCNTL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getline' function. */
|
|
||||||
#undef HAVE_GETLINE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getpwnam_r' function. */
|
|
||||||
#undef HAVE_GETPWNAM_R
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `gettimeofday' function. */
|
|
||||||
#undef HAVE_GETTIMEOFDAY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `inet_ntop' function. */
|
|
||||||
#undef HAVE_INET_NTOP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `inet_pton' function. */
|
|
||||||
#undef HAVE_INET_PTON
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
|
||||||
#undef HAVE_LIBPTHREAD
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#undef HAVE_MALLOC_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mempcpy' function. */
|
|
||||||
#undef HAVE_MEMPCPY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mkfifo' function. */
|
|
||||||
#undef HAVE_MKFIFO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `nanosleep' function. */
|
|
||||||
#undef HAVE_NANOSLEEP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
|
||||||
#undef HAVE_NETINET_IN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <net/if.h> header file. */
|
|
||||||
#undef HAVE_NET_IF_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `poll' function. */
|
|
||||||
#undef HAVE_POLL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `select' function. */
|
|
||||||
#undef HAVE_SELECT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `snprintf' function. */
|
|
||||||
#undef HAVE_SNPRINTF
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `socket' function. */
|
|
||||||
#undef HAVE_SOCKET
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `socklen_t'. */
|
|
||||||
#undef HAVE_SOCKLEN_T
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `stpcpy' function. */
|
|
||||||
#undef HAVE_STPCPY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `stpncpy' function. */
|
|
||||||
#undef HAVE_STPNCPY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strdup' function. */
|
|
||||||
#undef HAVE_STRDUP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strerror' function. */
|
|
||||||
#undef HAVE_STRERROR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strlcpy' function. */
|
|
||||||
#undef HAVE_STRLCPY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strndup' function. */
|
|
||||||
#undef HAVE_STRNDUP
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct ifreq'. */
|
|
||||||
#undef HAVE_STRUCT_IFREQ
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct in6_addr'. */
|
|
||||||
#undef HAVE_STRUCT_IN6_ADDR
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct in_pktinfo'. */
|
|
||||||
#undef HAVE_STRUCT_IN_PKTINFO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <syslog.h> header file. */
|
|
||||||
#undef HAVE_SYSLOG_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
|
||||||
#undef HAVE_SYS_IOCTL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/poll.h> header file. */
|
|
||||||
#undef HAVE_SYS_POLL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
|
||||||
#undef HAVE_SYS_SOCKET_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
|
||||||
#undef HAVE_SYS_TIME_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
|
|
||||||
#undef HAVE_SYS_WAIT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `uname' function. */
|
|
||||||
#undef HAVE_UNAME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `vasprintf' function. */
|
|
||||||
#undef HAVE_VASPRINTF
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `vprintf' function. */
|
|
||||||
#undef HAVE_VPRINTF
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `vsnprintf' function. */
|
|
||||||
#undef HAVE_VSNPRINTF
|
|
||||||
|
|
||||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
|
||||||
#undef NO_MINUS_C_MINUS_O
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
|
||||||
#undef RETSIGTYPE
|
|
||||||
|
|
||||||
/* If using the C implementation of alloca, define if you know the
|
|
||||||
direction of stack growth for your system; otherwise it will be
|
|
||||||
automatically deduced at runtime.
|
|
||||||
STACK_DIRECTION > 0 => grows toward higher addresses
|
|
||||||
STACK_DIRECTION < 0 => grows toward lower addresses
|
|
||||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
|
||||||
#undef STACK_DIRECTION
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
|
||||||
#undef TIME_WITH_SYS_TIME
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
#undef TM_IN_SYS_TIME
|
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
|
||||||
#ifndef _ALL_SOURCE
|
|
||||||
# undef _ALL_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable GNU extensions on systems that have them. */
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
# undef _GNU_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable threading extensions on Solaris. */
|
|
||||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
# undef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
#endif
|
|
||||||
/* Enable extensions on HP NonStop. */
|
|
||||||
#ifndef _TANDEM_SOURCE
|
|
||||||
# undef _TANDEM_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable general extensions on Solaris. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# undef __EXTENSIONS__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Define to 1 if on MINIX. */
|
|
||||||
#undef _MINIX
|
|
||||||
|
|
||||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
|
||||||
this defined. */
|
|
||||||
#undef _POSIX_1_SOURCE
|
|
||||||
|
|
||||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
|
||||||
#undef _POSIX_SOURCE
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
#undef const
|
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> does not define. */
|
|
||||||
#undef pid_t
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
#undef size_t
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,548 +0,0 @@
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
|
||||||
AC_INIT(src)
|
|
||||||
|
|
||||||
package="pdnsd"
|
|
||||||
version=`cut -d - -f 1 "$srcdir"/version`
|
|
||||||
fullversion=`cat "$srcdir"/version`
|
|
||||||
packagerelease=`cut -d - -f 2- "$srcdir"/version`
|
|
||||||
|
|
||||||
distribution="Generic"
|
|
||||||
target="autodetect"
|
|
||||||
cachedir="/var/cache/$package"
|
|
||||||
ipv4_default=1
|
|
||||||
have_ipv4="yes"
|
|
||||||
#newrrs="yes"
|
|
||||||
query_m="udponly"
|
|
||||||
have_tcp_server="yes"
|
|
||||||
adisc="default"
|
|
||||||
slock="no";
|
|
||||||
def_id="nobody"
|
|
||||||
#have_rcsids="no"
|
|
||||||
udp_queries="yes"
|
|
||||||
tcp_queries="yes"
|
|
||||||
tempdir="/tmp"
|
|
||||||
randomdev=default
|
|
||||||
freebsd_pthread="4"
|
|
||||||
specbuild=no
|
|
||||||
threadlib=default
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE($package, $version, [no-define])
|
|
||||||
AM_CONFIG_HEADER(config.h)
|
|
||||||
AC_GNU_SOURCE
|
|
||||||
AC_DEFINE_UNQUOTED(VERSION,"$fullversion")
|
|
||||||
AC_SUBST(fullversion)
|
|
||||||
AC_SUBST(packagerelease)
|
|
||||||
|
|
||||||
AC_ARG_WITH(distribution,
|
|
||||||
[ --with-distribution=distro Specify target distribution (default=Generic;
|
|
||||||
others: RedHat, SuSE, Debian, ArchLinux)],
|
|
||||||
distribution=$withval)
|
|
||||||
AC_SUBST(distribution)
|
|
||||||
|
|
||||||
AC_ARG_WITH(target,
|
|
||||||
[ --with-target=platform Change compilation target platform (default:
|
|
||||||
autodetect; others: Linux, BSD, Cygwin)],
|
|
||||||
target=$withval)
|
|
||||||
case $target in
|
|
||||||
Linux|linux)
|
|
||||||
AC_DEFINE(TARGET, TARGET_LINUX)
|
|
||||||
target="Linux"
|
|
||||||
;;
|
|
||||||
BSD| bsd)
|
|
||||||
AC_DEFINE(TARGET, TARGET_BSD)
|
|
||||||
target="BSD"
|
|
||||||
;;
|
|
||||||
Cygwin|CYGWIN|cygwin)
|
|
||||||
AC_DEFINE(TARGET, TARGET_CYGWIN)
|
|
||||||
target="cygwin"
|
|
||||||
;;
|
|
||||||
autodetect)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_ERROR([--with-target must have Linux, BSD or Cygwin as parameter.])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_ARG_WITH(cachedir,
|
|
||||||
[ --with-cachedir=dir Default directory for pdnsd cache
|
|
||||||
(default=/var/cache/pdnsd)],
|
|
||||||
cachedir=$withval)
|
|
||||||
AC_DEFINE_UNQUOTED(CACHEDIR, "$cachedir")
|
|
||||||
AC_SUBST(cachedir)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(isdn,
|
|
||||||
[ --enable-isdn Enable ISDN support (may cause problems on
|
|
||||||
some systems; only for Linux)],
|
|
||||||
test $enableval = "yes" && AC_DEFINE(ISDN_SUPPORT))
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(ipv4,
|
|
||||||
[ --disable-ipv4 Disable IPv4 networking support
|
|
||||||
(default=enabled)],
|
|
||||||
have_ipv4=$enableval)
|
|
||||||
|
|
||||||
test $have_ipv4 = "yes" && AC_DEFINE(ENABLE_IPV4)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(ipv6,
|
|
||||||
[ --enable-ipv6 Enable IPv6 networking support],
|
|
||||||
[ if test $enableval = "yes" ; then
|
|
||||||
AC_DEFINE(ENABLE_IPV6)
|
|
||||||
if test $have_ipv4 != "yes" ; then
|
|
||||||
ipv4_default=0
|
|
||||||
fi
|
|
||||||
fi])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(ipv4-startup,
|
|
||||||
[ --disable-ipv4-startup Disable IPv4 on pdnsd startup by default
|
|
||||||
(default=enabled)],
|
|
||||||
[ if test $enableval = "yes" ; then
|
|
||||||
ipv4_default=1
|
|
||||||
else
|
|
||||||
ipv4_default=0
|
|
||||||
fi])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(ipv6-startup,
|
|
||||||
[ --enable-ipv6-startup Enable IPV6 on pdnsd startup by default
|
|
||||||
(default=IPv4)],
|
|
||||||
[ if test $enableval = "yes" ; then
|
|
||||||
ipv4_default=0
|
|
||||||
else
|
|
||||||
ipv4_default=1
|
|
||||||
fi])
|
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(DEFAULT_IPV4, $ipv4_default)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(udp-queries,
|
|
||||||
[ --disable-udp-queries Disable udp as query method.],
|
|
||||||
udp_queries=$enableval)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(tcp-queries,
|
|
||||||
[ --disable-tcp-queries Disable tcp as query method.],
|
|
||||||
tcp_queries=$enableval)
|
|
||||||
|
|
||||||
AC_ARG_WITH(query-method,
|
|
||||||
[ --with-query-method=qm Specify the query method (default=udponly;
|
|
||||||
others: tcponly, tcpudp, udptcp)],
|
|
||||||
query_m=$withval)
|
|
||||||
case $query_m in
|
|
||||||
udponly|UDPonly)
|
|
||||||
AC_DEFINE(M_PRESET, UDP_ONLY)
|
|
||||||
udp_queries=yes;
|
|
||||||
;;
|
|
||||||
tcponly|TCPonly)
|
|
||||||
AC_DEFINE(M_PRESET, TCP_ONLY)
|
|
||||||
tcp_queries=yes;
|
|
||||||
;;
|
|
||||||
tcpudp|TCPUDP)
|
|
||||||
AC_DEFINE(M_PRESET, TCP_UDP)
|
|
||||||
udp_queries=yes;
|
|
||||||
tcp_queries=yes;
|
|
||||||
;;
|
|
||||||
udptcp|UDPTCP)
|
|
||||||
AC_DEFINE(M_PRESET, UDP_TCP)
|
|
||||||
udp_queries=yes;
|
|
||||||
tcp_queries=yes;
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_ERROR([--with-query-method must have udponly, tcponly, tcpudp or udptcp as parameter.])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
test $udp_queries != "yes" && AC_DEFINE(NO_UDP_QUERIES)
|
|
||||||
test $tcp_queries != "yes" && AC_DEFINE(NO_TCP_QUERIES)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(tcp-server,
|
|
||||||
[ --disable-tcp-server Disable the TCP serving ability of pdnsd],
|
|
||||||
have_tcp_server=$enableval)
|
|
||||||
|
|
||||||
test $have_tcp_server != "yes" && AC_DEFINE(NO_TCP_SERVER)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(src-addr-disc,
|
|
||||||
[ --disable-src-addr-disc Disable the UDP source address discovery],
|
|
||||||
adisc=$enableval)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(socket-locking,
|
|
||||||
[ --enable-socket-locking Enable the UDP socket locking],
|
|
||||||
slock=$enableval)
|
|
||||||
|
|
||||||
test $slock = "yes" && AC_DEFINE(SOCKET_LOCKING)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(poll,
|
|
||||||
[ --disable-poll Disable poll(2) and use select(2)
|
|
||||||
(default=enabled)],
|
|
||||||
test $enableval != "yes" && AC_DEFINE(NO_POLL))
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(new-rrs,
|
|
||||||
[ --disable-new-rrs Disable new DNS RR types (obsolete, currently ignored)],
|
|
||||||
newrrs=$enableval)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(strict-rfc2181,
|
|
||||||
[ --enable-strict-rfc2181 Enforce strict RFC 2181 compliance],
|
|
||||||
test $enableval = "yes" && AC_DEFINE(RFC2181_ME_HARDER))
|
|
||||||
|
|
||||||
AC_ARG_WITH(random-device,
|
|
||||||
[ --with-random-device=device Specify random device other than
|
|
||||||
/dev/random; default: C Library random() PRNG;
|
|
||||||
special value arc4random for BSD C Library
|
|
||||||
arc4random function (default on FreeBSD)],
|
|
||||||
randomdev=$withval)
|
|
||||||
|
|
||||||
if test "$randomdev" = arc4random ; then
|
|
||||||
AC_DEFINE(R_ARC4RANDOM)
|
|
||||||
elif test "$randomdev" = random ; then
|
|
||||||
AC_DEFINE(R_RANDOM)
|
|
||||||
elif test "$randomdev" = default ; then
|
|
||||||
AC_DEFINE(R_DEFAULT)
|
|
||||||
else
|
|
||||||
AC_DEFINE_UNQUOTED(RANDOM_DEVICE, "$randomdev")
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(underscores,
|
|
||||||
[ --enable-underscores Allow _ in domain names (obsolete, currently ignored)],
|
|
||||||
underscores=$enableval)
|
|
||||||
|
|
||||||
AC_ARG_WITH(default-id,
|
|
||||||
[ --with-default-id=id Specify default uid/gid for pdnsd
|
|
||||||
(default=nobody)],
|
|
||||||
def_id=$withval)
|
|
||||||
AC_SUBST(def_id)
|
|
||||||
|
|
||||||
AC_ARG_WITH(debug,
|
|
||||||
[ --with-debug=level Specify debugging level (0 means no debug support)],
|
|
||||||
AC_DEFINE_UNQUOTED(DEBUG, $withval))
|
|
||||||
|
|
||||||
AC_ARG_WITH(verbosity,
|
|
||||||
[ --with-verbosity=level Specify default message verbosity],
|
|
||||||
AC_DEFINE_UNQUOTED(VERBOSITY, $withval))
|
|
||||||
|
|
||||||
AC_ARG_WITH(hash-buckets,
|
|
||||||
[ --with-hash-buckets=num Number of hash buckets to use (default=1024).
|
|
||||||
The number actually used is the smallest power of two
|
|
||||||
greater or equal to the number specified here.],
|
|
||||||
powof2=1
|
|
||||||
hashsz=0
|
|
||||||
|
|
||||||
while test $powof2 -lt "$withval"
|
|
||||||
do
|
|
||||||
powof2=`expr 2 '*' $powof2`
|
|
||||||
hashsz=`expr $hashsz '+' 1`
|
|
||||||
done
|
|
||||||
AC_DEFINE_UNQUOTED(HASH_SZ, $hashsz)
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(hash-debug,
|
|
||||||
[ --enable-hash-debug Debug hash tables (warning: massive output)],
|
|
||||||
test $enableval = "yes" && AC_DEFINE(DEBUG_HASH))
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(rcsids,
|
|
||||||
[ --enable-rcsids Enable RCS IDs in executables (obsolete, currently ignored)],
|
|
||||||
have_rcsids=$enableval)
|
|
||||||
|
|
||||||
AC_ARG_WITH(tcp-qtimeout,
|
|
||||||
[ --with-tcp-qtimeout=secs Specify default tcp query timeout (default=30)],
|
|
||||||
AC_DEFINE_UNQUOTED(TCP_TIMEOUT, $withval))
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(tcp-subseq,
|
|
||||||
[ --enable-tcp-subseq Enable multiple dns querys using one
|
|
||||||
tcp connection],
|
|
||||||
test $enableval = "yes" && AC_DEFINE(TCP_SUBSEQ))
|
|
||||||
|
|
||||||
AC_ARG_WITH(par-queries,
|
|
||||||
[ --with-par-queries=num Specify default parallel query number (default=2)],
|
|
||||||
AC_DEFINE_UNQUOTED(PAR_QUERIES, $withval))
|
|
||||||
|
|
||||||
AC_ARG_WITH(max-nameserver-ips,
|
|
||||||
[ --with-max-nameserver-ips=num Specify maximum number of IP addresses used per nameserver obtained from NS records (default=3)],
|
|
||||||
AC_DEFINE_UNQUOTED(MAXNAMESERVIPS, $withval))
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(specbuild,
|
|
||||||
[ --enable-specbuild Only used when building pdnsd from spec files],
|
|
||||||
specbuild=$enableval)
|
|
||||||
|
|
||||||
AC_SUBST(specbuild)
|
|
||||||
|
|
||||||
AC_ARG_WITH(thread-lib,
|
|
||||||
[ --with-thread-lib=lib Specify thread library, overriding automatic detection (for Linux only).
|
|
||||||
Possible values: LinuxThreads,
|
|
||||||
LinuxThreads2 (implements a fix for newer glibcs)
|
|
||||||
or NPTL (Native POSIX Thread Library)],
|
|
||||||
threadlib=$withval)
|
|
||||||
|
|
||||||
AC_SUBST(threadlib)
|
|
||||||
|
|
||||||
dnl Checks for programs.
|
|
||||||
AC_PROG_CC
|
|
||||||
AM_PROG_CC_STDC
|
|
||||||
AM_PROG_CC_C_O
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
|
|
||||||
dnl For dbm subsystem libraries
|
|
||||||
AC_PROG_RANLIB
|
|
||||||
|
|
||||||
if test "$target" = "autodetect" ; then
|
|
||||||
AC_MSG_CHECKING([for autodetect build target])
|
|
||||||
uname_sys=`uname`
|
|
||||||
if test $? -ne 0 ; then
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR([uname failed or was not found in path])
|
|
||||||
else
|
|
||||||
case "${uname_sys}" in
|
|
||||||
Linux)
|
|
||||||
AC_MSG_RESULT(Linux)
|
|
||||||
AC_DEFINE(TARGET, TARGET_LINUX)
|
|
||||||
target="Linux"
|
|
||||||
;;
|
|
||||||
FreeBSD|NetBSD|OpenBSD|Darwin)
|
|
||||||
AC_MSG_RESULT("${uname_sys}")
|
|
||||||
AC_DEFINE(TARGET, TARGET_BSD)
|
|
||||||
target="BSD"
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
AC_MSG_RESULT("${uname_sys}")
|
|
||||||
AC_DEFINE(TARGET, TARGET_CYGWIN)
|
|
||||||
target="cygwin"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR(
|
|
||||||
[Your system type could not be identified. Try setting it manually using
|
|
||||||
--with-target])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
#if test "$target" = BSD ; then
|
|
||||||
# uname_sys=`uname`
|
|
||||||
# if test "$uname_sys" = FreeBSD ; then
|
|
||||||
# AC_MSG_CHECKING([for FreeBSD version])
|
|
||||||
# osrel=`sysctl -n kern.osreldate`
|
|
||||||
# if test $osrel -ge 500016 ; then
|
|
||||||
# AC_MSG_RESULT([5.0 (>= 500016)])
|
|
||||||
# freebsd_pthread="5"
|
|
||||||
# else
|
|
||||||
# AC_MSG_RESULT([<=5.0 (< 500016)])
|
|
||||||
# freebsd_pthread="4"
|
|
||||||
# fi
|
|
||||||
# fi
|
|
||||||
#fi
|
|
||||||
|
|
||||||
if test "$adisc" = "default"; then
|
|
||||||
if test "$target" = "cygwin" ; then
|
|
||||||
# Don't do UDP source address discovery on Cygwin platform by default.
|
|
||||||
adisc="no"
|
|
||||||
else
|
|
||||||
adisc="yes"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
test "$adisc" = "yes" && AC_DEFINE(SRC_ADDR_DISC)
|
|
||||||
|
|
||||||
|
|
||||||
dnl Checks for libraries.
|
|
||||||
if test "$target" = "Linux"; then
|
|
||||||
AC_MSG_CHECKING([if we can compile and link with -pthread])
|
|
||||||
old_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -pthread"
|
|
||||||
AC_LINK_IFELSE([
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
void *thread_func(void *data)
|
|
||||||
{
|
|
||||||
*((int *)data)=1;
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
pthread_t thread;
|
|
||||||
void *retval;
|
|
||||||
int val;
|
|
||||||
|
|
||||||
if(pthread_create(&thread, NULL, thread_func, &val))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if(pthread_join(thread,&retval))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return (*((int *)retval)!=1);
|
|
||||||
}
|
|
||||||
],
|
|
||||||
gcc_pthread_flag="yes", gcc_pthread_flag="no")
|
|
||||||
CFLAGS="$old_CFLAGS"
|
|
||||||
AC_MSG_RESULT([$gcc_pthread_flag])
|
|
||||||
|
|
||||||
if test "$gcc_pthread_flag" = yes ; then
|
|
||||||
thread_CFLAGS="-pthread"
|
|
||||||
AC_SUBST(thread_CFLAGS)
|
|
||||||
else
|
|
||||||
AC_CHECK_LIB(pthread, pthread_create)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$target" = "BSD" -a `uname` != Darwin ; then
|
|
||||||
# if test $freebsd_pthread = 4 ; then
|
|
||||||
thread_CFLAGS="-pthread"
|
|
||||||
AC_SUBST(thread_CFLAGS)
|
|
||||||
# else
|
|
||||||
# AC_CHECK_LIB(c_r, pthread_create, ,
|
|
||||||
# AC_MSG_ERROR([You must have libc_r installed to build/run pdnsd!]))
|
|
||||||
# fi;
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$target" = "Linux" -a "$threadlib" = default; then
|
|
||||||
AC_MSG_CHECKING([if this is an NPTL-based system])
|
|
||||||
old_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS $thread_CFLAGS"
|
|
||||||
AC_RUN_IFELSE([
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
/* All this function does is return its PID (in a roundabout way). */
|
|
||||||
void *thread_func(void *data)
|
|
||||||
{
|
|
||||||
*((int *)data)=getpid();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
pthread_t thread;
|
|
||||||
void *retval;
|
|
||||||
int err,mainpid,thrdpid;
|
|
||||||
|
|
||||||
err=pthread_create(&thread, NULL, thread_func, &thrdpid);
|
|
||||||
if(err) {
|
|
||||||
fprintf(stderr,"pthread_create failed: %s\n",strerror(err));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
err=pthread_join(thread,&retval);
|
|
||||||
if(err) {
|
|
||||||
fprintf(stderr,"pthread_join failed: %s\n",strerror(err));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
mainpid=getpid();
|
|
||||||
/* In LinuxThreads implementations, the pids of the threads will usually differ
|
|
||||||
in a non Posix-compliant way. */
|
|
||||||
fprintf(stderr,"main pid=%d, thread pid=%d\n",mainpid,*((int *)retval));
|
|
||||||
return (*((int *)retval)!=mainpid);
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
threadlib=nptl
|
|
||||||
],
|
|
||||||
[
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
threadlib=linuxthreads
|
|
||||||
],
|
|
||||||
[
|
|
||||||
AC_MSG_RESULT([couldn't run test program])
|
|
||||||
threadlib=linuxthreads
|
|
||||||
])
|
|
||||||
CFLAGS="$old_CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$threadlib" = nptl -o "$threadlib" = NPTL; then
|
|
||||||
AC_DEFINE(THREADLIB_NPTL)
|
|
||||||
elif test "$threadlib" = linuxthreads2 -o "$threadlib" = LinuxThreads2 -o "$threadlib" = lt2; then
|
|
||||||
AC_DEFINE(THREADLIB_LINUXTHREADS2)
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Checks for header files.
|
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_HEADER_SYS_WAIT
|
|
||||||
AC_CHECK_HEADERS(fcntl.h malloc.h sys/ioctl.h sys/time.h syslog.h unistd.h)
|
|
||||||
AC_CHECK_HEADERS(sys/types.h sys/socket.h net/if.h netinet/in.h sys/poll.h,,,
|
|
||||||
[#include <stdio.h>
|
|
||||||
#if STDC_HEADERS
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <stddef.h>
|
|
||||||
#else
|
|
||||||
# if HAVE_STDLIB_H
|
|
||||||
# include <stdlib.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if HAVE_SYS_SOCKET_H
|
|
||||||
# include <sys/socket.h>
|
|
||||||
#endif
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_C_CONST
|
|
||||||
AC_TYPE_PID_T
|
|
||||||
AC_TYPE_SIZE_T
|
|
||||||
AC_HEADER_TIME
|
|
||||||
AC_STRUCT_TM
|
|
||||||
AC_CHECK_TYPES(socklen_t,, AC_DEFINE(socklen_t,int),[#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>])
|
|
||||||
AC_CHECK_TYPES([struct in6_addr, struct in_pktinfo, struct ifreq],,,[#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for CPP C99 Variadic macro support])
|
|
||||||
AC_COMPILE_IFELSE([
|
|
||||||
#define a(...) junk(0,__VA_ARGS__)
|
|
||||||
extern void junk(int i,...);
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
a(0);
|
|
||||||
a("a");
|
|
||||||
a(0, "a", 1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
],
|
|
||||||
cpp_c99_variadic="yes", cpp_c99_variadic="no")
|
|
||||||
AC_MSG_RESULT([$cpp_c99_variadic])
|
|
||||||
if test $cpp_c99_variadic = yes; then
|
|
||||||
AC_DEFINE(CPP_C99_VARIADIC_MACROS)
|
|
||||||
else
|
|
||||||
if test "$GCC" != yes; then
|
|
||||||
AC_MSG_ERROR([Compiler must support C99 or gcc variadic macros])
|
|
||||||
fi;
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Checks for library functions.
|
|
||||||
AC_FUNC_ALLOCA
|
|
||||||
AC_PROG_GCC_TRADITIONAL
|
|
||||||
AC_FUNC_MEMCMP
|
|
||||||
AC_TYPE_SIGNAL
|
|
||||||
AC_FUNC_VPRINTF
|
|
||||||
AC_SEARCH_LIBS(nanosleep, rt)
|
|
||||||
AC_SEARCH_LIBS(socket, socket,,,-lnsl)
|
|
||||||
AC_SEARCH_LIBS(inet_aton, resolv)
|
|
||||||
AC_CHECK_FUNCS(nanosleep gettimeofday mkfifo select socket strerror uname snprintf vsnprintf, true,
|
|
||||||
AC_MSG_ERROR([One of the functions required for pdnsd were not found.]))
|
|
||||||
AC_CHECK_FUNCS(poll, true, AC_DEFINE(NO_POLL))
|
|
||||||
AC_CHECK_FUNCS(strdup strndup stpcpy stpncpy strlcpy mempcpy getline asprintf vasprintf getpwnam_r inet_ntop inet_pton)
|
|
||||||
|
|
||||||
AC_OUTPUT([
|
|
||||||
pdnsd.spec
|
|
||||||
Makefile
|
|
||||||
file-list.base
|
|
||||||
contrib/Makefile
|
|
||||||
doc/Makefile
|
|
||||||
doc/pdnsd.8
|
|
||||||
doc/pdnsd.conf.5
|
|
||||||
doc/pdnsd.conf
|
|
||||||
src/Makefile
|
|
||||||
src/pdnsd-ctl/Makefile
|
|
||||||
src/rc/Makefile
|
|
||||||
src/rc/RedHat/Makefile
|
|
||||||
src/rc/RedHat/pdnsd
|
|
||||||
src/rc/SuSE/Makefile
|
|
||||||
src/rc/SuSE/pdnsd
|
|
||||||
src/rc/Debian/Makefile
|
|
||||||
src/rc/Debian/pdnsd
|
|
||||||
src/rc/Slackware/Makefile
|
|
||||||
src/rc/Slackware/rc.pdnsd
|
|
||||||
src/rc/ArchLinux/Makefile
|
|
||||||
src/rc/ArchLinux/pdnsd
|
|
||||||
src/test/Makefile
|
|
||||||
PKGBUILD
|
|
||||||
])
|
|
|
@ -1,2 +0,0 @@
|
||||||
|
|
||||||
EXTRA_DIST = pdnsd_dhcp.pl dhcp2pdnsd change_pdnsd_server_ip.pl README
|
|
|
@ -1,323 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
subdir = contrib
|
|
||||||
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
ALLOCA = @ALLOCA@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
cachedir = @cachedir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
def_id = @def_id@
|
|
||||||
distribution = @distribution@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
fullversion = @fullversion@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
packagerelease = @packagerelease@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
specbuild = @specbuild@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
thread_CFLAGS = @thread_CFLAGS@
|
|
||||||
threadlib = @threadlib@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
EXTRA_DIST = pdnsd_dhcp.pl dhcp2pdnsd change_pdnsd_server_ip.pl README
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu contrib/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
tags: TAGS
|
|
||||||
TAGS:
|
|
||||||
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS:
|
|
||||||
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile
|
|
||||||
installdirs:
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-generic mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am:
|
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: all all-am check check-am clean clean-generic distclean \
|
|
||||||
distclean-generic distdir dvi dvi-am html html-am info info-am \
|
|
||||||
install install-am install-data install-data-am install-dvi \
|
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
|
||||||
install-html-am install-info install-info-am install-man \
|
|
||||||
install-pdf install-pdf-am install-ps install-ps-am \
|
|
||||||
install-strip installcheck installcheck-am installdirs \
|
|
||||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
|
||||||
mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
|
|
||||||
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
|
@ -1,30 +0,0 @@
|
||||||
Last revised: 27 July 2003 by Paul Rombouts
|
|
||||||
|
|
||||||
This directory contains user-contributed scripts for use with pdnsd.
|
|
||||||
So far there are:
|
|
||||||
|
|
||||||
pdnsd_dhcp.pl, save_ram.pl
|
|
||||||
A perl script contributed by Marko Stolle (derived from a script by
|
|
||||||
Mike Stella) to watch a ISC DHCPD leases file and add local records for
|
|
||||||
the hosts listed there. This makes pdnsd useable in a DHCP setup.
|
|
||||||
Please look into the script for usage instructions (you will probably
|
|
||||||
also need to customize some settings there).
|
|
||||||
For details about save_ram.pl, please look into pdnsd_dhcp.pl
|
|
||||||
|
|
||||||
dhcp2pdnsd
|
|
||||||
A rc script for pdnsd, also by Marko Stolle. You might need to change
|
|
||||||
it slightly to make it run with your distro.
|
|
||||||
|
|
||||||
change_pdnsd_server_ip.pl
|
|
||||||
A perl script contributed by Paul Rombouts for automatically updating
|
|
||||||
the configuration file if the DNS server configuration has changed.
|
|
||||||
For instance, you could place the following line in the script
|
|
||||||
/sbin/ifup-local
|
|
||||||
|
|
||||||
/usr/local/sbin/change_pdnsd_server_ip.pl isplabel "$DNS" /etc/pdnsd.conf
|
|
||||||
|
|
||||||
where $DNS contains the IP addresses (in comma separated format) of the
|
|
||||||
DNS servers obtained by DHCP negotiation. The perl script only
|
|
||||||
overwrites /etc/pdnsd.conf if the DNS configuration has actually
|
|
||||||
changed, in which case the previous configuration file is saved as
|
|
||||||
/etc/pdnsd.conf.save
|
|
|
@ -1,124 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
#
|
|
||||||
# A Perl script to change the ip addresses of dns servers
|
|
||||||
# in the pdnsd configuration file.
|
|
||||||
#
|
|
||||||
# Written by Paul A. Rombouts
|
|
||||||
#
|
|
||||||
# This file Copyright 2002, 2004 Paul A. Rombouts
|
|
||||||
# It may be distributed under the GNU Public License, version 2, or
|
|
||||||
# any higher version. See section COPYING of the GNU Public license
|
|
||||||
# for conditions under which this file may be redistributed.
|
|
||||||
#
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
unless(@ARGV) {die "Error: no label specified.\n"}
|
|
||||||
my $label=shift;
|
|
||||||
unless(@ARGV) {die "Error: no DNS addresses specified.\n"}
|
|
||||||
my $dns_str=shift;
|
|
||||||
my $pdnsd_conf='/etc/pdnsd.conf';
|
|
||||||
if(@ARGV) {
|
|
||||||
$pdnsd_conf=shift;
|
|
||||||
if(@ARGV) {warn "Warning: spurious arguments ignored: @ARGV\n"}
|
|
||||||
}
|
|
||||||
|
|
||||||
#unless($label =~ /^\".*\"$/) {$label="\"$label\""}
|
|
||||||
#unless($dns_str =~ /^\".*\"$/) {$dns_str =~ s/^[\s,]*/\"/; $dns_str =~ s/[\s,]*$/\"/}
|
|
||||||
#unless($dns_str =~ /\"\s*\,\s*\"/) {$dns_str =~ s/[\s,]+/","/g}
|
|
||||||
|
|
||||||
my @lines=();
|
|
||||||
my $found_section=0;
|
|
||||||
my $changed=0;
|
|
||||||
my $ip_patt = qr/^((?:[^#]*?(?:\{|;))*?)(\s*ip\s*=\s*)("?[\w.:]+"?(?:\s*,\s*"?[\w.:]+"?)*)\s*;/;
|
|
||||||
|
|
||||||
open(CONFFILE,$pdnsd_conf) or die "Can't open $pdnsd_conf: $!\n";
|
|
||||||
|
|
||||||
while(<CONFFILE>) {
|
|
||||||
if(/^\s*server\s*\{/) {
|
|
||||||
my $sect_beg=$#lines+1;
|
|
||||||
my $sect_end;
|
|
||||||
my $found_label=0;
|
|
||||||
LOOP: {
|
|
||||||
do {
|
|
||||||
push @lines,$_;
|
|
||||||
if(/^(?:.*(?:\{|;))?\s*label\s*=\s*"?\Q$label\E"?\s*;/) {
|
|
||||||
if($found_label++) {
|
|
||||||
warn "Server section with multiple labels found.\n";
|
|
||||||
close(CONFFILE);
|
|
||||||
exit 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(/\}\s*$/) {
|
|
||||||
$sect_end=$#lines;
|
|
||||||
last LOOP;
|
|
||||||
}
|
|
||||||
} while(<CONFFILE>);
|
|
||||||
}
|
|
||||||
unless(defined($sect_end)) {
|
|
||||||
warn "Server section without proper ending found.\n";
|
|
||||||
close(CONFFILE);
|
|
||||||
exit 2;
|
|
||||||
}
|
|
||||||
if(!$found_label) {next}
|
|
||||||
if(!($found_section++)) {
|
|
||||||
my $found_ip=0;
|
|
||||||
for(my $i=$sect_beg; $i<=$sect_end;++$i) {
|
|
||||||
if($lines[$i] =~ $ip_patt) {
|
|
||||||
my $matched=''; my $rest;
|
|
||||||
do {
|
|
||||||
$rest=$';
|
|
||||||
if(!($found_ip++)) {
|
|
||||||
if($3 eq $dns_str) {
|
|
||||||
$matched.=$&;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$matched.="$1$2$dns_str;";
|
|
||||||
$changed=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$matched.=$1;
|
|
||||||
$changed=1;
|
|
||||||
}
|
|
||||||
} while($rest =~ $ip_patt);
|
|
||||||
$lines[$i] = $matched.$rest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!$found_ip) {
|
|
||||||
unless($lines[$sect_end] =~ s/\}\s*$/ ip=$dns_str;\n$&/) {
|
|
||||||
warn "Can't add ip specification to server section labeled $label.\n";
|
|
||||||
close(CONFFILE);
|
|
||||||
exit 2;
|
|
||||||
}
|
|
||||||
$changed=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
splice @lines,$sect_beg;
|
|
||||||
$changed=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {push @lines,$_}
|
|
||||||
}
|
|
||||||
|
|
||||||
close(CONFFILE) or die "Can't close $pdnsd_conf: $!\n";
|
|
||||||
|
|
||||||
if(!$found_section) {
|
|
||||||
warn "No server sections labeled $label found.\n";
|
|
||||||
exit 2;
|
|
||||||
}
|
|
||||||
elsif(!$changed) {
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rename($pdnsd_conf,"$pdnsd_conf.save") or die "Can't rename $pdnsd_conf: $!\n";
|
|
||||||
|
|
||||||
unless((open(CONFFILE,">$pdnsd_conf") or (warn("Can't open $pdnsd_conf for writing: $!\n"),0)) and
|
|
||||||
(print CONFFILE (@lines) or (warn("Can't write to $pdnsd_conf: $!\n"),0)) and
|
|
||||||
(close(CONFFILE) or (warn("Can't close $pdnsd_conf after writing: $!\n"),0))) {
|
|
||||||
rename("$pdnsd_conf.save",$pdnsd_conf) or die "Can't rename $pdnsd_conf.save: $!\n";
|
|
||||||
exit 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit 1;
|
|
|
@ -1,45 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# dhcp2pdnsd Start/Stop DHCP to DNS update script
|
|
||||||
#
|
|
||||||
# chkconfig: 345 96 99
|
|
||||||
# description: DHCP to DNS update script
|
|
||||||
# processname: dhcp2pdnsd.pl
|
|
||||||
#
|
|
||||||
# $Id: dhcp2pdnsd,v 1.1 2001/03/25 20:01:34 tmm Exp $
|
|
||||||
|
|
||||||
where="/usr/local/bin/"
|
|
||||||
name="pdnsd_dhcp.pl"
|
|
||||||
|
|
||||||
# Source function library.
|
|
||||||
. /etc/rc.d/init.d/functions
|
|
||||||
|
|
||||||
# Get config.
|
|
||||||
. /etc/sysconfig/network
|
|
||||||
|
|
||||||
# See how we were called.
|
|
||||||
case "$1" in
|
|
||||||
start)
|
|
||||||
$where$name > /dev/null 2> /dev/null &
|
|
||||||
action "Starting DHCP to DNS update script: " /bin/true
|
|
||||||
;;
|
|
||||||
stop)
|
|
||||||
p=`ps h -C $name | awk '{print $1}'`
|
|
||||||
[ $p -gt 0 ] 2> /dev/null && kill $p && action "Stopping DHCP to DNS update script: " /bin/true
|
|
||||||
[ $p -gt 0 ] 2> /dev/null || action "Stopping DHCP to DNS update script: " /bin/false
|
|
||||||
;;
|
|
||||||
status)
|
|
||||||
p=`ps h -C $name | awk '{print $1}'`
|
|
||||||
[ $p -gt 0 ] 2> /dev/null && echo 'running as '$p
|
|
||||||
[ $p -gt 0 ] 2> /dev/null || echo 'not running'
|
|
||||||
;;
|
|
||||||
restart|reload)
|
|
||||||
$0 stop
|
|
||||||
$0 start
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: dhcp2pdnsd {start|stop|status|restart|reload}"
|
|
||||||
exit 1
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,246 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
# $Id: pdnsd_dhcp.pl,v 1.2 2001/03/25 20:01:34 tmm Exp $
|
|
||||||
##########################################################################
|
|
||||||
#
|
|
||||||
# Filename: pdnsd_dhcp.pl
|
|
||||||
# Description: Dynamic DNS-DHCP update script for pdnsd
|
|
||||||
# Author: Mike Stella
|
|
||||||
# Modified by: Marko Stolle
|
|
||||||
# Created: November 19, 2001
|
|
||||||
# Last Updated: February 28, 2001
|
|
||||||
# Email: fwd2m@gmx.de
|
|
||||||
#
|
|
||||||
###########################################################################
|
|
||||||
#
|
|
||||||
# This code is Copyright (c) 1998-2001 by Mike Stella and Marko Stolle
|
|
||||||
#
|
|
||||||
# NO WARRANTY is given for this program. If it doesn't
|
|
||||||
# work on your system, sorry. If it eats your hard drive,
|
|
||||||
# again, sorry. It works fine on mine. Good luck!
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
#
|
|
||||||
###########################################################################
|
|
||||||
#
|
|
||||||
# This script reads a dhcpd.leases file and dynamically updates pdnsd with
|
|
||||||
# hostname and ip information.
|
|
||||||
#
|
|
||||||
# It assumes that your DHCP server recieves hostnames from the
|
|
||||||
# clients, and that your clients offer their hostnames to the server.
|
|
||||||
# Some versions of Linux DHCP clients don't do that. I use ISC's
|
|
||||||
# DHCPD, found at http://www.isc.org - though others may work just
|
|
||||||
# fine.
|
|
||||||
#
|
|
||||||
# This version of the script updates the pdnsd database. The status
|
|
||||||
# control socket of pdnsd has to be enabled (psnsd -d -s).
|
|
||||||
#
|
|
||||||
###########################################################################
|
|
||||||
#
|
|
||||||
# 02/20/2001 - first working version
|
|
||||||
# 02/21/2001 - security patches by Thomas Moestl
|
|
||||||
# 02/22/2001 - re-read dhcpd.leases if ttl has expireds since last update
|
|
||||||
# 02/24/2001 - try to get domainname if not specified
|
|
||||||
# 02/28/2001 - randomized temporary filename
|
|
||||||
# added possibility to save some RAM (read below)
|
|
||||||
#
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
|
|
||||||
# You may save some memory if you use absolute values with sysopen
|
|
||||||
# in sub update_dns and don't use tmpnam()..
|
|
||||||
# Just switch the '#' in front of the 'until sysopen' in the sub
|
|
||||||
# update_dns, check the necessary modes on your system using save_ram.pl
|
|
||||||
# and add a '#' in front of the following three lines.
|
|
||||||
# Not using the tmpnam() function may open a security breach on systems
|
|
||||||
# with not absolute trustworthy local users (Risk: a user may write a
|
|
||||||
# script which creates files with the same names as this script and block
|
|
||||||
# it that way. Unlikely because the filenames are now even without tmpnam()
|
|
||||||
# randomized and an attacker has to create a very large number of files.)
|
|
||||||
|
|
||||||
use Fcntl;
|
|
||||||
use strict;
|
|
||||||
use POSIX qw(tmpnam);
|
|
||||||
|
|
||||||
$|=1;
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
### Globals - you can change these as needed
|
|
||||||
|
|
||||||
# Domain name
|
|
||||||
# if not changed script will try to get it from the system
|
|
||||||
my $domain_name = "domain";
|
|
||||||
|
|
||||||
# DHCPD lease file
|
|
||||||
my $lease_file = "/var/lib/dhcp/dhcpd.leases";
|
|
||||||
|
|
||||||
# path to pdnsd-ctl
|
|
||||||
my $pdnsd_ctl = "/usr/local/sbin/pdnsd-ctl";
|
|
||||||
|
|
||||||
# owning name server for the newly added records
|
|
||||||
my $nameserver = "localhost.";
|
|
||||||
|
|
||||||
# TTL (Time To Live) for the new records
|
|
||||||
my $ttl = "86400";
|
|
||||||
|
|
||||||
# number of seconds to check the lease file for updates
|
|
||||||
my $update_freq = 30;
|
|
||||||
|
|
||||||
my $debug = 0;
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
### Don't mess with anything below unless you REALLY need to modify the
|
|
||||||
### code. And if you do, please let me know, I'm always interested in
|
|
||||||
### in improving this program.
|
|
||||||
|
|
||||||
# Make a pid file
|
|
||||||
`echo $$ > /var/run/pdnsd_update.pid`;
|
|
||||||
|
|
||||||
my $logstr;
|
|
||||||
my $modtime = 0;
|
|
||||||
my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMP} || $ENV{TEMP};
|
|
||||||
|
|
||||||
use vars qw (%db);
|
|
||||||
|
|
||||||
my $version = "1.03";
|
|
||||||
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# Main Loop
|
|
||||||
|
|
||||||
# try to find domainname if necessary
|
|
||||||
if ($domain_name eq "domain") {
|
|
||||||
$domain_name = `dnsdomainname`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$domain_name = "$domain_name\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
|
|
||||||
# check the file's last updated time, if it's been changed, update
|
|
||||||
# the DNS and save the time. Update DNS even if there a no changes on
|
|
||||||
# the leases file if ttl since last DNS update has expired.
|
|
||||||
# This will ALWAYS run once - on startup, since $modtime starts at zero.
|
|
||||||
|
|
||||||
|
|
||||||
my @stats = stat ($lease_file);
|
|
||||||
|
|
||||||
|
|
||||||
if (($stats[9] > $modtime) or (time >= $modtime+$ttl)){
|
|
||||||
|
|
||||||
# clear the old hash
|
|
||||||
undef %db;
|
|
||||||
|
|
||||||
printf STDERR "updating DNS with dhcpd.leases\n";
|
|
||||||
$modtime = time;
|
|
||||||
&read_lease_file;
|
|
||||||
&update_dns;
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait till next check time
|
|
||||||
sleep $update_freq;
|
|
||||||
|
|
||||||
} # end main
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
|
|
||||||
### write out the import file
|
|
||||||
sub update_dns {
|
|
||||||
my ($ip, $hostname, $fname);
|
|
||||||
|
|
||||||
do { $fname = tmpnam() }
|
|
||||||
until sysopen(DNSFILE, $fname, O_WRONLY|O_CREAT|O_EXCL, 0600);
|
|
||||||
# do { $fname = "$temp_dir/d2d".int(rand(time())) }
|
|
||||||
# until sysopen(DNSFILE, $fname, 1|64|128, 0600);
|
|
||||||
|
|
||||||
while (($hostname,$ip) = each (%db)) {
|
|
||||||
print DNSFILE "$ip $hostname.$domain_name";
|
|
||||||
}
|
|
||||||
close DNSFILE;
|
|
||||||
|
|
||||||
system ("$pdnsd_ctl source $fname $nameserver $ttl");
|
|
||||||
unlink($fname);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
### reads the lease file & makes a hash of what's in there.
|
|
||||||
sub read_lease_file {
|
|
||||||
|
|
||||||
unless (open(LEASEFILE,$lease_file)) {
|
|
||||||
#`logger -t dns_update.pl error opening dhcpd lease file`;
|
|
||||||
print STDERR "Can't open lease file\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
|
|
||||||
my $curdate = sprintf "%02d%02d%02d%02d%02d%20d%20d",
|
|
||||||
($year+1900),($mon+1),$mday,$hour,$min,$sec;
|
|
||||||
|
|
||||||
## Loop here, reading from LEASEFILE
|
|
||||||
while (<LEASEFILE>) {
|
|
||||||
my ($ip, $hostname, $mac, $enddate,$endtime);
|
|
||||||
|
|
||||||
if (/^\s*lease/i) {
|
|
||||||
|
|
||||||
# find ip address
|
|
||||||
$_ =~ /^\s*lease\s+(\S+)/;
|
|
||||||
$ip = $1;
|
|
||||||
|
|
||||||
# do the rest of the block - we're interested in hostname,
|
|
||||||
# mac address, and the lease time
|
|
||||||
while ($_ !~ /^}/) {
|
|
||||||
$_ = <LEASEFILE>;
|
|
||||||
# find hostname
|
|
||||||
if ($_ =~ /^\s*client/i) {
|
|
||||||
#chomp $_;
|
|
||||||
#chop $_;
|
|
||||||
$_ =~ /\"(.*)\"/;
|
|
||||||
$hostname = $1;
|
|
||||||
|
|
||||||
# change spaces to dash, remove dots - microsoft
|
|
||||||
# really needs to not do this crap
|
|
||||||
$hostname =~ s/\s+/-/g;
|
|
||||||
$hostname =~ s/\.//g;
|
|
||||||
}
|
|
||||||
# get the lease end date
|
|
||||||
elsif ($_ =~ /^\s*ends/i) {
|
|
||||||
$_ =~ m/^\s*ends\s+\d\s+([^;]+);/;
|
|
||||||
$enddate = $1;
|
|
||||||
$enddate =~ s|[/: ]||g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# lowercase it - stupid dhcp clients
|
|
||||||
$hostname =~ tr/[A-Z]/[a-z]/;
|
|
||||||
|
|
||||||
($debug < 1 ) || print STDERR "$hostname $ip $enddate $curdate\n";
|
|
||||||
|
|
||||||
# Store hostname/ip in hash - this way we can do easy dupe checking
|
|
||||||
if (($hostname ne "") and ($enddate > $curdate)) {
|
|
||||||
$db{$hostname} = $ip;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close LEASEFILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
### left around for testing
|
|
||||||
sub print_db {
|
|
||||||
my ($key,$value);
|
|
||||||
|
|
||||||
while (($key,$value) = each (%db)) {
|
|
||||||
print "$key - $value\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,530 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2005-07-09.11
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by `PROGRAMS ARGS'.
|
|
||||||
object Object file output by `PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputing dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say).
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
||||||
## The second -e expression handles DOS-style file names with drive letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the `deleted header file' problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" |
|
|
||||||
## Some versions of gcc put a space before the `:'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
|
||||||
tr '
|
|
||||||
' ' ' >> $depfile
|
|
||||||
echo >> $depfile
|
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> $depfile
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
|
|
||||||
tmpdepfile="$stripped.u"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then :
|
|
||||||
else
|
|
||||||
stripped=`echo "$stripped" | sed 's,^.*/,,'`
|
|
||||||
tmpdepfile="$stripped.u"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
outname="$stripped.o"
|
|
||||||
# Each line is of the form `foo.o: dependent.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
icc)
|
|
||||||
# Intel's C compiler understands `-MD -MF file'. However on
|
|
||||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
|
||||||
# ICC 7.0 will fill foo.d with something like
|
|
||||||
# foo.o: sub/foo.c
|
|
||||||
# foo.o: sub/foo.h
|
|
||||||
# which is wrong. We want:
|
|
||||||
# sub/foo.o: sub/foo.c
|
|
||||||
# sub/foo.o: sub/foo.h
|
|
||||||
# sub/foo.c:
|
|
||||||
# sub/foo.h:
|
|
||||||
# ICC 7.1 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using \ :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
|
||||||
sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in `foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# With Tru64 cc, shared objects can also be used to make a
|
|
||||||
# static library. This mecanism is used in libtool 1.4 series to
|
|
||||||
# handle both shared and static libraries in a single compilation.
|
|
||||||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
|
||||||
#
|
|
||||||
# With libtool 1.5 this exception was removed, and libtool now
|
|
||||||
# generates 2 separate objects for the 2 libraries. These two
|
|
||||||
# compilations output dependencies in in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
|
||||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.o.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
tmpdepfile4=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test $1 != '--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for `:'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test $1 != '--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no
|
|
||||||
for arg in "$@"; do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix="`echo $object | sed 's/^.*\././'`"
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
|
||||||
' | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test $1 != '--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E |
|
|
||||||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
|
||||||
sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o,
|
|
||||||
# because we must use -o when running libtool.
|
|
||||||
"$@" || exit $?
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
|
||||||
echo " " >> "$depfile"
|
|
||||||
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
|
@ -1,28 +0,0 @@
|
||||||
|
|
||||||
man_MANS = pdnsd.8 pdnsd-ctl.8 pdnsd.conf.5
|
|
||||||
|
|
||||||
# Note: pdnsd-ctl.8, pdnsd.conf.5.in, dl.html and the txt docs are handled by dist-hook rule.
|
|
||||||
EXTRA_DIST = pdnsd.conf.in pdnsd.8.in \
|
|
||||||
html/dl.html.in html/doc.html html/faq.html html/index.html \
|
|
||||||
doc_makefile html/doc_makefile txt/doc_makefile \
|
|
||||||
html2confman.pl html/htmlsubst.pl
|
|
||||||
|
|
||||||
# XXX: Do not insist to set the config file owner to root to avoid breaking RPM
|
|
||||||
# builds
|
|
||||||
install-data-hook:
|
|
||||||
$(mkinstalldirs) "$(DESTDIR)$(sysconfdir)"
|
|
||||||
if test `whoami` = "root"; then \
|
|
||||||
$(INSTALL) -o 0 -g 0 -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \
|
|
||||||
else \
|
|
||||||
$(INSTALL) -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
dist-hook: doc_makefile
|
|
||||||
@$(MAKE) -f doc_makefile doc
|
|
||||||
cp -p --parents pdnsd-ctl.8 pdnsd.conf.5.in \
|
|
||||||
html/dl.html txt/faq.txt txt/intro.txt txt/manual.txt \
|
|
||||||
$(distdir)
|
|
||||||
|
|
||||||
distclean-local: doc_makefile
|
|
||||||
@$(MAKE) -f doc_makefile clean
|
|
||||||
|
|
|
@ -1,483 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
subdir = doc
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
|
||||||
$(srcdir)/pdnsd.8.in $(srcdir)/pdnsd.conf.5.in \
|
|
||||||
$(srcdir)/pdnsd.conf.in
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
|
||||||
CONFIG_CLEAN_FILES = pdnsd.8 pdnsd.conf.5 pdnsd.conf
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
|
||||||
am__vpath_adj = case $$p in \
|
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
|
||||||
*) f=$$p;; \
|
|
||||||
esac;
|
|
||||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
|
||||||
am__install_max = 40
|
|
||||||
am__nobase_strip_setup = \
|
|
||||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
|
||||||
am__nobase_strip = \
|
|
||||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
|
||||||
am__nobase_list = $(am__nobase_strip_setup); \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
|
||||||
if (++n[$$2] == $(am__install_max)) \
|
|
||||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
|
||||||
END { for (dir in files) print dir, files[dir] }'
|
|
||||||
am__base_list = \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
|
||||||
man5dir = $(mandir)/man5
|
|
||||||
am__installdirs = "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"
|
|
||||||
man8dir = $(mandir)/man8
|
|
||||||
NROFF = nroff
|
|
||||||
MANS = $(man_MANS)
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
ALLOCA = @ALLOCA@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
cachedir = @cachedir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
def_id = @def_id@
|
|
||||||
distribution = @distribution@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
fullversion = @fullversion@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
packagerelease = @packagerelease@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
specbuild = @specbuild@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
thread_CFLAGS = @thread_CFLAGS@
|
|
||||||
threadlib = @threadlib@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
man_MANS = pdnsd.8 pdnsd-ctl.8 pdnsd.conf.5
|
|
||||||
|
|
||||||
# Note: pdnsd-ctl.8, pdnsd.conf.5.in, dl.html and the txt docs are handled by dist-hook rule.
|
|
||||||
EXTRA_DIST = pdnsd.conf.in pdnsd.8.in \
|
|
||||||
html/dl.html.in html/doc.html html/faq.html html/index.html \
|
|
||||||
doc_makefile html/doc_makefile txt/doc_makefile \
|
|
||||||
html2confman.pl html/htmlsubst.pl
|
|
||||||
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu doc/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
pdnsd.8: $(top_builddir)/config.status $(srcdir)/pdnsd.8.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
|
||||||
pdnsd.conf.5: $(top_builddir)/config.status $(srcdir)/pdnsd.conf.5.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
|
||||||
pdnsd.conf: $(top_builddir)/config.status $(srcdir)/pdnsd.conf.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
|
||||||
install-man5: $(man_MANS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)"
|
|
||||||
@list=''; test -n "$(man5dir)" || exit 0; \
|
|
||||||
{ for i in $$list; do echo "$$i"; done; \
|
|
||||||
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
|
||||||
sed -n '/\.5[a-z]*$$/p'; \
|
|
||||||
} | while read p; do \
|
|
||||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; echo "$$p"; \
|
|
||||||
done | \
|
|
||||||
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
|
|
||||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
|
|
||||||
sed 'N;N;s,\n, ,g' | { \
|
|
||||||
list=; while read file base inst; do \
|
|
||||||
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
|
|
||||||
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
|
|
||||||
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \
|
|
||||||
done; }
|
|
||||||
|
|
||||||
uninstall-man5:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list=''; test -n "$(man5dir)" || exit 0; \
|
|
||||||
files=`{ for i in $$list; do echo "$$i"; done; \
|
|
||||||
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
|
||||||
sed -n '/\.5[a-z]*$$/p'; \
|
|
||||||
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
|
|
||||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(man5dir)" && rm -f $$files; }
|
|
||||||
install-man8: $(man_MANS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)"
|
|
||||||
@list=''; test -n "$(man8dir)" || exit 0; \
|
|
||||||
{ for i in $$list; do echo "$$i"; done; \
|
|
||||||
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
|
||||||
sed -n '/\.8[a-z]*$$/p'; \
|
|
||||||
} | while read p; do \
|
|
||||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; echo "$$p"; \
|
|
||||||
done | \
|
|
||||||
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
|
|
||||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
|
|
||||||
sed 'N;N;s,\n, ,g' | { \
|
|
||||||
list=; while read file base inst; do \
|
|
||||||
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
|
|
||||||
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
|
|
||||||
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \
|
|
||||||
done; }
|
|
||||||
|
|
||||||
uninstall-man8:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list=''; test -n "$(man8dir)" || exit 0; \
|
|
||||||
files=`{ for i in $$list; do echo "$$i"; done; \
|
|
||||||
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
|
||||||
sed -n '/\.8[a-z]*$$/p'; \
|
|
||||||
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
|
|
||||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(man8dir)" && rm -f $$files; }
|
|
||||||
tags: TAGS
|
|
||||||
TAGS:
|
|
||||||
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS:
|
|
||||||
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@list='$(MANS)'; if test -n "$$list"; then \
|
|
||||||
list=`for p in $$list; do \
|
|
||||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
|
|
||||||
if test -n "$$list" && \
|
|
||||||
grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
|
|
||||||
echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
|
|
||||||
grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
|
|
||||||
echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
|
|
||||||
echo " typically \`make maintainer-clean' will remove them" >&2; \
|
|
||||||
exit 1; \
|
|
||||||
else :; fi; \
|
|
||||||
else :; fi
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
|
||||||
dist-hook
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile $(MANS)
|
|
||||||
installdirs:
|
|
||||||
for dir in "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-generic mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic distclean-local
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am: install-man
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) install-data-hook
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man: install-man5 install-man8
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-man
|
|
||||||
|
|
||||||
uninstall-man: uninstall-man5 uninstall-man8
|
|
||||||
|
|
||||||
.MAKE: install-am install-data-am install-strip
|
|
||||||
|
|
||||||
.PHONY: all all-am check check-am clean clean-generic dist-hook \
|
|
||||||
distclean distclean-generic distclean-local distdir dvi dvi-am \
|
|
||||||
html html-am info info-am install install-am install-data \
|
|
||||||
install-data-am install-data-hook install-dvi install-dvi-am \
|
|
||||||
install-exec install-exec-am install-html install-html-am \
|
|
||||||
install-info install-info-am install-man install-man5 \
|
|
||||||
install-man8 install-pdf install-pdf-am install-ps \
|
|
||||||
install-ps-am install-strip installcheck installcheck-am \
|
|
||||||
installdirs maintainer-clean maintainer-clean-generic \
|
|
||||||
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
|
|
||||||
uninstall-am uninstall-man uninstall-man5 uninstall-man8
|
|
||||||
|
|
||||||
|
|
||||||
# XXX: Do not insist to set the config file owner to root to avoid breaking RPM
|
|
||||||
# builds
|
|
||||||
install-data-hook:
|
|
||||||
$(mkinstalldirs) "$(DESTDIR)$(sysconfdir)"
|
|
||||||
if test `whoami` = "root"; then \
|
|
||||||
$(INSTALL) -o 0 -g 0 -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \
|
|
||||||
else \
|
|
||||||
$(INSTALL) -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
dist-hook: doc_makefile
|
|
||||||
@$(MAKE) -f doc_makefile doc
|
|
||||||
cp -p --parents pdnsd-ctl.8 pdnsd.conf.5.in \
|
|
||||||
html/dl.html txt/faq.txt txt/intro.txt txt/manual.txt \
|
|
||||||
$(distdir)
|
|
||||||
|
|
||||||
distclean-local: doc_makefile
|
|
||||||
@$(MAKE) -f doc_makefile clean
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
|
@ -1,38 +0,0 @@
|
||||||
# This file was written by Paul Rombouts.
|
|
||||||
# Because pdnsd currently has a very idiosyncratic method of building documentation
|
|
||||||
# I prefer to keep the actual build rules outside of the Makefiles an ordinary user
|
|
||||||
# would use to compile pdnsd and therefore I have put them into separate 'doc_makefile's.
|
|
||||||
#
|
|
||||||
# To rebuild pdnsd docs after you have modified something that other files depend on,
|
|
||||||
# run 'make -f doc_makefile doc' in the doc/ directory.
|
|
||||||
# This makefile is also invoked when you build a pdnsd distribution tarball
|
|
||||||
# using 'make dist' in the toplevel pdnsd source directory.
|
|
||||||
#
|
|
||||||
# If anyone thinks there is a much more elegant method for building the pdnsd docs
|
|
||||||
# using a conventional autoconf/automake process, please let me know.
|
|
||||||
|
|
||||||
versionfile = ../version
|
|
||||||
|
|
||||||
doc: pdnsd-ctl.8 pdnsd.conf.5.in html txt
|
|
||||||
.PHONY: pdnsd-ctl.8 doc html txt clean
|
|
||||||
|
|
||||||
pdnsd-ctl.8:
|
|
||||||
@pver=`cat $(versionfile)` && \
|
|
||||||
mver=`perl -e 'while(<>) {if(/^\s*\.TH(?:\s+(?:"[^"]*"|[^"\s]+)){3}\s+"pdnsd\s+([^"]*)"/) {print "$$1\n";exit 0}} \
|
|
||||||
die "Cannot find version in $$ARGV\n"' $@` && { \
|
|
||||||
test "$$mver" = "$$pver" || { \
|
|
||||||
perl -p -i.makesave -e 's/^(\s*\.TH(?:\s+(?:"[^"]*"|[^"\s]+)){3}\s+"pdnsd\s+)[^"]*(")/$${1}'"$$pver"'$${2}/' $@ && \
|
|
||||||
echo "Updated version in $@: $$mver -> $$pver"; \
|
|
||||||
}; \
|
|
||||||
}
|
|
||||||
|
|
||||||
pdnsd.conf.5.in: html/doc.html html2confman.pl
|
|
||||||
perl html2confman.pl $< > $@
|
|
||||||
|
|
||||||
html txt:
|
|
||||||
@cd $@ && $(MAKE) -f doc_makefile
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@rm -fv pdnsd.conf.5.in
|
|
||||||
@cd html && $(MAKE) -f doc_makefile clean
|
|
||||||
@cd txt && $(MAKE) -f doc_makefile clean
|
|
|
@ -1,96 +0,0 @@
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>pdnsd Download Page</title>
|
|
||||||
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
.small { font-family:helvetica; font-size:small; text-align:center; }
|
|
||||||
// -->
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<!--notext(-->
|
|
||||||
<body bgcolor="#EEEEEE">
|
|
||||||
<table width="100%">
|
|
||||||
<tr>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="index.html">pdnsd Homepage</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="faq.html">pdnsd FAQ</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="doc.html">Documentation</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="../../COPYING">GNU GPL (pdnsd's License)</a>
|
|
||||||
</span> </td>
|
|
||||||
<td><span class="small">
|
|
||||||
<a href="dl.html">Download Section</a>
|
|
||||||
</span></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<!--)notext-->
|
|
||||||
<center><h1>pdnsd Download Page</h1></center>
|
|
||||||
<!-- For obvious reasons, the real download page is not included in the distribution ;-) -->
|
|
||||||
<p>The original author of pdnsd is <a href="mailto:tmoestl@gmx.net">Thomas Moestl</a>,
|
|
||||||
but since 2003, he no longer maintains pdnsd.
|
|
||||||
However, <a href="mailto:p.a.rombouts@home.nl">Paul A. Rombouts</a> has extensively revised the code and maintains
|
|
||||||
a version with many fixes and improvements at
|
|
||||||
<a href="http://members.home.nl/p.a.rombouts/pdnsd.html">http://members.home.nl/p.a.rombouts/pdnsd.html</a>.<br>
|
|
||||||
He has pre-patched tarballs and RPM packages available for download at this site.<br>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
If you are interested in the very latest code or if you want to participate in
|
|
||||||
pdnsd development, checkout the <a href="http://gitorious.org/pdnsd/pdnsd">pdnsd git repository</a>
|
|
||||||
at <a href="http://gitorious.org/">gitorious.org</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
The most recent tarball is <a href="http://members.home.nl/p.a.rombouts/pdnsd/releases/pdnsd-1.2.9b-par.tar.gz">pdnsd-1.2.9b-par.tar.gz</a>
|
|
||||||
(<a href="http://members.home.nl/p.a.rombouts/pdnsd/releases/pdnsd-1.2.9b-par.tar.gz.asc">GPG signature</a>).<br>
|
|
||||||
The most recent RPM packages are:
|
|
||||||
<table cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><b>Package Name</b></td>
|
|
||||||
<td width="10%" align=right><b>Size</b></td>
|
|
||||||
<td width="60%"><b>Description</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><a href="http://members.home.nl/p.a.rombouts/pdnsd/releases/pdnsd-1.2.9b-par.src.rpm">pdnsd-1.2.9b-par.src.rpm</a></td>
|
|
||||||
<td width="10%" align=right>514kB</td>
|
|
||||||
<td width="60%">Source RPM (binary packages can also be built directly from the tarball).
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><a href="http://members.home.nl/p.a.rombouts/pdnsd/releases/pdnsd-1.2.9b-par_sl6.i686.rpm">pdnsd-1.2.9b-par_sl6.i686.rpm</a></td>
|
|
||||||
<td width="10%" align=right>???</td>
|
|
||||||
<td width="60%">i686 binary built on a Scientific Linux 6.2 system.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><a href="http://members.home.nl/p.a.rombouts/pdnsd/releases/pdnsd-1.2.9b-par_sl6.x86_64.rpm">pdnsd-1.2.9b-par_sl6.x86_64.rpm</a></td>
|
|
||||||
<td width="10%" align=right>282kB</td>
|
|
||||||
<td width="60%">x86_64 binary built on a Scientific Linux 6.2 system.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
If you want to check the signatures on these packages you will need a copy of my GPG key
|
|
||||||
which you can get <a href="http://members.home.nl/p.a.rombouts/paromb.asc">here</a>
|
|
||||||
or from a public key server.
|
|
||||||
<p>
|
|
||||||
There are also <a href="http://packages.debian.org/pdnsd">Debian</a>,
|
|
||||||
Ubuntu,
|
|
||||||
<a href="http://packages.gentoo.org/package/net-dns/pdnsd">Gentoo</a>,
|
|
||||||
<a href="http://www.rpmfind.net/linux/rpm2html/search.php?query=pdnsd">Mandriva</a>
|
|
||||||
and <a href="http://cvsweb.freebsd.org/ports/dns/pdnsd">FreeBSD</a>
|
|
||||||
packages, but these may not include the latest version.<br>
|
|
||||||
If you are looking for other versions released by Paul Rombouts, visit this
|
|
||||||
<a href="http://members.home.nl/p.a.rombouts/pdnsd/releases/">download directory</a>.
|
|
||||||
</p>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
<p>
|
|
||||||
<i>Last revised: 24 Apr 2012 by Paul A. Rombouts</i>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,96 +0,0 @@
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>pdnsd Download Page</title>
|
|
||||||
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
.small { font-family:helvetica; font-size:small; text-align:center; }
|
|
||||||
// -->
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<!--notext(-->
|
|
||||||
<body bgcolor="#EEEEEE">
|
|
||||||
<table width="100%">
|
|
||||||
<tr>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="index.html">pdnsd Homepage</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="faq.html">pdnsd FAQ</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="doc.html">Documentation</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="../../COPYING">GNU GPL (pdnsd's License)</a>
|
|
||||||
</span> </td>
|
|
||||||
<td><span class="small">
|
|
||||||
<a href="dl.html">Download Section</a>
|
|
||||||
</span></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<!--)notext-->
|
|
||||||
<center><h1>pdnsd Download Page</h1></center>
|
|
||||||
<!-- For obvious reasons, the real download page is not included in the distribution ;-) -->
|
|
||||||
<p>The original author of pdnsd is <a href="mailto:tmoestl@gmx.net">Thomas Moestl</a>,
|
|
||||||
but since 2003, he no longer maintains pdnsd.
|
|
||||||
However, <a href="mailto:p.a.rombouts@home.nl">Paul A. Rombouts</a> has extensively revised the code and maintains
|
|
||||||
a version with many fixes and improvements at
|
|
||||||
<a href="http://members.home.nl/p.a.rombouts/pdnsd.html">http://members.home.nl/p.a.rombouts/pdnsd.html</a>.<br>
|
|
||||||
He has pre-patched tarballs and RPM packages available for download at this site.<br>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
If you are interested in the very latest code or if you want to participate in
|
|
||||||
pdnsd development, checkout the <a href="http://gitorious.org/pdnsd/pdnsd">pdnsd git repository</a>
|
|
||||||
at <a href="http://gitorious.org/">gitorious.org</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
The most recent tarball is <a href="${baseurl}releases/pdnsd-$version.tar.gz">pdnsd-$version.tar.gz</a>
|
|
||||||
(<a href="${baseurl}releases/pdnsd-$version.tar.gz.asc">GPG signature</a>).<br>
|
|
||||||
The most recent RPM packages are:
|
|
||||||
<table cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><b>Package Name</b></td>
|
|
||||||
<td width="10%" align=right><b>Size</b></td>
|
|
||||||
<td width="60%"><b>Description</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><a href="${baseurl}releases/pdnsd-$version.src.rpm">pdnsd-$version.src.rpm</a></td>
|
|
||||||
<td width="10%" align=right>$sizeof("$HOME/rpmbuild/SRPMS/pdnsd-$version.src.rpm")</td>
|
|
||||||
<td width="60%">Source RPM (binary packages can also be built directly from the tarball).
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><a href="${baseurl}releases/pdnsd-${version}${extver}.${arch}.rpm">pdnsd-${version}${extver}.${arch}.rpm</a></td>
|
|
||||||
<td width="10%" align=right>$sizeof("$HOME/rpmbuild/RPMS/pdnsd-${version}${extver}.${arch}.rpm")</td>
|
|
||||||
<td width="60%">${arch} binary built on a $system.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td width="30%"><a href="${baseurl}releases/pdnsd-${version}${extver}.${arch2}.rpm">pdnsd-${version}${extver}.${arch2}.rpm</a></td>
|
|
||||||
<td width="10%" align=right>$sizeof("$HOME/rpmbuild/RPMS/pdnsd-${version}${extver}.${arch2}.rpm")</td>
|
|
||||||
<td width="60%">${arch2} binary built on a $system.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
If you want to check the signatures on these packages you will need a copy of my GPG key
|
|
||||||
which you can get <a href="http://members.home.nl/p.a.rombouts/paromb.asc">here</a>
|
|
||||||
or from a public key server.
|
|
||||||
<p>
|
|
||||||
There are also <a href="http://packages.debian.org/pdnsd">Debian</a>,
|
|
||||||
Ubuntu,
|
|
||||||
<a href="http://packages.gentoo.org/package/net-dns/pdnsd">Gentoo</a>,
|
|
||||||
<a href="http://www.rpmfind.net/linux/rpm2html/search.php?query=pdnsd">Mandriva</a>
|
|
||||||
and <a href="http://cvsweb.freebsd.org/ports/dns/pdnsd">FreeBSD</a>
|
|
||||||
packages, but these may not include the latest version.<br>
|
|
||||||
If you are looking for other versions released by Paul Rombouts, visit this
|
|
||||||
<a href="${baseurl}releases/">download directory</a>.
|
|
||||||
</p>
|
|
||||||
<hr>
|
|
||||||
<br>
|
|
||||||
<p>
|
|
||||||
<i>Last revised: $date by Paul A. Rombouts</i>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,23 +0,0 @@
|
||||||
|
|
||||||
versionfile = ../../version
|
|
||||||
arch = i686
|
|
||||||
arch2 = x86_64
|
|
||||||
extver = _sl6
|
|
||||||
system = Scientific Linux 6.2 system
|
|
||||||
|
|
||||||
doc: dl.html
|
|
||||||
.PHONY: doc clean
|
|
||||||
|
|
||||||
# If the existing dl.html contains '???', then certain packages were missing
|
|
||||||
# during the previous build and dl.html needs to be built again.
|
|
||||||
ifneq ($(shell grep -F -l -e '???' dl.html),)
|
|
||||||
.PHONY: dl.html
|
|
||||||
endif
|
|
||||||
|
|
||||||
dl.html: %.html: %.html.in htmlsubst.pl $(versionfile)
|
|
||||||
perl htmlsubst.pl version=`cat $(versionfile)` \
|
|
||||||
baseurl='http://members.home.nl/p.a.rombouts/pdnsd/' \
|
|
||||||
arch=$(arch) arch2=$(arch2) extver=$(extver) system="$(system)" $< > $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@rm -fv dl.html
|
|
|
@ -1,412 +0,0 @@
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>The pdnsd FAQ</title>
|
|
||||||
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
.small { font-family:helvetica; font-size:small; text-align:center; }
|
|
||||||
// -->
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body bgcolor="#EEEEEE">
|
|
||||||
<!--notext(-->
|
|
||||||
<table width="100%">
|
|
||||||
<tr>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="index.html">pdnsd Homepage</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="faq.html">pdnsd FAQ</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="doc.html">Documentation</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="../../COPYING">GNU GPL (pdnsd's License)</a>
|
|
||||||
</span> </td>
|
|
||||||
<td><span class="small">
|
|
||||||
<a href="dl.html">Download Section</a>
|
|
||||||
</span></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<!--)notext-->
|
|
||||||
<h1>The pdnsd FAQ</h1>
|
|
||||||
<a name="q001"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
There are complete and well-tested name servers around, such as the BIND.
|
|
||||||
These do also perform caching. Why should I use pdnsd?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
pdnsd does not aim to be a complete name server implementation, such as the
|
|
||||||
BIND. It is optimized for caching, and you can only specify a small subset of all
|
|
||||||
dns record types pdnsd knows in your local "zone" definitions.
|
|
||||||
This of course reduces the code size drastically, and such the memory footprint.
|
|
||||||
There are some features especially interesting for dialin networks, ordinary
|
|
||||||
(non-server) internet hosts and computers that are often not connected to
|
|
||||||
to their network, e.g. notebooks (I originally wrote this program for use
|
|
||||||
with my notebook).
|
|
||||||
These features are:
|
|
||||||
<ul>
|
|
||||||
<li> permanent disk cache (useful for frequent power-offs/reboots)
|
|
||||||
<li> usually smaller memory footprint (depends on cache size) (see next question)
|
|
||||||
<li> offline-detection prevents hangs (e.g. the typical hang on startup of some
|
|
||||||
Netscape Navigator versions if not dialled in)
|
|
||||||
<li> better control about timeouts (also to prevent hangs)
|
|
||||||
<li> better control over the cache
|
|
||||||
<li> better run-time control
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q002"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
When I look at the process size with ps, top, gtop, or a similar tool, I see
|
|
||||||
some processes with a total size well above 3.5 MB. This is much more than
|
|
||||||
e.g. BIND named (about 1.4 MB). Why?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
Really, it is not.
|
|
||||||
pdnsd uses multithreading, not multiprocessing. That means that the processes
|
|
||||||
share most of their process space. In the LinuxThreads library
|
|
||||||
or NPTL (Native Posix Thread Libary),
|
|
||||||
which are used by pdnsd on Linux, in fact the total process address space is shared
|
|
||||||
(although the processes have different stacks, these are in one process
|
|
||||||
address space). You may check this by looking at the at the process sizes of
|
|
||||||
the pdnsd threads: all should be the same. The effective size that pdnsd
|
|
||||||
occupies is thus the size of any of the processes, not the sum of those.
|
|
||||||
So, pdnsd with empty cache occupies about 800 kB, and the maximum size
|
|
||||||
should be about the cache size plus this size (in fact, ca 5-10% more).
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q003"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
What do I need the status control (option -s) for?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
It enables you to do some things you might or might not need. With it, you can:
|
|
||||||
<ul>
|
|
||||||
<li> query pdnsd's settings at runtime to debug configuration files and
|
|
||||||
see which servers are regarded to be available
|
|
||||||
<li> mark servers as available or unavailable, or force a status retest - very
|
|
||||||
handy if you want to control which servers pdnsd queries, e.g for muliple
|
|
||||||
dial-up accounts
|
|
||||||
<li> delete, invalidate or add DNS records - useful e.g. when you want to build
|
|
||||||
records for dynamically assigned IP addresses or domain names
|
|
||||||
<li> reload pdnsd's configuration file without restarting pdnsd
|
|
||||||
<li> print information about the contents of pdnsd's cache.
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q004"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
What do I need local records (rr- and source-sections in the config file) for?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
Some resolver programs, e.g. nslookup, want to look up the name of the
|
|
||||||
server they are using before doing anything else. This option is for defining
|
|
||||||
a PTR record for your IP such that those programs get an answer even if the
|
|
||||||
name server you are caching is not available or does not offer these records.
|
|
||||||
By extension, you may also define A and SOA records. This allows you to build
|
|
||||||
very small zones without having to use a "big" name server. It is NOT
|
|
||||||
intended to replace such a complete server in anything but VERY small
|
|
||||||
networks. Alternatively, you may start a named on another host or on the
|
|
||||||
same host on another port and cache it with pdnsd in addition to other (more
|
|
||||||
distant) name servers.
|
|
||||||
<br>
|
|
||||||
The <code>source</code> section allows you to let pdnsd read in your
|
|
||||||
<code>/etc/hosts</code> file on startup and serve its contents. This file is used by your local
|
|
||||||
resolver before it even tries the name servers and usually contains
|
|
||||||
fully-qualified domain names (FQDNs) for all of the internet addresses your host has.
|
|
||||||
If you source this file, you usually won't need any additional <code>rr</code> sections. Sourcing it also allows
|
|
||||||
other hosts (eg. in your local network) to access the names defined in your
|
|
||||||
hosts file. You can of course just add other hosts in your local network to the
|
|
||||||
servers <code>hosts</code> file, thus making them known to your server's resolver
|
|
||||||
and pdnsd (if you sourced that file).
|
|
||||||
<br>
|
|
||||||
If you don't know what this answer was all about, you should just take the
|
|
||||||
source section in the sample config file that comes with pdnsd, copy it
|
|
||||||
into your config file and forget about it.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q005"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
When compiling, I get an error message like <br><i>Please define __BYTE_ORDER to
|
|
||||||
be __LITTLE_ENDIAN or __BIG_ENDIAN</i><br> What's up?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
Normally, this macros should be defined in your C library's header files.
|
|
||||||
There are two different methods, most C libraries support both (and pdnsd
|
|
||||||
honors both): either <code>__BYTE_ORDER</code> is set to <code>__LITTLE_ENDIAN</code>
|
|
||||||
or <code>__BIG_ENDIAN</code>, or <code>__LITTLE_ENDIAN</code> or <code>__BIG_ENDIAN</code>
|
|
||||||
are directly defined as macros.
|
|
||||||
<br>
|
|
||||||
Linux glibc, for example, does set those macros correctly. Never mind. You just have to know
|
|
||||||
whether your machine is little-endian or big-endian, this means wheter your
|
|
||||||
machine saves the least significant byte of a word or double-word first in memory (little-endian) or
|
|
||||||
the most significant first (big-endian).
|
|
||||||
All intel x86 and Alpha machines are little-endian, for example, while SPARC
|
|
||||||
and PowerPC architectures are big-endian.
|
|
||||||
If your machine is little-endian, add the following line to your config.h:
|
|
||||||
<br><code>
|
|
||||||
#define __BYTE_ORDER __LITTLE_ENDIAN
|
|
||||||
</code><br>
|
|
||||||
Likewise, if your machines byte order is big-endian:
|
|
||||||
<br><code>
|
|
||||||
#define __BYTE_ORDER __BIG_ENDIAN
|
|
||||||
</code><br>
|
|
||||||
Pathological byte orders like pdp-endian are not yet supported really;
|
|
||||||
However, for the place the endianess is needed, <code>__LITTLE_ENDIAN</code> should do
|
|
||||||
(it deals only with 16 bits; for all other occurances, ntoh[sl]/hton[sl] is used).
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q007"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
At startup, I get a warning saying:<br>
|
|
||||||
<i>
|
|
||||||
Uptest command [...] will implicitly be executed as root
|
|
||||||
</i> <br>
|
|
||||||
What does that mean?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
This warning only occurs if you use the <code>uptest=exec</code> option in your
|
|
||||||
configuration. It means that the uptest command is run as root
|
|
||||||
because pdnsd is running as root, and this was not explicitely specified.
|
|
||||||
The idea is that it may introduce security holes (in the programs being run)
|
|
||||||
when they run as root, and so they shouldn't do that if possible.
|
|
||||||
You can specify the user that shall run the command by appending its name
|
|
||||||
comma-separated as string to the <code>uptest_cmd</code> line: <br>
|
|
||||||
<code>
|
|
||||||
uptest_cmd="<your command>","<user>";
|
|
||||||
</code> <br>
|
|
||||||
If it is correctly running as root, just append the user string <code>"root"</code> to
|
|
||||||
the command and the warning will not occur again.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q008"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
I cannot run my <code>uptest_cmd</code> command as root (it says <i>permission denied</i>),
|
|
||||||
although the pdnsd executable is setuid root. Why?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
pdnsd will drop privileges gained through setuid/setgid before executing the
|
|
||||||
uptest commands (you shouldn't set the pdnsd executable setuid/setgid anyway).
|
|
||||||
The reason is clear: if you install the pdnsd
|
|
||||||
executable as setuid root and this wouln't be done, any user could execute
|
|
||||||
shellcode with root privileges using that option!
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q009"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
At startup, I get an error saying:<br>
|
|
||||||
<i>
|
|
||||||
Bad config file permissions: the file must be only writeable by the user
|
|
||||||
</i><br>
|
|
||||||
Why is that?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
pdnsd has an option (<code>uptest=exec</code>) that allows the execution of arbitrary
|
|
||||||
shell code (for testing whether an interface is up). This must be
|
|
||||||
of course secured against unauthorized use. One of these
|
|
||||||
protection is the one that produces the error message: if you routinely run
|
|
||||||
pdnsd, e.g. at system startup, and your config file is editable for others,
|
|
||||||
someone could change it and insert shell code that is executed in the next
|
|
||||||
pdnsd run -- with your user privileges! To prevent this, pdnsd will exit if the config file is writeable
|
|
||||||
by others than the owner.
|
|
||||||
To get rid of this message, just do <br>
|
|
||||||
<code>
|
|
||||||
chmod go-w <filename>
|
|
||||||
</code><br>
|
|
||||||
on your config
|
|
||||||
file (for the default file: <code>chmod go-w /etc/pdnsd.conf</code>).
|
|
||||||
You should also check that the ownership is set correct.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q010"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
<code>serve_aliases</code> does not seem to work.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
Some resolvers (e.g. of the glibc 2.1) seem sometimes not to look up unmodified names, but the names with
|
|
||||||
an entry of the search path already appended. Since pdnsd will serve short names with this
|
|
||||||
option anyway, you can delete the search an domain options from your /etc/resolv.conf. This is reported to
|
|
||||||
work in some cases.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q011"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
Some queries for domains that have many records (e.g. www.gmx.de) fail mysteriously.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
pdnsd versions prior to 1.1.0 had the tcp server thread disabled by default. Most resolvers
|
|
||||||
repeat their query using tcp when they receive a truncated answer (the answer is truncated
|
|
||||||
when it exceeds a length of 512 bytes). You need to recompile pdnsd with the option
|
|
||||||
<code>--enable-tcp-server</code> to fix this.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q012"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
I am behind some kind of firewall. In the configuration file
|
|
||||||
I have only listed addresses of name servers on the local (ISP's) network,
|
|
||||||
but pdnsd is slow and DNS queries frequently time out.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
In some cases pdnsd will not consider the answer of the local name server
|
|
||||||
authoritative enough, and will try to get answers from the name servers listed in the
|
|
||||||
authority section of the reply message. If pdnsd is behind a firewall that blocks the
|
|
||||||
UDP reply packets from remote name servers, pdnsd will wait in vain for a reply.
|
|
||||||
One solution is to set <a href="doc.html#proxyonly"><code>proxy_only=on</code></a>
|
|
||||||
in the servers sections of the configuration file.
|
|
||||||
This will prevent pdnsd from querying name servers that are not listed in the configuration
|
|
||||||
file.
|
|
||||||
Another solution that can be tried is specifying
|
|
||||||
<a href="doc.html#querymethod"><code>query_method=tcp_only</code></a>
|
|
||||||
in the global section of the configuration file, because a firewall that blocks
|
|
||||||
UDP packets from outside might still allow outgoing TCP connections to port 53.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<hr>
|
|
||||||
<a name="q013"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
Is pdnsd vulnerable to DNS cache poisoning as described in
|
|
||||||
<a href="http://www.kb.cert.org/vuls/id/800113">CERT vulnerability note VU#800113</a>?
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
Short answer: Yes.<br>
|
|
||||||
Somewhat longer answer: The problem is not so much that pdnsd's implementation is flawed
|
|
||||||
but rather that the DNS protocol currently being used is fundamentally flawed from
|
|
||||||
a security viewpoint. As long as a more secure protocol is not in place,
|
|
||||||
all that the developers of pdnsd can do is to try to tweak the current implementation
|
|
||||||
to make it as difficult as possible for an attacker to succeed.<br>
|
|
||||||
From version 1.2.7 onwards, the default for the <code>query_port_start</code> option
|
|
||||||
is 1024, which means that the pdnsd resolver will randomly select source ports
|
|
||||||
in the range 1024-65535. (In previous versions the default was to let the kernel select
|
|
||||||
the source ports, which will often result in a more or less predictable sequence of ports.)
|
|
||||||
It also helps to use a good quality source of random numbers. On platforms where this is
|
|
||||||
supported, it is preferable to configure with <code>--with-random-device=/dev/urandom</code>.
|
|
||||||
There is still more that can be done to make pdnsd less vulnerable, but this remains
|
|
||||||
(as of this writing) a work in progress.
|
|
||||||
<br>
|
|
||||||
Please note that pdnsd was designed for small (private) networks, and that it is generally
|
|
||||||
not recommended to let untrusted users access pdnsd.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<!--<hr>
|
|
||||||
<a name="q014"></a>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>Q:</b></td>
|
|
||||||
<td bgcolor="#CCFFFF">
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF"><b>A:</b></td>
|
|
||||||
<td bgcolor="#DDFFEE">
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>-->
|
|
||||||
<hr>
|
|
||||||
<address><a href="mailto:tmoestl@gmx.net">Thomas Moestl</a>
|
|
||||||
and <a href="mailto:p.a.rombouts@home.nl">Paul Rombouts</a>
|
|
||||||
</address>
|
|
||||||
<br>
|
|
||||||
<p>
|
|
||||||
<i>Last revised: 18 August 2008 by Paul Rombouts</i>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
# Primitive ad-hoc script for updating pdnsd html doc files.
|
|
||||||
# Written by Paul Rombouts.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use integer;
|
|
||||||
use POSIX qw(strftime);
|
|
||||||
|
|
||||||
my %paramvals=();
|
|
||||||
|
|
||||||
while(@ARGV && $ARGV[0]=~/^([^=]*)=(.*)$/) {
|
|
||||||
my $param=$1; my $val=$2;
|
|
||||||
if($param =~ /^[[:alpha:]]\w*$/) {
|
|
||||||
$paramvals{$param}=$val;
|
|
||||||
}
|
|
||||||
else {warn "Warning: invalid parameter '$param' ignored.\n"}
|
|
||||||
shift @ARGV;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub sizeof {
|
|
||||||
my($arg)=@_;
|
|
||||||
(my $str= $arg) =~ s/\$(?:([[:alpha:]]\w*)\b|\{([[:alpha:]]\w*)\})/
|
|
||||||
defined($paramvals{$+})?$paramvals{$+}:defined($ENV{$+})?$ENV{$+}:''/eg;
|
|
||||||
my $filename=eval($str);
|
|
||||||
(-f $filename) or return '???';
|
|
||||||
(((-s $filename)+1023)/1024).'kB';
|
|
||||||
}
|
|
||||||
|
|
||||||
while(<>) {
|
|
||||||
s/\$(?:date\b|\{date\})/strftime("%d %b %Y",localtime)/eg;
|
|
||||||
s/\$sizeof\(([^()]*)\)/sizeof($1)/eg;
|
|
||||||
s/\$(?:([[:alpha:]]\w*)\b|\{([[:alpha:]]\w*)\})/
|
|
||||||
defined($paramvals{$+})?$paramvals{$+}:defined($ENV{$+})?$ENV{$+}:''/eg;
|
|
||||||
print;
|
|
||||||
}
|
|
|
@ -1,686 +0,0 @@
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>pdnsd homepage</title>
|
|
||||||
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
.small { font-family:helvetica; font-size:small; text-align:center; }
|
|
||||||
// -->
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body bgcolor="#EEEEEE">
|
|
||||||
<!-- This html code is used for the homepage and for the pdnsd documentation. Since there are some sections that
|
|
||||||
are unwanted in the documentation (particularly the link section with non-local images), and some things that shall
|
|
||||||
not appear in the textified version (some links etc), I introduce 4 tags: the homepage html code is translated to
|
|
||||||
documentation html code by replacing the "nodoc(" comment with the html start comment tag, and the ")nodoc" comment
|
|
||||||
with the html end comment tag.
|
|
||||||
Likewise, before the doc html version is translated to text, the "notext(" and ")notext" comments are translated to
|
|
||||||
html comment tags.
|
|
||||||
-->
|
|
||||||
<!--notext(-->
|
|
||||||
<table width="100%">
|
|
||||||
<tr>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="index.html#aboutpdnsd">About pdnsd</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="faq.html">pdnsd FAQ</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="doc.html">Documentation</a>
|
|
||||||
</span></td>
|
|
||||||
<td> <span class="small">
|
|
||||||
<a href="../../COPYING">GNU GPL (pdnsd's License)</a>
|
|
||||||
</span> </td>
|
|
||||||
<td><span class="small">
|
|
||||||
<a href="dl.html">Download Section</a>
|
|
||||||
</span></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<center><h1>The pdnsd Homepage</h1></center>
|
|
||||||
<center><h2>News</h2></center>
|
|
||||||
<table width="100%" cellspacing=1 cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2012-03-17</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.9a-par has been released.</b>
|
|
||||||
Version 1.2.9a fixes a bug in the 1.2.9 release that causes a build failure when pdnsd is
|
|
||||||
configured with <span style="white-space:nowrap;"><code>--enable-strict-rfc2181</code></span>.
|
|
||||||
If you do not use this option to compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2012-02-27</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.9-par has been released.</b>
|
|
||||||
Version 1.2.9 supports many more RR types (including those necessary for DNSSEC) and
|
|
||||||
EDNS (Extension mechanisms for DNS) to enable UDP messages larger than 512 bytes.
|
|
||||||
It also has support for defining local TXT records and has several new options and bugfixes
|
|
||||||
(including file descriptor leaks that effect FreeBSD users).
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2011-05-03</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>The latest source code is available from a
|
|
||||||
<a href="http://gitorious.org/pdnsd">git repository</a>.</b><br>
|
|
||||||
In response to frequent requests I have uploaded a git tree including the latest code
|
|
||||||
and a fairly extensive history of pdnsd development to
|
|
||||||
<a href="http://gitorious.org/pdnsd/pdnsd">gitorious.org</a>.
|
|
||||||
Anyone who wants to participate in pdnsd development is free to create a
|
|
||||||
<a href="http://gitorious.org/pdnsd/pdnsd/clone">clone repo on gitorious.org</a>
|
|
||||||
and push his modifications there.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2010-02-22</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.8-par has been released.</b>
|
|
||||||
The main new feature of version 1.2.8 is automatic discovery of root servers.
|
|
||||||
Furthermore, there are some additional improvements in the resolver.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2008-09-04</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.7-par has been released.</b>
|
|
||||||
Foremost, this release fixes some security problems.
|
|
||||||
It contains a fix for a "dangling pointer" bug that could cause pdnsd to
|
|
||||||
crash when it received a long reply. It also addresses some of the issues
|
|
||||||
raised in the <a href="http://www.kb.cert.org/vuls/id/800113">CERT
|
|
||||||
vulnerability note VU#800113</a> by making the default of
|
|
||||||
<code>query_port_start</code> equal to 1024, thereby ensuring that source
|
|
||||||
ports are randomly selected by the pdnsd resolver in the range 1024-65535.
|
|
||||||
This release also fixes problems with compiling pdnsd for the ARM architecture
|
|
||||||
and for the Darwin platform (Max OS X).
|
|
||||||
<br>
|
|
||||||
There are a number of (minor) new features.
|
|
||||||
pdnsd now supports "include" files, essentially configuration files that
|
|
||||||
only contain definitions for local records.
|
|
||||||
It is now possible to define interactively, using <code>pdnsd-ctl</code>,
|
|
||||||
any local record that can be defined in a configuration file.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2007-09-04</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.6-par has been released.</b>
|
|
||||||
pdnsd's license has been upgraded to GPL version 3.
|
|
||||||
A bug has been fixed which which caused pdnsd to handle NXDOMAIN replies
|
|
||||||
inefficiently when configured with <code>neg_domain_pol=on</code>. The
|
|
||||||
code that implements the ping test has been fixed, which was broken for
|
|
||||||
64-bit systems. A new option <code>randomize_servers</code> can be used
|
|
||||||
to give each server in a section of the configuration file an equal
|
|
||||||
chance of being queried. The new options <code>reject</code>,
|
|
||||||
<code>reject_policy</code> and <code>reject_recursively</code> make it
|
|
||||||
possible to check for the presence of certain IP addresses in the
|
|
||||||
replies of name servers and to avoid some types of unwanted replies.
|
|
||||||
The pdnsd-ctl '<code>add a</code>' and '<code>add aaaa</code>' commands
|
|
||||||
now allow multiple IP addresses to be specified for the same name.
|
|
||||||
pdnsd's ability to resolve from root servers has been improved.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2006-09-02</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.5-par has been released.</b>
|
|
||||||
This release introduces a new query method: <code>udp_tcp</code>.
|
|
||||||
With this method a UDP query is tried first and, if the UDP answer is
|
|
||||||
truncated, the query is repeated using TCP, which is the behaviour that
|
|
||||||
seems to be recommended by the DNS standards. There is a new
|
|
||||||
configuration option <code>use_nss</code>, which can be turned off to
|
|
||||||
prevent lengthy timeouts and stalls in certain situations. A bug has
|
|
||||||
been fixed which could cause pdnsd to crash if debug output was
|
|
||||||
generated before the debug output stream was properly initialized.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2006-01-09</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.4-par has been released.</b>
|
|
||||||
A memory leak and a minor buffer-overflow problem have been fixed.
|
|
||||||
There is now a fix for some situations that would previously cause pdnsd to
|
|
||||||
exit prematurely (such as ACPI S3 sleep or trying to attach strace to pdnsd).
|
|
||||||
Time intervals specified in the configuration file can now be expressed in
|
|
||||||
minutes, hours, days and weeks as well as seconds.
|
|
||||||
Support for Apple Mac OS X v10.4 Tiger has been improved.
|
|
||||||
The "<code>pdnsd-ctl status</code>" command now also provides some
|
|
||||||
information about the status of the running threads.
|
|
||||||
There are some further improvements in the debugging information provided by pdnsd.<br>
|
|
||||||
TCP-query support is now compiled in by default (but can still be disabled using
|
|
||||||
the configure option <code>--disable-tcp-queries</code>).
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2005-07-11</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.3-par has been released.</b>
|
|
||||||
New feature in this release: the "<code>pdnsd-ctl empty-cache</code>" command can
|
|
||||||
be provided with an include/exclude list, allowing the user to specify a
|
|
||||||
selection of names to be removed, instead of emptying the cache completely.<br>
|
|
||||||
Additional improvements: pdnsd should now remain responsive while executing the
|
|
||||||
"<code>pdnsd-ctl empty-cache</code>" command.
|
|
||||||
With the <code>query_method=tcp_udp</code> option pdnsd will now also
|
|
||||||
try a UDP query after a TCP connection times out, which should allow
|
|
||||||
pdnsd to resolve the same names with <code>query_method=tcp_udp</code>
|
|
||||||
as with <code>query_method=udp_only</code>, although perhaps with an
|
|
||||||
occasional delay.
|
|
||||||
"<code>pdnsd-ctl config</code>" or "<code>pdnsd-ctl server</code>"
|
|
||||||
commands should now run without delays, even if pdnsd is performing
|
|
||||||
<code>ping</code> or <code>query</code> uptests at the time.
|
|
||||||
Some problems with resolving certain names using root servers have been fixed.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2005-04-03</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.2-par has been released.</b>
|
|
||||||
The main emphasis of this release is improved portability.
|
|
||||||
A bug has been fixed that prevented pdnsd from compiling successfully on some
|
|
||||||
64 bit architectures.
|
|
||||||
This release has (experimental) support for the Darwin (Apple Mac OS X) platform.
|
|
||||||
On Linux systems, the configure script will now try to detect automatically whether
|
|
||||||
the system implements the Native POSIX Thread Library, but the method used may not
|
|
||||||
necessarily be foolproof.
|
|
||||||
In addition, the debug features have been improved and should make it easier to find out
|
|
||||||
why pdnsd considers some queries or replies malformed.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2004-11-07</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2.1-par has been released.</b>
|
|
||||||
The main new feature of this release is improved support for non-Linux platforms.<br>
|
|
||||||
This release has (experimental) support for the Cygwin platform, and should also fix
|
|
||||||
some compilation glitches that have been reported by FreeBSD users.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2004-10-10</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.2-par has been released.</b>
|
|
||||||
pdnsd is new and improved! Most of the changes effect the internal workings
|
|
||||||
of pdnsd, but there also a number of interesting new features (well, I think they are interesting).<br>
|
|
||||||
Among the bugs fixed are two rather nasty ones which involve the handling of NXT and NAPTR records
|
|
||||||
and which can cause pdnsd to crash or abort.<br>
|
|
||||||
The new features include a new server availability test which can be specified with <code>uptest=query</code>,
|
|
||||||
support for reading the DNS configuration from resolv.conf files,
|
|
||||||
a new option for optimizing the use of root servers,
|
|
||||||
a new option that makes defining local records for reverse resolving easier,
|
|
||||||
support for defining wildcard records,
|
|
||||||
a new pdnsd-ctl command for reloading the config file without restarting pdnsd, and
|
|
||||||
a new pdnsd-ctl command for dumping information about the names stored in the cache.
|
|
||||||
The documentation has also been updated: there is now a <code>pdnsd.conf</code> man page.<br>
|
|
||||||
For a more complete list of the changes I'll have to refer you to <a href="../../README.par"><code>README.par</code></a> and the <a
|
|
||||||
href="../../ChangeLog"><code>ChangeLog</code></a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2004-05-22</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.11a-par has been released.</b>
|
|
||||||
This release contains a fix for FreeBSD users that bypasses a problem
|
|
||||||
with the macro <code>ENONET</code>, which can cause a compilation failure when it is undefined.
|
|
||||||
Linux users will notice no difference between 1.1.11a-par and 1.1.11-par.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2004-05-10</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.11-par has been released.</b>
|
|
||||||
This version has a rather large number of small changes, which are rather difficult to summarize.
|
|
||||||
Among the bugs fixed are a race condition in the cache lookup code, a
|
|
||||||
flaw in the code that caused a busy spin when a remote server answered
|
|
||||||
with "Not Implemented", and problems with the -4 and -6 command-line
|
|
||||||
options. Among the improvements are an alternative sorting algorithm
|
|
||||||
which should allow pdnsd to start up faster when reading a large cache
|
|
||||||
file from disk, automatic mapping of IPv4 to IPv6 addresses when running
|
|
||||||
in IPv6 mode, somewhat more efficient memory use, better compression of
|
|
||||||
the replies and changes in the parallel querying algorithm that should
|
|
||||||
improve the chances of catching a reply from a remote server.<br>
|
|
||||||
|
|
||||||
For a more complete list of the changes I'll have to refer you to <a href="../../README.par"><code>README.par</code></a> and the <a
|
|
||||||
href="../../ChangeLog"><code>ChangeLog</code></a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2004-02-10</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.10-par has been released.</b>
|
|
||||||
|
|
||||||
The main new feature of this release is a new parser for configuration
|
|
||||||
files, completely rewritten from scratch in C. The main advantages are:
|
|
||||||
(f)lex and yacc/bison are no longer needed to build pdnsd, more
|
|
||||||
informative error messages instead of merely "<code>parse error</code>",
|
|
||||||
and string literals no longer need to be enclosed in quotes in most
|
|
||||||
cases.<br> Furthermore, a bug has been fixed that caused incorrect
|
|
||||||
IPV6-type PTR records to be generated when sourcing
|
|
||||||
<code>/etc/hosts</code> like files.<br>
|
|
||||||
|
|
||||||
There have been other small changes, more details can be found in the <a
|
|
||||||
href="../../ChangeLog"><code>ChangeLog</code></a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2004-01-08</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.9-par has been released.</b>
|
|
||||||
"maintenance" release by Paul Rombouts.<br>
|
|
||||||
|
|
||||||
The change of version number is not very significant; the
|
|
||||||
difference between 1.1.9-par and the previous 1.1.8b1-par8 is marginal.
|
|
||||||
However, I felt the need to simplify the numbering, because it was
|
|
||||||
becoming rather baroque.<br>
|
|
||||||
|
|
||||||
I've added some missing pieces to the documentation (the pdnsd <a
|
|
||||||
href="doc.html">manual</a> and the man page for pdnsd-ctl). BTW, did you
|
|
||||||
know that it's possible to define aliases for domain names with pdnsd? I
|
|
||||||
had plans to implement such a feature when I discovered that pdnsd
|
|
||||||
already supports it. It was just poorly documented. (If want to try this
|
|
||||||
for your self, look for the new information about CNAME records under
|
|
||||||
the rr Section in the <a href="doc.html#rrsection">manual</a>.)<br> The
|
|
||||||
changes to the code consist mostly of optimizations, removal of some
|
|
||||||
size limits due to fixed-size buffers, and some cleaning up. I've also
|
|
||||||
tried to make the error responses of <a
|
|
||||||
href="doc.html#pdnsdctl"><code>pdnsd-ctl</code></a> more helpful.<br>
|
|
||||||
|
|
||||||
More details can be found in the <a href="../../ChangeLog"><code>ChangeLog</code></a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2003-10-10</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.8b1-par8 has been released.</b>
|
|
||||||
"maintenance" release by Paul Rombouts.<br>
|
|
||||||
This version introduces a "delegation-only" feature that may be useful
|
|
||||||
for blocking Verisign's Sitefinder.<br>
|
|
||||||
The parser for the configuration file now tolerates domain names missing
|
|
||||||
a dot at the end.<br>
|
|
||||||
I have provided alternative implementations for some GNU extensions that I
|
|
||||||
used in an effort to make the code more portable. In particular, the
|
|
||||||
code should build on FreeBSD again.<br>
|
|
||||||
More details can be found in the <a href="../../README.par"><code>README.par</code></a> file.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2003-09-19</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.8b1-par7 has been released.</b>
|
|
||||||
"maintenance" release by Paul Rombouts. Besides fixing a number of bugs I have
|
|
||||||
reworked some of the code for adding and removing entries in the cache in an
|
|
||||||
effort to improve efficiency and stability.<br>
|
|
||||||
More details can be found in the <a href="../../ChangeLog"><code>ChangeLog</code></a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2003-07-28</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.8b1-par6 has been released.</b>
|
|
||||||
"maintenance" release by Paul Rombouts. In addition to some further code cleanup,
|
|
||||||
the documentation has been revised.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2003-07-10</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.8b1-par5 has been released.</b>
|
|
||||||
A troublesome allocation size error has been discovered in Thomas Moestl's code.
|
|
||||||
In practice this bug only wastes memory but it could
|
|
||||||
also potentially lead to memory corruption. Upgrading is recommended.
|
|
||||||
More details can be found in the <code>ChangeLog</code>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#ffccff" width="20%"><b>2003-06-30</b></td>
|
|
||||||
<td bgcolor="#ccffff" width="80%"><b>Version 1.1.8b1-par4 has been released.</b>
|
|
||||||
Due to incompatibilities between various implementations of
|
|
||||||
the pthread library on Linux systems, problems can occur with signal handling in
|
|
||||||
pdnsd. The usual symptom is failure by pdnsd to save the cache to disk, and
|
|
||||||
<code>/var/cache/pdnsd/pdnsd.cache</code> remaining empty. If you experience
|
|
||||||
this kind of trouble, try reconfiguring with different values for the new
|
|
||||||
<code>--with-thread-lib</code> option. The allowable values are
|
|
||||||
described in the <a href="doc.html#threadlib">documentation</a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF" width="20%"><b>2003-04-07</b></td>
|
|
||||||
<td bgcolor="#CCFFFF" width="80%"><b>pdnsd is no longer maintained by Thomas Moestl:</b>
|
|
||||||
I have not had time to maintain pdnsd for quite a while now, and have been very slow to
|
|
||||||
respond to issues, or did not respond at all. It is time that I officially announce that
|
|
||||||
pdnsd is no longer actively maintained; I apologize to all those who reported bugs or
|
|
||||||
asked questions without receiving any reply. However, <b>Paul A. Rombouts</b> has published
|
|
||||||
a patch set against the last released version at
|
|
||||||
<a href="http://members.home.nl/p.a.rombouts/pdnsd.html">http://members.home.nl/p.a.rombouts/pdnsd.html</a>,
|
|
||||||
which cleans up a lot of code fixes many bugs.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF" width="20%"><b>2002-07-19</b></td>
|
|
||||||
<td bgcolor="#CCFFFF" width="80%"><b>Documentation update.</b>
|
|
||||||
Please note that pdnsd should <b>never be installed with setuid or setgid attributes</b>,
|
|
||||||
as it is not always possible to give up all privileges due to operating system restrictions.
|
|
||||||
While this was never intended and I don't think that anybody would actually do this, the
|
|
||||||
documentation was updated to explicitely mention this to avoid misunderstandings.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF" width="20%"><b>2002-01-15</b></td>
|
|
||||||
<td bgcolor="#CCFFFF" width="80%"><b>Version 1.1.7a has been released.</b>
|
|
||||||
This fixes a reversed test in an assertion that would cause pdnsd to termintate when the ping uptest
|
|
||||||
was used. No other changes were made.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="#FFCCFF" width="20%"><b>2002-01-15</b></td>
|
|
||||||
<td bgcolor="#CCFFFF" width="80%"><b>Version 1.1.7 has been released.</b>
|
|
||||||
This fixes some problems that might be remotely exploitable to gain access as the user pdnsd runs as
|
|
||||||
(an unprivileged user by default). To do this, an attacker needs to control a name server that is
|
|
||||||
queried by pdnsd, and send a malicious reply to such a query.<br>
|
|
||||||
Upgrading is strongly recommended!<br>
|
|
||||||
There are also minor bug fixes and stability improvements.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<!--)notext-->
|
|
||||||
<hr>
|
|
||||||
<h2><a name="aboutpdnsd">About pdnsd</a></h2>
|
|
||||||
pdnsd is a proxy DNS server with permanent caching (the cache contents
|
|
||||||
are written to hard disk on exit) that is designed to cope with unreachable
|
|
||||||
or down DNS servers (for example in dial-in networking).<br>
|
|
||||||
Since version 1.1.0, pdnsd supports negative caching.<br>
|
|
||||||
<br>
|
|
||||||
It is licensed under the <a HREF="http://www.gnu.org">GNU</a> General Public License (<a HREF="../../COPYING">GPL</A><!--notext(-->,
|
|
||||||
<a HREF="http://www.gnu.org/copyleft/gpl.html">also available in html</A> and
|
|
||||||
<a HREF="http://www.gnu.org/copyleft/copyleft.html#translations">translated into various languages</A>.<!--)notext-->).
|
|
||||||
This, in short, means that the sources are distributed togehter with the program, and
|
|
||||||
that you are free to modify the sources and redistribute them as long as you
|
|
||||||
also license them under the GPL. You do not need to pay anything for pdnsd.
|
|
||||||
It also means that there is <b>ABSOLUTELY NO WARRANTY</b> for pdnsd or any part
|
|
||||||
of it. For details, please <a href="../../COPYING">read the GPL</a>.
|
|
||||||
<p>
|
|
||||||
pdnsd can be used with applications that do DNS lookups, e.g. on startup, and
|
|
||||||
can't be configured to change that behaviour, to prevent the often minute-long
|
|
||||||
hangs (or even crashes) that result from stalled DNS queries. Some Netscape Navigator
|
|
||||||
versions for Unix, for example, expose this behaviour.
|
|
||||||
</p>
|
|
||||||
pdnsd is configurable via a file and supports run-time configuration using the program pdnsd-ctl that comes
|
|
||||||
with pdnsd. This allows you to set the status flags of servers that pdnsd knows (to influence which servers
|
|
||||||
pdnsd will query), and the addition, deletion and invalidation of DNS records in pdnsd's cache.
|
|
||||||
<br>
|
|
||||||
Parallel name server queries are supported. This is a technique that allows
|
|
||||||
querying several servers at the same time so that very slow or unavailable
|
|
||||||
servers will not block the answer for one timeout interval.
|
|
||||||
<br>
|
|
||||||
Since version 1.0.0, pdnsd has full IPv6 support.
|
|
||||||
<p>
|
|
||||||
There is also a limited support for local zone records, intended for defining
|
|
||||||
1.0.0.127.in-addr.arpa. and localhost. , since some clients request that
|
|
||||||
information and it must be served even if the cached servers are not available
|
|
||||||
or do not serve these records. pdnsd may also read your /etc/hosts file
|
|
||||||
(this file is normally used by your local resolver and usually contains
|
|
||||||
information for localhost as well as for your machines FQDN) and serve its
|
|
||||||
contents.
|
|
||||||
</p> <p>
|
|
||||||
pdnsd was started on Linux, and has since been ported to FreeBSD (and Cygwin and Darwin).
|
|
||||||
90% of the source code should be easily portable to POSIX-
|
|
||||||
and BSD-compatible systems, provided that those systems support the POSIX threads (pthreads).
|
|
||||||
The rest might need OS-specific rewrites.
|
|
||||||
</p><p>
|
|
||||||
Currently, pdnsd is only compileable by gcc. This should be easy to fix, but I just
|
|
||||||
do not have documentation for other compilers. If you are not able or do not want
|
|
||||||
to use gcc, I would recommend you just try to do the minor changes.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
pdnsd must be started as root in some cases (raw sockets are needed for icmp
|
|
||||||
echoes for the option <code>uptest=ping</code>, and the default port is 53, this must be
|
|
||||||
>1024 to allow non-root execution). However, pdnsd can be configured to change it's user
|
|
||||||
and group id to those of a non-privileged user after opening the sockets needed for this.
|
|
||||||
</p> <p>
|
|
||||||
The server should support the full standard DNS queries following the rfcs 1034
|
|
||||||
and 1035. As of version 1.0.0, the rfc compliance has been improved again, and pdnsd is now
|
|
||||||
believed (or hoped?) to be fully rfc-compatible. It completely follows rfc 2181 (except
|
|
||||||
for one minor issue in the FreeBSD port, see the <a href="doc.html">documentation</a>).
|
|
||||||
It does not support the
|
|
||||||
following features, of which most are marked optional, experimental or obsolete
|
|
||||||
in these rfcs:
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li> Inverse queries
|
|
||||||
<li> Status queries
|
|
||||||
<li> Completion queries
|
|
||||||
<li> Namespaces other than IN (Internet)
|
|
||||||
<li> AXFR and IXFR queries (whole zone transfers); since pdnsd does not maintain zones, that should not violate the standard
|
|
||||||
</ul>
|
|
||||||
The following record types, that are extensions to the original DNS standard, are supported for caching since version 1.2.9
|
|
||||||
(if you do not need most of them, you can disable runtime support for the unneeded ones before compiling pdnsd and save a little cache and executable space, see the source file <code>src/rr_types.in</code>):
|
|
||||||
<ul>
|
|
||||||
<li> RP (<i>responsible person</i>, RFC 1183)
|
|
||||||
<li> AFSDB (<i>AFS database location</i>, RFC 1183)
|
|
||||||
<li> X25 (<i>X25 address</i>, RFC 1183)
|
|
||||||
<li> ISDN (<i>ISDN number/address</i>, RFC 1183)
|
|
||||||
<li> RT (<i>route through</i>, RFC 1183)
|
|
||||||
<li> NSAP (<i>Network Service Access Protocol address </i>, RFC 1348)
|
|
||||||
<li> PX (<i>X.400/RFC822 mapping information</i>, RFC 1995)
|
|
||||||
<li> GPOS (<i>geographic position</i>, deprecated)
|
|
||||||
<li> AAAA (<i>IPv6 address</i>, RFC 1886)
|
|
||||||
<li> LOC (<i>location</i>, RFC 1876)
|
|
||||||
<li> EID (<i>Nimrod EID</i>)
|
|
||||||
<li> NIMLOC (<i>Nimrod locator</i>)
|
|
||||||
<li> SRV (<i>service record</i>, RFC 2782)
|
|
||||||
<li> ATMA (<i>ATM address</i>)
|
|
||||||
<li> NAPTR (<i>URI mapping</i>, RFC 2168)
|
|
||||||
<li> KX (<i>key exchange</i>, RFC 2230)
|
|
||||||
<li> CERT (<i>Certificate record</i>, RFC 4398)
|
|
||||||
<li> DS (<i>Delegation Signer</i>, RFC 4034)
|
|
||||||
<li> RRSIG (<i>Resource Record Signature</i>, RFC 4034)
|
|
||||||
<li> NSEC (<i>Next Secure</i>, RFC 4034)
|
|
||||||
<li> DNSKEY (<i>record containing the public key for a zone</i>, RFC 4034)
|
|
||||||
<li> NSEC3 (<i>Next Secure version 3</i>, RFC 5155)
|
|
||||||
<li> NSEC3PARAM (<i>NSEC3 parameters</i>, RFC 5155)
|
|
||||||
</ul>
|
|
||||||
<p style="text-indent: 1em;">
|
|
||||||
<i><b>Note</b>: This list is incomplete. For the complete list see the source file</i> <code>src/rr_types.in</code>.
|
|
||||||
</p>
|
|
||||||
There are FreeBSD and OpenBSD ports available for pdnsd (ports/net/pdnsd for both).
|
|
||||||
Thanks go to Roman Shterenzon for the FreeBSD port Sebastian Stark for the OpenBSD one!
|
|
||||||
Thanks to Kiyo Kelvin Lee now also runs on the Cygwin platform!
|
|
||||||
Thanks goes to Rodney Brown for extending portability to the Darwin (Apple Mac OS X) platform!
|
|
||||||
<p>
|
|
||||||
If you have questions left, you should take a look into the <a HREF="faq.html">FAQ</a>.
|
|
||||||
<br>
|
|
||||||
Bugfixes, patches and compatability fixes for other OSs are very welcome!
|
|
||||||
</p>
|
|
||||||
<h2>Features in detail</h2>
|
|
||||||
<p>
|
|
||||||
This section describes some of pdnsds features in detail. Most of the options are set
|
|
||||||
in the config file. For more information on the configuration file, see
|
|
||||||
<a href="doc.html">the documenation page</a>.
|
|
||||||
</p><br>
|
|
||||||
|
|
||||||
<h3>Uptests</h3>
|
|
||||||
pdnsd provides several methods to test whether a remote DNS server should be regarded as available
|
|
||||||
(so that pdnsd can query it), in
|
|
||||||
addition to the obvious "none" test (the server is always regarded as available,
|
|
||||||
or availability is set on or off using the <a href="doc.html#pdnsdctl"><code>pdnsd-ctl</code></a> utility).
|
|
||||||
These tests are:
|
|
||||||
<ul>
|
|
||||||
<li><b>ping:</b> a given adress is ping'ed in a given interval. If it there is no response
|
|
||||||
or the host is unreachable, the server is seen to be not available (for those who don't know:
|
|
||||||
pinging is sending a certain Internet packet type to a host to which any standard-conformant
|
|
||||||
host is required to reply).
|
|
||||||
<li><b>if:</b> a given network interface is tested whether it is existent, up and running. If
|
|
||||||
it is not, the server is regarded to be not available. This is especially useful for ppp and
|
|
||||||
similar interfaces. A special case test for Linux isdn (ippp*) interfaces is integrated, so that the uptests
|
|
||||||
should also work for these.
|
|
||||||
<li><b>dev:</b> this is a variant of the if uptest for use with Linux dial-on-demand ppp interfaces. In addition
|
|
||||||
to performing an if-style interface uptest, it also tests whether a specified program (e.g. pppd) owns
|
|
||||||
a lock to a given (modem-) device.
|
|
||||||
<li><b>exec:</b> a given shell command line is executed and the exit status of the whole command line (which
|
|
||||||
is normally the exit status of the last command) is evaluated. If it is not zero, the server is regarded
|
|
||||||
to be not available. This is a very flexible testing method with which it should be able to perform
|
|
||||||
virtually any needed test.
|
|
||||||
<li><b>query:</b> <em>New in version 1.2:</em>
|
|
||||||
This works like the ping test, except it sends an (empty) DNS query to the remote server.
|
|
||||||
If the server sends a well-formed response back within the timeout period (except SERVFAIL),
|
|
||||||
it will be regarded as available.
|
|
||||||
This test is useful if a remote server does not respond to ICMP_ECHO requests at all,
|
|
||||||
which unfortunately is quite common these days.
|
|
||||||
In many cases this test will be a more reliable indicator of availability
|
|
||||||
than the ones mentioned above.
|
|
||||||
</ul>
|
|
||||||
<br>
|
|
||||||
<h3>Local Records ("Zones")</h3>
|
|
||||||
As mentioned above, there are only very basic local record types (ie the record types that you may use in record
|
|
||||||
declarations in your local configuration for records that pdnsd shall serve in addion to the cached ones).
|
|
||||||
They are organized roughly in zones but have not complete zone declarations, so I generally do not use the
|
|
||||||
term "zone" for them, but rather "local records".
|
|
||||||
These are the local record types pdnsd can understand:
|
|
||||||
<ul>
|
|
||||||
<li> <b>SOA</b> (information about the name server)
|
|
||||||
<li> <b>A</b> (domain-name-to-address mapping)
|
|
||||||
<li> <b>PTR</b> (pointer, used normally for address-to-domain-name mapping)
|
|
||||||
<li> <b>NS</b> (name server, generated automatically by pdnsd for any local record set)
|
|
||||||
<li> <b>CNAME</b> (canonical host name)
|
|
||||||
<li> <b>MX</b> (mail exchange for the domain)
|
|
||||||
<li> <b>TXT</b> (arbitrary text strings, often used for Sender Policy Framework)
|
|
||||||
</ul>
|
|
||||||
You can specify these records in the configuration file. <br>
|
|
||||||
You may "source" a file in a format like that used in the <code>/etc/hosts</code> file, that means
|
|
||||||
that pdnsd reads this file, extracts addresses and domain names from it and automatically generates
|
|
||||||
A records for name to address mapping, PTR records for address to name mapping and NS records (name
|
|
||||||
server specifiation) for each entry in the file.<br>
|
|
||||||
Records can also be changed dynamically at run time.<br>
|
|
||||||
A script contributed by Marko Stolle makes pdnsd usable in a DHCP setup using this feature.
|
|
||||||
<br>
|
|
||||||
<h1>System requirements</h1>
|
|
||||||
As mentioned, pdnsd currently runs under Linux, FreeBSD and Cygwin.
|
|
||||||
Other BSD flavours may or may not work (feedback is very welcome!).
|
|
||||||
The system and software requirements under Linux are:
|
|
||||||
<ul>
|
|
||||||
<li> Kernel version >2.2.0
|
|
||||||
<li> glibc version >2.0.1 (aka libc6) with LinuxThreads (normally included)
|
|
||||||
or NPTL (Native Posix Thread Library, recommended).<br>
|
|
||||||
Due to a bug, pdnsd 0.9.8 does not run with glibc2.1.1. This behaviour was
|
|
||||||
fixed in pdnsd 0.9.9.
|
|
||||||
<li> For IPv6: glibc>=2.1
|
|
||||||
</ul>
|
|
||||||
The system requirements under FreeBSD are:
|
|
||||||
<ul>
|
|
||||||
<li> FreeBSD versions >=2.6 (prior ones may or may not work)
|
|
||||||
<li> For IPv6: FreeBSD >=4.0 is recommended (no idea if it runs on prior versions)
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
The common software requirements for all supported systems are:
|
|
||||||
<ul>
|
|
||||||
<li> GCC, preferably egcs-2.* or 3.* (other compilers are currently not supported; the needed patch for another compiler
|
|
||||||
should not be difficult, however)
|
|
||||||
<li> GNU or BSD make
|
|
||||||
<li> the standard commands install, grep, sed, awk, touch and which (along with the REALLY
|
|
||||||
standard ones mv, cp, ln, rm, pwd, test, echo, cat, mkdir, chown, chmod, tar). In
|
|
||||||
any standard Unix installation, this should be no problem.
|
|
||||||
<li> for hacking and building own packages, you might also need gzip, bzip2, perl and rpmbuild
|
|
||||||
</ul>
|
|
||||||
<br>
|
|
||||||
<h1>Download</h1>
|
|
||||||
If you want to download pdnsd, please visit the <a href="dl.html">download page</a>.
|
|
||||||
<br>
|
|
||||||
<h1><a name="authors">Authors</a></h1>
|
|
||||||
<p>
|
|
||||||
pdnsd was originally written by <a href="mailto:tmoestl@gmx.net">Thomas Moestl</a>,
|
|
||||||
but is no longer maintained by him. <a href="mailto:p.a.rombouts@home.nl">Paul A. Rombouts</a>
|
|
||||||
has revised large portions of the code and has added a number of new features.
|
|
||||||
See <a href="../../README.par"><code>README.par</code></a> and the <a href="../../ChangeLog"><code>ChangeLog</code></a>
|
|
||||||
in the source directory (or <code>/usr/share/doc/pdnsd-<version></code>
|
|
||||||
if you have installed a binary package) for more details.
|
|
||||||
If you have questions about the recent modifications, you can find
|
|
||||||
<a name="currentmaintainer">the email address of the current maintainer</a>
|
|
||||||
at the end of <a href="../../README.par"><code>README.par</code></a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Daniel Smolik has contributed RedHat RPMs (the most recent RPMs are available <a href="dl.html">here</a>).<br>
|
|
||||||
Torben Janssen contributed start scripts for Red Hat Linux. <br>
|
|
||||||
Soenke J. Peters contributed patches and suggestions for Red Hat compatability.<br>
|
|
||||||
Wolfgang Ocker has contributed the code and documentation for the <code>server_ip</code> option.<br>
|
|
||||||
Markus Mohr contributed a Debian rc script.<br>
|
|
||||||
Nikita V. Youschenko contributed extensions to the "<code>if</code>" uptest.<br>
|
|
||||||
Lyonel Vincent extended the serve_aliases option to support an arbitrary number of aliases.<br>
|
|
||||||
Sourav K. Mandal wrote the autoconf scripts and contributed many fixes and suggestions.<br>
|
|
||||||
Stephan Boettcher contributed the SCHEME= option.<br>
|
|
||||||
Ron Yorston contributed the uptest for Linux ppp dial-on-demand devices.<br>
|
|
||||||
Alexandre Nunes fixed some bugs in the autoconf files.<br>
|
|
||||||
Sverker Wiberg contributed fixes for IPv6.<br>
|
|
||||||
Carsten Block contributed <code>configure</code>-able rc scripts.<br>
|
|
||||||
Olaf Kirch contributed a security fix for the run_as code.<br>
|
|
||||||
Paul Wagland contributed various patches for bind9-compatability and other issues.<br>
|
|
||||||
Roman Shterenzon contributed patches and lots of helpful hints for FreeBSD compatability.<br>
|
|
||||||
Bernd Leibing has contributed spec file fixes.<br>
|
|
||||||
Michael Wiedmann has contributed the pdnsd-ctl.8 man page.<br>
|
|
||||||
Marko Stolle has contributed the contrib/pdnsd_update.pl script that makes pdnsd usable in a DHCP setup.<br>
|
|
||||||
P.J. Bostley has contributed patches to get pdnsd working on alpha properly.<br>
|
|
||||||
Christian Engstler contributed patches for SuSE compatability.<br>
|
|
||||||
Bjoern Fischer contributed code to make pdnsd leave the case of names in the cache unchanged.<br>
|
|
||||||
Marko Stolle contributed the contrib/pdnsd_update.pl script that makes pdnsd usable in a DHCP setup.<br>
|
|
||||||
Andrew M. Bishop contributed the support for the label server option and the pdnsd-ctl interface for using it.<br>
|
|
||||||
Frank Elsner contributed rc script fixes. <br>
|
|
||||||
Andreas Steinmetz contributed the code for <code>query_port_start</code> and <code>query_port_end</code> options.<br>
|
|
||||||
Mahesh T. Pai contributed the pdnsd.8 man page.<br>
|
|
||||||
Nikola Kotur contributed the Slackware start-up script.<br>
|
|
||||||
Kiyo Kelvin Lee contributed a patch for Cygwin support.<br>
|
|
||||||
Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support.<br>
|
|
||||||
Jan-Marek Glogowski contributed a patch implementing the <code>use_nss</code> option.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Special thanks to Bert Frederiks for letting me do a late-night debugging run on his machine to
|
|
||||||
spot obscure bugs!
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Thanks to the following persons for reporting bugs and being helpful:<br>
|
|
||||||
David G. Andersen,<br>
|
|
||||||
Dirk Armbrust,<br>
|
|
||||||
Daniel Black,<br>
|
|
||||||
Kevin A. Burton,<br>
|
|
||||||
Juliusz Chroboczek,<br>
|
|
||||||
Joachim Dorner,<br>
|
|
||||||
Stefan Erhardt,<br>
|
|
||||||
Stefan Förster,<br>
|
|
||||||
Mike Hammer,<br>
|
|
||||||
Jonathan Hudson,<br>
|
|
||||||
Dan Jacobson,<br>
|
|
||||||
Byrial Jensen,<br>
|
|
||||||
Patrick Loschmidt,<br>
|
|
||||||
James MacLean,<br>
|
|
||||||
Fraser McCrossan,<br>
|
|
||||||
Michael Müller,<br>
|
|
||||||
Erich Reitz,<br>
|
|
||||||
Brian Schroeder,<br>
|
|
||||||
Milan P. Stanic,<br>
|
|
||||||
Michael Steiner,<br>
|
|
||||||
Norbert Steinl,<br>
|
|
||||||
Markus Storm,<br>
|
|
||||||
Michael Ströder,<br>
|
|
||||||
Alan Swanson,<br>
|
|
||||||
Eelco Vriezekolk.
|
|
||||||
</p>
|
|
||||||
<!--nodoc(-->
|
|
||||||
<h1>Links</h1>
|
|
||||||
Well, this is the obligatory link section.
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<table width="100%" cellpadding=7>
|
|
||||||
<tr>
|
|
||||||
<td><center>
|
|
||||||
<a href="http://www.gnu.org">
|
|
||||||
<img src="gnuhead.png" alt="http://www.gnu.org"><br>
|
|
||||||
The GNU homepage
|
|
||||||
</a>
|
|
||||||
</center></td>
|
|
||||||
<td><center>
|
|
||||||
<a href="http://freecode.com">
|
|
||||||
<img src="fm_logo.png" alt="http://freecode.com"><br>
|
|
||||||
Freecode (formerly Freshmeat) - large free software index
|
|
||||||
</a>
|
|
||||||
</center></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><center>
|
|
||||||
<a href="http://www.freebsd.org">
|
|
||||||
<img src="freebsd.png" alt="http://www.freebsd.org"><br>
|
|
||||||
The FreeBSD project
|
|
||||||
</a>
|
|
||||||
</center></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<!--)nodoc-->
|
|
||||||
<br>
|
|
||||||
<hr>
|
|
||||||
<address><a href="mailto:tmoestl@gmx.net">Thomas Moestl</a>
|
|
||||||
and <a href="mailto:p.a.rombouts@home.nl">Paul A. Rombouts</a>
|
|
||||||
</address>
|
|
||||||
<br>
|
|
||||||
<p>
|
|
||||||
<i>Last revised: 17 March 2012 by Paul A. Rombouts</i>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,161 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
#
|
|
||||||
# A Perl script for converting pdnsd html documentation to a man page.
|
|
||||||
#
|
|
||||||
# Written by Paul A. Rombouts
|
|
||||||
#
|
|
||||||
# This file Copyright 2004 Paul A. Rombouts
|
|
||||||
# It may be distributed under the GNU Public License, version 2, or
|
|
||||||
# any higher version. See section COPYING of the GNU Public license
|
|
||||||
# for conditions under which this file may be redistributed.
|
|
||||||
#
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use POSIX qw(strftime);
|
|
||||||
|
|
||||||
|
|
||||||
while(<>) {
|
|
||||||
if(/<h[1-4]>[^<]*configuration file/i) {
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit unless defined($_);
|
|
||||||
|
|
||||||
while(<>) {
|
|
||||||
if(/<h[1-4]>[^<]*layout/i) {
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit unless defined($_);
|
|
||||||
|
|
||||||
(my $myname=$0) =~ s{.*/}{};
|
|
||||||
|
|
||||||
print <<ENDOFHEADER;
|
|
||||||
.\\\" Generated automatically from the html documentation by $myname
|
|
||||||
.\\\"
|
|
||||||
.\\\" Manpage for pdnsd.conf (pdnsd configuration file)
|
|
||||||
.\\\"
|
|
||||||
.\\\" Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
.\\\" Copyright (C) 2003, 2004, 2005, 2006, 2007 Paul A. Rombouts
|
|
||||||
.\\\"
|
|
||||||
.\\\" This manual is a part of the pdnsd package, and may be distributed in
|
|
||||||
.\\\" original or modified form under terms of the GNU General Public
|
|
||||||
.\\\" License, as published by the Free Software Foundation; either version
|
|
||||||
.\\\" 3, or (at your option) any later version.
|
|
||||||
.\\\" You can find a copy of the GNU GPL in the file COPYING in the source
|
|
||||||
.\\\" or documentation directory.
|
|
||||||
.\\\"
|
|
||||||
ENDOFHEADER
|
|
||||||
|
|
||||||
|
|
||||||
print ".TH PDNSD.CONF 5 \"",strftime("%b %Y",localtime),"\" \"pdnsd \@fullversion\@\"\n";
|
|
||||||
print <<ENDOFHEADER2;
|
|
||||||
.SH NAME
|
|
||||||
pdnsd.conf \\- The configuration file for pdnsd
|
|
||||||
.hw config
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
This manual page describes the layout of the
|
|
||||||
.BR pdnsd (8)
|
|
||||||
configuration file and the available configuration options.
|
|
||||||
The default location of the file is \@sysconfdir\@/pdnsd.conf. This may be changed
|
|
||||||
with the \\fB-c\\fP command line option.
|
|
||||||
An example pdnsd.conf comes with the pdnsd distribution in the documentation directory
|
|
||||||
or in \@sysconfdir\@/pdnsd.conf.sample.
|
|
||||||
.SH \"FILE FORMAT\"
|
|
||||||
.PP
|
|
||||||
ENDOFHEADER2
|
|
||||||
|
|
||||||
my $taggedparagraph=0;
|
|
||||||
my $displayed=0;
|
|
||||||
|
|
||||||
while(<>) {
|
|
||||||
if(/<h[1-4]>.*\bpdnsd-ctl\b/) {
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
s{^\s*((?:<[^<>]+>)*?)<h[1-4]>[\d.]*\s*(.*)</h[1-4]>((?:<[^<>]+>)*?)(?:<br>)?\s*$}{.SS $1$2$3\n}i;
|
|
||||||
if(s{^\s*<tr>\s*}{.TP\n}i) {$taggedparagraph=1}
|
|
||||||
if(m{^\s*</tr>}i) {$taggedparagraph=0}
|
|
||||||
s{^\s*((?:<[^<>]+>)*?)<b>(.*)</b>((?:<[^<>]+>)*?)(?:<br>)?\s*$}{.B $1$2$3\n}i if $taggedparagraph;
|
|
||||||
s{^\s*((?:<[^<>]+>)*?or(?:<[^<>]+>)*?)(?:<br>)?\s*$}{$1\n.PD 0\n.TP\n.PD\n}i if $taggedparagraph;
|
|
||||||
if(s{^\s*<pre>}{.DS L\n}i) {$displayed=1}
|
|
||||||
s{^\t}{ } if $displayed;
|
|
||||||
if(s{</pre>\s*$}{\n.DE\n\n}i) {$displayed=0}
|
|
||||||
elsif(!$displayed) {s{^\s*}{}}
|
|
||||||
s{^\s*<li>}{.IP\n\\(bu }i;
|
|
||||||
s{<li>}{\n.IP\n\\(bu }i;
|
|
||||||
s{<ul>}{\n}i;
|
|
||||||
s{</ul>}{\n}i;
|
|
||||||
s{<b>}{\\fB}ig;
|
|
||||||
s{</b>}{\\fP}ig;
|
|
||||||
s{<(i|em)>}{\\fI}ig;
|
|
||||||
s{</(i|em)>}{\\fP}ig;
|
|
||||||
unless(s{^\s*(<[^<>]+>)*(<br>|<p>)(<[^<>]+>)*\s*$}{\n}i) {
|
|
||||||
s{<p\b[^<>]*>(.*)</p>}{\n$1\n}i;
|
|
||||||
s{^\s*<br>}{.br\n}i;
|
|
||||||
s{<br>\s*<br>\s*$}{\n\n}i;
|
|
||||||
s{<br>\s*$}{\n.br\n}i;
|
|
||||||
s{<br>}{\n.br\n}i;
|
|
||||||
s{^\s*(<[^<>]+>)*\s*$}{};
|
|
||||||
}
|
|
||||||
s{<[^<>]+>}{}g;
|
|
||||||
s{<}{<}ig;
|
|
||||||
s{>}{>}ig;
|
|
||||||
s{"}{"}ig;
|
|
||||||
s{ }{\\ }ig;
|
|
||||||
s{/var/cache/pdnsd\b}{\@cachedir\@}g;
|
|
||||||
s{(?<![-\w\\])-[-\w]*}{(my $s=$&) =~ s{-}{\\-}g;$s}ge;
|
|
||||||
s{\bpdnsd-ctl\b}{pdnsd\\-ctl}g;
|
|
||||||
s{\blist-rrtypes\b}{list\\-rrtypes}g;
|
|
||||||
print;
|
|
||||||
}
|
|
||||||
|
|
||||||
print <<ENDOFTRAILER;
|
|
||||||
.SH \"VERSION\"
|
|
||||||
.PP
|
|
||||||
This man page is correct for version \@fullversion\@ of pdnsd.
|
|
||||||
.SH \"SEE ALSO\"
|
|
||||||
.PP
|
|
||||||
.BR pdnsd (8),
|
|
||||||
.BR pdnsd\\-ctl (8)
|
|
||||||
.PP
|
|
||||||
More documentation is available in the \\fBdoc/\\fP subdirectory of the source,
|
|
||||||
or in \\fB/usr/share/doc/pdnsd/\\fP if you are using a binary package.
|
|
||||||
|
|
||||||
.SH AUTHORS
|
|
||||||
|
|
||||||
\\fBpdnsd\\fP was originally written by Thomas Moestl
|
|
||||||
.UR
|
|
||||||
<tmoestl\@gmx.net>
|
|
||||||
.UE
|
|
||||||
and was extensively revised by Paul A. Rombouts
|
|
||||||
.UR
|
|
||||||
<p.a.rombouts\@home.nl>
|
|
||||||
.UE
|
|
||||||
(for versions 1.1.8b1\\-par and later).
|
|
||||||
.PP
|
|
||||||
Several others have contributed to \\fBpdnsd\\fP; see files in the source or
|
|
||||||
\\fB/usr/share/doc/pdnsd/\\fP directory.
|
|
||||||
.PP
|
|
||||||
This man page was automatically generated from the html documentation for \\fBpdnsd\\fP,
|
|
||||||
using a customized Perl script written by Paul A. Rombouts.
|
|
||||||
ENDOFTRAILER
|
|
||||||
|
|
||||||
if(defined($_)) {
|
|
||||||
while(<>) {
|
|
||||||
if(/last\s+revised/i) {
|
|
||||||
s{^\s*}{};
|
|
||||||
s{<[^<>]+>}{}g;
|
|
||||||
s{<}{<}ig;
|
|
||||||
s{>}{>}ig;
|
|
||||||
s{"}{"}ig;
|
|
||||||
s{ }{\\ }ig;
|
|
||||||
print ".PP\n";
|
|
||||||
print;
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit;
|
|
|
@ -1,198 +0,0 @@
|
||||||
.\" This manpage has been automatically generated by docbook2man-spec
|
|
||||||
.\" from a DocBook document. docbook2man-spec can be found at:
|
|
||||||
.\" <http://shell.ipoline.com/~elmert/hacks/docbook2X/>
|
|
||||||
.\" Please send any bug reports, improvements, comments, patches,
|
|
||||||
.\" etc. to Steve Cheng <steve@ggi-project.org>.
|
|
||||||
.\" This manpage has been edited manually by Paul A. Rombouts.
|
|
||||||
.TH "PDNSD\-CTL" "8" "Sep 2008" "pdnsd 1.2.9b-par" ""
|
|
||||||
.SH NAME
|
|
||||||
\fBpdnsd\-ctl\fP \- controls pdnsd
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.sp
|
|
||||||
\fBpdnsd\-ctl\fP [\fB\-c\fP \fIcachedir\fP] [\fB\-q\fP] \fIcommand\fP [\fIarguments\fP]
|
|
||||||
.SH "DESCRIPTION"
|
|
||||||
.PP
|
|
||||||
\fBpdnsd\-ctl\fP controls \fBpdnsd\fP, a proxy dns server with permanent caching.
|
|
||||||
Note that the status control socket must be enabled (by specifying an option on
|
|
||||||
the pdnsd command line or in the configuration file) before you can use
|
|
||||||
\fBpdnsd\-ctl\fP.
|
|
||||||
.PP
|
|
||||||
.TP
|
|
||||||
\fB\-c\fP \fIcachedir\fP
|
|
||||||
Set the cache directory to \fIcachedir\fP (must match pdnsd setting).
|
|
||||||
This is only necessary if the directory differs from the default specified
|
|
||||||
at compile time.
|
|
||||||
.TP
|
|
||||||
\fB\-q\fP
|
|
||||||
Be quiet unless output is specified by the command or something goes wrong.
|
|
||||||
.SH "COMMANDS"
|
|
||||||
.TP
|
|
||||||
\fBhelp\fP\ \ \ [no arguments]
|
|
||||||
|
|
||||||
Print a command summary.
|
|
||||||
.TP
|
|
||||||
\fBversion\fP\ [no arguments]
|
|
||||||
|
|
||||||
Print version and license info.
|
|
||||||
.TP
|
|
||||||
\fBstatus\fP\ [no arguments]
|
|
||||||
|
|
||||||
Print a description of pdnsd's cache status, thread status and configuration.
|
|
||||||
Also shows which remote name servers are assumed to be available.
|
|
||||||
.TP
|
|
||||||
\fBserver\fP\ (\fIindex\fP|\fIlabel\fP) (\fBup\fP|\fBdown\fP|\fBretest\fP) [\fIdns1\fP[,\fIdns2\fP[,...]]]
|
|
||||||
|
|
||||||
Set the status of the servers with the given index or label to up or down, or
|
|
||||||
force a retest. The index is assigned in the order of definition in pdnsd.conf
|
|
||||||
starting with 0. Use the status command to view the indexes. You can specify all
|
|
||||||
instead of an index to perform the action for all servers registered with pdnsd.
|
|
||||||
.IP
|
|
||||||
An optional third argument can be given consisting of a list of IP addresses
|
|
||||||
separated by commas or white-space characters. This list will replace the
|
|
||||||
addresses of name servers used by pdnsd for the given server section. This
|
|
||||||
feature is useful for run-time configuration of pdnsd with dynamic DNS data in
|
|
||||||
scripts called by ppp or DHCP clients. The last argument may also be an empty
|
|
||||||
string, which causes existing IP addresses to be removed and the corresponding
|
|
||||||
server section to become inactive.
|
|
||||||
.TP
|
|
||||||
\fBrecord\fP\ \fIname\fP (\fBdelete\fP|\fBinvalidate\fP)
|
|
||||||
|
|
||||||
Delete or invalidate the records of the given domain name if it is in the cache.
|
|
||||||
Invalidation means that the records are marked as timed out, and will be
|
|
||||||
reloaded if possible. For local records (i.e., records that were given in the
|
|
||||||
config file using a rr section, records read from a hosts-style file and records
|
|
||||||
added using pdnsd-ctl), invalidation has no effect. Deletion will work, though.
|
|
||||||
.TP
|
|
||||||
\fBsource\fP\ \fIfn\fP \fIowner\fP [\fIttl\fP] [(\fBon\fP|\fBoff\fP)] [\fBnoauth\fP]
|
|
||||||
|
|
||||||
Load a hosts-style file. Works like using the pdnsd source configuration section.
|
|
||||||
Owner and ttl are used as in the source section. ttl has a default
|
|
||||||
of 900 (it does not need to be specified). The next to last argument corresponds
|
|
||||||
to the serve_aliases option, and is off by default.
|
|
||||||
\fBnoauth\fP is used to make the domains non-authoritative
|
|
||||||
(this is similar to setting authrec=off in the config file,
|
|
||||||
please consult the
|
|
||||||
.BR pdnsd.conf (5)
|
|
||||||
man page for what that means).
|
|
||||||
fn is the name of the file, which must be readable by pdnsd.
|
|
||||||
.TP
|
|
||||||
\fBadd\fP\ \ \ \ \fBa\fP \fIaddr\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP]
|
|
||||||
.TP
|
|
||||||
\fBadd\fP\ \ \ \ \fBaaaa\fP \fIaddr\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP]
|
|
||||||
.TP
|
|
||||||
\fBadd\fP\ \ \ \ \fBptr\fP \fIhost\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP]
|
|
||||||
.TP
|
|
||||||
\fBadd\fP\ \ \ \ \fBcname\fP \fIhost\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP]
|
|
||||||
.TP
|
|
||||||
\fBadd\fP\ \ \ \ \fBmx\fP \fIhost\fP \fIname\fP \fIpref\fP [\fIttl\fP] [\fBnoauth\fP]
|
|
||||||
|
|
||||||
Add a record of the given type to the pdnsd cache, replacing existing
|
|
||||||
records for the same name and type. The 2nd argument corresponds
|
|
||||||
to the value of the option in the rr section that is named like
|
|
||||||
the first argument. The addr argument may be a list of IP addresses,
|
|
||||||
separated by commas or white space.
|
|
||||||
The ttl is optional, the default is 900 seconds.
|
|
||||||
\fBnoauth\fP is used to make the domains non-authoritative
|
|
||||||
(this is similar to setting authrec=off in the config file,
|
|
||||||
please consult the
|
|
||||||
.BR pdnsd.conf (5)
|
|
||||||
man page for what that means).
|
|
||||||
If you want no other record than the newly added in the cache, do
|
|
||||||
\fBpdnsd\-ctl\fP\ \fBrecord\fP\ \fIname\fP\ \fBdelete\fP
|
|
||||||
before adding records.
|
|
||||||
.TP
|
|
||||||
\fBneg\fP\ \ \ \ \fIname\fP [\fItype\fP] [\fIttl\fP]
|
|
||||||
|
|
||||||
Add a negatively cached record to pdnsd's cache, replacing existing
|
|
||||||
records for the same name and type. If no type is given, the whole
|
|
||||||
domain is cached negatively. For negatively cached records, errors are
|
|
||||||
immediately returned on a query, without querying other servers first.
|
|
||||||
The ttl is optional, the default is 900 seconds.
|
|
||||||
.TP
|
|
||||||
\fBconfig\fP\ \fIfilename\fP
|
|
||||||
|
|
||||||
Reload pdnsd's configuration file.
|
|
||||||
.br
|
|
||||||
The config file must be owned by the uid that pdnsd had when it was started,
|
|
||||||
and be readable by pdnsd's run_as uid.
|
|
||||||
If no file name is specified, the config file used at start-up is reloaded.
|
|
||||||
Note that some configuration changes, like the port or IP address pdnsd listens on,
|
|
||||||
cannot be made this way and you will receive an error message.
|
|
||||||
In these cases, you will have to restart pdnsd instead.
|
|
||||||
.TP
|
|
||||||
\fBinclude\fP\ \fIfilename\fP
|
|
||||||
|
|
||||||
Parse an include file.
|
|
||||||
.br
|
|
||||||
The include file may contain the same
|
|
||||||
type of sections as a config file, expect for global and server
|
|
||||||
sections, which are not allowed. This command can be used to add data
|
|
||||||
to the cache without reconfiguring pdnsd.
|
|
||||||
.TP
|
|
||||||
\fBeval\fP\ \ \ \fIstring\fP
|
|
||||||
|
|
||||||
Parse a string as if part of an include file.
|
|
||||||
.br
|
|
||||||
The string should hold one or more complete configuration sections,
|
|
||||||
but no global and server sections, which are not allowed.
|
|
||||||
If multiple strings are given, they will be joined using newline chars
|
|
||||||
and parsed together.
|
|
||||||
.TP
|
|
||||||
\fBempty\-cache\fP\ [[+|-]\fIname\fP ...]
|
|
||||||
|
|
||||||
Delete all entries in the cache matching include/exclude rules.
|
|
||||||
.br
|
|
||||||
If no arguments are provided, the cache is completely emptied,
|
|
||||||
freeing all existing entries.
|
|
||||||
Note that this also removes local records, as defined by the config file.
|
|
||||||
To restore local records, run "pdnsd-ctl\ config" immediately afterwards.
|
|
||||||
.br
|
|
||||||
If one or more arguments are provided, these are interpreted as
|
|
||||||
include/exclude names. If an argument starts with a '+' the name is to
|
|
||||||
be included. If an argument starts with a '-' it is to be excluded.
|
|
||||||
If an argument does not begin with '+' or '-', a '+' is assumed.
|
|
||||||
If the domain name of a cache entry ends in one of the names in the
|
|
||||||
list, the first match will determine what happens. If the matching name
|
|
||||||
is to be included, the cache entry is deleted, otherwise it remains.
|
|
||||||
If there are no matches, the default action is not to delete.
|
|
||||||
.TP
|
|
||||||
\fBdump\fP\ \ \ [\fIname\fP]
|
|
||||||
|
|
||||||
Print information stored in the cache about \fIname\fP.
|
|
||||||
If \fIname\fP begins with a dot and is not the root domain, information
|
|
||||||
about the names in the cache ending in \fIname\fP (including \fIname\fP without
|
|
||||||
the leading dot) will be printed.
|
|
||||||
If \fIname\fP is not specified, information about all the names in the cache
|
|
||||||
will be printed.
|
|
||||||
.TP
|
|
||||||
\fBlist\-rrtypes\fP [no arguments]
|
|
||||||
|
|
||||||
List available rr types for the neg command. Note that those are only
|
|
||||||
used for the neg command, not for add!
|
|
||||||
.SH "BUGS"
|
|
||||||
.PP
|
|
||||||
If you pipe the output of \fBdump\fP command through an application that
|
|
||||||
reads only part of the output and then blocks (such as more or less),
|
|
||||||
pdnsd threads trying to add new entries to the cache will be suspended
|
|
||||||
until the pipe is closed.
|
|
||||||
It is preferable to capture the output in a file in such a case.
|
|
||||||
.br
|
|
||||||
Report any remaining bugs to the authors.
|
|
||||||
.SH "AUTHORS"
|
|
||||||
.PP
|
|
||||||
Thomas Moestl
|
|
||||||
.UR
|
|
||||||
<tmoestl@gmx.net>
|
|
||||||
.UE
|
|
||||||
.br
|
|
||||||
Paul A. Rombouts
|
|
||||||
.UR
|
|
||||||
<p.a.rombouts@home.nl>
|
|
||||||
.UE
|
|
||||||
(for versions 1.1.8b1\-par and later)
|
|
||||||
.PP
|
|
||||||
Last revised: 04 Sep 2008 by Paul A. Rombouts.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.PP
|
|
||||||
.BR pdnsd (8),
|
|
||||||
.BR pdnsd.conf (5)
|
|
|
@ -1,326 +0,0 @@
|
||||||
.TH PDNSD 8 "Jul 2007" "pdnsd @fullversion@" "System Administration Commands"
|
|
||||||
|
|
||||||
.SH NAME
|
|
||||||
\fBpdnsd\fP \- dns proxy daemon
|
|
||||||
|
|
||||||
.SH SYNOPSIS
|
|
||||||
|
|
||||||
\fBpdnsd\fP [\-h] [\-V] [\-s] [\-d] [\-g] [\-t] [\-p \fIfile\fR] [\-v\fIn\fR] [\-m\fIxx\fR] [\-c \fIfile\fR] [\-4] [\-6] [\-a]
|
|
||||||
.PP
|
|
||||||
This man page is an extract of the documentation of \fBpdnsd\fP.
|
|
||||||
For complete, current documentation, refer to the HTML (or plain text)
|
|
||||||
documentation (which you can find in the \fBdoc/\fP subdirectory of the
|
|
||||||
source or in a standard documentation directory, typically
|
|
||||||
\fB/usr/share/doc/pdnsd/\fP if you are using a binary package).
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
\fBpdnsd\fP is a IPv6 capable proxy domain name server (DNS) which
|
|
||||||
saves the contents of its DNS cache to the disk on exit.
|
|
||||||
|
|
||||||
.SH OPTIONS
|
|
||||||
|
|
||||||
.RS
|
|
||||||
.TP
|
|
||||||
.B \-4
|
|
||||||
enables IPv4 support. IPv6 support is automatically
|
|
||||||
disabled (should it be available). On by default.
|
|
||||||
.TP
|
|
||||||
.B \-6
|
|
||||||
enables IPv6 support. IPv4 support is automatically
|
|
||||||
disabled (should it be available). Off by default.
|
|
||||||
.TP
|
|
||||||
.B \-a
|
|
||||||
With this option, pdnsd will try to detect automatically if
|
|
||||||
the system supports IPv6, and fall back to IPv4 otherwise.
|
|
||||||
.TP
|
|
||||||
.BR \-V " or " \-\-version
|
|
||||||
Print version information and exit.
|
|
||||||
.TP
|
|
||||||
\fB\-c\fP \fIFILE\fP or \fB\-\-config\-file=\fP\fIFILE\fP
|
|
||||||
specifies that configuration is to be read from \fIFILE\fP.
|
|
||||||
Default is \fB@sysconfdir@/pdnsd.conf\fP.
|
|
||||||
.TP
|
|
||||||
.BR \-d " or " \-\-daemon
|
|
||||||
Start \fBpdnsd\fP in daemon mode (as a background process).
|
|
||||||
.TP
|
|
||||||
.BR \-g " or " \-\-debug
|
|
||||||
Print some debug messages on the console or to the file
|
|
||||||
\fBpdnsd.debug\fP in your cache directory (in daemon mode).
|
|
||||||
.TP
|
|
||||||
.BR \-h " or " \-\-help
|
|
||||||
Print an option summary and exit.
|
|
||||||
.TP
|
|
||||||
\fB\-i\fP \fIPREFIX\fP or \fB\-\-ipv4_6_prefix=\fP\fIPREFIX\fP
|
|
||||||
specifies the prefix pdnsd uses (when running in IPv6 mode) to map IPv4
|
|
||||||
addresses in the configuration file to IPv6 addresses. Must be a valid IPv6
|
|
||||||
address. Default is ::ffff:0.0.0.0
|
|
||||||
.TP
|
|
||||||
.B \-p \fIFILE\fP
|
|
||||||
writes the pid the server runs as to the specified filename. Works
|
|
||||||
only in daemon mode.
|
|
||||||
.TP
|
|
||||||
.B \-\-pdnsd\-user
|
|
||||||
Print the user \fBpdnsd\fP will run as and exit.
|
|
||||||
.TP
|
|
||||||
.BR \-s " or " \-\-status
|
|
||||||
enables the status control socket. Either this option should be passed
|
|
||||||
to the command line or \fBstatus_ctl=on;\fP should be specified in the
|
|
||||||
config file if you want to use
|
|
||||||
.BR pdnsd\-ctl (8)
|
|
||||||
to control \fBpdnsd\fP at runtime.
|
|
||||||
.TP
|
|
||||||
.BR \-t " or " \-\-tcp
|
|
||||||
enables the TCP server thread. \fBpdnsd\fP will then serve TCP and UDP
|
|
||||||
queries.
|
|
||||||
.TP
|
|
||||||
.BI \-v n
|
|
||||||
sets the verbosity of \fBpdnsd\fP. \fIn\fP is a numeric argument
|
|
||||||
between 0 (normal operation) to 3 (many messages for debugging).
|
|
||||||
.TP
|
|
||||||
.BI \-m xx
|
|
||||||
sets the query method \fBpdnsd\fP
|
|
||||||
uses. Possible values for \fIxx\fP are:
|
|
||||||
.IP
|
|
||||||
.B uo
|
|
||||||
\- pdnsd will use UDP only. This is the fastest method, and should
|
|
||||||
be supported by all name servers on the Internet.
|
|
||||||
|
|
||||||
.IP
|
|
||||||
.B to
|
|
||||||
\- pdnsd will use TCP only. TCP queries usually take more time than
|
|
||||||
UDP queries, but are more secure against certain attacks, where an
|
|
||||||
attacker tries to guess your query id and to send forged answers. TCP
|
|
||||||
queries are not supported by some name servers.
|
|
||||||
|
|
||||||
.IP
|
|
||||||
.B tu
|
|
||||||
\- pdnsd will try to use TCP, and will fall back to UDP if its
|
|
||||||
connection is refused or times out.
|
|
||||||
|
|
||||||
.IP
|
|
||||||
.B ut
|
|
||||||
\- pdnsd will try to use UDP, and will repeat the query using TCP
|
|
||||||
if the UDP reply was truncated (i.e. the tc bit is set).
|
|
||||||
This is the behaviour recommended by the DNS standards.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
Additionally, "no" can be prepended to the \-\-status, \-\-daemon, \-\-debug
|
|
||||||
and \-\-tcp options (e.g. \-\-notcp) to reverse their effect.
|
|
||||||
.RE
|
|
||||||
|
|
||||||
.SH USAGE
|
|
||||||
.PP
|
|
||||||
\fBpdnsd\fP is usually run from a startup script. For \fBpdnsd\fP to
|
|
||||||
work, You need to:-
|
|
||||||
|
|
||||||
.IP
|
|
||||||
1. Tell your system to use \fBpdnsd\fP as the primary DNS server by
|
|
||||||
modifying \fB/etc/resolv.conf\fP.
|
|
||||||
|
|
||||||
.IP
|
|
||||||
2. Tell \fBpdnsd\fP to use an authentic source for DNS records, by
|
|
||||||
including the IP addresses of one or more DNS servers, usually your
|
|
||||||
ISP's DNS servers, in \fB@sysconfdir@/pdnsd.conf\fP.
|
|
||||||
.PP
|
|
||||||
For this, put the following line in your \fB/etc/resolv.conf\fP
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
nameserver 127.0.0.X
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
where X can be any number. (I use 3). Comment out all other
|
|
||||||
entries. You should put the same value in the server_ip= line in
|
|
||||||
\fBglobal\fP section of \fB@sysconfdir@/pdnsd.conf\fP.
|
|
||||||
.br
|
|
||||||
If you want to use \fBpdnsd\fP as the DNS server for a small local network,
|
|
||||||
you should use the IP address or name of the interface connected to
|
|
||||||
this network instead of 127.0.0.X.
|
|
||||||
.RE
|
|
||||||
|
|
||||||
.PP
|
|
||||||
To tell \fBpdnsd\fP where to get DNS information from, add the
|
|
||||||
following lines in \fB@sysconfdir@/pdnsd.conf\fP:-
|
|
||||||
|
|
||||||
.PP
|
|
||||||
.RS
|
|
||||||
server {
|
|
||||||
.br
|
|
||||||
label= "myisp";
|
|
||||||
ip=123.456.789.001,123.456.789.002;
|
|
||||||
proxy_only=on;
|
|
||||||
timeout=10;
|
|
||||||
.br
|
|
||||||
}
|
|
||||||
.RE
|
|
||||||
.PP
|
|
||||||
Note the opening and closing braces. Add more such \fBserver\fP
|
|
||||||
sections for each set of DNS servers you want \fBpdnsd\fP to query.
|
|
||||||
Of course the configuration options shown here are just examples.
|
|
||||||
More examples can be found in \fB@sysconfdir@/pdnsd.conf.sample\fP
|
|
||||||
or the pdnsd.conf in the documentation directory.
|
|
||||||
See the
|
|
||||||
.BR pdnsd.conf (5)
|
|
||||||
man page for all the possible options and their exact meaning.
|
|
||||||
.PP
|
|
||||||
If you use a dial up connection, remember that ppp scripts usually
|
|
||||||
replace \fB/etc/resolv.conf\fP when connection with the ISP is
|
|
||||||
established. You need to configure ppp (or whatever you use to
|
|
||||||
establish a connection) so that \fB/etc/resolv.conf\fP is not replaced
|
|
||||||
every time a connection is established. Read the documentation for the
|
|
||||||
scripts run when your network comes up.
|
|
||||||
.PP
|
|
||||||
If you use pppconfig, specify `none' in the `nameservers' option in
|
|
||||||
the `advanced' tab. If you use multiple ISPs, you should do this for
|
|
||||||
each connection/account.
|
|
||||||
.PP
|
|
||||||
If you use multiple ISPs, you should tell \fBpdnsd\fP which DNS servers
|
|
||||||
have become available by calling \fBpdnsd\-ctl\fP, the \fBpdnsd\fP
|
|
||||||
control utility, in a script (e.g. \fB/etc/ppp/ip\-up\fP when you use pppd)
|
|
||||||
that is run when the connection is established.
|
|
||||||
If the addresses of the DNS servers are obtained through some type of
|
|
||||||
dynamic configuration protocol (e.g. pppd with the usepeerdns
|
|
||||||
option or a DHCP client), you can pass the DNS server addresses as an extra
|
|
||||||
argument to \fBpdnsd\-ctl\fP to configure \fBpdnsd\fP at run time.
|
|
||||||
See the
|
|
||||||
.BR pdnsd\-ctl (8)
|
|
||||||
man page for details.
|
|
||||||
|
|
||||||
.SH FILES
|
|
||||||
|
|
||||||
\fB@sysconfdir@/pdnsd.conf\fP is the pdnsd configuration file.
|
|
||||||
The file format and configuration options are described in the
|
|
||||||
.BR pdnsd.conf (5)
|
|
||||||
man page. You can find examples of almost all options in
|
|
||||||
\fB@sysconfdir@/pdnsd.conf.sample\fP.
|
|
||||||
.PP
|
|
||||||
\fB@cachedir@/pdnsd.cache\fP
|
|
||||||
.PP
|
|
||||||
\fB@cachedir@/pdnsd.status\fP is the status control socket, which must be
|
|
||||||
enabled before you can use \fBpdnsd\-ctl\fP.
|
|
||||||
.PP
|
|
||||||
\fB/etc/init.d/pdnsd\fP (the name and location of the start-up script
|
|
||||||
may be different depending on your distribution.)
|
|
||||||
.PP
|
|
||||||
\fB/etc/resolv.conf\fP
|
|
||||||
.PP
|
|
||||||
\fB/etc/defaults/pdnsd\fP contains additional parameters or options
|
|
||||||
which may be passed to pdnsd at boot time. This saves the hassle of
|
|
||||||
fiddling with initscripts (not available on all distributions).
|
|
||||||
|
|
||||||
.SH BUGS
|
|
||||||
.PP
|
|
||||||
The verbosity option
|
|
||||||
.BI -v n
|
|
||||||
presently does not seem to have much effect on the amount of debug output.
|
|
||||||
.br
|
|
||||||
Report any remaining bugs to the authors.
|
|
||||||
|
|
||||||
.SH CONFORMING TO
|
|
||||||
.PP
|
|
||||||
\fBpdnsd\fP should comply with RFCs 1034 and 1035. As of version
|
|
||||||
1.0.0, RFC compliance has been improved and pdnsd is now believed (or
|
|
||||||
hoped?) to be fully RFC compatible. It completely follows RFC 2181
|
|
||||||
(except for one minor issue in the FreeBSD port, see the
|
|
||||||
documentation).
|
|
||||||
.PP
|
|
||||||
It does \fINOT\fP support the following features, of which most are
|
|
||||||
marked optional, experimental or obsolete in these RFCs:
|
|
||||||
|
|
||||||
|
|
||||||
.IP
|
|
||||||
\(bu Inverse queries
|
|
||||||
.IP
|
|
||||||
\(bu Status queries
|
|
||||||
.IP
|
|
||||||
\(bu Completion queries
|
|
||||||
.IP
|
|
||||||
\(bu Namespaces other than IN (Internet)
|
|
||||||
.IP
|
|
||||||
\(bu AXFR and IXFR queries (whole zone transfers); since pdnsd does not maintain zones, that should not violate the standard
|
|
||||||
|
|
||||||
.PP
|
|
||||||
The following record types, that are extensions to the original DNS
|
|
||||||
standard, are supported if given as options at compile time. (if you
|
|
||||||
do not need them, you do not need to compile support for them into
|
|
||||||
pdnsd and save cache and executable space):
|
|
||||||
|
|
||||||
.IP
|
|
||||||
\(bu RP (responsible person, RFC 1183)
|
|
||||||
.IP
|
|
||||||
\(bu AFSDB (AFS database location, RFC 1183)
|
|
||||||
.IP
|
|
||||||
\(bu X25 (X25 address, RFC 1183)
|
|
||||||
.IP
|
|
||||||
\(bu ISDN (ISDN number/address, RFC 1183)
|
|
||||||
.IP
|
|
||||||
\(bu RT (route through, RFC 1183)
|
|
||||||
.IP
|
|
||||||
\(bu NSAP (Network Service Access Protocol address , RFC 1348)
|
|
||||||
.IP
|
|
||||||
\(bu PX (X.400/RFC822 mapping information, RFC 1995)
|
|
||||||
.IP
|
|
||||||
\(bu GPOS (geographic position, deprecated)
|
|
||||||
.IP
|
|
||||||
\(bu AAAA (IPv6 address, RFC 1886)
|
|
||||||
.IP
|
|
||||||
\(bu LOC (location, RFC 1876)
|
|
||||||
.IP
|
|
||||||
\(bu EID (Nimrod EID)
|
|
||||||
.IP
|
|
||||||
\(bu NIMLOC (Nimrod locator)
|
|
||||||
.IP
|
|
||||||
\(bu SRV (service record, RFC 2782)
|
|
||||||
.IP
|
|
||||||
\(bu ATMA (ATM address)
|
|
||||||
.IP
|
|
||||||
\(bu NAPTR (URI mapping, RFC 2168)
|
|
||||||
.IP
|
|
||||||
\(bu KX (key exchange, RFC 2230)
|
|
||||||
|
|
||||||
.SH SEE ALSO
|
|
||||||
.PP
|
|
||||||
.BR pdnsd\-ctl (8),
|
|
||||||
.BR pdnsd.conf (5),
|
|
||||||
.BR pppconfig (8),
|
|
||||||
.BR resolv.conf (5)
|
|
||||||
.PP
|
|
||||||
More documentation is available in the \fBdoc/\fP subdirectory of the source,
|
|
||||||
or in \fB/usr/share/doc/pdnsd/\fP if you are using a binary package.
|
|
||||||
|
|
||||||
.SH AUTHORS
|
|
||||||
|
|
||||||
\fBpdnsd\fP was originally written by Thomas Moestl,
|
|
||||||
.UR
|
|
||||||
<tmoestl@gmx.net>,
|
|
||||||
.UE
|
|
||||||
and was extensively revised by Paul A. Rombouts
|
|
||||||
.UR
|
|
||||||
<p.a.rombouts@home.nl>
|
|
||||||
.UE
|
|
||||||
(for versions 1.1.8b1\-par and later).
|
|
||||||
.PP
|
|
||||||
Several others have contributed to \fBpdnsd\fP; see files in the
|
|
||||||
source or \fB/usr/share/doc/pdnsd/\fP directory.
|
|
||||||
.PP
|
|
||||||
This man page was written by Mahesh T. Pai
|
|
||||||
.UR
|
|
||||||
<paivakil@yahoo.co.in>
|
|
||||||
.UE
|
|
||||||
using the documents in \fB/usr/share/docs/pdnsd/\fP directory for Debian,
|
|
||||||
but can be used on other distributions too.
|
|
||||||
.PP
|
|
||||||
Last revised: 22 Jul 2007 by Paul A. Rombouts.
|
|
||||||
|
|
||||||
.SH COPYRIGHT
|
|
||||||
|
|
||||||
.PP
|
|
||||||
This man page is a part of the pdnsd package, and may be distributed
|
|
||||||
in original or modified form under terms of the GNU General Public
|
|
||||||
License, as published by the Free Software Foundation; either version
|
|
||||||
3, or (at your option) any later version.
|
|
||||||
|
|
||||||
.PP
|
|
||||||
You can find a copy of the GNU GPL in the file \fBCOPYING\fP in the source
|
|
||||||
or the \fB/usr/share/common\-licenses/\fP directory if you are using a
|
|
||||||
Debian system.
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,143 +0,0 @@
|
||||||
// Sample pdnsd configuration file. Must be customized to obtain a working pdnsd setup!
|
|
||||||
// Read the pdnsd.conf(5) manpage for an explanation of the options.
|
|
||||||
// Add or remove '#' in front of options you want to disable or enable, respectively.
|
|
||||||
// Remove '/*' and '*/' to enable complete sections.
|
|
||||||
|
|
||||||
global {
|
|
||||||
perm_cache=1024;
|
|
||||||
cache_dir="@cachedir@";
|
|
||||||
# pid_file = /var/run/pdnsd.pid;
|
|
||||||
run_as="@def_id@";
|
|
||||||
server_ip = 127.0.0.1; # Use eth0 here if you want to allow other
|
|
||||||
# machines on your network to query pdnsd.
|
|
||||||
status_ctl = on;
|
|
||||||
# paranoid=on; # This option reduces the chance of cache poisoning
|
|
||||||
# but may make pdnsd less efficient, unfortunately.
|
|
||||||
query_method=udp_tcp;
|
|
||||||
min_ttl=15m; # Retain cached entries at least 15 minutes.
|
|
||||||
max_ttl=1w; # One week.
|
|
||||||
timeout=10; # Global timeout option (10 seconds).
|
|
||||||
neg_domain_pol=on;
|
|
||||||
udpbufsize=1024; # Upper limit on the size of UDP messages.
|
|
||||||
}
|
|
||||||
|
|
||||||
# The following section is most appropriate if you have a fixed connection to
|
|
||||||
# the Internet and an ISP which provides good DNS servers.
|
|
||||||
server {
|
|
||||||
label= "myisp";
|
|
||||||
ip = 192.168.0.1; # Put your ISP's DNS-server address(es) here.
|
|
||||||
# proxy_only=on; # Do not query any name servers beside your ISP's.
|
|
||||||
# This may be necessary if you are behind some
|
|
||||||
# kind of firewall and cannot receive replies
|
|
||||||
# from outside name servers.
|
|
||||||
timeout=4; # Server timeout; this may be much shorter
|
|
||||||
# that the global timeout option.
|
|
||||||
uptest=if; # Test if the network interface is active.
|
|
||||||
interface=eth0; # The name of the interface to check.
|
|
||||||
interval=10m; # Check every 10 minutes.
|
|
||||||
purge_cache=off; # Keep stale cache entries in case the ISP's
|
|
||||||
# DNS servers go offline.
|
|
||||||
edns_query=yes; # Use EDNS for outgoing queries to allow UDP messages
|
|
||||||
# larger than 512 bytes. May cause trouble with some
|
|
||||||
# legacy systems.
|
|
||||||
# exclude=.thepiratebay.org, # If your ISP censors certain names, you may
|
|
||||||
# .thepiratebay.se, # want to exclude them here, and provide an
|
|
||||||
# .piratebay.org, # alternative server section below that will
|
|
||||||
# .piratebay.se; # successfully resolve the names.
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
# The following section is more appropriate for dial-up connections.
|
|
||||||
# Read about how to use pdnsd-ctl for dynamic configuration in the documentation.
|
|
||||||
server {
|
|
||||||
label= "dialup";
|
|
||||||
file = "/etc/ppp/resolv.conf"; # Preferably do not use /etc/resolv.conf
|
|
||||||
proxy_only=on;
|
|
||||||
timeout=4;
|
|
||||||
uptest=if;
|
|
||||||
interface = ppp0;
|
|
||||||
interval=10; # Check the interface every 10 seconds.
|
|
||||||
purge_cache=off;
|
|
||||||
preset=off;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
# The servers provided by OpenDNS are fast, but they do not reply with
|
|
||||||
# NXDOMAIN for non-existant domains, instead they supply you with an
|
|
||||||
# address of one of their search engines. They also lie about the addresses of
|
|
||||||
# of the search engines of google, microsoft and yahoo.
|
|
||||||
# If you do not like this behaviour the "reject" option may be useful.
|
|
||||||
server {
|
|
||||||
label = "opendns";
|
|
||||||
ip = 208.67.222.222, 208.67.220.220;
|
|
||||||
reject = 208.69.32.0/24, # You may need to add additional address ranges
|
|
||||||
208.69.34.0/24, # here if the addresses of their search engines
|
|
||||||
208.67.219.0/24; # change.
|
|
||||||
reject_policy = fail; # If you do not provide any alternative server
|
|
||||||
# sections, like the following root-server
|
|
||||||
# example, "negate" may be more appropriate here.
|
|
||||||
timeout = 4;
|
|
||||||
uptest = ping; # Test availability using ICMP echo requests.
|
|
||||||
ping_timeout = 100; # ping test will time out after 10 seconds.
|
|
||||||
interval = 15m; # Test every 15 minutes.
|
|
||||||
preset = off;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
# This section is meant for resolving from root servers.
|
|
||||||
server {
|
|
||||||
label = "root-servers";
|
|
||||||
root_server = discover; # Query the name servers listed below
|
|
||||||
# to obtain a full list of root servers.
|
|
||||||
randomize_servers = on; # Give every root server an equal chance
|
|
||||||
# of being queried.
|
|
||||||
ip = 198.41.0.4, # This list will be expanded to the full
|
|
||||||
192.228.79.201; # list on start up.
|
|
||||||
timeout = 5;
|
|
||||||
uptest = query; # Test availability using empty DNS queries.
|
|
||||||
# query_test_name = .; # To be used if remote servers ignore empty queries.
|
|
||||||
interval = 30m; # Test every half hour.
|
|
||||||
ping_timeout = 300; # Test should time out after 30 seconds.
|
|
||||||
purge_cache = off;
|
|
||||||
# edns_query = yes; # Use EDNS for outgoing queries to allow UDP messages
|
|
||||||
# larger than 512 bytes. May cause trouble with some
|
|
||||||
# legacy systems.
|
|
||||||
exclude = .localdomain;
|
|
||||||
policy = included;
|
|
||||||
preset = off;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
source {
|
|
||||||
owner=localhost;
|
|
||||||
# serve_aliases=on;
|
|
||||||
file="/etc/hosts";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
include {file="/etc/pdnsd.include";} # Read additional definitions from /etc/pdnsd.include.
|
|
||||||
*/
|
|
||||||
|
|
||||||
rr {
|
|
||||||
name=localhost;
|
|
||||||
reverse=on;
|
|
||||||
a=127.0.0.1;
|
|
||||||
owner=localhost;
|
|
||||||
soa=localhost,root.localhost,42,86400,900,86400,86400;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
neg {
|
|
||||||
name=doubleclick.net;
|
|
||||||
types=domain; # This will also block xxx.doubleclick.net, etc.
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
neg {
|
|
||||||
name=bad.server.com; # Badly behaved server you don't want to connect to.
|
|
||||||
types=A,AAAA;
|
|
||||||
}
|
|
||||||
*/
|
|
|
@ -1,21 +0,0 @@
|
||||||
# Makefile for converting pdnsd html documentation to text files.
|
|
||||||
# This file was based on a Makefile originally written by Thomas Moestl
|
|
||||||
# and adapted by Paul Rombouts.
|
|
||||||
|
|
||||||
|
|
||||||
HTML2TXT=w3m -dump -cols 80 -T text/html
|
|
||||||
|
|
||||||
doc: intro.txt manual.txt faq.txt
|
|
||||||
.PHONY: doc clean
|
|
||||||
|
|
||||||
intro.txt: ../html/index.html
|
|
||||||
sed -e 's/<!--\(nodoc\|notext\)(-->/<!--/g' -e 's/<!--)\(nodoc\|notext\)-->/-->/g' ../html/index.html | $(HTML2TXT) | sed -e 's/[[:blank:]]\+$$//' > intro.txt
|
|
||||||
|
|
||||||
manual.txt: ../html/doc.html
|
|
||||||
sed -e 's/<!--\(nodoc\|notext\)(-->/<!--/g' -e 's/<!--)\(nodoc\|notext\)-->/-->/g' ../html/doc.html | $(HTML2TXT) | sed -e 's/[[:blank:]]\+$$//' > manual.txt
|
|
||||||
|
|
||||||
faq.txt: ../html/faq.html
|
|
||||||
sed -e 's/<!--\(nodoc\|notext\)(-->/<!--/g' -e 's/<!--)\(nodoc\|notext\)-->/-->/g' ../html/faq.html | $(HTML2TXT) | sed -e 's/[[:blank:]]\+$$//' > faq.txt
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@rm -fv intro.txt manual.txt faq.txt
|
|
|
@ -1,227 +0,0 @@
|
||||||
The pdnsd FAQ
|
|
||||||
|
|
||||||
Q: There are complete and well-tested name servers around, such as the BIND.
|
|
||||||
These do also perform caching. Why should I use pdnsd?
|
|
||||||
|
|
||||||
pdnsd does not aim to be a complete name server implementation, such as the
|
|
||||||
BIND. It is optimized for caching, and you can only specify a small subset
|
|
||||||
of all dns record types pdnsd knows in your local "zone" definitions. This
|
|
||||||
of course reduces the code size drastically, and such the memory footprint.
|
|
||||||
There are some features especially interesting for dialin networks,
|
|
||||||
ordinary (non-server) internet hosts and computers that are often not
|
|
||||||
connected to to their network, e.g. notebooks (I originally wrote this
|
|
||||||
program for use with my notebook). These features are:
|
|
||||||
A:
|
|
||||||
* permanent disk cache (useful for frequent power-offs/reboots)
|
|
||||||
* usually smaller memory footprint (depends on cache size) (see next
|
|
||||||
question)
|
|
||||||
* offline-detection prevents hangs (e.g. the typical hang on startup of
|
|
||||||
some Netscape Navigator versions if not dialled in)
|
|
||||||
* better control about timeouts (also to prevent hangs)
|
|
||||||
* better control over the cache
|
|
||||||
* better run-time control
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
When I look at the process size with ps, top, gtop, or a similar tool, I
|
|
||||||
Q: see some processes with a total size well above 3.5 MB. This is much more
|
|
||||||
than e.g. BIND named (about 1.4 MB). Why?
|
|
||||||
|
|
||||||
Really, it is not. pdnsd uses multithreading, not multiprocessing. That
|
|
||||||
means that the processes share most of their process space. In the
|
|
||||||
LinuxThreads library or NPTL (Native Posix Thread Libary), which are used
|
|
||||||
by pdnsd on Linux, in fact the total process address space is shared
|
|
||||||
A: (although the processes have different stacks, these are in one process
|
|
||||||
address space). You may check this by looking at the at the process sizes
|
|
||||||
of the pdnsd threads: all should be the same. The effective size that pdnsd
|
|
||||||
occupies is thus the size of any of the processes, not the sum of those.
|
|
||||||
So, pdnsd with empty cache occupies about 800 kB, and the maximum size
|
|
||||||
should be about the cache size plus this size (in fact, ca 5-10% more).
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Q: What do I need the status control (option -s) for?
|
|
||||||
|
|
||||||
It enables you to do some things you might or might not need. With it, you
|
|
||||||
can:
|
|
||||||
|
|
||||||
* query pdnsd's settings at runtime to debug configuration files and see
|
|
||||||
which servers are regarded to be available
|
|
||||||
A: * mark servers as available or unavailable, or force a status retest -
|
|
||||||
very handy if you want to control which servers pdnsd queries, e.g for
|
|
||||||
muliple dial-up accounts
|
|
||||||
* delete, invalidate or add DNS records - useful e.g. when you want to
|
|
||||||
build records for dynamically assigned IP addresses or domain names
|
|
||||||
* reload pdnsd's configuration file without restarting pdnsd
|
|
||||||
* print information about the contents of pdnsd's cache.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Q: What do I need local records (rr- and source-sections in the config file)
|
|
||||||
for?
|
|
||||||
|
|
||||||
Some resolver programs, e.g. nslookup, want to look up the name of the
|
|
||||||
server they are using before doing anything else. This option is for
|
|
||||||
defining a PTR record for your IP such that those programs get an answer
|
|
||||||
even if the name server you are caching is not available or does not offer
|
|
||||||
these records. By extension, you may also define A and SOA records. This
|
|
||||||
allows you to build very small zones without having to use a "big" name
|
|
||||||
server. It is NOT intended to replace such a complete server in anything
|
|
||||||
but VERY small networks. Alternatively, you may start a named on another
|
|
||||||
host or on the same host on another port and cache it with pdnsd in
|
|
||||||
addition to other (more distant) name servers.
|
|
||||||
A: The source section allows you to let pdnsd read in your /etc/hosts file on
|
|
||||||
startup and serve its contents. This file is used by your local resolver
|
|
||||||
before it even tries the name servers and usually contains fully-qualified
|
|
||||||
domain names (FQDNs) for all of the internet addresses your host has. If
|
|
||||||
you source this file, you usually won't need any additional rr sections.
|
|
||||||
Sourcing it also allows other hosts (eg. in your local network) to access
|
|
||||||
the names defined in your hosts file. You can of course just add other
|
|
||||||
hosts in your local network to the servers hosts file, thus making them
|
|
||||||
known to your server's resolver and pdnsd (if you sourced that file).
|
|
||||||
If you don't know what this answer was all about, you should just take the
|
|
||||||
source section in the sample config file that comes with pdnsd, copy it
|
|
||||||
into your config file and forget about it.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
When compiling, I get an error message like
|
|
||||||
Q: Please define __BYTE_ORDER to be __LITTLE_ENDIAN or __BIG_ENDIAN
|
|
||||||
What's up?
|
|
||||||
|
|
||||||
Normally, this macros should be defined in your C library's header files.
|
|
||||||
There are two different methods, most C libraries support both (and pdnsd
|
|
||||||
honors both): either __BYTE_ORDER is set to __LITTLE_ENDIAN or
|
|
||||||
__BIG_ENDIAN, or __LITTLE_ENDIAN or __BIG_ENDIAN are directly defined as
|
|
||||||
macros.
|
|
||||||
Linux glibc, for example, does set those macros correctly. Never mind. You
|
|
||||||
just have to know whether your machine is little-endian or big-endian, this
|
|
||||||
means wheter your machine saves the least significant byte of a word or
|
|
||||||
double-word first in memory (little-endian) or the most significant first
|
|
||||||
A: (big-endian). All intel x86 and Alpha machines are little-endian, for
|
|
||||||
example, while SPARC and PowerPC architectures are big-endian. If your
|
|
||||||
machine is little-endian, add the following line to your config.h:
|
|
||||||
#define __BYTE_ORDER __LITTLE_ENDIAN
|
|
||||||
Likewise, if your machines byte order is big-endian:
|
|
||||||
#define __BYTE_ORDER __BIG_ENDIAN
|
|
||||||
Pathological byte orders like pdp-endian are not yet supported really;
|
|
||||||
However, for the place the endianess is needed, __LITTLE_ENDIAN should do
|
|
||||||
(it deals only with 16 bits; for all other occurances, ntoh[sl]/hton[sl] is
|
|
||||||
used).
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
At startup, I get a warning saying:
|
|
||||||
Q: Uptest command [...] will implicitly be executed as root
|
|
||||||
What does that mean?
|
|
||||||
|
|
||||||
This warning only occurs if you use the uptest=exec option in your
|
|
||||||
configuration. It means that the uptest command is run as root because
|
|
||||||
pdnsd is running as root, and this was not explicitely specified. The idea
|
|
||||||
is that it may introduce security holes (in the programs being run) when
|
|
||||||
A: they run as root, and so they shouldn't do that if possible. You can
|
|
||||||
specify the user that shall run the command by appending its name
|
|
||||||
comma-separated as string to the uptest_cmd line:
|
|
||||||
uptest_cmd="<your command>","<user>";
|
|
||||||
If it is correctly running as root, just append the user string "root" to
|
|
||||||
the command and the warning will not occur again.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Q: I cannot run my uptest_cmd command as root (it says permission denied),
|
|
||||||
although the pdnsd executable is setuid root. Why?
|
|
||||||
|
|
||||||
pdnsd will drop privileges gained through setuid/setgid before executing
|
|
||||||
the uptest commands (you shouldn't set the pdnsd executable setuid/setgid
|
|
||||||
A: anyway). The reason is clear: if you install the pdnsd executable as setuid
|
|
||||||
root and this wouln't be done, any user could execute shellcode with root
|
|
||||||
privileges using that option!
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
At startup, I get an error saying:
|
|
||||||
Q: Bad config file permissions: the file must be only writeable by the user
|
|
||||||
Why is that?
|
|
||||||
|
|
||||||
pdnsd has an option (uptest=exec) that allows the execution of arbitrary
|
|
||||||
shell code (for testing whether an interface is up). This must be of course
|
|
||||||
secured against unauthorized use. One of these protection is the one that
|
|
||||||
produces the error message: if you routinely run pdnsd, e.g. at system
|
|
||||||
startup, and your config file is editable for others, someone could change
|
|
||||||
A: it and insert shell code that is executed in the next pdnsd run -- with
|
|
||||||
your user privileges! To prevent this, pdnsd will exit if the config file
|
|
||||||
is writeable by others than the owner. To get rid of this message, just do
|
|
||||||
chmod go-w <filename>
|
|
||||||
on your config file (for the default file: chmod go-w /etc/pdnsd.conf). You
|
|
||||||
should also check that the ownership is set correct.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Q: serve_aliases does not seem to work.
|
|
||||||
|
|
||||||
Some resolvers (e.g. of the glibc 2.1) seem sometimes not to look up
|
|
||||||
unmodified names, but the names with an entry of the search path already
|
|
||||||
A: appended. Since pdnsd will serve short names with this option anyway, you
|
|
||||||
can delete the search an domain options from your /etc/resolv.conf. This is
|
|
||||||
reported to work in some cases.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Q: Some queries for domains that have many records (e.g. www.gmx.de) fail
|
|
||||||
mysteriously.
|
|
||||||
|
|
||||||
pdnsd versions prior to 1.1.0 had the tcp server thread disabled by
|
|
||||||
default. Most resolvers repeat their query using tcp when they receive a
|
|
||||||
A: truncated answer (the answer is truncated when it exceeds a length of 512
|
|
||||||
bytes). You need to recompile pdnsd with the option --enable-tcp-server to
|
|
||||||
fix this.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
I am behind some kind of firewall. In the configuration file I have only
|
|
||||||
Q: listed addresses of name servers on the local (ISP's) network, but pdnsd is
|
|
||||||
slow and DNS queries frequently time out.
|
|
||||||
|
|
||||||
In some cases pdnsd will not consider the answer of the local name server
|
|
||||||
authoritative enough, and will try to get answers from the name servers
|
|
||||||
listed in the authority section of the reply message. If pdnsd is behind a
|
|
||||||
firewall that blocks the UDP reply packets from remote name servers, pdnsd
|
|
||||||
will wait in vain for a reply. One solution is to set proxy_only=on in the
|
|
||||||
A: servers sections of the configuration file. This will prevent pdnsd from
|
|
||||||
querying name servers that are not listed in the configuration file.
|
|
||||||
Another solution that can be tried is specifying query_method=tcp_only in
|
|
||||||
the global section of the configuration file, because a firewall that
|
|
||||||
blocks UDP packets from outside might still allow outgoing TCP connections
|
|
||||||
to port 53.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Q: Is pdnsd vulnerable to DNS cache poisoning as described in CERT
|
|
||||||
vulnerability note VU#800113?
|
|
||||||
|
|
||||||
Short answer: Yes.
|
|
||||||
Somewhat longer answer: The problem is not so much that pdnsd's
|
|
||||||
implementation is flawed but rather that the DNS protocol currently being
|
|
||||||
used is fundamentally flawed from a security viewpoint. As long as a more
|
|
||||||
secure protocol is not in place, all that the developers of pdnsd can do is
|
|
||||||
to try to tweak the current implementation to make it as difficult as
|
|
||||||
possible for an attacker to succeed.
|
|
||||||
From version 1.2.7 onwards, the default for the query_port_start option is
|
|
||||||
A: 1024, which means that the pdnsd resolver will randomly select source ports
|
|
||||||
in the range 1024-65535. (In previous versions the default was to let the
|
|
||||||
kernel select the source ports, which will often result in a more or less
|
|
||||||
predictable sequence of ports.) It also helps to use a good quality source
|
|
||||||
of random numbers. On platforms where this is supported, it is preferable
|
|
||||||
to configure with --with-random-device=/dev/urandom. There is still more
|
|
||||||
that can be done to make pdnsd less vulnerable, but this remains (as of
|
|
||||||
this writing) a work in progress.
|
|
||||||
Please note that pdnsd was designed for small (private) networks, and that
|
|
||||||
it is generally not recommended to let untrusted users access pdnsd.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Thomas Moestl and Paul Rombouts
|
|
||||||
|
|
||||||
|
|
||||||
Last revised: 18 August 2008 by Paul Rombouts
|
|
||||||
|
|
|
@ -1,305 +0,0 @@
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
About pdnsd
|
|
||||||
|
|
||||||
pdnsd is a proxy DNS server with permanent caching (the cache contents are
|
|
||||||
written to hard disk on exit) that is designed to cope with unreachable or down
|
|
||||||
DNS servers (for example in dial-in networking).
|
|
||||||
Since version 1.1.0, pdnsd supports negative caching.
|
|
||||||
|
|
||||||
It is licensed under the GNU General Public License (GPL). This, in short,
|
|
||||||
means that the sources are distributed togehter with the program, and that you
|
|
||||||
are free to modify the sources and redistribute them as long as you also
|
|
||||||
license them under the GPL. You do not need to pay anything for pdnsd. It also
|
|
||||||
means that there is ABSOLUTELY NO WARRANTY for pdnsd or any part of it. For
|
|
||||||
details, please read the GPL.
|
|
||||||
|
|
||||||
pdnsd can be used with applications that do DNS lookups, e.g. on startup, and
|
|
||||||
can't be configured to change that behaviour, to prevent the often minute-long
|
|
||||||
hangs (or even crashes) that result from stalled DNS queries. Some Netscape
|
|
||||||
Navigator versions for Unix, for example, expose this behaviour.
|
|
||||||
|
|
||||||
pdnsd is configurable via a file and supports run-time configuration using the
|
|
||||||
program pdnsd-ctl that comes with pdnsd. This allows you to set the status
|
|
||||||
flags of servers that pdnsd knows (to influence which servers pdnsd will
|
|
||||||
query), and the addition, deletion and invalidation of DNS records in pdnsd's
|
|
||||||
cache.
|
|
||||||
Parallel name server queries are supported. This is a technique that allows
|
|
||||||
querying several servers at the same time so that very slow or unavailable
|
|
||||||
servers will not block the answer for one timeout interval.
|
|
||||||
Since version 1.0.0, pdnsd has full IPv6 support.
|
|
||||||
|
|
||||||
There is also a limited support for local zone records, intended for defining
|
|
||||||
1.0.0.127.in-addr.arpa. and localhost. , since some clients request that
|
|
||||||
information and it must be served even if the cached servers are not available
|
|
||||||
or do not serve these records. pdnsd may also read your /etc/hosts file (this
|
|
||||||
file is normally used by your local resolver and usually contains information
|
|
||||||
for localhost as well as for your machines FQDN) and serve its contents.
|
|
||||||
|
|
||||||
pdnsd was started on Linux, and has since been ported to FreeBSD (and Cygwin
|
|
||||||
and Darwin). 90% of the source code should be easily portable to POSIX- and
|
|
||||||
BSD-compatible systems, provided that those systems support the POSIX threads
|
|
||||||
(pthreads). The rest might need OS-specific rewrites.
|
|
||||||
|
|
||||||
Currently, pdnsd is only compileable by gcc. This should be easy to fix, but I
|
|
||||||
just do not have documentation for other compilers. If you are not able or do
|
|
||||||
not want to use gcc, I would recommend you just try to do the minor changes.
|
|
||||||
|
|
||||||
pdnsd must be started as root in some cases (raw sockets are needed for icmp
|
|
||||||
echoes for the option uptest=ping, and the default port is 53, this must be >
|
|
||||||
1024 to allow non-root execution). However, pdnsd can be configured to change
|
|
||||||
it's user and group id to those of a non-privileged user after opening the
|
|
||||||
sockets needed for this.
|
|
||||||
|
|
||||||
The server should support the full standard DNS queries following the rfcs 1034
|
|
||||||
and 1035. As of version 1.0.0, the rfc compliance has been improved again, and
|
|
||||||
pdnsd is now believed (or hoped?) to be fully rfc-compatible. It completely
|
|
||||||
follows rfc 2181 (except for one minor issue in the FreeBSD port, see the
|
|
||||||
documentation). It does not support the following features, of which most are
|
|
||||||
marked optional, experimental or obsolete in these rfcs:
|
|
||||||
|
|
||||||
* Inverse queries
|
|
||||||
* Status queries
|
|
||||||
* Completion queries
|
|
||||||
* Namespaces other than IN (Internet)
|
|
||||||
* AXFR and IXFR queries (whole zone transfers); since pdnsd does not maintain
|
|
||||||
zones, that should not violate the standard
|
|
||||||
|
|
||||||
The following record types, that are extensions to the original DNS standard,
|
|
||||||
are supported for caching since version 1.2.9 (if you do not need most of them,
|
|
||||||
you can disable runtime support for the unneeded ones before compiling pdnsd
|
|
||||||
and save a little cache and executable space, see the source file src/
|
|
||||||
rr_types.in):
|
|
||||||
|
|
||||||
* RP (responsible person, RFC 1183)
|
|
||||||
* AFSDB (AFS database location, RFC 1183)
|
|
||||||
* X25 (X25 address, RFC 1183)
|
|
||||||
* ISDN (ISDN number/address, RFC 1183)
|
|
||||||
* RT (route through, RFC 1183)
|
|
||||||
* NSAP (Network Service Access Protocol address , RFC 1348)
|
|
||||||
* PX (X.400/RFC822 mapping information, RFC 1995)
|
|
||||||
* GPOS (geographic position, deprecated)
|
|
||||||
* AAAA (IPv6 address, RFC 1886)
|
|
||||||
* LOC (location, RFC 1876)
|
|
||||||
* EID (Nimrod EID)
|
|
||||||
* NIMLOC (Nimrod locator)
|
|
||||||
* SRV (service record, RFC 2782)
|
|
||||||
* ATMA (ATM address)
|
|
||||||
* NAPTR (URI mapping, RFC 2168)
|
|
||||||
* KX (key exchange, RFC 2230)
|
|
||||||
* CERT (Certificate record, RFC 4398)
|
|
||||||
* DS (Delegation Signer, RFC 4034)
|
|
||||||
* RRSIG (Resource Record Signature, RFC 4034)
|
|
||||||
* NSEC (Next Secure, RFC 4034)
|
|
||||||
* DNSKEY (record containing the public key for a zone, RFC 4034)
|
|
||||||
* NSEC3 (Next Secure version 3, RFC 5155)
|
|
||||||
* NSEC3PARAM (NSEC3 parameters, RFC 5155)
|
|
||||||
|
|
||||||
Note: This list is incomplete. For the complete list see the source file src/
|
|
||||||
rr_types.in.
|
|
||||||
|
|
||||||
There are FreeBSD and OpenBSD ports available for pdnsd (ports/net/pdnsd for
|
|
||||||
both). Thanks go to Roman Shterenzon for the FreeBSD port Sebastian Stark for
|
|
||||||
the OpenBSD one! Thanks to Kiyo Kelvin Lee now also runs on the Cygwin
|
|
||||||
platform! Thanks goes to Rodney Brown for extending portability to the Darwin
|
|
||||||
(Apple Mac OS X) platform!
|
|
||||||
|
|
||||||
If you have questions left, you should take a look into the FAQ.
|
|
||||||
Bugfixes, patches and compatability fixes for other OSs are very welcome!
|
|
||||||
|
|
||||||
Features in detail
|
|
||||||
|
|
||||||
This section describes some of pdnsds features in detail. Most of the options
|
|
||||||
are set in the config file. For more information on the configuration file, see
|
|
||||||
the documenation page.
|
|
||||||
|
|
||||||
|
|
||||||
Uptests
|
|
||||||
|
|
||||||
pdnsd provides several methods to test whether a remote DNS server should be
|
|
||||||
regarded as available (so that pdnsd can query it), in addition to the obvious
|
|
||||||
"none" test (the server is always regarded as available, or availability is set
|
|
||||||
on or off using the pdnsd-ctl utility). These tests are:
|
|
||||||
|
|
||||||
* ping: a given adress is ping'ed in a given interval. If it there is no
|
|
||||||
response or the host is unreachable, the server is seen to be not available
|
|
||||||
(for those who don't know: pinging is sending a certain Internet packet
|
|
||||||
type to a host to which any standard-conformant host is required to reply).
|
|
||||||
* if: a given network interface is tested whether it is existent, up and
|
|
||||||
running. If it is not, the server is regarded to be not available. This is
|
|
||||||
especially useful for ppp and similar interfaces. A special case test for
|
|
||||||
Linux isdn (ippp*) interfaces is integrated, so that the uptests should
|
|
||||||
also work for these.
|
|
||||||
* dev: this is a variant of the if uptest for use with Linux dial-on-demand
|
|
||||||
ppp interfaces. In addition to performing an if-style interface uptest, it
|
|
||||||
also tests whether a specified program (e.g. pppd) owns a lock to a given
|
|
||||||
(modem-) device.
|
|
||||||
* exec: a given shell command line is executed and the exit status of the
|
|
||||||
whole command line (which is normally the exit status of the last command)
|
|
||||||
is evaluated. If it is not zero, the server is regarded to be not
|
|
||||||
available. This is a very flexible testing method with which it should be
|
|
||||||
able to perform virtually any needed test.
|
|
||||||
* query: New in version 1.2: This works like the ping test, except it sends
|
|
||||||
an (empty) DNS query to the remote server. If the server sends a
|
|
||||||
well-formed response back within the timeout period (except SERVFAIL), it
|
|
||||||
will be regarded as available. This test is useful if a remote server does
|
|
||||||
not respond to ICMP_ECHO requests at all, which unfortunately is quite
|
|
||||||
common these days. In many cases this test will be a more reliable
|
|
||||||
indicator of availability than the ones mentioned above.
|
|
||||||
|
|
||||||
|
|
||||||
Local Records ("Zones")
|
|
||||||
|
|
||||||
As mentioned above, there are only very basic local record types (ie the record
|
|
||||||
types that you may use in record declarations in your local configuration for
|
|
||||||
records that pdnsd shall serve in addion to the cached ones). They are
|
|
||||||
organized roughly in zones but have not complete zone declarations, so I
|
|
||||||
generally do not use the term "zone" for them, but rather "local records".
|
|
||||||
These are the local record types pdnsd can understand:
|
|
||||||
|
|
||||||
* SOA (information about the name server)
|
|
||||||
* A (domain-name-to-address mapping)
|
|
||||||
* PTR (pointer, used normally for address-to-domain-name mapping)
|
|
||||||
* NS (name server, generated automatically by pdnsd for any local record set)
|
|
||||||
* CNAME (canonical host name)
|
|
||||||
* MX (mail exchange for the domain)
|
|
||||||
* TXT (arbitrary text strings, often used for Sender Policy Framework)
|
|
||||||
|
|
||||||
You can specify these records in the configuration file.
|
|
||||||
You may "source" a file in a format like that used in the /etc/hosts file, that
|
|
||||||
means that pdnsd reads this file, extracts addresses and domain names from it
|
|
||||||
and automatically generates A records for name to address mapping, PTR records
|
|
||||||
for address to name mapping and NS records (name server specifiation) for each
|
|
||||||
entry in the file.
|
|
||||||
Records can also be changed dynamically at run time.
|
|
||||||
A script contributed by Marko Stolle makes pdnsd usable in a DHCP setup using
|
|
||||||
this feature.
|
|
||||||
|
|
||||||
System requirements
|
|
||||||
|
|
||||||
As mentioned, pdnsd currently runs under Linux, FreeBSD and Cygwin. Other BSD
|
|
||||||
flavours may or may not work (feedback is very welcome!). The system and
|
|
||||||
software requirements under Linux are:
|
|
||||||
|
|
||||||
* Kernel version >2.2.0
|
|
||||||
* glibc version >2.0.1 (aka libc6) with LinuxThreads (normally included) or
|
|
||||||
NPTL (Native Posix Thread Library, recommended).
|
|
||||||
Due to a bug, pdnsd 0.9.8 does not run with glibc2.1.1. This behaviour was
|
|
||||||
fixed in pdnsd 0.9.9.
|
|
||||||
* For IPv6: glibc>=2.1
|
|
||||||
|
|
||||||
The system requirements under FreeBSD are:
|
|
||||||
|
|
||||||
* FreeBSD versions >=2.6 (prior ones may or may not work)
|
|
||||||
* For IPv6: FreeBSD >=4.0 is recommended (no idea if it runs on prior
|
|
||||||
versions)
|
|
||||||
|
|
||||||
The common software requirements for all supported systems are:
|
|
||||||
|
|
||||||
* GCC, preferably egcs-2.* or 3.* (other compilers are currently not
|
|
||||||
supported; the needed patch for another compiler should not be difficult,
|
|
||||||
however)
|
|
||||||
* GNU or BSD make
|
|
||||||
* the standard commands install, grep, sed, awk, touch and which (along with
|
|
||||||
the REALLY standard ones mv, cp, ln, rm, pwd, test, echo, cat, mkdir,
|
|
||||||
chown, chmod, tar). In any standard Unix installation, this should be no
|
|
||||||
problem.
|
|
||||||
* for hacking and building own packages, you might also need gzip, bzip2,
|
|
||||||
perl and rpmbuild
|
|
||||||
|
|
||||||
|
|
||||||
Download
|
|
||||||
|
|
||||||
If you want to download pdnsd, please visit the download page.
|
|
||||||
|
|
||||||
Authors
|
|
||||||
|
|
||||||
pdnsd was originally written by Thomas Moestl, but is no longer maintained by
|
|
||||||
him. Paul A. Rombouts has revised large portions of the code and has added a
|
|
||||||
number of new features. See README.par and the ChangeLog in the source
|
|
||||||
directory (or /usr/share/doc/pdnsd-<version> if you have installed a binary
|
|
||||||
package) for more details. If you have questions about the recent
|
|
||||||
modifications, you can find the email address of the current maintainer at the
|
|
||||||
end of README.par.
|
|
||||||
|
|
||||||
Daniel Smolik has contributed RedHat RPMs (the most recent RPMs are available
|
|
||||||
here).
|
|
||||||
Torben Janssen contributed start scripts for Red Hat Linux.
|
|
||||||
Soenke J. Peters contributed patches and suggestions for Red Hat compatability.
|
|
||||||
Wolfgang Ocker has contributed the code and documentation for the server_ip
|
|
||||||
option.
|
|
||||||
Markus Mohr contributed a Debian rc script.
|
|
||||||
Nikita V. Youschenko contributed extensions to the "if" uptest.
|
|
||||||
Lyonel Vincent extended the serve_aliases option to support an arbitrary number
|
|
||||||
of aliases.
|
|
||||||
Sourav K. Mandal wrote the autoconf scripts and contributed many fixes and
|
|
||||||
suggestions.
|
|
||||||
Stephan Boettcher contributed the SCHEME= option.
|
|
||||||
Ron Yorston contributed the uptest for Linux ppp dial-on-demand devices.
|
|
||||||
Alexandre Nunes fixed some bugs in the autoconf files.
|
|
||||||
Sverker Wiberg contributed fixes for IPv6.
|
|
||||||
Carsten Block contributed configure-able rc scripts.
|
|
||||||
Olaf Kirch contributed a security fix for the run_as code.
|
|
||||||
Paul Wagland contributed various patches for bind9-compatability and other
|
|
||||||
issues.
|
|
||||||
Roman Shterenzon contributed patches and lots of helpful hints for FreeBSD
|
|
||||||
compatability.
|
|
||||||
Bernd Leibing has contributed spec file fixes.
|
|
||||||
Michael Wiedmann has contributed the pdnsd-ctl.8 man page.
|
|
||||||
Marko Stolle has contributed the contrib/pdnsd_update.pl script that makes
|
|
||||||
pdnsd usable in a DHCP setup.
|
|
||||||
P.J. Bostley has contributed patches to get pdnsd working on alpha properly.
|
|
||||||
Christian Engstler contributed patches for SuSE compatability.
|
|
||||||
Bjoern Fischer contributed code to make pdnsd leave the case of names in the
|
|
||||||
cache unchanged.
|
|
||||||
Marko Stolle contributed the contrib/pdnsd_update.pl script that makes pdnsd
|
|
||||||
usable in a DHCP setup.
|
|
||||||
Andrew M. Bishop contributed the support for the label server option and the
|
|
||||||
pdnsd-ctl interface for using it.
|
|
||||||
Frank Elsner contributed rc script fixes.
|
|
||||||
Andreas Steinmetz contributed the code for query_port_start and query_port_end
|
|
||||||
options.
|
|
||||||
Mahesh T. Pai contributed the pdnsd.8 man page.
|
|
||||||
Nikola Kotur contributed the Slackware start-up script.
|
|
||||||
Kiyo Kelvin Lee contributed a patch for Cygwin support.
|
|
||||||
Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support.
|
|
||||||
Jan-Marek Glogowski contributed a patch implementing the use_nss option.
|
|
||||||
|
|
||||||
Special thanks to Bert Frederiks for letting me do a late-night debugging run
|
|
||||||
on his machine to spot obscure bugs!
|
|
||||||
|
|
||||||
Thanks to the following persons for reporting bugs and being helpful:
|
|
||||||
David G. Andersen,
|
|
||||||
Dirk Armbrust,
|
|
||||||
Daniel Black,
|
|
||||||
Kevin A. Burton,
|
|
||||||
Juliusz Chroboczek,
|
|
||||||
Joachim Dorner,
|
|
||||||
Stefan Erhardt,
|
|
||||||
Stefan F?rster,
|
|
||||||
Mike Hammer,
|
|
||||||
Jonathan Hudson,
|
|
||||||
Dan Jacobson,
|
|
||||||
Byrial Jensen,
|
|
||||||
Patrick Loschmidt,
|
|
||||||
James MacLean,
|
|
||||||
Fraser McCrossan,
|
|
||||||
Michael M?ller,
|
|
||||||
Erich Reitz,
|
|
||||||
Brian Schroeder,
|
|
||||||
Milan P. Stanic,
|
|
||||||
Michael Steiner,
|
|
||||||
Norbert Steinl,
|
|
||||||
Markus Storm,
|
|
||||||
Michael Str?der,
|
|
||||||
Alan Swanson,
|
|
||||||
Eelco Vriezekolk.
|
|
||||||
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Thomas Moestl and Paul A. Rombouts
|
|
||||||
|
|
||||||
|
|
||||||
Last revised: 17 March 2012 by Paul A. Rombouts
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +0,0 @@
|
||||||
%defattr(-,root,root)
|
|
||||||
%doc AUTHORS THANKS COPYING COPYING.BSD ChangeLog ChangeLog.old INSTALL NEWS README README.par README.par.old TODO
|
|
||||||
%config /etc/pdnsd.conf.sample
|
|
||||||
%attr(750, @def_id@, @def_id@) %dir @cachedir@
|
|
||||||
%attr(640, @def_id@, @def_id@) %config @cachedir@/pdnsd.cache
|
|
|
@ -1,323 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2005-05-14.22
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch. It can only install one file at a time, a restriction
|
|
||||||
# shared with many OS's install programs.
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit="${DOITPROG-}"
|
|
||||||
|
|
||||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
|
||||||
|
|
||||||
mvprog="${MVPROG-mv}"
|
|
||||||
cpprog="${CPPROG-cp}"
|
|
||||||
chmodprog="${CHMODPROG-chmod}"
|
|
||||||
chownprog="${CHOWNPROG-chown}"
|
|
||||||
chgrpprog="${CHGRPPROG-chgrp}"
|
|
||||||
stripprog="${STRIPPROG-strip}"
|
|
||||||
rmprog="${RMPROG-rm}"
|
|
||||||
mkdirprog="${MKDIRPROG-mkdir}"
|
|
||||||
|
|
||||||
chmodcmd="$chmodprog 0755"
|
|
||||||
chowncmd=
|
|
||||||
chgrpcmd=
|
|
||||||
stripcmd=
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
mvcmd="$mvprog"
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dstarg=
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-c (ignored)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test -n "$1"; do
|
|
||||||
case $1 in
|
|
||||||
-c) shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-d) dir_arg=true
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) chmodcmd="$chmodprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-t) dstarg=$2
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
*) # When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
test -n "$dir_arg$dstarg" && break
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dstarg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dstarg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dstarg=$arg
|
|
||||||
done
|
|
||||||
break;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$1"; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call `install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $src in
|
|
||||||
-*) src=./$src ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
src=
|
|
||||||
|
|
||||||
if test -d "$dst"; then
|
|
||||||
mkdircmd=:
|
|
||||||
chmodcmd=
|
|
||||||
else
|
|
||||||
mkdircmd=$mkdirprog
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dstarg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dst=$dstarg
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $dst in
|
|
||||||
-*) dst=./$dst ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dstarg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dst=$dst/`basename "$src"`
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# This sed command emulates the dirname command.
|
|
||||||
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
|
|
||||||
|
|
||||||
# Make sure that the destination directory exists.
|
|
||||||
|
|
||||||
# Skip lots of stat calls in the usual case.
|
|
||||||
if test ! -d "$dstdir"; then
|
|
||||||
defaultIFS='
|
|
||||||
'
|
|
||||||
IFS="${IFS-$defaultIFS}"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
# Some sh's can't handle IFS=/ for some reason.
|
|
||||||
IFS='%'
|
|
||||||
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
|
||||||
shift
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
pathcomp=
|
|
||||||
|
|
||||||
while test $# -ne 0 ; do
|
|
||||||
pathcomp=$pathcomp$1
|
|
||||||
shift
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
$mkdirprog "$pathcomp"
|
|
||||||
# mkdir can fail with a `File exist' error in case several
|
|
||||||
# install-sh are creating the directory concurrently. This
|
|
||||||
# is OK.
|
|
||||||
test -d "$pathcomp" || exit
|
|
||||||
fi
|
|
||||||
pathcomp=$pathcomp/
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
$doit $mkdircmd "$dst" \
|
|
||||||
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
|
|
||||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
|
|
||||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
|
|
||||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
|
|
||||||
|
|
||||||
else
|
|
||||||
dstfile=`basename "$dst"`
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
trap '(exit $?); exit' 1 2 13 15
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
$doit $cpprog "$src" "$dsttmp" &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
|
||||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
|
||||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
|
||||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|
|
||||||
|| {
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
if test -f "$dstdir/$dstfile"; then
|
|
||||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|
|
||||||
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|
|
||||||
|| {
|
|
||||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fi || { (exit 1); exit 1; }
|
|
||||||
done
|
|
||||||
|
|
||||||
# The final little trick to "correctly" pass the exit status to the exit trap.
|
|
||||||
{
|
|
||||||
(exit 0); exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
|
@ -1,360 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Common stub for a few missing GNU programs while installing.
|
|
||||||
|
|
||||||
scriptversion=2005-06-08.21
|
|
||||||
|
|
||||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
|
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
run=:
|
|
||||||
|
|
||||||
# In the cases where this matters, `missing' is being run in the
|
|
||||||
# srcdir already.
|
|
||||||
if test -f configure.ac; then
|
|
||||||
configure_ac=configure.ac
|
|
||||||
else
|
|
||||||
configure_ac=configure.in
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg="missing on your system"
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
--run)
|
|
||||||
# Try to run requested program, and just exit if it succeeds.
|
|
||||||
run=
|
|
||||||
shift
|
|
||||||
"$@" && exit 0
|
|
||||||
# Exit code 63 means version mismatch. This often happens
|
|
||||||
# when the user try to use an ancient version of a tool on
|
|
||||||
# a file that requires a minimum version. In this case we
|
|
||||||
# we should proceed has if the program had been absent, or
|
|
||||||
# if --run hadn't been passed.
|
|
||||||
if test $? = 63; then
|
|
||||||
run=:
|
|
||||||
msg="probably too old"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
|
||||||
error status if there is no known handling for PROGRAM.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
--run try to run the given command, and emulate it if it fails
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal touch file \`aclocal.m4'
|
|
||||||
autoconf touch file \`configure'
|
|
||||||
autoheader touch file \`config.h.in'
|
|
||||||
automake touch all \`Makefile.in' files
|
|
||||||
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
flex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
help2man touch the output file
|
|
||||||
lex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
makeinfo touch the output file
|
|
||||||
tar try tar, gnutar, gtar, then tar without non-portable flags
|
|
||||||
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: Unknown \`$1' option"
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Now exit if we have it, but it failed. Also exit now if we
|
|
||||||
# don't have it and --version was passed (most likely to detect
|
|
||||||
# the program).
|
|
||||||
case "$1" in
|
|
||||||
lex|yacc)
|
|
||||||
# Not GNU programs, they don't have --version.
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar)
|
|
||||||
if test -n "$run"; then
|
|
||||||
echo 1>&2 "ERROR: \`tar' requires --run"
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
|
||||||
# We have it, but it failed.
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
# Could not run --version or --help. This is probably someone
|
|
||||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
|
||||||
# $TOOL exists and not knowing $TOOL uses missing.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If it does not exist, or fails to run (possibly an outdated version),
|
|
||||||
# try to emulate it.
|
|
||||||
case "$1" in
|
|
||||||
aclocal*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
|
||||||
any GNU archive site."
|
|
||||||
touch aclocal.m4
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoconf)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`${configure_ac}'. You might want to install the
|
|
||||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
|
||||||
archive site."
|
|
||||||
touch configure
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoheader)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
|
||||||
from any GNU archive site."
|
|
||||||
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
|
||||||
test -z "$files" && files="config.h"
|
|
||||||
touch_files=
|
|
||||||
for f in $files; do
|
|
||||||
case "$f" in
|
|
||||||
*:*) touch_files="$touch_files "`echo "$f" |
|
|
||||||
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
|
||||||
*) touch_files="$touch_files $f.in";;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
touch $touch_files
|
|
||||||
;;
|
|
||||||
|
|
||||||
automake*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
|
||||||
You might want to install the \`Automake' and \`Perl' packages.
|
|
||||||
Grab them from any GNU archive site."
|
|
||||||
find . -type f -name Makefile.am -print |
|
|
||||||
sed 's/\.am$/.in/' |
|
|
||||||
while read f; do touch "$f"; done
|
|
||||||
;;
|
|
||||||
|
|
||||||
autom4te)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, but is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them.
|
|
||||||
You can get \`$1' as part of \`Autoconf' from any GNU
|
|
||||||
archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo "#! /bin/sh"
|
|
||||||
echo "# Created by GNU Automake missing as a replacement of"
|
|
||||||
echo "# $ $@"
|
|
||||||
echo "exit 0"
|
|
||||||
chmod +x $file
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
bison|yacc)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' $msg. You should only need it if
|
|
||||||
you modified a \`.y' file. You may need the \`Bison' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Bison' from any GNU archive site."
|
|
||||||
rm -f y.tab.c y.tab.h
|
|
||||||
if [ $# -ne 1 ]; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case "$LASTARG" in
|
|
||||||
*.y)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
|
||||||
if [ -f "$SRCFILE" ]; then
|
|
||||||
cp "$SRCFILE" y.tab.c
|
|
||||||
fi
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
|
||||||
if [ -f "$SRCFILE" ]; then
|
|
||||||
cp "$SRCFILE" y.tab.h
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if [ ! -f y.tab.h ]; then
|
|
||||||
echo >y.tab.h
|
|
||||||
fi
|
|
||||||
if [ ! -f y.tab.c ]; then
|
|
||||||
echo 'main() { return 0; }' >y.tab.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
lex|flex)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.l' file. You may need the \`Flex' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Flex' from any GNU archive site."
|
|
||||||
rm -f lex.yy.c
|
|
||||||
if [ $# -ne 1 ]; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case "$LASTARG" in
|
|
||||||
*.l)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
|
||||||
if [ -f "$SRCFILE" ]; then
|
|
||||||
cp "$SRCFILE" lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if [ ! -f lex.yy.c ]; then
|
|
||||||
echo 'main() { return 0; }' >lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
help2man)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a dependency of a manual page. You may need the
|
|
||||||
\`Help2man' package in order for those modifications to take
|
|
||||||
effect. You can get \`Help2man' from any GNU archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
|
||||||
if test -z "$file"; then
|
|
||||||
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
|
|
||||||
fi
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo ".ab help2man is required to generate this page"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
makeinfo)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
|
||||||
indirectly affecting the aspect of the manual. The spurious
|
|
||||||
call might also be the consequence of using a buggy \`make' (AIX,
|
|
||||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
|
||||||
the \`GNU make' package. Grab either from any GNU archive site."
|
|
||||||
# The file to touch is that specified with -o ...
|
|
||||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
|
||||||
if test -z "$file"; then
|
|
||||||
# ... or it is the one specified with @setfilename ...
|
|
||||||
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
|
||||||
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
|
|
||||||
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
|
||||||
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
|
||||||
fi
|
|
||||||
# If the file does not exist, the user really needs makeinfo;
|
|
||||||
# let's fail without touching anything.
|
|
||||||
test -f $file || exit 1
|
|
||||||
touch $file
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar)
|
|
||||||
shift
|
|
||||||
|
|
||||||
# We have already tried tar in the generic part.
|
|
||||||
# Look for gnutar/gtar before invocation to avoid ugly error
|
|
||||||
# messages.
|
|
||||||
if (gnutar --version > /dev/null 2>&1); then
|
|
||||||
gnutar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
if (gtar --version > /dev/null 2>&1); then
|
|
||||||
gtar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
firstarg="$1"
|
|
||||||
if shift; then
|
|
||||||
case "$firstarg" in
|
|
||||||
*o*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/o//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case "$firstarg" in
|
|
||||||
*h*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/h//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
|
||||||
You may want to install GNU tar or Free paxutils, or check the
|
|
||||||
command line arguments."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, and is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them. Check the \`README' file,
|
|
||||||
it often tells you about the needed prerequisites for installing
|
|
||||||
this package. You may also peek at any GNU archive site, in case
|
|
||||||
some other package would contain this missing \`$1' program."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
|
@ -1,244 +0,0 @@
|
||||||
# rpmbuild spec file for pdnsd.
|
|
||||||
# with modifications by Paul Rombouts.
|
|
||||||
|
|
||||||
# Supported rpmbuild --define and --with options include:
|
|
||||||
#
|
|
||||||
# --with isdn Configure with --enable-isdn.
|
|
||||||
#
|
|
||||||
# --without poll Configure with --disable-poll
|
|
||||||
#
|
|
||||||
# --without nptl Configure with --with-thread-lib=linuxthreads.
|
|
||||||
#
|
|
||||||
# --with ipv6 Configure with --enable-ipv6.
|
|
||||||
#
|
|
||||||
# --without tcpqueries Configure with --disable-tcp-queries.
|
|
||||||
#
|
|
||||||
# --without debug Configure with --with-debug=0.
|
|
||||||
#
|
|
||||||
# --define "distro <distro>" Configure with --with-distribution=<distro>.
|
|
||||||
#
|
|
||||||
# --define "run_as_user <user>" Configure with --with-default-id=<user>.
|
|
||||||
# For RPMs the default <user> is "@def_id@".
|
|
||||||
#
|
|
||||||
# --define "run_as_uid <uid>" If the user defined by the previous option does not exist
|
|
||||||
# when the RPM is installed, the pre-install script will try
|
|
||||||
# to create a new user with numerical id <uid>.
|
|
||||||
#
|
|
||||||
# --define "cachedir <dir>" Configure with --with-cachedir=<dir>.
|
|
||||||
#
|
|
||||||
|
|
||||||
%{!?distro: %define distro @distribution@}
|
|
||||||
|
|
||||||
# The default run_as ID to use
|
|
||||||
%{!?run_as_user: %define run_as_user @def_id@}
|
|
||||||
# By default, if a new run_as_user is to be created, we let
|
|
||||||
# useradd choose the numerical uid, unless run_as_uid is defined.
|
|
||||||
#define run_as_uid 96
|
|
||||||
%{!?cachedir: %define cachedir @cachedir@}
|
|
||||||
%define conffile %{_sysconfdir}/pdnsd.conf
|
|
||||||
|
|
||||||
Summary: A caching dns proxy for small networks or dialin accounts
|
|
||||||
Name: @PACKAGE@
|
|
||||||
Version: @VERSION@
|
|
||||||
Release: @packagerelease@
|
|
||||||
License: GPLv3
|
|
||||||
Group: Daemons
|
|
||||||
Source: http://members.home.nl/p.a.rombouts/pdnsd/releases/%{name}-%{version}-%{release}.tar.gz
|
|
||||||
URL: http://members.home.nl/p.a.rombouts/pdnsd.html
|
|
||||||
Vendor: Paul A. Rombouts
|
|
||||||
Packager: Paul A. Rombouts <p.a.rombouts@home.nl>
|
|
||||||
Prefix: %{_prefix}
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-root
|
|
||||||
|
|
||||||
%description
|
|
||||||
pdnsd is a proxy DNS daemon with permanent (disk-)cache and the ability
|
|
||||||
to serve local records. It is designed to detect network outages or hangups
|
|
||||||
and to prevent DNS-dependent applications like Netscape Navigator from hanging.
|
|
||||||
|
|
||||||
The original author of pdnsd is Thomas Moestl, but pdnsd is no longer maintained
|
|
||||||
by him. This is an extensively revised version by Paul A. Rombouts.
|
|
||||||
For a description of the changes see http://members.home.nl/p.a.rombouts/pdnsd.html
|
|
||||||
and the file README.par in %{_docdir}/%{name}-%{version}
|
|
||||||
|
|
||||||
%{!?distro:You can specify the target distribution when you build the source RPM. For instance, if you're building for a Red Hat system call rpmbuild with:}
|
|
||||||
%{!?distro: --define "distro RedHat"}
|
|
||||||
%{?distro:This package was built for a %{distro} distribution.}
|
|
||||||
%{!?_with_isdn:It's possible to rebuild the source RPM with isdn support using the rpmbuild option:}
|
|
||||||
%{!?_with_isdn: --with isdn}
|
|
||||||
%{?_with_isdn:This package was built with isdn support enabled.}
|
|
||||||
%{!?_with_ipv6:It's possible to rebuild the source RPM with ipv6 support using the rpmbuild option:}
|
|
||||||
%{!?_with_ipv6: --with ipv6}
|
|
||||||
%{?_with_ipv6:This package was built with ipv6 support.}
|
|
||||||
%{?_without_poll:This package was built with the select(2) function instead of poll(2).}
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup
|
|
||||||
|
|
||||||
%build
|
|
||||||
CFLAGS="${CFLAGS:-$RPM_OPT_FLAGS -Wall}" ./configure \
|
|
||||||
--prefix=%{_prefix} --sysconfdir=%{_sysconfdir} --mandir=%{_mandir} \
|
|
||||||
--with-cachedir="%{cachedir}" \
|
|
||||||
%{?distro:--with-distribution=%{distro}} --enable-specbuild \
|
|
||||||
--with-default-id=%{run_as_user} \
|
|
||||||
%{?_with_isdn:--enable-isdn} \
|
|
||||||
%{?_without_poll:--disable-poll} \
|
|
||||||
%{?_without_nptl:--with-thread-lib=linuxthreads} \
|
|
||||||
%{?_with_ipv6:--enable-ipv6} \
|
|
||||||
%{?_without_tcpqueries:--disable-tcp-queries} \
|
|
||||||
%{?_without_debug:--with-debug=0}
|
|
||||||
|
|
||||||
make
|
|
||||||
|
|
||||||
%install
|
|
||||||
%if "%{run_as_user}" != "nobody"
|
|
||||||
[ "$(id -un)" != root ] ||
|
|
||||||
id -u %{run_as_user} > /dev/null 2>&1 ||
|
|
||||||
/usr/sbin/useradd -c "Proxy DNS daemon" %{?run_as_uid:-u %{run_as_uid}} \
|
|
||||||
-s /sbin/nologin -r -d "%{cachedir}" %{run_as_user} || {
|
|
||||||
set +x
|
|
||||||
echo "Cannot create user \"%{run_as_user}\"%{?run_as_uid: with uid=%{run_as_uid}}"
|
|
||||||
echo "Please select another numerical uid and rebuild with --define \"run_as_uid uid\""
|
|
||||||
echo "or create a user named \"%{run_as_user}\" by hand and try again."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
%endif
|
|
||||||
|
|
||||||
rm -rf "$RPM_BUILD_ROOT"
|
|
||||||
make DESTDIR="$RPM_BUILD_ROOT" install
|
|
||||||
cp -f file-list.base file-list
|
|
||||||
find doc contrib -not -type d -not -iname '*makefile' -not -name '*.am' \
|
|
||||||
-not -name '*.in' -not -path 'doc/*.pl' |
|
|
||||||
sed -e 's/^/%doc --parents /' >> file-list
|
|
||||||
CURDIR=$PWD; cd "$RPM_BUILD_ROOT"
|
|
||||||
find . -not -type d '(' -not -name 'pdnsd.conf*' -or -name 'pdnsd.conf.[1-9]*' ')' \
|
|
||||||
-not -path '.%{_docdir}/*' -not -path './var/*' |
|
|
||||||
sed -e 's/^\.//
|
|
||||||
\:/man:{
|
|
||||||
/\.gz$/!s/$/.gz/
|
|
||||||
}' >> "$CURDIR/file-list"
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf "$RPM_BUILD_ROOT"
|
|
||||||
#rm -rf %{_builddir}/%{name}-%{srcver}
|
|
||||||
|
|
||||||
%files -f file-list
|
|
||||||
|
|
||||||
%pre
|
|
||||||
# First stop any running pdnsd daemons
|
|
||||||
%if "%{distro}" == "SuSE"
|
|
||||||
/sbin/init.d/pdnsd stop >/dev/null 2>&1
|
|
||||||
%endif
|
|
||||||
%if "%{distro}" == "RedHat"
|
|
||||||
if [ -f /var/lock/subsys/pdnsd ]; then
|
|
||||||
if /sbin/pidof pdnsd > /dev/null; then
|
|
||||||
/sbin/service pdnsd stop >/dev/null 2>&1
|
|
||||||
if [ "$1" -ge 2 ]; then touch /var/lock/subsys/pdnsd; fi
|
|
||||||
else
|
|
||||||
rm -f /var/lock/subsys/pdnsd
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if "%{run_as_user}" != "nobody"
|
|
||||||
# Add the "pdnsd" user
|
|
||||||
id -u %{run_as_user} > /dev/null 2>&1 ||
|
|
||||||
/usr/sbin/useradd -c "Proxy DNS daemon" %{?run_as_uid:-u %{run_as_uid}} \
|
|
||||||
-s /sbin/nologin -r -d "%{cachedir}" %{run_as_user} || {
|
|
||||||
echo "Cannot create user \"%{run_as_user}\"%{?run_as_uid: with uid=%{run_as_uid}}"
|
|
||||||
echo "Please create a user named \"%{run_as_user}\" by hand and try again."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
[ "$(id -gn %{run_as_user})" = %{run_as_user} ] || {
|
|
||||||
echo "user \"%{run_as_user}\" does not have an corresponding group called \"%{run_as_user}\""
|
|
||||||
echo "Please change the initial group of user \"%{run_as_user}\" to \"%{run_as_user}\" and try again."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ -f "%{conffile}" ] &&
|
|
||||||
grep -v -e '^[[:blank:]]*\(#\|\/\/\)' "%{conffile}" |
|
|
||||||
grep -q -e '\<run_as[[:blank:]]*=[[:blank:]]*"\?nobody"\?[[:blank:]]*;'
|
|
||||||
then
|
|
||||||
echo "An existing pdnsd configuration file %{conffile} has been detected, containing the run_as user ID \"nobody\""
|
|
||||||
echo "For security reasons it is recommended that pdnsd run as a seperate user \"%{run_as_user}\""
|
|
||||||
mv -f "%{conffile}" "%{conffile}.rpmsave" &&
|
|
||||||
echo "Your original %{conffile} has been saved as %{conffile}.rpmsave" &&
|
|
||||||
sed -e '/^[[:blank:]]*\(#\|\/\/\)/!s/\(\<run_as[[:blank:]]*=[[:blank:]]*\)"\?nobody"\?[[:blank:]]*;/\1"%{run_as_user}";/g' \
|
|
||||||
"%{conffile}.rpmsave" > "%{conffile}" &&
|
|
||||||
echo "In %{conffile} runs_as=\"nobody\" has been replaced by run_as=\"%{run_as_user}\""
|
|
||||||
fi
|
|
||||||
%endif
|
|
||||||
|
|
||||||
if [ -f "%{cachedir}/pdnsd.cache" ]; then
|
|
||||||
chown -c %{run_as_user}:%{run_as_user} "%{cachedir}/pdnsd.cache"
|
|
||||||
fi
|
|
||||||
|
|
||||||
%post
|
|
||||||
%if "%{distro}" == "SuSE"
|
|
||||||
if [ -w /etc/rc.config ]; then
|
|
||||||
grep "START_PDNSD" /etc/rc.config > /dev/null
|
|
||||||
if [ $? -ne 0 ] ; then
|
|
||||||
echo -e \
|
|
||||||
"\n\n#\n# Set to yes to start pdnsd at boot time\n#\nSTART_PDNSD=yes" \
|
|
||||||
>> /etc/rc.config
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
%endif
|
|
||||||
%if "%{distro}" == "RedHat"
|
|
||||||
if [ "$1" = 1 ]; then
|
|
||||||
/sbin/chkconfig --add pdnsd
|
|
||||||
fi
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%preun
|
|
||||||
%if "%{distro}" == "RedHat"
|
|
||||||
if [ "$1" = 0 ]; then
|
|
||||||
/sbin/service pdnsd stop >/dev/null 2>&1
|
|
||||||
/sbin/chkconfig --del pdnsd
|
|
||||||
fi
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%postun
|
|
||||||
%if "%{distro}" == "RedHat"
|
|
||||||
if [ "$1" -ge 1 ]; then
|
|
||||||
/sbin/service pdnsd condrestart >/dev/null 2>&1
|
|
||||||
fi
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
* Tue Jan 31 2012 Paul A. Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Prevent makefiles and perl scripts from being installed
|
|
||||||
in the documentation directory.
|
|
||||||
* Sat Jan 28 2012 Paul A. Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Update the (Source) URLs.
|
|
||||||
* Sat Aug 4 2007 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- License is now GPL version 3
|
|
||||||
* Fri Mar 24 2006 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Instead of using a fixed default value for run_as_uid,
|
|
||||||
I let useradd choose the uid if run_as_uid is undefined.
|
|
||||||
* Thu Dec 29 2005 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- TCP-query support is now compiled in by default,
|
|
||||||
but can be disabled using "--without tcpqueries".
|
|
||||||
* Sun Jul 20 2003 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Changed default run_as ID from "nobody" to "pdnsd"
|
|
||||||
* Fri Jun 20 2003 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Added configuration option for NPTL.
|
|
||||||
* Sat Jun 07 2003 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Added automatic definition of distro using _vendor macro.
|
|
||||||
* Thu May 22 2003 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Ensured that modification times of acconfig.h and configure.in
|
|
||||||
are not changed by patching to avoid unwanted reconfigure during make phase.
|
|
||||||
* Tue May 20 2003 Paul Rombouts <p.a.rombouts@home.nl>
|
|
||||||
- Applied my customized patch file. See READ.par for details.
|
|
||||||
* Sun May 16 2001 Thomas Moestl <tmoestl@gmx.net>
|
|
||||||
- Make use of chkconfig for Red Hat (patch by Christian Engstler)
|
|
||||||
* Sun Mar 25 2001 Thomas Moestl <tmoestl@gmx.net>
|
|
||||||
- Merged SuSE fixes by Christian Engstler
|
|
||||||
* Fri Feb 09 2001 Thomas Moestl <tmoestl@gmx.net>
|
|
||||||
- Merged in a spec fix for mapage inclusion contributed by Sourav K.
|
|
||||||
Mandal
|
|
||||||
* Sun Nov 26 2000 Thomas Moestl <tmoestl@gmx.net>
|
|
||||||
- Added some patches contributed by Bernd Leibing
|
|
||||||
* Tue Aug 15 2000 Thomas Moestl <tmoestl@gmx.net>
|
|
||||||
- Added the distro for configure
|
|
||||||
* Tue Jul 11 2000 Sourav K. Mandal <smandal@mit.edu>
|
|
||||||
- autoconf/automake modifications
|
|
|
@ -1,24 +0,0 @@
|
||||||
|
|
||||||
sbin_PROGRAMS = pdnsd
|
|
||||||
|
|
||||||
pdnsd_CFLAGS = -DCONFDIR='"$(sysconfdir)"' $(thread_CFLAGS)
|
|
||||||
|
|
||||||
pdnsd_SOURCES = conf-parser.c conff.c consts.c debug.c dns.c dns_answer.c \
|
|
||||||
dns_query.c error.c helpers.c icmp.c list.c main.c netdev.c rr_types.c \
|
|
||||||
status.c servers.c thread.c cache.c hash.c conf-parser.h \
|
|
||||||
conf-keywords.h conff.h consts.h debug.h dns.h dns_answer.h \
|
|
||||||
dns_query.h error.h helpers.h icmp.h ipvers.h list.h netdev.h \
|
|
||||||
rr_types.h servers.h status.h thread.h cache.h hash.h pdnsd_assert.h \
|
|
||||||
freebsd_netinet_ip_icmp.h
|
|
||||||
|
|
||||||
EXTRA_DIST = make_rr_types_h.pl rr_types.in
|
|
||||||
|
|
||||||
## Try to do this last
|
|
||||||
|
|
||||||
SUBDIRS = . pdnsd-ctl rc test
|
|
||||||
|
|
||||||
$(pdnsd_OBJECTS): rr_types.h
|
|
||||||
|
|
||||||
rr_types.h: make_rr_types_h.pl rr_types.in
|
|
||||||
perl make_rr_types_h.pl rr_types.in > rr_types.h
|
|
||||||
|
|
|
@ -1,921 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
sbin_PROGRAMS = pdnsd$(EXEEXT)
|
|
||||||
subdir = src
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
am__installdirs = "$(DESTDIR)$(sbindir)"
|
|
||||||
PROGRAMS = $(sbin_PROGRAMS)
|
|
||||||
am_pdnsd_OBJECTS = pdnsd-conf-parser.$(OBJEXT) pdnsd-conff.$(OBJEXT) \
|
|
||||||
pdnsd-consts.$(OBJEXT) pdnsd-debug.$(OBJEXT) \
|
|
||||||
pdnsd-dns.$(OBJEXT) pdnsd-dns_answer.$(OBJEXT) \
|
|
||||||
pdnsd-dns_query.$(OBJEXT) pdnsd-error.$(OBJEXT) \
|
|
||||||
pdnsd-helpers.$(OBJEXT) pdnsd-icmp.$(OBJEXT) \
|
|
||||||
pdnsd-list.$(OBJEXT) pdnsd-main.$(OBJEXT) \
|
|
||||||
pdnsd-netdev.$(OBJEXT) pdnsd-rr_types.$(OBJEXT) \
|
|
||||||
pdnsd-status.$(OBJEXT) pdnsd-servers.$(OBJEXT) \
|
|
||||||
pdnsd-thread.$(OBJEXT) pdnsd-cache.$(OBJEXT) \
|
|
||||||
pdnsd-hash.$(OBJEXT)
|
|
||||||
pdnsd_OBJECTS = $(am_pdnsd_OBJECTS)
|
|
||||||
pdnsd_LDADD = $(LDADD)
|
|
||||||
pdnsd_LINK = $(CCLD) $(pdnsd_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
|
||||||
$(LDFLAGS) -o $@
|
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
|
||||||
am__depfiles_maybe = depfiles
|
|
||||||
am__mv = mv -f
|
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
CCLD = $(CC)
|
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
|
||||||
SOURCES = $(pdnsd_SOURCES)
|
|
||||||
DIST_SOURCES = $(pdnsd_SOURCES)
|
|
||||||
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
|
||||||
html-recursive info-recursive install-data-recursive \
|
|
||||||
install-dvi-recursive install-exec-recursive \
|
|
||||||
install-html-recursive install-info-recursive \
|
|
||||||
install-pdf-recursive install-ps-recursive install-recursive \
|
|
||||||
installcheck-recursive installdirs-recursive pdf-recursive \
|
|
||||||
ps-recursive uninstall-recursive
|
|
||||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
|
||||||
distclean-recursive maintainer-clean-recursive
|
|
||||||
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
|
||||||
distdir
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
am__relativize = \
|
|
||||||
dir0=`pwd`; \
|
|
||||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
|
||||||
sed_rest='s,^[^/]*/*,,'; \
|
|
||||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
|
||||||
sed_butlast='s,/*[^/]*$$,,'; \
|
|
||||||
while test -n "$$dir1"; do \
|
|
||||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first" != "."; then \
|
|
||||||
if test "$$first" = ".."; then \
|
|
||||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
|
||||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
|
||||||
else \
|
|
||||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first2" = "$$first"; then \
|
|
||||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
|
||||||
else \
|
|
||||||
dir2="../$$dir2"; \
|
|
||||||
fi; \
|
|
||||||
dir0="$$dir0"/"$$first"; \
|
|
||||||
fi; \
|
|
||||||
fi; \
|
|
||||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
|
||||||
done; \
|
|
||||||
reldir="$$dir2"
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
ALLOCA = @ALLOCA@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
cachedir = @cachedir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
def_id = @def_id@
|
|
||||||
distribution = @distribution@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
fullversion = @fullversion@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
packagerelease = @packagerelease@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
specbuild = @specbuild@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
thread_CFLAGS = @thread_CFLAGS@
|
|
||||||
threadlib = @threadlib@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
pdnsd_CFLAGS = -DCONFDIR='"$(sysconfdir)"' $(thread_CFLAGS)
|
|
||||||
pdnsd_SOURCES = conf-parser.c conff.c consts.c debug.c dns.c dns_answer.c \
|
|
||||||
dns_query.c error.c helpers.c icmp.c list.c main.c netdev.c rr_types.c \
|
|
||||||
status.c servers.c thread.c cache.c hash.c conf-parser.h \
|
|
||||||
conf-keywords.h conff.h consts.h debug.h dns.h dns_answer.h \
|
|
||||||
dns_query.h error.h helpers.h icmp.h ipvers.h list.h netdev.h \
|
|
||||||
rr_types.h servers.h status.h thread.h cache.h hash.h pdnsd_assert.h \
|
|
||||||
freebsd_netinet_ip_icmp.h
|
|
||||||
|
|
||||||
EXTRA_DIST = make_rr_types_h.pl rr_types.in
|
|
||||||
SUBDIRS = . pdnsd-ctl rc test
|
|
||||||
all: all-recursive
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .c .o .obj
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu src/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
install-sbinPROGRAMS: $(sbin_PROGRAMS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
|
|
||||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed 's/$(EXEEXT)$$//' | \
|
|
||||||
while read p p1; do if test -f $$p; \
|
|
||||||
then echo "$$p"; echo "$$p"; else :; fi; \
|
|
||||||
done | \
|
|
||||||
sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
|
|
||||||
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
|
||||||
sed 'N;N;N;s,\n, ,g' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
|
||||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
|
||||||
if ($$2 == $$4) files[d] = files[d] " " $$1; \
|
|
||||||
else { print "f", $$3 "/" $$4, $$1; } } \
|
|
||||||
END { for (d in files) print "f", d, files[d] }' | \
|
|
||||||
while read type dir files; do \
|
|
||||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
|
|
||||||
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
|
|
||||||
} \
|
|
||||||
; done
|
|
||||||
|
|
||||||
uninstall-sbinPROGRAMS:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo "$$p"; done | \
|
|
||||||
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
|
||||||
-e 's/$$/$(EXEEXT)/' `; \
|
|
||||||
test -n "$$list" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(sbindir)" && rm -f $$files
|
|
||||||
|
|
||||||
clean-sbinPROGRAMS:
|
|
||||||
-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
|
|
||||||
pdnsd$(EXEEXT): $(pdnsd_OBJECTS) $(pdnsd_DEPENDENCIES)
|
|
||||||
@rm -f pdnsd$(EXEEXT)
|
|
||||||
$(pdnsd_LINK) $(pdnsd_OBJECTS) $(pdnsd_LDADD) $(LIBS)
|
|
||||||
|
|
||||||
mostlyclean-compile:
|
|
||||||
-rm -f *.$(OBJEXT)
|
|
||||||
|
|
||||||
distclean-compile:
|
|
||||||
-rm -f *.tab.c
|
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-cache.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-conf-parser.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-conff.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-consts.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-debug.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-dns.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-dns_answer.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-dns_query.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-error.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-hash.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-helpers.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-icmp.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-list.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-main.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-netdev.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-rr_types.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-servers.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-status.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-thread.Po@am__quote@
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
|
||||||
|
|
||||||
pdnsd-conf-parser.o: conf-parser.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conf-parser.o -MD -MP -MF $(DEPDIR)/pdnsd-conf-parser.Tpo -c -o pdnsd-conf-parser.o `test -f 'conf-parser.c' || echo '$(srcdir)/'`conf-parser.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conf-parser.Tpo $(DEPDIR)/pdnsd-conf-parser.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conf-parser.c' object='pdnsd-conf-parser.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conf-parser.o `test -f 'conf-parser.c' || echo '$(srcdir)/'`conf-parser.c
|
|
||||||
|
|
||||||
pdnsd-conf-parser.obj: conf-parser.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conf-parser.obj -MD -MP -MF $(DEPDIR)/pdnsd-conf-parser.Tpo -c -o pdnsd-conf-parser.obj `if test -f 'conf-parser.c'; then $(CYGPATH_W) 'conf-parser.c'; else $(CYGPATH_W) '$(srcdir)/conf-parser.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conf-parser.Tpo $(DEPDIR)/pdnsd-conf-parser.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conf-parser.c' object='pdnsd-conf-parser.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conf-parser.obj `if test -f 'conf-parser.c'; then $(CYGPATH_W) 'conf-parser.c'; else $(CYGPATH_W) '$(srcdir)/conf-parser.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-conff.o: conff.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conff.o -MD -MP -MF $(DEPDIR)/pdnsd-conff.Tpo -c -o pdnsd-conff.o `test -f 'conff.c' || echo '$(srcdir)/'`conff.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conff.Tpo $(DEPDIR)/pdnsd-conff.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conff.c' object='pdnsd-conff.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conff.o `test -f 'conff.c' || echo '$(srcdir)/'`conff.c
|
|
||||||
|
|
||||||
pdnsd-conff.obj: conff.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conff.obj -MD -MP -MF $(DEPDIR)/pdnsd-conff.Tpo -c -o pdnsd-conff.obj `if test -f 'conff.c'; then $(CYGPATH_W) 'conff.c'; else $(CYGPATH_W) '$(srcdir)/conff.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conff.Tpo $(DEPDIR)/pdnsd-conff.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conff.c' object='pdnsd-conff.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conff.obj `if test -f 'conff.c'; then $(CYGPATH_W) 'conff.c'; else $(CYGPATH_W) '$(srcdir)/conff.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-consts.o: consts.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-consts.o -MD -MP -MF $(DEPDIR)/pdnsd-consts.Tpo -c -o pdnsd-consts.o `test -f 'consts.c' || echo '$(srcdir)/'`consts.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-consts.Tpo $(DEPDIR)/pdnsd-consts.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='consts.c' object='pdnsd-consts.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-consts.o `test -f 'consts.c' || echo '$(srcdir)/'`consts.c
|
|
||||||
|
|
||||||
pdnsd-consts.obj: consts.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-consts.obj -MD -MP -MF $(DEPDIR)/pdnsd-consts.Tpo -c -o pdnsd-consts.obj `if test -f 'consts.c'; then $(CYGPATH_W) 'consts.c'; else $(CYGPATH_W) '$(srcdir)/consts.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-consts.Tpo $(DEPDIR)/pdnsd-consts.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='consts.c' object='pdnsd-consts.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-consts.obj `if test -f 'consts.c'; then $(CYGPATH_W) 'consts.c'; else $(CYGPATH_W) '$(srcdir)/consts.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-debug.o: debug.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-debug.o -MD -MP -MF $(DEPDIR)/pdnsd-debug.Tpo -c -o pdnsd-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-debug.Tpo $(DEPDIR)/pdnsd-debug.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='pdnsd-debug.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c
|
|
||||||
|
|
||||||
pdnsd-debug.obj: debug.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-debug.obj -MD -MP -MF $(DEPDIR)/pdnsd-debug.Tpo -c -o pdnsd-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-debug.Tpo $(DEPDIR)/pdnsd-debug.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='pdnsd-debug.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-dns.o: dns.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns.o -MD -MP -MF $(DEPDIR)/pdnsd-dns.Tpo -c -o pdnsd-dns.o `test -f 'dns.c' || echo '$(srcdir)/'`dns.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns.Tpo $(DEPDIR)/pdnsd-dns.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns.c' object='pdnsd-dns.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns.o `test -f 'dns.c' || echo '$(srcdir)/'`dns.c
|
|
||||||
|
|
||||||
pdnsd-dns.obj: dns.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns.obj -MD -MP -MF $(DEPDIR)/pdnsd-dns.Tpo -c -o pdnsd-dns.obj `if test -f 'dns.c'; then $(CYGPATH_W) 'dns.c'; else $(CYGPATH_W) '$(srcdir)/dns.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns.Tpo $(DEPDIR)/pdnsd-dns.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns.c' object='pdnsd-dns.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns.obj `if test -f 'dns.c'; then $(CYGPATH_W) 'dns.c'; else $(CYGPATH_W) '$(srcdir)/dns.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-dns_answer.o: dns_answer.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_answer.o -MD -MP -MF $(DEPDIR)/pdnsd-dns_answer.Tpo -c -o pdnsd-dns_answer.o `test -f 'dns_answer.c' || echo '$(srcdir)/'`dns_answer.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_answer.Tpo $(DEPDIR)/pdnsd-dns_answer.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_answer.c' object='pdnsd-dns_answer.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_answer.o `test -f 'dns_answer.c' || echo '$(srcdir)/'`dns_answer.c
|
|
||||||
|
|
||||||
pdnsd-dns_answer.obj: dns_answer.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_answer.obj -MD -MP -MF $(DEPDIR)/pdnsd-dns_answer.Tpo -c -o pdnsd-dns_answer.obj `if test -f 'dns_answer.c'; then $(CYGPATH_W) 'dns_answer.c'; else $(CYGPATH_W) '$(srcdir)/dns_answer.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_answer.Tpo $(DEPDIR)/pdnsd-dns_answer.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_answer.c' object='pdnsd-dns_answer.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_answer.obj `if test -f 'dns_answer.c'; then $(CYGPATH_W) 'dns_answer.c'; else $(CYGPATH_W) '$(srcdir)/dns_answer.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-dns_query.o: dns_query.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_query.o -MD -MP -MF $(DEPDIR)/pdnsd-dns_query.Tpo -c -o pdnsd-dns_query.o `test -f 'dns_query.c' || echo '$(srcdir)/'`dns_query.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_query.Tpo $(DEPDIR)/pdnsd-dns_query.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_query.c' object='pdnsd-dns_query.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_query.o `test -f 'dns_query.c' || echo '$(srcdir)/'`dns_query.c
|
|
||||||
|
|
||||||
pdnsd-dns_query.obj: dns_query.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_query.obj -MD -MP -MF $(DEPDIR)/pdnsd-dns_query.Tpo -c -o pdnsd-dns_query.obj `if test -f 'dns_query.c'; then $(CYGPATH_W) 'dns_query.c'; else $(CYGPATH_W) '$(srcdir)/dns_query.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_query.Tpo $(DEPDIR)/pdnsd-dns_query.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_query.c' object='pdnsd-dns_query.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_query.obj `if test -f 'dns_query.c'; then $(CYGPATH_W) 'dns_query.c'; else $(CYGPATH_W) '$(srcdir)/dns_query.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-error.o: error.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-error.o -MD -MP -MF $(DEPDIR)/pdnsd-error.Tpo -c -o pdnsd-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-error.Tpo $(DEPDIR)/pdnsd-error.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='pdnsd-error.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c
|
|
||||||
|
|
||||||
pdnsd-error.obj: error.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-error.obj -MD -MP -MF $(DEPDIR)/pdnsd-error.Tpo -c -o pdnsd-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-error.Tpo $(DEPDIR)/pdnsd-error.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='pdnsd-error.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-helpers.o: helpers.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-helpers.o -MD -MP -MF $(DEPDIR)/pdnsd-helpers.Tpo -c -o pdnsd-helpers.o `test -f 'helpers.c' || echo '$(srcdir)/'`helpers.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-helpers.Tpo $(DEPDIR)/pdnsd-helpers.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='helpers.c' object='pdnsd-helpers.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-helpers.o `test -f 'helpers.c' || echo '$(srcdir)/'`helpers.c
|
|
||||||
|
|
||||||
pdnsd-helpers.obj: helpers.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-helpers.obj -MD -MP -MF $(DEPDIR)/pdnsd-helpers.Tpo -c -o pdnsd-helpers.obj `if test -f 'helpers.c'; then $(CYGPATH_W) 'helpers.c'; else $(CYGPATH_W) '$(srcdir)/helpers.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-helpers.Tpo $(DEPDIR)/pdnsd-helpers.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='helpers.c' object='pdnsd-helpers.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-helpers.obj `if test -f 'helpers.c'; then $(CYGPATH_W) 'helpers.c'; else $(CYGPATH_W) '$(srcdir)/helpers.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-icmp.o: icmp.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-icmp.o -MD -MP -MF $(DEPDIR)/pdnsd-icmp.Tpo -c -o pdnsd-icmp.o `test -f 'icmp.c' || echo '$(srcdir)/'`icmp.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-icmp.Tpo $(DEPDIR)/pdnsd-icmp.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='icmp.c' object='pdnsd-icmp.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-icmp.o `test -f 'icmp.c' || echo '$(srcdir)/'`icmp.c
|
|
||||||
|
|
||||||
pdnsd-icmp.obj: icmp.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-icmp.obj -MD -MP -MF $(DEPDIR)/pdnsd-icmp.Tpo -c -o pdnsd-icmp.obj `if test -f 'icmp.c'; then $(CYGPATH_W) 'icmp.c'; else $(CYGPATH_W) '$(srcdir)/icmp.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-icmp.Tpo $(DEPDIR)/pdnsd-icmp.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='icmp.c' object='pdnsd-icmp.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-icmp.obj `if test -f 'icmp.c'; then $(CYGPATH_W) 'icmp.c'; else $(CYGPATH_W) '$(srcdir)/icmp.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-list.o: list.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-list.o -MD -MP -MF $(DEPDIR)/pdnsd-list.Tpo -c -o pdnsd-list.o `test -f 'list.c' || echo '$(srcdir)/'`list.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-list.Tpo $(DEPDIR)/pdnsd-list.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='list.c' object='pdnsd-list.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-list.o `test -f 'list.c' || echo '$(srcdir)/'`list.c
|
|
||||||
|
|
||||||
pdnsd-list.obj: list.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-list.obj -MD -MP -MF $(DEPDIR)/pdnsd-list.Tpo -c -o pdnsd-list.obj `if test -f 'list.c'; then $(CYGPATH_W) 'list.c'; else $(CYGPATH_W) '$(srcdir)/list.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-list.Tpo $(DEPDIR)/pdnsd-list.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='list.c' object='pdnsd-list.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-list.obj `if test -f 'list.c'; then $(CYGPATH_W) 'list.c'; else $(CYGPATH_W) '$(srcdir)/list.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-main.o: main.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-main.o -MD -MP -MF $(DEPDIR)/pdnsd-main.Tpo -c -o pdnsd-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-main.Tpo $(DEPDIR)/pdnsd-main.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='pdnsd-main.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
|
|
||||||
|
|
||||||
pdnsd-main.obj: main.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-main.obj -MD -MP -MF $(DEPDIR)/pdnsd-main.Tpo -c -o pdnsd-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-main.Tpo $(DEPDIR)/pdnsd-main.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='pdnsd-main.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-netdev.o: netdev.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-netdev.o -MD -MP -MF $(DEPDIR)/pdnsd-netdev.Tpo -c -o pdnsd-netdev.o `test -f 'netdev.c' || echo '$(srcdir)/'`netdev.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-netdev.Tpo $(DEPDIR)/pdnsd-netdev.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netdev.c' object='pdnsd-netdev.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-netdev.o `test -f 'netdev.c' || echo '$(srcdir)/'`netdev.c
|
|
||||||
|
|
||||||
pdnsd-netdev.obj: netdev.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-netdev.obj -MD -MP -MF $(DEPDIR)/pdnsd-netdev.Tpo -c -o pdnsd-netdev.obj `if test -f 'netdev.c'; then $(CYGPATH_W) 'netdev.c'; else $(CYGPATH_W) '$(srcdir)/netdev.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-netdev.Tpo $(DEPDIR)/pdnsd-netdev.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netdev.c' object='pdnsd-netdev.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-netdev.obj `if test -f 'netdev.c'; then $(CYGPATH_W) 'netdev.c'; else $(CYGPATH_W) '$(srcdir)/netdev.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-rr_types.o: rr_types.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-rr_types.o -MD -MP -MF $(DEPDIR)/pdnsd-rr_types.Tpo -c -o pdnsd-rr_types.o `test -f 'rr_types.c' || echo '$(srcdir)/'`rr_types.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-rr_types.Tpo $(DEPDIR)/pdnsd-rr_types.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rr_types.c' object='pdnsd-rr_types.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-rr_types.o `test -f 'rr_types.c' || echo '$(srcdir)/'`rr_types.c
|
|
||||||
|
|
||||||
pdnsd-rr_types.obj: rr_types.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-rr_types.obj -MD -MP -MF $(DEPDIR)/pdnsd-rr_types.Tpo -c -o pdnsd-rr_types.obj `if test -f 'rr_types.c'; then $(CYGPATH_W) 'rr_types.c'; else $(CYGPATH_W) '$(srcdir)/rr_types.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-rr_types.Tpo $(DEPDIR)/pdnsd-rr_types.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rr_types.c' object='pdnsd-rr_types.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-rr_types.obj `if test -f 'rr_types.c'; then $(CYGPATH_W) 'rr_types.c'; else $(CYGPATH_W) '$(srcdir)/rr_types.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-status.o: status.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-status.o -MD -MP -MF $(DEPDIR)/pdnsd-status.Tpo -c -o pdnsd-status.o `test -f 'status.c' || echo '$(srcdir)/'`status.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-status.Tpo $(DEPDIR)/pdnsd-status.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='status.c' object='pdnsd-status.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-status.o `test -f 'status.c' || echo '$(srcdir)/'`status.c
|
|
||||||
|
|
||||||
pdnsd-status.obj: status.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-status.obj -MD -MP -MF $(DEPDIR)/pdnsd-status.Tpo -c -o pdnsd-status.obj `if test -f 'status.c'; then $(CYGPATH_W) 'status.c'; else $(CYGPATH_W) '$(srcdir)/status.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-status.Tpo $(DEPDIR)/pdnsd-status.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='status.c' object='pdnsd-status.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-status.obj `if test -f 'status.c'; then $(CYGPATH_W) 'status.c'; else $(CYGPATH_W) '$(srcdir)/status.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-servers.o: servers.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-servers.o -MD -MP -MF $(DEPDIR)/pdnsd-servers.Tpo -c -o pdnsd-servers.o `test -f 'servers.c' || echo '$(srcdir)/'`servers.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-servers.Tpo $(DEPDIR)/pdnsd-servers.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='servers.c' object='pdnsd-servers.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-servers.o `test -f 'servers.c' || echo '$(srcdir)/'`servers.c
|
|
||||||
|
|
||||||
pdnsd-servers.obj: servers.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-servers.obj -MD -MP -MF $(DEPDIR)/pdnsd-servers.Tpo -c -o pdnsd-servers.obj `if test -f 'servers.c'; then $(CYGPATH_W) 'servers.c'; else $(CYGPATH_W) '$(srcdir)/servers.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-servers.Tpo $(DEPDIR)/pdnsd-servers.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='servers.c' object='pdnsd-servers.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-servers.obj `if test -f 'servers.c'; then $(CYGPATH_W) 'servers.c'; else $(CYGPATH_W) '$(srcdir)/servers.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-thread.o: thread.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-thread.o -MD -MP -MF $(DEPDIR)/pdnsd-thread.Tpo -c -o pdnsd-thread.o `test -f 'thread.c' || echo '$(srcdir)/'`thread.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-thread.Tpo $(DEPDIR)/pdnsd-thread.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='thread.c' object='pdnsd-thread.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-thread.o `test -f 'thread.c' || echo '$(srcdir)/'`thread.c
|
|
||||||
|
|
||||||
pdnsd-thread.obj: thread.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-thread.obj -MD -MP -MF $(DEPDIR)/pdnsd-thread.Tpo -c -o pdnsd-thread.obj `if test -f 'thread.c'; then $(CYGPATH_W) 'thread.c'; else $(CYGPATH_W) '$(srcdir)/thread.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-thread.Tpo $(DEPDIR)/pdnsd-thread.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='thread.c' object='pdnsd-thread.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-thread.obj `if test -f 'thread.c'; then $(CYGPATH_W) 'thread.c'; else $(CYGPATH_W) '$(srcdir)/thread.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-cache.o: cache.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-cache.o -MD -MP -MF $(DEPDIR)/pdnsd-cache.Tpo -c -o pdnsd-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-cache.Tpo $(DEPDIR)/pdnsd-cache.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cache.c' object='pdnsd-cache.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c
|
|
||||||
|
|
||||||
pdnsd-cache.obj: cache.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-cache.obj -MD -MP -MF $(DEPDIR)/pdnsd-cache.Tpo -c -o pdnsd-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-cache.Tpo $(DEPDIR)/pdnsd-cache.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cache.c' object='pdnsd-cache.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`
|
|
||||||
|
|
||||||
pdnsd-hash.o: hash.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-hash.o -MD -MP -MF $(DEPDIR)/pdnsd-hash.Tpo -c -o pdnsd-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-hash.Tpo $(DEPDIR)/pdnsd-hash.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hash.c' object='pdnsd-hash.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c
|
|
||||||
|
|
||||||
pdnsd-hash.obj: hash.c
|
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-hash.obj -MD -MP -MF $(DEPDIR)/pdnsd-hash.Tpo -c -o pdnsd-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-hash.Tpo $(DEPDIR)/pdnsd-hash.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hash.c' object='pdnsd-hash.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`
|
|
||||||
|
|
||||||
# This directory's subdirectories are mostly independent; you can cd
|
|
||||||
# into them and run `make' without going through this Makefile.
|
|
||||||
# To change the values of `make' variables: instead of editing Makefiles,
|
|
||||||
# (1) if the variable is set in `config.status', edit `config.status'
|
|
||||||
# (which will cause the Makefiles to be regenerated when you run `make');
|
|
||||||
# (2) otherwise, pass the desired values on the `make' command line.
|
|
||||||
$(RECURSIVE_TARGETS):
|
|
||||||
@fail= failcom='exit 1'; \
|
|
||||||
for f in x $$MAKEFLAGS; do \
|
|
||||||
case $$f in \
|
|
||||||
*=* | --[!k]*);; \
|
|
||||||
*k*) failcom='fail=yes';; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
dot_seen=no; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
dot_seen=yes; \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done; \
|
|
||||||
if test "$$dot_seen" = "no"; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
|
||||||
fi; test -z "$$fail"
|
|
||||||
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS):
|
|
||||||
@fail= failcom='exit 1'; \
|
|
||||||
for f in x $$MAKEFLAGS; do \
|
|
||||||
case $$f in \
|
|
||||||
*=* | --[!k]*);; \
|
|
||||||
*k*) failcom='fail=yes';; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
dot_seen=no; \
|
|
||||||
case "$@" in \
|
|
||||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
|
||||||
*) list='$(SUBDIRS)' ;; \
|
|
||||||
esac; \
|
|
||||||
rev=''; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = "."; then :; else \
|
|
||||||
rev="$$subdir $$rev"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
rev="$$rev ."; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
for subdir in $$rev; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done && test -z "$$fail"
|
|
||||||
tags-recursive:
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
|
||||||
done
|
|
||||||
ctags-recursive:
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
|
||||||
done
|
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
mkid -fID $$unique
|
|
||||||
tags: TAGS
|
|
||||||
|
|
||||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
|
||||||
include_option=--etags-include; \
|
|
||||||
empty_fix=.; \
|
|
||||||
else \
|
|
||||||
include_option=--include; \
|
|
||||||
empty_fix=; \
|
|
||||||
fi; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test ! -f $$subdir/TAGS || \
|
|
||||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test -d "$(distdir)/$$subdir" \
|
|
||||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_distdir=$$reldir; \
|
|
||||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_top_distdir=$$reldir; \
|
|
||||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
|
||||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
|
||||||
($(am__cd) $$subdir && \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="$$new_top_distdir" \
|
|
||||||
distdir="$$new_distdir" \
|
|
||||||
am__remove_distdir=: \
|
|
||||||
am__skip_length_check=: \
|
|
||||||
am__skip_mode_fix=: \
|
|
||||||
distdir) \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-recursive
|
|
||||||
all-am: Makefile $(PROGRAMS)
|
|
||||||
installdirs: installdirs-recursive
|
|
||||||
installdirs-am:
|
|
||||||
for dir in "$(DESTDIR)$(sbindir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-recursive
|
|
||||||
install-exec: install-exec-recursive
|
|
||||||
install-data: install-data-recursive
|
|
||||||
uninstall: uninstall-recursive
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-recursive
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-recursive
|
|
||||||
|
|
||||||
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-recursive
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
|
||||||
distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-recursive
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-recursive
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-recursive
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
|
|
||||||
install-dvi: install-dvi-recursive
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am: install-sbinPROGRAMS
|
|
||||||
|
|
||||||
install-html: install-html-recursive
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-recursive
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-recursive
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-recursive
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-recursive
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-recursive
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-recursive
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-recursive
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-sbinPROGRAMS
|
|
||||||
|
|
||||||
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
|
|
||||||
install-am install-strip tags-recursive
|
|
||||||
|
|
||||||
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
|
||||||
all all-am check check-am clean clean-generic \
|
|
||||||
clean-sbinPROGRAMS ctags ctags-recursive distclean \
|
|
||||||
distclean-compile distclean-generic distclean-tags distdir dvi \
|
|
||||||
dvi-am html html-am info info-am install install-am \
|
|
||||||
install-data install-data-am install-dvi install-dvi-am \
|
|
||||||
install-exec install-exec-am install-html install-html-am \
|
|
||||||
install-info install-info-am install-man install-pdf \
|
|
||||||
install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \
|
|
||||||
install-strip installcheck installcheck-am installdirs \
|
|
||||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
|
||||||
mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
|
|
||||||
ps ps-am tags tags-recursive uninstall uninstall-am \
|
|
||||||
uninstall-sbinPROGRAMS
|
|
||||||
|
|
||||||
|
|
||||||
$(pdnsd_OBJECTS): rr_types.h
|
|
||||||
|
|
||||||
rr_types.h: make_rr_types_h.pl rr_types.in
|
|
||||||
perl make_rr_types_h.pl rr_types.in > rr_types.h
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,306 +0,0 @@
|
||||||
/* cache.h - Definitions for the dns cache
|
|
||||||
|
|
||||||
Copyright (C) 2000 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2004, 2005, 2010, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _CACHE_H_
|
|
||||||
#define _CACHE_H_
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "list.h"
|
|
||||||
#include "dns.h"
|
|
||||||
#include "conff.h"
|
|
||||||
|
|
||||||
struct rr_lent_s;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These values are converted to host byte order. the data is _not_.
|
|
||||||
*/
|
|
||||||
typedef struct rr_b_s {
|
|
||||||
struct rr_b_s *next; /* this is the next pointer in the dns_cent_t list. */
|
|
||||||
unsigned rdlen;
|
|
||||||
#if ALLOW_LOCAL_AAAA || defined(ENABLE_IPV6)
|
|
||||||
struct in6_addr data[0]; /* dummy for alignment */
|
|
||||||
#else
|
|
||||||
struct in_addr data[0];
|
|
||||||
#endif
|
|
||||||
} rr_bucket_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct rr_lent_s *lent; /* this points to the list entry */
|
|
||||||
time_t ttl;
|
|
||||||
time_t ts;
|
|
||||||
unsigned short flags;
|
|
||||||
rr_bucket_t *rrs;
|
|
||||||
} rr_set_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char *qname; /* Name of the domain in length byte - string notation. */
|
|
||||||
size_t cs; /* Size of the cache entry, including RR sets. */
|
|
||||||
unsigned short num_rrs; /* The number of RR sets. When this decreases to 0, the cent is deleted. */
|
|
||||||
unsigned short flags; /* Flags for the whole domain. */
|
|
||||||
union {
|
|
||||||
struct { /* Fields used only for negatively cached domains. */
|
|
||||||
struct rr_lent_s *lent; /* list entry for the whole cent. */
|
|
||||||
time_t ttl; /* TTL for negative caching. */
|
|
||||||
time_t ts; /* Timestamp. */
|
|
||||||
} neg;
|
|
||||||
struct { /* Fields used only for domains that actually exist. */
|
|
||||||
rr_set_t *(rrmu[NRRMU]); /* The most used records.
|
|
||||||
Use the the value obtained from rrlkuptab[] as index. */
|
|
||||||
rr_set_t **rrext; /* Pointer (may be NULL) to an array of size NNRREXT storing the
|
|
||||||
less frequently used records. */
|
|
||||||
} rr;
|
|
||||||
};
|
|
||||||
unsigned char c_ns,c_soa; /* Number of trailing name elements in qname to use to find NS or SOA
|
|
||||||
records to add to the authority section of a response. */
|
|
||||||
} dns_cent_t;
|
|
||||||
|
|
||||||
/* This value is used to represent an undefined c_ns or c_soa field. */
|
|
||||||
#define cundef 0xff
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the flag values for RR sets in the cache
|
|
||||||
*/
|
|
||||||
#define CF_NEGATIVE 1 /* this one is for per-RRset negative caching*/
|
|
||||||
#define CF_LOCAL 2 /* Local zone entry */
|
|
||||||
#define CF_AUTH 4 /* authoritative record */
|
|
||||||
#define CF_NOCACHE 8 /* Only hold for the cache latency time period, then purge.
|
|
||||||
* Not really written to cache, but used by add_cache. */
|
|
||||||
#define CF_ADDITIONAL 16 /* This was fetched as an additional or "off-topic" record. */
|
|
||||||
#define CF_NOPURGE 32 /* Do not purge this record */
|
|
||||||
#define CF_ROOTSERV 64 /* This record was directly obtained from a root server */
|
|
||||||
|
|
||||||
#define CFF_NOINHERIT (CF_LOCAL|CF_AUTH|CF_ADDITIONAL|CF_ROOTSERV) /* not to be inherited on requery */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the flag values for whole domains in the cache
|
|
||||||
*/
|
|
||||||
#define DF_NEGATIVE 1 /* this one is for whole-domain negative caching (created on NXDOMAIN)*/
|
|
||||||
#define DF_LOCAL 2 /* local record (in conj. with DF_NEGATIVE) */
|
|
||||||
#define DF_AUTH 4 /* authoritative record */
|
|
||||||
#define DF_NOCACHE 8 /* Only hold for the cache latency time period, then purge.
|
|
||||||
* Only used for negatively cached domains.
|
|
||||||
* Not really written to cache, but used by add_cache. */
|
|
||||||
#define DF_WILD 16 /* subdomains of this domain have wildcard records */
|
|
||||||
|
|
||||||
/* #define DFF_NOINHERIT (DF_NEGATIVE) */ /* not to be inherited on requery */
|
|
||||||
|
|
||||||
enum {w_wild=1, w_neg, w_locnerr}; /* Used to distinguish different types of wildcard records. */
|
|
||||||
|
|
||||||
#if DEBUG>0
|
|
||||||
#define NCFLAGS 7
|
|
||||||
#define NDFLAGS 5
|
|
||||||
#define CFLAGSTRLEN (NCFLAGS*4)
|
|
||||||
#define DFLAGSTRLEN (NDFLAGS*4)
|
|
||||||
extern const char cflgnames[];
|
|
||||||
extern const char dflgnames[];
|
|
||||||
char *flags2str(unsigned flags,char *buf,int nflags,const char *flgnames);
|
|
||||||
#define cflags2str(flags,buf) flags2str(flags,buf,NCFLAGS,cflgnames)
|
|
||||||
#define dflags2str(flags,buf) flags2str(flags,buf,NDFLAGS,dflgnames)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the time in secs any record remains at least in the cache before it is purged.
|
|
||||||
* (exception is that the cache is full)
|
|
||||||
*/
|
|
||||||
#define CACHE_LAT 120
|
|
||||||
#define CLAT_ADJ(ttl) ((ttl)<CACHE_LAT?CACHE_LAT:(ttl))
|
|
||||||
/* This is used internally to check if a rrset has timed out. */
|
|
||||||
#define timedout(rrset) ((rrset)->ts+CLAT_ADJ((rrset)->ttl)<time(NULL))
|
|
||||||
/* This is used internally to check if a negatively cached domain has timed out.
|
|
||||||
Only use if the DF_NEGATIVE bit is set! */
|
|
||||||
#define timedout_nxdom(cent) ((cent)->neg.ts+CLAT_ADJ((cent)->neg.ttl)<time(NULL))
|
|
||||||
|
|
||||||
extern volatile short int use_cache_lock;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef ALLOC_DEBUG
|
|
||||||
#define DBGPARAM ,int dbg
|
|
||||||
#define DBGARG ,dbg
|
|
||||||
#define DBG0 ,0
|
|
||||||
#define DBG1 ,1
|
|
||||||
#else
|
|
||||||
#define DBGPARAM
|
|
||||||
#define DBGARG
|
|
||||||
#define DBG0
|
|
||||||
#define DBG1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the cache. Call only once. */
|
|
||||||
#define init_cache mk_dns_hash
|
|
||||||
|
|
||||||
/* Initialize the cache lock. Call only once. */
|
|
||||||
inline static void init_cache_lock() __attribute__((always_inline));
|
|
||||||
inline static void init_cache_lock()
|
|
||||||
{
|
|
||||||
use_cache_lock=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int empty_cache(slist_array sla);
|
|
||||||
void destroy_cache(void);
|
|
||||||
void read_disk_cache(void);
|
|
||||||
void write_disk_cache(void);
|
|
||||||
|
|
||||||
int report_cache_stat(int f);
|
|
||||||
int dump_cache(int fd, const unsigned char *name, int exact);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* add_cache expects the dns_cent_t to be filled.
|
|
||||||
*/
|
|
||||||
void add_cache(dns_cent_t *cent);
|
|
||||||
int add_reverse_cache(dns_cent_t * cent);
|
|
||||||
void del_cache(const unsigned char *name);
|
|
||||||
void invalidate_record(const unsigned char *name);
|
|
||||||
int set_cent_flags(const unsigned char *name, unsigned flags);
|
|
||||||
unsigned char *getlocalowner(unsigned char *name,int tp);
|
|
||||||
dns_cent_t *lookup_cache(const unsigned char *name, int *wild);
|
|
||||||
rr_set_t *lookup_cache_local_rrset(const unsigned char *name, int type);
|
|
||||||
#if 0
|
|
||||||
int add_cache_rr_add(const unsigned char *name, int tp, time_t ttl, time_t ts, unsigned flags, unsigned dlen, void *data, unsigned long serial);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline static unsigned int mk_flag_val(servparm_t *server)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static unsigned int mk_flag_val(servparm_t *server)
|
|
||||||
{
|
|
||||||
unsigned int fl=0;
|
|
||||||
if (!server->purge_cache)
|
|
||||||
fl|=CF_NOPURGE;
|
|
||||||
if (server->nocache)
|
|
||||||
fl|=CF_NOCACHE;
|
|
||||||
if (server->rootserver)
|
|
||||||
fl|=CF_ROOTSERV;
|
|
||||||
return fl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int init_cent(dns_cent_t *cent, const unsigned char *qname, time_t ttl, time_t ts, unsigned flags DBGPARAM);
|
|
||||||
int add_cent_rrset_by_type(dns_cent_t *cent, int type, time_t ttl, time_t ts, unsigned flags DBGPARAM);
|
|
||||||
int add_cent_rr(dns_cent_t *cent, int type, time_t ttl, time_t ts, unsigned flags,unsigned dlen, void *data DBGPARAM);
|
|
||||||
int del_rrset(rr_set_t *rrs DBGPARAM);
|
|
||||||
void free_cent(dns_cent_t *cent DBGPARAM);
|
|
||||||
void free_cent0(void *ptr);
|
|
||||||
void negate_cent(dns_cent_t *cent, time_t ttl, time_t ts);
|
|
||||||
void del_cent(dns_cent_t *cent);
|
|
||||||
|
|
||||||
/* Because this is empty by now, it is defined as an empty macro to save overhead.*/
|
|
||||||
/*void free_rr(rr_bucket_t cent);*/
|
|
||||||
#define free_rr(x)
|
|
||||||
|
|
||||||
dns_cent_t *copy_cent(dns_cent_t *cent DBGPARAM);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
unsigned long get_serial(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Get pointer to rrset given cache entry and rr type value. */
|
|
||||||
inline static rr_set_t *getrrset(dns_cent_t *cent, int type)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static rr_set_t *getrrset(dns_cent_t *cent, int type)
|
|
||||||
{
|
|
||||||
if(!(cent->flags&DF_NEGATIVE)) {
|
|
||||||
int tpi= type - T_MIN;
|
|
||||||
|
|
||||||
if(tpi>=0 && tpi<T_NUM) {
|
|
||||||
unsigned int idx = rrlkuptab[tpi];
|
|
||||||
if(idx < NRRMU)
|
|
||||||
return cent->rr.rrmu[idx];
|
|
||||||
else {
|
|
||||||
idx -= NRRMU;
|
|
||||||
if(idx < NRREXT) {
|
|
||||||
rr_set_t **rrext= cent->rr.rrext;
|
|
||||||
if(rrext)
|
|
||||||
return rrext[idx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This version of getrrset is slightly more efficient,
|
|
||||||
but also more dangerous, because it performs less checks.
|
|
||||||
It is safe to use if T_MIN <= type <= T_MAX and cent
|
|
||||||
is not negative.
|
|
||||||
*/
|
|
||||||
inline static rr_set_t *getrrset_eff(dns_cent_t *cent, int type)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static rr_set_t *getrrset_eff(dns_cent_t *cent, int type)
|
|
||||||
{
|
|
||||||
unsigned int idx = rrlkuptab[type-T_MIN];
|
|
||||||
if(idx < NRRMU)
|
|
||||||
return cent->rr.rrmu[idx];
|
|
||||||
else {
|
|
||||||
idx -= NRRMU;
|
|
||||||
if(idx < NRREXT) {
|
|
||||||
rr_set_t **rrext= cent->rr.rrext;
|
|
||||||
if(rrext)
|
|
||||||
return rrext[idx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* have_rr() tests whether a cache entry has at least one record of a given type.
|
|
||||||
Only use if T_MIN <= type <=T_MAX
|
|
||||||
*/
|
|
||||||
inline static int have_rr(dns_cent_t *cent, int type)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int have_rr(dns_cent_t *cent, int type)
|
|
||||||
{
|
|
||||||
rr_set_t *rrset;
|
|
||||||
return !(cent->flags&DF_NEGATIVE) && (rrset=getrrset_eff(cent, type)) && rrset->rrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some quick and dirty and hopefully fast macros. */
|
|
||||||
#define PDNSD_NOT_CACHED_TYPE(type) ((type)<T_MIN || (type)>T_MAX || rrlkuptab[(type)-T_MIN]>=NRRTOT)
|
|
||||||
|
|
||||||
/* This is useful for iterating over all the RR types in a cache entry in strict ascending order. */
|
|
||||||
#define NRRITERLIST(cent) ((cent)->flags&DF_NEGATIVE?0:(cent)->rr.rrext?NRRTOT:NRRMU)
|
|
||||||
#define RRITERLIST(cent) ((cent)->flags&DF_NEGATIVE?NULL:(cent)->rr.rrext?rrcachiterlist:rrmuiterlist)
|
|
||||||
|
|
||||||
/* The following macros use array indices as arguments, not RR type values! */
|
|
||||||
#define GET_RRSMU(cent,i) (!((cent)->flags&DF_NEGATIVE)?(cent)->rr.rrmu[i]:NULL)
|
|
||||||
#define GET_RRSEXT(cent,i) (!((cent)->flags&DF_NEGATIVE) && (cent)->rr.rrext?(cent)->rr.rrext[i]:NULL)
|
|
||||||
#define HAVE_RRMU(cent,i) (!((cent)->flags&DF_NEGATIVE) && (cent)->rr.rrmu[i] && (cent)->rr.rrmu[i]->rrs)
|
|
||||||
#define HAVE_RREXT(cent,i) (!((cent)->flags&DF_NEGATIVE) && (cent)->rr.rrext && (cent)->rr.rrext[i] && (cent)->rr.rrext[i]->rrs)
|
|
||||||
|
|
||||||
#define RRARR_LEN(cent) ((cent)->flags&DF_NEGATIVE?0:(cent)->rr.rrext?NRRTOT:NRRMU)
|
|
||||||
|
|
||||||
/* This allows us to index the RR-set arrays in a cache entry as if they formed one contiguous array. */
|
|
||||||
#define RRARR_INDEX_TESTEXT(cent,i) ((cent)->flags&DF_NEGATIVE?NULL:(i)<NRRMU?(cent)->rr.rrmu[i]:(cent)->rr.rrext?(cent)->rr.rrext[(i)-NRRMU]:NULL)
|
|
||||||
/* This gets the address where the pointer to an RR-set is stored in a cache entry,
|
|
||||||
given the cache entry and an RR-set index.
|
|
||||||
Address may be NULL if no storage space for the type has been allocated. */
|
|
||||||
#define RRARR_INDEX_PA_TESTEXT(cent,i) ((cent)->flags&DF_NEGATIVE?NULL:(i)<NRRMU?&(cent)->rr.rrmu[i]:(cent)->rr.rrext?&(cent)->rr.rrext[(i)-NRRMU]:NULL)
|
|
||||||
|
|
||||||
/* The following macros should only be used if 0 <= i < RRARR_LEN(cent) ! */
|
|
||||||
#define RRARR_INDEX(cent,i) ((i)<NRRMU?(cent)->rr.rrmu[i]:(cent)->rr.rrext[(i)-NRRMU])
|
|
||||||
#define RRARR_INDEX_PA(cent,i) ((i)<NRRMU?&(cent)->rr.rrmu[i]:&(cent)->rr.rrext[(i)-NRRMU])
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,238 +0,0 @@
|
||||||
/* conf-keywords.h - Tables used by parser of configuration file.
|
|
||||||
Based on information previously contained in conf-lex.y and conf-parse.y
|
|
||||||
|
|
||||||
Copyright (C) 2004,2005,2006,2007,2008,2009,2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum {
|
|
||||||
ERROR,
|
|
||||||
|
|
||||||
GLOBAL,
|
|
||||||
SERVER,
|
|
||||||
RR,
|
|
||||||
NEG,
|
|
||||||
SOURCE,
|
|
||||||
INCLUDE_F,
|
|
||||||
|
|
||||||
PERM_CACHE,
|
|
||||||
CACHE_DIR,
|
|
||||||
SERVER_PORT,
|
|
||||||
SERVER_IP,
|
|
||||||
OUTGOING_IP,
|
|
||||||
SCHEME_FILE,
|
|
||||||
LINKDOWN_KLUGE,
|
|
||||||
MAX_TTL,
|
|
||||||
MIN_TTL,
|
|
||||||
RUN_AS,
|
|
||||||
STRICT_SETUID,
|
|
||||||
USE_NSS,
|
|
||||||
PARANOID,
|
|
||||||
IGNORE_CD,
|
|
||||||
STATUS_CTL,
|
|
||||||
DAEMON,
|
|
||||||
C_TCP_SERVER,
|
|
||||||
PID_FILE,
|
|
||||||
C_VERBOSITY,
|
|
||||||
C_QUERY_METHOD,
|
|
||||||
RUN_IPV4,
|
|
||||||
IPV4_6_PREFIX,
|
|
||||||
C_DEBUG,
|
|
||||||
C_CTL_PERMS,
|
|
||||||
C_PROC_LIMIT,
|
|
||||||
C_PROCQ_LIMIT,
|
|
||||||
TCP_QTIMEOUT,
|
|
||||||
C_PAR_QUERIES,
|
|
||||||
C_RAND_RECS,
|
|
||||||
NEG_TTL,
|
|
||||||
NEG_RRS_POL,
|
|
||||||
NEG_DOMAIN_POL,
|
|
||||||
QUERY_PORT_START,
|
|
||||||
QUERY_PORT_END,
|
|
||||||
UDP_BUFSIZE,
|
|
||||||
DELEGATION_ONLY,
|
|
||||||
|
|
||||||
IP,
|
|
||||||
PORT,
|
|
||||||
SCHEME,
|
|
||||||
UPTEST,
|
|
||||||
TIMEOUT,
|
|
||||||
PING_TIMEOUT,
|
|
||||||
PING_IP,
|
|
||||||
UPTEST_CMD,
|
|
||||||
QUERY_TEST_NAME,
|
|
||||||
INTERVAL,
|
|
||||||
INTERFACE,
|
|
||||||
DEVICE,
|
|
||||||
PURGE_CACHE,
|
|
||||||
CACHING,
|
|
||||||
LEAN_QUERY,
|
|
||||||
EDNS_QUERY,
|
|
||||||
PRESET,
|
|
||||||
PROXY_ONLY,
|
|
||||||
ROOT_SERVER,
|
|
||||||
RANDOMIZE_SERVERS,
|
|
||||||
INCLUDE,
|
|
||||||
EXCLUDE,
|
|
||||||
POLICY,
|
|
||||||
REJECTLIST,
|
|
||||||
REJECTPOLICY,
|
|
||||||
REJECTRECURSIVELY,
|
|
||||||
LABEL,
|
|
||||||
|
|
||||||
A,
|
|
||||||
PTR,
|
|
||||||
MX,
|
|
||||||
SOA,
|
|
||||||
CNAME,
|
|
||||||
TXT,
|
|
||||||
SPF,
|
|
||||||
NAME,
|
|
||||||
OWNER,
|
|
||||||
TTL,
|
|
||||||
TYPES,
|
|
||||||
FILET,
|
|
||||||
SERVE_ALIASES,
|
|
||||||
AUTHREC,
|
|
||||||
REVERSE
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* Table for looking up section headers. Order alphabetically! */
|
|
||||||
static const namevalue_t section_headers[]= {
|
|
||||||
{"global", GLOBAL},
|
|
||||||
{"include", INCLUDE_F},
|
|
||||||
{"neg", NEG},
|
|
||||||
{"rr", RR},
|
|
||||||
{"server", SERVER},
|
|
||||||
{"source", SOURCE}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Table for looking up global options. Order alphabetically! */
|
|
||||||
static const namevalue_t global_options[]= {
|
|
||||||
{"cache_dir", CACHE_DIR},
|
|
||||||
{"ctl_perms", C_CTL_PERMS},
|
|
||||||
{"daemon", DAEMON},
|
|
||||||
{"debug", C_DEBUG},
|
|
||||||
{"delegation_only", DELEGATION_ONLY},
|
|
||||||
{"ignore_cd", IGNORE_CD},
|
|
||||||
{"interface", SERVER_IP},
|
|
||||||
{"ipv4_6_prefix", IPV4_6_PREFIX},
|
|
||||||
{"linkdown_kluge", LINKDOWN_KLUGE},
|
|
||||||
{"max_ttl", MAX_TTL},
|
|
||||||
{"min_ttl", MIN_TTL},
|
|
||||||
{"neg_domain_pol", NEG_DOMAIN_POL},
|
|
||||||
{"neg_rrs_pol", NEG_RRS_POL},
|
|
||||||
{"neg_ttl", NEG_TTL},
|
|
||||||
{"outgoing_ip", OUTGOING_IP},
|
|
||||||
{"outside_interface", OUTGOING_IP},
|
|
||||||
{"par_queries", C_PAR_QUERIES},
|
|
||||||
{"paranoid", PARANOID},
|
|
||||||
{"perm_cache", PERM_CACHE},
|
|
||||||
{"pid_file", PID_FILE},
|
|
||||||
{"proc_limit", C_PROC_LIMIT},
|
|
||||||
{"procq_limit", C_PROCQ_LIMIT},
|
|
||||||
{"query_method", C_QUERY_METHOD},
|
|
||||||
{"query_port_end", QUERY_PORT_END},
|
|
||||||
{"query_port_start", QUERY_PORT_START},
|
|
||||||
{"randomize_recs", C_RAND_RECS},
|
|
||||||
{"run_as", RUN_AS},
|
|
||||||
{"run_ipv4", RUN_IPV4},
|
|
||||||
{"scheme_file", SCHEME_FILE},
|
|
||||||
{"server_ip", SERVER_IP},
|
|
||||||
{"server_port", SERVER_PORT},
|
|
||||||
{"status_ctl", STATUS_CTL},
|
|
||||||
{"strict_setuid", STRICT_SETUID},
|
|
||||||
{"tcp_qtimeout", TCP_QTIMEOUT},
|
|
||||||
{"tcp_server", C_TCP_SERVER},
|
|
||||||
{"timeout", TIMEOUT},
|
|
||||||
{"udpbufsize", UDP_BUFSIZE},
|
|
||||||
{"use_nss", USE_NSS},
|
|
||||||
{"verbosity", C_VERBOSITY}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Table for looking up server options. Order alphabetically! */
|
|
||||||
static const namevalue_t server_options[]= {
|
|
||||||
{"caching", CACHING},
|
|
||||||
{"device", DEVICE},
|
|
||||||
{"edns_query", EDNS_QUERY},
|
|
||||||
{"exclude", EXCLUDE},
|
|
||||||
{"file", FILET},
|
|
||||||
{"include", INCLUDE},
|
|
||||||
{"interface", INTERFACE},
|
|
||||||
{"interval", INTERVAL},
|
|
||||||
{"ip", IP},
|
|
||||||
{"label", LABEL},
|
|
||||||
{"lean_query", LEAN_QUERY},
|
|
||||||
{"ping_ip", PING_IP},
|
|
||||||
{"ping_timeout", PING_TIMEOUT},
|
|
||||||
{"policy", POLICY},
|
|
||||||
{"port", PORT},
|
|
||||||
{"preset", PRESET},
|
|
||||||
{"proxy_only", PROXY_ONLY},
|
|
||||||
{"purge_cache", PURGE_CACHE},
|
|
||||||
{"query_test_name", QUERY_TEST_NAME},
|
|
||||||
{"randomize_servers", RANDOMIZE_SERVERS},
|
|
||||||
{"reject", REJECTLIST},
|
|
||||||
{"reject_policy", REJECTPOLICY},
|
|
||||||
{"reject_recursively", REJECTRECURSIVELY},
|
|
||||||
{"root_server", ROOT_SERVER},
|
|
||||||
{"scheme", SCHEME},
|
|
||||||
{"timeout", TIMEOUT},
|
|
||||||
{"uptest", UPTEST},
|
|
||||||
{"uptest_cmd", UPTEST_CMD}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Table for looking up rr options. Order alphabetically! */
|
|
||||||
static const namevalue_t rr_options[]= {
|
|
||||||
{"a", A},
|
|
||||||
{"authrec", AUTHREC},
|
|
||||||
{"cname", CNAME},
|
|
||||||
{"mx", MX},
|
|
||||||
{"name", NAME},
|
|
||||||
{"ns", OWNER},
|
|
||||||
{"owner", OWNER},
|
|
||||||
{"ptr", PTR},
|
|
||||||
{"reverse", REVERSE},
|
|
||||||
{"soa", SOA},
|
|
||||||
{"spf", SPF},
|
|
||||||
{"ttl", TTL},
|
|
||||||
{"txt", TXT}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Table for looking up source options. Order alphabetically! */
|
|
||||||
static const namevalue_t source_options[]= {
|
|
||||||
{"authrec", AUTHREC},
|
|
||||||
{"file", FILET},
|
|
||||||
{"ns", OWNER},
|
|
||||||
{"owner", OWNER},
|
|
||||||
{"serve_aliases", SERVE_ALIASES},
|
|
||||||
{"ttl", TTL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Table for looking up include options. Order alphabetically! */
|
|
||||||
static const namevalue_t include_options[]= {
|
|
||||||
{"file", FILET}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Table for looking up neg options. Order alphabetically! */
|
|
||||||
static const namevalue_t neg_options[]= {
|
|
||||||
{"name", NAME},
|
|
||||||
{"ttl", TTL},
|
|
||||||
{"types", TYPES}
|
|
||||||
};
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,29 +0,0 @@
|
||||||
/* conf-parser.h - definitions for parser of pdnsd config files.
|
|
||||||
The parser was rewritten in C from scratch and doesn't require (f)lex
|
|
||||||
or yacc/bison.
|
|
||||||
|
|
||||||
Copyright (C) 2004,2008 Paul A. Rombouts.
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CONF_PARSER_H
|
|
||||||
#define CONF_PARSER_H
|
|
||||||
|
|
||||||
int confparse(FILE* in, char *prestr, globparm_t *global, servparm_array *servers, int includedepth, char **errstr);
|
|
||||||
|
|
||||||
#endif /* CONF_PARSER_H */
|
|
|
@ -1,544 +0,0 @@
|
||||||
/* conff.c - Maintain configuration information
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
#include "conff.h"
|
|
||||||
#include "consts.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "conf-parser.h"
|
|
||||||
#include "servers.h"
|
|
||||||
#include "icmp.h"
|
|
||||||
|
|
||||||
|
|
||||||
globparm_t global={
|
|
||||||
perm_cache: 2048,
|
|
||||||
cache_dir: NULL,
|
|
||||||
pidfile: NULL,
|
|
||||||
port: 53,
|
|
||||||
a: PDNSD_A_INITIALIZER,
|
|
||||||
out_a: PDNSD_A_INITIALIZER,
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
ipv4_6_prefix: IN6ADDR_ANY_INIT,
|
|
||||||
#endif
|
|
||||||
max_ttl: 604800,
|
|
||||||
min_ttl: 120,
|
|
||||||
neg_ttl: 900,
|
|
||||||
neg_rrs_pol: C_DEFAULT,
|
|
||||||
neg_domain_pol: C_AUTH,
|
|
||||||
verbosity: VERBOSITY,
|
|
||||||
run_as: "",
|
|
||||||
daemon: 0,
|
|
||||||
debug: 0,
|
|
||||||
stat_pipe: 0,
|
|
||||||
notcp: 0,
|
|
||||||
strict_suid: 1,
|
|
||||||
use_nss: 1,
|
|
||||||
paranoid: 0,
|
|
||||||
lndown_kluge: 0,
|
|
||||||
onquery: 0,
|
|
||||||
rnd_recs: 1,
|
|
||||||
ctl_perms: 0600,
|
|
||||||
scheme_file: NULL,
|
|
||||||
proc_limit: 40,
|
|
||||||
procq_limit: 60,
|
|
||||||
tcp_qtimeout: TCP_TIMEOUT,
|
|
||||||
timeout: 0,
|
|
||||||
par_queries: PAR_QUERIES,
|
|
||||||
query_method: M_PRESET,
|
|
||||||
query_port_start: 1024,
|
|
||||||
query_port_end: 65535,
|
|
||||||
udpbufsize: 1024,
|
|
||||||
deleg_only_zones: NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
servparm_t serv_presets={
|
|
||||||
port: 53,
|
|
||||||
uptest: C_NONE,
|
|
||||||
timeout: 120,
|
|
||||||
interval: 900,
|
|
||||||
ping_timeout: 600,
|
|
||||||
scheme: "",
|
|
||||||
uptest_cmd: NULL,
|
|
||||||
uptest_usr: "",
|
|
||||||
interface: "",
|
|
||||||
device: "",
|
|
||||||
query_test_name: NULL,
|
|
||||||
label: NULL,
|
|
||||||
purge_cache: 0,
|
|
||||||
nocache: 0,
|
|
||||||
lean_query: 1,
|
|
||||||
edns_query: 0,
|
|
||||||
is_proxy: 0,
|
|
||||||
rootserver: 0,
|
|
||||||
rand_servers: 0,
|
|
||||||
preset: 1,
|
|
||||||
rejectrecursively: 0,
|
|
||||||
rejectpolicy: C_FAIL,
|
|
||||||
policy: C_INCLUDED,
|
|
||||||
alist: NULL,
|
|
||||||
atup_a: NULL,
|
|
||||||
reject_a4: NULL,
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
reject_a6: NULL,
|
|
||||||
#endif
|
|
||||||
ping_a: PDNSD_A_INITIALIZER
|
|
||||||
};
|
|
||||||
|
|
||||||
servparm_array servers=NULL;
|
|
||||||
|
|
||||||
static void free_zones(zone_array za);
|
|
||||||
static void free_server_data(servparm_array sa);
|
|
||||||
static int report_server_stat(int f,int i);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a configuration file, saving the results in a (separate) global section and servers array,
|
|
||||||
* and the cache.
|
|
||||||
*
|
|
||||||
* char *nm should contain the name of the file to read. If it is NULL, the name of the config file
|
|
||||||
* read during startup is used.
|
|
||||||
*
|
|
||||||
* globparm_t *global should point to a struct which will be used to store the data of the
|
|
||||||
* global section(s). If it is NULL, no global sections are allowed in the
|
|
||||||
* file.
|
|
||||||
*
|
|
||||||
* servparm_array *servers should point to a dynamic array which will be grown to store the data
|
|
||||||
* of the server sections. If it is NULL, no server sections are allowed
|
|
||||||
* in the file.
|
|
||||||
*
|
|
||||||
* char **errstr is used to return a possible error message.
|
|
||||||
* In case of failure, *errstr will refer to a newly allocated string.
|
|
||||||
*
|
|
||||||
* read_config_file returns 1 on success, 0 on failure.
|
|
||||||
*/
|
|
||||||
int read_config_file(const char *nm, globparm_t *global, servparm_array *servers, int includedepth, char **errstr)
|
|
||||||
{
|
|
||||||
int retval=0;
|
|
||||||
const char *conftype= (global?"config":"include");
|
|
||||||
FILE *in;
|
|
||||||
|
|
||||||
if (nm==NULL)
|
|
||||||
nm=conf_file;
|
|
||||||
|
|
||||||
if (!(in=fopen(nm,"r"))) {
|
|
||||||
if(asprintf(errstr,"Error: Could not open %s file %s: %s",conftype,nm,strerror(errno))<0)
|
|
||||||
*errstr=NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
retval=confparse(in,NULL,global,servers,includedepth,errstr);
|
|
||||||
close_file:
|
|
||||||
if(fclose(in) && retval) {
|
|
||||||
if(asprintf(errstr,"Error: Could not close %s file %s: %s",
|
|
||||||
conftype,nm,strerror(errno))<0)
|
|
||||||
*errstr=NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(retval && servers && !DA_NEL(*servers)) {
|
|
||||||
if(asprintf(errstr,"Error: no server sections defined in config file %s",nm)<0)
|
|
||||||
*errstr=NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Re-Read the configuration file.
|
|
||||||
* Return 1 on success, 0 on failure.
|
|
||||||
* In case of failure, the old configuration will be unchanged (although the cache may not) and
|
|
||||||
* **errstr will refer to a newly allocated string containing an error message.
|
|
||||||
*/
|
|
||||||
int reload_config_file(const char *nm, char **errstr)
|
|
||||||
{
|
|
||||||
globparm_t global_new;
|
|
||||||
servparm_array servers_new;
|
|
||||||
|
|
||||||
global_new=global;
|
|
||||||
global_new.cache_dir=NULL;
|
|
||||||
global_new.pidfile=NULL;
|
|
||||||
global_new.scheme_file=NULL;
|
|
||||||
global_new.deleg_only_zones=NULL;
|
|
||||||
global_new.onquery=0;
|
|
||||||
servers_new=NULL;
|
|
||||||
if(read_config_file(nm,&global_new,&servers_new,0,errstr)) {
|
|
||||||
if(global_new.cache_dir && strcmp(global_new.cache_dir,global.cache_dir)) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified cache_dir directory has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.pidfile && (!global.pidfile || strcmp(global_new.pidfile,global.pidfile))) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified pid_file has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.scheme_file && strcmp(global_new.scheme_file,global.scheme_file)) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified scheme_file has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.port!=global.port) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified server_port has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(!ADDR_EQUIV(&global_new.a,&global.a)) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified interface address (server_ip) has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
if(!IN6_ARE_ADDR_EQUAL(&global_new.ipv4_6_prefix,&global.ipv4_6_prefix)) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified ipv4_6_prefix has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if(strcmp(global_new.run_as,global.run_as)) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified run_as id has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.daemon!=global.daemon) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the daemon option has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.debug!=global.debug) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the debug option has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.stat_pipe!=global.stat_pipe) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the status_ctl option has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.notcp!=global.notcp) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the tcp_server option has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.strict_suid!=global.strict_suid) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the strict_setuid option has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(global_new.ctl_perms!=global.ctl_perms) {
|
|
||||||
*errstr=strdup("Cannot reload config file: the specified ctl_perms has changed.\n"
|
|
||||||
"Try restarting pdnsd instead.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
if(ping_isocket==-1
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
&& ping6_isocket==-1
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
int i,n=DA_NEL(servers_new);
|
|
||||||
for (i=0;i<n;++i) {
|
|
||||||
if (DA_INDEX(servers_new,i).uptest==C_PING) {
|
|
||||||
if(asprintf(errstr,"Cannot reload config file: the ping socket is not initialized"
|
|
||||||
" and the new config contains uptest=ping in server section %i.\n"
|
|
||||||
"Try restarting pdnsd instead.",i)<0)
|
|
||||||
*errstr=NULL;
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we need exclusive access to the server data to make the changes */
|
|
||||||
/* Wait at most 60 seconds to obtain a lock. */
|
|
||||||
if(!exclusive_lock_server_data(60)) {
|
|
||||||
*errstr=strdup("Cannot reload config file: Timed out while waiting for access to config data.");
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
free(global_new.cache_dir); global_new.cache_dir=global.cache_dir;
|
|
||||||
free(global_new.pidfile); global_new.pidfile=global.pidfile;
|
|
||||||
free(global_new.scheme_file); global_new.scheme_file=global.scheme_file;
|
|
||||||
free_zones(global.deleg_only_zones);
|
|
||||||
global=global_new;
|
|
||||||
|
|
||||||
free_server_data(servers);
|
|
||||||
servers=servers_new;
|
|
||||||
/* schedule a retest to check which servers are up,
|
|
||||||
and free the lock. */
|
|
||||||
exclusive_unlock_server_data(1);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup_return:
|
|
||||||
free(global_new.cache_dir);
|
|
||||||
free(global_new.pidfile);
|
|
||||||
free(global_new.scheme_file);
|
|
||||||
free_zones(global_new.deleg_only_zones);
|
|
||||||
free_server_data(servers_new);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_zone(void *ptr)
|
|
||||||
{
|
|
||||||
free(*((unsigned char **)ptr));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_zones(zone_array za)
|
|
||||||
{
|
|
||||||
int i,n=DA_NEL(za);
|
|
||||||
for(i=0;i<n;++i)
|
|
||||||
free(DA_INDEX(za,i));
|
|
||||||
|
|
||||||
da_free(za);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_slist_domain(void *ptr)
|
|
||||||
{
|
|
||||||
free(((slist_t *)ptr)->domain);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_slist_array(slist_array sla)
|
|
||||||
{
|
|
||||||
int j,m=DA_NEL(sla);
|
|
||||||
for(j=0;j<m;++j)
|
|
||||||
free(DA_INDEX(sla,j).domain);
|
|
||||||
da_free(sla);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_servparm(servparm_t *serv)
|
|
||||||
{
|
|
||||||
free(serv->uptest_cmd);
|
|
||||||
free(serv->query_test_name);
|
|
||||||
free(serv->label);
|
|
||||||
da_free(serv->atup_a);
|
|
||||||
free_slist_array(serv->alist);
|
|
||||||
da_free(serv->reject_a4);
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
da_free(serv->reject_a6);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_server_data(servparm_array sa)
|
|
||||||
{
|
|
||||||
int i,n=DA_NEL(sa);
|
|
||||||
for(i=0;i<n;++i)
|
|
||||||
free_servparm(&DA_INDEX(sa,i));
|
|
||||||
da_free(sa);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Report the current configuration to the file descriptor f (for the status fifo, see status.c) */
|
|
||||||
int report_conf_stat(int f)
|
|
||||||
{
|
|
||||||
int i,n,retval=0;
|
|
||||||
|
|
||||||
fsprintf_or_return(f,"\nConfiguration:\n==============\nGlobal:\n-------\n");
|
|
||||||
fsprintf_or_return(f,"\tCache size: %li kB\n",global.perm_cache);
|
|
||||||
fsprintf_or_return(f,"\tServer directory: %s\n",global.cache_dir);
|
|
||||||
fsprintf_or_return(f,"\tScheme file (for Linux pcmcia support): %s\n",global.scheme_file);
|
|
||||||
fsprintf_or_return(f,"\tServer port: %i\n",global.port);
|
|
||||||
{
|
|
||||||
char buf[ADDRSTR_MAXLEN];
|
|
||||||
fsprintf_or_return(f,"\tServer IP (%s=any available one): %s\n", SEL_IPVER("0.0.0.0","::"),
|
|
||||||
pdnsd_a2str(&global.a,buf,ADDRSTR_MAXLEN));
|
|
||||||
if(!is_inaddr_any(&global.out_a)) {
|
|
||||||
fsprintf_or_return(f,"\tIP bound to interface used for querying remote servers: %s\n",
|
|
||||||
pdnsd_a2str(&global.out_a,buf,ADDRSTR_MAXLEN));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
if(!run_ipv4) {
|
|
||||||
char buf[ADDRSTR_MAXLEN];
|
|
||||||
fsprintf_or_return(f,"\tIPv4 to IPv6 prefix: %s\n",inet_ntop(AF_INET6,&global.ipv4_6_prefix,buf,ADDRSTR_MAXLEN)?:"?.?.?.?");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fsprintf_or_return(f,"\tIgnore cache when link is down: %s\n",global.lndown_kluge?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tMaximum ttl: %li\n",(long)global.max_ttl);
|
|
||||||
fsprintf_or_return(f,"\tMinimum ttl: %li\n",(long)global.min_ttl);
|
|
||||||
fsprintf_or_return(f,"\tNegative ttl: %li\n",(long)global.neg_ttl);
|
|
||||||
fsprintf_or_return(f,"\tNegative RRS policy: %s\n",const_name(global.neg_rrs_pol));
|
|
||||||
fsprintf_or_return(f,"\tNegative domain policy: %s\n",const_name(global.neg_domain_pol));
|
|
||||||
fsprintf_or_return(f,"\tRun as: %s\n",global.run_as);
|
|
||||||
fsprintf_or_return(f,"\tStrict run as: %s\n",global.strict_suid?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tUse NSS: %s\n",global.use_nss?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tParanoid mode (cache pollution prevention): %s\n",global.paranoid?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tControl socket permissions (mode): %o\n",global.ctl_perms);
|
|
||||||
fsprintf_or_return(f,"\tMaximum parallel queries served: %i\n",global.proc_limit);
|
|
||||||
fsprintf_or_return(f,"\tMaximum queries queued for serving: %i\n",global.procq_limit);
|
|
||||||
fsprintf_or_return(f,"\tGlobal timeout setting: %li\n",(long)global.timeout);
|
|
||||||
fsprintf_or_return(f,"\tParallel queries increment: %i\n",global.par_queries);
|
|
||||||
fsprintf_or_return(f,"\tRandomize records in answer: %s\n",global.rnd_recs?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tQuery method: %s\n",const_name(global.query_method));
|
|
||||||
{
|
|
||||||
int query_port_start=global.query_port_start;
|
|
||||||
if(query_port_start==-1) {
|
|
||||||
fsprintf_or_return(f,"\tQuery port start: (let kernel choose)\n");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fsprintf_or_return(f,"\tQuery port start: %i\n",query_port_start);
|
|
||||||
fsprintf_or_return(f,"\tQuery port end: %i\n",global.query_port_end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifndef NO_TCP_SERVER
|
|
||||||
fsprintf_or_return(f,"\tTCP server thread: %s\n",global.notcp?"off":"on");
|
|
||||||
if(!global.notcp)
|
|
||||||
{fsprintf_or_return(f,"\tTCP query timeout: %li\n",(long)global.tcp_qtimeout);}
|
|
||||||
#endif
|
|
||||||
fsprintf_or_return(f,"\tMaximum udp buffer size: %i\n",global.udpbufsize);
|
|
||||||
|
|
||||||
lock_server_data();
|
|
||||||
{
|
|
||||||
int rv=fsprintf(f,"\tDelegation-only zones: ");
|
|
||||||
if(rv<0) {retval=rv; goto unlock_return;}
|
|
||||||
}
|
|
||||||
if(global.deleg_only_zones==NULL) {
|
|
||||||
int rv=fsprintf(f,"(none)\n");
|
|
||||||
if(rv<0) {retval=rv; goto unlock_return;}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int rv;
|
|
||||||
n=DA_NEL(global.deleg_only_zones);
|
|
||||||
for(i=0;i<n;++i) {
|
|
||||||
unsigned char buf[DNSNAMEBUFSIZE];
|
|
||||||
rv=fsprintf(f,i==0?"%s":", %s",
|
|
||||||
rhn2str(DA_INDEX(global.deleg_only_zones,i),buf,sizeof(buf)));
|
|
||||||
if(rv<0) {retval=rv; goto unlock_return;}
|
|
||||||
}
|
|
||||||
rv=fsprintf(f,"\n");
|
|
||||||
if(rv<0) {retval=rv; goto unlock_return;}
|
|
||||||
}
|
|
||||||
|
|
||||||
n=DA_NEL(servers);
|
|
||||||
for(i=0;i<n;++i) {
|
|
||||||
int rv=report_server_stat(f,i);
|
|
||||||
if(rv<0) {retval=rv; goto unlock_return;}
|
|
||||||
}
|
|
||||||
unlock_return:
|
|
||||||
unlock_server_data();
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
#define serv_has_rejectlist(s) ((s)->reject_a4!=NULL || (s)->reject_a6!=NULL)
|
|
||||||
#else
|
|
||||||
#define serv_has_rejectlist(s) ((s)->reject_a4!=NULL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Report the current status of server i to the file descriptor f.
|
|
||||||
Call with locks applied.
|
|
||||||
*/
|
|
||||||
static int report_server_stat(int f,int i)
|
|
||||||
{
|
|
||||||
servparm_t *st=&DA_INDEX(servers,i);
|
|
||||||
int j,m;
|
|
||||||
|
|
||||||
fsprintf_or_return(f,"Server %i:\n------\n",i);
|
|
||||||
fsprintf_or_return(f,"\tlabel: %s\n",st->label?st->label:"(none)");
|
|
||||||
m=DA_NEL(st->atup_a);
|
|
||||||
if(st->rootserver>1 && m)
|
|
||||||
fsprintf_or_return(f,"\tThe following name servers will be used for discovery of rootservers only:\n");
|
|
||||||
for(j=0;j<m;j++) {
|
|
||||||
atup_t *at=&DA_INDEX(st->atup_a,j);
|
|
||||||
{char buf[ADDRSTR_MAXLEN];
|
|
||||||
fsprintf_or_return(f,"\tip: %s\n",pdnsd_a2str(PDNSD_A2_TO_A(&at->a),buf,ADDRSTR_MAXLEN));}
|
|
||||||
fsprintf_or_return(f,"\tserver assumed available: %s\n",at->is_up?"yes":"no");
|
|
||||||
}
|
|
||||||
fsprintf_or_return(f,"\tport: %hu\n",st->port);
|
|
||||||
fsprintf_or_return(f,"\tuptest: %s\n",const_name(st->uptest));
|
|
||||||
fsprintf_or_return(f,"\ttimeout: %li\n",(long)st->timeout);
|
|
||||||
if(st->interval>0) {
|
|
||||||
fsprintf_or_return(f,"\tuptest interval: %li\n",(long)st->interval);
|
|
||||||
} else {
|
|
||||||
fsprintf_or_return(f,"\tuptest interval: %s\n",
|
|
||||||
st->interval==-1?"onquery":
|
|
||||||
st->interval==-2?"ontimeout":
|
|
||||||
"(never retest)");
|
|
||||||
}
|
|
||||||
fsprintf_or_return(f,"\tping timeout: %li\n",(long)st->ping_timeout);
|
|
||||||
{char buf[ADDRSTR_MAXLEN];
|
|
||||||
fsprintf_or_return(f,"\tping ip: %s\n",is_inaddr_any(&st->ping_a)?"(using server ip)":pdnsd_a2str(&st->ping_a,buf,ADDRSTR_MAXLEN));}
|
|
||||||
if(st->interface[0]) {
|
|
||||||
fsprintf_or_return(f,"\tinterface: %s\n",st->interface);
|
|
||||||
}
|
|
||||||
if(st->device[0]) {
|
|
||||||
fsprintf_or_return(f,"\tdevice (for special Linux ppp device support): %s\n",st->device);
|
|
||||||
}
|
|
||||||
if(st->uptest_cmd) {
|
|
||||||
fsprintf_or_return(f,"\tuptest command: %s\n",st->uptest_cmd);
|
|
||||||
fsprintf_or_return(f,"\tuptest user: %s\n",st->uptest_usr[0]?st->uptest_usr:"(process owner)");
|
|
||||||
}
|
|
||||||
if(st->query_test_name) {
|
|
||||||
unsigned char nmbuf[DNSNAMEBUFSIZE];
|
|
||||||
fsprintf_or_return(f,"\tname used in query uptest: %s\n",
|
|
||||||
rhn2str(st->query_test_name,nmbuf,sizeof(nmbuf)));
|
|
||||||
}
|
|
||||||
if (st->scheme[0]) {
|
|
||||||
fsprintf_or_return(f,"\tscheme: %s\n", st->scheme);
|
|
||||||
}
|
|
||||||
fsprintf_or_return(f,"\tforce cache purging: %s\n",st->purge_cache?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tserver is cached: %s\n",st->nocache?"off":"on");
|
|
||||||
fsprintf_or_return(f,"\tlean query: %s\n",st->lean_query?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tUse EDNS in outgoing queries: %s\n",st->edns_query?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tUse only proxy?: %s\n",st->is_proxy?"on":"off");
|
|
||||||
fsprintf_or_return(f,"\tAssumed root server: %s\n",st->rootserver?(st->rootserver==1?"yes":"discover"):"no");
|
|
||||||
fsprintf_or_return(f,"\tRandomize server query order: %s\n",st->rand_servers?"yes":"no");
|
|
||||||
fsprintf_or_return(f,"\tDefault policy: %s\n",const_name(st->policy));
|
|
||||||
fsprintf_or_return(f,"\tPolicies:%s\n", st->alist?"":" (none)");
|
|
||||||
for (j=0;j<DA_NEL(st->alist);++j) {
|
|
||||||
slist_t *sl=&DA_INDEX(st->alist,j);
|
|
||||||
unsigned char buf[DNSNAMEBUFSIZE];
|
|
||||||
fsprintf_or_return(f,"\t\t%s: %s%s\n",
|
|
||||||
sl->rule==C_INCLUDED?"include":"exclude",
|
|
||||||
sl->exact?"":".",
|
|
||||||
rhn2str(sl->domain,buf,sizeof(buf)));
|
|
||||||
}
|
|
||||||
if(serv_has_rejectlist(st)) {
|
|
||||||
fsprintf_or_return(f,"\tAddresses which should be rejected in replies:\n");
|
|
||||||
m=DA_NEL(st->reject_a4);
|
|
||||||
for (j=0;j<m;++j) {
|
|
||||||
addr4maskpair_t *am=&DA_INDEX(st->reject_a4,j);
|
|
||||||
char abuf[ADDRSTR_MAXLEN],mbuf[ADDRSTR_MAXLEN];
|
|
||||||
fsprintf_or_return(f,"\t\t%s/%s\n",inet_ntop(AF_INET,&am->a,abuf,sizeof(abuf)),
|
|
||||||
inet_ntop(AF_INET,&am->mask,mbuf,sizeof(mbuf)));
|
|
||||||
}
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
m=DA_NEL(st->reject_a6);
|
|
||||||
for (j=0;j<m;++j) {
|
|
||||||
addr6maskpair_t *am=&DA_INDEX(st->reject_a6,j);
|
|
||||||
char abuf[INET6_ADDRSTRLEN],mbuf[INET6_ADDRSTRLEN];
|
|
||||||
fsprintf_or_return(f,"\t\t%s/%s\n",inet_ntop(AF_INET6,&am->a,abuf,sizeof(abuf)),
|
|
||||||
inet_ntop(AF_INET6,&am->mask,mbuf,sizeof(mbuf)));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fsprintf_or_return(f,"\tReject policy: %s\n",const_name(st->rejectpolicy));
|
|
||||||
fsprintf_or_return(f,"\tReject recursively: %s\n",st->rejectrecursively?"yes":"no");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,190 +0,0 @@
|
||||||
/* conff.h - Definitions for configuration management.
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFF_H
|
|
||||||
#define CONFF_H
|
|
||||||
|
|
||||||
/* XXX should use the system defined ones. */
|
|
||||||
/* #define MAXPATH 1024 */
|
|
||||||
/* #define MAXIFNAME 31 */
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
#include "list.h"
|
|
||||||
|
|
||||||
/* From main.c */
|
|
||||||
#if DEBUG>0
|
|
||||||
extern short int debug_p;
|
|
||||||
#else
|
|
||||||
#define debug_p 0
|
|
||||||
#endif
|
|
||||||
extern short int stat_pipe;
|
|
||||||
extern pthread_t main_thrid;
|
|
||||||
extern uid_t init_uid;
|
|
||||||
extern char *conf_file;
|
|
||||||
|
|
||||||
/* ----------- */
|
|
||||||
|
|
||||||
typedef DYNAMIC_ARRAY(pdnsd_a) *addr_array;
|
|
||||||
typedef DYNAMIC_ARRAY(pdnsd_a2) *addr2_array;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
time_t i_ts;
|
|
||||||
char is_up;
|
|
||||||
pdnsd_a2 a;
|
|
||||||
} atup_t;
|
|
||||||
typedef DYNAMIC_ARRAY(atup_t) *atup_array;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char *domain;
|
|
||||||
short exact;
|
|
||||||
short rule;
|
|
||||||
} slist_t;
|
|
||||||
typedef DYNAMIC_ARRAY(slist_t) *slist_array;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct in_addr a,mask;
|
|
||||||
} addr4maskpair_t;
|
|
||||||
|
|
||||||
typedef DYNAMIC_ARRAY(addr4maskpair_t) *a4_array;
|
|
||||||
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
typedef struct {
|
|
||||||
struct in6_addr a,mask;
|
|
||||||
} addr6maskpair_t;
|
|
||||||
|
|
||||||
typedef DYNAMIC_ARRAY(addr6maskpair_t) *a6_array;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned short port;
|
|
||||||
short uptest;
|
|
||||||
time_t timeout;
|
|
||||||
time_t interval;
|
|
||||||
time_t ping_timeout;
|
|
||||||
char scheme[32];
|
|
||||||
char *uptest_cmd;
|
|
||||||
char uptest_usr[21];
|
|
||||||
char interface[IFNAMSIZ];
|
|
||||||
char device[IFNAMSIZ];
|
|
||||||
unsigned char *query_test_name;
|
|
||||||
char *label;
|
|
||||||
char purge_cache;
|
|
||||||
char nocache;
|
|
||||||
char lean_query;
|
|
||||||
char edns_query;
|
|
||||||
char is_proxy;
|
|
||||||
char rootserver;
|
|
||||||
char rand_servers;
|
|
||||||
char preset;
|
|
||||||
char rejectrecursively;
|
|
||||||
short rejectpolicy;
|
|
||||||
short policy;
|
|
||||||
slist_array alist;
|
|
||||||
atup_array atup_a;
|
|
||||||
a4_array reject_a4;
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
a6_array reject_a6;
|
|
||||||
#endif
|
|
||||||
pdnsd_a ping_a;
|
|
||||||
} servparm_t;
|
|
||||||
typedef DYNAMIC_ARRAY(servparm_t) *servparm_array;
|
|
||||||
|
|
||||||
typedef unsigned char *zone_t;
|
|
||||||
typedef DYNAMIC_ARRAY(zone_t) *zone_array;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long perm_cache;
|
|
||||||
char *cache_dir;
|
|
||||||
char *pidfile;
|
|
||||||
int port;
|
|
||||||
pdnsd_a a;
|
|
||||||
pdnsd_a out_a;
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
struct in6_addr ipv4_6_prefix;
|
|
||||||
#endif
|
|
||||||
time_t max_ttl;
|
|
||||||
time_t min_ttl;
|
|
||||||
time_t neg_ttl;
|
|
||||||
short neg_rrs_pol;
|
|
||||||
short neg_domain_pol;
|
|
||||||
short verbosity;
|
|
||||||
char run_as[21];
|
|
||||||
char daemon;
|
|
||||||
char debug;
|
|
||||||
char stat_pipe;
|
|
||||||
char notcp;
|
|
||||||
char strict_suid;
|
|
||||||
char use_nss;
|
|
||||||
char paranoid;
|
|
||||||
char lndown_kluge;
|
|
||||||
char onquery;
|
|
||||||
char rnd_recs;
|
|
||||||
int ctl_perms;
|
|
||||||
char *scheme_file;
|
|
||||||
int proc_limit;
|
|
||||||
int procq_limit;
|
|
||||||
time_t tcp_qtimeout;
|
|
||||||
time_t timeout;
|
|
||||||
int par_queries;
|
|
||||||
int query_method;
|
|
||||||
int query_port_start;
|
|
||||||
int query_port_end;
|
|
||||||
int udpbufsize;
|
|
||||||
zone_array deleg_only_zones;
|
|
||||||
} globparm_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
prefix,
|
|
||||||
#endif
|
|
||||||
pidfile,
|
|
||||||
verbosity,
|
|
||||||
pdnsduser,
|
|
||||||
daemon,
|
|
||||||
debug,
|
|
||||||
stat_pipe,
|
|
||||||
notcp,
|
|
||||||
query_method;
|
|
||||||
} cmdlineflags_t;
|
|
||||||
|
|
||||||
extern globparm_t global;
|
|
||||||
extern cmdlineflags_t cmdline;
|
|
||||||
extern servparm_t serv_presets;
|
|
||||||
|
|
||||||
extern servparm_array servers;
|
|
||||||
|
|
||||||
int read_config_file(const char *nm, globparm_t *global, servparm_array *servers, int includedepth, char **errstr);
|
|
||||||
int reload_config_file(const char *nm, char **errstr);
|
|
||||||
void free_zone(void *ptr);
|
|
||||||
void free_slist_domain(void *ptr);
|
|
||||||
void free_slist_array(slist_array sla);
|
|
||||||
void free_servparm(servparm_t *serv);
|
|
||||||
|
|
||||||
int report_conf_stat(int f);
|
|
||||||
#endif
|
|
|
@ -1,133 +0,0 @@
|
||||||
/* consts.c - Common config constants & handling
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2005, 2006, 2007, 2009 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "consts.h"
|
|
||||||
#include "rr_types.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Order alphabetically!! */
|
|
||||||
static const namevalue_t const_dic[]={
|
|
||||||
{"auth", C_AUTH},
|
|
||||||
{"default", C_DEFAULT},
|
|
||||||
{"dev", C_DEV},
|
|
||||||
{"diald", C_DIALD},
|
|
||||||
{"discover", C_DISCOVER},
|
|
||||||
{"domain", C_DOMAIN},
|
|
||||||
{"excluded", C_EXCLUDED},
|
|
||||||
{"exec", C_EXEC},
|
|
||||||
{"fail", C_FAIL},
|
|
||||||
{"false", C_OFF},
|
|
||||||
{"fqdn_only", C_FQDN_ONLY},
|
|
||||||
{"if", C_IF},
|
|
||||||
{"included", C_INCLUDED},
|
|
||||||
{"negate", C_NEGATE},
|
|
||||||
{"no", C_OFF},
|
|
||||||
{"none", C_NONE},
|
|
||||||
{"off", C_OFF},
|
|
||||||
{"on", C_ON},
|
|
||||||
{"onquery", C_ONQUERY},
|
|
||||||
{"ontimeout", C_ONTIMEOUT},
|
|
||||||
{"ping", C_PING},
|
|
||||||
{"query", C_QUERY},
|
|
||||||
{"simple_only", C_SIMPLE_ONLY},
|
|
||||||
{"tcp_only", TCP_ONLY},
|
|
||||||
{"tcp_udp", TCP_UDP},
|
|
||||||
{"true", C_ON},
|
|
||||||
{"udp_only", UDP_ONLY},
|
|
||||||
{"udp_tcp", UDP_TCP},
|
|
||||||
{"yes", C_ON}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Added by Paul Rombouts */
|
|
||||||
static const char *const const_names[]={
|
|
||||||
"error",
|
|
||||||
"on",
|
|
||||||
"off",
|
|
||||||
"default",
|
|
||||||
"discover",
|
|
||||||
"none",
|
|
||||||
"if",
|
|
||||||
"exec",
|
|
||||||
"ping",
|
|
||||||
"query",
|
|
||||||
"onquery",
|
|
||||||
"ontimeout",
|
|
||||||
"udp_only",
|
|
||||||
"tcp_only",
|
|
||||||
"tcp_udp",
|
|
||||||
"udp_tcp",
|
|
||||||
"dev",
|
|
||||||
"diald",
|
|
||||||
"included",
|
|
||||||
"excluded",
|
|
||||||
"simple_only",
|
|
||||||
"fqdn_only",
|
|
||||||
"auth",
|
|
||||||
"domain",
|
|
||||||
"fail",
|
|
||||||
"negate"
|
|
||||||
};
|
|
||||||
|
|
||||||
/* compare two strings.
|
|
||||||
The first one is given as pointer to a char array of length len (which
|
|
||||||
should not contain any null chars),
|
|
||||||
the second one as a pointer to a null terminated char array.
|
|
||||||
*/
|
|
||||||
inline static int keyncmp(const char *key1, int len, const char *key2)
|
|
||||||
{
|
|
||||||
int cmp=strncmp(key1,key2,len);
|
|
||||||
if(cmp) return cmp;
|
|
||||||
return -(int)((unsigned char)(key2[len]));
|
|
||||||
}
|
|
||||||
|
|
||||||
int binsearch_keyword(const char *name, int len, const namevalue_t dic[], int range)
|
|
||||||
{
|
|
||||||
int i=0,j=range;
|
|
||||||
|
|
||||||
while(i<j) {
|
|
||||||
int k=(i+j)/2;
|
|
||||||
int cmp=keyncmp(name,len,dic[k].name);
|
|
||||||
if(cmp<0)
|
|
||||||
j=k;
|
|
||||||
else if(cmp>0)
|
|
||||||
i=k+1;
|
|
||||||
else
|
|
||||||
return dic[k].val;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int lookup_const(const char *name, int len)
|
|
||||||
{
|
|
||||||
return binsearch_keyword(name,len,const_dic,sizeof(const_dic)/sizeof(namevalue_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Added by Paul Rombouts */
|
|
||||||
const char *const_name(int c)
|
|
||||||
{
|
|
||||||
return (c>=0 && c<sizeof(const_names)/sizeof(char *))? const_names[c] : "ILLEGAL!";
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
/* consts.h - Common config constants & handling
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2005, 2006, 2007, 2009 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONSTS_H
|
|
||||||
#define CONSTS_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#define C_RRTOFFS 64
|
|
||||||
|
|
||||||
enum {
|
|
||||||
C_ERR,
|
|
||||||
C_ON,
|
|
||||||
C_OFF,
|
|
||||||
C_DEFAULT,
|
|
||||||
C_DISCOVER,
|
|
||||||
C_NONE,
|
|
||||||
C_IF,
|
|
||||||
C_EXEC,
|
|
||||||
C_PING,
|
|
||||||
C_QUERY,
|
|
||||||
C_ONQUERY,
|
|
||||||
C_ONTIMEOUT,
|
|
||||||
UDP_ONLY,
|
|
||||||
TCP_ONLY,
|
|
||||||
TCP_UDP,
|
|
||||||
UDP_TCP,
|
|
||||||
C_DEV,
|
|
||||||
C_DIALD,
|
|
||||||
C_INCLUDED,
|
|
||||||
C_EXCLUDED,
|
|
||||||
C_SIMPLE_ONLY,
|
|
||||||
C_FQDN_ONLY,
|
|
||||||
C_AUTH,
|
|
||||||
C_DOMAIN,
|
|
||||||
C_FAIL,
|
|
||||||
C_NEGATE
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const char *name;
|
|
||||||
int val;
|
|
||||||
} namevalue_t;
|
|
||||||
|
|
||||||
int binsearch_keyword(const char *name, int len, const namevalue_t dic[], int range);
|
|
||||||
int lookup_const(const char *name, int len);
|
|
||||||
const char *const_name(int c); /* Added by Paul Rombouts */
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,64 +0,0 @@
|
||||||
/* debug.c - Various debugging facilities
|
|
||||||
* Copyright (C) 2001 Thomas Moestl
|
|
||||||
*
|
|
||||||
* This file is part of the pdnsd package.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
||||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is indeed very primitive (it does not track allocation failures
|
|
||||||
* and so on). It should be expanded some time.
|
|
||||||
*/
|
|
||||||
#ifdef ALLOC_DEBUG
|
|
||||||
void *DBGcalloc(size_t n, size_t sz, char *file, int line)
|
|
||||||
{
|
|
||||||
DEBUG_MSG("+ calloc, %s:%d\n", file, line);
|
|
||||||
return calloc(n, sz);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *DBGmalloc(size_t sz, char *file, int line)
|
|
||||||
{
|
|
||||||
DEBUG_MSG("+ malloc, %s:%d\n", file, line);
|
|
||||||
return malloc(sz);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *DBGrealloc(void *ptr, size_t sz, char *file, int line)
|
|
||||||
{
|
|
||||||
if (ptr == NULL && sz != 0)
|
|
||||||
DEBUG_MSG("+ realloc, %s:%d\n", file, line);
|
|
||||||
if (ptr != NULL && sz == 0)
|
|
||||||
DEBUG_MSG("- realloc(0), %s:%d\n", file, line);
|
|
||||||
return realloc(ptr, sz);
|
|
||||||
}
|
|
||||||
void DBGfree(void *ptr, char *file, int line)
|
|
||||||
{
|
|
||||||
DEBUG_MSG("- free, %s:%d\n", file, line);
|
|
||||||
free(ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,52 +0,0 @@
|
||||||
/* debug.h - Various debugging facilities
|
|
||||||
* Copyright (C) 2001 Thomas Moestl
|
|
||||||
*
|
|
||||||
* This file is part of the pdnsd package.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
||||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DEBUG_H
|
|
||||||
#define DEBUG_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A hand-rolled alloc debug factility, because most available libraries have
|
|
||||||
* problems with at least one thread implementation.
|
|
||||||
*/
|
|
||||||
#ifdef ALLOC_DEBUG
|
|
||||||
void *DBGcalloc(size_t n, size_t sz, char *file, int line);
|
|
||||||
void *DBGmalloc(size_t sz, char *file, int line);
|
|
||||||
void *DBGrealloc(void *ptr, size_t sz, char *file, int line);
|
|
||||||
void DBGfree(void *ptr, char *file, int line);
|
|
||||||
|
|
||||||
#define pdnsd_calloc(n,sz) DBGcalloc(n,sz,__FILE__,__LINE__)
|
|
||||||
#define pdnsd_malloc(sz) DBGmalloc(sz,__FILE__,__LINE__)
|
|
||||||
#define pdnsd_realloc(ptr,sz) DBGrealloc(ptr,sz,__FILE__,__LINE__)
|
|
||||||
#define pdnsd_free(ptr) DBGfree(ptr,__FILE__,__LINE__)
|
|
||||||
#else
|
|
||||||
#define pdnsd_calloc calloc
|
|
||||||
#define pdnsd_malloc malloc
|
|
||||||
#define pdnsd_realloc realloc
|
|
||||||
#define pdnsd_free free
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* def DEBUG_H */
|
|
|
@ -1,617 +0,0 @@
|
||||||
/* dns.c - Declarations for dns handling and generic dns functions
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "error.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "dns.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Decompress a name record, taking the whole message as msg, returning its results in tgt
|
|
||||||
* (which should be able hold at least DNSNAMEBUFSIZE chars),
|
|
||||||
* taking sz as the remaining msg size (it is returned decremented by the name length, ready for further use) and
|
|
||||||
* a source pointer (it is returned pointing to the location after the name). msgsize is the size of the whole message,
|
|
||||||
* len is the total name length.
|
|
||||||
* msg and msgsz are needed for decompression (see rfc1035). The returned data is decompressed, but still in the
|
|
||||||
* rr name form (length byte - string of that length, terminated by a 0 length byte).
|
|
||||||
*
|
|
||||||
* Returned is a dns return code, with one exception: RC_TRUNC, as defined in dns.h, indicates that the message is
|
|
||||||
* truncated at the name (which needs a special return code, as it might or might not be fatal).
|
|
||||||
*/
|
|
||||||
int decompress_name(unsigned char *msg, size_t msgsz, unsigned char **src, size_t *sz, unsigned char *tgt, unsigned int *len)
|
|
||||||
{
|
|
||||||
unsigned int lb,offs;
|
|
||||||
unsigned int hops=0,tpos=0;
|
|
||||||
unsigned char *lptr=*src;
|
|
||||||
size_t oldsz=*sz;
|
|
||||||
size_t newsz=oldsz;
|
|
||||||
|
|
||||||
if (newsz==0)
|
|
||||||
goto name_outside_data;
|
|
||||||
if (lptr-msg>=msgsz)
|
|
||||||
goto name_outside_msg;
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
newsz--;
|
|
||||||
lb=*lptr++;
|
|
||||||
|
|
||||||
if(lb>0x3f) {
|
|
||||||
if (lb<0xc0) /* The two highest bits must be either 00 or 11 */
|
|
||||||
goto unsupported_lbl_bits;
|
|
||||||
if (newsz==0)
|
|
||||||
goto name_outside_data;
|
|
||||||
if (lptr-msg>=msgsz)
|
|
||||||
goto name_outside_msg;
|
|
||||||
newsz--;
|
|
||||||
offs=((lb&0x3f)<<8)|(*lptr);
|
|
||||||
if (offs>=msgsz)
|
|
||||||
goto offset_outside_msg;
|
|
||||||
lptr=msg+offs;
|
|
||||||
goto jumped;
|
|
||||||
}
|
|
||||||
tgt[tpos++]=lb;
|
|
||||||
if (lb==0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (newsz<=lb)
|
|
||||||
goto name_outside_data;
|
|
||||||
if (lptr+lb-msg>=msgsz)
|
|
||||||
goto name_outside_msg;
|
|
||||||
if (tpos+lb>DNSNAMEBUFSIZE-1) /* terminating null byte has to follow */
|
|
||||||
goto name_buf_full;
|
|
||||||
newsz -= lb;
|
|
||||||
do {
|
|
||||||
/* if (!*lptr || *lptr=='.')
|
|
||||||
return RC_FORMAT; */
|
|
||||||
tgt[tpos++]=*lptr++;
|
|
||||||
} while(--lb);
|
|
||||||
}
|
|
||||||
goto return_OK;
|
|
||||||
|
|
||||||
jumped:
|
|
||||||
++hops;
|
|
||||||
for(;;) {
|
|
||||||
lb=*lptr++;
|
|
||||||
|
|
||||||
while(lb>0x3f) {
|
|
||||||
if (lb<0xc0) /* The two highest bits must be either 00 or 11 */
|
|
||||||
goto unsupported_lbl_bits;
|
|
||||||
if (lptr-msg>=msgsz)
|
|
||||||
goto name_outside_msg;
|
|
||||||
if (++hops>255)
|
|
||||||
goto too_many_hops;
|
|
||||||
offs=((lb&0x3f)<<8)|(*lptr);
|
|
||||||
if (offs>=msgsz)
|
|
||||||
goto offset_outside_msg;
|
|
||||||
lptr=msg+offs;
|
|
||||||
lb=*lptr++;
|
|
||||||
}
|
|
||||||
tgt[tpos++]=lb;
|
|
||||||
if (lb==0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (lptr+lb-msg>=msgsz)
|
|
||||||
goto name_outside_msg;
|
|
||||||
if(tpos+lb>DNSNAMEBUFSIZE-1) /* terminating null byte has to follow */
|
|
||||||
goto name_buf_full;
|
|
||||||
do {
|
|
||||||
/* if (!*lptr || *lptr=='.')
|
|
||||||
return RC_FORMAT; */
|
|
||||||
tgt[tpos++]=*lptr++;
|
|
||||||
} while(--lb);
|
|
||||||
}
|
|
||||||
return_OK:
|
|
||||||
*src += oldsz-newsz;
|
|
||||||
*sz = newsz;
|
|
||||||
if(len) *len=tpos;
|
|
||||||
return RC_OK;
|
|
||||||
|
|
||||||
name_outside_data:
|
|
||||||
DEBUG_MSG("decompress_name: compressed name extends outside data field.\n");
|
|
||||||
return RC_TRUNC;
|
|
||||||
|
|
||||||
name_outside_msg:
|
|
||||||
DEBUG_MSG("decompress_name: compressed name extends outside message.\n");
|
|
||||||
return RC_FORMAT;
|
|
||||||
|
|
||||||
unsupported_lbl_bits:
|
|
||||||
DEBUG_MSG(lb==0x41?"decompress_name: Bit-string labels not supported.\n":
|
|
||||||
"decompress_name: unsupported label type.\n");
|
|
||||||
return RC_FORMAT;
|
|
||||||
|
|
||||||
offset_outside_msg:
|
|
||||||
DEBUG_MSG("decompress_name: offset points outside message.\n");
|
|
||||||
return RC_FORMAT;
|
|
||||||
|
|
||||||
name_buf_full:
|
|
||||||
DEBUG_MSG("decompress_name: decompressed name larger than %u bytes.\n", DNSNAMEBUFSIZE);
|
|
||||||
return RC_FORMAT;
|
|
||||||
|
|
||||||
too_many_hops:
|
|
||||||
DEBUG_MSG("decompress_name: too many offsets in compressed name.\n");
|
|
||||||
return RC_FORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Compare two names (ordinary C-strings) back-to-forth and return the longest match.
|
|
||||||
The comparison is done at name granularity.
|
|
||||||
The return value is the length of the match in name elements.
|
|
||||||
*os (*od) is set to the offset in the domain name ms (md) of the match.
|
|
||||||
*/
|
|
||||||
int domain_name_match(const unsigned char *ms, const unsigned char *md, int *os, int *od)
|
|
||||||
{
|
|
||||||
int i,j,k=0,offs,offd;
|
|
||||||
|
|
||||||
offs=i=strlen(ms); offd=j=strlen(md);
|
|
||||||
if(i && ms[i-1]=='.') --offs;
|
|
||||||
if(j && md[j-1]=='.') --offd;
|
|
||||||
|
|
||||||
if(i==0 || (i==1 && *ms=='.') || j==0 || (j==1 && *md=='.'))
|
|
||||||
/* Special case: root domain */
|
|
||||||
;
|
|
||||||
else {
|
|
||||||
--i; if(ms[i]=='.') --i;
|
|
||||||
--j; if(md[j]=='.') --j;
|
|
||||||
while(tolower(ms[i]) == tolower(md[j])) {
|
|
||||||
if(ms[i]=='.') {
|
|
||||||
++k;
|
|
||||||
offs=i+1; offd=j+1;
|
|
||||||
}
|
|
||||||
if(i==0 || j==0) {
|
|
||||||
if((i==0 || ms[i-1]=='.') && (j==0 || md[j-1]=='.')) {
|
|
||||||
++k;
|
|
||||||
offs=i; offd=j;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--i; --j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(os) *os=offs;
|
|
||||||
if(od) *od=offd;
|
|
||||||
return k;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Compare the names (in length byte-string notation) back-to-forth and return the longest match.
|
|
||||||
The comparison is done at name granularity.
|
|
||||||
The return value is the length of the match in name elements.
|
|
||||||
*os (*od) is set to the offset in the domain name ms (md) of the match.
|
|
||||||
*/
|
|
||||||
unsigned int domain_match(const unsigned char *ms, const unsigned char *md, unsigned int *os, unsigned int *od)
|
|
||||||
{
|
|
||||||
unsigned int i,j,k,n,ns=0,nd=0,offs,offd;
|
|
||||||
unsigned char lb,ls[128],ld[128];
|
|
||||||
|
|
||||||
/* first collect all length bytes */
|
|
||||||
i=0;
|
|
||||||
while((lb=ms[i])) {
|
|
||||||
PDNSD_ASSERT(ns<128, "domain_match: too many name segments");
|
|
||||||
ls[ns++]=lb;
|
|
||||||
i += ((unsigned)lb)+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
j=0;
|
|
||||||
while((lb=md[j])) {
|
|
||||||
PDNSD_ASSERT(nd<128, "domain_match: too many name segments");
|
|
||||||
ld[nd++]=lb;
|
|
||||||
j += ((unsigned)lb)+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
n=ns; if(n>nd) n=nd;
|
|
||||||
|
|
||||||
for(k=1; offs=i,offd=j,k<=n; ++k) {
|
|
||||||
lb=ls[ns-k];
|
|
||||||
if(lb!=ld[nd-k]) goto mismatch;
|
|
||||||
for(;lb;--lb)
|
|
||||||
if(tolower(ms[--i]) != tolower(md[--j])) goto mismatch;
|
|
||||||
--i; --j;
|
|
||||||
}
|
|
||||||
mismatch:
|
|
||||||
|
|
||||||
if(os) *os=offs;
|
|
||||||
if(od) *od=offd;
|
|
||||||
return k-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* compress the domain name in in and put the result (of maximum length of rhnlen(in)) and
|
|
||||||
* fill cb with compression information for further strings.*cb may be NULL initially.
|
|
||||||
* offs is the offset the generated string will be placed in the packet.
|
|
||||||
* retval: 0 - error, otherwise length
|
|
||||||
* When done, just free() cb (if it is NULL, free will behave correctly).
|
|
||||||
* It is guaranteed (and insured by assertions) that the output is smaller or equal in
|
|
||||||
* size to the input.
|
|
||||||
*/
|
|
||||||
unsigned int compress_name(unsigned char *in, unsigned char *out, unsigned int offs, dlist *cb)
|
|
||||||
{
|
|
||||||
compel_t *ci;
|
|
||||||
unsigned int longest=0,lrem=0,coffs=0;
|
|
||||||
unsigned int rl=0;
|
|
||||||
unsigned ilen = rhnlen(in);
|
|
||||||
unsigned short add=1;
|
|
||||||
|
|
||||||
PDNSD_ASSERT(ilen<=DNSNAMEBUFSIZE, "compress_name: name too long");
|
|
||||||
|
|
||||||
/* part 1: compression */
|
|
||||||
for (ci=dlist_first(*cb); ci; ci=dlist_next(ci)) {
|
|
||||||
unsigned int rv,rem,to;
|
|
||||||
if ((rv=domain_match(in, ci->s, &rem,&to))>longest) {
|
|
||||||
/*
|
|
||||||
* This has some not obvious implications that should be noted: If a
|
|
||||||
* domain name as saved in the list has been compressed, we only can
|
|
||||||
* index the non-compressed part. We rely here that the first occurence
|
|
||||||
* can't be compressed. So we take the first occurence of a given length.
|
|
||||||
* This works perfectly, but watch it if you change something.
|
|
||||||
*/
|
|
||||||
unsigned int newoffs= ci->index + to;
|
|
||||||
/* Only use if the offset is not too large. */
|
|
||||||
if(newoffs<=0x3fff) {
|
|
||||||
longest=rv;
|
|
||||||
lrem=rem;
|
|
||||||
coffs= newoffs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (longest>0) {
|
|
||||||
PDNSD_ASSERT(lrem+2 <= ilen, "compress_name: length increased");
|
|
||||||
memcpy(out, in,lrem);
|
|
||||||
out[lrem]=0xc0|((coffs&0x3f00)>>8);
|
|
||||||
out[lrem+1]=coffs&0xff;
|
|
||||||
rl=lrem+2;
|
|
||||||
add= lrem!=0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(out,in,ilen);
|
|
||||||
rl=ilen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* part 2: addition to the cache structure */
|
|
||||||
if (add) {
|
|
||||||
if (!(*cb=dlist_grow(*cb,sizeof(compel_t)+ilen)))
|
|
||||||
return 0;
|
|
||||||
ci=dlist_last(*cb);
|
|
||||||
ci->index=offs;
|
|
||||||
memcpy(ci->s,in,ilen);
|
|
||||||
}
|
|
||||||
return rl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert a numeric IP address into a domain name representation
|
|
||||||
(C string) suitable for PTR records.
|
|
||||||
buf is assumed to be at least DNSNAMEBUFSIZE bytes in size.
|
|
||||||
*/
|
|
||||||
int a2ptrstr(pdnsd_ca *a, int tp, unsigned char *buf)
|
|
||||||
{
|
|
||||||
if(tp==T_A) {
|
|
||||||
unsigned char *p=(unsigned char *)&a->ipv4.s_addr;
|
|
||||||
int n=snprintf(charp buf,DNSNAMEBUFSIZE,"%u.%u.%u.%u.in-addr.arpa.",p[3],p[2],p[1],p[0]);
|
|
||||||
if(n<0 || n>=DNSNAMEBUFSIZE)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
if(tp==T_AAAA) {
|
|
||||||
unsigned char *p=(unsigned char *)&a->ipv6;
|
|
||||||
int i,offs=0;
|
|
||||||
for (i=15;i>=0;--i) {
|
|
||||||
unsigned char bt=p[i];
|
|
||||||
int n=snprintf(charp(buf+offs), DNSNAMEBUFSIZE-offs,"%x.%x.",bt&0xf,(bt>>4)&0xf);
|
|
||||||
if(n<0) return 0;
|
|
||||||
offs+=n;
|
|
||||||
if(offs>=DNSNAMEBUFSIZE) return 0;
|
|
||||||
}
|
|
||||||
if(!strncp(charp(buf+offs),"ip6.arpa.",DNSNAMEBUFSIZE-offs))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add records for a host as read from a hosts-style file.
|
|
||||||
* Returns 1 on success, 0 in an out of memory condition, and -1 when there was a problem with
|
|
||||||
* the record data.
|
|
||||||
*/
|
|
||||||
static int add_host(unsigned char *pn, unsigned char *rns, pdnsd_ca *a, int tp, int a_sz, time_t ttl, unsigned flags, int reverse)
|
|
||||||
{
|
|
||||||
dns_cent_t ce;
|
|
||||||
|
|
||||||
if (!init_cent(&ce, pn, 0, 0, flags DBG0))
|
|
||||||
return 0;
|
|
||||||
if (!add_cent_rr(&ce,tp,ttl,0,CF_LOCAL,a_sz,a DBG0))
|
|
||||||
goto free_cent_return0;
|
|
||||||
if (!add_cent_rr(&ce,T_NS,ttl,0,CF_LOCAL,rhnlen(rns),rns DBG0))
|
|
||||||
goto free_cent_return0;
|
|
||||||
add_cache(&ce);
|
|
||||||
free_cent(&ce DBG0);
|
|
||||||
if (reverse) {
|
|
||||||
unsigned char b2[DNSNAMEBUFSIZE],rhn[DNSNAMEBUFSIZE];
|
|
||||||
if(!a2ptrstr(a,tp,b2))
|
|
||||||
return -1;
|
|
||||||
if (!str2rhn(b2,rhn))
|
|
||||||
return -1;
|
|
||||||
if (!init_cent(&ce, rhn, 0, 0, flags DBG0))
|
|
||||||
return 0;
|
|
||||||
if (!add_cent_rr(&ce,T_PTR,ttl,0,CF_LOCAL,rhnlen(pn),pn DBG0))
|
|
||||||
goto free_cent_return0;
|
|
||||||
if (!add_cent_rr(&ce,T_NS,ttl,0,CF_LOCAL,rhnlen(rns),rns DBG0))
|
|
||||||
goto free_cent_return0;
|
|
||||||
add_cache(&ce);
|
|
||||||
free_cent(&ce DBG0);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
free_cent_return0:
|
|
||||||
free_cent(&ce DBG0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a file in /etc/hosts-format and add generate rrs for it.
|
|
||||||
* Errors are largely ignored so that we can skip entries we do not understand
|
|
||||||
* (but others possibly do).
|
|
||||||
*/
|
|
||||||
int read_hosts(const char *fn, unsigned char *rns, time_t ttl, unsigned flags, int aliases, char **errstr)
|
|
||||||
{
|
|
||||||
int rv=0;
|
|
||||||
FILE *f;
|
|
||||||
char *buf;
|
|
||||||
size_t buflen=256;
|
|
||||||
|
|
||||||
if (!(f=fopen(fn,"r"))) {
|
|
||||||
if(asprintf(errstr, "Failed to source %s: %s", fn, strerror(errno))<0) *errstr=NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
buf=malloc(buflen);
|
|
||||||
if(!buf) {
|
|
||||||
*errstr=NULL;
|
|
||||||
goto fclose_return;
|
|
||||||
}
|
|
||||||
while(getline(&buf,&buflen,f)>=0) {
|
|
||||||
unsigned int len;
|
|
||||||
unsigned char *p,*pn,*pi;
|
|
||||||
unsigned char rhn[DNSNAMEBUFSIZE];
|
|
||||||
int tp,sz;
|
|
||||||
pdnsd_ca a;
|
|
||||||
|
|
||||||
p= ucharp strchr(buf,'#');
|
|
||||||
if(p) *p=0;
|
|
||||||
p= ucharp buf;
|
|
||||||
for(;;) {
|
|
||||||
if(!*p) goto nextline;
|
|
||||||
if(!isspace(*p)) break;
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
pi=p;
|
|
||||||
do {
|
|
||||||
if(!*++p) goto nextline;
|
|
||||||
} while(!isspace(*p));
|
|
||||||
*p=0;
|
|
||||||
do {
|
|
||||||
if(!*++p) goto nextline;
|
|
||||||
} while (isspace(*p));
|
|
||||||
pn=p;
|
|
||||||
do {
|
|
||||||
++p;
|
|
||||||
} while(*p && !isspace(*p));
|
|
||||||
len=p-pn;
|
|
||||||
if (parsestr2rhn(pn,len,rhn)!=NULL)
|
|
||||||
continue;
|
|
||||||
if (inet_aton(charp pi,&a.ipv4)) {
|
|
||||||
tp=T_A;
|
|
||||||
sz=sizeof(struct in_addr);
|
|
||||||
} else {
|
|
||||||
#if ALLOW_LOCAL_AAAA /* We don't read them otherwise, as the C library may not be able to to that.*/
|
|
||||||
if (inet_pton(AF_INET6,charp pi,&a.ipv6)>0) {
|
|
||||||
tp=T_AAAA;
|
|
||||||
sz=sizeof(struct in6_addr);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int res=add_host(rhn, rns, &a, tp,sz, ttl, flags, 1);
|
|
||||||
if(res==0) {
|
|
||||||
*errstr= NULL;
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
else if(res<0)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(aliases) {
|
|
||||||
for(;;) {
|
|
||||||
for(;;) {
|
|
||||||
if(!*p) goto nextline;
|
|
||||||
if(!isspace(*p)) break;
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
pn=p;
|
|
||||||
do {
|
|
||||||
++p;
|
|
||||||
} while(*p && !isspace(*p));
|
|
||||||
len=p-pn;
|
|
||||||
if (parsestr2rhn(pn,len,rhn)!=NULL)
|
|
||||||
break;
|
|
||||||
if (add_host(rhn, rns, &a, tp,sz, ttl, flags, 0) == 0) {
|
|
||||||
*errstr= NULL;
|
|
||||||
goto cleanup_return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nextline:;
|
|
||||||
}
|
|
||||||
if (feof(f))
|
|
||||||
rv=1;
|
|
||||||
else if(asprintf(errstr, "Failed to source %s: %s", fn, strerror(errno))<0) *errstr=NULL;
|
|
||||||
cleanup_return:
|
|
||||||
free(buf);
|
|
||||||
fclose_return:
|
|
||||||
fclose(f);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Get the name of an RR type given its value. */
|
|
||||||
const char *getrrtpname(int tp)
|
|
||||||
{
|
|
||||||
return tp>=T_MIN && tp<=T_MAX? rrnames[tp-T_MIN]: "[unknown]";
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG>0
|
|
||||||
/*
|
|
||||||
* Const decoders for debugging display
|
|
||||||
*/
|
|
||||||
static const char *const c_names[C_NUM] = {"IN","CS","CH","HS"};
|
|
||||||
static const char *const qt_names[QT_NUM]={"IXFR","AXFR","MAILB","MAILA","*"};
|
|
||||||
|
|
||||||
const char *get_cname(int id)
|
|
||||||
{
|
|
||||||
if (id>=C_MIN && id<=C_MAX)
|
|
||||||
return c_names[id-C_MIN];
|
|
||||||
if (id==QC_ALL)
|
|
||||||
return "*";
|
|
||||||
return "[unknown]";
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *get_tname(int id)
|
|
||||||
{
|
|
||||||
if (id>=T_MIN && id<=T_MAX)
|
|
||||||
return rrnames[id-T_MIN];
|
|
||||||
else if (id>=QT_MIN && id<=QT_MAX)
|
|
||||||
return qt_names[id-QT_MIN];
|
|
||||||
return "[unknown]";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define NRC 17
|
|
||||||
static const char *const e_names[NRC]={
|
|
||||||
"no error",
|
|
||||||
"query format error",
|
|
||||||
"server failed",
|
|
||||||
"non-existent domain",
|
|
||||||
"not supported",
|
|
||||||
"query refused",
|
|
||||||
"name exists when it should not",
|
|
||||||
"RR set exists when it should not",
|
|
||||||
"RR set that should exist does not",
|
|
||||||
"server not authoritative for zone",
|
|
||||||
"name not contained in zone",
|
|
||||||
"11",
|
|
||||||
"12",
|
|
||||||
"13",
|
|
||||||
"14",
|
|
||||||
"15",
|
|
||||||
"bad OPT version"
|
|
||||||
};
|
|
||||||
|
|
||||||
const char *get_ename(int id)
|
|
||||||
{
|
|
||||||
if (id>=0 && id<NRC)
|
|
||||||
return e_names[id];
|
|
||||||
return "[unknown]";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Construct a human-readable string listing the flags that are set
|
|
||||||
in a dns header. buf must have a size of at least DNSFLAGSMAXSTRSIZE.
|
|
||||||
Used for debugging purposes only.
|
|
||||||
*/
|
|
||||||
char *dnsflags2str(dns_hdr_t *hdr, char *buf)
|
|
||||||
{
|
|
||||||
char *p= buf;
|
|
||||||
|
|
||||||
if (hdr->aa)
|
|
||||||
p=mempcpy(p, " AA", 3);
|
|
||||||
if (hdr->tc)
|
|
||||||
p=mempcpy(p, " TC", 3);
|
|
||||||
if (hdr->rd)
|
|
||||||
p=mempcpy(p, " RD", 3);
|
|
||||||
if (hdr->ra)
|
|
||||||
p=mempcpy(p, " RA", 3);
|
|
||||||
if (hdr->z)
|
|
||||||
p=mempcpy(p, " Z", 2);
|
|
||||||
if (hdr->ad)
|
|
||||||
p=mempcpy(p, " AD", 3);
|
|
||||||
if (hdr->cd)
|
|
||||||
p=mempcpy(p, " CD", 3);
|
|
||||||
*p=0;
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if DEBUG>=9
|
|
||||||
/* Based on debug code contributed by Kiyo Kelvin Lee. */
|
|
||||||
|
|
||||||
void debug_dump_dns_msg(void *data, size_t len)
|
|
||||||
{
|
|
||||||
unsigned char *udata = (unsigned char *)data;
|
|
||||||
# define dmpchksz 16
|
|
||||||
char buf[dmpchksz*4+2];
|
|
||||||
size_t i, j, k, l;
|
|
||||||
|
|
||||||
DEBUG_MSG("pointer=%p len=%lu\n", udata, (unsigned long)len);
|
|
||||||
|
|
||||||
for (i = 0; i < len; i += dmpchksz) {
|
|
||||||
char *cp = buf;
|
|
||||||
k = l = i + dmpchksz;
|
|
||||||
if(k > len) k = len;
|
|
||||||
for (j = i; j < k; ++j) {
|
|
||||||
int n = sprintf(cp, "%02x ", udata[j]);
|
|
||||||
cp += n;
|
|
||||||
}
|
|
||||||
for (; j < l; ++j) {
|
|
||||||
*cp++ = ' ';
|
|
||||||
*cp++ = ' ';
|
|
||||||
*cp++ = ' ';
|
|
||||||
}
|
|
||||||
*cp++ = ' ';
|
|
||||||
for (j = i; j < k; ++j) {
|
|
||||||
*cp++ = isprint(udata[j]) ? udata[j] : '.';
|
|
||||||
}
|
|
||||||
PDNSD_ASSERT(cp < buf + sizeof(buf), "debug_dump_dns_msg: line buffer overflowed");
|
|
||||||
*cp = '\0';
|
|
||||||
DEBUG_MSG("%s\n", buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(len >= sizeof(dns_hdr_t)) {
|
|
||||||
dns_hdr_t *hdr = (dns_hdr_t *)data;
|
|
||||||
|
|
||||||
DEBUG_MSG(
|
|
||||||
"id=%04x qr=%x opcode=%x aa=%x tc=%x rd=%x "
|
|
||||||
"ra=%x z=%x ad=%x cd=%x rcode=%x\n",
|
|
||||||
ntohs(hdr->id), hdr->qr, hdr->opcode, hdr->aa, hdr->tc, hdr->rd,
|
|
||||||
hdr->ra, hdr->z, hdr->ad, hdr->cd, hdr->rcode);
|
|
||||||
DEBUG_MSG(
|
|
||||||
"qdcount=%04x ancount=%04x nscount=%04x arcount=%04x\n",
|
|
||||||
ntohs(hdr->qdcount), ntohs(hdr->ancount), ntohs(hdr->nscount), ntohs(hdr->arcount));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,309 +0,0 @@
|
||||||
/* dns.h - Declarations for dns handling and generic dns functions
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DNS_H
|
|
||||||
#define DNS_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include "rr_types.h"
|
|
||||||
#include "list.h"
|
|
||||||
#include "ipvers.h"
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_BSD)
|
|
||||||
# if !defined(__BIG_ENDIAN)
|
|
||||||
# if defined(BIG_ENDIAN)
|
|
||||||
# define __BIG_ENDIAN BIG_ENDIAN
|
|
||||||
# elif defined(_BIG_ENDIAN)
|
|
||||||
# define __BIG_ENDIAN _BIG_ENDIAN
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if !defined(__LITTLE_ENDIAN)
|
|
||||||
# if defined(LITTLE_ENDIAN)
|
|
||||||
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
|
||||||
# elif defined(_LITTLE_ENDIAN)
|
|
||||||
# define __LITTLE_ENDIAN _LITTLE_ENDIAN
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if !defined(__BYTE_ORDER)
|
|
||||||
# if defined(BYTE_ORDER)
|
|
||||||
# define __BYTE_ORDER BYTE_ORDER
|
|
||||||
# elif defined(_BYTE_ORDER)
|
|
||||||
# define __BYTE_ORDER _BYTE_ORDER
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Deal with byte orders */
|
|
||||||
#ifndef __BYTE_ORDER
|
|
||||||
# if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
|
|
||||||
# error Fuzzy endianness system! Both __LITTLE_ENDIAN and __BIG_ENDIAN have been defined!
|
|
||||||
# endif
|
|
||||||
# if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN)
|
|
||||||
# error Strange Endianness-less system! Neither __LITTLE_ENDIAN nor __BIG_ENDIAN has been defined!
|
|
||||||
# endif
|
|
||||||
# if defined(__LITTLE_ENDIAN)
|
|
||||||
# define __BYTE_ORDER __LITTLE_ENDIAN
|
|
||||||
# elif defined(__BIG_ENDIAN)
|
|
||||||
# define __BYTE_ORDER __BIG_ENDIAN
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* special rr type codes for queries */
|
|
||||||
#define QT_MIN 251
|
|
||||||
#define QT_IXFR 251
|
|
||||||
#define QT_AXFR 252
|
|
||||||
#define QT_MAILB 253
|
|
||||||
#define QT_MAILA 254
|
|
||||||
#define QT_ALL 255
|
|
||||||
#define QT_MAX 255
|
|
||||||
#define QT_NUM 5
|
|
||||||
|
|
||||||
/* rr classes */
|
|
||||||
#define C_MIN 1
|
|
||||||
#define C_IN 1
|
|
||||||
#define C_CS 2
|
|
||||||
#define C_CH 3
|
|
||||||
#define C_HS 4
|
|
||||||
#define C_MAX 4
|
|
||||||
#define C_NUM 4
|
|
||||||
|
|
||||||
/* special classes for queries */
|
|
||||||
#define QC_ALL 255
|
|
||||||
|
|
||||||
/* status codes */
|
|
||||||
#define RC_OK 0
|
|
||||||
#define RC_FORMAT 1
|
|
||||||
#define RC_SERVFAIL 2
|
|
||||||
#define RC_NAMEERR 3
|
|
||||||
#define RC_NOTSUPP 4
|
|
||||||
#define RC_REFUSED 5
|
|
||||||
#define RC_BADVERS 16
|
|
||||||
|
|
||||||
/*
|
|
||||||
* special internal retvals
|
|
||||||
*/
|
|
||||||
#define RC_NOTCACHED 0xfffa
|
|
||||||
#define RC_CACHED 0xfffb
|
|
||||||
#define RC_STALE 0xfffc
|
|
||||||
#define RC_TCPREFUSED 0xfffd
|
|
||||||
#define RC_TRUNC 0xfffe
|
|
||||||
#define RC_FATALERR 0xffff
|
|
||||||
|
|
||||||
/* query/response */
|
|
||||||
#define QR_QUERY 0
|
|
||||||
#define QR_RESP 1
|
|
||||||
|
|
||||||
/*opcodes */
|
|
||||||
#define OP_QUERY 0
|
|
||||||
#define OP_IQUERY 1
|
|
||||||
#define OP_STATUS 2
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef struct {
|
|
||||||
/* the name is the first field. It has variable length, so it can't be put in the struct */
|
|
||||||
uint16_t type;
|
|
||||||
uint16_t class;
|
|
||||||
uint32_t ttl;
|
|
||||||
uint16_t rdlength;
|
|
||||||
/* rdata follows */
|
|
||||||
} __attribute__((packed)) rr_hdr_t;
|
|
||||||
|
|
||||||
#define sizeof_rr_hdr_t (sizeof rr_hdr_t)
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* We will not actually use the rr_hdr_t type, only its size:
|
|
||||||
sizeof(rr_hdr_t) = 2 + 2 + 4 + 2 */
|
|
||||||
#define sizeof_rr_hdr_t 10
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define sizeof_opt_pseudo_rr (1+sizeof_rr_hdr_t)
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef struct {
|
|
||||||
/* The server name and maintainer mailbox are the first two fields. It has variable length, */
|
|
||||||
/* so they can't be put in the struct */
|
|
||||||
uint32_t serial;
|
|
||||||
uint32_t refresh;
|
|
||||||
uint32_t retry;
|
|
||||||
uint32_t expire;
|
|
||||||
uint32_t minimum;
|
|
||||||
} __attribute__((packed)) soa_r_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* char qname[];*/
|
|
||||||
uint16_t qtype;
|
|
||||||
uint16_t qclass;
|
|
||||||
} __attribute__((packed)) std_query_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t id;
|
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
|
||||||
unsigned int rd:1;
|
|
||||||
unsigned int tc:1;
|
|
||||||
unsigned int aa:1;
|
|
||||||
unsigned int opcode:4;
|
|
||||||
unsigned int qr:1;
|
|
||||||
unsigned int rcode:4;
|
|
||||||
unsigned int cd:1;
|
|
||||||
unsigned int ad:1;
|
|
||||||
unsigned int z :1;
|
|
||||||
unsigned int ra:1;
|
|
||||||
#elif __BYTE_ORDER == __BIG_ENDIAN
|
|
||||||
unsigned int qr:1;
|
|
||||||
unsigned int opcode:4;
|
|
||||||
unsigned int aa:1;
|
|
||||||
unsigned int tc:1;
|
|
||||||
unsigned int rd:1;
|
|
||||||
unsigned int ra:1;
|
|
||||||
unsigned int z :1;
|
|
||||||
unsigned int ad:1;
|
|
||||||
unsigned int cd:1;
|
|
||||||
unsigned int rcode:4;
|
|
||||||
#else
|
|
||||||
# error "Please define __BYTE_ORDER to be __LITTLE_ENDIAN or __BIG_ENDIAN"
|
|
||||||
#endif
|
|
||||||
uint16_t qdcount;
|
|
||||||
uint16_t ancount;
|
|
||||||
uint16_t nscount;
|
|
||||||
uint16_t arcount;
|
|
||||||
} __attribute__((packed)) dns_hdr_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* A structure that can also be used for DNS messages over TCP. */
|
|
||||||
typedef struct {
|
|
||||||
#ifndef NO_TCP_QUERIES
|
|
||||||
uint16_t len;
|
|
||||||
#endif
|
|
||||||
dns_hdr_t hdr;
|
|
||||||
} __attribute__((packed)) dns_msg_t;
|
|
||||||
|
|
||||||
#ifdef NO_TCP_QUERIES
|
|
||||||
# define dnsmsghdroffset 0
|
|
||||||
#else
|
|
||||||
# define dnsmsghdroffset 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Structure for storing EDNS (Extension mechanisms for DNS) information. */
|
|
||||||
typedef struct {
|
|
||||||
unsigned short udpsize;
|
|
||||||
unsigned short rcode;
|
|
||||||
unsigned short version;
|
|
||||||
unsigned char do_flg;
|
|
||||||
} edns_info_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* Macros to retrieve or store integer data that is not necessarily aligned.
|
|
||||||
Also takes care of network to host byte order.
|
|
||||||
The pointer cp is advanced and should be of type void* or char*.
|
|
||||||
These are actually adapted versions of the NS_GET16 and NS_GET32
|
|
||||||
macros in the arpa/nameser.h include file in the BIND 9 source.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define GETINT16(s,cp) do { \
|
|
||||||
register uint16_t t_s; \
|
|
||||||
register const unsigned char *t_cp = (const unsigned char *)(cp); \
|
|
||||||
t_s = (uint16_t)*t_cp++ << 8; \
|
|
||||||
t_s |= (uint16_t)*t_cp++; \
|
|
||||||
(s) = t_s; \
|
|
||||||
(cp) = (void *)t_cp; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define GETINT32(l,cp) do { \
|
|
||||||
register uint32_t t_l; \
|
|
||||||
register const unsigned char *t_cp = (const unsigned char *)(cp); \
|
|
||||||
t_l = (uint32_t)*t_cp++ << 24; \
|
|
||||||
t_l |= (uint32_t)*t_cp++ << 16; \
|
|
||||||
t_l |= (uint32_t)*t_cp++ << 8; \
|
|
||||||
t_l |= (uint32_t)*t_cp++; \
|
|
||||||
(l) = t_l; \
|
|
||||||
(cp) = (void *)t_cp; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define PUTINT16(s,cp) do { \
|
|
||||||
register uint16_t t_s = (uint16_t)(s); \
|
|
||||||
register unsigned char *t_cp = (unsigned char *)(cp); \
|
|
||||||
*t_cp++ = t_s >> 8; \
|
|
||||||
*t_cp++ = t_s; \
|
|
||||||
(cp) = (void *)t_cp; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define PUTINT32(l,cp) do { \
|
|
||||||
register uint32_t t_l = (uint32_t)(l); \
|
|
||||||
register unsigned char *t_cp = (unsigned char *)(cp); \
|
|
||||||
*t_cp++ = t_l >> 24; \
|
|
||||||
*t_cp++ = t_l >> 16; \
|
|
||||||
*t_cp++ = t_l >> 8; \
|
|
||||||
*t_cp++ = t_l; \
|
|
||||||
(cp) = (void *)t_cp; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
/* Size (number of bytes) of buffers used to hold domain names. */
|
|
||||||
#define DNSNAMEBUFSIZE 256
|
|
||||||
|
|
||||||
/* Recursion depth. */
|
|
||||||
#define MAX_HOPS 20
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Types for compression buffers.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
unsigned int index;
|
|
||||||
unsigned char s[0];
|
|
||||||
} compel_t;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int decompress_name(unsigned char *msg, size_t msgsz, unsigned char **src, size_t *sz, unsigned char *tgt, unsigned int *len);
|
|
||||||
/* int domain_name_match(const unsigned char *ms, const unsigned char *md, int *os, int *od); */
|
|
||||||
unsigned int domain_match(const unsigned char *ms, const unsigned char *md, unsigned int *os, unsigned int *od);
|
|
||||||
unsigned int compress_name(unsigned char *in, unsigned char *out, unsigned int offs, dlist *cb);
|
|
||||||
int a2ptrstr(pdnsd_ca *a, int tp, unsigned char *buf);
|
|
||||||
int read_hosts(const char *fn, unsigned char *rns, time_t ttl, unsigned flags, int aliases, char **errstr);
|
|
||||||
|
|
||||||
const char *getrrtpname(int tp);
|
|
||||||
#if DEBUG>0
|
|
||||||
const char *get_cname(int id);
|
|
||||||
const char *get_tname(int id);
|
|
||||||
const char *get_ename(int id);
|
|
||||||
#define DNSFLAGSMAXSTRSIZE (7*3+1)
|
|
||||||
char *dnsflags2str(dns_hdr_t *hdr, char *buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if DEBUG>=9
|
|
||||||
void debug_dump_dns_msg(void *data, size_t len);
|
|
||||||
#define DEBUG_DUMP_DNS_MSG(d,l) {if(debug_p && global.verbosity>=9) debug_dump_dns_msg(d,l);}
|
|
||||||
#else
|
|
||||||
#define DEBUG_DUMP_DNS_MSG(d,l)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,40 +0,0 @@
|
||||||
/* dns_answer.h - Receive and process icoming dns queries.
|
|
||||||
|
|
||||||
Copyright (C) 2000 Thomas Moestl
|
|
||||||
Copyright (C) 2005 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DNS_ANSWER_H
|
|
||||||
#define DNS_ANSWER_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
/* --- from main.c */
|
|
||||||
extern pthread_t main_thrid,servstat_thrid,statsock_thrid,tcps_thrid,udps_thrid;
|
|
||||||
extern volatile int tcp_socket;
|
|
||||||
extern volatile int udp_socket;
|
|
||||||
/* --- */
|
|
||||||
|
|
||||||
int init_udp_socket(void);
|
|
||||||
int init_tcp_socket(void);
|
|
||||||
void start_dns_servers(void);
|
|
||||||
int report_thread_stat(int f);
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,51 +0,0 @@
|
||||||
/* dns_query.h - Execute outgoing dns queries and write entries to cache
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2006, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DNS_QUERY_H
|
|
||||||
#define DNS_QUERY_H
|
|
||||||
|
|
||||||
#include "cache.h"
|
|
||||||
|
|
||||||
/* Default UDP buffer size (when EDNS is not used). */
|
|
||||||
#define UDP_BUFSIZE 512
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct qhintnode_s qhintnode_t;
|
|
||||||
|
|
||||||
/* --- parallel query */
|
|
||||||
int r_dns_cached_resolve(unsigned char *name, int thint, dns_cent_t **cachedp,
|
|
||||||
int hops, qhintnode_t *qhlist, time_t queryts,
|
|
||||||
unsigned char *c_soa);
|
|
||||||
#define dns_cached_resolve(name,thint,cachedp,hops,queryts,c_soa) \
|
|
||||||
r_dns_cached_resolve(name,thint,cachedp,hops,NULL,queryts,c_soa)
|
|
||||||
|
|
||||||
addr2_array dns_rootserver_resolv(atup_array atup_a, int port, char edns_query, time_t timeout);
|
|
||||||
int query_uptest(pdnsd_a *addr, int port, const unsigned char *name, time_t timeout, int rep);
|
|
||||||
|
|
||||||
/* --- from dns_answer.c */
|
|
||||||
int add_opt_pseudo_rr(dns_msg_t **ans, size_t *sz, size_t *allocsz,
|
|
||||||
unsigned short udpsize, unsigned short rcode,
|
|
||||||
unsigned short ednsver, unsigned short Zflags);
|
|
||||||
size_t remove_opt_pseudo_rr(dns_msg_t *ans, size_t sz);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,142 +0,0 @@
|
||||||
/* error.c - Error handling
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2004, 2005, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "error.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "conff.h"
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_t loglock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
volatile short int use_log_lock=0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize a mutex for io-locking in order not to produce gibberish on
|
|
||||||
* multiple simultaneous errors.
|
|
||||||
*/
|
|
||||||
/* This is now defined as an inline function in error.h */
|
|
||||||
#if 0
|
|
||||||
void init_log_lock(void)
|
|
||||||
{
|
|
||||||
use_log_lock=1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We crashed? Ooops... */
|
|
||||||
void crash_msg(char *msg)
|
|
||||||
{
|
|
||||||
log_error("%s", msg);
|
|
||||||
log_error("pdnsd probably crashed due to a bug. Please consider sending a bug");
|
|
||||||
log_error("report to p.a.rombouts@home.nl or tmoestl@gmx.net");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Log a warning, error or info message.
|
|
||||||
* If we are a daemon, use the syslog. s is a format string like in printf,
|
|
||||||
* the optional following arguments are the arguments like in printf */
|
|
||||||
void log_message(int prior, const char *s, ...)
|
|
||||||
{
|
|
||||||
int gotlock=0;
|
|
||||||
va_list va;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if (use_log_lock) {
|
|
||||||
gotlock=softlock_mutex(&loglock);
|
|
||||||
/* If we failed to get the lock and the type of the
|
|
||||||
message is "info" or less important, then don't bother. */
|
|
||||||
if(!gotlock && prior>=LOG_INFO)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (global.daemon) {
|
|
||||||
openlog("pdnsd",LOG_PID,LOG_DAEMON);
|
|
||||||
va_start(va,s);
|
|
||||||
vsyslog(prior,s,va);
|
|
||||||
va_end(va);
|
|
||||||
closelog();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
f=stderr;
|
|
||||||
#if DEBUG > 0
|
|
||||||
goto printtofile;
|
|
||||||
}
|
|
||||||
if(debug_p) {
|
|
||||||
f=dbg_file;
|
|
||||||
printtofile:
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char ts[sizeof "* 12/31 23:59:59| "];
|
|
||||||
time_t tt = time(NULL);
|
|
||||||
struct tm tm;
|
|
||||||
|
|
||||||
if(!localtime_r(&tt, &tm) || strftime(ts, sizeof(ts), "* %m/%d %T| ", &tm) <=0)
|
|
||||||
ts[0]=0;
|
|
||||||
fprintf(f,"%spdnsd: %s: ", ts,
|
|
||||||
prior<=LOG_CRIT?"critical":
|
|
||||||
prior==LOG_ERR?"error":
|
|
||||||
prior==LOG_WARNING?"warning":
|
|
||||||
"info");
|
|
||||||
}
|
|
||||||
va_start(va,s);
|
|
||||||
vfprintf(f,s,va);
|
|
||||||
va_end(va);
|
|
||||||
{
|
|
||||||
const char *p=strchr(s,0);
|
|
||||||
if(!p || p==s || *(p-1)!='\n')
|
|
||||||
fputc('\n',f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gotlock)
|
|
||||||
pthread_mutex_unlock(&loglock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if DEBUG > 0
|
|
||||||
/* XXX: The timestamp generation makes this a little heavy-weight */
|
|
||||||
void debug_msg(int c, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list va;
|
|
||||||
|
|
||||||
if (!c) {
|
|
||||||
char ts[sizeof "12/31 23:59:59"];
|
|
||||||
time_t tt = time(NULL);
|
|
||||||
struct tm tm;
|
|
||||||
unsigned *id;
|
|
||||||
|
|
||||||
if(localtime_r(&tt, &tm) && strftime(ts, sizeof(ts), "%m/%d %T", &tm) > 0) {
|
|
||||||
if((id = (unsigned *)pthread_getspecific(thrid_key)))
|
|
||||||
fprintf(dbg_file,"%u %s| ", *id, ts);
|
|
||||||
else
|
|
||||||
fprintf(dbg_file,"- %s| ", ts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
va_start(va,fmt);
|
|
||||||
vfprintf(dbg_file,fmt,va);
|
|
||||||
va_end(va);
|
|
||||||
fflush(dbg_file);
|
|
||||||
}
|
|
||||||
#endif /* DEBUG */
|
|
|
@ -1,115 +0,0 @@
|
||||||
/* error.h - Error handling
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2004, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ERROR_H
|
|
||||||
#define ERROR_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include "thread.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "pdnsd_assert.h"
|
|
||||||
|
|
||||||
/* --- from error.c */
|
|
||||||
extern volatile short int use_log_lock;
|
|
||||||
/* --- */
|
|
||||||
|
|
||||||
void crash_msg(char *msg);
|
|
||||||
|
|
||||||
inline static void init_log_lock(void) __attribute__((always_inline));
|
|
||||||
inline static void init_log_lock(void)
|
|
||||||
{
|
|
||||||
use_log_lock=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void log_message(int prior,const char *s, ...) printfunc(2, 3);
|
|
||||||
#if !defined(CPP_C99_VARIADIC_MACROS)
|
|
||||||
/* GNU C Macro Varargs style. */
|
|
||||||
#define log_error(args...) log_message(LOG_ERR,args)
|
|
||||||
#define log_warn(args...) log_message(LOG_WARNING,args)
|
|
||||||
#define log_info(level,args...) {if((level)<=global.verbosity) log_message(LOG_INFO,args);}
|
|
||||||
#else
|
|
||||||
/* ANSI C99 style. */
|
|
||||||
#define log_error(...) log_message(LOG_ERR,__VA_ARGS__)
|
|
||||||
#define log_warn(...) log_message(LOG_WARNING,__VA_ARGS__)
|
|
||||||
#define log_info(level,...) {if((level)<=global.verbosity) log_message(LOG_INFO,__VA_ARGS__);}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Following are some ugly macros for debug messages that
|
|
||||||
* should inhibit any code generation when DEBUG is not defined.
|
|
||||||
* Of course, those messages could be done in a function, but I
|
|
||||||
* want to save the overhead when DEBUG is not defined.
|
|
||||||
* debug_p needs to be defined (by including conff.h), or you
|
|
||||||
* will get strange errors.
|
|
||||||
* A macro call expands to a complete statement, so a semicolon after
|
|
||||||
* the macro call is redundant.
|
|
||||||
* The arguments are normal printfs, so you know how to use the args
|
|
||||||
*/
|
|
||||||
#if DEBUG>0
|
|
||||||
void debug_msg(int c, const char *fmt, ...) printfunc(2, 3);
|
|
||||||
/* from main.c */
|
|
||||||
extern FILE *dbg_file;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(CPP_C99_VARIADIC_MACROS)
|
|
||||||
/* GNU C Macro Varargs style. */
|
|
||||||
# if DEBUG > 0
|
|
||||||
# define DEBUG_MSG(args...) {if (debug_p) debug_msg(0,args);}
|
|
||||||
# define DEBUG_MSGC(args...) {if (debug_p) debug_msg(1,args);}
|
|
||||||
# define DEBUG_PDNSDA_MSG(args...) {char _debugsockabuf[ADDRSTR_MAXLEN]; DEBUG_MSG(args);}
|
|
||||||
# define PDNSDA2STR(a) pdnsd_a2str(a,_debugsockabuf,sizeof(_debugsockabuf))
|
|
||||||
# define DEBUG_RHN_MSG(args...) {unsigned char _debugstrbuf[DNSNAMEBUFSIZE]; DEBUG_MSG(args);}
|
|
||||||
# define RHN2STR(a) rhn2str(a,_debugstrbuf,sizeof(_debugstrbuf))
|
|
||||||
# else
|
|
||||||
# define DEBUG_MSG(args...)
|
|
||||||
# define DEBUG_MSGC(args...)
|
|
||||||
# define DEBUG_PDNSDA_MSG(args...)
|
|
||||||
# define DEBUG_RHN_MSG(args...)
|
|
||||||
# endif /* DEBUG > 0 */
|
|
||||||
#else
|
|
||||||
/* ANSI C99 style. */
|
|
||||||
# if DEBUG > 0
|
|
||||||
/*
|
|
||||||
* XXX: The ANSI and GCC variadic macros should be merged as far as possible, but that
|
|
||||||
* might make things even more messy...
|
|
||||||
*/
|
|
||||||
# define DEBUG_MSG(...) {if (debug_p) debug_msg(0,__VA_ARGS__);}
|
|
||||||
# define DEBUG_MSGC(...) {if (debug_p) debug_msg(1,__VA_ARGS__);}
|
|
||||||
# define DEBUG_PDNSDA_MSG(...) {char _debugsockabuf[ADDRSTR_MAXLEN]; DEBUG_MSG(__VA_ARGS__);}
|
|
||||||
# define PDNSDA2STR(a) pdnsd_a2str(a,_debugsockabuf,ADDRSTR_MAXLEN)
|
|
||||||
# define DEBUG_RHN_MSG(...) {unsigned char _debugstrbuf[DNSNAMEBUFSIZE]; DEBUG_MSG(__VA_ARGS__);}
|
|
||||||
# define RHN2STR(a) rhn2str(a,_debugstrbuf,sizeof(_debugstrbuf))
|
|
||||||
# else
|
|
||||||
# define DEBUG_MSG(...)
|
|
||||||
# define DEBUG_MSGC(...)
|
|
||||||
# define DEBUG_PDNSDA_MSG(...)
|
|
||||||
# define DEBUG_RHN_MSG(...)
|
|
||||||
# endif /* DEBUG > 0 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,187 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 1982, 1986, 1993
|
|
||||||
* The Regents of the University of California. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by the University of
|
|
||||||
* California, Berkeley and its contributors.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93
|
|
||||||
* $FreeBSD: src/sys/netinet/ip_icmp.h,v 1.20 2003/03/21 15:28:10 mdodd Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NETINET_IP_ICMP_H_
|
|
||||||
#define _NETINET_IP_ICMP_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Interface Control Message Protocol Definitions.
|
|
||||||
* Per RFC 792, September 1981.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Internal of an ICMP Router Advertisement
|
|
||||||
*/
|
|
||||||
struct icmp_ra_addr {
|
|
||||||
u_int32_t ira_addr;
|
|
||||||
u_int32_t ira_preference;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Structure of an icmp header.
|
|
||||||
*/
|
|
||||||
struct icmp {
|
|
||||||
u_char icmp_type; /* type of message, see below */
|
|
||||||
u_char icmp_code; /* type sub code */
|
|
||||||
u_short icmp_cksum; /* ones complement cksum of struct */
|
|
||||||
union {
|
|
||||||
u_char ih_pptr; /* ICMP_PARAMPROB */
|
|
||||||
struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
|
|
||||||
struct ih_idseq {
|
|
||||||
n_short icd_id;
|
|
||||||
n_short icd_seq;
|
|
||||||
} ih_idseq;
|
|
||||||
int ih_void;
|
|
||||||
|
|
||||||
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
|
|
||||||
struct ih_pmtu {
|
|
||||||
n_short ipm_void;
|
|
||||||
n_short ipm_nextmtu;
|
|
||||||
} ih_pmtu;
|
|
||||||
|
|
||||||
struct ih_rtradv {
|
|
||||||
u_char irt_num_addrs;
|
|
||||||
u_char irt_wpa;
|
|
||||||
u_int16_t irt_lifetime;
|
|
||||||
} ih_rtradv;
|
|
||||||
} icmp_hun;
|
|
||||||
#define icmp_pptr icmp_hun.ih_pptr
|
|
||||||
#define icmp_gwaddr icmp_hun.ih_gwaddr
|
|
||||||
#define icmp_id icmp_hun.ih_idseq.icd_id
|
|
||||||
#define icmp_seq icmp_hun.ih_idseq.icd_seq
|
|
||||||
#define icmp_void icmp_hun.ih_void
|
|
||||||
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
|
|
||||||
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
|
|
||||||
#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
|
|
||||||
#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
|
|
||||||
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
|
|
||||||
union {
|
|
||||||
struct id_ts { /* ICMP Timestamp */
|
|
||||||
n_time its_otime; /* Originate */
|
|
||||||
n_time its_rtime; /* Receive */
|
|
||||||
n_time its_ttime; /* Transmit */
|
|
||||||
} id_ts;
|
|
||||||
struct id_ip {
|
|
||||||
struct ip idi_ip;
|
|
||||||
/* options and then 64 bits of data */
|
|
||||||
} id_ip;
|
|
||||||
struct icmp_ra_addr id_radv;
|
|
||||||
u_int32_t id_mask;
|
|
||||||
char id_data[1];
|
|
||||||
} icmp_dun;
|
|
||||||
#define icmp_otime icmp_dun.id_ts.its_otime
|
|
||||||
#define icmp_rtime icmp_dun.id_ts.its_rtime
|
|
||||||
#define icmp_ttime icmp_dun.id_ts.its_ttime
|
|
||||||
#define icmp_ip icmp_dun.id_ip.idi_ip
|
|
||||||
#define icmp_radv icmp_dun.id_radv
|
|
||||||
#define icmp_mask icmp_dun.id_mask
|
|
||||||
#define icmp_data icmp_dun.id_data
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lower bounds on packet lengths for various types.
|
|
||||||
* For the error advice packets must first insure that the
|
|
||||||
* packet is large enough to contain the returned ip header.
|
|
||||||
* Only then can we do the check to see if 64 bits of packet
|
|
||||||
* data have been returned, since we need to check the returned
|
|
||||||
* ip header length.
|
|
||||||
*/
|
|
||||||
#define ICMP_MINLEN 8 /* abs minimum */
|
|
||||||
#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */
|
|
||||||
#define ICMP_MASKLEN 12 /* address mask */
|
|
||||||
#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
|
|
||||||
#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
|
|
||||||
/* N.B.: must separately check that ip_hl >= 5 */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Definition of type and code field values.
|
|
||||||
*/
|
|
||||||
#define ICMP_ECHOREPLY 0 /* echo reply */
|
|
||||||
#define ICMP_UNREACH 3 /* dest unreachable, codes: */
|
|
||||||
#define ICMP_UNREACH_NET 0 /* bad net */
|
|
||||||
#define ICMP_UNREACH_HOST 1 /* bad host */
|
|
||||||
#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
|
|
||||||
#define ICMP_UNREACH_PORT 3 /* bad port */
|
|
||||||
#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
|
|
||||||
#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
|
|
||||||
#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
|
|
||||||
#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
|
|
||||||
#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
|
|
||||||
#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */
|
|
||||||
#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
|
|
||||||
#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
|
|
||||||
#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
|
|
||||||
#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */
|
|
||||||
#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec vio. */
|
|
||||||
#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */
|
|
||||||
#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
|
|
||||||
#define ICMP_REDIRECT 5 /* shorter route, codes: */
|
|
||||||
#define ICMP_REDIRECT_NET 0 /* for network */
|
|
||||||
#define ICMP_REDIRECT_HOST 1 /* for host */
|
|
||||||
#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
|
|
||||||
#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
|
|
||||||
#define ICMP_ECHO 8 /* echo service */
|
|
||||||
#define ICMP_ROUTERADVERT 9 /* router advertisement */
|
|
||||||
#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
|
|
||||||
#define ICMP_TIMXCEED 11 /* time exceeded, code: */
|
|
||||||
#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
|
|
||||||
#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
|
|
||||||
#define ICMP_PARAMPROB 12 /* ip header bad */
|
|
||||||
#define ICMP_PARAMPROB_ERRATPTR 0 /* error at param ptr */
|
|
||||||
#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
|
|
||||||
#define ICMP_PARAMPROB_LENGTH 2 /* bad length */
|
|
||||||
#define ICMP_TSTAMP 13 /* timestamp request */
|
|
||||||
#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
|
|
||||||
#define ICMP_IREQ 15 /* information request */
|
|
||||||
#define ICMP_IREQREPLY 16 /* information reply */
|
|
||||||
#define ICMP_MASKREQ 17 /* address mask request */
|
|
||||||
#define ICMP_MASKREPLY 18 /* address mask reply */
|
|
||||||
|
|
||||||
#define ICMP_MAXTYPE 18
|
|
||||||
|
|
||||||
#define ICMP_INFOTYPE(type) \
|
|
||||||
((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
|
|
||||||
(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
|
|
||||||
(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
|
|
||||||
(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
|
|
||||||
(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
|
|
||||||
|
|
||||||
#ifdef _KERNEL
|
|
||||||
void icmp_error(struct mbuf *, int, int, n_long, struct ifnet *);
|
|
||||||
void icmp_input(struct mbuf *, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,322 +0,0 @@
|
||||||
/* hash.c - Manage hashes for cached dns records
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2005 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "hash.h"
|
|
||||||
#include "cache.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "consts.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* This is not a perfect hash, but I hope it holds. It is designed for 1024 hash
|
|
||||||
* buckets, and hashes strings with case-insensitivity.
|
|
||||||
* It is position-aware in a limited way.
|
|
||||||
* It is exactly seen a two-way hash: because I do not want to exaggerate
|
|
||||||
* the hash buckets (i do have 1024), but I hash strings and string-comparisons
|
|
||||||
* are expensive, I save another 32 bit hash in each hash element that is checked
|
|
||||||
* before the string. The 32 bit hash is also used to order the entries in a hash chain.
|
|
||||||
* I hope not to have all too much collision concentration.
|
|
||||||
*
|
|
||||||
* The ip hash was removed. I don't think it concentrated the collisions too much.
|
|
||||||
* If it does, the hash algorithm needs to be changed, rather than using another
|
|
||||||
* hash.
|
|
||||||
* Some measurements seem to indicate that the hash algorithm is doing reasonable well.
|
|
||||||
*/
|
|
||||||
|
|
||||||
dns_hash_ent_t *hash_buckets[HASH_NUM_BUCKETS];
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hash a dns name (length-byte string format) to HASH_SZ bit.
|
|
||||||
* *rhash is set to a long int hash.
|
|
||||||
*/
|
|
||||||
static unsigned dns_hash(const unsigned char *str, unsigned long *rhash)
|
|
||||||
{
|
|
||||||
unsigned s,i,lb,c;
|
|
||||||
unsigned long r;
|
|
||||||
s=0; r=0;
|
|
||||||
i=0;
|
|
||||||
while((lb=str[i])) {
|
|
||||||
s+=lb<<(i%(HASH_SZ-5));
|
|
||||||
r+=((unsigned long)lb)<<(i%(8*sizeof(unsigned long)-7));
|
|
||||||
++i;
|
|
||||||
do {
|
|
||||||
c=toupper(str[i]);
|
|
||||||
s+=c<<(i%(HASH_SZ-5));
|
|
||||||
r+=((unsigned long)c)<<(i%(8*sizeof(unsigned long)-7));
|
|
||||||
++i;
|
|
||||||
} while(--lb);
|
|
||||||
}
|
|
||||||
s=(s&HASH_BITMASK)+((s&(~HASH_BITMASK))>>HASH_SZ);
|
|
||||||
s=(s&HASH_BITMASK)+((s&(~HASH_BITMASK))>>HASH_SZ);
|
|
||||||
s &= HASH_BITMASK;
|
|
||||||
#ifdef DEBUG_HASH
|
|
||||||
{
|
|
||||||
unsigned char buf[DNSNAMEBUFSIZE];
|
|
||||||
printf("Diagnostic: hashes for %s: %03x,%04lx\n",rhn2str(str,buf,sizeof(buf)),s,r);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if(rhash) *rhash=r;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize hash to hold a dns hash table
|
|
||||||
*/
|
|
||||||
/* This is now defined as an inline function in hash.h */
|
|
||||||
#if 0
|
|
||||||
void mk_dns_hash()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<HASH_NUM_BUCKETS;i++)
|
|
||||||
hash_buckets[i]=NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
Lookup in the hash table for key. If it is found, return the pointer to the cache entry.
|
|
||||||
If no entry is found, return 0.
|
|
||||||
If loc is not NULL, it will used to store information about the location within the hash table
|
|
||||||
This can be used to add an entry with add_dns_hash() or delete the entry with del_dns_hash_ent().
|
|
||||||
*/
|
|
||||||
dns_cent_t *dns_lookup(const unsigned char *key, dns_hash_loc_t *loc)
|
|
||||||
{
|
|
||||||
dns_cent_t *retval=NULL;
|
|
||||||
unsigned idx;
|
|
||||||
unsigned long rh;
|
|
||||||
dns_hash_ent_t **hep,*he;
|
|
||||||
|
|
||||||
idx = dns_hash(key,&rh);
|
|
||||||
hep = &hash_buckets[idx];
|
|
||||||
while ((he= *hep) && he->rhash<=rh) {
|
|
||||||
if (he->rhash==rh && rhnicmp(key,he->data->qname)) {
|
|
||||||
retval = he->data;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hep = &he->next;
|
|
||||||
}
|
|
||||||
if(loc) {
|
|
||||||
loc->pos = hep;
|
|
||||||
loc->rhash = rh;
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Add a cache entry to the hash table.
|
|
||||||
|
|
||||||
loc must contain the location where the the new entry should be inserted
|
|
||||||
(this location can be obtained with dns_lookup).
|
|
||||||
|
|
||||||
add_dns_hash returns 1 on success, or 0 if out of memory.
|
|
||||||
*/
|
|
||||||
int add_dns_hash(dns_cent_t *data, dns_hash_loc_t *loc)
|
|
||||||
{
|
|
||||||
dns_hash_ent_t *he = malloc(sizeof(dns_hash_ent_t));
|
|
||||||
|
|
||||||
if(!he)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
he->next = *(loc->pos);
|
|
||||||
he->rhash = loc->rhash;
|
|
||||||
he->data = data;
|
|
||||||
*(loc->pos) = he;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Delete the hash entry indentified by the location returned by dns_lookup().
|
|
||||||
*/
|
|
||||||
dns_cent_t *del_dns_hash_ent(dns_hash_loc_t *loc)
|
|
||||||
{
|
|
||||||
dns_hash_ent_t *he = *(loc->pos);
|
|
||||||
dns_cent_t *data;
|
|
||||||
|
|
||||||
*(loc->pos) = he->next;
|
|
||||||
data = he->data;
|
|
||||||
free(he);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Delete the first entry indexed by key from the hash. Returns the data field or NULL.
|
|
||||||
* Since two cents are not allowed to be for the same host name, there will be only one.
|
|
||||||
*/
|
|
||||||
dns_cent_t *del_dns_hash(const unsigned char *key)
|
|
||||||
{
|
|
||||||
unsigned idx;
|
|
||||||
unsigned long rh;
|
|
||||||
dns_hash_ent_t **hep,*he;
|
|
||||||
dns_cent_t *data;
|
|
||||||
|
|
||||||
idx = dns_hash(key,&rh);
|
|
||||||
hep = &hash_buckets[idx];
|
|
||||||
while ((he= *hep) && he->rhash<=rh) {
|
|
||||||
if (he->rhash==rh && rhnicmp(key,he->data->qname)) {
|
|
||||||
*hep = he->next;
|
|
||||||
data = he->data;
|
|
||||||
free(he);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
hep = &he->next;
|
|
||||||
}
|
|
||||||
return NULL; /* not found */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Delete all entries in a hash bucket.
|
|
||||||
*/
|
|
||||||
void free_dns_hash_bucket(int i)
|
|
||||||
{
|
|
||||||
dns_hash_ent_t *he,*hen;
|
|
||||||
|
|
||||||
he=hash_buckets[i];
|
|
||||||
hash_buckets[i]=NULL;
|
|
||||||
while (he) {
|
|
||||||
hen=he->next;
|
|
||||||
del_cent(he->data);
|
|
||||||
free(he);
|
|
||||||
he=hen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Delete all entries in a hash bucket whose names match those in
|
|
||||||
* an include/exclude list.
|
|
||||||
*/
|
|
||||||
void free_dns_hash_selected(int i, slist_array sla)
|
|
||||||
{
|
|
||||||
dns_hash_ent_t **hep,*he,*hen;
|
|
||||||
int j,m=DA_NEL(sla);
|
|
||||||
|
|
||||||
hep= &hash_buckets[i];
|
|
||||||
he= *hep;
|
|
||||||
|
|
||||||
while (he) {
|
|
||||||
unsigned char *name=he->data->qname;
|
|
||||||
for(j=0;j<m;++j) {
|
|
||||||
slist_t *sl=&DA_INDEX(sla,j);
|
|
||||||
unsigned int nrem,lrem;
|
|
||||||
domain_match(name,sl->domain,&nrem,&lrem);
|
|
||||||
if(!lrem && (!sl->exact || !nrem)) {
|
|
||||||
if(sl->rule==C_INCLUDED)
|
|
||||||
goto delete_entry;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* default policy is not to delete */
|
|
||||||
hep= &he->next;
|
|
||||||
he= *hep;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
delete_entry:
|
|
||||||
*hep=hen=he->next;;
|
|
||||||
del_cent(he->data);
|
|
||||||
free(he);
|
|
||||||
he=hen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Delete the whole hash table, freeing all memory
|
|
||||||
*/
|
|
||||||
void free_dns_hash()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
dns_hash_ent_t *he,*hen;
|
|
||||||
for (i=0;i<HASH_NUM_BUCKETS;i++) {
|
|
||||||
he=hash_buckets[i];
|
|
||||||
hash_buckets[i]=NULL;
|
|
||||||
while (he) {
|
|
||||||
hen=he->next;
|
|
||||||
del_cent(he->data);
|
|
||||||
free(he);
|
|
||||||
he=hen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following functions are for iterating over the hash.
|
|
||||||
* fetch_first returns the data field of the first element (or NULL if there is none), and fills pos
|
|
||||||
* for subsequent calls of fetch_next.
|
|
||||||
* fetch_next returns the data field of the element after the element that was returned by the last
|
|
||||||
* call with the same position argument (or NULL if there is none)
|
|
||||||
*
|
|
||||||
* Note that these are designed so that you may actually delete the elements you retrieved from the hash.
|
|
||||||
*/
|
|
||||||
dns_cent_t *fetch_first(dns_hash_pos_t *pos)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=0;i<HASH_NUM_BUCKETS;i++) {
|
|
||||||
dns_hash_ent_t *he=hash_buckets[i];
|
|
||||||
if (he) {
|
|
||||||
pos->bucket=i;
|
|
||||||
pos->ent=he->next;
|
|
||||||
return he->data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dns_cent_t *fetch_next(dns_hash_pos_t *pos)
|
|
||||||
{
|
|
||||||
dns_hash_ent_t *he=pos->ent;
|
|
||||||
int i;
|
|
||||||
if (he) {
|
|
||||||
pos->ent=he->next;
|
|
||||||
return he->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=pos->bucket+1;i<HASH_NUM_BUCKETS;i++) {
|
|
||||||
he=hash_buckets[i];
|
|
||||||
if (he) {
|
|
||||||
pos->bucket=i;
|
|
||||||
pos->ent=he->next;
|
|
||||||
return he->data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_HASH
|
|
||||||
void dumphash()
|
|
||||||
{
|
|
||||||
if(debug_p) {
|
|
||||||
int i, j;
|
|
||||||
dns_hash_ent_t *he;
|
|
||||||
|
|
||||||
for (i=0; i<HASH_NUM_BUCKETS; i++) {
|
|
||||||
for (j=0, he=hash_buckets[i]; he; he=he->next, j++) ;
|
|
||||||
DEBUG_MSG("bucket %d: %d entries\n", i, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,83 +0,0 @@
|
||||||
/* hash.h - Manage hashes for cached dns records
|
|
||||||
|
|
||||||
Copyright (C) 2000 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2005 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _HASH_H_
|
|
||||||
#define _HASH_H_
|
|
||||||
#include <config.h>
|
|
||||||
#include "cache.h"
|
|
||||||
|
|
||||||
typedef struct dns_hash_ent_s {
|
|
||||||
struct dns_hash_ent_s *next;
|
|
||||||
unsigned long rhash; /* this is a better hash */
|
|
||||||
dns_cent_t *data;
|
|
||||||
} dns_hash_ent_t;
|
|
||||||
|
|
||||||
/* Redefine this if you want another hash size. Should work ;-).
|
|
||||||
* The number of hash buckets is computed as power of two;
|
|
||||||
* so, e.g. HASH_SZ set to 10 yields 1024 hash rows (2^10 or 1<<10).
|
|
||||||
* Only powers of two are possible conveniently.
|
|
||||||
* HASH_SZ may not be bigger than 32 (if you set it even close to that value,
|
|
||||||
* you are nuts.) */
|
|
||||||
/* #define HASH_SZ 10 */ /* Now defined in config.h */
|
|
||||||
#define HASH_NUM_BUCKETS (1<<HASH_SZ)
|
|
||||||
|
|
||||||
#define HASH_BITMASK (HASH_NUM_BUCKETS-1)
|
|
||||||
|
|
||||||
extern dns_hash_ent_t *hash_buckets[];
|
|
||||||
|
|
||||||
/* A type for remembering the position in the hash table where a new entry can be inserted. */
|
|
||||||
typedef struct {
|
|
||||||
dns_hash_ent_t **pos; /* pointer to the location in the hash table */
|
|
||||||
unsigned long rhash; /* long hash */
|
|
||||||
} dns_hash_loc_t;
|
|
||||||
|
|
||||||
/* A type for position specification for fetch_first and fetch_next */
|
|
||||||
typedef struct {
|
|
||||||
int bucket; /* bucket chain we are in */
|
|
||||||
dns_hash_ent_t *ent; /* entry */
|
|
||||||
} dns_hash_pos_t;
|
|
||||||
|
|
||||||
inline static void mk_dns_hash() __attribute__((always_inline));
|
|
||||||
inline static void mk_dns_hash()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<HASH_NUM_BUCKETS;i++)
|
|
||||||
hash_buckets[i]=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dns_cent_t *dns_lookup(const unsigned char *key, dns_hash_loc_t *loc);
|
|
||||||
int add_dns_hash(dns_cent_t *data, dns_hash_loc_t *loc);
|
|
||||||
dns_cent_t *del_dns_hash_ent(dns_hash_loc_t *loc);
|
|
||||||
dns_cent_t *del_dns_hash(const unsigned char *key);
|
|
||||||
void free_dns_hash_bucket(int i);
|
|
||||||
void free_dns_hash_selected(int i, slist_array sla);
|
|
||||||
void free_dns_hash();
|
|
||||||
|
|
||||||
dns_cent_t *fetch_first(dns_hash_pos_t *pos);
|
|
||||||
dns_cent_t *fetch_next(dns_hash_pos_t *pos);
|
|
||||||
|
|
||||||
#ifdef DEBUG_HASH
|
|
||||||
void dumphash();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,795 +0,0 @@
|
||||||
/* helpers.c - Various helper functions
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2005, 2006, 2008, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
#include "thread.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "cache.h"
|
|
||||||
#include "conff.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is to exit pdnsd from any thread.
|
|
||||||
*/
|
|
||||||
void pdnsd_exit()
|
|
||||||
{
|
|
||||||
pthread_kill(main_thrid,SIGTERM);
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try to grab a mutex. If we can't, fail. This will loop until we get the
|
|
||||||
* mutex or fail. This is only used in debugging code or at exit, otherwise
|
|
||||||
* we might run into lock contention problems.
|
|
||||||
*/
|
|
||||||
int softlock_mutex(pthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
unsigned int tr=0;
|
|
||||||
while(pthread_mutex_trylock(mutex)) {
|
|
||||||
if (++tr>=SOFTLOCK_MAXTRIES)
|
|
||||||
return 0;
|
|
||||||
usleep_r(10000);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* setuid() and setgid() for a specified user.
|
|
||||||
*/
|
|
||||||
int run_as(const char *user)
|
|
||||||
{
|
|
||||||
if (user[0]) {
|
|
||||||
#ifdef HAVE_GETPWNAM_R
|
|
||||||
struct passwd pwdbuf, *pwd;
|
|
||||||
size_t buflen;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
for(buflen=128;; buflen*=2) {
|
|
||||||
char buf[buflen]; /* variable length array */
|
|
||||||
|
|
||||||
/* Note that we use getpwnam_r() instead of getpwnam(),
|
|
||||||
which returns its result in a statically allocated buffer and
|
|
||||||
cannot be considered thread safe.
|
|
||||||
Doesn't use NSS! */
|
|
||||||
err=getpwnam_r(user, &pwdbuf, buf, buflen, &pwd);
|
|
||||||
if(err==0 && pwd) {
|
|
||||||
/* setgid first, because we may not be allowed to do it anymore after setuid */
|
|
||||||
if (setgid(pwd->pw_gid)!=0) {
|
|
||||||
log_error("Could not change group id to that of run_as user '%s': %s",
|
|
||||||
user,strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initgroups uses NSS, so we can disable it,
|
|
||||||
i.e. we might need DNS for LDAP lookups, which times out */
|
|
||||||
if (global.use_nss && (initgroups(user, pwd->pw_gid)!=0)) {
|
|
||||||
log_error("Could not initialize the group access list of run_as user '%s': %s",
|
|
||||||
user,strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (setuid(pwd->pw_uid)!=0) {
|
|
||||||
log_error("Could not change user id to that of run_as user '%s': %s",
|
|
||||||
user,strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(err!=ERANGE) {
|
|
||||||
if(err)
|
|
||||||
log_error("run_as user '%s' could not be found: %s",user,strerror(err));
|
|
||||||
else
|
|
||||||
log_error("run_as user '%s' could not be found.",user);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if(buflen>=16*1024) {
|
|
||||||
/* If getpwnam_r() seems defective, call it quits rather than
|
|
||||||
keep on allocating ever larger buffers until we crash. */
|
|
||||||
log_error("getpwnam_r() requires more than %u bytes of buffer space.",(unsigned)buflen);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* Else try again with larger buffer. */
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* No getpwnam_r() :-( We'll use getpwnam() and hope for the best. */
|
|
||||||
struct passwd *pwd;
|
|
||||||
|
|
||||||
if (!(pwd=getpwnam(user))) {
|
|
||||||
log_error("run_as user %s could not be found.",user);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* setgid first, because we may not allowed to do it anymore after setuid */
|
|
||||||
if (setgid(pwd->pw_gid)!=0) {
|
|
||||||
log_error("Could not change group id to that of run_as user '%s': %s",
|
|
||||||
user,strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* initgroups uses NSS, so we can disable it,
|
|
||||||
i.e. we might need DNS for LDAP lookups, which times out */
|
|
||||||
if (global.use_nss && (initgroups(user, pwd->pw_gid)!=0)) {
|
|
||||||
log_error("Could not initialize the group access list of run_as user '%s': %s",
|
|
||||||
user,strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (setuid(pwd->pw_uid)!=0) {
|
|
||||||
log_error("Could not change user id to that of run_as user '%s': %s",
|
|
||||||
user,strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* returns whether c is allowed in IN domain names
|
|
||||||
*/
|
|
||||||
#if 0
|
|
||||||
int isdchar (unsigned char c)
|
|
||||||
{
|
|
||||||
if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='-'
|
|
||||||
#ifdef UNDERSCORE
|
|
||||||
|| c=='_'
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert a string given in dotted notation to the transport format (length byte prepended
|
|
||||||
* domain name parts, ended by a null length sequence)
|
|
||||||
* The memory areas referenced by str and rhn may not overlap.
|
|
||||||
* The buffer rhn points to is assumed to be at least DNSNAMEBUFSIZE bytes in size.
|
|
||||||
*
|
|
||||||
* Returns 1 if successful, otherwise 0.
|
|
||||||
*/
|
|
||||||
int str2rhn(const unsigned char *str, unsigned char *rhn)
|
|
||||||
{
|
|
||||||
unsigned int i,j;
|
|
||||||
|
|
||||||
if(*str=='.' && !*(str+1)) {
|
|
||||||
/* Special case: root domain */
|
|
||||||
rhn[0]=0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0;;) {
|
|
||||||
unsigned int jlim= i+63;
|
|
||||||
if(jlim>DNSNAMEBUFSIZE-2) jlim=DNSNAMEBUFSIZE-2; /* DNSNAMEBUFSIZE-2 because the termination 0 has to follow */
|
|
||||||
for(j=i; str[j] && str[j]!='.'; ++j) {
|
|
||||||
if(j>=jlim) return 0;
|
|
||||||
rhn[j+1]=str[j];
|
|
||||||
}
|
|
||||||
if(!str[j])
|
|
||||||
break;
|
|
||||||
if(j<=i)
|
|
||||||
return 0;
|
|
||||||
rhn[i]=(unsigned char)(j-i);
|
|
||||||
i = j+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rhn[i]=0;
|
|
||||||
if (j>i || i==0)
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
parsestr2rhn is essentially the same as str2rhn, except that it doesn't look beyond
|
|
||||||
the first len chars in the input string. It also tolerates strings
|
|
||||||
not ending in a dot and returns a message in case of an error.
|
|
||||||
*/
|
|
||||||
const char *parsestr2rhn(const unsigned char *str, unsigned int len, unsigned char *rhn)
|
|
||||||
{
|
|
||||||
unsigned int i,j;
|
|
||||||
|
|
||||||
if(len>0 && *str=='.' && (len==1 || !*(str+1))) {
|
|
||||||
/* Special case: root domain */
|
|
||||||
rhn[0]=0;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
i=0;
|
|
||||||
do {
|
|
||||||
unsigned int jlim= i+63;
|
|
||||||
if(jlim>DNSNAMEBUFSIZE-2) jlim=DNSNAMEBUFSIZE-2;
|
|
||||||
for(j=i; j<len && str[j] && str[j]!='.'; ++j) {
|
|
||||||
/* if(!isdchar(str[j]))
|
|
||||||
return "Illegal character in domain name"; */
|
|
||||||
if(j>=jlim)
|
|
||||||
return "Domain name element too long";
|
|
||||||
rhn[j+1]=str[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(j<=i) {
|
|
||||||
if(j<len && str[j])
|
|
||||||
return "Empty name element in domain name";
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
rhn[i]=(unsigned char)(j-i);
|
|
||||||
i = j+1;
|
|
||||||
} while(j<len && str[j]);
|
|
||||||
|
|
||||||
rhn[i]=0;
|
|
||||||
if(i==0)
|
|
||||||
return "Empty domain name not allowed";
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Take a host name as used in the dns transfer protocol (a length byte,
|
|
||||||
* followed by the first part of the name, ..., followed by a 0 length byte),
|
|
||||||
* and return a string in the usual dotted notation. Length checking is done
|
|
||||||
* elsewhere (in decompress_name), this takes names from the cache which are
|
|
||||||
* validated. No more than "size" bytes will be written to the buffer str points to
|
|
||||||
* (but size must be positive).
|
|
||||||
* If the labels in rhn contains non-printable characters, these are represented
|
|
||||||
* in the result by a backslash followed three octal digits. Additionally some
|
|
||||||
* special characters are preceded by a backslash. Normally the result should
|
|
||||||
* fit within DNSNAMEBUFSIZE bytes, but if there are many non-printable characters, the
|
|
||||||
* receiving buffer may not be able to contain the full result. In that case the
|
|
||||||
* truncation in the result is indicated by series of trailing dots. This
|
|
||||||
* function is only used for diagnostic purposes, thus a truncated result should
|
|
||||||
* not be a very serious problem (and should only occur under pathological
|
|
||||||
* circumstances).
|
|
||||||
*/
|
|
||||||
const unsigned char *rhn2str(const unsigned char *rhn, unsigned char *str, unsigned int size)
|
|
||||||
{
|
|
||||||
unsigned int i,j,lb;
|
|
||||||
|
|
||||||
if(size==0) return NULL;
|
|
||||||
|
|
||||||
i=0; j=0;
|
|
||||||
lb=rhn[i++];
|
|
||||||
if (!lb) {
|
|
||||||
if(size>=2)
|
|
||||||
str[j++]='.';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
do {
|
|
||||||
for (;lb;--lb) {
|
|
||||||
unsigned char c;
|
|
||||||
if(j+2>=size)
|
|
||||||
goto overflow;
|
|
||||||
c=rhn[i++];
|
|
||||||
if(isgraph(c)) {
|
|
||||||
if(c=='.' || c=='\\' || c=='"') {
|
|
||||||
str[j++]='\\';
|
|
||||||
if(j+2>=size)
|
|
||||||
goto overflow;
|
|
||||||
}
|
|
||||||
str[j++]=c;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
unsigned int rem=size-1-j;
|
|
||||||
int n=snprintf(charp &str[j],rem,"\\%03o",c);
|
|
||||||
if(n<0 || n>=rem) {
|
|
||||||
str[j++]='.';
|
|
||||||
goto overflow;
|
|
||||||
}
|
|
||||||
j+=n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
str[j++]='.';
|
|
||||||
lb=rhn[i++];
|
|
||||||
} while(lb);
|
|
||||||
}
|
|
||||||
str[j]=0;
|
|
||||||
return str;
|
|
||||||
|
|
||||||
overflow:
|
|
||||||
j=size;
|
|
||||||
str[--j]=0;
|
|
||||||
if(j>0) {
|
|
||||||
str[--j]='.';
|
|
||||||
if(j>0) {
|
|
||||||
str[--j]='.';
|
|
||||||
if(j>0)
|
|
||||||
str[--j]='.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the length of a domain name in transport format.
|
|
||||||
The definition has in fact been moved to helpers.h as an inline function.
|
|
||||||
Note added by Paul Rombouts:
|
|
||||||
Compared to the definition used by Thomas Moestl (strlen(rhn)+1), the following definition of rhnlen
|
|
||||||
may yield a different result in certain error situations (when a domain name segment contains null byte).
|
|
||||||
*/
|
|
||||||
#if 0
|
|
||||||
unsigned int rhnlen(const unsigned char *rhn)
|
|
||||||
{
|
|
||||||
unsigned int i=0,lb;
|
|
||||||
|
|
||||||
while((lb=rhn[i++]))
|
|
||||||
i+=lb;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Non-validating rhn copy (use with checked or generated data only).
|
|
||||||
* Returns number of characters copied. The buffer dst points to is assumed to be DNSNAMEBUFSIZE (or
|
|
||||||
* at any rate large enough) bytes in size.
|
|
||||||
* The answer assembly code uses this; it is guaranteed to not clobber anything
|
|
||||||
* after the name.
|
|
||||||
*/
|
|
||||||
unsigned int rhncpy(unsigned char *dst, const unsigned char *src)
|
|
||||||
{
|
|
||||||
unsigned int len = rhnlen(src);
|
|
||||||
|
|
||||||
PDNSD_ASSERT(len<=DNSNAMEBUFSIZE,"rhncpy: src too long!");
|
|
||||||
memcpy(dst,src,len>DNSNAMEBUFSIZE?DNSNAMEBUFSIZE:len);
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Check whether a name is a normal wire-encoded domain name,
|
|
||||||
i.e. is not compressed, doesn't use extended labels and is not
|
|
||||||
too long.
|
|
||||||
*/
|
|
||||||
int isnormalencdomname(const unsigned char *rhn, unsigned maxlen)
|
|
||||||
{
|
|
||||||
unsigned int i,lb;
|
|
||||||
|
|
||||||
if(maxlen>DNSNAMEBUFSIZE)
|
|
||||||
maxlen=DNSNAMEBUFSIZE;
|
|
||||||
for(i=0;;) {
|
|
||||||
if(i>=maxlen) return 0;
|
|
||||||
lb=rhn[i++];
|
|
||||||
if(lb==0) break;
|
|
||||||
if(lb>0x3f) return 0;
|
|
||||||
i += lb;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int str2pdnsd_a(const char *addr, pdnsd_a *a)
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
if (run_ipv4) {
|
|
||||||
return inet_aton(addr,&a->ipv4);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
ELSE_IPV6 {
|
|
||||||
/* Try to map an IPv4 address to IPv6 */
|
|
||||||
struct in_addr a4;
|
|
||||||
if(inet_aton(addr,&a4)) {
|
|
||||||
a->ipv6=global.ipv4_6_prefix;
|
|
||||||
((uint32_t *)(&a->ipv6))[3]=a4.s_addr;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return inet_pton(AF_INET6,addr,&a->ipv6)>0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* return 0; */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* definition moved to helpers.h */
|
|
||||||
#if 0
|
|
||||||
int is_inaddr_any(pdnsd_a *a)
|
|
||||||
{
|
|
||||||
return SEL_IPVER( a->ipv4.s_addr==INADDR_ANY,
|
|
||||||
IN6_IS_ADDR_UNSPECIFIED(&a->ipv6) );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is used for user output only, so it does not matter when an error occurs.
|
|
||||||
*/
|
|
||||||
const char *pdnsd_a2str(pdnsd_a *a, char *buf, int maxlen)
|
|
||||||
{
|
|
||||||
const char *res= SEL_IPVER( inet_ntop(AF_INET,&a->ipv4,buf,maxlen),
|
|
||||||
inet_ntop(AF_INET6,&a->ipv6,buf,maxlen) );
|
|
||||||
if (!res) {
|
|
||||||
log_error("inet_ntop: %s", strerror(errno));
|
|
||||||
return "?.?.?.?";
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Appropriately set our random device */
|
|
||||||
#ifdef R_DEFAULT
|
|
||||||
# if (TARGET == TARGET_BSD) && !defined(__NetBSD__)
|
|
||||||
# define R_ARC4RANDOM 1
|
|
||||||
# else
|
|
||||||
# define R_RANDOM 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RANDOM_DEVICE
|
|
||||||
FILE *rand_file;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef R_RANDOM
|
|
||||||
void init_crandom()
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
struct timezone tz;
|
|
||||||
|
|
||||||
gettimeofday(&tv,&tz);
|
|
||||||
srandom(tv.tv_sec^tv.tv_usec); /* not as guessable as time() */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* initialize the PRNG */
|
|
||||||
int init_rng()
|
|
||||||
{
|
|
||||||
#ifdef RANDOM_DEVICE
|
|
||||||
if (!(rand_file=fopen(RANDOM_DEVICE,"r"))) {
|
|
||||||
log_error("Could not open %s.",RANDOM_DEVICE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef R_RANDOM
|
|
||||||
init_crandom();
|
|
||||||
#endif
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The following function is now actually defined as a macro in helpers.h */
|
|
||||||
#if 0
|
|
||||||
void free_rng()
|
|
||||||
{
|
|
||||||
#ifdef RANDOM_DEVICE
|
|
||||||
if (rand_file)
|
|
||||||
fclose(rand_file);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* generate a (more or less) random number 16 bits long. */
|
|
||||||
unsigned short get_rand16()
|
|
||||||
{
|
|
||||||
#ifdef RANDOM_DEVICE
|
|
||||||
unsigned short rv;
|
|
||||||
|
|
||||||
if (rand_file) {
|
|
||||||
if (fread(&rv,sizeof(rv),1, rand_file)!=1) {
|
|
||||||
log_error("Error while reading from random device: %s", strerror(errno));
|
|
||||||
pdnsd_exit();
|
|
||||||
}
|
|
||||||
return rv&0xffff;
|
|
||||||
} else
|
|
||||||
return random()&0xffff;
|
|
||||||
#endif
|
|
||||||
#ifdef R_RANDOM
|
|
||||||
return random()&0xffff;
|
|
||||||
#endif
|
|
||||||
#ifdef R_ARC4RANDOM
|
|
||||||
return arc4random()&0xffff;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fsprintf does formatted output to a file descriptor.
|
|
||||||
The functionality is similar to fprintf, but note that fd
|
|
||||||
is of type int instead of FILE*.
|
|
||||||
This function has been rewritten by Paul Rombouts */
|
|
||||||
int fsprintf(int fd, const char *format, ...)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
va_list va;
|
|
||||||
|
|
||||||
{
|
|
||||||
char buf[256];
|
|
||||||
|
|
||||||
va_start(va,format);
|
|
||||||
n=vsnprintf(buf,sizeof(buf),format,va);
|
|
||||||
va_end(va);
|
|
||||||
|
|
||||||
if(n<(int)sizeof(buf)) {
|
|
||||||
if(n>0) n=write_all(fd,buf,n);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* retry with a right sized buffer, needs glibc 2.1 or higher to work */
|
|
||||||
{
|
|
||||||
unsigned bufsize=n+1;
|
|
||||||
char buf[bufsize];
|
|
||||||
|
|
||||||
va_start(va,format);
|
|
||||||
n=vsnprintf(buf,bufsize,format,va);
|
|
||||||
va_end(va);
|
|
||||||
|
|
||||||
if(n>0) n=write_all(fd,buf,n);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert data into a hexadecimal representation (for debugging purposes)..
|
|
||||||
The result is stored in the character array buf.
|
|
||||||
If buf is not large enough to hold the result, the
|
|
||||||
truncation is indicated by trailing dots.
|
|
||||||
*/
|
|
||||||
void hexdump(const void *data, int dlen, char *buf, int buflen)
|
|
||||||
{
|
|
||||||
const unsigned char *p=data;
|
|
||||||
int i,j=0;
|
|
||||||
for(i=0;i<dlen;++i) {
|
|
||||||
int rem=buflen-j;
|
|
||||||
int n=snprintf(buf+j, rem, i==0?"%02x":" %02x", p[i]);
|
|
||||||
if(n<0 || n>=rem) goto truncated;
|
|
||||||
j += n;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
truncated:
|
|
||||||
if(j>=6) {
|
|
||||||
j -= 3;
|
|
||||||
if(j+4>=buflen)
|
|
||||||
j -= 3;
|
|
||||||
buf[j++]=' ';
|
|
||||||
buf[j++]='.';
|
|
||||||
buf[j++]='.';
|
|
||||||
buf[j++]='.';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int ndots=buflen-1;
|
|
||||||
if(ndots>3) ndots=3;
|
|
||||||
j=0;
|
|
||||||
while(j<ndots) buf[j++]='.';
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
buf[j]=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy string "in" to "str" buffer, converting non-printable characters
|
|
||||||
to escape sequences.
|
|
||||||
Returns the length of the output string, or -1 if the result does not
|
|
||||||
fit in the output buffer.
|
|
||||||
*/
|
|
||||||
int escapestr(const char *in, int ilen, char *str, int size)
|
|
||||||
{
|
|
||||||
int i,j=0;
|
|
||||||
for(i=0;i<ilen;++i) {
|
|
||||||
unsigned char c;
|
|
||||||
if(j+1>=size)
|
|
||||||
return -1;
|
|
||||||
c=in[i];
|
|
||||||
if(!isprint(c)) {
|
|
||||||
int rem=size-j;
|
|
||||||
int n=snprintf(&str[j],rem,"\\%03o",c);
|
|
||||||
if(n<0 || n>=rem) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
j+=n;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(c=='\\' || c=='"') {
|
|
||||||
str[j++]='\\';
|
|
||||||
if(j+1>=size)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
str[j++]=c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
str[j]=0;
|
|
||||||
return j;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is not like strcmp, but will return 1 on match or 0 if the
|
|
||||||
* strings are different.
|
|
||||||
*/
|
|
||||||
/* definition moved to helpers.h as an inline function. */
|
|
||||||
#if 0
|
|
||||||
int stricomp(char *a, char *b)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
if (strlen(a) != strlen(b))
|
|
||||||
return 0;
|
|
||||||
for (i=0;i<strlen(a);i++) {
|
|
||||||
if (tolower(a[i])!=tolower(b[i]))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Bah. I want strlcpy */
|
|
||||||
/* definition moved to helpers.h */
|
|
||||||
#if 0
|
|
||||||
int strncp(char *dst, char *src, int dstsz)
|
|
||||||
{
|
|
||||||
char o;
|
|
||||||
|
|
||||||
strncpy(dst,src,dstsz);
|
|
||||||
o=dst[dstsz-1];
|
|
||||||
dst[dstsz-1]='\0';
|
|
||||||
if (strlen(dst) >= dstsz-1 && o!='\0')
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_GETLINE
|
|
||||||
/* Note by Paul Rombouts: I know that getline is a GNU extension and is not really portable,
|
|
||||||
but the alternative standard functions have some real problems.
|
|
||||||
The following substitute does not have exactly the same semantics as the GNU getline,
|
|
||||||
but it should be good enough, as long as the stream doesn't contain any null chars.
|
|
||||||
This version is actually based on fgets_realloc() that I found in the WWWOFFLE source.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BUFSIZE 256
|
|
||||||
int getline(char **lineptr, size_t *n, FILE *stream)
|
|
||||||
{
|
|
||||||
char *line=*lineptr;
|
|
||||||
size_t sz=*n,i;
|
|
||||||
|
|
||||||
if(!line || sz<BUFSIZE) {
|
|
||||||
sz=BUFSIZE;
|
|
||||||
line = realloc(line,sz);
|
|
||||||
if(!line) return -1;
|
|
||||||
*lineptr=line;
|
|
||||||
*n=sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0;;) {
|
|
||||||
char *lni;
|
|
||||||
|
|
||||||
if(!(lni=fgets(line+i,sz-i,stream))) {
|
|
||||||
if(i && feof(stream))
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
i += strlen(lni);
|
|
||||||
|
|
||||||
if(i<sz-1 || line[i-1]=='\n')
|
|
||||||
break;
|
|
||||||
|
|
||||||
sz += BUFSIZE;
|
|
||||||
line = realloc(line,sz);
|
|
||||||
if(!line) return -1;
|
|
||||||
*lineptr=line;
|
|
||||||
*n=sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
#undef BUFSIZE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef HAVE_VASPRINTF
|
|
||||||
/* On systems where the macro va_copy is not available, hopefully simple assignment will work.
|
|
||||||
Otherwise, I don't see any portable way of defining vasprintf() (without using a completely
|
|
||||||
different algorithm).
|
|
||||||
*/
|
|
||||||
#ifndef va_copy
|
|
||||||
# ifdef __va_copy
|
|
||||||
# define va_copy __va_copy
|
|
||||||
# else
|
|
||||||
# warning "No va_copy or __va_copy macro found, trying simple assignment."
|
|
||||||
# define va_copy(dst,src) ((dst)=(src))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int vasprintf (char **lineptr, const char *format, va_list va)
|
|
||||||
{
|
|
||||||
int sz=128,n;
|
|
||||||
char *line=malloc(sz);
|
|
||||||
va_list vasave;
|
|
||||||
|
|
||||||
if(!line) return -1;
|
|
||||||
|
|
||||||
va_copy(vasave,va);
|
|
||||||
n=vsnprintf(line,sz,format,va);
|
|
||||||
|
|
||||||
if(n>=sz) {
|
|
||||||
/* retry with a right sized buffer, needs glibc 2.1 or higher to work */
|
|
||||||
sz=n+1;
|
|
||||||
{
|
|
||||||
char *tmp=realloc(line,sz);
|
|
||||||
if(tmp) {
|
|
||||||
line=tmp;
|
|
||||||
n=vsnprintf(line,sz,format,vasave);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
n= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
va_end(vasave);
|
|
||||||
|
|
||||||
if(n>=0)
|
|
||||||
*lineptr=line;
|
|
||||||
else
|
|
||||||
free(line);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_ASPRINTF
|
|
||||||
int asprintf (char **lineptr, const char *format, ...)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
va_list va;
|
|
||||||
|
|
||||||
va_start(va,format);
|
|
||||||
n=vasprintf(lineptr,format,va);
|
|
||||||
va_end(va);
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_INET_NTOP
|
|
||||||
const char *inet_ntop(int af, const void *src, char *dst, size_t size)
|
|
||||||
{
|
|
||||||
const char *rc = NULL;
|
|
||||||
|
|
||||||
if (src != NULL && dst != NULL && size > 0) {
|
|
||||||
switch (af) {
|
|
||||||
case AF_INET:
|
|
||||||
{
|
|
||||||
const unsigned char *p=src;
|
|
||||||
int n = snprintf(dst, size, "%u.%u.%u.%u",
|
|
||||||
p[0],p[1],p[2],p[3]);
|
|
||||||
if (n >= 0 && n < size) rc = dst;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef AF_INET6
|
|
||||||
case AF_INET6:
|
|
||||||
{
|
|
||||||
const unsigned char *p=src;
|
|
||||||
unsigned int i,offs=0;
|
|
||||||
for (i=0;i<16;i+=2) {
|
|
||||||
int n=snprintf(dst+offs, size-offs,i==0?"%x":":%x", ((unsigned)p[i]<<8)|p[i+1]);
|
|
||||||
if(n<0) return NULL;
|
|
||||||
offs+=n;
|
|
||||||
if(offs>=size) return NULL;
|
|
||||||
}
|
|
||||||
rc = dst;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,319 +0,0 @@
|
||||||
/* helpers.h - Various helper functions
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2007, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef HELPERS_H
|
|
||||||
#define HELPERS_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "cache.h"
|
|
||||||
#include "pdnsd_assert.h"
|
|
||||||
|
|
||||||
#define SOFTLOCK_MAXTRIES 1000
|
|
||||||
|
|
||||||
int run_as(const char *user);
|
|
||||||
void pdnsd_exit(void);
|
|
||||||
int softlock_mutex(pthread_mutex_t *mutex);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
inline static int isdchar (unsigned char c)
|
|
||||||
{
|
|
||||||
return ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='-'
|
|
||||||
#ifdef UNDERSCORE
|
|
||||||
|| c=='_'
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const unsigned char *rhn2str(const unsigned char *rhn, unsigned char *str, unsigned int size);
|
|
||||||
int str2rhn(const unsigned char *str, unsigned char *rhn);
|
|
||||||
const char *parsestr2rhn(const unsigned char *str, unsigned int len, unsigned char *rhn);
|
|
||||||
|
|
||||||
/* Note added by Paul Rombouts:
|
|
||||||
Compared to the definition used by Thomas Moestl (strlen(rhn)+1), the following definition of rhnlen
|
|
||||||
may yield a different result in certain error situations (when a domain name segment contains a null byte).
|
|
||||||
*/
|
|
||||||
inline static unsigned int rhnlen(const unsigned char *rhn)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static unsigned int rhnlen(const unsigned char *rhn)
|
|
||||||
{
|
|
||||||
unsigned int i=0,lb;
|
|
||||||
|
|
||||||
while((lb=rhn[i++]))
|
|
||||||
i+=lb;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Skip k segments in a name in length-byte string notation. */
|
|
||||||
inline static const unsigned char *skipsegs(const unsigned char *nm, unsigned k)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static const unsigned char *skipsegs(const unsigned char *nm, unsigned k)
|
|
||||||
{
|
|
||||||
unsigned lb;
|
|
||||||
for(;k && (lb= *nm); --k) {
|
|
||||||
nm += lb+1;
|
|
||||||
}
|
|
||||||
return nm;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Skip a name in length-byte string notation and return a pointer to the
|
|
||||||
position right after the terminating null byte.
|
|
||||||
*/
|
|
||||||
inline static unsigned char *skiprhn(unsigned char *rhn)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static unsigned char *skiprhn(unsigned char *rhn)
|
|
||||||
{
|
|
||||||
unsigned lb;
|
|
||||||
|
|
||||||
while((lb= *rhn++))
|
|
||||||
rhn += lb;
|
|
||||||
return rhn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* count the number of name segments of a name in length-byte string notation. */
|
|
||||||
inline static unsigned int rhnsegcnt(const unsigned char *rhn)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static unsigned int rhnsegcnt(const unsigned char *rhn)
|
|
||||||
{
|
|
||||||
unsigned int res=0,lb;
|
|
||||||
|
|
||||||
while((lb= *rhn)) {
|
|
||||||
++res;
|
|
||||||
rhn += lb+1;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int rhncpy(unsigned char *dst, const unsigned char *src);
|
|
||||||
int isnormalencdomname(const unsigned char *rhn, unsigned maxlen);
|
|
||||||
|
|
||||||
inline static int is_inaddr_any(pdnsd_a *a) __attribute__((always_inline));
|
|
||||||
inline static int is_inaddr_any(pdnsd_a *a)
|
|
||||||
{
|
|
||||||
return SEL_IPVER( a->ipv4.s_addr==INADDR_ANY,
|
|
||||||
IN6_IS_ADDR_UNSPECIFIED(&a->ipv6) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline static int same_inaddr(pdnsd_a *a, pdnsd_a *b)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int same_inaddr(pdnsd_a *a, pdnsd_a *b)
|
|
||||||
{
|
|
||||||
return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr,
|
|
||||||
IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compare a pdnsd_a* with a pdnsd_a2*. */
|
|
||||||
inline static int same_inaddr2(pdnsd_a *a, pdnsd_a2 *b)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int same_inaddr2(pdnsd_a *a, pdnsd_a2 *b)
|
|
||||||
{
|
|
||||||
return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr,
|
|
||||||
IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) && b->ipv4.s_addr==INADDR_ANY );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static int equiv_inaddr2(pdnsd_a *a, pdnsd_a2 *b)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int equiv_inaddr2(pdnsd_a *a, pdnsd_a2 *b)
|
|
||||||
{
|
|
||||||
return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr,
|
|
||||||
IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) ||
|
|
||||||
(b->ipv4.s_addr!=INADDR_ANY && ADDR_EQUIV6_4(&a->ipv6,&b->ipv4)) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int str2pdnsd_a(const char *addr, pdnsd_a *a);
|
|
||||||
const char *pdnsd_a2str(pdnsd_a *a, char *buf, int maxlen);
|
|
||||||
|
|
||||||
int init_rng(void);
|
|
||||||
#ifdef RANDOM_DEVICE
|
|
||||||
extern FILE *rand_file;
|
|
||||||
/* Because this is usually empty, it is now defined as a macro to save overhead.*/
|
|
||||||
#define free_rng() {if (rand_file) fclose(rand_file);}
|
|
||||||
#else
|
|
||||||
#define free_rng()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned short get_rand16(void);
|
|
||||||
|
|
||||||
int fsprintf(int fd, const char *format, ...) printfunc(2, 3);
|
|
||||||
#if !defined(CPP_C99_VARIADIC_MACROS)
|
|
||||||
/* GNU C Macro Varargs style. */
|
|
||||||
# define fsprintf_or_return(args...) {int _retval; if((_retval=fsprintf(args))<0) return _retval;}
|
|
||||||
#else
|
|
||||||
/* ANSI C99 style variadic macro. */
|
|
||||||
# define fsprintf_or_return(...) {int _retval; if((_retval=fsprintf(__VA_ARGS__))<0) return _retval;}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Added by Paul Rombouts */
|
|
||||||
inline static ssize_t write_all(int fd,const void *data,size_t n)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static ssize_t write_all(int fd,const void *data,size_t n)
|
|
||||||
{
|
|
||||||
ssize_t written=0;
|
|
||||||
|
|
||||||
while(written<n) {
|
|
||||||
ssize_t m=write(fd,(const void*)(((const char*)data)+written),n-written);
|
|
||||||
|
|
||||||
if(m<0)
|
|
||||||
return m;
|
|
||||||
|
|
||||||
written+=m;
|
|
||||||
}
|
|
||||||
|
|
||||||
return written;
|
|
||||||
}
|
|
||||||
|
|
||||||
void hexdump(const void *data, int dlen, char *buf, int buflen);
|
|
||||||
int escapestr(const char *in, int ilen, char *str, int size);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
inline static int stricomp(const char *a, const char *b)
|
|
||||||
{
|
|
||||||
return !strcasecmp(a,b);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* compare two names in length byte - string format
|
|
||||||
rhnicmp returns 1 if the names are the same (ignoring upper/lower case),
|
|
||||||
0 otherwise.
|
|
||||||
*/
|
|
||||||
inline static int rhnicmp(const unsigned char *a, const unsigned char *b)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int rhnicmp(const unsigned char *a, const unsigned char *b)
|
|
||||||
{
|
|
||||||
unsigned int i=0;
|
|
||||||
unsigned char lb;
|
|
||||||
for(;;) {
|
|
||||||
lb=a[i];
|
|
||||||
if(lb!=b[i]) return 0;
|
|
||||||
if(!lb) break;
|
|
||||||
++i;
|
|
||||||
do {
|
|
||||||
if(tolower(a[i])!=tolower(b[i])) return 0;
|
|
||||||
++i;
|
|
||||||
} while(--lb);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bah. I want strlcpy. */
|
|
||||||
inline static int strncp(char *dst, const char *src, size_t dstsz)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int strncp(char *dst, const char *src, size_t dstsz)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_STRLCPY
|
|
||||||
return (strlcpy(dst,src,dstsz)<dstsz);
|
|
||||||
#else
|
|
||||||
#ifdef HAVE_STPNCPY
|
|
||||||
char *p=stpncpy(dst,src,dstsz);
|
|
||||||
if(p<dst+dstsz) return 1;
|
|
||||||
*(p-1)='\0';
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
strncpy(dst,src,dstsz);
|
|
||||||
if(strlen(src)<dstsz) return 1;
|
|
||||||
dst[dstsz-1]='\0';
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef HAVE_STRDUP
|
|
||||||
inline static char *strdup(const char *s)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static char *strdup(const char *s)
|
|
||||||
{
|
|
||||||
size_t sz=strlen(s)+1;
|
|
||||||
char *cp=malloc(sz);
|
|
||||||
if(cp)
|
|
||||||
memcpy(cp,s,sz);
|
|
||||||
return cp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_STRNDUP
|
|
||||||
/* This version may allocate a buffer that is unnecessarily large,
|
|
||||||
but I'm always going to use it with n<strlen(s)
|
|
||||||
*/
|
|
||||||
inline static char *strndup(const char *s, size_t n)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static char *strndup(const char *s, size_t n)
|
|
||||||
{
|
|
||||||
char *cp;
|
|
||||||
cp=malloc(n+1);
|
|
||||||
if(cp) {
|
|
||||||
memcpy(cp,s,n);
|
|
||||||
cp[n]='\0';
|
|
||||||
}
|
|
||||||
return cp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_STPCPY
|
|
||||||
inline static char *stpcpy (char *dest, const char *src)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static char *stpcpy (char *dest, const char *src)
|
|
||||||
{
|
|
||||||
register char *d = dest;
|
|
||||||
register const char *s = src;
|
|
||||||
|
|
||||||
while ((*d++ = *s++) != '\0');
|
|
||||||
|
|
||||||
return d - 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_MEMPCPY
|
|
||||||
inline static void *mempcpy(void *dest, const void *src, size_t len)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *mempcpy(void *dest, const void *src, size_t len)
|
|
||||||
{
|
|
||||||
memcpy(dest,src,len);
|
|
||||||
return ((char *)dest)+len;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_GETLINE
|
|
||||||
int getline(char **lineptr, size_t *n, FILE *stream);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_ASPRINTF
|
|
||||||
int asprintf (char **lineptr, const char *format, ...);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_VASPRINTF
|
|
||||||
#include <stdarg.h>
|
|
||||||
int vasprintf (char **lineptr, const char *format, va_list va);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_INET_NTOP
|
|
||||||
const char *inet_ntop(int af, const void *src, char *dst, size_t size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define strlitlen(strlit) (sizeof(strlit)-1)
|
|
||||||
|
|
||||||
#endif /* HELPERS_H */
|
|
|
@ -1,544 +0,0 @@
|
||||||
/* icmp.c - Server response tests using ICMP echo requests
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2005, 2007, 2012 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This should now work on both Linux and FreeBSD (and CYGWIN?). If anyone
|
|
||||||
* with experience in other Unix flavors wants to contribute platform-specific
|
|
||||||
* code, he is very welcome.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#ifdef HAVE_SYS_POLL_H
|
|
||||||
#include <sys/poll.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
# include <netinet/ip.h>
|
|
||||||
# include <linux/types.h>
|
|
||||||
# include <linux/icmp.h>
|
|
||||||
#elif (TARGET==TARGET_BSD)
|
|
||||||
# include <netinet/in_systm.h>
|
|
||||||
# include <netinet/ip.h>
|
|
||||||
# include <netinet/ip_icmp.h>
|
|
||||||
#elif (TARGET==TARGET_CYGWIN)
|
|
||||||
# include <netinet/ip.h>
|
|
||||||
# include <netinet/in_systm.h>
|
|
||||||
# include <netinet/ip_icmp.h>
|
|
||||||
# include "freebsd_netinet_ip_icmp.h"
|
|
||||||
#else
|
|
||||||
# error Unsupported platform!
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
# include <netinet/ip6.h>
|
|
||||||
# include <netinet/icmp6.h>
|
|
||||||
#endif
|
|
||||||
#include <netdb.h>
|
|
||||||
#include "icmp.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "servers.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define ICMP_MAX_ERRS 10
|
|
||||||
static volatile unsigned long icmp_errs=0; /* This is only here to minimize log output.
|
|
||||||
Since the consequences of a race is only
|
|
||||||
one log message more/less (out of
|
|
||||||
ICMP_MAX_ERRS), no lock is required. */
|
|
||||||
|
|
||||||
volatile int ping_isocket=-1;
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
volatile int ping6_isocket=-1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* different names, same thing... be careful, as these are macros... */
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
# define ip_saddr saddr
|
|
||||||
# define ip_daddr daddr
|
|
||||||
# define ip_hl ihl
|
|
||||||
# define ip_p protocol
|
|
||||||
#else
|
|
||||||
# define icmphdr icmp
|
|
||||||
# define iphdr ip
|
|
||||||
# define ip_saddr ip_src.s_addr
|
|
||||||
# define ip_daddr ip_dst.s_addr
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
# define icmp_type type
|
|
||||||
# define icmp_code code
|
|
||||||
# define icmp_cksum checksum
|
|
||||||
# define icmp_id un.echo.id
|
|
||||||
# define icmp_seq un.echo.sequence
|
|
||||||
#else
|
|
||||||
# define ICMP_DEST_UNREACH ICMP_UNREACH
|
|
||||||
# define ICMP_TIME_EXCEEDED ICMP_TIMXCEED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ICMP_BASEHDR_LEN 8
|
|
||||||
#define ICMP4_ECHO_LEN ICMP_BASEHDR_LEN
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)
|
|
||||||
/*
|
|
||||||
* These are the ping implementations for Linux/FreeBSD in their IPv4/ICMPv4 and IPv6/ICMPv6 versions.
|
|
||||||
* I know they share some code, but I'd rather keep them separated in some parts, as some
|
|
||||||
* things might go in different directions there.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Initialize the sockets for pinging */
|
|
||||||
void init_ping_socket()
|
|
||||||
{
|
|
||||||
if ((ping_isocket=socket(PF_INET, SOCK_RAW, IPPROTO_ICMP))==-1) {
|
|
||||||
log_warn("icmp ping: socket() failed: %s",strerror(errno));
|
|
||||||
}
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
if (!run_ipv4) {
|
|
||||||
/* Failure to initialize the IPv4 ping socket is not
|
|
||||||
necessarily a problem, as long as the IPv6 version works. */
|
|
||||||
if ((ping6_isocket=socket(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6))==-1) {
|
|
||||||
log_warn("icmpv6 ping: socket() failed: %s",strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Takes a packet as send out and a received ICMP packet and looks whether the ICMP packet is
|
|
||||||
* an error reply on the sent-out one. packet is only the packet (without IP header).
|
|
||||||
* errmsg includes an IP header.
|
|
||||||
* to is the destination address of the original packet (the only thing that is actually
|
|
||||||
* compared of the IP header). The RFC says that we get at least 8 bytes of the offending packet.
|
|
||||||
* We do not compare more, as this is all we need.*/
|
|
||||||
static int icmp4_errcmp(char *packet, int plen, struct in_addr *to, char *errmsg, int elen, int errtype)
|
|
||||||
{
|
|
||||||
struct iphdr iph;
|
|
||||||
struct icmphdr icmph;
|
|
||||||
struct iphdr eiph;
|
|
||||||
char *data;
|
|
||||||
|
|
||||||
/* XXX: lots of memcpy to avoid unaligned accesses on alpha */
|
|
||||||
if (elen<sizeof(struct iphdr))
|
|
||||||
return 0;
|
|
||||||
memcpy(&iph,errmsg,sizeof(iph));
|
|
||||||
if (iph.ip_p!=IPPROTO_ICMP || elen<iph.ip_hl*4+ICMP_BASEHDR_LEN+sizeof(eiph))
|
|
||||||
return 0;
|
|
||||||
PDNSD_ASSERT(sizeof(icmph) >= ICMP_BASEHDR_LEN, "icmp4_errcmp: ICMP_BASEHDR_LEN botched");
|
|
||||||
memcpy(&icmph,errmsg+iph.ip_hl*4,ICMP_BASEHDR_LEN);
|
|
||||||
memcpy(&eiph,errmsg+iph.ip_hl*4+ICMP_BASEHDR_LEN,sizeof(eiph));
|
|
||||||
if (elen<iph.ip_hl*4+ICMP_BASEHDR_LEN+eiph.ip_hl*4+8)
|
|
||||||
return 0;
|
|
||||||
data=errmsg+iph.ip_hl*4+ICMP_BASEHDR_LEN+eiph.ip_hl*4;
|
|
||||||
return icmph.icmp_type==errtype && memcmp(&to->s_addr, &eiph.ip_daddr, sizeof(to->s_addr))==0 &&
|
|
||||||
memcmp(data, packet, plen<8?plen:8)==0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* IPv4/ICMPv4 ping. Called from ping (see below) */
|
|
||||||
static int ping4(struct in_addr addr, int timeout, int rep)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int isock;
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
struct icmp_filter f;
|
|
||||||
#endif
|
|
||||||
unsigned short id=(unsigned short)get_rand16(); /* randomize a ping id */
|
|
||||||
|
|
||||||
isock=ping_isocket;
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
/* Fancy ICMP filering -- only on Linux (as far is I know) */
|
|
||||||
|
|
||||||
/* In fact, there should be macros for treating icmp_filter, but I haven't found them in Linux 2.2.15.
|
|
||||||
* So, set it manually and unportable ;-) */
|
|
||||||
/* This filter lets ECHO_REPLY (0), DEST_UNREACH(3) and TIME_EXCEEDED(11) pass. */
|
|
||||||
/* !(0000 1000 0000 1001) = 0xff ff f7 f6 */
|
|
||||||
f.data=0xfffff7f6;
|
|
||||||
if (setsockopt(isock,SOL_RAW,ICMP_FILTER,&f,sizeof(f))==-1) {
|
|
||||||
if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_warn("icmp ping: setsockopt() failed: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i=0;i<rep;i++) {
|
|
||||||
struct sockaddr_in from,to;
|
|
||||||
struct icmphdr icmpd;
|
|
||||||
unsigned long sum;
|
|
||||||
uint16_t *ptr;
|
|
||||||
long tm,tpassed;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
icmpd.icmp_type=ICMP_ECHO;
|
|
||||||
icmpd.icmp_code=0;
|
|
||||||
icmpd.icmp_cksum=0;
|
|
||||||
icmpd.icmp_id=htons((uint16_t)id);
|
|
||||||
icmpd.icmp_seq=htons((uint16_t)i);
|
|
||||||
|
|
||||||
/* Checksumming - Algorithm taken from nmap. Thanks... */
|
|
||||||
|
|
||||||
ptr=(uint16_t *)&icmpd;
|
|
||||||
sum=0;
|
|
||||||
|
|
||||||
for (j=0;j<4;j++) {
|
|
||||||
sum+=*ptr++;
|
|
||||||
}
|
|
||||||
sum = (sum >> 16) + (sum & 0xffff);
|
|
||||||
sum += (sum >> 16);
|
|
||||||
icmpd.icmp_cksum=~sum;
|
|
||||||
|
|
||||||
memset(&to,0,sizeof(to));
|
|
||||||
to.sin_family=AF_INET;
|
|
||||||
to.sin_port=0;
|
|
||||||
to.sin_addr=addr;
|
|
||||||
SET_SOCKA_LEN4(to);
|
|
||||||
if (sendto(isock,&icmpd,ICMP4_ECHO_LEN,0,(struct sockaddr *)&to,sizeof(to))==-1) {
|
|
||||||
if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_warn("icmp ping: sendto() failed: %s.",strerror(errno));
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* listen for reply. */
|
|
||||||
tm=time(NULL); tpassed=0;
|
|
||||||
do {
|
|
||||||
int psres;
|
|
||||||
#ifdef NO_POLL
|
|
||||||
fd_set fds,fdse;
|
|
||||||
struct timeval tv;
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
PDNSD_ASSERT(isock<FD_SETSIZE,"socket file descriptor exceeds FD_SETSIZE.");
|
|
||||||
FD_SET(isock, &fds);
|
|
||||||
fdse=fds;
|
|
||||||
tv.tv_usec=0;
|
|
||||||
tv.tv_sec=timeout>tpassed?timeout-tpassed:0;
|
|
||||||
/* There is a possible race condition with the arrival of a signal here,
|
|
||||||
but it is so unlikely to be a problem in practice that the effort
|
|
||||||
to do this properly is not worth the trouble.
|
|
||||||
*/
|
|
||||||
if(is_interrupted_servstat_thread()) {
|
|
||||||
DEBUG_MSG("server status thread interrupted.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
psres=select(isock+1,&fds,NULL,&fdse,&tv);
|
|
||||||
#else
|
|
||||||
struct pollfd pfd;
|
|
||||||
pfd.fd=isock;
|
|
||||||
pfd.events=POLLIN;
|
|
||||||
/* There is a possible race condition with the arrival of a signal here,
|
|
||||||
but it is so unlikely to be a problem in practice that the effort
|
|
||||||
to do this properly is not worth the trouble.
|
|
||||||
*/
|
|
||||||
if(is_interrupted_servstat_thread()) {
|
|
||||||
DEBUG_MSG("server status thread interrupted.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
psres=poll(&pfd,1,timeout>tpassed?(timeout-tpassed)*1000:0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (psres<0) {
|
|
||||||
if(errno==EINTR && is_interrupted_servstat_thread()) {
|
|
||||||
DEBUG_MSG("poll/select interrupted in server status thread.\n");
|
|
||||||
}
|
|
||||||
else if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_warn("poll/select failed: %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (psres==0) /* timed out */
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef NO_POLL
|
|
||||||
if (FD_ISSET(isock,&fds) || FD_ISSET(isock,&fdse))
|
|
||||||
#else
|
|
||||||
if (pfd.revents&(POLLIN|POLLERR))
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char buf[1024];
|
|
||||||
socklen_t sl=sizeof(from);
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if ((len=recvfrom(isock,&buf,sizeof(buf),0,(struct sockaddr *)&from,&sl))!=-1) {
|
|
||||||
if (len>sizeof(struct iphdr)) {
|
|
||||||
struct iphdr iph;
|
|
||||||
|
|
||||||
memcpy(&iph, buf, sizeof(iph));
|
|
||||||
if (len-iph.ip_hl*4>=ICMP_BASEHDR_LEN) {
|
|
||||||
struct icmphdr icmpp;
|
|
||||||
|
|
||||||
memcpy(&icmpp, ((uint32_t *)buf)+iph.ip_hl, sizeof(icmpp));
|
|
||||||
if (iph.ip_saddr==addr.s_addr && icmpp.icmp_type==ICMP_ECHOREPLY &&
|
|
||||||
ntohs(icmpp.icmp_id)==id && ntohs(icmpp.icmp_seq)<=i) {
|
|
||||||
return (i-ntohs(icmpp.icmp_seq))*timeout+(time(NULL)-tm); /* return the number of ticks */
|
|
||||||
} else {
|
|
||||||
/* No regular echo reply. Maybe an error? */
|
|
||||||
if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_DEST_UNREACH) ||
|
|
||||||
icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_TIME_EXCEEDED)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return -1; /* error */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_error("Unhandled poll/select event in ping4() at %s, line %d.",__FILE__,__LINE__);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
tpassed=time(NULL)-tm;
|
|
||||||
} while (tpassed<timeout);
|
|
||||||
}
|
|
||||||
return -1; /* no answer */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
|
|
||||||
/* Takes a packet as send out and a received ICMPv6 packet and looks whether the ICMPv6 packet is
|
|
||||||
* an error reply on the sent-out one. packet is only the packet (without IPv6 header).
|
|
||||||
* errmsg does not include an IPv6 header. to is the address the sent packet went to.
|
|
||||||
* This is specialized for icmpv6: It zeros out the checksum field, which is filled in
|
|
||||||
* by the kernel, and expects that the checksum field in the sent-out packet is zeroed out too
|
|
||||||
* We need a little magic to parse the answer, as there could be extension headers present, end
|
|
||||||
* we don't know their length a priori.*/
|
|
||||||
static int icmp6_errcmp(char *packet, int plen, struct in6_addr *to, char *errmsg, int elen, int errtype)
|
|
||||||
{
|
|
||||||
struct icmp6_hdr icmph;
|
|
||||||
struct ip6_hdr eiph;
|
|
||||||
struct ip6_hbh hbh;
|
|
||||||
char *data;
|
|
||||||
int rlen,nxt;
|
|
||||||
|
|
||||||
/* XXX: lots of memcpy here to avoid unaligned access faults on alpha */
|
|
||||||
if (elen<sizeof(icmph)+sizeof(eiph))
|
|
||||||
return 0;
|
|
||||||
memcpy(&icmph,errmsg,sizeof(icmph));
|
|
||||||
memcpy(&eiph,errmsg+sizeof(icmph),sizeof(eiph));
|
|
||||||
if (!IN6_ARE_ADDR_EQUAL(&eiph.ip6_dst, to))
|
|
||||||
return 0;
|
|
||||||
rlen=elen-sizeof(icmph)-sizeof(eiph);
|
|
||||||
data=errmsg+sizeof(icmph)+sizeof(eiph);
|
|
||||||
nxt=eiph.ip6_nxt;
|
|
||||||
/* Now, jump over any known option header that might be present, and then
|
|
||||||
* try to compare the packets. */
|
|
||||||
while (nxt!=IPPROTO_ICMPV6) {
|
|
||||||
/* Those are the headers we understand. */
|
|
||||||
if (nxt!=IPPROTO_HOPOPTS && nxt!=IPPROTO_ROUTING && nxt!=IPPROTO_DSTOPTS)
|
|
||||||
return 0;
|
|
||||||
if (rlen<sizeof(hbh))
|
|
||||||
return 0;
|
|
||||||
memcpy(&hbh,data,sizeof(hbh));
|
|
||||||
if (rlen<hbh.ip6h_len)
|
|
||||||
return 0;
|
|
||||||
rlen-=hbh.ip6h_len;
|
|
||||||
nxt=hbh.ip6h_nxt;
|
|
||||||
data+=hbh.ip6h_len;
|
|
||||||
}
|
|
||||||
if (rlen<sizeof(struct icmp6_hdr))
|
|
||||||
return 0;
|
|
||||||
/* Zero out the checksum of the enclosed ICMPv6 header, it is kernel-filled in the original data */
|
|
||||||
memset(((char *)data)+offsetof(struct icmp6_hdr,icmp6_cksum),0,sizeof(icmph.icmp6_cksum));
|
|
||||||
return icmph.icmp6_type==errtype && memcmp(data, packet, plen<rlen?plen:rlen)==0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* IPv6/ICMPv6 ping. Called from ping (see below) */
|
|
||||||
static int ping6(struct in6_addr a, int timeout, int rep)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
/* int ck_offs=2;*/
|
|
||||||
int isock;
|
|
||||||
struct icmp6_filter f;
|
|
||||||
unsigned short id=(unsigned short)(rand()&0xffff); /* randomize a ping id */
|
|
||||||
|
|
||||||
isock=ping6_isocket;
|
|
||||||
|
|
||||||
ICMP6_FILTER_SETBLOCKALL(&f);
|
|
||||||
ICMP6_FILTER_SETPASS(ICMP6_ECHO_REPLY,&f);
|
|
||||||
ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH,&f);
|
|
||||||
ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED,&f);
|
|
||||||
|
|
||||||
if (setsockopt(isock,IPPROTO_ICMPV6,ICMP6_FILTER,&f,sizeof(f))==-1) {
|
|
||||||
if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_warn("icmpv6 ping: setsockopt() failed: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0;i<rep;i++) {
|
|
||||||
struct sockaddr_in6 from;
|
|
||||||
struct icmp6_hdr icmpd;
|
|
||||||
long tm,tpassed;
|
|
||||||
|
|
||||||
icmpd.icmp6_type=ICMP6_ECHO_REQUEST;
|
|
||||||
icmpd.icmp6_code=0;
|
|
||||||
icmpd.icmp6_cksum=0; /* The friendly kernel does fill that in for us. */
|
|
||||||
icmpd.icmp6_id=htons((uint16_t)id);
|
|
||||||
icmpd.icmp6_seq=htons((uint16_t)i);
|
|
||||||
|
|
||||||
memset(&from,0,sizeof(from));
|
|
||||||
from.sin6_family=AF_INET6;
|
|
||||||
from.sin6_flowinfo=IPV6_FLOWINFO;
|
|
||||||
from.sin6_port=0;
|
|
||||||
from.sin6_addr=a;
|
|
||||||
SET_SOCKA_LEN6(from);
|
|
||||||
if (sendto(isock,&icmpd,sizeof(icmpd),0,(struct sockaddr *)&from,sizeof(from))==-1) {
|
|
||||||
if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_warn("icmpv6 ping: sendto() failed: %s.",strerror(errno));
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* listen for reply. */
|
|
||||||
tm=time(NULL); tpassed=0;
|
|
||||||
do {
|
|
||||||
int psres;
|
|
||||||
#ifdef NO_POLL
|
|
||||||
fd_set fds,fdse;
|
|
||||||
struct timeval tv;
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
PDNSD_ASSERT(isock<FD_SETSIZE,"socket file descriptor exceeds FD_SETSIZE.");
|
|
||||||
FD_SET(isock, &fds);
|
|
||||||
fdse=fds;
|
|
||||||
tv.tv_usec=0;
|
|
||||||
tv.tv_sec=timeout>tpassed?timeout-tpassed:0;
|
|
||||||
/* There is a possible race condition with the arrival of a signal here,
|
|
||||||
but it is so unlikely to be a problem in practice that the effort
|
|
||||||
to do this properly is not worth the trouble.
|
|
||||||
*/
|
|
||||||
if(is_interrupted_servstat_thread()) {
|
|
||||||
DEBUG_MSG("server status thread interrupted.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
psres=select(isock+1,&fds,NULL,&fdse,&tv);
|
|
||||||
#else
|
|
||||||
struct pollfd pfd;
|
|
||||||
pfd.fd=isock;
|
|
||||||
pfd.events=POLLIN;
|
|
||||||
/* There is a possible race condition with the arrival of a signal here,
|
|
||||||
but it is so unlikely to be a problem in practice that the effort
|
|
||||||
to do this properly is not worth the trouble.
|
|
||||||
*/
|
|
||||||
if(is_interrupted_servstat_thread()) {
|
|
||||||
DEBUG_MSG("server status thread interrupted.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
psres=poll(&pfd,1,timeout>tpassed?(timeout-tpassed)*1000:0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (psres<0) {
|
|
||||||
if(errno==EINTR && is_interrupted_servstat_thread()) {
|
|
||||||
DEBUG_MSG("poll/select interrupted in server status thread.\n");
|
|
||||||
}
|
|
||||||
else if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_warn("poll/select failed: %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (psres==0) /* timed out */
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef NO_POLL
|
|
||||||
if (FD_ISSET(isock,&fds) || FD_ISSET(isock,&fdse))
|
|
||||||
#else
|
|
||||||
if (pfd.revents&(POLLIN|POLLERR))
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char buf[1024];
|
|
||||||
socklen_t sl=sizeof(from);
|
|
||||||
int len;
|
|
||||||
if ((len=recvfrom(isock,&buf,sizeof(buf),0,(struct sockaddr *)&from,&sl))!=-1) {
|
|
||||||
if (len>=sizeof(struct icmp6_hdr)) {
|
|
||||||
/* we get packets without IPv6 header, luckily */
|
|
||||||
struct icmp6_hdr icmpp;
|
|
||||||
|
|
||||||
memcpy(&icmpp, buf, sizeof(icmpp));
|
|
||||||
if (IN6_ARE_ADDR_EQUAL(&from.sin6_addr,&a) &&
|
|
||||||
ntohs(icmpp.icmp6_id)==id && ntohs(icmpp.icmp6_seq)<=i) {
|
|
||||||
return (i-ntohs(icmpp.icmp6_seq))*timeout+(time(NULL)-tm); /* return the number of ticks */
|
|
||||||
} else {
|
|
||||||
/* No regular echo reply. Maybe an error? */
|
|
||||||
if (icmp6_errcmp((char *)&icmpd, sizeof(icmpd), &from.sin6_addr, buf, len, ICMP6_DST_UNREACH) ||
|
|
||||||
icmp6_errcmp((char *)&icmpd, sizeof(icmpd), &from.sin6_addr, buf, len, ICMP6_TIME_EXCEEDED)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return -1; /* error */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (++icmp_errs<=ICMP_MAX_ERRS) {
|
|
||||||
log_error("Unhandled poll/select event in ping6() at %s, line %d.",__FILE__,__LINE__);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
tpassed=time(NULL)-tm;
|
|
||||||
} while (tpassed<timeout);
|
|
||||||
}
|
|
||||||
return -1; /* no answer */
|
|
||||||
}
|
|
||||||
#endif /* ENABLE_IPV6*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Perform an icmp ping on a host, returning -1 on timeout or
|
|
||||||
* "host unreachable" or the ping time in 10ths of secs
|
|
||||||
* (but actually, we are not that accurate any more).
|
|
||||||
* timeout in 10ths of seconds, rep is the repetition count
|
|
||||||
*/
|
|
||||||
int ping(pdnsd_a *addr, int timeout, int rep)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (SEL_IPVER(ping_isocket,ping6_isocket) == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* We were given a timeout in 10ths of seconds,
|
|
||||||
but ping4 and ping6 want a timeout in seconds. */
|
|
||||||
timeout /= 10;
|
|
||||||
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
if (run_ipv4)
|
|
||||||
return ping4(addr->ipv4,timeout,rep);
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
ELSE_IPV6 {
|
|
||||||
/* If it is a IPv4 mapped IPv6 address, we prefer ICMPv4. */
|
|
||||||
if (ping_isocket!=-1 && IN6_IS_ADDR_V4MAPPED(&addr->ipv6)) {
|
|
||||||
struct in_addr v4;
|
|
||||||
v4.s_addr=((uint32_t *)&addr->ipv6)[3];
|
|
||||||
return ping4(v4,timeout,rep);
|
|
||||||
} else
|
|
||||||
return ping6(addr->ipv6,timeout,rep);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
# error "Huh! No OS macro defined!"
|
|
||||||
#endif /*(TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)*/
|
|
|
@ -1,43 +0,0 @@
|
||||||
/* icmp.h - Server response tests using ICMP echo requests
|
|
||||||
Copyright (C) 2000 Thomas Moestl
|
|
||||||
Copyright (C) 2007 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ICMP_H
|
|
||||||
#define ICMP_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
|
|
||||||
volatile extern int ping_isocket;
|
|
||||||
volatile extern int ping6_isocket;
|
|
||||||
|
|
||||||
/* initialize a socket for pinging */
|
|
||||||
void init_ping_socket(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is a classical ping routine.
|
|
||||||
* timeout in 10ths of seconds, rep is the repetition count.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int ping(pdnsd_a *addr, int timeout, int rep);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,297 +0,0 @@
|
||||||
/* ipvers.h - definitions for IPv4 and IPv6
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2003, 2007, 2009 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef IPVERS_H
|
|
||||||
#define IPVERS_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include "rr_types.h"
|
|
||||||
|
|
||||||
#if defined(ENABLE_IPV4) && !defined(ENABLE_IPV6)
|
|
||||||
# ifdef DEFAULT_IPV4
|
|
||||||
# undef DEFAULT_IPV4
|
|
||||||
# endif
|
|
||||||
# define DEFAULT_IPV4 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
# ifdef DEFAULT_IPV4
|
|
||||||
# undef DEFAULT_IPV4
|
|
||||||
# endif
|
|
||||||
# define DEFAULT_IPV4 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
# define ELSE_IPV6 else
|
|
||||||
#else
|
|
||||||
# define ELSE_IPV6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* From main.c */
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
# ifdef ENABLE_IPV6
|
|
||||||
extern short int run_ipv4;
|
|
||||||
extern short int cmdlineipv;
|
|
||||||
# define SEL_IPVER(a4,a6) (run_ipv4? a4: a6)
|
|
||||||
# else
|
|
||||||
# define run_ipv4 1
|
|
||||||
# define SEL_IPVER(a4,a6) (a4)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define run_ipv4 0
|
|
||||||
# define SEL_IPVER(a4,a6) (a6)
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
#define DEFAULT_IPV4_6_PREFIX "::ffff:0.0.0.0"
|
|
||||||
/* extern short int cmdlineprefix; */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX) && !defined(HAVE_STRUCT_IN_PKTINFO)
|
|
||||||
struct in_pktinfo
|
|
||||||
{
|
|
||||||
int ipi_ifindex;
|
|
||||||
struct in_addr ipi_spec_dst;
|
|
||||||
struct in_addr ipi_addr;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
/* some older glibc versions seem to lack this. */
|
|
||||||
# ifndef IP_PKTINFO
|
|
||||||
# define IP_PKTINFO 8
|
|
||||||
# endif
|
|
||||||
# ifndef CMSG_LEN
|
|
||||||
/* ---- from glibc 2.1.2 */
|
|
||||||
|
|
||||||
/* Ancillary data object manipulation macros. */
|
|
||||||
# if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2
|
|
||||||
# define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
|
|
||||||
# else
|
|
||||||
# define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1))
|
|
||||||
# endif
|
|
||||||
# define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
|
|
||||||
# define CMSG_FIRSTHDR(mhdr) \
|
|
||||||
((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) \
|
|
||||||
? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
|
|
||||||
# define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \
|
|
||||||
& ~(sizeof (size_t) - 1))
|
|
||||||
# define CMSG_SPACE(len) (CMSG_ALIGN (len) \
|
|
||||||
+ CMSG_ALIGN (sizeof (struct cmsghdr)))
|
|
||||||
# define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
|
|
||||||
extern struct cmsghdr *__cmsg_nxthdr __P ((struct msghdr *__mhdr,
|
|
||||||
struct cmsghdr *__cmsg));
|
|
||||||
# ifdef __USE_EXTERN_INLINES
|
|
||||||
# ifndef _EXTERN_INLINE
|
|
||||||
# define _EXTERN_INLINE extern __inline
|
|
||||||
# endif
|
|
||||||
_EXTERN_INLINE struct cmsghdr *
|
|
||||||
__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW
|
|
||||||
{
|
|
||||||
if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
|
|
||||||
/* The kernel header does this so there may be a reason. */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
__cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
|
|
||||||
+ CMSG_ALIGN (__cmsg->cmsg_len));
|
|
||||||
if ((unsigned char *) (__cmsg + 1) >= ((unsigned char *) __mhdr->msg_control
|
|
||||||
+ __mhdr->msg_controllen)
|
|
||||||
|| ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len)
|
|
||||||
>= ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)))
|
|
||||||
/* No more entries. */
|
|
||||||
return 0;
|
|
||||||
return __cmsg;
|
|
||||||
}
|
|
||||||
# endif /* Use `extern inline'. */
|
|
||||||
/* ---- */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENABLE_IPV4) && !defined(SIN_LEN) && (TARGET==TARGET_BSD)
|
|
||||||
# define SIN_LEN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENABLE_IPV6) && (TARGET==TARGET_LINUX)
|
|
||||||
|
|
||||||
/* Some glibc versions (I know of 2.1.2) get this wrong, so we define our own. To be exact, this is fixed
|
|
||||||
* glibc code. */
|
|
||||||
#ifdef IN6_ARE_ADDR_EQUAL
|
|
||||||
# undef IN6_ARE_ADDR_EQUAL
|
|
||||||
#endif
|
|
||||||
#define IN6_ARE_ADDR_EQUAL(a,b) \
|
|
||||||
((((uint32_t *) (a))[0] == ((uint32_t *) (b))[0]) && \
|
|
||||||
(((uint32_t *) (a))[1] == ((uint32_t *) (b))[1]) && \
|
|
||||||
(((uint32_t *) (a))[2] == ((uint32_t *) (b))[2]) && \
|
|
||||||
(((uint32_t *) (a))[3] == ((uint32_t *) (b))[3]))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This is the IPv6 flowid that we pass on to the IPv6 protocol stack. This value was not currently defined
|
|
||||||
* at the time of writing. Should this change, define a appropriate flowinfo here. */
|
|
||||||
#ifndef IPV6_FLOWINFO
|
|
||||||
#define IPV6_FLOWINFO 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* There does not seem to be a function/macro to generate IPv6-mapped IPv4-Adresses. So here comes mine.
|
|
||||||
* Pass an in_addr* and an in6_addr* */
|
|
||||||
#define IPV6_MAPIPV4(a,b) {((uint32_t *)(b))[3]=(a)->s_addr; \
|
|
||||||
((uint32_t *)(b))[2]=htonl(0xffff); \
|
|
||||||
((uint32_t *)(b))[1]=((uint32_t *)(b))[0]=0; }
|
|
||||||
|
|
||||||
/* A macro to extract the pointer to the address of a struct sockaddr (_in or _in6) */
|
|
||||||
|
|
||||||
#define SOCKA_A4(a) ((pdnsd_a *)&((struct sockaddr_in *)(a))->sin_addr)
|
|
||||||
#define SOCKA_A6(a) ((pdnsd_a *)&((struct sockaddr_in6 *)(a))->sin6_addr)
|
|
||||||
|
|
||||||
#define SOCKA_A(a) SEL_IPVER(SOCKA_A4(a),SOCKA_A6(a))
|
|
||||||
#define PDNSD_PF_INET SEL_IPVER(PF_INET,PF_INET6)
|
|
||||||
#define PDNSD_AF_INET SEL_IPVER(AF_INET,AF_INET6)
|
|
||||||
|
|
||||||
/* This is to compare two addresses. This is a macro because it may change due to the more complex IPv6 adressing architecture
|
|
||||||
* (there are, for example, two equivalent addresses of the loopback device)
|
|
||||||
* Pass this two addresses as in_addr or in6_addr. pdnsd_a is ok (it is a union) */
|
|
||||||
|
|
||||||
#define ADDR_EQUIV4(a,b) (((struct in_addr *)(a))->s_addr==((struct in_addr *)(b))->s_addr)
|
|
||||||
#define ADDR_EQUIV6(a,b) IN6_ARE_ADDR_EQUAL(((struct in6_addr *)(a)),((struct in6_addr *)(b)))
|
|
||||||
|
|
||||||
#define ADDR_EQUIV(a,b) SEL_IPVER(ADDR_EQUIV4(a,b), ADDR_EQUIV6(a,b))
|
|
||||||
|
|
||||||
/* Compare an IPv6 adress with an IPv4 one. b should have type struct in_addr*.
|
|
||||||
Note the similarity with the IPV6_MAPIPV4 macro. */
|
|
||||||
#define ADDR_EQUIV6_4(a,b) (((uint32_t *)(a))[3]==(b)->s_addr && \
|
|
||||||
((uint32_t *)(a))[2]==htonl(0xffff) && \
|
|
||||||
((uint32_t *)(a))[1]==0 && \
|
|
||||||
((uint32_t *)(a))[0]==0)
|
|
||||||
|
|
||||||
/* Compare two address a and b in combination with a netmask m.
|
|
||||||
Only the bits coresponding to those set in the netmask are matched, the rest are ignored.
|
|
||||||
Pass in_addr* or in6_addr* arguments, respectively. */
|
|
||||||
#define ADDR4MASK_EQUIV(a,b,m) ((((a)->s_addr^(b)->s_addr)&(m)->s_addr)==0)
|
|
||||||
#define ADDR6MASK_EQUIV(a,b,m) (((((uint32_t *)(a))[0]^((uint32_t *)(b))[0])&((uint32_t *)(m))[0])==0 && \
|
|
||||||
((((uint32_t *)(a))[1]^((uint32_t *)(b))[1])&((uint32_t *)(m))[1])==0 && \
|
|
||||||
((((uint32_t *)(a))[2]^((uint32_t *)(b))[2])&((uint32_t *)(m))[2])==0 && \
|
|
||||||
((((uint32_t *)(a))[3]^((uint32_t *)(b))[3])&((uint32_t *)(m))[3])==0)
|
|
||||||
|
|
||||||
/* See if we need 4.4BSD style sockaddr_* structures and define some macros that set the length field.
|
|
||||||
* The non-4.4BSD behaviour is the only one that is POSIX-conformant.*/
|
|
||||||
#if defined(SIN6_LEN) || defined(SIN_LEN)
|
|
||||||
# define BSD44_SOCKA
|
|
||||||
# define SET_SOCKA_LEN4(socka) (socka.sin_len=sizeof(struct sockaddr_in))
|
|
||||||
# define SET_SOCKA_LEN6(socka) (socka.sin6_len=sizeof(struct sockaddr_in6))
|
|
||||||
#else
|
|
||||||
# define SET_SOCKA_LEN4(socka)
|
|
||||||
# define SET_SOCKA_LEN6(socka)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
# define ADDRSTR_MAXLEN INET6_ADDRSTRLEN
|
|
||||||
#else
|
|
||||||
# ifdef INET_ADDRSTRLEN
|
|
||||||
# define ADDRSTR_MAXLEN INET_ADDRSTRLEN
|
|
||||||
# else
|
|
||||||
# define ADDRSTR_MAXLEN 16
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)
|
|
||||||
# define SOL_IPV6 IPPROTO_IPV6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
# ifndef IPV6_RECVPKTINFO
|
|
||||||
/* This appears to be needed e.g. on Darwin (Mac OS X). */
|
|
||||||
# define IPV6_RECVPKTINFO IPV6_PKTINFO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
struct in_addr ipv4;
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
struct in6_addr ipv6;
|
|
||||||
#endif
|
|
||||||
} pdnsd_a;
|
|
||||||
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
#define PDNSD_A_INITIALIZER {{INADDR_ANY}}
|
|
||||||
#else
|
|
||||||
#define PDNSD_A_INITIALIZER {IN6ADDR_ANY_INIT}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* The pdnsd_a2 type is very similar to pdnsd_a, but can hold
|
|
||||||
both an IPv4 and an IPv6 address at the same time,
|
|
||||||
i.e. a struct instead of a union.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
struct in6_addr ipv6;
|
|
||||||
#endif
|
|
||||||
struct in_addr ipv4;
|
|
||||||
} pdnsd_a2;
|
|
||||||
|
|
||||||
/* Macros/functions for assigning/converting a pdnsd_a* to a pdnsd_a2* type,
|
|
||||||
and vice versa.
|
|
||||||
*/
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
inline static void SET_PDNSD_A2(pdnsd_a2 *a2, pdnsd_a *a) __attribute__((always_inline));
|
|
||||||
inline static void SET_PDNSD_A2(pdnsd_a2 *a2, pdnsd_a *a)
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
if(run_ipv4)
|
|
||||||
a2->ipv4=a->ipv4;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
a2->ipv6=a->ipv6;
|
|
||||||
a2->ipv4.s_addr=INADDR_ANY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
# define SET_PDNSD_A2(a2,a) ((a2)->ipv4=(a)->ipv4)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PDNSD_A2_TO_A(a2) SEL_IPVER(((pdnsd_a *)&(a2)->ipv4),((pdnsd_a *)&(a2)->ipv6))
|
|
||||||
|
|
||||||
/* Do we have sufficient support in the C libraries to allow local AAAA records
|
|
||||||
to be defined? */
|
|
||||||
#if defined(HAVE_STRUCT_IN6_ADDR) && defined(HAVE_INET_PTON)
|
|
||||||
# define ALLOW_LOCAL_AAAA IS_CACHED_AAAA
|
|
||||||
#else
|
|
||||||
# define ALLOW_LOCAL_AAAA 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Used to enter local records */
|
|
||||||
typedef union {
|
|
||||||
struct in_addr ipv4;
|
|
||||||
#if ALLOW_LOCAL_AAAA
|
|
||||||
struct in6_addr ipv6;
|
|
||||||
#endif
|
|
||||||
} pdnsd_ca;
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,171 +0,0 @@
|
||||||
/* list.c - Dynamic array and list handling
|
|
||||||
|
|
||||||
Copyright (C) 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2007, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "list.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Grow a dynamic array to hold one extra element.
|
|
||||||
This could be done using da_resize(), but this is such a common operation
|
|
||||||
it is has been given its own optimized implementation.
|
|
||||||
da_grow1() returns a pointer to the new (possibly reallocated) array if
|
|
||||||
successful, otherwise it frees the old array (after freeing all the array
|
|
||||||
elements if a clean-up routine is supplied) and returns NULL.
|
|
||||||
*/
|
|
||||||
darray da_grow1(darray a, size_t headsz, size_t elemsz, void (*cleanuproutine) (void *))
|
|
||||||
{
|
|
||||||
size_t k = (a?a->nel:0);
|
|
||||||
if(!a || (k!=0 && (k&7)==0)) {
|
|
||||||
darray tmp=(darray)realloc(a, headsz+elemsz*(k+8));
|
|
||||||
if (!tmp && a) {
|
|
||||||
if(cleanuproutine) {
|
|
||||||
size_t i;
|
|
||||||
for(i=0;i<k;++i)
|
|
||||||
cleanuproutine(((char *)a)+headsz+elemsz*i);
|
|
||||||
}
|
|
||||||
free(a);
|
|
||||||
}
|
|
||||||
a=tmp;
|
|
||||||
}
|
|
||||||
if(a) a->nel=k+1;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static size_t alloc_nel(size_t n)
|
|
||||||
{
|
|
||||||
return n==0 ? 8 : (n+7)&(~7);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* da_resize() allows you to grow (or shrink) a dynamic array to an arbitrary length n,
|
|
||||||
but is otherwise similar to da_grow1().
|
|
||||||
*/
|
|
||||||
darray da_resize(darray a, size_t headsz, size_t elemsz, size_t n, void (*cleanuproutine) (void *))
|
|
||||||
{
|
|
||||||
size_t ael = (a?alloc_nel(a->nel):0);
|
|
||||||
size_t new_ael = alloc_nel(n);
|
|
||||||
if(new_ael != ael) {
|
|
||||||
/* adjust alloced space. */
|
|
||||||
darray tmp=(darray)realloc(a, headsz+elemsz*new_ael);
|
|
||||||
if (!tmp && a) {
|
|
||||||
if(cleanuproutine) {
|
|
||||||
size_t i,k=a->nel;
|
|
||||||
for(i=0;i<k;++i)
|
|
||||||
cleanuproutine(((char *)a)+headsz+elemsz*i);
|
|
||||||
}
|
|
||||||
free(a);
|
|
||||||
}
|
|
||||||
a=tmp;
|
|
||||||
}
|
|
||||||
if(a) a->nel=n;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ALLOC_DEBUG
|
|
||||||
void DBGda_free(darray a, size_t headsz, size_t elemsz, char *file, int line)
|
|
||||||
{
|
|
||||||
if (a==NULL)
|
|
||||||
{DEBUG_MSG("- da_free, %s:%d, not initialized\n", file, line);}
|
|
||||||
else
|
|
||||||
{DEBUG_MSG("- da_free, %s:%d, %lu bytes\n", file, line,
|
|
||||||
(unsigned long)(headsz+elemsz*alloc_nel(a->nel)));}
|
|
||||||
free(a);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define DLISTALIGN(len) (((len) + (sizeof(size_t)-1)) & ~(sizeof(size_t)-1))
|
|
||||||
/* This mask corresponds to a chunk size of 1024. */
|
|
||||||
#define DLISTCHUNKSIZEMASK ((size_t)0x3ff)
|
|
||||||
|
|
||||||
/* Add space for a new item of size len to the list a.
|
|
||||||
dlist_grow() returns a pointer to the new (possibly reallocated) list structure if
|
|
||||||
successful, otherwise it frees the old list and returns NULL.
|
|
||||||
*/
|
|
||||||
dlist dlist_grow(dlist a, size_t len)
|
|
||||||
{
|
|
||||||
size_t sz=0, allocsz=0, szincr, newsz;
|
|
||||||
if(a) {
|
|
||||||
sz=a->last+a->lastsz;
|
|
||||||
allocsz = (sz+DLISTCHUNKSIZEMASK)&(~DLISTCHUNKSIZEMASK);
|
|
||||||
*((size_t *)&a->data[a->last])=a->lastsz;
|
|
||||||
}
|
|
||||||
szincr=DLISTALIGN(len+sizeof(size_t));
|
|
||||||
newsz=sz+szincr;
|
|
||||||
if(newsz>allocsz) {
|
|
||||||
dlist tmp;
|
|
||||||
allocsz = (newsz+DLISTCHUNKSIZEMASK)&(~DLISTCHUNKSIZEMASK);
|
|
||||||
tmp=realloc(a, sizeof(struct _dynamic_list_head)+allocsz);
|
|
||||||
if (!tmp)
|
|
||||||
free(a);
|
|
||||||
a=tmp;
|
|
||||||
}
|
|
||||||
if(a) {
|
|
||||||
a->last=sz;
|
|
||||||
a->lastsz=szincr;
|
|
||||||
*((size_t *)&a->data[sz])=0;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Add a new node, capable of holding data of size len, at the end of a linked list.
|
|
||||||
llist_grow() returns 1 if successful, otherwise it frees the entire linked list
|
|
||||||
and returns 0.
|
|
||||||
*/
|
|
||||||
int llist_grow(llist *a, size_t len)
|
|
||||||
{
|
|
||||||
struct llistnode_s *new= (struct llistnode_s *)malloc(sizeof(struct llistnode_s)+len);
|
|
||||||
|
|
||||||
if(!new) {
|
|
||||||
llist_free(a);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
new->next=NULL;
|
|
||||||
|
|
||||||
if(!a->first)
|
|
||||||
a->first=new;
|
|
||||||
else
|
|
||||||
a->last->next=new;
|
|
||||||
|
|
||||||
a->last=new;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void llist_free(llist *a)
|
|
||||||
{
|
|
||||||
struct llistnode_s *p= a->first;
|
|
||||||
|
|
||||||
while(p) {
|
|
||||||
struct llistnode_s *next= p->next;
|
|
||||||
free(p);
|
|
||||||
p=next;
|
|
||||||
}
|
|
||||||
|
|
||||||
a->first=NULL;
|
|
||||||
a->last= NULL;
|
|
||||||
}
|
|
|
@ -1,170 +0,0 @@
|
||||||
/* list.h - Dynamic array and list handling
|
|
||||||
|
|
||||||
Copyright (C) 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2007, 2009, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LIST_H
|
|
||||||
#define LIST_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "pdnsd_assert.h"
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {size_t nel;} *darray;
|
|
||||||
|
|
||||||
/* used in type declarations */
|
|
||||||
#define DYNAMIC_ARRAY(typ) struct {size_t nel; typ elem[0];}
|
|
||||||
#define DA_TYP_OFFSET(atyp) ((size_t)((atyp)0)->elem)
|
|
||||||
#define DA_OFFSET(a) DA_TYP_OFFSET(typeof (a))
|
|
||||||
|
|
||||||
#define DA_CREATE(atyp,n) ((atyp)da_resize(NULL,DA_TYP_OFFSET(atyp),sizeof(((atyp)0)->elem[0]),n,NULL))
|
|
||||||
#define DA_INDEX(a,i) ((a)->elem[i])
|
|
||||||
/* Used often, so make special-case macro here */
|
|
||||||
#define DA_LAST(a) ((a)->elem[(a)->nel-1])
|
|
||||||
|
|
||||||
#define DA_GROW1(a) ((typeof (a))da_grow1((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]),NULL))
|
|
||||||
#define DA_GROW1_F(a,cleanup) ((typeof (a))da_grow1((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]),cleanup))
|
|
||||||
#define DA_RESIZE(a,n) ((typeof (a))da_resize((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]),n,NULL))
|
|
||||||
#define DA_NEL(a) da_nel((darray)(a))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some or all of these should be inline.
|
|
||||||
* They aren't macros for type safety.
|
|
||||||
*/
|
|
||||||
|
|
||||||
darray da_grow1(darray a, size_t headsz, size_t elemsz, void (*cleanuproutine) (void *));
|
|
||||||
darray da_resize(darray a, size_t headsz, size_t elemsz, size_t n, void (*cleanuproutine) (void *));
|
|
||||||
|
|
||||||
inline static unsigned int da_nel(darray a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static unsigned int da_nel(darray a)
|
|
||||||
{
|
|
||||||
if (a==NULL)
|
|
||||||
return 0;
|
|
||||||
return a->nel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* alloc/free debug code.*/
|
|
||||||
#ifdef ALLOC_DEBUG
|
|
||||||
void DBGda_free(darray a, size_t headsz, size_t elemsz, char *file, int line);
|
|
||||||
#define da_free(a) DBGda_free((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]), __FILE__, __LINE__)
|
|
||||||
#else
|
|
||||||
#define da_free free
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* This dynamic "list" structure is useful if the items are not all the same size.
|
|
||||||
The elements can only be read back in sequential order, not indexed as with the dynamic arrays.
|
|
||||||
*/
|
|
||||||
struct _dynamic_list_head {
|
|
||||||
size_t last,lastsz;
|
|
||||||
char data[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct _dynamic_list_head *dlist;
|
|
||||||
|
|
||||||
inline static void *dlist_first(dlist a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *dlist_first(dlist a)
|
|
||||||
{
|
|
||||||
return a?&a->data[sizeof(size_t)]:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dlist_next() returns a reference to the next item in the list, or NULL is there is no next item.
|
|
||||||
ref should be properly aligned.
|
|
||||||
If the dlist was grown with dlist_grow(), this should be OK.
|
|
||||||
*/
|
|
||||||
inline static void *dlist_next(void *ref)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *dlist_next(void *ref)
|
|
||||||
{
|
|
||||||
size_t incr= *(((size_t *)ref)-1);
|
|
||||||
return incr?((char *)ref)+incr:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dlist_last() returns a reference to the last item. */
|
|
||||||
inline static void *dlist_last(dlist a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *dlist_last(dlist a)
|
|
||||||
{
|
|
||||||
return a?&a->data[a->last+sizeof(size_t)]:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dlist dlist_grow(dlist a, size_t len);
|
|
||||||
|
|
||||||
#define dlist_free free
|
|
||||||
|
|
||||||
|
|
||||||
/* linked list data type. */
|
|
||||||
struct llistnode_s {
|
|
||||||
struct llistnode_s *next;
|
|
||||||
char *data[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct llistnode_s *first, *last;
|
|
||||||
}
|
|
||||||
llist;
|
|
||||||
|
|
||||||
inline static void llist_init(llist *a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void llist_init(llist *a)
|
|
||||||
{
|
|
||||||
a->first=NULL;
|
|
||||||
a->last= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static int llist_isempty(llist *a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static int llist_isempty(llist *a)
|
|
||||||
{
|
|
||||||
return a->first==NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static void *llist_first(llist *a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *llist_first(llist *a)
|
|
||||||
{
|
|
||||||
struct llistnode_s *p= a->first;
|
|
||||||
return p?p->data:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static void *llist_next(void *ref)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *llist_next(void *ref)
|
|
||||||
{
|
|
||||||
struct llistnode_s *next= *(((struct llistnode_s **)ref)-1);
|
|
||||||
return next?next->data:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static void *llist_last(llist *a)
|
|
||||||
__attribute__((always_inline));
|
|
||||||
inline static void *llist_last(llist *a)
|
|
||||||
{
|
|
||||||
struct llistnode_s *p= a->last;
|
|
||||||
return p?p->data:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int llist_grow(llist *a, size_t len);
|
|
||||||
void llist_free(llist *a);
|
|
||||||
|
|
||||||
#endif /* def LIST_H */
|
|
|
@ -1,710 +0,0 @@
|
||||||
/* main.c - Command line parsing, intialisation and server start
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* in order to use O_NOFOLLOW on Linux: */
|
|
||||||
/* #define _GNU_SOURCE */
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "consts.h"
|
|
||||||
#include "cache.h"
|
|
||||||
#include "status.h"
|
|
||||||
#include "servers.h"
|
|
||||||
#include "dns_answer.h"
|
|
||||||
#include "dns_query.h"
|
|
||||||
#include "error.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "icmp.h"
|
|
||||||
#include "hash.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if DEBUG>0
|
|
||||||
short int debug_p=0;
|
|
||||||
#endif
|
|
||||||
short int stat_pipe=0;
|
|
||||||
|
|
||||||
/* int sigr=0; */
|
|
||||||
#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
short int run_ipv4=DEFAULT_IPV4;
|
|
||||||
short int cmdlineipv=0;
|
|
||||||
#endif
|
|
||||||
cmdlineflags_t cmdline={0};
|
|
||||||
pthread_t main_thrid,servstat_thrid,statsock_thrid,tcps_thrid,udps_thrid;
|
|
||||||
uid_t init_uid;
|
|
||||||
#if DEBUG>0
|
|
||||||
FILE *dbg_file=NULL;
|
|
||||||
#endif
|
|
||||||
volatile int tcp_socket=-1;
|
|
||||||
volatile int udp_socket=-1;
|
|
||||||
sigset_t sigs_msk;
|
|
||||||
char *conf_file=CONFDIR"/pdnsd.conf";
|
|
||||||
|
|
||||||
|
|
||||||
/* version and licensing information */
|
|
||||||
static const char info_message[] =
|
|
||||||
|
|
||||||
"pdnsd - dns proxy daemon, version " VERSION "\n\n"
|
|
||||||
"Copyright (C) 2000, 2001 Thomas Moestl\n"
|
|
||||||
"Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Paul A. Rombouts\n\n"
|
|
||||||
"pdnsd is free software; you can redistribute it and/or modify\n"
|
|
||||||
"it under the terms of the GNU General Public License as published by\n"
|
|
||||||
"the Free Software Foundation; either version 3 of the License, or\n"
|
|
||||||
"(at your option) any later version.\n\n"
|
|
||||||
"pdnsd is distributed in the hope that it will be useful,\n"
|
|
||||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
|
||||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
|
||||||
"GNU General Public License for more details.\n\n"
|
|
||||||
"You should have received a copy of the GNU General Public License\n"
|
|
||||||
"along with pdsnd; see the file COPYING. If not, see\n"
|
|
||||||
"<http://www.gnu.org/licenses/>.\n";
|
|
||||||
|
|
||||||
|
|
||||||
/* the help page */
|
|
||||||
static const char help_message[] =
|
|
||||||
|
|
||||||
"\n\nUsage: pdnsd [-h] [-V] [-s] [-d] [-g] [-t] [-p file] [-vn] [-mxx] [-c file]"
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
" [-4]"
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
" [-6] [-i prefix]"
|
|
||||||
#endif
|
|
||||||
#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
" [-a]"
|
|
||||||
#endif
|
|
||||||
"\n\n"
|
|
||||||
"Options:\n"
|
|
||||||
"-h\t\t--or--\n"
|
|
||||||
"--help\t\tprint this help page and exit.\n"
|
|
||||||
"-V\t\t--or--\n"
|
|
||||||
"--version\tprint version and license information and exit.\n"
|
|
||||||
"--pdnsd-user\tprint the user pdnsd will run as and exit.\n"
|
|
||||||
"-s\t\t--or--\n"
|
|
||||||
"--status\tEnable status control socket in the cache directory.\n"
|
|
||||||
"-d\t\t--or--\n"
|
|
||||||
"--daemon\tStart pdnsd in daemon mode (as background process.)\n"
|
|
||||||
"-g\t\t--or--\n"
|
|
||||||
"--debug\t\tPrint some debug messages on the console or to the\n"
|
|
||||||
"\t\tfile pdnsd.debug in your cache directory (in daemon mode).\n"
|
|
||||||
"-t\t\t--or--\n"
|
|
||||||
"--tcp\t\tEnables the TCP server thread. pdnsd will then serve\n"
|
|
||||||
"\t\tTCP and UDP queries.\n"
|
|
||||||
"-p\t\tWrites the pid the server runs as to a specified filename.\n"
|
|
||||||
"\t\tWorks only in daemon mode.\n"
|
|
||||||
"-vn\t\tsets the verbosity of pdnsd. n is a numeric argument from 0\n"
|
|
||||||
"\t\t(normal operation) to 9 (many messages for debugging).\n"
|
|
||||||
"\t\tUse like -v2\n"
|
|
||||||
"-mxx\t\tsets the query method pdnsd uses. Possible values for xx are:\n"
|
|
||||||
"\t\tuo (UDP only), to (TCP only), tu (TCP or, if the server\n"
|
|
||||||
"\t\tdoes not support this, UDP) and ut (UDP and, if the reply was\n"
|
|
||||||
"\t\ttruncated, TCP). Use like -muo. Preset: "
|
|
||||||
#if M_PRESET==UDP_ONLY
|
|
||||||
"-muo"
|
|
||||||
#elif M_PRESET==TCP_ONLY
|
|
||||||
"-mto"
|
|
||||||
#elif M_PRESET==TCP_UDP
|
|
||||||
"-mtu"
|
|
||||||
#else
|
|
||||||
"-mut"
|
|
||||||
#endif
|
|
||||||
"\n"
|
|
||||||
"-c\t\t--or--\n"
|
|
||||||
"--config-file\tspecifies the file the configuration is read from.\n"
|
|
||||||
"\t\tDefault is " CONFDIR "/pdnsd.conf\n"
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
"-4\t\tswitches to IPv4 mode.\n"
|
|
||||||
"\t\t"
|
|
||||||
# if DEFAULT_IPV4
|
|
||||||
"On"
|
|
||||||
# else
|
|
||||||
"Off"
|
|
||||||
# endif
|
|
||||||
" by default.\n"
|
|
||||||
#endif
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
"-6\t\tswitches to IPv6 mode.\n"
|
|
||||||
"\t\t"
|
|
||||||
# if DEFAULT_IPV4
|
|
||||||
"Off"
|
|
||||||
# else
|
|
||||||
"On"
|
|
||||||
# endif
|
|
||||||
" by default.\n"
|
|
||||||
"-i\t\t--or--\n"
|
|
||||||
"--ipv4_6_prefix\tspecifies the prefix pdnsd uses to map IPv4 to IPv6\n"
|
|
||||||
"\t\taddresses. Must be a valid IPv6 address.\n"
|
|
||||||
"\t\tDefault is " DEFAULT_IPV4_6_PREFIX "\n"
|
|
||||||
#endif
|
|
||||||
#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
"-a\t\tWith this option, pdnsd will try to detect automatically if\n"
|
|
||||||
"\t\tthe system supports IPv6, and revert to IPv4 otherwise.\n"
|
|
||||||
#endif
|
|
||||||
"\n\n\"no\" can be prepended to the --status, --daemon, --debug and --tcp\n"
|
|
||||||
"options (e.g. --notcp) to reverse their effect.\n";
|
|
||||||
|
|
||||||
|
|
||||||
/* These are some init steps we have to call before we get daemon on linux, but need
|
|
||||||
* to call after daemonizing on other OSes.
|
|
||||||
* Theay are also the last steps before we drop privileges. */
|
|
||||||
int final_init()
|
|
||||||
{
|
|
||||||
#ifndef NO_TCP_SERVER
|
|
||||||
if (!global.notcp)
|
|
||||||
tcp_socket=init_tcp_socket();
|
|
||||||
#endif
|
|
||||||
udp_socket=init_udp_socket();
|
|
||||||
if (tcp_socket==-1 && udp_socket==-1) {
|
|
||||||
log_error("tcp and udp initialization failed. Exiting.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (global.strict_suid) {
|
|
||||||
if (!run_as(global.run_as)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
/* Check if IPv6 is available.
|
|
||||||
* With thanks to Juliusz Chroboczek.
|
|
||||||
*/
|
|
||||||
static int check_ipv6()
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
fd = socket(PF_INET6, SOCK_STREAM, 0);
|
|
||||||
if(fd < 0) {
|
|
||||||
if(errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT || errno == EINVAL)
|
|
||||||
return 0;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Argument parsing, init, server startup
|
|
||||||
*/
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
int i,sig,pfd=-1; /* Initialized to inhibit compiler warning */
|
|
||||||
|
|
||||||
main_thrid=pthread_self();
|
|
||||||
servstat_thrid=main_thrid;
|
|
||||||
statsock_thrid=main_thrid;
|
|
||||||
tcps_thrid=main_thrid;
|
|
||||||
udps_thrid=main_thrid;
|
|
||||||
init_uid=getuid();
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
if((err=inet_pton(AF_INET6,DEFAULT_IPV4_6_PREFIX,&global.ipv4_6_prefix))<=0) {
|
|
||||||
fprintf(stderr,"Error: inet_pton() wont accept default prefix %s in %s, line %d\n",
|
|
||||||
DEFAULT_IPV4_6_PREFIX,__FILE__,__LINE__);
|
|
||||||
if(err)
|
|
||||||
perror("inet_pton");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Parse the command line.
|
|
||||||
Remember which options were specified here, because the command-line options
|
|
||||||
shall override the ones given in the config file */
|
|
||||||
for (i=1;i<argc;i++) {
|
|
||||||
char *arg=argv[i];
|
|
||||||
if (strcmp(arg,"-h")==0 || strcmp(arg,"--help")==0) {
|
|
||||||
fputs(info_message,stdout);
|
|
||||||
fputs(help_message,stdout);
|
|
||||||
exit(1);
|
|
||||||
} else if (strcmp(arg,"-V")==0 || strcmp(arg,"--version")==0) {
|
|
||||||
fputs(info_message,stdout);
|
|
||||||
exit(1);
|
|
||||||
} else if (strcmp(arg,"-c")==0 || strcmp(arg,"--config-file")==0) {
|
|
||||||
if (++i<argc) {
|
|
||||||
conf_file=argv[i];
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"Error: file name expected after %s option.\n",arg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else if (strcmp(arg,"-4")==0) {
|
|
||||||
#ifdef ENABLE_IPV4
|
|
||||||
# ifdef ENABLE_IPV6
|
|
||||||
run_ipv4=1; cmdlineipv=1;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
fprintf(stderr,"Error: -4: pdnsd was compiled without IPv4 support.\n");
|
|
||||||
exit(1);
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(arg,"-6")==0) {
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
# ifdef ENABLE_IPV4
|
|
||||||
run_ipv4=0; cmdlineipv=1;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
fprintf(stderr,"Error: -6: pdnsd was compiled without IPv6 support.\n");
|
|
||||||
exit(1);
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(arg,"-a")==0) {
|
|
||||||
#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6)
|
|
||||||
int rv=check_ipv6();
|
|
||||||
if(rv<0) {
|
|
||||||
fprintf(stderr,"Error: -a: can't check availability of IPv6: %s\n"
|
|
||||||
"Try using -4 or -6 option instead.\n",strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if((run_ipv4= !rv))
|
|
||||||
fprintf(stderr,"Switching to IPv4 mode.\n");
|
|
||||||
cmdlineipv=1;
|
|
||||||
#else
|
|
||||||
fprintf(stderr,"Warning: -a option does nothing unless pdnsd is compiled with both IPv4 AND IPv6 support.\n");
|
|
||||||
#endif
|
|
||||||
} else if(strcmp(arg,"-i")==0 || strcmp(arg,"--ipv4_6_prefix")==0) {
|
|
||||||
if (++i<argc) {
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
if(inet_pton(AF_INET6,argv[i],&global.ipv4_6_prefix)<=0) {
|
|
||||||
fprintf(stderr,"Error: %s: argument not a valid IPv6 address.\n",arg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
cmdline.prefix=1;
|
|
||||||
#else
|
|
||||||
fprintf(stderr,"pdnsd was compiled without IPv6 support. %s will be ignored.\n",arg);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"Error: IPv6 address expected after %s option.\n",arg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else if (strcmp(arg,"-s")==0 || strcmp(arg,"--status")==0) {
|
|
||||||
global.stat_pipe=1; cmdline.stat_pipe=1;
|
|
||||||
} else if (strcmp(arg,"--nostatus")==0) {
|
|
||||||
global.stat_pipe=0; cmdline.stat_pipe=1;
|
|
||||||
} else if (strcmp(arg,"-d")==0 || strcmp(arg,"--daemon")==0) {
|
|
||||||
global.daemon=1; cmdline.daemon=1;
|
|
||||||
} else if (strcmp(arg,"--nodaemon")==0) {
|
|
||||||
global.daemon=0; cmdline.daemon=1;
|
|
||||||
} else if (strcmp(arg,"-t")==0 || strcmp(arg,"--tcp")==0) {
|
|
||||||
global.notcp=0; cmdline.notcp=1;
|
|
||||||
#ifdef NO_TCP_SERVER
|
|
||||||
fprintf(stderr,"pdnsd was compiled without tcp server support. -t has no effect.\n");
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(arg,"--notcp")==0) {
|
|
||||||
global.notcp=1; cmdline.notcp=1;
|
|
||||||
} else if (strcmp(arg,"-p")==0) {
|
|
||||||
if (++i<argc) {
|
|
||||||
global.pidfile=argv[i]; cmdline.pidfile=1;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"Error: file name expected after -p option.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else if (strncmp(arg,"-v",2)==0) {
|
|
||||||
if (strlen(arg)!=3 || !isdigit(arg[2])) {
|
|
||||||
fprintf(stderr,"Error: one digit expected after -v option (like -v2).\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
global.verbosity=arg[2]-'0'; cmdline.verbosity=1;
|
|
||||||
} else if (strncmp(arg,"-m",2)==0) {
|
|
||||||
if (strlen(arg)!=4) {
|
|
||||||
fprintf(stderr,"Error: uo, to or tu expected after the -m option (like -muo).\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (strcmp(&arg[2],"uo")==0) {
|
|
||||||
#ifdef NO_UDP_QUERIES
|
|
||||||
fprintf(stderr,"Error: pdnsd was compiled without UDP support.\n");
|
|
||||||
exit(1);
|
|
||||||
#else
|
|
||||||
global.query_method=UDP_ONLY;
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(&arg[2],"to")==0) {
|
|
||||||
#ifdef NO_TCP_QUERIES
|
|
||||||
fprintf(stderr,"Error: pdnsd was compiled without TCP support.\n");
|
|
||||||
exit(1);
|
|
||||||
#else
|
|
||||||
global.query_method=TCP_ONLY;
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(&arg[2],"tu")==0) {
|
|
||||||
#if defined(NO_UDP_QUERIES) || defined(NO_TCP_QUERIES)
|
|
||||||
fprintf(stderr,"Error: pdnsd was not compiled with UDP and TCP support.\n");
|
|
||||||
exit(1);
|
|
||||||
#else
|
|
||||||
global.query_method=TCP_UDP;
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(&arg[2],"ut")==0) {
|
|
||||||
#if defined(NO_UDP_QUERIES) || defined(NO_TCP_QUERIES)
|
|
||||||
fprintf(stderr,"Error: pdnsd was not compiled with UDP and TCP support.\n");
|
|
||||||
exit(1);
|
|
||||||
#else
|
|
||||||
global.query_method=UDP_TCP;
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"Error: uo, to, tu or ut expected after the -m option (like -muo).\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
cmdline.query_method=1;
|
|
||||||
} else if (strcmp(arg,"-g")==0 || strcmp(arg,"--debug")==0) {
|
|
||||||
global.debug=1; cmdline.debug=1;
|
|
||||||
#if !DEBUG
|
|
||||||
fprintf(stderr,"pdnsd was compiled without debugging support. -g has no effect.\n");
|
|
||||||
#endif
|
|
||||||
} else if (strcmp(arg,"--nodebug")==0) {
|
|
||||||
global.debug=0; cmdline.debug=1;
|
|
||||||
} else if (strcmp(arg,"--pdnsd-user")==0) {
|
|
||||||
cmdline.pdnsduser=1;
|
|
||||||
} else {
|
|
||||||
char *equ=strchr(arg,'=');
|
|
||||||
if(equ) {
|
|
||||||
int plen=equ-arg;
|
|
||||||
char *valstr=equ+1;
|
|
||||||
# define arg_isparam(strlit) (!strncmp(arg,strlit,strlitlen(strlit)) && plen==strlitlen(strlit))
|
|
||||||
|
|
||||||
if(arg_isparam("--config-file")) {
|
|
||||||
conf_file=valstr;
|
|
||||||
}
|
|
||||||
else if(arg_isparam("--ipv4_6_prefix")) {
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
if(inet_pton(AF_INET6,valstr,&global.ipv4_6_prefix)<=0) {
|
|
||||||
fprintf(stderr,"Error: --ipv4_6_prefix: argument not a valid IPv6 address.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
cmdline.prefix=1;
|
|
||||||
#else
|
|
||||||
fprintf(stderr,"pdnsd was compiled without IPv6 support. --ipv4_6_prefix will be ignored.\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stderr,"Error: unknown option: %.*s\n",plen,arg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"Error: unknown option: %s\n",arg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init_cache();
|
|
||||||
{
|
|
||||||
char *errmsg;
|
|
||||||
if(!read_config_file(conf_file,&global,&servers,0,&errmsg)) {
|
|
||||||
fputs(errmsg?:"Out of memory.",stderr);
|
|
||||||
fputc('\n',stderr);
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cmdline.pdnsduser) {
|
|
||||||
if (global.run_as[0]) {
|
|
||||||
printf("%s\n",global.run_as);
|
|
||||||
} else {
|
|
||||||
uid_t uid=getuid();
|
|
||||||
struct passwd *pws=getpwuid(uid);
|
|
||||||
if (pws)
|
|
||||||
printf("%s\n",pws->pw_name);
|
|
||||||
else
|
|
||||||
printf("%i\n",uid);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!global.cache_dir) global.cache_dir = CACHEDIR;
|
|
||||||
if(!global.scheme_file) global.scheme_file = "/var/lib/pcmcia/scheme";
|
|
||||||
stat_pipe=global.stat_pipe;
|
|
||||||
|
|
||||||
if (!(global.run_as[0] && global.strict_suid)) {
|
|
||||||
for (i=0; i<DA_NEL(servers); i++) {
|
|
||||||
servparm_t *sp=&DA_INDEX(servers,i);
|
|
||||||
if (sp->uptest==C_EXEC && sp->uptest_usr[0]=='\0') {
|
|
||||||
uid_t uid=getuid();
|
|
||||||
struct passwd *pws=getpwuid(uid);
|
|
||||||
|
|
||||||
/* No explicit uptest user given. If we run_as and strict_suid, we assume that
|
|
||||||
* this is safe. If not - warn. */
|
|
||||||
fprintf(stderr,"Warning: uptest command \"%s\" will implicitly be executed as user ", sp->uptest_cmd);
|
|
||||||
if (pws)
|
|
||||||
fprintf(stderr,"%s\n",pws->pw_name);
|
|
||||||
else
|
|
||||||
fprintf(stderr,"%i\n",uid);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (global.daemon && global.pidfile) {
|
|
||||||
if (unlink(global.pidfile)!=0 && errno!=ENOENT) {
|
|
||||||
log_error("Error: could not unlink pid file %s: %s",global.pidfile, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if ((pfd=open(global.pidfile,O_WRONLY|O_CREAT|O_EXCL
|
|
||||||
#ifdef O_NOFOLLOW
|
|
||||||
|O_NOFOLLOW
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* No O_NOFOLLOW. Nevertheless, this not a hole, since the
|
|
||||||
* directory for pidfiles should not be world writeable.
|
|
||||||
* OS's that do not support O_NOFOLLOW are currently not
|
|
||||||
* supported, this is just-in-case code.
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
, 0600))==-1)
|
|
||||||
{
|
|
||||||
log_error("Error: could not open pid file %s: %s",global.pidfile, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i=0;i<DA_NEL(servers);i++) {
|
|
||||||
if (DA_INDEX(servers,i).uptest==C_PING) {
|
|
||||||
init_ping_socket();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!init_rng())
|
|
||||||
exit(1);
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
if (!final_init())
|
|
||||||
exit(1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
struct sigaction action;
|
|
||||||
action.sa_handler = SIG_IGN;
|
|
||||||
sigemptyset(&action.sa_mask);
|
|
||||||
action.sa_flags = 0;
|
|
||||||
if(sigaction(SIGPIPE, &action, NULL) != 0)
|
|
||||||
log_error("Could not call sigaction to ignore SIGPIPE: %s",strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
umask(0077); /* for security reasons */
|
|
||||||
if (global.daemon) {
|
|
||||||
pid_t pid;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
/* become a daemon */
|
|
||||||
pid=fork();
|
|
||||||
if (pid==-1) {
|
|
||||||
log_error("Could not become a daemon: fork #1 failed: %s",strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (pid!=0) {
|
|
||||||
/* This is the parent.
|
|
||||||
The child is going to do another fork() and will exit quickly.
|
|
||||||
Perhaps we should wait for the child and return
|
|
||||||
its exit status? */
|
|
||||||
exit(0); /* exit parent */
|
|
||||||
}
|
|
||||||
/* dissociate from controlling terminal */
|
|
||||||
if (setsid()==-1) {
|
|
||||||
log_error("Could not become a daemon: setsid failed: %s",strerror(errno));
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
pid=fork();
|
|
||||||
if (pid==-1) {
|
|
||||||
log_error("Could not become a daemon: fork #2 failed: %s",strerror(errno));
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
if (pid!=0) {
|
|
||||||
int exitval=0;
|
|
||||||
if (global.pidfile) {
|
|
||||||
if(fsprintf(pfd,"%i\n",(int)pid)<0) {
|
|
||||||
log_error("Error: could not write to pid file %s: %s",
|
|
||||||
global.pidfile, strerror(errno));
|
|
||||||
exitval=1;
|
|
||||||
}
|
|
||||||
if(close(pfd)<0) {
|
|
||||||
log_error("Error: could not close pid file %s: %s",
|
|
||||||
global.pidfile, strerror(errno));
|
|
||||||
exitval=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_exit(exitval); /* exit parent, so we are no session group leader */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (global.pidfile) close(pfd);
|
|
||||||
if(chdir("/"))
|
|
||||||
log_warn("Cannot chdir to root directory: %s",strerror(errno));
|
|
||||||
if ((fd=open("/dev/null",O_RDONLY))==-1) {
|
|
||||||
log_error("Could not become a daemon: open for /dev/null failed: %s",strerror(errno));
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
dup2(fd,0);
|
|
||||||
close(fd);
|
|
||||||
if ((fd=open("/dev/null",O_WRONLY))==-1) {
|
|
||||||
log_error("Could not become a daemon: open for /dev/null failed: %s",strerror(errno));
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
dup2(fd,1);
|
|
||||||
dup2(fd,2);
|
|
||||||
close(fd);
|
|
||||||
#if DEBUG>0
|
|
||||||
if (global.debug) {
|
|
||||||
char dbgpath[strlen(global.cache_dir)+sizeof("/pdnsd.debug")];
|
|
||||||
stpcpy(stpcpy(dbgpath,global.cache_dir),"/pdnsd.debug");
|
|
||||||
if (!(dbg_file=fopen(dbgpath,"w")))
|
|
||||||
log_warn("Warning: could not open debug file %s: %s",dbgpath, strerror(errno));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
#if DEBUG>0
|
|
||||||
dbg_file=stdout;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG>0
|
|
||||||
debug_p= (global.debug && dbg_file);
|
|
||||||
#endif
|
|
||||||
log_info(0,"pdnsd-%s starting.\n",VERSION);
|
|
||||||
DEBUG_MSG("Debug messages activated\n");
|
|
||||||
|
|
||||||
#if (TARGET!=TARGET_LINUX)
|
|
||||||
if (!final_init())
|
|
||||||
_exit(1);
|
|
||||||
#endif
|
|
||||||
DEBUG_MSG(SEL_IPVER("Using IPv4.\n", "Using IPv6.\n"));
|
|
||||||
|
|
||||||
/* initialize attribute for creating detached threads */
|
|
||||||
pthread_attr_init(&attr_detached);
|
|
||||||
pthread_attr_setdetachstate(&attr_detached,PTHREAD_CREATE_DETACHED);
|
|
||||||
|
|
||||||
read_disk_cache();
|
|
||||||
|
|
||||||
/* This must be done before any other thread is started to avoid races. */
|
|
||||||
if (stat_pipe)
|
|
||||||
init_stat_sock();
|
|
||||||
|
|
||||||
|
|
||||||
/* Before this point, logging and cache accesses are not locked because we are single-threaded. */
|
|
||||||
init_log_lock();
|
|
||||||
init_cache_lock();
|
|
||||||
|
|
||||||
sigemptyset(&sigs_msk);
|
|
||||||
sigaddset(&sigs_msk,SIGHUP);
|
|
||||||
sigaddset(&sigs_msk,SIGINT);
|
|
||||||
#ifndef THREADLIB_NPTL
|
|
||||||
sigaddset(&sigs_msk,SIGILL);
|
|
||||||
#endif
|
|
||||||
sigaddset(&sigs_msk,SIGABRT);
|
|
||||||
sigaddset(&sigs_msk,SIGFPE);
|
|
||||||
#ifndef THREADLIB_NPTL
|
|
||||||
sigaddset(&sigs_msk,SIGSEGV);
|
|
||||||
#endif
|
|
||||||
sigaddset(&sigs_msk,SIGTERM);
|
|
||||||
/* if (!daemon_p) {
|
|
||||||
sigaddset(&sigs_msk,SIGQUIT);
|
|
||||||
} */
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
pthread_sigmask(SIG_BLOCK,&sigs_msk,NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if DEBUG>0
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
/* Generate a key for storing our thread id's */
|
|
||||||
if ((err=pthread_key_create(&thrid_key, NULL)) != 0) {
|
|
||||||
log_error("pthread_key_create failed: %s",strerror(err));
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
#if DEBUG>0
|
|
||||||
int thrdsucc=1;
|
|
||||||
# define thrdfail (thrdsucc=0)
|
|
||||||
#else
|
|
||||||
# define thrdfail
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(start_servstat_thread()) thrdfail;
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX)
|
|
||||||
if (!global.strict_suid) {
|
|
||||||
if (!run_as(global.run_as)) {
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (stat_pipe)
|
|
||||||
if(start_stat_sock()) thrdfail;
|
|
||||||
|
|
||||||
start_dns_servers();
|
|
||||||
|
|
||||||
#if DEBUG>0
|
|
||||||
if(thrdsucc) {
|
|
||||||
DEBUG_MSG("All threads started successfully.\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#undef thrdfail
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX) && !defined(THREADLIB_NPTL)
|
|
||||||
pthread_sigmask(SIG_BLOCK,&sigs_msk,NULL);
|
|
||||||
waiting=1;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
while ((err=sigwait(&sigs_msk,&sig))) {
|
|
||||||
if (err!=EINTR) {
|
|
||||||
log_error("sigwait failed: %s",strerror(err));
|
|
||||||
sig=0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(sig) DEBUG_MSG("Signal %i caught.\n",sig);
|
|
||||||
write_disk_cache();
|
|
||||||
destroy_cache();
|
|
||||||
if(sig) log_warn("Caught signal %i. Exiting.",sig);
|
|
||||||
if (sig==SIGSEGV || sig==SIGILL || sig==SIGBUS)
|
|
||||||
crash_msg("This is a fatal signal probably triggered by a bug.");
|
|
||||||
if (ping_isocket!=-1)
|
|
||||||
close(ping_isocket);
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
if (ping6_isocket!=-1)
|
|
||||||
close(ping6_isocket);
|
|
||||||
#endif
|
|
||||||
/* Close and delete the status socket */
|
|
||||||
if(stat_pipe) close(stat_sock);
|
|
||||||
if (sock_path && unlink(sock_path))
|
|
||||||
log_warn("Failed to unlink %s: %s",sock_path, strerror(errno));
|
|
||||||
|
|
||||||
free_rng();
|
|
||||||
#if DEBUG>0
|
|
||||||
if (debug_p && global.daemon)
|
|
||||||
if(fclose(dbg_file)<0) {
|
|
||||||
log_warn("Could not close debug file: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
_exit(0);
|
|
||||||
}
|
|
|
@ -1,309 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
# This Perl script is used to generate rr_types.h, using rr_types.in as input.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2010, 2011 Paul A. Rombouts
|
|
||||||
#
|
|
||||||
# This file is part of the pdnsd package.
|
|
||||||
#
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use integer;
|
|
||||||
|
|
||||||
print << "END-OF-TEXT";
|
|
||||||
/* This file was generated by running '$0 @ARGV'.
|
|
||||||
Modifications to this file may be lost the next time it is automatically
|
|
||||||
regenerated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
END-OF-TEXT
|
|
||||||
|
|
||||||
my %valdic;
|
|
||||||
my %namedic;
|
|
||||||
my %classdic;
|
|
||||||
my %muset;
|
|
||||||
my $nrr=0;
|
|
||||||
my $nmu=0;
|
|
||||||
my $minval;
|
|
||||||
my $maxval;
|
|
||||||
#my $maxmuval;
|
|
||||||
|
|
||||||
while(<>) {
|
|
||||||
if(/\S/ && !/^\s*\#/) {
|
|
||||||
if(/^\s*(?:([*+-])\s*)?([\w-]+)\s+(\d+)\s+(?:\((\w+)\))?/) {
|
|
||||||
my $mu = $1; my $name=$2; my $val=$3+0; my $class=$4;
|
|
||||||
$name =~ s/-/_/g;
|
|
||||||
if(defined($valdic{$name})) {warn "The name \"$name\" does not have a unique value.\n"}
|
|
||||||
if(defined($namedic{$val})) {warn "The value \"$val\" does not have a unique name.\n"}
|
|
||||||
$valdic{$name}=$val; $namedic{$val}=$name; $classdic{$val}=$class if defined($class);
|
|
||||||
if(defined($mu)) {
|
|
||||||
if($mu eq '-') {next}
|
|
||||||
$muset{$val}= 1;
|
|
||||||
++$nmu;
|
|
||||||
#if(!defined($maxmuval) || $val>$maxmuval) {$maxmuval=$val}
|
|
||||||
}
|
|
||||||
else {$muset{$val}= 0}
|
|
||||||
++$nrr;
|
|
||||||
if(!defined($minval) || $val<$minval) {$minval=$val}
|
|
||||||
if(!defined($maxval) || $val>$maxval) {$maxval=$val}
|
|
||||||
}
|
|
||||||
else {die "Can't find name-value pair in following line:\n$_\n"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defined($minval) or die "No values defined.\n";
|
|
||||||
if($nrr>255) {warn "Warning: total number of cache-able RR types is greater than 255.\n"}
|
|
||||||
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
/* rr_types.h - A header file with names & descriptions of
|
|
||||||
all rr types known to pdnsd
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2007, 2010, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _RR_TYPES_H_
|
|
||||||
#define _RR_TYPES_H_
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
END-OF-TEXT
|
|
||||||
|
|
||||||
print "#define T_MIN $minval\n";
|
|
||||||
foreach my $name (sort {$valdic{$a} <=> $valdic{$b} } (keys %valdic)) {
|
|
||||||
printf("#define %-12s %2d\n", "T_$name", $valdic{$name});
|
|
||||||
}
|
|
||||||
print "#define T_MAX $maxval\n";
|
|
||||||
print("\n/* T_MAX - T_MIN + 1 */\n","#define T_NUM ",$maxval+1-$minval,"\n");
|
|
||||||
#print("\n/* Largest most frequently used type value. */\n","#define T_MAXMU $maxmuval\n");
|
|
||||||
print("\n/* Number of most frequently used rr types. */\n","#define NRRMU $nmu\n");
|
|
||||||
print("\n/* Number of remaining rr types. */\n","#define NRREXT ",$nrr-$nmu,"\n");
|
|
||||||
print("\n/* NRRMU + NRREXT */\n","#define NRRTOT $nrr\n");
|
|
||||||
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
/* Lookup table for converting rr type values to internally used indices. */
|
|
||||||
extern const unsigned short int rrlkuptab[T_NUM];
|
|
||||||
#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY)
|
|
||||||
const unsigned short int rrlkuptab[T_NUM] = {
|
|
||||||
END-OF-TEXT
|
|
||||||
my @rrtpval=();
|
|
||||||
for(my $val=$minval, my $i=0, my $j=$nmu, my $k=$nrr; $val<=$maxval; ++$val) {
|
|
||||||
my $idx;
|
|
||||||
if(defined($muset{$val})) {
|
|
||||||
if($muset{$val}) {
|
|
||||||
$idx = $i++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$idx = $j++;
|
|
||||||
}
|
|
||||||
$rrtpval[$idx]=$val;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$idx = $k++;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf('%4d', $idx);
|
|
||||||
if(defined($namedic{$val})) {
|
|
||||||
print " /* $namedic{$val} */";
|
|
||||||
}
|
|
||||||
print ',' if $val<$maxval;
|
|
||||||
print "\n";
|
|
||||||
}
|
|
||||||
#print << 'END-OF-TEXT';
|
|
||||||
#};
|
|
||||||
##endif
|
|
||||||
#
|
|
||||||
#/* Table for converting internally used indices to rr type values.
|
|
||||||
# This is more or less the inverse of the rrlkuptab[] mapping. */
|
|
||||||
#extern const unsigned short int rrtpval[NRRTOT];
|
|
||||||
##if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY)
|
|
||||||
#const unsigned short int rrtpval[NRRTOT] = {
|
|
||||||
#END-OF-TEXT
|
|
||||||
#for(my $i=0; $i<$nrr; ++$i) {
|
|
||||||
# if($i ==0) {
|
|
||||||
# print " /* Most frequently used types. */\n";
|
|
||||||
# }
|
|
||||||
# else {
|
|
||||||
# print ",\n";
|
|
||||||
# }
|
|
||||||
# print " /* Remaining (less frequently used) types. */\n"
|
|
||||||
# if $i == $nmu;
|
|
||||||
# my $val= $rrtpval[$i];
|
|
||||||
# print(" ",defined($namedic{$val})? "T_$namedic{$val}": $val);
|
|
||||||
#}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* List of most frequently used RR types in ascending order. */
|
|
||||||
extern const unsigned short int rrmuiterlist[NRRMU];
|
|
||||||
#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY)
|
|
||||||
const unsigned short int rrmuiterlist[NRRMU] = {
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval, my $i=0; $val<=$maxval; ++$val) {
|
|
||||||
if(defined($muset{$val}) && $muset{$val}) {
|
|
||||||
print ",\n" if $i++;
|
|
||||||
print(" ",defined($namedic{$val})? "T_$namedic{$val}": $val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* List of the cache-able RR types in ascending order. */
|
|
||||||
extern const unsigned short int rrcachiterlist[NRRTOT];
|
|
||||||
#if DEFINE_RR_TYPE_ARRAYS
|
|
||||||
const unsigned short int rrcachiterlist[NRRTOT] = {
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval, my $i=0; $val<=$maxval; ++$val) {
|
|
||||||
if(defined($muset{$val})) {
|
|
||||||
print ",\n" if $i++;
|
|
||||||
print(" ",defined($namedic{$val})? "T_$namedic{$val}": $val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Optimized getrrset macros for fixed rr types. */
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval, my $i=0, my $j=0; $val<=$maxval; ++$val) {
|
|
||||||
if(defined($muset{$val})) {
|
|
||||||
my $name = $namedic{$val};
|
|
||||||
my $mdef;
|
|
||||||
if($muset{$val}) {
|
|
||||||
$mdef= "GET_RRSMU(cent,$i)";
|
|
||||||
++$i;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$mdef= "GET_RRSEXT(cent,$j)";
|
|
||||||
++$j;
|
|
||||||
}
|
|
||||||
printf("#define %-25s %s\n", "getrrset_$name(cent)", $mdef)
|
|
||||||
if defined($name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
/* have_rr macros for fixed rr types. */
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval, my $i=0, my $j=0; $val<=$maxval; ++$val) {
|
|
||||||
my $name = $namedic{$val};
|
|
||||||
my $mdef = '0';
|
|
||||||
if(defined($muset{$val})) {
|
|
||||||
if($muset{$val}) {
|
|
||||||
$mdef= "HAVE_RRMU(cent,$i)";
|
|
||||||
++$i;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$mdef= "HAVE_RREXT(cent,$j)";
|
|
||||||
++$j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("#define %-25s %s\n", "have_rr_$name(cent)", $mdef)
|
|
||||||
if defined($name);
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
/* These macros specify which RR types are cached by pdnsd. */
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval; $val<=$maxval; ++$val) {
|
|
||||||
if(defined($muset{$val})) {
|
|
||||||
my $name = $namedic{$val};
|
|
||||||
printf("#define IS_CACHED_%-10s 1\n", defined($name)? $name: "TYPE$val")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
/* Array indices for most frequently used rr types. */
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval, my $i=0; $val<=$maxval; ++$val) {
|
|
||||||
if(defined($muset{$val}) && $muset{$val}) {
|
|
||||||
printf("#define %-18s %2d\n", "RRMUINDEX_$namedic{$val}", $i)
|
|
||||||
if defined($namedic{$val});
|
|
||||||
++$i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
/* Table of rr names. */
|
|
||||||
extern const char *const rrnames[T_NUM];
|
|
||||||
#if DEFINE_RR_TYPE_ARRAYS
|
|
||||||
const char *const rrnames[T_NUM] = {
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $val=$minval; $val<=$maxval; ++$val) {
|
|
||||||
my $name = $namedic{$val};
|
|
||||||
print(' "', defined($name)? $name: "TYPE$val", '"');
|
|
||||||
print ',' if $val<$maxval;
|
|
||||||
print "\n";
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Structure for rr information */
|
|
||||||
struct rr_infos {
|
|
||||||
unsigned short class; /* class (values see below) */
|
|
||||||
unsigned short excludes; /* relations to other classes.
|
|
||||||
Mutual exclusion is marked by or'ing the
|
|
||||||
respective RRCL value in this field.
|
|
||||||
Exclusions should be symmetric. */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Class values */
|
|
||||||
#define RRCL_ALIAS 1 /* for CNAMES, conflicts with RRCL_RECORD */
|
|
||||||
#define RRCL_RECORD 2 /* normal direct record */
|
|
||||||
#define RRCL_IDEM 4 /* types that conflict with no others (MX, CNAME, ...) */
|
|
||||||
#define RRCL_PTR 8 /* PTR */
|
|
||||||
|
|
||||||
/* Standard excludes for the classes */
|
|
||||||
#define RRX_ALIAS (RRCL_RECORD|RRCL_PTR)
|
|
||||||
#define RRX_RECORD (RRCL_ALIAS|RRCL_PTR)
|
|
||||||
#define RRX_IDEM 0
|
|
||||||
#define RRX_PTR (RRCL_ALIAS|RRCL_RECORD)
|
|
||||||
|
|
||||||
/* There could be a separate table detailing the relationship of types, but this
|
|
||||||
* is slightly more flexible, as it allows a finer granularity of exclusion. Also,
|
|
||||||
* Membership in multiple classes could be added.
|
|
||||||
* Index by internally used RR-set indices, not RR type values!
|
|
||||||
*/
|
|
||||||
extern const struct rr_infos rr_info[NRRTOT];
|
|
||||||
#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY)
|
|
||||||
const struct rr_infos rr_info[NRRTOT] = {
|
|
||||||
END-OF-TEXT
|
|
||||||
for(my $i=0; $i<$nrr; ++$i) {
|
|
||||||
print ",\n" if $i;
|
|
||||||
my $val=$rrtpval[$i];
|
|
||||||
my $class = (defined($classdic{$val})? $classdic{$val}: 'IDEM');
|
|
||||||
printf(' %-16s %-15s %s',"{RRCL_$class,", "RRX_$class}", defined($namedic{$val})?"/* $namedic{$val} */":"");
|
|
||||||
}
|
|
||||||
print << 'END-OF-TEXT';
|
|
||||||
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int rr_tp_byname(char *name);
|
|
||||||
const char *loc2str(const void *binary, char *ascii, size_t asclen);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
END-OF-TEXT
|
|
||||||
|
|
||||||
exit
|
|
|
@ -1,363 +0,0 @@
|
||||||
/* netdev.c - Test network devices for existence and status
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Portions are under the following copyright and taken from FreeBSD
|
|
||||||
* (clause 3 deleted as it no longer applies):
|
|
||||||
*
|
|
||||||
* Copyright (c) 1982, 1986, 1989, 1993
|
|
||||||
* The Regents of the University of California. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* @(#)if.h 8.1 (Berkeley) 6/10/93
|
|
||||||
* $FreeBSD: src/sys/net/if.h,v 1.58.2.1 2000/05/05 13:37:04 jlemon Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "netdev.h"
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_BSD)
|
|
||||||
/* Taken from FreeBSD net/if.h rev. 1.58.2.1 */
|
|
||||||
#define SIZEOF_ADDR_IFREQ(ifr) \
|
|
||||||
((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
|
|
||||||
(sizeof(struct ifreq) - sizeof(struct sockaddr) + \
|
|
||||||
(ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
|
|
||||||
#elif (TARGET==TARGET_CYGWIN)
|
|
||||||
#define SIZEOF_ADDR_IFREQ(ifr) (sizeof(struct sockaddr))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_SOCKETOPEN_ERRS 10
|
|
||||||
static volatile unsigned long socketopen_errs=0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Portions of the following code are Linux/FreeBSD specific.
|
|
||||||
* Please write interface-detection routines for other flavours of Unix if you can and want.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)
|
|
||||||
# if (TARGET==TARGET_LINUX)
|
|
||||||
|
|
||||||
static volatile unsigned long isdn_errs=0;
|
|
||||||
|
|
||||||
# ifdef ISDN_SUPPORT
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Test the status of an ippp interface. Taken from the isdn4k-utils (thanks!) and adapted
|
|
||||||
* by me (I love free software!)
|
|
||||||
* This will not work with older kernels.
|
|
||||||
* If your kernel is too old or too new, just try to get the status as uptest=exec command
|
|
||||||
* This will work, although slower.
|
|
||||||
*/
|
|
||||||
|
|
||||||
# include <linux/isdn.h>
|
|
||||||
|
|
||||||
int statusif(char *name)
|
|
||||||
{
|
|
||||||
isdn_net_ioctl_phone phone;
|
|
||||||
int isdninfo,rc=0;
|
|
||||||
|
|
||||||
if ((isdninfo = open("/dev/isdninfo", O_RDONLY))<0) {
|
|
||||||
if (++isdn_errs<=2) {
|
|
||||||
log_warn("Could not open /dev/isdninfo for uptest: %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncp(phone.name, name, sizeof(phone.name));
|
|
||||||
if (ioctl(isdninfo, IIOCNETGPN, &phone)==0)
|
|
||||||
rc=1;
|
|
||||||
close(isdninfo);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Test whether the network interface specified in ifname and its
|
|
||||||
* associated device specified in devname have locks owned by the
|
|
||||||
* same process.
|
|
||||||
*/
|
|
||||||
int dev_up(char *ifname, char *devname)
|
|
||||||
{
|
|
||||||
FILE *fd;
|
|
||||||
int pidi, pidd, rv;
|
|
||||||
|
|
||||||
{
|
|
||||||
char path[sizeof("/var/run/.pid")+strlen(ifname)];
|
|
||||||
stpcpy(stpcpy(stpcpy(path,"/var/run/"),ifname),".pid");
|
|
||||||
if ((fd=fopen(path, "r")) == NULL )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (fscanf(fd, "%d", &pidi) != 1 ) {
|
|
||||||
fclose(fd) ;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fclose(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
char path[sizeof("/var/lock/LCK..")+strlen(devname)];
|
|
||||||
stpcpy(stpcpy(path,"/var/lock/LCK.."),devname);
|
|
||||||
if ((fd=fopen(path, "r")) == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (fscanf(fd, "%d", &pidd) != 1) {
|
|
||||||
fclose(fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fclose(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pidi != pidd)
|
|
||||||
return 0;
|
|
||||||
/* Test whether pppd is still alive */
|
|
||||||
rv=kill(pidi,0);
|
|
||||||
return (rv==0 || (rv==-1 && errno!=ESRCH));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# endif /*(TARGET==TARGET_LINUX)*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Test whether the network device specified in devname is up and
|
|
||||||
* running (returns -1) or non-existent, down or not-running (returns 0)
|
|
||||||
*
|
|
||||||
* Note on IPv6-Comptability: rfc2133 requires all IPv6 implementation
|
|
||||||
* to be backwards-compatible to IPv4 in means of permitting socket(PF_INET,...)
|
|
||||||
* and similar. So, I don't put code here for both IPv4 and IPv6, since
|
|
||||||
* I use that socket only for ioctls. If somebody notices incompatabilities,
|
|
||||||
* please notify me.
|
|
||||||
*/
|
|
||||||
int if_up(char *devname)
|
|
||||||
{
|
|
||||||
int sock;
|
|
||||||
struct ifreq ifr;
|
|
||||||
# if (TARGET==TARGET_LINUX)
|
|
||||||
unsigned int devnamelen=strlen(devname);
|
|
||||||
if (devnamelen>4 && devnamelen<=6 && strncmp(devname,"ippp",4)==0) {
|
|
||||||
/* This function didn't manage the interface uptest correctly. Thanks to
|
|
||||||
* Joachim Dorner for pointing out.
|
|
||||||
* The new code (statusif()) was shamelessly stolen from isdnctrl.c of the
|
|
||||||
* isdn4k-utils. */
|
|
||||||
# ifdef ISDN_SUPPORT
|
|
||||||
return statusif(devname);
|
|
||||||
# else
|
|
||||||
if (isdn_errs++==0) {
|
|
||||||
log_warn("An ippp? device was specified for uptest, but pdnsd was compiled without ISDN support.");
|
|
||||||
log_warn("The uptest result will be wrong.");
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
/* If it doesn't match our rules for isdn devices, treat as normal if */
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
if ((sock=socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP))==-1) {
|
|
||||||
if(++socketopen_errs<=MAX_SOCKETOPEN_ERRS) {
|
|
||||||
log_warn("Could not open socket in if_up(): %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
strncp(ifr.ifr_name,devname,IFNAMSIZ);
|
|
||||||
if (ioctl(sock,SIOCGIFFLAGS,&ifr)==-1) {
|
|
||||||
close(sock);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
close(sock);
|
|
||||||
return (ifr.ifr_flags&IFF_UP) && (ifr.ifr_flags&IFF_RUNNING);
|
|
||||||
}
|
|
||||||
|
|
||||||
# if (TARGET==TARGET_LINUX)
|
|
||||||
# ifdef ENABLE_IPV6
|
|
||||||
#define MAX_IF_INET6_OPEN_ERRS 10
|
|
||||||
static volatile unsigned long if_inet6_open_errs=0;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
int is_local_addr(pdnsd_a *a)
|
|
||||||
{
|
|
||||||
int res=0;
|
|
||||||
|
|
||||||
# ifdef ENABLE_IPV4
|
|
||||||
if (run_ipv4) {
|
|
||||||
int i,sock;
|
|
||||||
struct ifreq ifr;
|
|
||||||
if ((sock=socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP))==-1) {
|
|
||||||
if(++socketopen_errs<=MAX_SOCKETOPEN_ERRS) {
|
|
||||||
log_warn("Could not open socket in is_local_addr(): %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
for (i=1;i<255;i++) {
|
|
||||||
ifr.ifr_ifindex=i;
|
|
||||||
if (ioctl(sock,SIOCGIFNAME,&ifr)==-1) {
|
|
||||||
/* There may be gaps in the interface enumeration, so just continue */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (ioctl(sock,SIOCGIFADDR, &ifr)==-1) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr.s_addr==a->ipv4.s_addr) {
|
|
||||||
res=1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(sock);
|
|
||||||
}
|
|
||||||
|
|
||||||
# endif
|
|
||||||
# ifdef ENABLE_IPV6
|
|
||||||
ELSE_IPV6 {
|
|
||||||
char buf[40];
|
|
||||||
FILE *f;
|
|
||||||
struct in6_addr b;
|
|
||||||
/* the interface configuration and information retrieval is obiously currently done via
|
|
||||||
* rt-netlink sockets. I think it is relatively likely to change in an incompatible way the
|
|
||||||
* Linux kernel (there seem to be some major changes for 2.4).
|
|
||||||
* Right now, I just analyze the /proc/net/if_inet6 entry. This may not be the fastest, but
|
|
||||||
* should work and is easy to adapt should the format change. */
|
|
||||||
if (!(f=fopen("/proc/net/if_inet6","r"))) {
|
|
||||||
if(++if_inet6_open_errs<=MAX_IF_INET6_OPEN_ERRS) {
|
|
||||||
log_warn("Could not open /proc/net/if_inet6 in is_local_addr(): %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* The address is at the start of the line. We just read 32 characters and insert a ':' 7
|
|
||||||
* times. Such, we can use inet_pton conveniently. More portable, that. */
|
|
||||||
for(;;) {
|
|
||||||
int i,ch; char *p=buf;
|
|
||||||
for (i=0;i<32;i++) {
|
|
||||||
if(i && i%4==0) *p++ = ':';
|
|
||||||
if ((ch=fgetc(f))==EOF)
|
|
||||||
goto fclose_return; /* we are at the end of the file and haven't found anything.*/
|
|
||||||
if(ch=='\n') goto nextline;
|
|
||||||
*p++ = ch;
|
|
||||||
}
|
|
||||||
*p=0;
|
|
||||||
if (inet_pton(AF_INET6,buf,&b) >0) {
|
|
||||||
if (IN6_ARE_ADDR_EQUAL(&b,&a->ipv6)) {
|
|
||||||
res=1;
|
|
||||||
goto fclose_return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
if ((ch=fgetc(f))==EOF) goto fclose_return;
|
|
||||||
} while(ch!='\n');
|
|
||||||
nextline:;
|
|
||||||
}
|
|
||||||
fclose_return:
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
# else /*(TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)*/
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_SIOCGIFCONF_ERRS 4
|
|
||||||
static volatile unsigned long siocgifconf_errs=0;
|
|
||||||
|
|
||||||
int is_local_addr(pdnsd_a *a)
|
|
||||||
{
|
|
||||||
int retval=0, sock, cnt;
|
|
||||||
struct ifconf ifc;
|
|
||||||
char buf[2048];
|
|
||||||
|
|
||||||
|
|
||||||
if ((sock=socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP))==-1) {
|
|
||||||
if(++socketopen_errs<=MAX_SOCKETOPEN_ERRS) {
|
|
||||||
log_warn("Could not open socket in is_local_addr(): %s",strerror(errno));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifc.ifc_len=sizeof(buf);
|
|
||||||
ifc.ifc_buf=buf;
|
|
||||||
if (ioctl(sock,SIOCGIFCONF,&ifc)==-1) {
|
|
||||||
if(++siocgifconf_errs<=MAX_SIOCGIFCONF_ERRS) {
|
|
||||||
log_warn("ioctl() call with request SIOCGIFCONF failed in is_local_addr(): %s",strerror(errno));
|
|
||||||
}
|
|
||||||
goto close_sock_return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt=0;
|
|
||||||
while(cnt+sizeof(struct ifreq)<=ifc.ifc_len) {
|
|
||||||
struct ifreq *ir= (struct ifreq *)(buf+cnt);
|
|
||||||
cnt += SIZEOF_ADDR_IFREQ(*ir);
|
|
||||||
if (cnt>ifc.ifc_len)
|
|
||||||
break;
|
|
||||||
if (SEL_IPVER(ir->ifr_addr.sa_family==AF_INET &&
|
|
||||||
((struct sockaddr_in *)&ir->ifr_addr)->sin_addr.s_addr==a->ipv4.s_addr,
|
|
||||||
ir->ifr_addr.sa_family==AF_INET6 &&
|
|
||||||
IN6_ARE_ADDR_EQUAL(&((struct sockaddr_in6 *)&ir->ifr_addr)->sin6_addr,
|
|
||||||
&a->ipv6)))
|
|
||||||
{
|
|
||||||
retval=1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close_sock_return:
|
|
||||||
close(sock);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
# error "Huh. No OS macro defined."
|
|
||||||
#endif
|
|
|
@ -1,32 +0,0 @@
|
||||||
/* netdev.h - Test network devices for existence and status
|
|
||||||
Copyright (C) 2000 Thomas Moestl
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _NETDEV_H_
|
|
||||||
#define _NETDEV_H_
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include "ipvers.h"
|
|
||||||
|
|
||||||
int if_up(char *devname);
|
|
||||||
int dev_up(char *ifname, char *devname);
|
|
||||||
int is_local_addr(pdnsd_a *a);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,18 +0,0 @@
|
||||||
|
|
||||||
sbin_PROGRAMS = pdnsd-ctl
|
|
||||||
|
|
||||||
pdnsd_ctl_SOURCES = pdnsd-ctl.c
|
|
||||||
pdnsd_ctl_LDADD = rr_types.o
|
|
||||||
pdnsd_ctl_DEPENDENCIES = rr_types.o
|
|
||||||
|
|
||||||
# These are Symlinks we want to have in the package
|
|
||||||
#EXTRA_DIST = rr_types.h
|
|
||||||
|
|
||||||
pdnsd-ctl.o rr_types.o: ../rr_types.h
|
|
||||||
|
|
||||||
../rr_types.h: ../make_rr_types_h.pl ../rr_types.in
|
|
||||||
perl ../make_rr_types_h.pl ../rr_types.in > ../rr_types.h
|
|
||||||
|
|
||||||
rr_types.o: %.o: ../%.c
|
|
||||||
$(COMPILE) -DCLIENT_ONLY -c $<
|
|
||||||
|
|
|
@ -1,470 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
sbin_PROGRAMS = pdnsd-ctl$(EXEEXT)
|
|
||||||
subdir = src/pdnsd-ctl
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
am__installdirs = "$(DESTDIR)$(sbindir)"
|
|
||||||
PROGRAMS = $(sbin_PROGRAMS)
|
|
||||||
am_pdnsd_ctl_OBJECTS = pdnsd-ctl.$(OBJEXT)
|
|
||||||
pdnsd_ctl_OBJECTS = $(am_pdnsd_ctl_OBJECTS)
|
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
|
||||||
am__depfiles_maybe = depfiles
|
|
||||||
am__mv = mv -f
|
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
CCLD = $(CC)
|
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
|
||||||
SOURCES = $(pdnsd_ctl_SOURCES)
|
|
||||||
DIST_SOURCES = $(pdnsd_ctl_SOURCES)
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
ALLOCA = @ALLOCA@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
builddir = @builddir@
|
|
||||||
cachedir = @cachedir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
def_id = @def_id@
|
|
||||||
distribution = @distribution@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
fullversion = @fullversion@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
packagerelease = @packagerelease@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
specbuild = @specbuild@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
thread_CFLAGS = @thread_CFLAGS@
|
|
||||||
threadlib = @threadlib@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
pdnsd_ctl_SOURCES = pdnsd-ctl.c
|
|
||||||
pdnsd_ctl_LDADD = rr_types.o
|
|
||||||
pdnsd_ctl_DEPENDENCIES = rr_types.o
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .c .o .obj
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pdnsd-ctl/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu src/pdnsd-ctl/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
install-sbinPROGRAMS: $(sbin_PROGRAMS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
|
|
||||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed 's/$(EXEEXT)$$//' | \
|
|
||||||
while read p p1; do if test -f $$p; \
|
|
||||||
then echo "$$p"; echo "$$p"; else :; fi; \
|
|
||||||
done | \
|
|
||||||
sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
|
|
||||||
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
|
||||||
sed 'N;N;N;s,\n, ,g' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
|
||||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
|
||||||
if ($$2 == $$4) files[d] = files[d] " " $$1; \
|
|
||||||
else { print "f", $$3 "/" $$4, $$1; } } \
|
|
||||||
END { for (d in files) print "f", d, files[d] }' | \
|
|
||||||
while read type dir files; do \
|
|
||||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
|
||||||
test -z "$$files" || { \
|
|
||||||
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
|
|
||||||
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
|
|
||||||
} \
|
|
||||||
; done
|
|
||||||
|
|
||||||
uninstall-sbinPROGRAMS:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo "$$p"; done | \
|
|
||||||
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
|
||||||
-e 's/$$/$(EXEEXT)/' `; \
|
|
||||||
test -n "$$list" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(sbindir)" && rm -f $$files
|
|
||||||
|
|
||||||
clean-sbinPROGRAMS:
|
|
||||||
-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
|
|
||||||
pdnsd-ctl$(EXEEXT): $(pdnsd_ctl_OBJECTS) $(pdnsd_ctl_DEPENDENCIES)
|
|
||||||
@rm -f pdnsd-ctl$(EXEEXT)
|
|
||||||
$(LINK) $(pdnsd_ctl_OBJECTS) $(pdnsd_ctl_LDADD) $(LIBS)
|
|
||||||
|
|
||||||
mostlyclean-compile:
|
|
||||||
-rm -f *.$(OBJEXT)
|
|
||||||
|
|
||||||
distclean-compile:
|
|
||||||
-rm -f *.tab.c
|
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-ctl.Po@am__quote@
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
mkid -fID $$unique
|
|
||||||
tags: TAGS
|
|
||||||
|
|
||||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile $(PROGRAMS)
|
|
||||||
installdirs:
|
|
||||||
for dir in "$(DESTDIR)$(sbindir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
|
||||||
distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am: install-sbinPROGRAMS
|
|
||||||
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-sbinPROGRAMS
|
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
|
||||||
clean-sbinPROGRAMS ctags distclean distclean-compile \
|
|
||||||
distclean-generic distclean-tags distdir dvi dvi-am html \
|
|
||||||
html-am info info-am install install-am install-data \
|
|
||||||
install-data-am install-dvi install-dvi-am install-exec \
|
|
||||||
install-exec-am install-html install-html-am install-info \
|
|
||||||
install-info-am install-man install-pdf install-pdf-am \
|
|
||||||
install-ps install-ps-am install-sbinPROGRAMS install-strip \
|
|
||||||
installcheck installcheck-am installdirs maintainer-clean \
|
|
||||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
|
||||||
mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
|
|
||||||
uninstall-am uninstall-sbinPROGRAMS
|
|
||||||
|
|
||||||
|
|
||||||
# These are Symlinks we want to have in the package
|
|
||||||
#EXTRA_DIST = rr_types.h
|
|
||||||
|
|
||||||
pdnsd-ctl.o rr_types.o: ../rr_types.h
|
|
||||||
|
|
||||||
../rr_types.h: ../make_rr_types_h.pl ../rr_types.in
|
|
||||||
perl ../make_rr_types_h.pl ../rr_types.in > ../rr_types.h
|
|
||||||
|
|
||||||
rr_types.o: %.o: ../%.c
|
|
||||||
$(COMPILE) -DCLIENT_ONLY -c $<
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
|
@ -1,799 +0,0 @@
|
||||||
/* pdnsd-ctl.c - Control pdnsd through a pipe
|
|
||||||
|
|
||||||
Copyright (C) 2000, 2001 Thomas Moestl
|
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Paul A. Rombouts
|
|
||||||
|
|
||||||
This file is part of the pdnsd package.
|
|
||||||
|
|
||||||
pdnsd is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
pdnsd is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with pdnsd; see the file COPYING. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#ifdef HAVE_ALLOCA_H
|
|
||||||
#include <alloca.h>
|
|
||||||
#endif
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/un.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stddef.h> /* for offsetof */
|
|
||||||
#include "../helpers.h"
|
|
||||||
#include "../status.h"
|
|
||||||
#include "../conff.h"
|
|
||||||
#include "../list.h"
|
|
||||||
#include "../dns.h"
|
|
||||||
#include "../rr_types.h"
|
|
||||||
#include "../cache.h"
|
|
||||||
|
|
||||||
#if !defined(HAVE_ALLOCA) && !defined(alloca)
|
|
||||||
#define alloca malloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(HAVE_STRUCT_IN6_ADDR) && defined(HAVE_INET_PTON)
|
|
||||||
# define ALLOW_AAAA IS_CACHED_AAAA
|
|
||||||
#else
|
|
||||||
# define ALLOW_AAAA 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static short int verbose=1;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *name;
|
|
||||||
int val;
|
|
||||||
} cmd_s;
|
|
||||||
|
|
||||||
#define CMD_LIST_RRTYPES (CTL_MAX+1)
|
|
||||||
#define CMD_HELP (CTL_MAX+2)
|
|
||||||
#define CMD_VERSION (CTL_MAX+3)
|
|
||||||
|
|
||||||
static const cmd_s top_cmds[]={
|
|
||||||
{"help",CMD_HELP},{"version",CMD_VERSION},{"list-rrtypes",CMD_LIST_RRTYPES},
|
|
||||||
{"status",CTL_STATS},{"server",CTL_SERVER},{"record",CTL_RECORD},
|
|
||||||
{"source",CTL_SOURCE},{"add",CTL_ADD},{"neg",CTL_NEG},
|
|
||||||
{"config",CTL_CONFIG},{"include",CTL_INCLUDE},{"eval",CTL_EVAL},
|
|
||||||
{"empty-cache",CTL_EMPTY}, {"dump",CTL_DUMP},
|
|
||||||
{NULL,0}
|
|
||||||
};
|
|
||||||
static const cmd_s server_cmds[]= {{"up",CTL_S_UP},{"down",CTL_S_DOWN},{"retest",CTL_S_RETEST},{NULL,0}};
|
|
||||||
static const cmd_s record_cmds[]= {{"delete",CTL_R_DELETE},{"invalidate",CTL_R_INVAL},{NULL,0}};
|
|
||||||
static const cmd_s onoff_cmds[]= {{"off",0},{"on",1},{NULL,0}};
|
|
||||||
static const cmd_s rectype_cmds[]= {{"a",T_A},
|
|
||||||
#if ALLOW_AAAA
|
|
||||||
{"aaaa",T_AAAA},
|
|
||||||
#endif
|
|
||||||
{"ptr",T_PTR},{"cname",T_CNAME},{"mx",T_MX},{"ns",T_NS},{NULL,0}};
|
|
||||||
|
|
||||||
static const char version_message[] =
|
|
||||||
"pdnsd-ctl, version pdnsd-" VERSION "\n\n";
|
|
||||||
|
|
||||||
static const char license_statement[] =
|
|
||||||
"Copyright (C) 2000, 2001 Thomas Moestl\n"
|
|
||||||
"Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Paul A. Rombouts\n\n"
|
|
||||||
"This program is part of the pdnsd package.\n\n"
|
|
||||||
"pdnsd is free software; you can redistribute it and/or modify\n"
|
|
||||||
"it under the terms of the GNU General Public License as published by\n"
|
|
||||||
"the Free Software Foundation; either version 3 of the License, or\n"
|
|
||||||
"(at your option) any later version.\n\n"
|
|
||||||
"pdnsd is distributed in the hope that it will be useful,\n"
|
|
||||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
|
||||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
|
||||||
"GNU General Public License for more details.\n\n"
|
|
||||||
"You should have received a copy of the GNU General Public License\n"
|
|
||||||
"along with pdsnd; see the file COPYING. If not, see\n"
|
|
||||||
"<http://www.gnu.org/licenses/>.\n";
|
|
||||||
|
|
||||||
static const char *const help_messages[] =
|
|
||||||
{
|
|
||||||
"Usage: pdnsd-ctl [-c cachedir] [-q] <command> [arguments]\n\n"
|
|
||||||
|
|
||||||
"Command-line options:\n"
|
|
||||||
|
|
||||||
"-c\tcachedir\n\tSet the cache directory to cachedir (must match pdnsd setting).\n"
|
|
||||||
"\tThe default is '" CACHEDIR "'.\n"
|
|
||||||
"-q\n\tBe quiet unless output is specified by command or something goes wrong.\n\n"
|
|
||||||
|
|
||||||
"Commands and needed arguments are:\n"
|
|
||||||
|
|
||||||
"help\t[no arguments]\n\tPrint this help.\n"
|
|
||||||
"version\t[no arguments]\n\tPrint version and license info.\n",
|
|
||||||
|
|
||||||
"status\t[no arguments]\n\tPrint pdnsd's status.\n",
|
|
||||||
|
|
||||||
"server\t(index|label)\t(up|down|retest)\t[dns1[,dns2[,...]]]\n"
|
|
||||||
"\tSet the status of the server with the given index to up or down, or\n"
|
|
||||||
"\tforce a retest. The index is assigned in the order of definition in\n"
|
|
||||||
"\tpdnsd.conf starting with 0. Use the status command to see the indexes.\n"
|
|
||||||
"\tYou can specify the label of a server (that matches the label option)\n"
|
|
||||||
"\tinstead of an index to make this easier.\n"
|
|
||||||
|
|
||||||
"\tYou can specify all instead of an index to perform the action for all\n"
|
|
||||||
"\tservers registered with pdnsd.\n"
|
|
||||||
|
|
||||||
"\tAn optional third argument can be given consisting of a list of IP\n"
|
|
||||||
"\taddresses separated by commas or spaces. This list will replace the\n"
|
|
||||||
"\taddresses of name servers used by pdnsd for the given server section.\n"
|
|
||||||
"\tThis feature is useful for run-time configuration of pdnsd with dynamic\n"
|
|
||||||
"\tDNS data in scripts called by ppp or DHCP clients. The last argument\n"
|
|
||||||
"\tmay also be an empty string, which causes existing IP addresses to be\n"
|
|
||||||
"\tremoved and the corresponding server section to become inactive.\n",
|
|
||||||
|
|
||||||
"record\tname\t(delete|invalidate)\n"
|
|
||||||
"\tDelete or invalidate the record of the given domain if it is in the\n"
|
|
||||||
"\tcache.\n",
|
|
||||||
|
|
||||||
"source\tfn\towner\t[ttl]\t[(on|off)]\t[noauth]\n"
|
|
||||||
"\tLoad a hosts-style file. Works like using the pdnsd source\n"
|
|
||||||
"\tconfiguration section.\n"
|
|
||||||
"\tOwner and ttl are used as in the source section. ttl has a default\n"
|
|
||||||
"\tof 900 (it does not need to be specified). The next to last argument\n"
|
|
||||||
"\tcorresponds to the serve_aliases option, and is off by default.\n"
|
|
||||||
"\tnoauth is used to make the domains non-authoritative (please\n"
|
|
||||||
"\tconsult the pdnsd manual for what that means).\n"
|
|
||||||
"\tfn is the name of the file, which must be readable by pdnsd.\n",
|
|
||||||
|
|
||||||
"add\ta\taddr\tname\t[ttl]\t[noauth]\n"
|
|
||||||
#if ALLOW_AAAA
|
|
||||||
"add\taaaa\taddr\tname\t[ttl]\t[noauth]\n"
|
|
||||||
#endif
|
|
||||||
"add\tptr\thost\tname\t[ttl]\t[noauth]\n"
|
|
||||||
"add\tcname\thost\tname\t[ttl]\t[noauth]\n"
|
|
||||||
"add\tmx\thost\tname\tpref\t[ttl]\t[noauth]\n"
|
|
||||||
"add\tns\thost\tname\t[ttl]\t[noauth]\n"
|
|
||||||
"\tAdd a record of the given type to the pdnsd cache, replacing existing\n"
|
|
||||||
"\trecords for the same name and type. The 2nd argument corresponds\n"
|
|
||||||
"\tto the value of the option in the rr section that is named like\n"
|
|
||||||
"\tthe first argument. The addr argument may be a list of IP addresses,\n"
|
|
||||||
"\tseparated by commas or white space. The ttl is optional, the default is\n"
|
|
||||||
"\t900 seconds. noauth is used to make the domains non-authoritative.\n"
|
|
||||||
"\tIf you want no other record than the newly added in the cache, do\n"
|
|
||||||
"\tpdnsdctl record <name> delete\n"
|
|
||||||
"\tbefore adding records.\n",
|
|
||||||
|
|
||||||
"neg\tname\t[type]\t[ttl]\n"
|
|
||||||
"\tAdd a negatively cached record to pdnsd's cache, replacing existing\n"
|
|
||||||
"\trecords for the same name and type. If no type is given, the whole\n"
|
|
||||||
"\tdomain is cached negatively. For negatively cached records, errors are\n"
|
|
||||||
"\timmediately returned on a query, without querying other servers first.\n"
|
|
||||||
"\tThe ttl is optional, the default is 900 seconds.\n",
|
|
||||||
|
|
||||||
"config\t[filename]\n"
|
|
||||||
"\tReload pdnsd's configuration file.\n"
|
|
||||||
"\tThe config file must be owned by the uid that pdnsd had when it was\n"
|
|
||||||
"\tstarted, and be readable by pdnsd's run_as uid. If no file name is\n"
|
|
||||||
"\tspecified, the config file used at start up is reloaded.\n",
|
|
||||||
|
|
||||||
"include\tfilename\n"
|
|
||||||
"\tParse the given file as an include file, which may contain the same\n"
|
|
||||||
"\ttype of sections as a config file, expect for global and server\n"
|
|
||||||
"\tsections, which are not allowed. This command can be used to add data\n"
|
|
||||||
"\tto the cache without reconfiguring pdnsd.\n",
|
|
||||||
|
|
||||||
"eval\tstring\n"
|
|
||||||
"\tParse string as if it were part of pdnsd's configuration file.\n"
|
|
||||||
"\tThe string should hold one or more complete configuration sections,\n"
|
|
||||||
"\tbut no global and server sections, which are not allowed.\n"
|
|
||||||
"\tIf multiple strings are given, they will be joined using newline chars\n"
|
|
||||||
"\tand parsed together.\n",
|
|
||||||
|
|
||||||
"empty-cache\t[[+|-]name ...]\n"
|
|
||||||
"\tDelete all entries in the cache matching include/exclude rules.\n"
|
|
||||||
"\tIf no arguments are provided, the cache is completely emptied,\n"
|
|
||||||
"\tfreeing all existing entries. This also removes \"local\" records,\n"
|
|
||||||
"\tas defined by the config file. To restore local records, run\n"
|
|
||||||
"\t\"pdnsd-ctl config\" or \"pdnsd-ctl include filename\" immediately\n"
|
|
||||||
"\tafterwards.\n"
|
|
||||||
"\tIf one or more arguments are provided, these are interpreted as \n"
|
|
||||||
"\tinclude/exclude names. If an argument starts with a '+' the name is to\n"
|
|
||||||
"\tbe included. If an argument starts with a '-' it is to be excluded.\n"
|
|
||||||
"\tIf an argument does not begin with '+' or '-', a '+' is assumed.\n"
|
|
||||||
"\tIf the domain name of a cache entry ends in one of the names in the\n"
|
|
||||||
"\tlist, the first match will determine what happens. If the matching name\n"
|
|
||||||
"\tis to be included, the cache entry is deleted, otherwise it remains.\n"
|
|
||||||
"\tIf there are no matches, the default action is not to delete.\n",
|
|
||||||
|
|
||||||
"dump\t[name]\n"
|
|
||||||
"\tPrint information stored in the cache about name.\n"
|
|
||||||
"\tIf name begins with a dot and is not the root domain, information\n"
|
|
||||||
"\tabout the names in the cache ending in name (including name without\n"
|
|
||||||
"\tthe leading dot) will be printed. If name is missing, information about\n"
|
|
||||||
"\tall the names in the cache will be printed.\n",
|
|
||||||
|
|
||||||
"list-rrtypes\t[no arguments]\n"
|
|
||||||
"\tList available rr types for the neg command. Note that those are only\n"
|
|
||||||
"\tused for the neg command, not for add!\n"
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUM_HELP_MESSAGES (sizeof(help_messages)/sizeof(char*))
|
|
||||||
|
|
||||||
|
|
||||||
/* Open connection to control socket and send command code.
|
|
||||||
If successful, open_sock returns a file descriptor for the new socket,
|
|
||||||
otherwise the program is aborted.
|
|
||||||
*/
|
|
||||||
static int open_sock(const char *cache_dir, uint16_t cmd)
|
|
||||||
{
|
|
||||||
struct sockaddr_un *sa;
|
|
||||||
unsigned int sa_len;
|
|
||||||
int sock;
|
|
||||||
uint16_t nc;
|
|
||||||
|
|
||||||
if ((sock=socket(PF_UNIX,SOCK_STREAM,0))==-1) {
|
|
||||||
perror("Error: could not open socket");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
sa_len = (offsetof(struct sockaddr_un, sun_path) + strlitlen("/pdnsd.status") + strlen(cache_dir));
|
|
||||||
sa=(struct sockaddr_un *)alloca(sa_len+1);
|
|
||||||
sa->sun_family=AF_UNIX;
|
|
||||||
stpcpy(stpcpy(sa->sun_path,cache_dir),"/pdnsd.status");
|
|
||||||
|
|
||||||
if (connect(sock,(struct sockaddr *)sa,sa_len)==-1) {
|
|
||||||
fprintf(stderr,"Error: could not open socket %s: %s\n",sa->sun_path,strerror(errno));
|
|
||||||
close(sock);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
if(verbose) printf("Opening socket %s\n",sa->sun_path);
|
|
||||||
|
|
||||||
/* Send command code */
|
|
||||||
|
|
||||||
nc=htons(cmd|CTL_CMDVERNR); /* Add magic number, convert to network byte order. */
|
|
||||||
|
|
||||||
if (write(sock,&nc,sizeof(nc))!=sizeof(nc)) {
|
|
||||||
perror("Error: could not write command code");
|
|
||||||
close(sock);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sock;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void send_long(int fd,uint32_t cmd)
|
|
||||||
{
|
|
||||||
uint32_t nc=htonl(cmd);
|
|
||||||
|
|
||||||
if (write(fd,&nc,sizeof(nc))!=sizeof(nc)) {
|
|
||||||
perror("Error: could not write long");
|
|
||||||
close(fd);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void send_short(int fd,uint16_t cmd)
|
|
||||||
{
|
|
||||||
uint16_t nc=htons(cmd);
|
|
||||||
|
|
||||||
if (write(fd,&nc,sizeof(nc))!=sizeof(nc)) {
|
|
||||||
perror("Error: could not write short");
|
|
||||||
close(fd);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAXSENDSTRLEN 0xfffe
|
|
||||||
|
|
||||||
static void send_string(int fd, const char *s)
|
|
||||||
{
|
|
||||||
if(s) {
|
|
||||||
size_t len=strlen(s);
|
|
||||||
if(len>MAXSENDSTRLEN) {
|
|
||||||
fprintf(stderr,"Error: send_string: string length (%lu) exceeds maximum (%u).\n",
|
|
||||||
(unsigned long)len, MAXSENDSTRLEN);
|
|
||||||
close(fd);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
send_short(fd,len);
|
|
||||||
if (write_all(fd,s,len)!=len) {
|
|
||||||
perror("Error: could not write string");
|
|
||||||
close(fd);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
send_short(fd, ~0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t read_short(int fd)
|
|
||||||
{
|
|
||||||
ssize_t err;
|
|
||||||
uint16_t nc;
|
|
||||||
|
|
||||||
if ((err=read(fd,&nc,sizeof(nc)))!=sizeof(nc)) {
|
|
||||||
fprintf(stderr,"Error: could not read short: %s\n",err<0?strerror(errno):"unexpected EOF");
|
|
||||||
close(fd);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
return ntohs(nc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* copy data from file descriptor fd to file stream out until EOF
|
|
||||||
or error is encountered.
|
|
||||||
*/
|
|
||||||
static ssize_t copymsgtofile(int fd, FILE* out)
|
|
||||||
{
|
|
||||||
ssize_t n,ntot=0;
|
|
||||||
char buf[1024];
|
|
||||||
|
|
||||||
while ((n=read(fd,buf,sizeof(buf)))>0)
|
|
||||||
ntot+=fwrite(buf,1,n,out);
|
|
||||||
|
|
||||||
if(n<0)
|
|
||||||
return n;
|
|
||||||
|
|
||||||
return ntot;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int match_cmd(const char *cmd, const cmd_s cmds[])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0; cmds[i].name; ++i) {
|
|
||||||
if (strcasecmp(cmd,cmds[i].name)==0)
|
|
||||||
return cmds[i].val;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char *cache_dir= CACHEDIR;
|
|
||||||
int rv=0;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *arg;
|
|
||||||
for(i=1; i<argc && (arg=argv[i]) && *arg=='-'; ++i) {
|
|
||||||
if(!strcmp(arg,"-c")) {
|
|
||||||
if(++i<argc) {
|
|
||||||
cache_dir= argv[i];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stderr,"file name expected after -c option.\n");
|
|
||||||
goto print_try_pdnsd_ctl_help;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(!strcmp(arg,"-q")) {
|
|
||||||
verbose=0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stderr,"Unknown option: %s\n",arg);
|
|
||||||
goto print_try_pdnsd_ctl_help;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
argc -= i;
|
|
||||||
argv += i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (argc<1) {
|
|
||||||
fprintf(stderr,"No command specified.\n");
|
|
||||||
print_try_pdnsd_ctl_help:
|
|
||||||
fprintf(stderr,"Try 'pdnsd-ctl help' for available commands and options.\n");
|
|
||||||
exit(2);
|
|
||||||
} else {
|
|
||||||
int pf,acnt=0,cmd;
|
|
||||||
|
|
||||||
cmd=match_cmd(argv[0],top_cmds);
|
|
||||||
if(cmd==-1) {
|
|
||||||
fprintf(stderr,"Command not recognized: %s\n",argv[0]);
|
|
||||||
goto print_try_pdnsd_ctl_help;
|
|
||||||
}
|
|
||||||
switch (cmd) {
|
|
||||||
case CMD_HELP: {
|
|
||||||
int i;
|
|
||||||
fputs(version_message,stdout);
|
|
||||||
for(i=0; i<NUM_HELP_MESSAGES; ++i)
|
|
||||||
fputs(help_messages[i],stdout);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_VERSION:
|
|
||||||
fputs(version_message,stdout);
|
|
||||||
fputs(license_statement,stdout);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_LIST_RRTYPES: {
|
|
||||||
int i;
|
|
||||||
if (argc!=1)
|
|
||||||
goto wrong_args;
|
|
||||||
printf("Available RR types for the neg command:\n");
|
|
||||||
for (i=0; i<NRRTOT; ++i)
|
|
||||||
printf("%s\n",rrnames[rrcachiterlist[i]-T_MIN]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CTL_STATS:
|
|
||||||
if (argc!=1)
|
|
||||||
goto wrong_args;
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
goto copy_pf;
|
|
||||||
|
|
||||||
case CTL_SERVER: {
|
|
||||||
int server_cmd;
|
|
||||||
if (argc<3 || argc>4)
|
|
||||||
goto wrong_args;
|
|
||||||
acnt=2;
|
|
||||||
server_cmd=match_cmd(argv[2],server_cmds);
|
|
||||||
if(server_cmd==-1) goto bad_arg;
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_string(pf,argv[1]);
|
|
||||||
send_short(pf,server_cmd);
|
|
||||||
send_string(pf,argc<4?NULL:argv[3]);
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_RECORD: {
|
|
||||||
int record_cmd;
|
|
||||||
if (argc!=3)
|
|
||||||
goto wrong_args;
|
|
||||||
acnt=2;
|
|
||||||
record_cmd=match_cmd(argv[2],record_cmds);
|
|
||||||
if(record_cmd==-1) goto bad_arg;
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_short(pf,record_cmd);
|
|
||||||
send_string(pf,argv[1]);
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_SOURCE: {
|
|
||||||
long ttl;
|
|
||||||
int servaliases,flags;
|
|
||||||
if (argc<3 || argc>6)
|
|
||||||
goto wrong_args;
|
|
||||||
ttl=900;
|
|
||||||
flags=DF_LOCAL;
|
|
||||||
acnt=3;
|
|
||||||
if (argc==6 || (argc>=4 && isdigit(argv[3][0]))) {
|
|
||||||
char *endptr;
|
|
||||||
ttl=strtol(argv[3],&endptr,0);
|
|
||||||
if (*endptr)
|
|
||||||
goto bad_arg;
|
|
||||||
acnt++;
|
|
||||||
}
|
|
||||||
servaliases=0;
|
|
||||||
if (acnt<argc && (argc==6 || strcasecmp(argv[acnt], "noauth"))) {
|
|
||||||
servaliases=match_cmd(argv[acnt],onoff_cmds);
|
|
||||||
if(servaliases==-1) goto bad_arg;
|
|
||||||
acnt++;
|
|
||||||
}
|
|
||||||
if (acnt<argc) {
|
|
||||||
if (!strcasecmp(argv[acnt], "noauth"))
|
|
||||||
flags=0;
|
|
||||||
else
|
|
||||||
goto bad_arg;
|
|
||||||
}
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_string(pf,argv[1]);
|
|
||||||
send_string(pf,argv[2]);
|
|
||||||
send_long(pf,ttl);
|
|
||||||
send_short(pf,servaliases);
|
|
||||||
send_short(pf,flags);
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_ADD: {
|
|
||||||
long ttl;
|
|
||||||
int tp,flags,pref;
|
|
||||||
unsigned int nadr;
|
|
||||||
size_t adrsz, adrbufsz;
|
|
||||||
char *q;
|
|
||||||
|
|
||||||
if (argc<2) goto wrong_args;
|
|
||||||
acnt=1;
|
|
||||||
tp=match_cmd(argv[1],rectype_cmds);
|
|
||||||
if(tp==-1) goto bad_arg;
|
|
||||||
acnt=((tp==T_MX)?5:4);
|
|
||||||
if (argc<acnt || argc>acnt+2)
|
|
||||||
goto wrong_args;
|
|
||||||
|
|
||||||
ttl=900;
|
|
||||||
flags=DF_LOCAL;
|
|
||||||
pref=0;
|
|
||||||
if(tp==T_MX) {
|
|
||||||
char *endptr;
|
|
||||||
pref=strtol(argv[4],&endptr,0);
|
|
||||||
if (*endptr) {
|
|
||||||
acnt=4;
|
|
||||||
goto bad_arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (acnt<argc && strcasecmp(argv[acnt],"noauth")) {
|
|
||||||
char *endptr;
|
|
||||||
ttl=strtol(argv[acnt],&endptr,0);
|
|
||||||
if (*endptr)
|
|
||||||
goto bad_arg;
|
|
||||||
acnt++;
|
|
||||||
}
|
|
||||||
if (acnt<argc && !strcasecmp(argv[acnt],"noauth")) {
|
|
||||||
flags=0;
|
|
||||||
acnt++;
|
|
||||||
}
|
|
||||||
if (acnt<argc)
|
|
||||||
goto bad_arg;
|
|
||||||
|
|
||||||
nadr=0; adrsz=0;
|
|
||||||
switch (tp) {
|
|
||||||
case T_A:
|
|
||||||
adrsz= sizeof(struct in_addr);
|
|
||||||
#if ALLOW_AAAA
|
|
||||||
goto count_addresses;
|
|
||||||
case T_AAAA:
|
|
||||||
adrsz= sizeof(struct in6_addr);
|
|
||||||
count_addresses:
|
|
||||||
#endif
|
|
||||||
/* first count the number of comma- or space-delimited address strings,
|
|
||||||
ignoring blank strings. */
|
|
||||||
for(q=argv[2];;) {
|
|
||||||
for(;;++q) {
|
|
||||||
if(!*q) goto finished_counting_addresses;
|
|
||||||
if(*q!=',' && !isspace(*q)) break;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
++q;
|
|
||||||
} while(*q && *q!=',' && !isspace(*q));
|
|
||||||
++nadr;
|
|
||||||
}
|
|
||||||
finished_counting_addresses:
|
|
||||||
if (!nadr) {
|
|
||||||
fprintf(stderr,"Empty IP list for 'add %s' command.\n", argv[1]);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
adrbufsz = nadr*adrsz;
|
|
||||||
{
|
|
||||||
/* Variable-size array for storing IP addresses. */
|
|
||||||
unsigned char adrbuf[adrbufsz] __attribute__((aligned));
|
|
||||||
|
|
||||||
switch (tp) {
|
|
||||||
case T_A:
|
|
||||||
#if ALLOW_AAAA
|
|
||||||
case T_AAAA:
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/* Convert the address strings into binary addresses and
|
|
||||||
store them in adrbuf. */
|
|
||||||
unsigned char *adrp = adrbuf;
|
|
||||||
for(q=argv[2];;) {
|
|
||||||
char *p; size_t len;
|
|
||||||
for(;;++q) {
|
|
||||||
if(!*q) goto finished_converting_addresses;
|
|
||||||
if(*q!=',' && !isspace(*q)) break;
|
|
||||||
}
|
|
||||||
p=q;
|
|
||||||
do {
|
|
||||||
++q;
|
|
||||||
} while(*q && *q!=',' && !isspace(*q));
|
|
||||||
len = q-p;
|
|
||||||
{
|
|
||||||
char tmpbuf[len+1];
|
|
||||||
memcpy(tmpbuf,p,len);
|
|
||||||
tmpbuf[len]=0;
|
|
||||||
|
|
||||||
if(
|
|
||||||
#if ALLOW_AAAA
|
|
||||||
tp==T_AAAA? inet_pton(AF_INET6,tmpbuf,adrp)<=0:
|
|
||||||
#endif
|
|
||||||
!inet_aton(tmpbuf,(struct in_addr *)adrp))
|
|
||||||
{
|
|
||||||
fprintf(stderr,"Bad IP for 'add %s' command: %s\n",
|
|
||||||
argv[1],tmpbuf);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
adrp += adrsz;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finished_converting_addresses:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_short(pf,tp);
|
|
||||||
send_string(pf,argv[3]);
|
|
||||||
send_long(pf,ttl);
|
|
||||||
send_short(pf,flags);
|
|
||||||
|
|
||||||
switch (tp) {
|
|
||||||
case T_A:
|
|
||||||
#if ALLOW_AAAA
|
|
||||||
case T_AAAA:
|
|
||||||
#endif
|
|
||||||
send_short(pf,nadr);
|
|
||||||
if(write_all(pf,adrbuf,adrbufsz)!=adrbufsz) {
|
|
||||||
perror("Error: could not send IP address(es)");
|
|
||||||
close(pf);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_MX:
|
|
||||||
send_short(pf,pref);
|
|
||||||
/* fall through */
|
|
||||||
case T_PTR:
|
|
||||||
case T_CNAME:
|
|
||||||
case T_NS:
|
|
||||||
send_string(pf,argv[2]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_NEG: {
|
|
||||||
long ttl;
|
|
||||||
int tp;
|
|
||||||
|
|
||||||
if (argc<2 || argc>4)
|
|
||||||
goto wrong_args;
|
|
||||||
tp=255;
|
|
||||||
ttl=900;
|
|
||||||
acnt=2;
|
|
||||||
if (argc==3) {
|
|
||||||
if (isdigit(argv[2][0])) {
|
|
||||||
char *endptr;
|
|
||||||
ttl=strtol(argv[2],&endptr,0);
|
|
||||||
if (*endptr)
|
|
||||||
goto bad_arg;
|
|
||||||
} else if ((tp=rr_tp_byname(argv[2]))==-1) {
|
|
||||||
goto bad_type;
|
|
||||||
}
|
|
||||||
} else if (argc==4) {
|
|
||||||
char *endptr;
|
|
||||||
if ((tp=rr_tp_byname(argv[2]))==-1)
|
|
||||||
goto bad_type;
|
|
||||||
ttl=strtol(argv[3],&endptr,0);
|
|
||||||
if (*endptr) {
|
|
||||||
acnt=3;
|
|
||||||
goto bad_arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_string(pf,argv[1]);
|
|
||||||
send_short(pf,tp);
|
|
||||||
send_long(pf,ttl);
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_CONFIG:
|
|
||||||
if (argc>2)
|
|
||||||
goto wrong_args;
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_string(pf,argc<2?NULL:argv[1]);
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_INCLUDE:
|
|
||||||
if (argc!=2)
|
|
||||||
goto wrong_args;
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_string(pf,argv[1]);
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_EVAL: {
|
|
||||||
int i; size_t bufsz;
|
|
||||||
|
|
||||||
if (argc<2)
|
|
||||||
goto wrong_args;
|
|
||||||
bufsz=0;
|
|
||||||
for(i=1; i<argc; ++i)
|
|
||||||
bufsz += strlen(argv[i])+1;
|
|
||||||
|
|
||||||
if(bufsz>MAXSENDSTRLEN) {
|
|
||||||
fprintf(stderr,"Cannot send 'eval' command: "
|
|
||||||
"string length (%lu) exceeds maximum (%u).\n",
|
|
||||||
(unsigned long)bufsz, MAXSENDSTRLEN);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_short(pf,bufsz);
|
|
||||||
{
|
|
||||||
/* Variable-size array for storing the joined strings. */
|
|
||||||
char buf[bufsz];
|
|
||||||
char *p=buf;
|
|
||||||
for(i=1; i<argc; ++i) {
|
|
||||||
p=stpcpy(p,argv[i]);
|
|
||||||
*p++ = '\n';
|
|
||||||
}
|
|
||||||
if(write_all(pf,buf,bufsz)!=bufsz) {
|
|
||||||
perror("Error: could not write string");
|
|
||||||
close(pf);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_EMPTY: {
|
|
||||||
int i; size_t totsz=0;
|
|
||||||
for(i=1; i<argc; ++i)
|
|
||||||
totsz += strlen(argv[i])+1;
|
|
||||||
|
|
||||||
if(totsz>MAXSENDSTRLEN) {
|
|
||||||
fprintf(stderr,"Cannot send 'empty' command: "
|
|
||||||
"string length (%lu) exceeds maximum (%u).\n",
|
|
||||||
(unsigned long)totsz, MAXSENDSTRLEN);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
if(argc>1) {
|
|
||||||
send_short(pf,totsz);
|
|
||||||
for(i=1; i<argc; ++i) {
|
|
||||||
size_t sz=strlen(argv[i])+1;
|
|
||||||
if(write_all(pf,argv[i],sz)!=sz) {
|
|
||||||
perror("Error: could not write string");
|
|
||||||
close(pf);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
send_short(pf,~0);
|
|
||||||
}
|
|
||||||
goto read_retval;
|
|
||||||
|
|
||||||
case CTL_DUMP:
|
|
||||||
if (argc>2)
|
|
||||||
goto wrong_args;
|
|
||||||
pf=open_sock(cache_dir, cmd);
|
|
||||||
send_string(pf,argc<2?NULL:argv[1]);
|
|
||||||
copy_pf:
|
|
||||||
if((rv=read_short(pf)))
|
|
||||||
goto retval_failed;
|
|
||||||
if(copymsgtofile(pf,stdout)<0) {
|
|
||||||
perror("Error while reading from socket");
|
|
||||||
close(pf);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
goto close_pf;
|
|
||||||
|
|
||||||
read_retval:
|
|
||||||
if((rv=read_short(pf))) {
|
|
||||||
retval_failed:
|
|
||||||
fprintf(stderr,"Failed: ");
|
|
||||||
if(copymsgtofile(pf,stderr)<0)
|
|
||||||
fprintf(stderr,"(could not read error message from socket: %s)",strerror(errno));
|
|
||||||
|
|
||||||
fputc('\n',stderr);
|
|
||||||
}
|
|
||||||
close_pf:
|
|
||||||
if(close(pf)==-1)
|
|
||||||
perror("Couldn't close socket");
|
|
||||||
else if (rv==0 && verbose)
|
|
||||||
printf("Succeeded\n");
|
|
||||||
break;
|
|
||||||
wrong_args:
|
|
||||||
fprintf(stderr,"Wrong number of arguments for '%s' command.\n",argv[0]);
|
|
||||||
goto print_cmd_usage;
|
|
||||||
bad_arg:
|
|
||||||
fprintf(stderr,"Bad argument for '%s' command: %s\n",argv[0],argv[acnt]);
|
|
||||||
print_cmd_usage:
|
|
||||||
fprintf(stderr,"Usage:\n\n%s\n"
|
|
||||||
"Try 'pdnsd-ctl help' for a description of all available commands and options.\n",
|
|
||||||
help_messages[cmd]);
|
|
||||||
exit(2);
|
|
||||||
bad_type:
|
|
||||||
fprintf(stderr,"Bad (type) argument for '%s' command: %s\n"
|
|
||||||
"Run 'pdnsd-ctl list-rrtypes' for a list of available rr types.\n",
|
|
||||||
argv[0],argv[acnt]);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue