add pdnsd library in for vpn service DNS!
This commit is contained in:
parent
29fd07ac34
commit
56683a39b3
|
@ -0,0 +1,58 @@
|
|||
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!
|
|
@ -0,0 +1,674 @@
|
|||
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>.
|
|
@ -0,0 +1,26 @@
|
|||
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.
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,161 @@
|
|||
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.
|
|
@ -0,0 +1,190 @@
|
|||
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.
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
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
|
||||
|
|
@ -0,0 +1,734 @@
|
|||
# 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:
|
|
@ -0,0 +1,324 @@
|
|||
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.
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
# 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
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
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
|
|
@ -0,0 +1,216 @@
|
|||
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>.
|
|
@ -0,0 +1,249 @@
|
|||
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>.
|
|
@ -0,0 +1,66 @@
|
|||
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
|
|
@ -0,0 +1,20 @@
|
|||
- 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.
|
|
@ -0,0 +1,191 @@
|
|||
#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
|
@ -0,0 +1,142 @@
|
|||
#! /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:
|
|
@ -0,0 +1,437 @@
|
|||
/* 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 */
|
|
@ -0,0 +1,430 @@
|
|||
/* 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
|
@ -0,0 +1,548 @@
|
|||
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
|
||||
])
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
EXTRA_DIST = pdnsd_dhcp.pl dhcp2pdnsd change_pdnsd_server_ip.pl README
|
|
@ -0,0 +1,323 @@
|
|||
# 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:
|
|
@ -0,0 +1,30 @@
|
|||
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
|
|
@ -0,0 +1,124 @@
|
|||
#!/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;
|
|
@ -0,0 +1,45 @@
|
|||
#! /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
|
|
@ -0,0 +1,246 @@
|
|||
#!/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";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,530 @@
|
|||
#! /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:
|
|
@ -0,0 +1,5 @@
|
|||
%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
|
|
@ -0,0 +1,323 @@
|
|||
#!/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:
|
|
@ -0,0 +1,360 @@
|
|||
#! /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:
|
|
@ -0,0 +1,244 @@
|
|||
# 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
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
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
|
||||
|
|
@ -0,0 +1,921 @@
|
|||
# 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
|
@ -0,0 +1,306 @@
|
|||
/* 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
|
|
@ -0,0 +1,238 @@
|
|||
/* 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
|
@ -0,0 +1,29 @@
|
|||
/* 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 */
|
|
@ -0,0 +1,544 @@
|
|||
/* 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;
|
||||
}
|
|
@ -0,0 +1,190 @@
|
|||
/* 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
|
|
@ -0,0 +1,133 @@
|
|||
/* 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!";
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
/* 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
|
|
@ -0,0 +1,64 @@
|
|||
/* 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
|
|
@ -0,0 +1,52 @@
|
|||
/* 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 */
|
|
@ -0,0 +1,617 @@
|
|||
/* 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
|
|
@ -0,0 +1,309 @@
|
|||
/* 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
|
@ -0,0 +1,40 @@
|
|||
/* 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
|
@ -0,0 +1,51 @@
|
|||
/* 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
|
|
@ -0,0 +1,142 @@
|
|||
/* 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 */
|
|
@ -0,0 +1,115 @@
|
|||
/* 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
|
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* 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
|
|
@ -0,0 +1,322 @@
|
|||
/* 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
|
|
@ -0,0 +1,83 @@
|
|||
/* 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
|
|
@ -0,0 +1,795 @@
|
|||
/* 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
|
|
@ -0,0 +1,319 @@
|
|||
/* 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 */
|
|
@ -0,0 +1,544 @@
|
|||
/* 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)*/
|
|
@ -0,0 +1,43 @@
|
|||
/* 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
|
|
@ -0,0 +1,297 @@
|
|||
/* 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
|
|
@ -0,0 +1,171 @@
|
|||
/* 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;
|
||||
}
|
|
@ -0,0 +1,170 @@
|
|||
/* 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 */
|
|
@ -0,0 +1,710 @@
|
|||
/* 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);
|
||||
}
|
|
@ -0,0 +1,309 @@
|
|||
#!/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
|
|
@ -0,0 +1,363 @@
|
|||
/* 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
|
|
@ -0,0 +1,32 @@
|
|||
/* 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
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
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 $<
|
||||
|
|
@ -0,0 +1,470 @@
|
|||
# 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:
|
|
@ -0,0 +1,799 @@
|
|||
/* 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;
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
/* This include file was added by Paul A. Rombouts.
|
||||
I had terrible difficulties with cyclic dependencies of the include files
|
||||
written by Thomas Moestl. The only way I knew how to break the cycle was to
|
||||
put some declarations in a seperate file.
|
||||
|
||||
Copyright (C) 2000, 2001 Thomas Moestl
|
||||
Copyright (C) 2002 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 PDNSD_ASSERT_H
|
||||
#define PDNSD_ASSERT_H
|
||||
|
||||
/* Originally in helpers.h */
|
||||
|
||||
/* format string checking for printf-like functions */
|
||||
#ifdef __GNUC__
|
||||
#define printfunc(fmt, firstva) __attribute__((__format__(__printf__, fmt, firstva)))
|
||||
#else
|
||||
#define printfunc(fmt, firstva)
|
||||
#endif
|
||||
|
||||
void pdnsd_exit(void);
|
||||
|
||||
|
||||
/*
|
||||
* Assert macro, used in some places. For now, it should be always defined, not
|
||||
* only in the DEBUG case, to be on the safe side security-wise.
|
||||
*/
|
||||
#define PDNSD_ASSERT(cond, msg) \
|
||||
{ if (!(cond)) { \
|
||||
log_error("%s:%d: %s", __FILE__, __LINE__, msg); \
|
||||
pdnsd_exit(); \
|
||||
} }
|
||||
|
||||
#endif
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "ArchLinux" ] ; then \
|
||||
$(mkinstalldirs) "$(DESTDIR)/etc/rc.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/pdnsd";\
|
||||
fi
|
||||
|
|
@ -0,0 +1,332 @@
|
|||
# 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 = src/rc/ArchLinux
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/pdnsd.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
|
||||
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@
|
||||
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 src/rc/ArchLinux/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/rc/ArchLinux/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: $(top_builddir)/config.status $(srcdir)/pdnsd.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
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-exec-local
|
||||
|
||||
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-exec-local \
|
||||
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
|
||||
|
||||
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "ArchLinux" ] ; then \
|
||||
$(mkinstalldirs) "$(DESTDIR)/etc/rc.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/pdnsd";\
|
||||
fi
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,45 @@
|
|||
#!/bin/bash
|
||||
|
||||
. /etc/rc.conf
|
||||
. /etc/rc.d/functions
|
||||
|
||||
PID=`pidof -o %PPID @prefix@/sbin/pdnsd`
|
||||
|
||||
start() {
|
||||
stat_busy "Starting PDNSD"
|
||||
[ -z "$PID" ] && @prefix@/sbin/pdnsd -d -c /etc/pdnsd.conf
|
||||
if [ $? -gt 0 ]; then
|
||||
stat_fail
|
||||
else
|
||||
add_daemon pdnsd
|
||||
stat_done
|
||||
fi
|
||||
}
|
||||
|
||||
stop() {
|
||||
stat_busy "Stopping PDNSD"
|
||||
[ ! -z "$PID" ] && kill $PID &> /dev/null
|
||||
if [ $? -gt 0 ]; then
|
||||
stat_fail
|
||||
else
|
||||
rm_daemon pdnsd
|
||||
stat_done
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
start
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
;;
|
||||
restart)
|
||||
$0 stop
|
||||
sleep 2
|
||||
$0 start
|
||||
;;
|
||||
*)
|
||||
echo "usage: $0 {start|stop|restart}"
|
||||
esac
|
||||
exit 0
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "Debian" ] ; then \
|
||||
CURDIR=`pwd`; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/etc/init.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/init.d"; \
|
||||
update-rc.d pdnsd defaults 19 ;\
|
||||
fi
|
|
@ -0,0 +1,334 @@
|
|||
# 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 = src/rc/Debian
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/pdnsd.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
|
||||
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@
|
||||
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 src/rc/Debian/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/rc/Debian/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: $(top_builddir)/config.status $(srcdir)/pdnsd.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
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-exec-local
|
||||
|
||||
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-exec-local \
|
||||
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
|
||||
|
||||
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "Debian" ] ; then \
|
||||
CURDIR=`pwd`; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/etc/init.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/init.d"; \
|
||||
update-rc.d pdnsd defaults 19 ;\
|
||||
fi
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,52 @@
|
|||
#!/bin/sh
|
||||
|
||||
#
|
||||
# This script was written and contributed by Markus Mohr, and
|
||||
# slightly modified by me for version 1.0.6 (which obviously
|
||||
# broke it some way). I then applied a set of corrections
|
||||
# by Markus Mohr.
|
||||
#
|
||||
# Carsten Block has patched this with some magic so that
|
||||
# the actual script is generated by configure, and that
|
||||
# the pdnsd user is determined from pdnsd.conf
|
||||
# I changed this a little to use the --pdnsd-user option
|
||||
# of pdnsd to determine the run_as user.
|
||||
#
|
||||
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
test -x @prefix@/sbin/pdnsd || exit 0
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
# Check if cache dir exists and recreate if neccessary
|
||||
test -d @cachedir@ || mkdir @cachedir@
|
||||
RUNAS=`@prefix@/sbin/pdnsd --pdnsd-user` || echo -n " failed"
|
||||
[ -z "$RUNAS" ] && RUNAS=nobody
|
||||
chown $RUNAS @cachedir@
|
||||
echo -n "Starting domain name service: pdnsd"
|
||||
start-stop-daemon --start --quiet --pidfile /var/run/pdnsd.pid --name pdnsd \
|
||||
--exec @prefix@/sbin/pdnsd -- --daemon -p /var/run/pdnsd.pid \
|
||||
|| echo -n " failed"
|
||||
echo "."
|
||||
;;
|
||||
|
||||
stop)
|
||||
echo -n "Stopping domain name service: pdnsd"
|
||||
start-stop-daemon --stop --quiet --pidfile /var/run/pdnsd.pid --name pdnsd --exec @prefix@/sbin/pdnsd \
|
||||
|| echo -n " failed"
|
||||
echo "."
|
||||
;;
|
||||
|
||||
restart)
|
||||
$0 stop
|
||||
$0 start
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: /etc/init.d/pdnsd {start|stop|restart}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
SUBDIRS = RedHat SuSE Debian Slackware ArchLinux
|
||||
|
||||
EXTRA_DIST = README
|
||||
|
|
@ -0,0 +1,526 @@
|
|||
# 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 = src/rc
|
||||
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 =
|
||||
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@
|
||||
SUBDIRS = RedHat SuSE Debian Slackware ArchLinux
|
||||
EXTRA_DIST = README
|
||||
all: all-recursive
|
||||
|
||||
.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 src/rc/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/rc/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):
|
||||
|
||||
# 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
|
||||
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 Makefile
|
||||
distclean-am: clean-am 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-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 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) 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 ctags \
|
||||
ctags-recursive distclean 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-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
|
||||
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,104 @@
|
|||
rc/
|
||||
===
|
||||
|
||||
These are start scripts for different Linux distros and other things that
|
||||
do not directly belong to pdnsd.
|
||||
If you do start scripts for the distro you use, please GPL them and send
|
||||
them in, so that they can be included in this package for other users.
|
||||
Note that there is NO WARRANTY OF ANY KIND on anything in this directory;
|
||||
read the COPYING that comes with pdnsd for details.
|
||||
So far there are files in the following directories:
|
||||
|
||||
SuSE
|
||||
----
|
||||
pdnsd - Start script for SuSE Linux. Tested for 6.? but should run on some
|
||||
versions below. You can do 'make install' as root in the SuSE
|
||||
directory to install it, or you can install manually:
|
||||
--manual installation-------------------------------------------------
|
||||
For manual installation, copy it into /sbin/init.d/, go to
|
||||
/sbin/init.d/rc2.d/ and create there the following two symlinks:
|
||||
S11pdnsd -> ../pdnsd (do "ln -s ../pdnsd S11pdnsd" in that dir)
|
||||
K34pdnsd -> ../pdnsd (do "ln -s ../pdnsd K34pdnsd" in that dir)
|
||||
The numbers dictate the order different services are started and
|
||||
might need to be modified. Then edit your /etc/rc.config file and
|
||||
add the line "START_PDNSD=yes" to start pdnsd at boot time.
|
||||
----------------------------------------------------------------------
|
||||
If you used the 'make install' command, "START_PDNSD=yes" has been
|
||||
appended to your /etc/rc.config file, causing pdnsd to be started
|
||||
at boot time. If you don't want that, change the "yes" into "no".
|
||||
This start script was created from /sbin/init.d/skeleton by me, so the
|
||||
most is copyrighted by SuSE. They put it under the GPL, however, so
|
||||
the licence stated in COPYING also applies to this script.
|
||||
This is no official SuSE script, and SuSE naturally does NO support
|
||||
for it.
|
||||
|
||||
Redhat
|
||||
------
|
||||
The contents of the Redhat directory and the following documentation were
|
||||
contributed by Torben Janssen. Thanks a lot!
|
||||
|
||||
pdnsd - Start script for Redhat Linux. Tested for 6.1 but should run on 5.0+.
|
||||
You can do 'make install' as root in the Redhat directory to
|
||||
install it, or you can install manually:
|
||||
|
||||
--manual installation-------------------------------------------------
|
||||
For manual installation, copy pdnsd into /etc/rc.d/init.d/
|
||||
|
||||
Then go to /etc/rc.d/rc3.d and create there the following symlink:
|
||||
S78pdnsd -> ../init.d/pdnsd
|
||||
(do "ln -f -s ../init.d/pdnsd S78pdnsd" in that dir)
|
||||
|
||||
Then go to /etc/rc.d/rc0.d and create there the following symlink:
|
||||
K78pdnsd -> ../init.d/pdnsd
|
||||
(do "ln -f -s ../init.d/pdnsd K78pdnsd" in that dir)
|
||||
|
||||
Then go to /etc/rc.d/rc6.d and create there the following symlink:
|
||||
K78pdnsd -> ../init.d/pdnsd
|
||||
(do "ln -f -s ../init.d/pdnsd K78pdnsd" in that dir)
|
||||
|
||||
WHY
|
||||
---
|
||||
the rc[0-6].d dirs includes the scripts which starts/stops the
|
||||
services on entering runlevel [0-6]
|
||||
the interesting runlevels on Redhat are:
|
||||
0 - halt
|
||||
3 - multi user system
|
||||
6 - reboot
|
||||
The links have an 'S' or 'K' and a number at the beginnig. All links
|
||||
with 'S' starts the script on entering the runlevel and 'K' stops
|
||||
them.
|
||||
So, there's an 'S' link in rc3 and 'K' links in rc0 and rc6.
|
||||
I choose 78 as number, because there was no script with this number on
|
||||
my system. You can choose every number you want, AFAIK .
|
||||
|
||||
This is no offical Redhat script, and Redhat naturally does NO support
|
||||
for it.
|
||||
|
||||
Debian
|
||||
------
|
||||
The contents of the Debian directory were contributed by Markus Mohr.
|
||||
His installation instructions are (translated):
|
||||
Install the pdnsd script to /etc/init and run
|
||||
update-rc.d pdnsd defaults 19
|
||||
as root.
|
||||
|
||||
Slackware
|
||||
---------
|
||||
A Slackware start-up script rc.pdnsd was contributed by Nikola Kotur <kotnik@ns-linux.org>.
|
||||
His comments were:
|
||||
|
||||
Slackware uses traditional BSD style init script layout instead of SystemV
|
||||
style startup scripts. So I adjusted the start-up script for pdnsd, and
|
||||
now it can be used with Slackware 9.1 distribution, and probably with all the
|
||||
others.
|
||||
|
||||
Additional info:
|
||||
1) put these lines in the /etc/rc.d/rc.M:
|
||||
if [ -x /etc/rc.d/rc.pdnsd ]; then
|
||||
/etc/rc.d/rc.pdnsd start
|
||||
fi
|
||||
|
||||
2) put these lines in the /etc/rc.d/rc.6 and /etc/rc.d/rc.K:
|
||||
if [ -x /etc/rc.d/rc.pdnsd ]; then
|
||||
/etc/rc.d/rc.pdnsd stop
|
||||
fi
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
# no need to create links. 'chkconfig' will take care of this.
|
||||
# In the spec case, chkconfig is called during rpm install
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "RedHat" ] ; then \
|
||||
$(mkinstalldirs) "$(DESTDIR)/etc/rc.d/init.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/init.d/pdnsd"; \
|
||||
if [ "$(specbuild)" = "no" ] ; then \
|
||||
/sbin/chkconfig --add pdnsd; \
|
||||
fi \
|
||||
fi
|
||||
|
|
@ -0,0 +1,337 @@
|
|||
# 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 = src/rc/RedHat
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/pdnsd.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
|
||||
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@
|
||||
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 src/rc/RedHat/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/rc/RedHat/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: $(top_builddir)/config.status $(srcdir)/pdnsd.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
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-exec-local
|
||||
|
||||
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-exec-local \
|
||||
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
|
||||
|
||||
|
||||
# no need to create links. 'chkconfig' will take care of this.
|
||||
# In the spec case, chkconfig is called during rpm install
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "RedHat" ] ; then \
|
||||
$(mkinstalldirs) "$(DESTDIR)/etc/rc.d/init.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/init.d/pdnsd"; \
|
||||
if [ "$(specbuild)" = "no" ] ; then \
|
||||
/sbin/chkconfig --add pdnsd; \
|
||||
fi \
|
||||
fi
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,88 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# /etc/rc.d/init.d/pdnsd
|
||||
#
|
||||
# Script for starting the Proxy DNS Daemon
|
||||
# Modified by Paul Rombouts, 2003
|
||||
#
|
||||
# chkconfig: 2345 11 89
|
||||
# description: Proxy DNS Daemon
|
||||
# processname: pdnsd
|
||||
# config: /etc/pdnsd.conf
|
||||
|
||||
PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin
|
||||
|
||||
# Source function library.
|
||||
. /etc/rc.d/init.d/functions
|
||||
|
||||
# Source networking configuration.
|
||||
. /etc/sysconfig/network
|
||||
|
||||
# Check that networking is up.
|
||||
if [[ $NETWORKING == [Nn][Oo] ]]; then exit 0; fi
|
||||
|
||||
# Source sysconfig settings, if any.
|
||||
if [ -f /etc/sysconfig/pdnsd ]; then . /etc/sysconfig/pdnsd; fi
|
||||
|
||||
start() {
|
||||
echo -n 'Starting pdnsd: '
|
||||
daemon @prefix@/sbin/pdnsd -d -s -p /var/run/pdnsd.pid "$EXTRAOPTIONS"
|
||||
local RETVAL=$?
|
||||
echo
|
||||
if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/pdnsd; fi
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
stop() {
|
||||
echo -n 'Shutting down pdnsd: '
|
||||
killproc pdnsd
|
||||
local RETVAL=$?
|
||||
case @threadlib@ in
|
||||
[Ll]inux[Tt]hreads*|lt*)
|
||||
# Wait until all threads have terminated.
|
||||
local -i count=20
|
||||
while [[ count -gt 0 ]] && pidof pdnsd > /dev/null
|
||||
do
|
||||
usleep 200000
|
||||
let --count
|
||||
done
|
||||
;;
|
||||
esac
|
||||
echo
|
||||
if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/pdnsd; fi
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
#
|
||||
# See how we were called.
|
||||
#
|
||||
case "$1" in
|
||||
start)
|
||||
start
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
;;
|
||||
status)
|
||||
status pdnsd
|
||||
;;
|
||||
reload)
|
||||
@prefix@/sbin/pdnsd-ctl config
|
||||
;;
|
||||
restart)
|
||||
restart
|
||||
;;
|
||||
condrestart)
|
||||
if [ -f /var/lock/subsys/pdnsd ]; then restart; fi
|
||||
;;
|
||||
*)
|
||||
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
exit
|
|
@ -0,0 +1,3 @@
|
|||
# TODO: write an install rule for the Slackware start-up script.
|
||||
|
||||
install-exec-local:
|
|
@ -0,0 +1,330 @@
|
|||
# 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@
|
||||
|
||||
# TODO: write an install rule for the Slackware start-up script.
|
||||
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 = src/rc/Slackware
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/rc.pdnsd.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 = rc.pdnsd
|
||||
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@
|
||||
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 src/rc/Slackware/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/rc/Slackware/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):
|
||||
rc.pdnsd: $(top_builddir)/config.status $(srcdir)/rc.pdnsd.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
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-exec-local
|
||||
|
||||
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-exec-local \
|
||||
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
|
||||
|
||||
|
||||
install-exec-local:
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,74 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# /etc/rc.d/rc.pdnsd
|
||||
#
|
||||
# Starts the Proxy DNS Daemon
|
||||
#
|
||||
# description: Proxy DNS Daemon
|
||||
# processname: pdnsd
|
||||
# config: /etc/pdnsd.conf
|
||||
# distribution: Slackware
|
||||
# author: Nikola Kotur <kotnik@ns-linux.org>
|
||||
#
|
||||
# Additional info:
|
||||
# 1) put these lines in the /etc/rc.d/rc.M:
|
||||
# if [ -x /etc/rc.d/rc.pdnsd ]; then
|
||||
# /etc/rc.d/rc.pdnsd start
|
||||
# fi
|
||||
#
|
||||
# 2) put these lines in the /etc/rc.d/rc.6 and /etc/rc.d/rc.K:
|
||||
# if [ -x /etc/rc.d/rc.pdnsd ]; then
|
||||
# /etc/rc.d/rc.pdnsd stop
|
||||
# fi
|
||||
|
||||
|
||||
test -x @prefix@/sbin/pdnsd || exit 0
|
||||
[ -f @sysconfdir@/pdnsd.conf ] || exit 1
|
||||
|
||||
RETVAL=0
|
||||
|
||||
start() {
|
||||
echo -n "Starting pdnsd... "
|
||||
RETVAL=$?
|
||||
@prefix@/sbin/pdnsd -d
|
||||
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/pdnsd
|
||||
echo ' OK'
|
||||
}
|
||||
|
||||
stop() {
|
||||
echo -n "Shutting down pdnsd... "
|
||||
killall pdnsd
|
||||
RETVAL=$?
|
||||
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/pdnsd
|
||||
echo ' OK'
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
condrestart() {
|
||||
[ -e /var/lock/subsys/pdnsd ] && restart
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
start
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
;;
|
||||
reload|restart)
|
||||
restart
|
||||
;;
|
||||
condrestart)
|
||||
condrestart
|
||||
;;
|
||||
*)
|
||||
echo $"Usage: $0 {start|stop|restart|condrestart|reload}"
|
||||
RETVAL=1
|
||||
esac
|
||||
|
||||
exit $RETVAL
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "SuSE" ] ; then \
|
||||
CURDIR=`pwd`; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/sbin/init.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/sbin/init.d/pdnsd"; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc2.d"; \
|
||||
cd "$(DESTDIR)/sbin/init.d/rc2.d"; \
|
||||
ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \
|
||||
cd $$CURDIR ; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc3.d"; \
|
||||
cd "$(DESTDIR)/sbin/init.d/rc3.d"; \
|
||||
ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \
|
||||
cd $$CURDIR ; \
|
||||
grep "START_PDNSD" "$(DESTDIR)/etc/rc.config" > /dev/null ; \
|
||||
if [ $$? -eq 1 ] ; then \
|
||||
echo -e "\n\n#\n# Set to yes to start pdnsd at boot time\n#\nSTART_PDNSD=yes" >> /etc/rc.config ; \
|
||||
fi \
|
||||
fi
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,345 @@
|
|||
# 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 = src/rc/SuSE
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/pdnsd.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
|
||||
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@
|
||||
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 src/rc/SuSE/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/rc/SuSE/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: $(top_builddir)/config.status $(srcdir)/pdnsd.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
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-exec-local
|
||||
|
||||
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-exec-local \
|
||||
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
|
||||
|
||||
|
||||
install-exec-local:
|
||||
if [ "$(distribution)" = "SuSE" ] ; then \
|
||||
CURDIR=`pwd`; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/sbin/init.d"; \
|
||||
$(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/sbin/init.d/pdnsd"; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc2.d"; \
|
||||
cd "$(DESTDIR)/sbin/init.d/rc2.d"; \
|
||||
ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \
|
||||
cd $$CURDIR ; \
|
||||
$(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc3.d"; \
|
||||
cd "$(DESTDIR)/sbin/init.d/rc3.d"; \
|
||||
ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \
|
||||
cd $$CURDIR ; \
|
||||
grep "START_PDNSD" "$(DESTDIR)/etc/rc.config" > /dev/null ; \
|
||||
if [ $$? -eq 1 ] ; then \
|
||||
echo -e "\n\n#\n# Set to yes to start pdnsd at boot time\n#\nSTART_PDNSD=yes" >> /etc/rc.config ; \
|
||||
fi \
|
||||
fi
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,68 @@
|
|||
#! /bin/sh
|
||||
# Copyright (c) 1995-1998 SuSE GmbH Nuernberg, Germany.
|
||||
#
|
||||
# Modified 2000 from SuSE Linux 6.3 /sbin/init.d/skeleton by Thomas Moestl
|
||||
#
|
||||
# /sbin/init.d/pdnsd
|
||||
#
|
||||
# and symbolic its link
|
||||
#
|
||||
# /sbin/rc?/pdnsd
|
||||
#
|
||||
|
||||
. /etc/rc.config
|
||||
|
||||
# Determine the base and follow a runlevel link name.
|
||||
base=${0##*/}
|
||||
link=${base#*[SK][0-9][0-9]}
|
||||
|
||||
# Force execution if not called by a runlevel directory.
|
||||
test $link = $base && START_PDNSD=yes
|
||||
test "$START_PDNSD" = yes || exit 0
|
||||
|
||||
# The echo return value for success (defined in /etc/rc.config).
|
||||
return=$rc_done
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting pdnsd"
|
||||
## Start daemon with startproc(8). If this fails
|
||||
## the echo return value is set appropriate.
|
||||
|
||||
startproc @prefix@/sbin/pdnsd -d || return=$rc_failed
|
||||
|
||||
echo -e "$return"
|
||||
;;
|
||||
stop)
|
||||
echo -n "Shutting down pdnsd"
|
||||
## Stop daemon with killproc(8) and if this fails
|
||||
## set echo the echo return value.
|
||||
|
||||
killproc -TERM @prefix@/sbin/pdnsd || return=$rc_failed
|
||||
|
||||
echo -e "$return"
|
||||
;;
|
||||
restart)
|
||||
## If first returns OK call the second, if first or
|
||||
## second command fails, set echo return value.
|
||||
$0 stop && $0 start || return=$rc_failed
|
||||
;;
|
||||
reload)
|
||||
$0 stop && $0 start || return=$rc_failed
|
||||
;;
|
||||
status)
|
||||
echo -n "Checking for pdnsd: "
|
||||
## Check status with checkproc(8), if process is running
|
||||
## checkproc will return with exit status 0.
|
||||
|
||||
checkproc @prefix@/sbin/pdnsd && echo OK || echo No process
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|status|restart|reload}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Inform the caller not only verbosely and set an exit status.
|
||||
test "$return" = "$rc_done" || exit 1
|
||||
exit 0
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
/* rr_types.c - Tables with information for handling
|
||||
all rr types known to pdnsd, plus
|
||||
some helper functions useful for turning
|
||||
binary RR data into text or vice versa.
|
||||
|
||||
Copyright (C) 2000, 2001 Thomas Moestl
|
||||
Copyright (C) 2003, 2004, 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/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#define DEFINE_RR_TYPE_ARRAYS 1
|
||||
#include "helpers.h"
|
||||
#include "dns.h"
|
||||
#include "rr_types.h"
|
||||
|
||||
|
||||
/*
|
||||
* OK, this is inefficient. But it is used _really_ seldom (only in some cases while parsing the
|
||||
* config file or by pdnsd-ctl), so it is much more effective to sort by id.
|
||||
*/
|
||||
int rr_tp_byname(char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0;i<T_NUM;i++) {
|
||||
if (strcmp(name, rrnames[i])==0)
|
||||
return i+T_MIN;
|
||||
}
|
||||
return -1; /* invalid */
|
||||
}
|
||||
|
||||
/* The following is not needed by pdnsd-ctl. */
|
||||
#ifndef CLIENT_ONLY
|
||||
|
||||
static const unsigned int poweroften[8] = {1, 10, 100, 1000, 10000, 100000,
|
||||
1000000,10000000};
|
||||
#define NPRECSIZE (sizeof "90000000")
|
||||
/* takes an XeY precision/size value, returns a string representation.
|
||||
This is an adapted version of the function of the same name that
|
||||
can be found in the BIND 9 source.
|
||||
*/
|
||||
static const char *precsize_ntoa(uint8_t prec,char *retbuf)
|
||||
{
|
||||
unsigned int mantissa, exponent;
|
||||
|
||||
mantissa = (prec >> 4);
|
||||
exponent = (prec & 0x0f);
|
||||
|
||||
if(mantissa>=10 || exponent>=10)
|
||||
return NULL;
|
||||
if (exponent>= 2)
|
||||
sprintf(retbuf, "%u", mantissa * poweroften[exponent-2]);
|
||||
else
|
||||
sprintf(retbuf, "0.%.2u", mantissa * poweroften[exponent]);
|
||||
return (retbuf);
|
||||
}
|
||||
|
||||
/* takes an on-the-wire LOC RR and formats it in a human readable format.
|
||||
This is an adapted version of the loc_ntoa function that
|
||||
can be found in the BIND 9 source.
|
||||
*/
|
||||
const char *loc2str(const void *binary, char *ascii, size_t asclen)
|
||||
{
|
||||
const unsigned char *cp = binary;
|
||||
|
||||
int latdeg, latmin, latsec, latsecfrac;
|
||||
int longdeg, longmin, longsec, longsecfrac;
|
||||
char northsouth, eastwest;
|
||||
const char *altsign;
|
||||
int altmeters, altfrac;
|
||||
|
||||
const uint32_t referencealt = 100000 * 100;
|
||||
|
||||
int32_t latval, longval, altval;
|
||||
uint32_t templ;
|
||||
uint8_t sizeval, hpval, vpval, versionval;
|
||||
|
||||
char sizestr[NPRECSIZE],hpstr[NPRECSIZE],vpstr[NPRECSIZE];
|
||||
|
||||
versionval = *cp++;
|
||||
|
||||
if (versionval) {
|
||||
/* unknown LOC RR version */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sizeval = *cp++;
|
||||
|
||||
hpval = *cp++;
|
||||
vpval = *cp++;
|
||||
|
||||
GETINT32(templ, cp);
|
||||
latval = (templ - ((unsigned)1<<31));
|
||||
|
||||
GETINT32(templ, cp);
|
||||
longval = (templ - ((unsigned)1<<31));
|
||||
|
||||
GETINT32(templ, cp);
|
||||
if (templ < referencealt) { /* below WGS 84 spheroid */
|
||||
altval = referencealt - templ;
|
||||
altsign = "-";
|
||||
} else {
|
||||
altval = templ - referencealt;
|
||||
altsign = "";
|
||||
}
|
||||
|
||||
if (latval < 0) {
|
||||
northsouth = 'S';
|
||||
latval = -latval;
|
||||
} else
|
||||
northsouth = 'N';
|
||||
|
||||
latsecfrac = latval % 1000;
|
||||
latval /= 1000;
|
||||
latsec = latval % 60;
|
||||
latval /= 60;
|
||||
latmin = latval % 60;
|
||||
latval /= 60;
|
||||
latdeg = latval;
|
||||
|
||||
if (longval < 0) {
|
||||
eastwest = 'W';
|
||||
longval = -longval;
|
||||
} else
|
||||
eastwest = 'E';
|
||||
|
||||
longsecfrac = longval % 1000;
|
||||
longval /= 1000;
|
||||
longsec = longval % 60;
|
||||
longval /= 60;
|
||||
longmin = longval % 60;
|
||||
longval /= 60;
|
||||
longdeg = longval;
|
||||
|
||||
altfrac = altval % 100;
|
||||
altmeters = (altval / 100);
|
||||
|
||||
if(!precsize_ntoa(sizeval,sizestr) || !precsize_ntoa(hpval,hpstr) || !precsize_ntoa(vpval,vpstr))
|
||||
return NULL;
|
||||
{
|
||||
int n=snprintf(ascii,asclen,
|
||||
"%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm",
|
||||
latdeg, latmin, latsec, latsecfrac, northsouth,
|
||||
longdeg, longmin, longsec, longsecfrac, eastwest,
|
||||
altsign, altmeters, altfrac,
|
||||
sizestr, hpstr, vpstr);
|
||||
if(n<0 || n>=asclen)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (ascii);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,536 @@
|
|||
/* This file was generated by running 'make_rr_types_h.pl rr_types.in'.
|
||||
Modifications to this file may be lost the next time it is automatically
|
||||
regenerated.
|
||||
*/
|
||||
|
||||
/* 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>
|
||||
|
||||
#define T_MIN 1
|
||||
#define T_A 1
|
||||
#define T_NS 2
|
||||
#define T_MD 3
|
||||
#define T_MF 4
|
||||
#define T_CNAME 5
|
||||
#define T_SOA 6
|
||||
#define T_MB 7
|
||||
#define T_MG 8
|
||||
#define T_MR 9
|
||||
#define T_NULL 10
|
||||
#define T_WKS 11
|
||||
#define T_PTR 12
|
||||
#define T_HINFO 13
|
||||
#define T_MINFO 14
|
||||
#define T_MX 15
|
||||
#define T_TXT 16
|
||||
#define T_RP 17
|
||||
#define T_AFSDB 18
|
||||
#define T_X25 19
|
||||
#define T_ISDN 20
|
||||
#define T_RT 21
|
||||
#define T_NSAP 22
|
||||
#define T_NSAP_PTR 23
|
||||
#define T_SIG 24
|
||||
#define T_KEY 25
|
||||
#define T_PX 26
|
||||
#define T_GPOS 27
|
||||
#define T_AAAA 28
|
||||
#define T_LOC 29
|
||||
#define T_NXT 30
|
||||
#define T_EID 31
|
||||
#define T_NIMLOC 32
|
||||
#define T_SRV 33
|
||||
#define T_ATMA 34
|
||||
#define T_NAPTR 35
|
||||
#define T_KX 36
|
||||
#define T_CERT 37
|
||||
#define T_A6 38
|
||||
#define T_DNAME 39
|
||||
#define T_SINK 40
|
||||
#define T_OPT 41
|
||||
#define T_APL 42
|
||||
#define T_DS 43
|
||||
#define T_SSHFP 44
|
||||
#define T_IPSECKEY 45
|
||||
#define T_RRSIG 46
|
||||
#define T_NSEC 47
|
||||
#define T_DNSKEY 48
|
||||
#define T_DHCID 49
|
||||
#define T_NSEC3 50
|
||||
#define T_NSEC3PARAM 51
|
||||
#define T_HIP 55
|
||||
#define T_NINFO 56
|
||||
#define T_RKEY 57
|
||||
#define T_TALINK 58
|
||||
#define T_SPF 99
|
||||
#define T_UINFO 100
|
||||
#define T_UID 101
|
||||
#define T_GID 102
|
||||
#define T_UNSPEC 103
|
||||
#define T_MAX 51
|
||||
|
||||
/* T_MAX - T_MIN + 1 */
|
||||
#define T_NUM 51
|
||||
|
||||
/* Number of most frequently used rr types. */
|
||||
#define NRRMU 8
|
||||
|
||||
/* Number of remaining rr types. */
|
||||
#define NRREXT 39
|
||||
|
||||
/* NRRMU + NRREXT */
|
||||
#define NRRTOT 47
|
||||
|
||||
/* 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] = {
|
||||
0 /* A */,
|
||||
1 /* NS */,
|
||||
8 /* MD */,
|
||||
9 /* MF */,
|
||||
2 /* CNAME */,
|
||||
3 /* SOA */,
|
||||
10 /* MB */,
|
||||
11 /* MG */,
|
||||
12 /* MR */,
|
||||
13 /* NULL */,
|
||||
14 /* WKS */,
|
||||
4 /* PTR */,
|
||||
15 /* HINFO */,
|
||||
16 /* MINFO */,
|
||||
5 /* MX */,
|
||||
6 /* TXT */,
|
||||
17 /* RP */,
|
||||
18 /* AFSDB */,
|
||||
19 /* X25 */,
|
||||
20 /* ISDN */,
|
||||
21 /* RT */,
|
||||
22 /* NSAP */,
|
||||
23 /* NSAP_PTR */,
|
||||
24 /* SIG */,
|
||||
25 /* KEY */,
|
||||
26 /* PX */,
|
||||
27 /* GPOS */,
|
||||
7 /* AAAA */,
|
||||
28 /* LOC */,
|
||||
29 /* NXT */,
|
||||
30 /* EID */,
|
||||
31 /* NIMLOC */,
|
||||
32 /* SRV */,
|
||||
33 /* ATMA */,
|
||||
34 /* NAPTR */,
|
||||
35 /* KX */,
|
||||
36 /* CERT */,
|
||||
47 /* A6 */,
|
||||
48 /* DNAME */,
|
||||
49 /* SINK */,
|
||||
50 /* OPT */,
|
||||
37 /* APL */,
|
||||
38 /* DS */,
|
||||
39 /* SSHFP */,
|
||||
40 /* IPSECKEY */,
|
||||
41 /* RRSIG */,
|
||||
42 /* NSEC */,
|
||||
43 /* DNSKEY */,
|
||||
44 /* DHCID */,
|
||||
45 /* NSEC3 */,
|
||||
46 /* NSEC3PARAM */
|
||||
};
|
||||
#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] = {
|
||||
T_A,
|
||||
T_NS,
|
||||
T_CNAME,
|
||||
T_SOA,
|
||||
T_PTR,
|
||||
T_MX,
|
||||
T_TXT,
|
||||
T_AAAA
|
||||
};
|
||||
#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] = {
|
||||
T_A,
|
||||
T_NS,
|
||||
T_MD,
|
||||
T_MF,
|
||||
T_CNAME,
|
||||
T_SOA,
|
||||
T_MB,
|
||||
T_MG,
|
||||
T_MR,
|
||||
T_NULL,
|
||||
T_WKS,
|
||||
T_PTR,
|
||||
T_HINFO,
|
||||
T_MINFO,
|
||||
T_MX,
|
||||
T_TXT,
|
||||
T_RP,
|
||||
T_AFSDB,
|
||||
T_X25,
|
||||
T_ISDN,
|
||||
T_RT,
|
||||
T_NSAP,
|
||||
T_NSAP_PTR,
|
||||
T_SIG,
|
||||
T_KEY,
|
||||
T_PX,
|
||||
T_GPOS,
|
||||
T_AAAA,
|
||||
T_LOC,
|
||||
T_NXT,
|
||||
T_EID,
|
||||
T_NIMLOC,
|
||||
T_SRV,
|
||||
T_ATMA,
|
||||
T_NAPTR,
|
||||
T_KX,
|
||||
T_CERT,
|
||||
T_APL,
|
||||
T_DS,
|
||||
T_SSHFP,
|
||||
T_IPSECKEY,
|
||||
T_RRSIG,
|
||||
T_NSEC,
|
||||
T_DNSKEY,
|
||||
T_DHCID,
|
||||
T_NSEC3,
|
||||
T_NSEC3PARAM
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Optimized getrrset macros for fixed rr types. */
|
||||
#define getrrset_A(cent) GET_RRSMU(cent,0)
|
||||
#define getrrset_NS(cent) GET_RRSMU(cent,1)
|
||||
#define getrrset_MD(cent) GET_RRSEXT(cent,0)
|
||||
#define getrrset_MF(cent) GET_RRSEXT(cent,1)
|
||||
#define getrrset_CNAME(cent) GET_RRSMU(cent,2)
|
||||
#define getrrset_SOA(cent) GET_RRSMU(cent,3)
|
||||
#define getrrset_MB(cent) GET_RRSEXT(cent,2)
|
||||
#define getrrset_MG(cent) GET_RRSEXT(cent,3)
|
||||
#define getrrset_MR(cent) GET_RRSEXT(cent,4)
|
||||
#define getrrset_NULL(cent) GET_RRSEXT(cent,5)
|
||||
#define getrrset_WKS(cent) GET_RRSEXT(cent,6)
|
||||
#define getrrset_PTR(cent) GET_RRSMU(cent,4)
|
||||
#define getrrset_HINFO(cent) GET_RRSEXT(cent,7)
|
||||
#define getrrset_MINFO(cent) GET_RRSEXT(cent,8)
|
||||
#define getrrset_MX(cent) GET_RRSMU(cent,5)
|
||||
#define getrrset_TXT(cent) GET_RRSMU(cent,6)
|
||||
#define getrrset_RP(cent) GET_RRSEXT(cent,9)
|
||||
#define getrrset_AFSDB(cent) GET_RRSEXT(cent,10)
|
||||
#define getrrset_X25(cent) GET_RRSEXT(cent,11)
|
||||
#define getrrset_ISDN(cent) GET_RRSEXT(cent,12)
|
||||
#define getrrset_RT(cent) GET_RRSEXT(cent,13)
|
||||
#define getrrset_NSAP(cent) GET_RRSEXT(cent,14)
|
||||
#define getrrset_NSAP_PTR(cent) GET_RRSEXT(cent,15)
|
||||
#define getrrset_SIG(cent) GET_RRSEXT(cent,16)
|
||||
#define getrrset_KEY(cent) GET_RRSEXT(cent,17)
|
||||
#define getrrset_PX(cent) GET_RRSEXT(cent,18)
|
||||
#define getrrset_GPOS(cent) GET_RRSEXT(cent,19)
|
||||
#define getrrset_AAAA(cent) GET_RRSMU(cent,7)
|
||||
#define getrrset_LOC(cent) GET_RRSEXT(cent,20)
|
||||
#define getrrset_NXT(cent) GET_RRSEXT(cent,21)
|
||||
#define getrrset_EID(cent) GET_RRSEXT(cent,22)
|
||||
#define getrrset_NIMLOC(cent) GET_RRSEXT(cent,23)
|
||||
#define getrrset_SRV(cent) GET_RRSEXT(cent,24)
|
||||
#define getrrset_ATMA(cent) GET_RRSEXT(cent,25)
|
||||
#define getrrset_NAPTR(cent) GET_RRSEXT(cent,26)
|
||||
#define getrrset_KX(cent) GET_RRSEXT(cent,27)
|
||||
#define getrrset_CERT(cent) GET_RRSEXT(cent,28)
|
||||
#define getrrset_APL(cent) GET_RRSEXT(cent,29)
|
||||
#define getrrset_DS(cent) GET_RRSEXT(cent,30)
|
||||
#define getrrset_SSHFP(cent) GET_RRSEXT(cent,31)
|
||||
#define getrrset_IPSECKEY(cent) GET_RRSEXT(cent,32)
|
||||
#define getrrset_RRSIG(cent) GET_RRSEXT(cent,33)
|
||||
#define getrrset_NSEC(cent) GET_RRSEXT(cent,34)
|
||||
#define getrrset_DNSKEY(cent) GET_RRSEXT(cent,35)
|
||||
#define getrrset_DHCID(cent) GET_RRSEXT(cent,36)
|
||||
#define getrrset_NSEC3(cent) GET_RRSEXT(cent,37)
|
||||
#define getrrset_NSEC3PARAM(cent) GET_RRSEXT(cent,38)
|
||||
|
||||
/* have_rr macros for fixed rr types. */
|
||||
#define have_rr_A(cent) HAVE_RRMU(cent,0)
|
||||
#define have_rr_NS(cent) HAVE_RRMU(cent,1)
|
||||
#define have_rr_MD(cent) HAVE_RREXT(cent,0)
|
||||
#define have_rr_MF(cent) HAVE_RREXT(cent,1)
|
||||
#define have_rr_CNAME(cent) HAVE_RRMU(cent,2)
|
||||
#define have_rr_SOA(cent) HAVE_RRMU(cent,3)
|
||||
#define have_rr_MB(cent) HAVE_RREXT(cent,2)
|
||||
#define have_rr_MG(cent) HAVE_RREXT(cent,3)
|
||||
#define have_rr_MR(cent) HAVE_RREXT(cent,4)
|
||||
#define have_rr_NULL(cent) HAVE_RREXT(cent,5)
|
||||
#define have_rr_WKS(cent) HAVE_RREXT(cent,6)
|
||||
#define have_rr_PTR(cent) HAVE_RRMU(cent,4)
|
||||
#define have_rr_HINFO(cent) HAVE_RREXT(cent,7)
|
||||
#define have_rr_MINFO(cent) HAVE_RREXT(cent,8)
|
||||
#define have_rr_MX(cent) HAVE_RRMU(cent,5)
|
||||
#define have_rr_TXT(cent) HAVE_RRMU(cent,6)
|
||||
#define have_rr_RP(cent) HAVE_RREXT(cent,9)
|
||||
#define have_rr_AFSDB(cent) HAVE_RREXT(cent,10)
|
||||
#define have_rr_X25(cent) HAVE_RREXT(cent,11)
|
||||
#define have_rr_ISDN(cent) HAVE_RREXT(cent,12)
|
||||
#define have_rr_RT(cent) HAVE_RREXT(cent,13)
|
||||
#define have_rr_NSAP(cent) HAVE_RREXT(cent,14)
|
||||
#define have_rr_NSAP_PTR(cent) HAVE_RREXT(cent,15)
|
||||
#define have_rr_SIG(cent) HAVE_RREXT(cent,16)
|
||||
#define have_rr_KEY(cent) HAVE_RREXT(cent,17)
|
||||
#define have_rr_PX(cent) HAVE_RREXT(cent,18)
|
||||
#define have_rr_GPOS(cent) HAVE_RREXT(cent,19)
|
||||
#define have_rr_AAAA(cent) HAVE_RRMU(cent,7)
|
||||
#define have_rr_LOC(cent) HAVE_RREXT(cent,20)
|
||||
#define have_rr_NXT(cent) HAVE_RREXT(cent,21)
|
||||
#define have_rr_EID(cent) HAVE_RREXT(cent,22)
|
||||
#define have_rr_NIMLOC(cent) HAVE_RREXT(cent,23)
|
||||
#define have_rr_SRV(cent) HAVE_RREXT(cent,24)
|
||||
#define have_rr_ATMA(cent) HAVE_RREXT(cent,25)
|
||||
#define have_rr_NAPTR(cent) HAVE_RREXT(cent,26)
|
||||
#define have_rr_KX(cent) HAVE_RREXT(cent,27)
|
||||
#define have_rr_CERT(cent) HAVE_RREXT(cent,28)
|
||||
#define have_rr_A6(cent) 0
|
||||
#define have_rr_DNAME(cent) 0
|
||||
#define have_rr_SINK(cent) 0
|
||||
#define have_rr_OPT(cent) 0
|
||||
#define have_rr_APL(cent) HAVE_RREXT(cent,29)
|
||||
#define have_rr_DS(cent) HAVE_RREXT(cent,30)
|
||||
#define have_rr_SSHFP(cent) HAVE_RREXT(cent,31)
|
||||
#define have_rr_IPSECKEY(cent) HAVE_RREXT(cent,32)
|
||||
#define have_rr_RRSIG(cent) HAVE_RREXT(cent,33)
|
||||
#define have_rr_NSEC(cent) HAVE_RREXT(cent,34)
|
||||
#define have_rr_DNSKEY(cent) HAVE_RREXT(cent,35)
|
||||
#define have_rr_DHCID(cent) HAVE_RREXT(cent,36)
|
||||
#define have_rr_NSEC3(cent) HAVE_RREXT(cent,37)
|
||||
#define have_rr_NSEC3PARAM(cent) HAVE_RREXT(cent,38)
|
||||
|
||||
/* These macros specify which RR types are cached by pdnsd. */
|
||||
#define IS_CACHED_A 1
|
||||
#define IS_CACHED_NS 1
|
||||
#define IS_CACHED_MD 1
|
||||
#define IS_CACHED_MF 1
|
||||
#define IS_CACHED_CNAME 1
|
||||
#define IS_CACHED_SOA 1
|
||||
#define IS_CACHED_MB 1
|
||||
#define IS_CACHED_MG 1
|
||||
#define IS_CACHED_MR 1
|
||||
#define IS_CACHED_NULL 1
|
||||
#define IS_CACHED_WKS 1
|
||||
#define IS_CACHED_PTR 1
|
||||
#define IS_CACHED_HINFO 1
|
||||
#define IS_CACHED_MINFO 1
|
||||
#define IS_CACHED_MX 1
|
||||
#define IS_CACHED_TXT 1
|
||||
#define IS_CACHED_RP 1
|
||||
#define IS_CACHED_AFSDB 1
|
||||
#define IS_CACHED_X25 1
|
||||
#define IS_CACHED_ISDN 1
|
||||
#define IS_CACHED_RT 1
|
||||
#define IS_CACHED_NSAP 1
|
||||
#define IS_CACHED_NSAP_PTR 1
|
||||
#define IS_CACHED_SIG 1
|
||||
#define IS_CACHED_KEY 1
|
||||
#define IS_CACHED_PX 1
|
||||
#define IS_CACHED_GPOS 1
|
||||
#define IS_CACHED_AAAA 1
|
||||
#define IS_CACHED_LOC 1
|
||||
#define IS_CACHED_NXT 1
|
||||
#define IS_CACHED_EID 1
|
||||
#define IS_CACHED_NIMLOC 1
|
||||
#define IS_CACHED_SRV 1
|
||||
#define IS_CACHED_ATMA 1
|
||||
#define IS_CACHED_NAPTR 1
|
||||
#define IS_CACHED_KX 1
|
||||
#define IS_CACHED_CERT 1
|
||||
#define IS_CACHED_APL 1
|
||||
#define IS_CACHED_DS 1
|
||||
#define IS_CACHED_SSHFP 1
|
||||
#define IS_CACHED_IPSECKEY 1
|
||||
#define IS_CACHED_RRSIG 1
|
||||
#define IS_CACHED_NSEC 1
|
||||
#define IS_CACHED_DNSKEY 1
|
||||
#define IS_CACHED_DHCID 1
|
||||
#define IS_CACHED_NSEC3 1
|
||||
#define IS_CACHED_NSEC3PARAM 1
|
||||
|
||||
/* Array indices for most frequently used rr types. */
|
||||
#define RRMUINDEX_A 0
|
||||
#define RRMUINDEX_NS 1
|
||||
#define RRMUINDEX_CNAME 2
|
||||
#define RRMUINDEX_SOA 3
|
||||
#define RRMUINDEX_PTR 4
|
||||
#define RRMUINDEX_MX 5
|
||||
#define RRMUINDEX_TXT 6
|
||||
#define RRMUINDEX_AAAA 7
|
||||
|
||||
/* Table of rr names. */
|
||||
extern const char *const rrnames[T_NUM];
|
||||
#if DEFINE_RR_TYPE_ARRAYS
|
||||
const char *const rrnames[T_NUM] = {
|
||||
"A",
|
||||
"NS",
|
||||
"MD",
|
||||
"MF",
|
||||
"CNAME",
|
||||
"SOA",
|
||||
"MB",
|
||||
"MG",
|
||||
"MR",
|
||||
"NULL",
|
||||
"WKS",
|
||||
"PTR",
|
||||
"HINFO",
|
||||
"MINFO",
|
||||
"MX",
|
||||
"TXT",
|
||||
"RP",
|
||||
"AFSDB",
|
||||
"X25",
|
||||
"ISDN",
|
||||
"RT",
|
||||
"NSAP",
|
||||
"NSAP_PTR",
|
||||
"SIG",
|
||||
"KEY",
|
||||
"PX",
|
||||
"GPOS",
|
||||
"AAAA",
|
||||
"LOC",
|
||||
"NXT",
|
||||
"EID",
|
||||
"NIMLOC",
|
||||
"SRV",
|
||||
"ATMA",
|
||||
"NAPTR",
|
||||
"KX",
|
||||
"CERT",
|
||||
"A6",
|
||||
"DNAME",
|
||||
"SINK",
|
||||
"OPT",
|
||||
"APL",
|
||||
"DS",
|
||||
"SSHFP",
|
||||
"IPSECKEY",
|
||||
"RRSIG",
|
||||
"NSEC",
|
||||
"DNSKEY",
|
||||
"DHCID",
|
||||
"NSEC3",
|
||||
"NSEC3PARAM"
|
||||
};
|
||||
#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] = {
|
||||
{RRCL_RECORD, RRX_RECORD} /* A */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* NS */,
|
||||
{RRCL_ALIAS, RRX_ALIAS} /* CNAME */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* SOA */,
|
||||
{RRCL_PTR, RRX_PTR} /* PTR */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MX */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* TXT */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* AAAA */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MD */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MF */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MB */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MG */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MR */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* NULL */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* WKS */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* HINFO */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* MINFO */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* RP */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* AFSDB */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* X25 */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* ISDN */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* RT */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* NSAP */,
|
||||
{RRCL_PTR, RRX_PTR} /* NSAP_PTR */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* SIG */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* KEY */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* PX */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* GPOS */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* LOC */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* NXT */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* EID */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* NIMLOC */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* SRV */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* ATMA */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* NAPTR */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* KX */,
|
||||
{RRCL_RECORD, RRX_RECORD} /* CERT */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* APL */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* DS */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* SSHFP */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* IPSECKEY */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* RRSIG */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* NSEC */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* DNSKEY */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* DHCID */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* NSEC3 */,
|
||||
{RRCL_IDEM, RRX_IDEM} /* NSEC3PARAM */
|
||||
};
|
||||
#endif
|
||||
|
||||
int rr_tp_byname(char *name);
|
||||
const char *loc2str(const void *binary, char *ascii, size_t asclen);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,99 @@
|
|||
# This file is part of the pdnsd package.
|
||||
|
||||
# This file contains information about the RR types implemented in pdnsd
|
||||
# and is used for generating rr_types.h.
|
||||
# It was derived from the following source: http://www.bind9.net/dns-parameters
|
||||
#
|
||||
# After making modifications to this file the file rr_types.h should be regenerated!
|
||||
#
|
||||
# Info about the format of this file:
|
||||
# Blank lines and lines starting with '#' are ignored, all other lines
|
||||
# are assumed to define an RR type. Lines starting with '+' define most
|
||||
# frequently used types. An RR type preceded by a '-' will not be cached
|
||||
# by pdnsd. The next two fields are interpreted as the name and the value
|
||||
# of the RR type, resp. A subsequent word in parenthesis will be interpreted a
|
||||
# class name (used for conflict resolution). Remaining fields are ignored.
|
||||
#
|
||||
# Adding or removing an initial '+' can be done safely without requiring
|
||||
# changes to the source code (other than regenerating rr_types.h).
|
||||
#
|
||||
# If you are sure that you will never use certain RR types you can disable
|
||||
# caching for them and make pdnsd slightly more efficient by placing a
|
||||
# '-' sign in front of the lines that define those types.
|
||||
# For a list of obsolete RR types see e.g.
|
||||
# http://en.wikipedia.org/wiki/List_of_DNS_record_types .
|
||||
# Note that some RR types are essential for pdnsd; these are currently:
|
||||
# A, NS, CNAME, SOA, PTR, MX and (if you want IPv6 support) AAAA.
|
||||
# Disabling caching for these types will cause pdnsd to fail to compile
|
||||
# or cause a fatal run-time error.
|
||||
#
|
||||
# Removing a '-' sign to enable caching can be risky if the support in
|
||||
# the pdnsd code is missing or inadequate, so only do this if you really know
|
||||
# what you are doing. SPF records are supported, however, so it should be safe
|
||||
# to enable caching for them.
|
||||
|
||||
# RR TYPE Value (class) and meaning Reference
|
||||
# ----------- --------------------------------------------- ---------
|
||||
+ A 1 (RECORD) a host address [RFC 1035]
|
||||
+ NS 2 an authoritative name server [RFC 1035]
|
||||
MD 3 a mail destination (Obsolete - use MX) [RFC 1035]
|
||||
MF 4 a mail forwarder (Obsolete - use MX) [RFC 1035]
|
||||
+ CNAME 5 (ALIAS) the canonical name for an alias [RFC 1035]
|
||||
+ SOA 6 marks the start of a zone of authority [RFC 1035]
|
||||
MB 7 a mailbox domain name (EXPERIMENTAL) [RFC 1035]
|
||||
MG 8 a mail group member (EXPERIMENTAL) [RFC 1035]
|
||||
MR 9 a mail rename domain name (EXPERIMENTAL) [RFC 1035]
|
||||
NULL 10 a null RR (EXPERIMENTAL) [RFC 1035]
|
||||
WKS 11 (RECORD) a well known service description [RFC 1035]
|
||||
+ PTR 12 (PTR) a domain name pointer [RFC 1035]
|
||||
HINFO 13 (RECORD) host information [RFC 1035]
|
||||
MINFO 14 mailbox or mail list information [RFC 1035]
|
||||
+ MX 15 mail exchange [RFC 1035]
|
||||
+ TXT 16 text strings [RFC 1035]
|
||||
RP 17 (RECORD) for Responsible Person [RFC 1183]
|
||||
AFSDB 18 (RECORD) for AFS Data Base location [RFC 1183][RFC 5864]
|
||||
X25 19 (RECORD) for X.25 PSDN address [RFC 1183]
|
||||
ISDN 20 (RECORD) for ISDN address [RFC 1183]
|
||||
RT 21 (RECORD) for Route Through [RFC 1183]
|
||||
NSAP 22 (RECORD) for NSAP address, NSAP style A record [RFC 1706]
|
||||
NSAP-PTR 23 (PTR) for domain name pointer, NSAP style [RFC 1348]
|
||||
SIG 24 for security signature [RFC 4034][RFC 3755][RFC 2535]
|
||||
KEY 25 for security key [RFC 4034][RFC 3755][RFC 2535]
|
||||
PX 26 X.400 mail mapping information [RFC 2163]
|
||||
GPOS 27 (RECORD) Geographical Position [RFC 1712]
|
||||
+ AAAA 28 (RECORD) IP6 Address [RFC 3596]
|
||||
LOC 29 (RECORD) Location Information [RFC 1876]
|
||||
NXT 30 Next Domain - OBSOLETE [RFC 3755][RFC 2535]
|
||||
EID 31 (RECORD) Endpoint Identifier [Patton]
|
||||
NIMLOC 32 (RECORD) Nimrod Locator [Patton]
|
||||
SRV 33 (RECORD) Server Selection [RFC 2782]
|
||||
ATMA 34 (RECORD) ATM Address [ATMDOC]
|
||||
NAPTR 35 (RECORD) Naming Authority Pointer [RFC 2915][RFC 2168][RFC 3403]
|
||||
KX 36 (RECORD) Key Exchanger [RFC 2230]
|
||||
CERT 37 (RECORD) CERT [RFC 4398]
|
||||
- A6 38 A6 (Experimental) [RFC 3226][RFC 2874]
|
||||
- DNAME 39 (ALIAS) DNAME [RFC 2672]
|
||||
- SINK 40 SINK [Eastlake]
|
||||
- OPT 41 OPT [RFC 2671]
|
||||
APL 42 APL [RFC 3123]
|
||||
DS 43 Delegation Signer [RFC 4034][RFC 3658]
|
||||
SSHFP 44 SSH Key Fingerprint [RFC 4255]
|
||||
IPSECKEY 45 IPSECKEY [RFC 4025]
|
||||
RRSIG 46 RRSIG [RFC 4034][RFC 3755]
|
||||
NSEC 47 NSEC [RFC 4034][RFC 3755]
|
||||
DNSKEY 48 DNSKEY [RFC 4034][RFC 3755]
|
||||
DHCID 49 DHCID [RFC 4701]
|
||||
NSEC3 50 NSEC3 [RFC 5155]
|
||||
NSEC3PARAM 51 NSEC3PARAM [RFC 5155]
|
||||
# Unassigned 52-54
|
||||
- HIP 55 Host Identity Protocol [RFC 5205]
|
||||
- NINFO 56 NINFO [Reid]
|
||||
- RKEY 57 RKEY [Reid]
|
||||
- TALINK 58 Trust Anchor LINK [Wijngaards]
|
||||
# Unassigned 59-98
|
||||
- SPF 99 Sender Policy Framework [RFC 4408]
|
||||
- UINFO 100 [IANA-Reserved]
|
||||
- UID 101 [IANA-Reserved]
|
||||
- GID 102 [IANA-Reserved]
|
||||
- UNSPEC 103 [IANA-Reserved]
|
||||
# Unassigned 104-248
|
|
@ -0,0 +1,856 @@
|
|||
/* servers.c - manage a set of dns servers
|
||||
|
||||
Copyright (C) 2000, 2001 Thomas Moestl
|
||||
Copyright (C) 2002, 2003, 2005, 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 <time.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/wait.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <fnmatch.h>
|
||||
#include <string.h>
|
||||
#include "thread.h"
|
||||
#include "error.h"
|
||||
#include "servers.h"
|
||||
#include "conff.h"
|
||||
#include "consts.h"
|
||||
#include "icmp.h"
|
||||
#include "netdev.h"
|
||||
#include "helpers.h"
|
||||
#include "dns_query.h"
|
||||
|
||||
|
||||
/*
|
||||
* We may be a little over-strict with locks here. Never mind...
|
||||
* Also, there may be some code-redundancy regarding uptests. It saves some locks, though.
|
||||
*/
|
||||
|
||||
static pthread_mutex_t servers_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_cond_t server_data_cond = PTHREAD_COND_INITIALIZER;
|
||||
static pthread_cond_t server_test_cond = PTHREAD_COND_INITIALIZER;
|
||||
static int server_data_users = 0, server_status_ping = 0;
|
||||
/* Used to notify the server status thread that it should discontinue uptests. */
|
||||
volatile int signal_interrupt=0;
|
||||
#define statusintsig SIGHUP
|
||||
|
||||
static short retest_flag=0;
|
||||
|
||||
static char schm[32];
|
||||
|
||||
static void sigint_handler(int signum);
|
||||
|
||||
/*
|
||||
* Execute an individual uptest. Call with locks applied
|
||||
*/
|
||||
static int uptest (servparm_t *serv, int j)
|
||||
{
|
||||
int ret=0, count_running_ping=0;
|
||||
pdnsd_a *s_addr= PDNSD_A2_TO_A(&DA_INDEX(serv->atup_a,j).a);
|
||||
|
||||
DEBUG_PDNSDA_MSG("performing uptest (type=%s) for %s\n",const_name(serv->uptest),PDNSDA2STR(s_addr));
|
||||
|
||||
/* Unlock the mutex because some of the tests may take a while. */
|
||||
++server_data_users;
|
||||
if((serv->uptest==C_PING || serv->uptest==C_QUERY) && pthread_equal(pthread_self(),servstat_thrid)) {
|
||||
/* Inform other threads that a ping is in progress. */
|
||||
count_running_ping=1;
|
||||
++server_status_ping;
|
||||
}
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
|
||||
switch (serv->uptest) {
|
||||
case C_NONE:
|
||||
/* Don't change */
|
||||
ret=DA_INDEX(serv->atup_a,j).is_up;
|
||||
break;
|
||||
case C_PING:
|
||||
ret=ping(is_inaddr_any(&serv->ping_a) ? s_addr : &serv->ping_a, serv->ping_timeout,PINGREPEAT)!=-1;
|
||||
break;
|
||||
case C_IF:
|
||||
case C_DEV:
|
||||
case C_DIALD:
|
||||
ret=if_up(serv->interface);
|
||||
#if (TARGET==TARGET_LINUX)
|
||||
if (ret!=0) {
|
||||
if(serv->uptest==C_DEV)
|
||||
ret=dev_up(serv->interface,serv->device);
|
||||
else if (serv->uptest==C_DIALD)
|
||||
ret=dev_up("diald",serv->device);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case C_EXEC: {
|
||||
pid_t pid;
|
||||
|
||||
if ((pid=fork())==-1) {
|
||||
DEBUG_MSG("Could not fork to perform exec uptest: %s\n",strerror(errno));
|
||||
break;
|
||||
} else if (pid==0) { /* child */
|
||||
/*
|
||||
* If we ran as setuid or setgid, do not inherit this to the
|
||||
* command. This is just a last guard. Running pdnsd as setuid()
|
||||
* or setgid() is a no-no.
|
||||
*/
|
||||
if (setgid(getgid()) == -1 || setuid(getuid()) == -1) {
|
||||
log_error("Could not reset uid or gid: %s",strerror(errno));
|
||||
_exit(1);
|
||||
}
|
||||
/* Try to setuid() to a different user as specified. Good when you
|
||||
don't want the test command to run as root */
|
||||
if (!run_as(serv->uptest_usr)) {
|
||||
_exit(1);
|
||||
}
|
||||
{
|
||||
struct rlimit rl; int i;
|
||||
/*
|
||||
* Mark all open fd's FD_CLOEXEC for paranoia reasons.
|
||||
*/
|
||||
if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
|
||||
log_error("getrlimit() failed: %s",strerror(errno));
|
||||
_exit(1);
|
||||
}
|
||||
for (i = 0; i < rl.rlim_max; i++) {
|
||||
if (fcntl(i, F_SETFD, FD_CLOEXEC) == -1 && errno != EBADF) {
|
||||
log_error("fcntl(F_SETFD) failed: %s",strerror(errno));
|
||||
_exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
execl("/bin/sh", "uptest_sh","-c",serv->uptest_cmd,(char *)NULL);
|
||||
_exit(1); /* failed execl */
|
||||
} else { /* parent */
|
||||
int status;
|
||||
pid_t wpid = waitpid(pid,&status,0);
|
||||
if (wpid==pid) {
|
||||
if(WIFEXITED(status)) {
|
||||
int exitstatus=WEXITSTATUS(status);
|
||||
DEBUG_MSG("uptest command \"%s\" exited with status %d\n",
|
||||
serv->uptest_cmd, exitstatus);
|
||||
ret=(exitstatus==0);
|
||||
}
|
||||
#if DEBUG>0
|
||||
else if(WIFSIGNALED(status)) {
|
||||
DEBUG_MSG("uptest command \"%s\" was terminated by signal %d\n",
|
||||
serv->uptest_cmd, WTERMSIG(status));
|
||||
}
|
||||
else {
|
||||
DEBUG_MSG("status of uptest command \"%s\" is of unkown type (0x%x)\n",
|
||||
serv->uptest_cmd, status);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#if DEBUG>0
|
||||
else if (wpid==-1) {
|
||||
DEBUG_MSG("Error while waiting for uptest command \"%s\" to terminate: "
|
||||
"waitpid for pid %d failed: %s\n",
|
||||
serv->uptest_cmd, pid, strerror(errno));
|
||||
}
|
||||
else {
|
||||
DEBUG_MSG("Error while waiting for uptest command \"%s\" to terminate: "
|
||||
"waitpid returned %d, expected pid %d\n",
|
||||
serv->uptest_cmd, wpid, pid);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
case C_QUERY:
|
||||
ret=query_uptest(s_addr, serv->port, serv->query_test_name,
|
||||
serv->timeout>=global.timeout?serv->timeout:global.timeout,
|
||||
PINGREPEAT);
|
||||
} /* end of switch */
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
if(count_running_ping)
|
||||
--server_status_ping;
|
||||
PDNSD_ASSERT(server_data_users>0, "server_data_users non-positive before attempt to decrement it");
|
||||
if (--server_data_users==0) pthread_cond_broadcast(&server_data_cond);
|
||||
|
||||
DEBUG_PDNSDA_MSG("result of uptest for %s: %s\n",
|
||||
PDNSDA2STR(s_addr),
|
||||
ret?"OK":"failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int scheme_ok(servparm_t *serv)
|
||||
{
|
||||
if (serv->scheme[0]) {
|
||||
if (!schm[0]) {
|
||||
ssize_t nschm;
|
||||
int sc = open(global.scheme_file, O_RDONLY);
|
||||
char *s;
|
||||
if (sc<0)
|
||||
return 0;
|
||||
nschm = read(sc, schm, sizeof(schm)-1);
|
||||
close(sc);
|
||||
if (nschm < 0)
|
||||
return 0;
|
||||
schm[nschm] = '\0';
|
||||
s = strchr(schm, '\n');
|
||||
if (s)
|
||||
*s='\0';
|
||||
}
|
||||
if (fnmatch(serv->scheme, schm, 0))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Internal server test. Call with locks applied.
|
||||
May test a single server ip or several collectively.
|
||||
*/
|
||||
static void retest(int i, int j)
|
||||
{
|
||||
time_t s_ts;
|
||||
servparm_t *srv=&DA_INDEX(servers,i);
|
||||
int nsrvs=DA_NEL(srv->atup_a);
|
||||
|
||||
if(!nsrvs) return;
|
||||
if(j>=0) {
|
||||
if(j<nsrvs) nsrvs=j+1; /* test just one */
|
||||
}
|
||||
else {
|
||||
j=0; /* test a range of servers */
|
||||
}
|
||||
|
||||
if(!scheme_ok(srv)) {
|
||||
s_ts=time(NULL);
|
||||
|
||||
for(;j<nsrvs;++j) {
|
||||
atup_t *at=&DA_INDEX(srv->atup_a,j);
|
||||
at->is_up=0;
|
||||
at->i_ts=s_ts;
|
||||
}
|
||||
}
|
||||
else if(srv->uptest==C_NONE) {
|
||||
s_ts=time(NULL);
|
||||
|
||||
for(;j<nsrvs;++j) {
|
||||
DA_INDEX(srv->atup_a,j).i_ts=s_ts;
|
||||
}
|
||||
}
|
||||
else if(srv->uptest==C_QUERY || (srv->uptest==C_PING && is_inaddr_any(&srv->ping_a))) { /* test each ip address separately */
|
||||
for(;j<nsrvs;++j) {
|
||||
atup_t *at=&DA_INDEX(srv->atup_a,j);
|
||||
s_ts=time(NULL);
|
||||
at->is_up=uptest(srv,j);
|
||||
if(signal_interrupt)
|
||||
break;
|
||||
at->i_ts=s_ts;
|
||||
}
|
||||
}
|
||||
else { /* test ip addresses collectively */
|
||||
int res;
|
||||
|
||||
s_ts=time(NULL);
|
||||
res=uptest(srv,j);
|
||||
for(;j<nsrvs;++j) {
|
||||
atup_t *at=&DA_INDEX(srv->atup_a,j);
|
||||
at->is_up=res;
|
||||
if(signal_interrupt && srv->uptest==C_PING)
|
||||
continue;
|
||||
at->i_ts=s_ts;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* This is called by the server status thread to discover the addresses of root servers.
|
||||
Call with server_lock applied.
|
||||
*/
|
||||
static addr2_array resolv_rootserver_addrs(atup_array a, int port, char edns_query, time_t timeout)
|
||||
{
|
||||
addr2_array retval=NULL;
|
||||
|
||||
/* Unlock the mutex because this may take a while. */
|
||||
++server_data_users;
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
|
||||
retval= dns_rootserver_resolv(a,port,edns_query,timeout);
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
PDNSD_ASSERT(server_data_users>0, "server_data_users non-positive before attempt to decrement it");
|
||||
if (--server_data_users==0) pthread_cond_broadcast(&server_data_cond);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Refresh the server status by pinging or testing the interface in the given interval.
|
||||
* Note that you may get inaccuracies in the dimension of the ping timeout or the runtime
|
||||
* of your uptest command if you have uptest=ping or uptest=exec for at least one server.
|
||||
* This happens when all the uptests for the first n servers take more time than the inteval
|
||||
* of n+1 (or 0 when n+1>servnum). I do not think that these delays are critical, so I did
|
||||
* not to anything about that (because that may also be costly).
|
||||
*/
|
||||
void *servstat_thread(void *p)
|
||||
{
|
||||
struct sigaction action;
|
||||
int keep_testing;
|
||||
|
||||
/* (void)p; */ /* To inhibit "unused variable" warning */
|
||||
|
||||
THREAD_SIGINIT;
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
/* servstat_thrid=pthread_self(); */
|
||||
|
||||
signal_interrupt=0;
|
||||
action.sa_handler = sigint_handler;
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_flags = 0;
|
||||
if(sigaction(statusintsig, &action, NULL) == 0) {
|
||||
sigset_t smask;
|
||||
sigemptyset(&smask);
|
||||
sigaddset(&smask, statusintsig);
|
||||
pthread_sigmask(SIG_UNBLOCK,&smask,NULL);
|
||||
}
|
||||
else {
|
||||
log_warn("Cannot install signal handler for server status thread: %s\n",strerror(errno));
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
do {
|
||||
int i,n;
|
||||
keep_testing=0;
|
||||
retest_flag=0;
|
||||
schm[0] = '\0';
|
||||
n=DA_NEL(servers);
|
||||
for (i=0;i<n;++i) {
|
||||
servparm_t *sp=&DA_INDEX(servers,i);
|
||||
int j,m;
|
||||
if(sp->rootserver==2) {
|
||||
/* First get addresses of root servers. */
|
||||
addr2_array adrs;
|
||||
int l, one_up=0;
|
||||
|
||||
if(!scheme_ok(sp)) {
|
||||
time_t now=time(NULL);
|
||||
m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j)
|
||||
DA_INDEX(sp->atup_a,j).i_ts=now;
|
||||
} else if(sp->uptest==C_PING || sp->uptest==C_QUERY) {
|
||||
/* Skip ping or query tests until after discovery. */
|
||||
if(sp->interval>0)
|
||||
one_up= DA_NEL(sp->atup_a);
|
||||
else {
|
||||
time_t now=time(NULL);
|
||||
m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j) {
|
||||
atup_t *at=&DA_INDEX(sp->atup_a,j);
|
||||
if(at->is_up || at->i_ts==0)
|
||||
one_up=1;
|
||||
at->i_ts=now;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
retest(i,-1);
|
||||
|
||||
m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j) {
|
||||
if(DA_INDEX(sp->atup_a,j).is_up) {
|
||||
one_up=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!one_up) {
|
||||
if (needs_intermittent_testing(sp)) keep_testing=1;
|
||||
continue;
|
||||
}
|
||||
|
||||
DEBUG_MSG("Attempting to discover root servers for server section #%d.\n",i);
|
||||
adrs=resolv_rootserver_addrs(sp->atup_a,sp->port,sp->edns_query,sp->timeout);
|
||||
l= DA_NEL(adrs);
|
||||
if(l>0) {
|
||||
struct timeval now;
|
||||
struct timespec timeout;
|
||||
atup_array ata;
|
||||
DEBUG_MSG("Filling server section #%d with %d root server addresses.\n",i,l);
|
||||
gettimeofday(&now,NULL);
|
||||
timeout.tv_sec = now.tv_sec + 60; /* time out after 60 seconds */
|
||||
timeout.tv_nsec = now.tv_usec * 1000;
|
||||
while (server_data_users>0) {
|
||||
if(pthread_cond_timedwait(&server_data_cond, &servers_lock, &timeout) == ETIMEDOUT) {
|
||||
DEBUG_MSG("Timed out while waiting for exclusive access to server data"
|
||||
" to set root server addresses of server section #%d\n",i);
|
||||
da_free(adrs);
|
||||
keep_testing=1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
ata = DA_CREATE(atup_array, l);
|
||||
if(!ata) {
|
||||
log_warn("Out of memory in servstat_thread() while discovering root servers.");
|
||||
da_free(adrs);
|
||||
keep_testing=1;
|
||||
continue;
|
||||
}
|
||||
for(j=0; j<l; ++j) {
|
||||
atup_t *at = &DA_INDEX(ata,j);
|
||||
at->a = DA_INDEX(adrs,j);
|
||||
at->is_up=sp->preset;
|
||||
at->i_ts= sp->interval<0 ? time(NULL): 0;
|
||||
}
|
||||
da_free(sp->atup_a);
|
||||
sp->atup_a=ata;
|
||||
da_free(adrs);
|
||||
/* Successfully set IP addresses for this server section. */
|
||||
sp->rootserver=1;
|
||||
}
|
||||
else {
|
||||
DEBUG_MSG("Failed to discover root servers in servstat_thread() (server section #%d).\n",i);
|
||||
if(adrs) da_free(adrs);
|
||||
if(DA_NEL(sp->atup_a)) keep_testing=1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (needs_testing(sp)) keep_testing=1;
|
||||
m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j)
|
||||
if(DA_INDEX(sp->atup_a,j).i_ts)
|
||||
goto individual_tests;
|
||||
/* Test collectively */
|
||||
if(!signal_interrupt) retest(i,-1);
|
||||
continue;
|
||||
|
||||
individual_tests:
|
||||
for(j=0; !signal_interrupt && j<m; ++j) {
|
||||
time_t ts=DA_INDEX(sp->atup_a,j).i_ts, now;
|
||||
|
||||
if (ts==0 /* Always test servers with timestamp 0 */ ||
|
||||
(needs_intermittent_testing(sp) &&
|
||||
((now=time(NULL))-ts>sp->interval ||
|
||||
ts>now /* kluge for clock skew */)))
|
||||
{
|
||||
retest(i,j);
|
||||
}
|
||||
}
|
||||
}
|
||||
} while(!signal_interrupt && retest_flag);
|
||||
|
||||
signal_interrupt=0;
|
||||
|
||||
/* Break the loop and exit the thread if it is no longer needed. */
|
||||
if(!keep_testing) break;
|
||||
|
||||
{
|
||||
struct timeval now;
|
||||
struct timespec timeout;
|
||||
time_t minwait;
|
||||
int i,n,retval;
|
||||
|
||||
gettimeofday(&now,NULL);
|
||||
minwait=3600; /* Check at least once every hour. */
|
||||
n=DA_NEL(servers);
|
||||
for (i=0;i<n;++i) {
|
||||
servparm_t *sp=&DA_INDEX(servers,i);
|
||||
int j,m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j) {
|
||||
time_t ts= DA_INDEX(sp->atup_a,j).i_ts;
|
||||
if(ts==0) {
|
||||
/* Test servers with timestamp 0 without delay */
|
||||
if(minwait > 0) minwait=0;
|
||||
}
|
||||
else if(needs_intermittent_testing(sp)) {
|
||||
time_t wait= ts + sp->interval - now.tv_sec;
|
||||
if(wait < minwait) minwait=wait;
|
||||
}
|
||||
}
|
||||
}
|
||||
timeout.tv_sec = now.tv_sec;
|
||||
if(minwait>0)
|
||||
timeout.tv_sec += minwait;
|
||||
timeout.tv_nsec = now.tv_usec * 1000 + 500000000; /* wait at least half a second. */
|
||||
if(timeout.tv_nsec>=1000000000) {
|
||||
timeout.tv_nsec -= 1000000000;
|
||||
++timeout.tv_sec;
|
||||
}
|
||||
/* While we wait for a server_test_cond condition or a timeout
|
||||
the servers_lock mutex is unlocked, so other threads can access
|
||||
server data
|
||||
*/
|
||||
retval=pthread_cond_timedwait(&server_test_cond, &servers_lock, &timeout);
|
||||
DEBUG_MSG("Server status thread woke up (%s signal).\n",
|
||||
retval==0?"test condition":retval==ETIMEDOUT?"timer":retval==EINTR?"interrupt":"error");
|
||||
}
|
||||
}
|
||||
|
||||
/* server status thread no longer needed. */
|
||||
servstat_thrid=main_thrid;
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
DEBUG_MSG("Server status thread exiting.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Start the server status thread.
|
||||
*/
|
||||
int start_servstat_thread()
|
||||
{
|
||||
pthread_t stt;
|
||||
|
||||
int rv=pthread_create(&stt,&attr_detached,servstat_thread,NULL);
|
||||
if (rv)
|
||||
log_warn("Failed to start server status thread: %s",strerror(rv));
|
||||
else {
|
||||
servstat_thrid=stt;
|
||||
log_info(2,"Server status thread started.");
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
* This can be used to mark a server (or a list of nadr servers) up (up=1) or down (up=0),
|
||||
* or to schedule an immediate retest (up=-1).
|
||||
* We can't always use indices to identify a server, because we allow run-time
|
||||
* configuration of server addresses, so the servers are identified by their IP addresses.
|
||||
*/
|
||||
void sched_server_test(pdnsd_a *sa, int nadr, int up)
|
||||
{
|
||||
int k,signal_test;
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
|
||||
signal_test=0;
|
||||
/* This obviously isn't very efficient, but nadr should be small
|
||||
and anything else would introduce considerable overhead */
|
||||
for(k=0;k<nadr;++k) {
|
||||
pdnsd_a *sak= &sa[k];
|
||||
int i,n=DA_NEL(servers);
|
||||
for(i=0;i<n;++i) {
|
||||
servparm_t *sp=&DA_INDEX(servers,i);
|
||||
int j,m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j) {
|
||||
atup_t *at=&DA_INDEX(sp->atup_a,j);
|
||||
if(equiv_inaddr2(sak,&at->a)) {
|
||||
if(up>=0) {
|
||||
at->is_up=up;
|
||||
at->i_ts=time(NULL);
|
||||
DEBUG_PDNSDA_MSG("Marked server %s %s.\n",PDNSDA2STR(sak),up?"up":"down");
|
||||
}
|
||||
else if(at->i_ts) {
|
||||
/* A test may take a while, and we don't want to hold
|
||||
up the calling thread.
|
||||
Instead we set the timestamp to zero and signal
|
||||
a condition which should wake up the server test thread.
|
||||
*/
|
||||
at->i_ts=0;
|
||||
signal_test=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(signal_test) pthread_cond_signal(&server_test_cond);
|
||||
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
}
|
||||
|
||||
/* Mark a set of servers up or down or schedule uptests.
|
||||
* If i>=0 only the server section with index i is scanned,
|
||||
* if i<0 all sections are scanned.
|
||||
* Only sections matching label are actually set. A NULL label matches
|
||||
* any section.
|
||||
* up=1 or up=0 means mark server up or down, up=-1 means retest.
|
||||
*
|
||||
* A non-zero return value indicates an error.
|
||||
*/
|
||||
int mark_servers(int i, char *label, int up)
|
||||
{
|
||||
int retval=0,n,signal_test;
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
|
||||
signal_test=0;
|
||||
n=DA_NEL(servers);
|
||||
if(i>=0) {
|
||||
/* just one section */
|
||||
if(i<n) n=i+1;
|
||||
}
|
||||
else {
|
||||
i=0; /* scan all sections */
|
||||
}
|
||||
for(;i<n;++i) {
|
||||
servparm_t *sp=&DA_INDEX(servers,i);
|
||||
if(!label || (sp->label && !strcmp(sp->label,label))) {
|
||||
int j,m=DA_NEL(sp->atup_a);
|
||||
|
||||
/* If a section with undiscovered root servers is marked up, signal a test. */
|
||||
if(m && sp->rootserver>1 && up>0) signal_test=1;
|
||||
|
||||
for(j=0;j<m;++j) {
|
||||
atup_t *at=&DA_INDEX(sp->atup_a,j);
|
||||
if(up>=0) {
|
||||
at->is_up=up;
|
||||
at->i_ts=time(NULL);
|
||||
}
|
||||
else if(at->i_ts) {
|
||||
/* A test may take a while, and we don't want to hold
|
||||
up the calling thread.
|
||||
Instead we set the timestamp to zero and signal
|
||||
a condition which should wake up the server test thread.
|
||||
*/
|
||||
at->i_ts=0;
|
||||
signal_test=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(signal_test) {
|
||||
if(pthread_equal(servstat_thrid,main_thrid))
|
||||
retval=start_servstat_thread();
|
||||
else {
|
||||
retest_flag=1;
|
||||
retval=pthread_cond_signal(&server_test_cond);
|
||||
}
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test called by the dns query handlers to handle interval=onquery cases.
|
||||
*/
|
||||
void test_onquery()
|
||||
{
|
||||
int i,n,signal_test;
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
schm[0] = '\0';
|
||||
signal_test=0;
|
||||
n=DA_NEL(servers);
|
||||
for (i=0;i<n;++i) {
|
||||
servparm_t *sp=&DA_INDEX(servers,i);
|
||||
if (sp->interval==-1) {
|
||||
if(sp->rootserver<=1)
|
||||
retest(i,-1);
|
||||
else {
|
||||
/* We leave root-server discovery to the server status thread */
|
||||
int j,m=DA_NEL(sp->atup_a);
|
||||
for(j=0;j<m;++j)
|
||||
DA_INDEX(sp->atup_a,j).i_ts=0;
|
||||
signal_test=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(signal_test) {
|
||||
int rv;
|
||||
if(pthread_equal(servstat_thrid,main_thrid))
|
||||
start_servstat_thread();
|
||||
else {
|
||||
retest_flag=1;
|
||||
if((rv=pthread_cond_signal(&server_test_cond))) {
|
||||
DEBUG_MSG("test_onquery(): couldn't signal server status thread: %s\n",strerror(rv));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
}
|
||||
|
||||
/* non-exclusive lock, for read only access to server data. */
|
||||
void lock_server_data()
|
||||
{
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
++server_data_users;
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
}
|
||||
|
||||
void unlock_server_data()
|
||||
{
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
PDNSD_ASSERT(server_data_users>0, "server_data_users non-positive before attempt to decrement it");
|
||||
if (--server_data_users==0) pthread_cond_broadcast(&server_data_cond);
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
}
|
||||
|
||||
/* Try to obtain an exclusive lock, needed for modifying server data.
|
||||
Return 1 on success, 0 on failure (time out after tm seconds).
|
||||
*/
|
||||
int exclusive_lock_server_data(int tm)
|
||||
{
|
||||
struct timeval now;
|
||||
struct timespec timeout;
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
if(server_status_ping>0 && !pthread_equal(servstat_thrid,main_thrid)) {
|
||||
int err;
|
||||
/* Try to interrupt server status thread to prevent delays. */
|
||||
DEBUG_MSG("Sending server status thread an interrupt signal.\n");
|
||||
if((err=pthread_kill(servstat_thrid,statusintsig))) {
|
||||
DEBUG_MSG("pthread_kill failed: %s\n",strerror(err));
|
||||
}
|
||||
}
|
||||
gettimeofday(&now,NULL);
|
||||
timeout.tv_sec = now.tv_sec + tm; /* time out after tm seconds */
|
||||
timeout.tv_nsec = now.tv_usec * 1000;
|
||||
while (server_data_users>0) {
|
||||
if(pthread_cond_timedwait(&server_data_cond, &servers_lock, &timeout) == ETIMEDOUT) {
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/* Call this to free the lock obtained with exclusive_lock_server_data().
|
||||
If retest is nonzero, the server-status thread is reactivated to check
|
||||
which servers are up. This is useful in case the configuration has changed.
|
||||
*/
|
||||
void exclusive_unlock_server_data(int retest)
|
||||
{
|
||||
if(retest) {
|
||||
if(pthread_equal(servstat_thrid,main_thrid))
|
||||
start_servstat_thread();
|
||||
else
|
||||
pthread_cond_signal(&server_test_cond);
|
||||
}
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
Change addresses of servers during runtime.
|
||||
i is the number of the server section to change.
|
||||
ar should point to an array of IP addresses (may be NULL).
|
||||
up=1 or up=0 means mark server up or down afterwards,
|
||||
up=-1 means retest.
|
||||
|
||||
A non-zero return value indicates an error.
|
||||
*/
|
||||
int change_servers(int i, addr_array ar, int up)
|
||||
{
|
||||
int retval=0,j,change,signal_test;
|
||||
int n;
|
||||
servparm_t *sp;
|
||||
|
||||
pthread_mutex_lock(&servers_lock);
|
||||
|
||||
signal_test=0;
|
||||
change=0;
|
||||
n=DA_NEL(ar);
|
||||
sp=&DA_INDEX(servers,i);
|
||||
if(n != DA_NEL(sp->atup_a) || sp->rootserver>1)
|
||||
change=1;
|
||||
else {
|
||||
int j;
|
||||
for(j=0;j<n;++j)
|
||||
if(!same_inaddr2(&DA_INDEX(ar,j),&DA_INDEX(sp->atup_a,j).a)) {
|
||||
change=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(change) {
|
||||
/* we need exclusive access to the server data to make the changes */
|
||||
struct timeval now;
|
||||
struct timespec timeout;
|
||||
atup_array ata;
|
||||
|
||||
if(server_status_ping>0 && !pthread_equal(servstat_thrid,main_thrid)) {
|
||||
int err;
|
||||
/* Try to interrupt server status thread to prevent delays. */
|
||||
DEBUG_MSG("Sending server status thread an interrupt signal.\n");
|
||||
if((err=pthread_kill(servstat_thrid,statusintsig))) {
|
||||
DEBUG_MSG("pthread_kill failed: %s\n",strerror(err));
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG_MSG("Changing IPs of server section #%d\n",i);
|
||||
gettimeofday(&now,NULL);
|
||||
timeout.tv_sec = now.tv_sec + 60; /* time out after 60 seconds */
|
||||
timeout.tv_nsec = now.tv_usec * 1000;
|
||||
while (server_data_users>0) {
|
||||
if(pthread_cond_timedwait(&server_data_cond, &servers_lock, &timeout) == ETIMEDOUT) {
|
||||
retval=ETIMEDOUT;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
}
|
||||
|
||||
ata= DA_CREATE(atup_array, n);
|
||||
if(!ata) {
|
||||
log_warn("Out of memory in change_servers().");
|
||||
retval=ENOMEM;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
da_free(sp->atup_a);
|
||||
sp->atup_a=ata;
|
||||
/* Stop trying to discover rootservers
|
||||
if we set the addresses using this routine. */
|
||||
if(sp->rootserver>1) sp->rootserver=1;
|
||||
}
|
||||
|
||||
for(j=0; j<n; ++j) {
|
||||
atup_t *at = &DA_INDEX(sp->atup_a,j);
|
||||
if(change) {
|
||||
SET_PDNSD_A2(&at->a, &DA_INDEX(ar,j));
|
||||
at->is_up=sp->preset;
|
||||
}
|
||||
if(up>=0) {
|
||||
at->is_up=up;
|
||||
at->i_ts=time(NULL);
|
||||
}
|
||||
else if(change || at->i_ts) {
|
||||
/* A test may take a while, and we don't want to hold
|
||||
up the calling thread.
|
||||
Instead we set the timestamp to zero and signal
|
||||
a condition which should wake up the server test thread.
|
||||
*/
|
||||
at->i_ts=0;
|
||||
signal_test=1;
|
||||
}
|
||||
}
|
||||
|
||||
if(signal_test) {
|
||||
if(pthread_equal(servstat_thrid,main_thrid))
|
||||
retval=start_servstat_thread();
|
||||
else {
|
||||
retest_flag=1;
|
||||
retval=pthread_cond_signal(&server_test_cond);
|
||||
}
|
||||
}
|
||||
|
||||
unlock_mutex:
|
||||
pthread_mutex_unlock(&servers_lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
The signal handler for the signal to tell the server status thread to discontinue testing.
|
||||
*/
|
||||
static void sigint_handler(int signum)
|
||||
{
|
||||
signal_interrupt=1;
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
/* servers.h - manage a set of dns servers
|
||||
|
||||
Copyright (C) 2000 Thomas Moestl
|
||||
Copyright (C) 2002, 2003, 2004, 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 _SERVERS_H_
|
||||
#define _SERVERS_H_
|
||||
|
||||
#include <config.h>
|
||||
#include "consts.h"
|
||||
|
||||
/* Number of ping timeouts before we take a server offline. */
|
||||
#define PINGREPEAT 2
|
||||
|
||||
extern pthread_t servstat_thrid;
|
||||
extern volatile int signal_interrupt;
|
||||
|
||||
|
||||
int start_servstat_thread(void);
|
||||
void sched_server_test(pdnsd_a *sa, int nadr, int up);
|
||||
int mark_servers(int i, char* label, int up);
|
||||
void test_onquery(void);
|
||||
void lock_server_data();
|
||||
void unlock_server_data();
|
||||
int exclusive_lock_server_data(int tm);
|
||||
void exclusive_unlock_server_data(int retest);
|
||||
int change_servers(int i, addr_array ar, int up);
|
||||
|
||||
inline static int needs_testing(servparm_t *sp)
|
||||
__attribute__((always_inline));
|
||||
inline static int needs_testing(servparm_t *sp)
|
||||
{
|
||||
return ((sp->interval>0 || sp->interval==-2) && (sp->uptest!=C_NONE || sp->scheme[0]));
|
||||
}
|
||||
|
||||
inline static int needs_intermittent_testing(servparm_t *sp)
|
||||
__attribute__((always_inline));
|
||||
inline static int needs_intermittent_testing(servparm_t *sp)
|
||||
{
|
||||
return (sp->interval>0 && (sp->uptest!=C_NONE || sp->scheme[0]));
|
||||
}
|
||||
|
||||
inline static int is_interrupted_servstat_thread()
|
||||
__attribute__((always_inline));
|
||||
inline static int is_interrupted_servstat_thread()
|
||||
{
|
||||
return (signal_interrupt && pthread_equal(pthread_self(),servstat_thrid));
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,25 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
use strict;
|
||||
|
||||
my %dic;
|
||||
my $maxkeylen=0;
|
||||
|
||||
while(<>) {
|
||||
if(/"(\w+)".*?(\w+)/) {
|
||||
my $key=$1; my $val=$2;
|
||||
if($dic{$key}) {die "The key \"$key\" does not have a unique value.\n"}
|
||||
$dic{$key}=$val;
|
||||
if(length($key)>$maxkeylen) {$maxkeylen=length($key)}
|
||||
}
|
||||
else {die "Can't find key-value pair in following line:\n$_\n"}
|
||||
}
|
||||
|
||||
my $linenr=0;
|
||||
foreach my $key (sort(keys %dic)) {
|
||||
if($linenr++) {print ",\n"}
|
||||
printf("\t{%-*s%s}",$maxkeylen+4,"\"$key\",",$dic{$key});
|
||||
}
|
||||
print "\n";
|
||||
|
||||
exit
|
|
@ -0,0 +1,824 @@
|
|||
/* status.c - Allow control of a running server using a socket
|
||||
|
||||
Copyright (C) 2000, 2001 Thomas Moestl
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 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/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <stddef.h> /* for offsetof */
|
||||
#include "ipvers.h"
|
||||
#include "status.h"
|
||||
#include "thread.h"
|
||||
#include "cache.h"
|
||||
#include "error.h"
|
||||
#include "servers.h"
|
||||
#include "dns_answer.h"
|
||||
#include "helpers.h"
|
||||
#include "conf-parser.h"
|
||||
|
||||
#if !defined(HAVE_ALLOCA) && !defined(alloca)
|
||||
#define alloca malloc
|
||||
#endif
|
||||
|
||||
|
||||
char *sock_path=NULL;
|
||||
int stat_sock;
|
||||
|
||||
|
||||
/* Print an error to the socket */
|
||||
static int print_serr(int rs, const char *msg)
|
||||
{
|
||||
uint16_t cmd;
|
||||
|
||||
DEBUG_MSG("Sending error message to control socket: '%s'\n",msg);
|
||||
cmd=htons(1);
|
||||
if(write(rs,&cmd,sizeof(cmd))!=sizeof(cmd) ||
|
||||
write_all(rs,msg,strlen(msg))<0)
|
||||
{
|
||||
DEBUG_MSG("Error writing to control socket: %s\n",strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Print a success code to the socket */
|
||||
static int print_succ(int rs)
|
||||
{
|
||||
uint16_t cmd;
|
||||
|
||||
cmd=htons(0);
|
||||
if(write(rs,&cmd,sizeof(cmd))!=sizeof(cmd)) {
|
||||
DEBUG_MSG("Error writing to control socket: %s\n"
|
||||
"Failed to send success code.\n",strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read a cmd short */
|
||||
static int read_short(int fh, uint16_t *res)
|
||||
{
|
||||
uint16_t cmd;
|
||||
|
||||
if (read(fh,&cmd,sizeof(cmd))!=sizeof(cmd)) {
|
||||
/* print_serr(fh,"Bad arg."); */
|
||||
return 0;
|
||||
}
|
||||
*res= ntohs(cmd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read a cmd long */
|
||||
static int read_long(int fh, uint32_t *res)
|
||||
{
|
||||
uint32_t cmd;
|
||||
|
||||
if (read(fh,&cmd,sizeof(cmd))!=sizeof(cmd)) {
|
||||
/* print_serr(fh,"Bad arg."); */
|
||||
return 0;
|
||||
}
|
||||
*res= ntohl(cmd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read a string preceded by a char count.
|
||||
A buffer of the right size is allocated to hold the result.
|
||||
A return value of 1 means success,
|
||||
-1 means the result is undefined (*res is set to NULL),
|
||||
0 means read or allocation error.
|
||||
*/
|
||||
static int read_allocstring(int fh, char **res, unsigned *len)
|
||||
{
|
||||
uint16_t count;
|
||||
char *buf;
|
||||
unsigned int nread;
|
||||
|
||||
if(!read_short(fh,&count)) return 0;
|
||||
if(count==(uint16_t)(~0)) {*res=NULL; return -1;}
|
||||
if(!(buf=malloc(count+1))) return 0;
|
||||
nread=0;
|
||||
while(nread<count) {
|
||||
ssize_t m=read(fh,buf+nread,count-nread);
|
||||
if(m<=0) {free(buf); return 0;}
|
||||
nread+=m;
|
||||
}
|
||||
buf[count]=0;
|
||||
*res=buf;
|
||||
if(len) *len=count;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read a string preceded by a char count.
|
||||
Place it in a buffer of size buflen and terminate with a null char.
|
||||
A return value of 1 means success, -1 means not defined,
|
||||
0 means error (read error, buffer too small).
|
||||
*/
|
||||
static int read_domain(int fh, char *buf, unsigned int buflen)
|
||||
{
|
||||
uint16_t count;
|
||||
unsigned int nread;
|
||||
|
||||
if(!read_short(fh,&count)) return 0;
|
||||
if(count==(uint16_t)(~0)) return -1;
|
||||
if(count >=buflen) return 0;
|
||||
nread=0;
|
||||
while(nread<count) {
|
||||
ssize_t m=read(fh,buf+nread,count-nread);
|
||||
if(m<=0) return 0;
|
||||
nread+=m;
|
||||
}
|
||||
buf[count]=0;
|
||||
#if 0
|
||||
if(count==0 || buf[count-1]!='.') {
|
||||
if(count+1>=buflen) return 0;
|
||||
buf[count]='.'; buf[count+1]=0;
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void *status_thread (void *p)
|
||||
{
|
||||
THREAD_SIGINIT;
|
||||
/* (void)p; */ /* To inhibit "unused variable" warning */
|
||||
|
||||
if (!global.strict_suid) {
|
||||
if (!run_as(global.run_as)) {
|
||||
pdnsd_exit();
|
||||
}
|
||||
}
|
||||
|
||||
if (listen(stat_sock,5)==-1) {
|
||||
log_warn("Error: could not listen on socket: %s.\nStatus readback will be impossible",strerror(errno));
|
||||
goto exit_thread;
|
||||
}
|
||||
for(;;) {
|
||||
struct sockaddr_un ra;
|
||||
socklen_t res=sizeof(ra);
|
||||
int rs;
|
||||
if ((rs=accept(stat_sock,(struct sockaddr *)&ra,&res))!=-1) {
|
||||
uint16_t cmd;
|
||||
DEBUG_MSG("Status socket query pending.\n");
|
||||
if (read_short(rs,&cmd)) {
|
||||
/* Check magic number in command */
|
||||
if((cmd & 0xff00) == CTL_CMDVERNR) {
|
||||
const char *errmsg;
|
||||
cmd &= 0xff;
|
||||
switch(cmd) {
|
||||
case CTL_STATS: {
|
||||
struct utsname nm;
|
||||
DEBUG_MSG("Received STATUS query.\n");
|
||||
if(!print_succ(rs))
|
||||
break;
|
||||
uname(&nm);
|
||||
if(fsprintf(rs,"pdnsd-%s running on %s.\n",VERSION,nm.nodename)<0 ||
|
||||
report_cache_stat(rs)<0 ||
|
||||
report_thread_stat(rs)<0 ||
|
||||
report_conf_stat(rs)<0)
|
||||
{
|
||||
DEBUG_MSG("Error writing to control socket: %s\n"
|
||||
"Failed to send status report.\n",strerror(errno));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CTL_SERVER: {
|
||||
char *label,*dnsaddr;
|
||||
int indx;
|
||||
uint16_t cmd2;
|
||||
DEBUG_MSG("Received SERVER command.\n");
|
||||
if (read_allocstring(rs,&label,NULL)<=0) {
|
||||
print_serr(rs,"Error reading server label.");
|
||||
break;
|
||||
}
|
||||
if (!read_short(rs,&cmd2)) {
|
||||
print_serr(rs,"Missing up|down|retest.");
|
||||
goto free_label_break;
|
||||
}
|
||||
if(!read_allocstring(rs, &dnsaddr,NULL)) {
|
||||
print_serr(rs,"Error reading DNS addresses.");
|
||||
goto free_label_break;
|
||||
}
|
||||
/* Note by Paul Rombouts:
|
||||
We are about to access server configuration data.
|
||||
Now that the configuration can be changed during run time,
|
||||
we should be using locks before accessing server config data, even if it
|
||||
is read-only access.
|
||||
However, as long as this is the only thread that calls reload_config_file()
|
||||
it should be OK to read the server config without locks, but it is
|
||||
something to keep in mind.
|
||||
*/
|
||||
{
|
||||
char *endptr;
|
||||
indx=strtol(label,&endptr,0);
|
||||
if(!*endptr) {
|
||||
if (indx<0 || indx>=DA_NEL(servers)) {
|
||||
print_serr(rs,"Server index out of range.");
|
||||
goto free_dnsaddr_label_break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!strcmp(label, "all"))
|
||||
indx=-2; /* all servers */
|
||||
else
|
||||
indx=-1; /* compare names */
|
||||
}
|
||||
}
|
||||
if(cmd2==CTL_S_UP || cmd2==CTL_S_DOWN || cmd2==CTL_S_RETEST) {
|
||||
if(!dnsaddr) {
|
||||
if (indx==-1) {
|
||||
int i;
|
||||
for (i=0;i<DA_NEL(servers);++i) {
|
||||
char *servlabel=DA_INDEX(servers,i).label;
|
||||
if (servlabel && !strcmp(servlabel,label))
|
||||
goto found_label;
|
||||
}
|
||||
print_serr(rs,"Bad server label.");
|
||||
goto free_dnsaddr_label_break;
|
||||
found_label:;
|
||||
}
|
||||
if(mark_servers(indx,(indx==-1)?label:NULL,(cmd2==CTL_S_RETEST)?-1:(cmd2==CTL_S_UP))==0)
|
||||
print_succ(rs);
|
||||
else
|
||||
print_serr(rs,"Could not start up or signal server status thread.");
|
||||
}
|
||||
else { /* Change server addresses */
|
||||
if(indx==-2) {
|
||||
print_serr(rs,"Can't use label \"all\" to change server addresses.");
|
||||
goto free_dnsaddr_label_break;
|
||||
}
|
||||
if(indx==-1) {
|
||||
int i;
|
||||
for(i=0;i<DA_NEL(servers);++i) {
|
||||
char *servlabel=DA_INDEX(servers,i).label;
|
||||
if (servlabel && !strcmp(servlabel,label)) {
|
||||
if(indx!=-1) {
|
||||
print_serr(rs,"server label must be unique to change server addresses.");
|
||||
goto free_dnsaddr_label_break;
|
||||
}
|
||||
indx=i;
|
||||
}
|
||||
}
|
||||
if(indx==-1) {
|
||||
print_serr(rs,"Bad server label.");
|
||||
goto free_dnsaddr_label_break;
|
||||
}
|
||||
}
|
||||
{
|
||||
char *ipstr,*q=dnsaddr;
|
||||
addr_array ar=NULL;
|
||||
pdnsd_a addr;
|
||||
int err;
|
||||
for(;;) {
|
||||
for(;;) {
|
||||
if(!*q) goto change_servs;
|
||||
if(*q!=',' && !isspace(*q)) break;
|
||||
++q;
|
||||
}
|
||||
ipstr=q;
|
||||
for(;;) {
|
||||
++q;
|
||||
if(!*q) break;
|
||||
if(*q==',' || isspace(*q)) {*q++=0; break; }
|
||||
}
|
||||
if(!str2pdnsd_a(ipstr,&addr)) {
|
||||
print_serr(rs,"Bad server ip");
|
||||
goto free_ar;
|
||||
}
|
||||
if(!(ar=DA_GROW1(ar))) {
|
||||
print_serr(rs,"Out of memory.");
|
||||
goto free_dnsaddr_label_break;
|
||||
}
|
||||
DA_LAST(ar)=addr;
|
||||
}
|
||||
change_servs:
|
||||
err=change_servers(indx,ar,(cmd2==CTL_S_RETEST)?-1:(cmd2==CTL_S_UP));
|
||||
if(err==0)
|
||||
print_succ(rs);
|
||||
else
|
||||
print_serr(rs,err==ETIMEDOUT?"Timed out while trying to gain access to server data.":
|
||||
err==ENOMEM?"Out of memory.":
|
||||
"Could not start up or signal server status thread.");
|
||||
free_ar:
|
||||
da_free(ar);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
print_serr(rs,"Bad command.");
|
||||
|
||||
free_dnsaddr_label_break:
|
||||
free(dnsaddr);
|
||||
free_label_break:
|
||||
free(label);
|
||||
}
|
||||
break;
|
||||
case CTL_RECORD: {
|
||||
uint16_t cmd2;
|
||||
unsigned char name[DNSNAMEBUFSIZE],buf[DNSNAMEBUFSIZE];
|
||||
DEBUG_MSG("Received RECORD command.\n");
|
||||
if (!read_short(rs,&cmd2))
|
||||
goto incomplete_command;
|
||||
if (read_domain(rs, charp buf, sizeof(buf))<=0)
|
||||
goto incomplete_command;
|
||||
if ((errmsg=parsestr2rhn(buf,sizeof(buf),name))!=NULL)
|
||||
goto bad_domain_name;
|
||||
switch (cmd2) {
|
||||
case CTL_R_DELETE:
|
||||
del_cache(name);
|
||||
print_succ(rs);
|
||||
break;
|
||||
case CTL_R_INVAL:
|
||||
invalidate_record(name);
|
||||
print_succ(rs);
|
||||
break;
|
||||
default:
|
||||
print_serr(rs,"Bad command.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CTL_SOURCE: {
|
||||
uint32_t ttl;
|
||||
char *fn;
|
||||
uint16_t servaliases,flags;
|
||||
unsigned char buf[DNSNAMEBUFSIZE],owner[DNSNAMEBUFSIZE];
|
||||
|
||||
DEBUG_MSG("Received SOURCE command.\n");
|
||||
if (read_allocstring(rs,&fn,NULL)<=0) {
|
||||
print_serr(rs,"Bad filename name.");
|
||||
break;
|
||||
}
|
||||
if (read_domain(rs, charp buf, sizeof(buf))<=0 ||
|
||||
!read_long(rs,&ttl) ||
|
||||
!read_short(rs,&servaliases) || /* serve aliases */
|
||||
!read_short(rs,&flags)) /* caching flags */
|
||||
{
|
||||
print_serr(rs,"Malformed or incomplete command.");
|
||||
goto free_fn;
|
||||
}
|
||||
if ((errmsg=parsestr2rhn(buf,sizeof(buf),owner))!=NULL) {
|
||||
print_serr(rs,errmsg);
|
||||
goto free_fn;
|
||||
}
|
||||
if (ttl < 0) {
|
||||
print_serr(rs, "Bad TTL.");
|
||||
goto free_fn;
|
||||
}
|
||||
if(flags&DF_NEGATIVE) {
|
||||
print_serr(rs, "Bad cache flags.");
|
||||
goto free_fn;
|
||||
}
|
||||
{
|
||||
char *errmsg;
|
||||
if (read_hosts(fn,owner,ttl,flags,servaliases,&errmsg))
|
||||
print_succ(rs);
|
||||
else {
|
||||
print_serr(rs,errmsg?:"Out of memory.");
|
||||
free(errmsg);
|
||||
}
|
||||
}
|
||||
free_fn:
|
||||
free(fn);
|
||||
}
|
||||
break;
|
||||
case CTL_ADD: {
|
||||
uint32_t ttl;
|
||||
unsigned sz;
|
||||
uint16_t tp,flags,nadr=0;
|
||||
unsigned char name[DNSNAMEBUFSIZE],buf[DNSNAMEBUFSIZE],dbuf[2+DNSNAMEBUFSIZE];
|
||||
size_t adrbufsz=0;
|
||||
unsigned char *adrbuf=NULL;
|
||||
|
||||
DEBUG_MSG("Received ADD command.\n");
|
||||
if (!read_short(rs,&tp))
|
||||
goto incomplete_command;
|
||||
if (read_domain(rs, charp buf, sizeof(buf))<=0)
|
||||
goto incomplete_command;
|
||||
if (!read_long(rs,&ttl))
|
||||
goto incomplete_command;
|
||||
if (!read_short(rs,&flags)) /* caching flags */
|
||||
goto incomplete_command;
|
||||
if ((errmsg=parsestr2rhn(buf,sizeof(buf),name))!=NULL)
|
||||
goto bad_domain_name;
|
||||
if (ttl < 0)
|
||||
goto bad_ttl;
|
||||
if(flags&DF_NEGATIVE)
|
||||
goto bad_flags;
|
||||
|
||||
switch (tp) {
|
||||
case T_A:
|
||||
sz=sizeof(struct in_addr);
|
||||
#if ALLOW_LOCAL_AAAA
|
||||
goto read_adress_list;
|
||||
case T_AAAA:
|
||||
sz=sizeof(struct in6_addr);
|
||||
read_adress_list:
|
||||
#endif
|
||||
if (!read_short(rs,&nadr))
|
||||
goto incomplete_command;
|
||||
if (!nadr)
|
||||
goto bad_arg;
|
||||
adrbufsz= nadr * (size_t)sz;
|
||||
adrbuf= malloc(adrbufsz);
|
||||
if(!adrbuf)
|
||||
goto out_of_memory;
|
||||
{
|
||||
size_t nread=0;
|
||||
while(nread<adrbufsz) {
|
||||
ssize_t m=read(rs,adrbuf+nread,adrbufsz-nread);
|
||||
if(m<=0) {free(adrbuf); goto bad_arg;}
|
||||
nread += m;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case T_CNAME:
|
||||
case T_PTR:
|
||||
case T_NS:
|
||||
if (read_domain(rs, charp buf, sizeof(buf))<=0)
|
||||
goto incomplete_command;
|
||||
if ((errmsg=parsestr2rhn(buf,sizeof(buf),dbuf))!=NULL)
|
||||
goto bad_domain_name;
|
||||
sz=rhnlen(dbuf);
|
||||
break;
|
||||
case T_MX:
|
||||
if (read(rs,dbuf,2)!=2)
|
||||
goto bad_arg;
|
||||
if (read_domain(rs, charp buf, sizeof(buf))<=0)
|
||||
goto incomplete_command;
|
||||
if ((errmsg=parsestr2rhn(buf,sizeof(buf),dbuf+2))!=NULL)
|
||||
goto bad_domain_name;
|
||||
sz=rhnlen(dbuf+2)+2;
|
||||
break;
|
||||
default:
|
||||
goto bad_arg;
|
||||
}
|
||||
{
|
||||
dns_cent_t cent;
|
||||
|
||||
if (!init_cent(¢, name, 0, 0, flags DBG1)) {
|
||||
free(adrbuf);
|
||||
goto out_of_memory;
|
||||
}
|
||||
if(adrbuf) {
|
||||
unsigned char *adrp; int i;
|
||||
for(adrp=adrbuf,i=0; i<nadr; adrp += sz,++i) {
|
||||
if (!add_cent_rr(¢,tp,ttl,0,CF_LOCAL,sz,adrp DBG1)) {
|
||||
free_cent(¢ DBG1);
|
||||
free(adrbuf);
|
||||
goto out_of_memory;
|
||||
}
|
||||
}
|
||||
free(adrbuf);
|
||||
}
|
||||
else if (!add_cent_rr(¢,tp,ttl,0,CF_LOCAL,sz,dbuf DBG1)) {
|
||||
free_cent(¢ DBG1);
|
||||
goto out_of_memory;
|
||||
}
|
||||
|
||||
if(cent.qname[0]==1 && cent.qname[1]=='*') {
|
||||
/* Wild card record.
|
||||
Set the DF_WILD flag for the name with '*.' removed. */
|
||||
if(!set_cent_flags(¢.qname[2],DF_WILD)) {
|
||||
print_serr(rs,
|
||||
"Before defining records for a name with a wildcard"
|
||||
" you must first define some records for the name"
|
||||
" with '*.' removed.");
|
||||
goto cleanup_cent;
|
||||
}
|
||||
}
|
||||
|
||||
add_cache(¢);
|
||||
print_succ(rs);
|
||||
cleanup_cent:
|
||||
free_cent(¢ DBG1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CTL_NEG: {
|
||||
uint32_t ttl;
|
||||
uint16_t tp;
|
||||
unsigned char name[DNSNAMEBUFSIZE],buf[DNSNAMEBUFSIZE];
|
||||
|
||||
DEBUG_MSG("Received NEG command.\n");
|
||||
if (read_domain(rs, charp buf, sizeof(buf))<=0)
|
||||
goto incomplete_command;
|
||||
if (!read_short(rs,&tp))
|
||||
goto incomplete_command;
|
||||
if (!read_long(rs,&ttl))
|
||||
goto incomplete_command;
|
||||
if ((errmsg=parsestr2rhn(buf,sizeof(buf),name))!=NULL) {
|
||||
DEBUG_MSG("NEG: received bad domain name.\n");
|
||||
goto bad_domain_name;
|
||||
}
|
||||
if (tp!=255 && PDNSD_NOT_CACHED_TYPE(tp)) {
|
||||
DEBUG_MSG("NEG: received bad record type.\n");
|
||||
print_serr(rs,"Bad record type.");
|
||||
break;
|
||||
}
|
||||
if (ttl < 0)
|
||||
goto bad_ttl;
|
||||
{
|
||||
dns_cent_t cent;
|
||||
|
||||
if (tp==255) {
|
||||
if (!init_cent(¢, name, ttl, 0, DF_LOCAL|DF_NEGATIVE DBG1))
|
||||
goto out_of_memory;
|
||||
} else {
|
||||
if (!init_cent(¢, name, 0, 0, 0 DBG1))
|
||||
goto out_of_memory;
|
||||
if (!add_cent_rrset_by_type(¢,tp,ttl,0,CF_LOCAL|CF_NEGATIVE DBG1)) {
|
||||
free_cent(¢ DBG1);
|
||||
goto out_of_memory;
|
||||
}
|
||||
}
|
||||
add_cache(¢);
|
||||
free_cent(¢ DBG1);
|
||||
}
|
||||
print_succ(rs);
|
||||
}
|
||||
break;
|
||||
case CTL_CONFIG: {
|
||||
char *fn,*errmsg;
|
||||
DEBUG_MSG("Received CONFIG command.\n");
|
||||
if (!read_allocstring(rs,&fn,NULL)) {
|
||||
print_serr(rs,"Bad filename name.");
|
||||
break;
|
||||
}
|
||||
if (reload_config_file(fn,&errmsg))
|
||||
print_succ(rs);
|
||||
else {
|
||||
print_serr(rs,errmsg?:"Out of memory.");
|
||||
free(errmsg);
|
||||
}
|
||||
free(fn);
|
||||
}
|
||||
break;
|
||||
case CTL_INCLUDE: {
|
||||
char *fn,*errmsg;
|
||||
DEBUG_MSG("Received INCLUDE command.\n");
|
||||
if (read_allocstring(rs,&fn,NULL)<=0) {
|
||||
print_serr(rs,"Bad filename name.");
|
||||
break;
|
||||
}
|
||||
if (read_config_file(fn,NULL,NULL,0,&errmsg))
|
||||
print_succ(rs);
|
||||
else {
|
||||
print_serr(rs,errmsg?:"Out of memory.");
|
||||
free(errmsg);
|
||||
}
|
||||
free(fn);
|
||||
}
|
||||
break;
|
||||
case CTL_EVAL: {
|
||||
char *str,*errmsg;
|
||||
DEBUG_MSG("Received EVAL command.\n");
|
||||
if (!read_allocstring(rs,&str,NULL)) {
|
||||
print_serr(rs,"Bad input string.");
|
||||
break;
|
||||
}
|
||||
if (confparse(NULL,str,NULL,NULL,0,&errmsg))
|
||||
print_succ(rs);
|
||||
else {
|
||||
print_serr(rs,errmsg?:"Out of memory.");
|
||||
free(errmsg);
|
||||
}
|
||||
free(str);
|
||||
}
|
||||
break;
|
||||
case CTL_EMPTY: {
|
||||
slist_array sla=NULL;
|
||||
char *names; unsigned len;
|
||||
|
||||
DEBUG_MSG("Received EMPTY command.\n");
|
||||
if (!read_allocstring(rs,&names,&len)) {
|
||||
print_serr(rs,"Bad arguments.");
|
||||
break;
|
||||
}
|
||||
if(names) {
|
||||
char *p=names, *last=names+len;
|
||||
|
||||
while(p<last) {
|
||||
int tp;
|
||||
char *q;
|
||||
slist_t *sl;
|
||||
unsigned sz;
|
||||
unsigned char rhn[DNSNAMEBUFSIZE];
|
||||
|
||||
if(*p=='-') {
|
||||
tp=C_EXCLUDED;
|
||||
++p;
|
||||
}
|
||||
else {
|
||||
tp=C_INCLUDED;
|
||||
if(*p=='+') ++p;
|
||||
}
|
||||
/* skip a possible leading dot. */
|
||||
if(p+1<last && *p=='.' && *(p+1)) ++p;
|
||||
q=p;
|
||||
while(q<last && *q) ++q;
|
||||
if ((errmsg=parsestr2rhn(ucharp p,q-p,rhn))!=NULL) {
|
||||
DEBUG_MSG("EMPTY: received bad domain name: %s\n",p);
|
||||
print_serr(rs,errmsg);
|
||||
goto free_sla_names_break;
|
||||
}
|
||||
sz=rhnlen(rhn);
|
||||
if (!(sla=DA_GROW1_F(sla,free_slist_domain))) {
|
||||
print_serr(rs,"Out of memory.");
|
||||
goto free_names_break;
|
||||
}
|
||||
sl=&DA_LAST(sla);
|
||||
|
||||
if (!(sl->domain=malloc(sz))) {
|
||||
print_serr(rs,"Out of memory.");
|
||||
goto free_sla_names_break;
|
||||
}
|
||||
memcpy(sl->domain,rhn,sz);
|
||||
sl->exact=0;
|
||||
sl->rule=tp;
|
||||
p = q+1;
|
||||
}
|
||||
}
|
||||
if(empty_cache(sla))
|
||||
print_succ(rs);
|
||||
else
|
||||
print_serr(rs,"Could not lock the cache.");
|
||||
free_sla_names_break:
|
||||
free_slist_array(sla);
|
||||
free_names_break:
|
||||
free(names);
|
||||
}
|
||||
break;
|
||||
case CTL_DUMP: {
|
||||
int rv,exact=0;
|
||||
unsigned char *nm=NULL;
|
||||
char buf[DNSNAMEBUFSIZE];
|
||||
unsigned char rhn[DNSNAMEBUFSIZE];
|
||||
DEBUG_MSG("Received DUMP command.\n");
|
||||
if (!(rv=read_domain(rs,buf,sizeof(buf)))) {
|
||||
print_serr(rs,"Bad domain name.");
|
||||
break;
|
||||
}
|
||||
if(rv>0) {
|
||||
int sz;
|
||||
exact=1; nm= ucharp buf; sz=sizeof(buf);
|
||||
if(buf[0]=='.' && buf[1]) {
|
||||
exact=0; ++nm; --sz;
|
||||
}
|
||||
if ((errmsg=parsestr2rhn(nm,sz,rhn))!=NULL)
|
||||
goto bad_domain_name;
|
||||
nm=rhn;
|
||||
}
|
||||
if(!print_succ(rs))
|
||||
break;
|
||||
if((rv=dump_cache(rs,nm,exact))<0 ||
|
||||
(!rv && fsprintf(rs,"Could not find %s%s in the cache.\n",
|
||||
exact?"":nm?"any entries matching ":"any entries",
|
||||
nm?buf:"")<0))
|
||||
{
|
||||
DEBUG_MSG("Error writing to control socket: %s\n",strerror(errno));
|
||||
}
|
||||
}
|
||||
break;
|
||||
incomplete_command:
|
||||
print_serr(rs,"Malformed or incomplete command.");
|
||||
break;
|
||||
bad_arg:
|
||||
print_serr(rs,"Bad arg.");
|
||||
break;
|
||||
bad_domain_name:
|
||||
print_serr(rs,errmsg);
|
||||
break;
|
||||
bad_ttl:
|
||||
print_serr(rs, "Bad TTL.");
|
||||
break;
|
||||
bad_flags:
|
||||
print_serr(rs, "Bad cache flags.");
|
||||
break;
|
||||
out_of_memory:
|
||||
print_serr(rs,"Out of memory.");
|
||||
break;
|
||||
default:
|
||||
print_serr(rs,"Unknown command.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
DEBUG_MSG("Incorrect magic number in status-socket command code: %02x\n",cmd>>8);
|
||||
print_serr(rs,"Command code contains incompatible version number.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
DEBUG_MSG("short status-socket query\n");
|
||||
print_serr(rs,"Command code missing or too short.");
|
||||
}
|
||||
close(rs);
|
||||
usleep_r(100000); /* sleep some time. I do not want the query frequency to be too high. */
|
||||
}
|
||||
else if (errno!=EINTR) {
|
||||
log_warn("Failed to accept connection on status socket: %s. "
|
||||
"Status readback will be impossible",strerror(errno));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
exit_thread:
|
||||
stat_pipe=0;
|
||||
close(stat_sock);
|
||||
statsock_thrid=main_thrid;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the status socket
|
||||
*/
|
||||
void init_stat_sock()
|
||||
{
|
||||
struct sockaddr_un *sa;
|
||||
/* Should I include the terminating null byte in the calculation of the length parameter
|
||||
for the socket address? The glibc info page "Details of Local Namespace" tells me I should not,
|
||||
yet it is immediately followed by an example that contradicts that.
|
||||
The SUN_LEN macro seems to be defined as
|
||||
(offsetof(struct sockaddr_un, sun_path) + strlen(sa->sun_path)),
|
||||
so I conclude it is not necessary to count the null byte, but it probably makes no
|
||||
difference if you do.
|
||||
*/
|
||||
unsigned int sa_len = (offsetof(struct sockaddr_un, sun_path) + strlitlen("/pdnsd.status") + strlen(global.cache_dir));
|
||||
|
||||
sa=(struct sockaddr_un *)alloca(sa_len+1);
|
||||
stpcpy(stpcpy(sa->sun_path,global.cache_dir),"/pdnsd.status");
|
||||
|
||||
if (unlink(sa->sun_path)!=0 && errno!=ENOENT) { /* Delete the socket */
|
||||
log_warn("Failed to unlink %s: %s.\nStatus readback will be disabled",sa->sun_path, strerror(errno));
|
||||
stat_pipe=0;
|
||||
return;
|
||||
}
|
||||
if ((stat_sock=socket(PF_UNIX,SOCK_STREAM,0))==-1) {
|
||||
log_warn("Failed to open socket: %s. Status readback will be impossible",strerror(errno));
|
||||
stat_pipe=0;
|
||||
return;
|
||||
}
|
||||
sa->sun_family=AF_UNIX;
|
||||
#ifdef BSD44_SOCKA
|
||||
sa->sun_len=SUN_LEN(sa);
|
||||
#endif
|
||||
/* Early initialization, so that umask can be used race-free. */
|
||||
{
|
||||
mode_t old_mask = umask((S_IRWXU|S_IRWXG|S_IRWXO)&(~global.ctl_perms));
|
||||
if (bind(stat_sock,(struct sockaddr *)sa,sa_len)==-1) {
|
||||
log_warn("Error: could not bind socket: %s.\nStatus readback will be impossible",strerror(errno));
|
||||
close(stat_sock);
|
||||
stat_pipe=0;
|
||||
}
|
||||
umask(old_mask);
|
||||
}
|
||||
|
||||
if(stat_pipe) sock_path= strdup(sa->sun_path);
|
||||
}
|
||||
|
||||
/*
|
||||
* Start the status socket thread (see above)
|
||||
*/
|
||||
int start_stat_sock()
|
||||
{
|
||||
pthread_t st;
|
||||
|
||||
int rv=pthread_create(&st,&attr_detached,status_thread,NULL);
|
||||
if (rv)
|
||||
log_warn("Failed to start status thread. The status socket will be unuseable");
|
||||
else {
|
||||
statsock_thrid=st;
|
||||
log_info(2,"Status thread started.");
|
||||
}
|
||||
return rv;
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
/* status.h - Make server status information accessible through a named pipe
|
||||
|
||||
Copyright (C) 2000, 2001 Thomas Moestl
|
||||
Copyright (C) 2002, 2004, 2008, 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 _STATUS_H_
|
||||
#define _STATUS_H_
|
||||
|
||||
#include <config.h>
|
||||
#include "conff.h"
|
||||
|
||||
extern char *sock_path;
|
||||
extern int stat_sock;
|
||||
|
||||
/* The commands for pdnsd-ctl */
|
||||
#define CTL_CMDVERNR 0x6800 /* pdnsd-ctl command version (magic number used to check compatibility) */
|
||||
|
||||
#define CTL_MIN 1
|
||||
#define CTL_STATS 1 /* Give out stats (like the "traditional" status pipe) */
|
||||
#define CTL_SERVER 2 /* Enable or disable a server */
|
||||
#define CTL_RECORD 3 /* Delete or invalidate records */
|
||||
#define CTL_SOURCE 4 /* Read a hosts-style file */
|
||||
#define CTL_ADD 5 /* Add a record of the given type */
|
||||
#define CTL_NEG 6 /* Add a negative cached record */
|
||||
#define CTL_CONFIG 7 /* Re-read config file */
|
||||
#define CTL_INCLUDE 8 /* Read file as config file, disregarding global and server sections */
|
||||
#define CTL_EVAL 9 /* Parse string as if part of config file */
|
||||
#define CTL_EMPTY 10 /* Empty the cache */
|
||||
#define CTL_DUMP 11 /* Dump cache contents */
|
||||
#define CTL_MAX 11
|
||||
|
||||
#define CTL_S_UP 1
|
||||
#define CTL_S_DOWN 2
|
||||
#define CTL_S_RETEST 3
|
||||
#define CTL_R_DELETE 1
|
||||
#define CTL_R_INVAL 2
|
||||
|
||||
void init_stat_sock(void);
|
||||
int start_stat_sock(void);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,35 @@
|
|||
|
||||
.PHONY: all clean distclean
|
||||
|
||||
noinst_PROGRAMS = if_up is_local_addr tping random
|
||||
|
||||
## Dirty trick: I demand that these objects be built; then, with the knowledge
|
||||
## that the object files will end up here, I redefine the link chain.
|
||||
|
||||
TESTADDSRC=
|
||||
#TESTADDSRC= netdev.c error.c thread.c helpers.c icmp.c
|
||||
TESTDEPS = netdev.o error.o thread.o helpers.o icmp.o
|
||||
|
||||
TESTOBJS = netdev.o error.o thread.o helpers.o icmp.o
|
||||
|
||||
if_up_SOURCES = if_up.c $(TESTADDSRC)
|
||||
if_up_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
if_up_DEPENDENCIES = $(TESTDEPS)
|
||||
|
||||
is_local_addr_SOURCES = is_local_addr.c $(TESTADDSRC)
|
||||
is_local_addr_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
is_local_addr_DEPENDENCIES = $(TESTDEPS)
|
||||
|
||||
tping_SOURCES = tping.c $(TESTADDSRC)
|
||||
tping_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
tping_DEPENDENCIES = $(TESTDEPS)
|
||||
|
||||
random_SOURCES = random.c $(TESTADDSRC)
|
||||
random_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
random_DEPENDENCIES = $(TESTDEPS)
|
||||
|
||||
# These are Symlinks we want to have in the package
|
||||
#EXTRA_DIST = conff.h error.h helpers.h icmp.h ipvers.h netdev.h thread.h cacheing
|
||||
|
||||
$(TESTOBJS): %.o: ../%.c
|
||||
$(COMPILE) @thread_CFLAGS@ -c $<
|
|
@ -0,0 +1,464 @@
|
|||
# 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 = :
|
||||
noinst_PROGRAMS = if_up$(EXEEXT) is_local_addr$(EXEEXT) tping$(EXEEXT) \
|
||||
random$(EXEEXT)
|
||||
subdir = src/test
|
||||
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 =
|
||||
PROGRAMS = $(noinst_PROGRAMS)
|
||||
am__objects_1 =
|
||||
am_if_up_OBJECTS = if_up.$(OBJEXT) $(am__objects_1)
|
||||
if_up_OBJECTS = $(am_if_up_OBJECTS)
|
||||
am_is_local_addr_OBJECTS = is_local_addr.$(OBJEXT) $(am__objects_1)
|
||||
is_local_addr_OBJECTS = $(am_is_local_addr_OBJECTS)
|
||||
am_random_OBJECTS = random.$(OBJEXT) $(am__objects_1)
|
||||
random_OBJECTS = $(am_random_OBJECTS)
|
||||
am_tping_OBJECTS = tping.$(OBJEXT) $(am__objects_1)
|
||||
tping_OBJECTS = $(am_tping_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 = $(if_up_SOURCES) $(is_local_addr_SOURCES) $(random_SOURCES) \
|
||||
$(tping_SOURCES)
|
||||
DIST_SOURCES = $(if_up_SOURCES) $(is_local_addr_SOURCES) \
|
||||
$(random_SOURCES) $(tping_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@
|
||||
TESTADDSRC =
|
||||
#TESTADDSRC= netdev.c error.c thread.c helpers.c icmp.c
|
||||
TESTDEPS = netdev.o error.o thread.o helpers.o icmp.o
|
||||
TESTOBJS = netdev.o error.o thread.o helpers.o icmp.o
|
||||
if_up_SOURCES = if_up.c $(TESTADDSRC)
|
||||
if_up_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
if_up_DEPENDENCIES = $(TESTDEPS)
|
||||
is_local_addr_SOURCES = is_local_addr.c $(TESTADDSRC)
|
||||
is_local_addr_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
is_local_addr_DEPENDENCIES = $(TESTDEPS)
|
||||
tping_SOURCES = tping.c $(TESTADDSRC)
|
||||
tping_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
tping_DEPENDENCIES = $(TESTDEPS)
|
||||
random_SOURCES = random.c $(TESTADDSRC)
|
||||
random_LDADD = $(TESTOBJS) @thread_CFLAGS@
|
||||
random_DEPENDENCIES = $(TESTDEPS)
|
||||
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/test/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/test/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):
|
||||
|
||||
clean-noinstPROGRAMS:
|
||||
-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
|
||||
if_up$(EXEEXT): $(if_up_OBJECTS) $(if_up_DEPENDENCIES)
|
||||
@rm -f if_up$(EXEEXT)
|
||||
$(LINK) $(if_up_OBJECTS) $(if_up_LDADD) $(LIBS)
|
||||
is_local_addr$(EXEEXT): $(is_local_addr_OBJECTS) $(is_local_addr_DEPENDENCIES)
|
||||
@rm -f is_local_addr$(EXEEXT)
|
||||
$(LINK) $(is_local_addr_OBJECTS) $(is_local_addr_LDADD) $(LIBS)
|
||||
random$(EXEEXT): $(random_OBJECTS) $(random_DEPENDENCIES)
|
||||
@rm -f random$(EXEEXT)
|
||||
$(LINK) $(random_OBJECTS) $(random_LDADD) $(LIBS)
|
||||
tping$(EXEEXT): $(tping_OBJECTS) $(tping_DEPENDENCIES)
|
||||
@rm -f tping$(EXEEXT)
|
||||
$(LINK) $(tping_OBJECTS) $(tping_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/if_up.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/is_local_addr.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tping.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:
|
||||
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-noinstPROGRAMS 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-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:
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
||||
clean-noinstPROGRAMS 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-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
|
||||
|
||||
|
||||
.PHONY: all clean distclean
|
||||
|
||||
# These are Symlinks we want to have in the package
|
||||
#EXTRA_DIST = conff.h error.h helpers.h icmp.h ipvers.h netdev.h thread.h cacheing
|
||||
|
||||
$(TESTOBJS): %.o: ../%.c
|
||||
$(COMPILE) @thread_CFLAGS@ -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:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue