Adding upstream version 2.0.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
564691d061
commit
8a0fa2b011
28 changed files with 10291 additions and 0 deletions
247
CHANGES
Normal file
247
CHANGES
Normal file
|
@ -0,0 +1,247 @@
|
||||||
|
2021-07-16 Jerry Lundström
|
||||||
|
|
||||||
|
Release 2.0.0
|
||||||
|
|
||||||
|
This major release is a complete rewrite of drool to Lua using dnsjit!
|
||||||
|
|
||||||
|
This includes two commands:
|
||||||
|
- `drool replay`: replay DNS traffic from packet capture (PCAP) files
|
||||||
|
and send it to a specified server, with options such as to manipulate
|
||||||
|
the timing between packets, as well as loop packets infinitely or for
|
||||||
|
a set number of iterations.
|
||||||
|
- `drool respdiff`: replay DNS queries found in the PCAP, but only if
|
||||||
|
a correlating response is also found. The query, original response
|
||||||
|
and the received response is then stored into a LMDB database which
|
||||||
|
can then be used by respdiff by CZ.NIC (see https://gitlab.labs.nic.cz/knot/respdiff)
|
||||||
|
for analysis.
|
||||||
|
|
||||||
|
See `man drool`, `man drool reply` and `man drool respdiff` for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
9357c54 RPM
|
||||||
|
dc27432 configure
|
||||||
|
5a60fd3 Bye Travis
|
||||||
|
21d950c Info, Travis
|
||||||
|
eb44217 Badges
|
||||||
|
5623d60 COPR
|
||||||
|
1b5bd66 COPR, spec
|
||||||
|
2033d26 Package
|
||||||
|
61264d2 Funding
|
||||||
|
c3eb323 (tag: v1.99.4) Copyright, v1.99.4
|
||||||
|
ff9dfd5 Timing Mode
|
||||||
|
fc55d2d (tag: v1.99.3) Respdiff fix
|
||||||
|
e432c91 (tag: v1.99.2) Respdiff, v1.99.2
|
||||||
|
8e99d0e Dependencies
|
||||||
|
46712c0 Packaging
|
||||||
|
dcc5450 Configure options
|
||||||
|
de63694 (tag: v1.99.1) Rewrite, v1.99.1
|
||||||
|
e96a9f9 (tag: v1.99.0) Backends
|
||||||
|
8c99925 pcapthread
|
||||||
|
cf3f65a Split
|
||||||
|
99542e5 Rewrite into Lua using `dnsjit`
|
||||||
|
|
||||||
|
2018-02-16 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.1.0
|
||||||
|
|
||||||
|
Rework of the timing code to make it more effective, based on
|
||||||
|
proof-of-concept from Petr Špaček @pspacek (CZ.NIC).
|
||||||
|
|
||||||
|
The `best_effort` timing mode is now deprecated, this is now the same
|
||||||
|
mode as `keep` and the warnings `keep` made when unable to follow
|
||||||
|
timings have been removed.
|
||||||
|
|
||||||
|
6e81a31 Timing
|
||||||
|
d30918c WIP: timing rework
|
||||||
|
|
||||||
|
2018-01-16 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.2
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
- TCP option parsing was fixed in pcap-thread 3.0.0 but the work-around
|
||||||
|
code was still in drool
|
||||||
|
- The month in the console output was incorrect
|
||||||
|
|
||||||
|
a47ed95 Update copyright year
|
||||||
|
4d44801 TCP options was fixed in pcap-thread 3.0.0
|
||||||
|
cb5cebf Fix #93: `tm_mon` is 0-11
|
||||||
|
|
||||||
|
2017-12-19 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.1 (v1.0)
|
||||||
|
|
||||||
|
Thanks to a few people, especially Petr Špaček @pspacek (CZ.NIC), for
|
||||||
|
testing and reporting issues and other oddities (documentation is hard),
|
||||||
|
release v1.0 is now ready!
|
||||||
|
|
||||||
|
Increase of version because of how distributions compare package versions.
|
||||||
|
|
||||||
|
f9a55bc Update pcap-thread to v3.1.0
|
||||||
|
9c26a5a pcap-thread and tests
|
||||||
|
a069d84 Fix #87: Use `sockaddr_storage`, add more debug and error messages
|
||||||
|
047abe6 Fix #84: don't loop client list on timeout handling
|
||||||
|
5377698 Fix #82: Parse TCP payload, add Known Issues
|
||||||
|
05013f0 Fix #82: Send query length
|
||||||
|
aea71ad Correct `timing multiply` in README also
|
||||||
|
6437fe7 Fix man page example for timing multiply
|
||||||
|
|
||||||
|
2017-09-18 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-rc.1
|
||||||
|
|
||||||
|
Mostly documentation updates and clarifications but also a new timing
|
||||||
|
mode `best_effort` to send packets as fast as possible without warnings
|
||||||
|
and a correct usage of `nanosleep()` on systems that does not support
|
||||||
|
`clock_nanosleep()`.
|
||||||
|
|
||||||
|
114f984 Fix #74: Best effort timing mode, fix usage of `nanosleep()`
|
||||||
|
a32201c Rework development notes
|
||||||
|
3999214 Add examples and default values
|
||||||
|
1e70ab9 Design documentation
|
||||||
|
6e530ee Fix #64: More documentation around context and client_pool,
|
||||||
|
and how configuration relates to each other.
|
||||||
|
|
||||||
|
2017-08-22 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-beta.4
|
||||||
|
|
||||||
|
Compatibility fixes and packaging.
|
||||||
|
|
||||||
|
f6b6251 Fix #66: Check for libev/ev.h also
|
||||||
|
8dff723 Code formatting
|
||||||
|
a5af21d Update pcap-thread to v2.1.3
|
||||||
|
e622612 Prepare SPEC for OSB/COPR
|
||||||
|
3c8fbb0 Fix #57: Update README with build tools and environment setup
|
||||||
|
456d586 Add debian packaging files
|
||||||
|
a0a74cb Add dependencies
|
||||||
|
|
||||||
|
2017-03-29 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-beta.3
|
||||||
|
|
||||||
|
Various compatibility fixes across GNU/Linux, FreeBSD, OpenBSD and
|
||||||
|
OS X, along with a bugfix in pcap-thread.
|
||||||
|
|
||||||
|
Special thanks to Brian Carpenter (@geeknik) for fuzzing drool.
|
||||||
|
|
||||||
|
82273cc Fix #50: Compat for OS X
|
||||||
|
fc9d87c Issue #50: Update pcap-thread to v2.1.2
|
||||||
|
04817f0 const not needed on size_t
|
||||||
|
7ab1811 Update submodules: sllq v1.0.0, parseconf v1.0.0 and omg-dns
|
||||||
|
v1.0.0
|
||||||
|
242c67a Fix CID 1421861
|
||||||
|
9f3914f Add Travis and Coverity badges
|
||||||
|
ae33c90 Check for `clock_gettime()` in librt, needed for older glibc
|
||||||
|
594c877 Add Travis-CI
|
||||||
|
b7e19a2 Fix compiler warnings and check errors from `sigwait()`
|
||||||
|
3b9f2dc Fix #43, fix #44, fix #45: Update pcap-thread to fix one off
|
||||||
|
in IP layer
|
||||||
|
|
||||||
|
2017-03-25 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-beta.2
|
||||||
|
|
||||||
|
Some minor changes and documentation updates prior to making the
|
||||||
|
repository public.
|
||||||
|
|
||||||
|
79ce5cc Add description
|
||||||
|
3f63cff Update all submodules to latest develop
|
||||||
|
0bbe9dc Log format
|
||||||
|
|
||||||
|
2017-03-06 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-beta.1
|
||||||
|
|
||||||
|
Documentation and packaging for CentOS to prepare for release candidate.
|
||||||
|
|
||||||
|
New command line option:
|
||||||
|
- `-n` to run in dry-run mode
|
||||||
|
|
||||||
|
a61d1fa Fix #9: Documentation
|
||||||
|
ee93ced Impl timing multiply
|
||||||
|
7cfaf84 Tests, dry run and updated SLLQ
|
||||||
|
|
||||||
|
2017-03-02 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-alpha.3
|
||||||
|
|
||||||
|
Reworked some of the client code to better handle stream sockets (TCP),
|
||||||
|
retrys to send query if the system's sockets are exhausted. Can send
|
||||||
|
queries as the original protocol or force them into UDP or TCP.
|
||||||
|
|
||||||
|
Default number of client pools running per context is now 1, increase
|
||||||
|
this if you want to push UDP queries. For TCP this has little effect
|
||||||
|
since you will most likely hit system limits before that.
|
||||||
|
|
||||||
|
Config changes:
|
||||||
|
- Added `context client_pools num;`
|
||||||
|
- Added `client_pool max_reuse_clients num;`
|
||||||
|
- Added `client_pool sendas what;`
|
||||||
|
|
||||||
|
Other changes:
|
||||||
|
- Add timing details to warning about not keeping up with timings
|
||||||
|
|
||||||
|
f8805da TCP, send as, proper shutdown
|
||||||
|
800e971 Include CHANGES in dist
|
||||||
|
cae9834 Honor previous fd flags
|
||||||
|
|
||||||
|
2017-02-21 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-alpha.2
|
||||||
|
|
||||||
|
This release implements the core engine and most of the network code
|
||||||
|
which consists of:
|
||||||
|
- parsing DNS packet from input using omg-dns
|
||||||
|
- sending queries to a client pool using sllq
|
||||||
|
- processing queries using client objects and libev event loops
|
||||||
|
|
||||||
|
Handling results/responses have yet been implemented.
|
||||||
|
|
||||||
|
Command line option changes:
|
||||||
|
- Added `-R` to specify read mode for PCAP files
|
||||||
|
- Removed `-w` and `-o`
|
||||||
|
|
||||||
|
Config changes:
|
||||||
|
- Added `timing ignore;`
|
||||||
|
- Added `timing keep;`
|
||||||
|
- Added `timing add nanoseconds;`
|
||||||
|
- Added `timing reduce nanoseconds;`
|
||||||
|
- Added `timing multiply float;`, note: no logic added yet
|
||||||
|
- Added `client_pool target "ip" "port";`
|
||||||
|
- Added `client_pool max_clients num;`
|
||||||
|
- Added `client_pool client_ttl float;`
|
||||||
|
- Added `client_pool skip_reply;`
|
||||||
|
- Removed `read`, `input`, `write` and `output`
|
||||||
|
|
||||||
|
246c9ad Update README with example, build info and copyright etc
|
||||||
|
94ce650 Loop/iteration read, lag detect and documentation
|
||||||
|
7bda852 Send as, multi client pools per context
|
||||||
|
e233f51 Tweaks
|
||||||
|
3d0dae4 Rework network code
|
||||||
|
5d2e492 Update conf example and man-page
|
||||||
|
9d2b4a3 Split conf, skip reply
|
||||||
|
c9cc5a2 Use parseconf submodule
|
||||||
|
64241b8 Check for `clock_nanosleep()`, `nanosleep()` and use what it
|
||||||
|
available
|
||||||
|
bbdcb07 A lot of more stuff
|
||||||
|
|
||||||
|
2017-01-20 Jerry Lundström
|
||||||
|
|
||||||
|
Release 1.0.0-alpha.1
|
||||||
|
|
||||||
|
First release, has command line options, conf file handling, logging,
|
||||||
|
man-pages, can capture/read interface/pcaps and will display some
|
||||||
|
statistics at exit.
|
||||||
|
|
||||||
|
$ src/drool -h
|
||||||
|
$ src/drool -vv -r file.pcap
|
||||||
|
$ man src/drool.1
|
||||||
|
$ man src/drool.conf.5
|
||||||
|
|
||||||
|
bb5602c Fix #3
|
||||||
|
a46d040 Fix #13: Add license
|
||||||
|
5b43516 Fix #4: Basic layout for opts, conf, logging, skeleton man-pages
|
||||||
|
and tests
|
||||||
|
a9b6ab5 Fix #1: Add initial files and directories
|
||||||
|
aca355b Initial commit
|
34
LICENSE
Normal file
34
LICENSE
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
DNS Reply Tool (drool)
|
||||||
|
|
||||||
|
Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
Copyright (c) 2017, Comcast Corporation
|
||||||
|
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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
COPYRIGHT HOLDER 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.
|
47
Makefile.am
Normal file
47
Makefile.am
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in \
|
||||||
|
$(srcdir)/configure
|
||||||
|
|
||||||
|
SUBDIRS = src
|
||||||
|
|
||||||
|
dist_doc_DATA = CHANGES README.md LICENSE
|
||||||
|
|
||||||
|
EXTRA_DIST = m4 dnsjit_version.lua
|
||||||
|
|
||||||
|
test: check
|
836
Makefile.in
Normal file
836
Makefile.in
Normal file
|
@ -0,0 +1,836 @@
|
||||||
|
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2018 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@
|
||||||
|
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = { \
|
||||||
|
if test -z '$(MAKELEVEL)'; then \
|
||||||
|
false; \
|
||||||
|
elif test -n '$(MAKE_HOST)'; then \
|
||||||
|
true; \
|
||||||
|
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||||
|
true; \
|
||||||
|
else \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
}
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
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 = .
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||||
|
$(am__configure_deps) $(dist_doc_DATA) $(am__DIST_COMMON)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno config.status.lineno
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||||
|
ctags-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 \
|
||||||
|
tags-recursive uninstall-recursive
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__install_max = 40
|
||||||
|
am__nobase_strip_setup = \
|
||||||
|
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||||
|
am__nobase_strip = \
|
||||||
|
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||||
|
am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
|
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||||
|
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||||
|
if (++n[$$2] == $(am__install_max)) \
|
||||||
|
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||||
|
END { for (dir in files) print dir, files[dir] }'
|
||||||
|
am__base_list = \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
|
am__uninstall_files_from_dir = { \
|
||||||
|
test -z "$$files" \
|
||||||
|
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||||
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
|
}
|
||||||
|
am__installdirs = "$(DESTDIR)$(docdir)"
|
||||||
|
DATA = $(dist_doc_DATA)
|
||||||
|
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||||
|
distclean-recursive maintainer-clean-recursive
|
||||||
|
am__recursive_targets = \
|
||||||
|
$(RECURSIVE_TARGETS) \
|
||||||
|
$(RECURSIVE_CLEAN_TARGETS) \
|
||||||
|
$(am__extra_recursive_targets)
|
||||||
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
|
cscope distdir distdir-am dist dist-all distcheck
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
# *not* preserved.
|
||||||
|
am__uniquify_input = $(AWK) '\
|
||||||
|
BEGIN { nonempty = 0; } \
|
||||||
|
{ items[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in items) print i; }; } \
|
||||||
|
'
|
||||||
|
# Make sure the list of sources is unique. This is necessary because,
|
||||||
|
# e.g., the same source file might be shared among _SOURCES variables
|
||||||
|
# for different programs/libraries.
|
||||||
|
am__define_uniq_tagged_files = \
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | $(am__uniquify_input)`
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
CSCOPE = cscope
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in install-sh missing
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
am__remove_distdir = \
|
||||||
|
if test -d "$(distdir)"; then \
|
||||||
|
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
|
&& rm -rf "$(distdir)" \
|
||||||
|
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||||
|
else :; fi
|
||||||
|
am__post_remove_distdir = $(am__remove_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
|
||||||
|
DIST_TARGETS = dist-gzip
|
||||||
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
|
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||||
|
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||||
|
distcleancheck_listfiles = find . -type f -print
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DNSJIT = @DNSJIT@
|
||||||
|
DNSJIT_ROOT = @DNSJIT_ROOT@
|
||||||
|
DROOL_SHEBANG = @DROOL_SHEBANG@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
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@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
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@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in \
|
||||||
|
$(srcdir)/configure
|
||||||
|
|
||||||
|
SUBDIRS = src
|
||||||
|
dist_doc_DATA = CHANGES README.md LICENSE
|
||||||
|
EXTRA_DIST = m4 dnsjit_version.lua
|
||||||
|
all: all-recursive
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
am--refresh: Makefile
|
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
|
||||||
|
$(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign 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__maybe_remake_depfiles)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
|
||||||
|
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):
|
||||||
|
install-dist_docDATA: $(dist_doc_DATA)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-dist_docDATA:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
$(am__recursive_targets):
|
||||||
|
@fail=; \
|
||||||
|
if $(am__make_keepgoing); then \
|
||||||
|
failcom='fail=yes'; \
|
||||||
|
else \
|
||||||
|
failcom='exit 1'; \
|
||||||
|
fi; \
|
||||||
|
dot_seen=no; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
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"
|
||||||
|
|
||||||
|
ID: $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||||
|
tags: tags-recursive
|
||||||
|
TAGS: tags
|
||||||
|
|
||||||
|
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
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; \
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
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-recursive
|
||||||
|
|
||||||
|
CTAGS: ctags
|
||||||
|
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
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"
|
||||||
|
cscope: cscope.files
|
||||||
|
test ! -s cscope.files \
|
||||||
|
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||||
|
clean-cscope:
|
||||||
|
-rm -f cscope.files
|
||||||
|
cscope.files: clean-cscope cscopelist
|
||||||
|
cscopelist: cscopelist-recursive
|
||||||
|
|
||||||
|
cscopelist-am: $(am__tagged_files)
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
case "$(srcdir)" in \
|
||||||
|
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||||
|
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||||
|
esac; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f "$$i"; then \
|
||||||
|
echo "$(subdir)/$$i"; \
|
||||||
|
else \
|
||||||
|
echo "$$sdir/$$i"; \
|
||||||
|
fi; \
|
||||||
|
done >> $(top_builddir)/cscope.files
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||||
|
|
||||||
|
distdir: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(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 \
|
||||||
|
$(am__make_dryrun) \
|
||||||
|
|| test -d "$(distdir)/$$subdir" \
|
||||||
|
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||||
|
|| exit 1; \
|
||||||
|
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
|
||||||
|
-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) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-bzip2: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-lzip: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-xz: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-tarZ: distdir
|
||||||
|
@echo WARNING: "Support for distribution archives compressed with" \
|
||||||
|
"legacy program 'compress' is deprecated." >&2
|
||||||
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir
|
||||||
|
@echo WARNING: "Support for shar distribution archives is" \
|
||||||
|
"deprecated." >&2
|
||||||
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
|
shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-zip: distdir
|
||||||
|
-rm -f $(distdir).zip
|
||||||
|
zip -rq $(distdir).zip $(distdir)
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist dist-all:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||||
|
$(am__post_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*) \
|
||||||
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
|
*.tar.bz2*) \
|
||||||
|
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
|
*.tar.lz*) \
|
||||||
|
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||||
|
*.tar.xz*) \
|
||||||
|
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||||
|
*.tar.Z*) \
|
||||||
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
|
*.shar.gz*) \
|
||||||
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir)
|
||||||
|
chmod u+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \
|
||||||
|
&& ../../configure \
|
||||||
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||||
|
&& $(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__post_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:
|
||||||
|
@test -n '$(distuninstallcheck_dir)' || { \
|
||||||
|
echo 'ERROR: trying to run $@ with an empty' \
|
||||||
|
'$$(distuninstallcheck_dir)' >&2; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||||
|
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { 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 $(DATA)
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
installdirs-am:
|
||||||
|
for dir in "$(DESTDIR)$(docdir)"; 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:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
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."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
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-tags
|
||||||
|
|
||||||
|
dvi: dvi-recursive
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-recursive
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-recursive
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-dist_docDATA
|
||||||
|
|
||||||
|
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: uninstall-dist_docDATA
|
||||||
|
|
||||||
|
.MAKE: $(am__recursive_targets) install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||||
|
am--refresh check check-am clean clean-cscope clean-generic \
|
||||||
|
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
||||||
|
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
||||||
|
distcheck distclean distclean-generic distclean-tags \
|
||||||
|
distcleancheck distdir distuninstallcheck dvi dvi-am html \
|
||||||
|
html-am info info-am install install-am install-data \
|
||||||
|
install-data-am install-dist_docDATA 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-am uninstall uninstall-am uninstall-dist_docDATA
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
|
test: check
|
||||||
|
|
||||||
|
# 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:
|
111
README.md
Normal file
111
README.md
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
# DNS Replay Tool (drool)
|
||||||
|
|
||||||
|
`drool` can replay DNS traffic from packet capture (PCAP) files and send
|
||||||
|
it to a specified server, with options such as to manipulate the timing
|
||||||
|
between packets, as well as loop packets infinitely or for a set number
|
||||||
|
of iterations. This tool's goal is to be able to produce a high amount
|
||||||
|
of UDP packets per second and TCP sessions per second on common hardware.
|
||||||
|
|
||||||
|
The purpose can be to simulate Distributed Denial of Service (DDoS) attacks
|
||||||
|
on the DNS and measure normal DNS querying. For example, the tool could
|
||||||
|
enable you to take a snapshot of a DDoS and be able to replay it later
|
||||||
|
to test if new code or hardening techniques are useful, safe & effective.
|
||||||
|
Another example is to be able to replay a packet stream for a
|
||||||
|
bug that is sequence- and/or timing-related in order to validate the
|
||||||
|
efficacy of subsequent bug fixes.
|
||||||
|
|
||||||
|
More information may be found here:
|
||||||
|
- https://www.dns-oarc.net/tools/drool
|
||||||
|
|
||||||
|
Issues should be reported here:
|
||||||
|
- https://github.com/DNS-OARC/drool/issues
|
||||||
|
|
||||||
|
General support and discussion:
|
||||||
|
- Mattermost: https://chat.dns-oarc.net/community/channels/oarc-software
|
||||||
|
|
||||||
|
## Known Issues
|
||||||
|
|
||||||
|
- IP fragments are currently not processed and will be discarded.
|
||||||
|
- TCP sessions are not reassembled, each packet is parsed as DNS after
|
||||||
|
discarding the first two bytes.
|
||||||
|
|
||||||
|
## Usage example
|
||||||
|
|
||||||
|
Send all DNS queries twice as fast as found in the PCAP file to localhost
|
||||||
|
using UDP.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
drool replay --timing multiply=0.5 --no-tcp file.pcap 127.0.0.1 53
|
||||||
|
```
|
||||||
|
|
||||||
|
Send all DNS queries over TCP to localhost as they were recorded.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
drool replay --timing keep --no-udp file.pcap 127.0.0.1 53
|
||||||
|
```
|
||||||
|
|
||||||
|
Take all DNS queries found in the PCAP file and send them as fast as possible
|
||||||
|
over UDP to localhost by ignoring both timings, replies and starting 3 threads
|
||||||
|
that will simultaneously send queries.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
drool replay --no-tcp --no-responses --threads --udp-threads 3 file.pcap 127.0.0.1 53
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
`drool` is built upon [dnsjit](https://github.com/DNS-OARC/dnsjit) and
|
||||||
|
requires it to be installed along with autoconf/automake.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
```
|
||||||
|
sh autogen.sh
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make test
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Author(s)
|
||||||
|
|
||||||
|
Jerry Lundström <jerry@dns-oarc.net>
|
||||||
|
|
||||||
|
## Copyright
|
||||||
|
|
||||||
|
Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
|
||||||
|
Copyright (c) 2017, Comcast Corporation
|
||||||
|
|
||||||
|
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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
COPYRIGHT HOLDER 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.
|
||||||
|
```
|
740
aclocal.m4
vendored
Normal file
740
aclocal.m4
vendored
Normal file
|
@ -0,0 +1,740 @@
|
||||||
|
# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
|
||||||
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
|
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
|
||||||
|
[m4_warning([this file was generated for autoconf 2.69.
|
||||||
|
You have another version of autoconf. It may work, but is not guaranteed to.
|
||||||
|
If you have problems, you may need to regenerate the build system entirely.
|
||||||
|
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
||||||
|
|
||||||
|
# Copyright (C) 2002-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# AM_AUTOMAKE_VERSION(VERSION)
|
||||||
|
# ----------------------------
|
||||||
|
# Automake X.Y traces this macro to ensure aclocal.m4 has been
|
||||||
|
# generated from the m4 files accompanying Automake X.Y.
|
||||||
|
# (This private macro should not be called outside this file.)
|
||||||
|
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||||
|
[am__api_version='1.16'
|
||||||
|
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||||
|
dnl require some minimum version. Point them to the right macro.
|
||||||
|
m4_if([$1], [1.16.1], [],
|
||||||
|
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# _AM_AUTOCONF_VERSION(VERSION)
|
||||||
|
# -----------------------------
|
||||||
|
# aclocal traces this macro to find the Autoconf version.
|
||||||
|
# This is a private macro too. Using m4_define simplifies
|
||||||
|
# the logic in aclocal, which can simply ignore this definition.
|
||||||
|
m4_define([_AM_AUTOCONF_VERSION], [])
|
||||||
|
|
||||||
|
# AM_SET_CURRENT_AUTOMAKE_VERSION
|
||||||
|
# -------------------------------
|
||||||
|
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||||
|
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||||
|
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||||
|
[AM_AUTOMAKE_VERSION([1.16.1])dnl
|
||||||
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
|
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||||
|
|
||||||
|
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
|
||||||
|
# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
|
||||||
|
# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
|
||||||
|
#
|
||||||
|
# Of course, Automake must honor this variable whenever it calls a
|
||||||
|
# tool from the auxiliary directory. The problem is that $srcdir (and
|
||||||
|
# therefore $ac_aux_dir as well) can be either absolute or relative,
|
||||||
|
# depending on how configure is run. This is pretty annoying, since
|
||||||
|
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
|
||||||
|
# source directory, any form will work fine, but in subdirectories a
|
||||||
|
# relative path needs to be adjusted first.
|
||||||
|
#
|
||||||
|
# $ac_aux_dir/missing
|
||||||
|
# fails when called from a subdirectory if $ac_aux_dir is relative
|
||||||
|
# $top_srcdir/$ac_aux_dir/missing
|
||||||
|
# fails if $ac_aux_dir is absolute,
|
||||||
|
# fails when called from a subdirectory in a VPATH build with
|
||||||
|
# a relative $ac_aux_dir
|
||||||
|
#
|
||||||
|
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
|
||||||
|
# are both prefixed by $srcdir. In an in-source build this is usually
|
||||||
|
# harmless because $srcdir is '.', but things will broke when you
|
||||||
|
# start a VPATH build or use an absolute $srcdir.
|
||||||
|
#
|
||||||
|
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
|
||||||
|
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
|
||||||
|
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
|
||||||
|
# and then we would define $MISSING as
|
||||||
|
# MISSING="\${SHELL} $am_aux_dir/missing"
|
||||||
|
# This will work as long as MISSING is not called from configure, because
|
||||||
|
# unfortunately $(top_srcdir) has no meaning in configure.
|
||||||
|
# However there are other variables, like CC, which are often used in
|
||||||
|
# configure, and could therefore not use this "fixed" $ac_aux_dir.
|
||||||
|
#
|
||||||
|
# Another solution, used here, is to always expand $ac_aux_dir to an
|
||||||
|
# absolute PATH. The drawback is that using absolute paths prevent a
|
||||||
|
# configured tree to be moved without reconfiguration.
|
||||||
|
|
||||||
|
AC_DEFUN([AM_AUX_DIR_EXPAND],
|
||||||
|
[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
|
||||||
|
# Expand $ac_aux_dir to an absolute path.
|
||||||
|
am_aux_dir=`cd "$ac_aux_dir" && pwd`
|
||||||
|
])
|
||||||
|
|
||||||
|
# Do all the work for Automake. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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 macro actually does too much. Some checks are only needed if
|
||||||
|
# your package does certain things. But this isn't really a big deal.
|
||||||
|
|
||||||
|
dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
|
||||||
|
m4_define([AC_PROG_CC],
|
||||||
|
m4_defn([AC_PROG_CC])
|
||||||
|
[_AM_PROG_CC_C_O
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
|
||||||
|
# AM_INIT_AUTOMAKE([OPTIONS])
|
||||||
|
# -----------------------------------------------
|
||||||
|
# The call with PACKAGE and VERSION arguments is the old style
|
||||||
|
# call (pre autoconf-2.50), which is being phased out. PACKAGE
|
||||||
|
# and VERSION should now be passed to AC_INIT and removed from
|
||||||
|
# the call to AM_INIT_AUTOMAKE.
|
||||||
|
# We support both call styles for the transition. After
|
||||||
|
# the next Automake release, Autoconf can make the AC_INIT
|
||||||
|
# arguments mandatory, and then we can depend on a new Autoconf
|
||||||
|
# release and drop the old call support.
|
||||||
|
AC_DEFUN([AM_INIT_AUTOMAKE],
|
||||||
|
[AC_PREREQ([2.65])dnl
|
||||||
|
dnl Autoconf wants to disallow AM_ names. We explicitly allow
|
||||||
|
dnl the ones we care about.
|
||||||
|
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
|
||||||
|
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_INSTALL])dnl
|
||||||
|
if test "`cd $srcdir && pwd`" != "`pwd`"; then
|
||||||
|
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
|
||||||
|
# is not polluted with repeated "-I."
|
||||||
|
AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
|
||||||
|
# test to see if srcdir already configured
|
||||||
|
if test -f $srcdir/config.status; then
|
||||||
|
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# test whether we have cygpath
|
||||||
|
if test -z "$CYGPATH_W"; then
|
||||||
|
if (cygpath --version) >/dev/null 2>/dev/null; then
|
||||||
|
CYGPATH_W='cygpath -w'
|
||||||
|
else
|
||||||
|
CYGPATH_W=echo
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST([CYGPATH_W])
|
||||||
|
|
||||||
|
# Define the identity of the package.
|
||||||
|
dnl Distinguish between old-style and new-style calls.
|
||||||
|
m4_ifval([$2],
|
||||||
|
[AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: two- and three-arguments forms are deprecated.])
|
||||||
|
m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
|
||||||
|
AC_SUBST([PACKAGE], [$1])dnl
|
||||||
|
AC_SUBST([VERSION], [$2])],
|
||||||
|
[_AM_SET_OPTIONS([$1])dnl
|
||||||
|
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
|
||||||
|
m4_if(
|
||||||
|
m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
|
||||||
|
[ok:ok],,
|
||||||
|
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
|
||||||
|
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
|
||||||
|
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
|
||||||
|
|
||||||
|
_AM_IF_OPTION([no-define],,
|
||||||
|
[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
|
||||||
|
AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
|
||||||
|
|
||||||
|
# Some tools Automake needs.
|
||||||
|
AC_REQUIRE([AM_SANITY_CHECK])dnl
|
||||||
|
AC_REQUIRE([AC_ARG_PROGRAM])dnl
|
||||||
|
AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
|
||||||
|
AM_MISSING_PROG([AUTOCONF], [autoconf])
|
||||||
|
AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
|
||||||
|
AM_MISSING_PROG([AUTOHEADER], [autoheader])
|
||||||
|
AM_MISSING_PROG([MAKEINFO], [makeinfo])
|
||||||
|
AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
||||||
|
AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
||||||
|
# For better backward compatibility. To be removed once Automake 1.9.x
|
||||||
|
# dies out for good. For more background, see:
|
||||||
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
||||||
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||||
|
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
||||||
|
# We need awk for the "check" target (and possibly the TAP driver). The
|
||||||
|
# system "awk" is bad on some platforms.
|
||||||
|
AC_REQUIRE([AC_PROG_AWK])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||||
|
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
||||||
|
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
|
||||||
|
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
|
||||||
|
[_AM_PROG_TAR([v7])])])
|
||||||
|
_AM_IF_OPTION([no-dependencies],,
|
||||||
|
[AC_PROVIDE_IFELSE([AC_PROG_CC],
|
||||||
|
[_AM_DEPENDENCIES([CC])],
|
||||||
|
[m4_define([AC_PROG_CC],
|
||||||
|
m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
|
||||||
|
AC_PROVIDE_IFELSE([AC_PROG_CXX],
|
||||||
|
[_AM_DEPENDENCIES([CXX])],
|
||||||
|
[m4_define([AC_PROG_CXX],
|
||||||
|
m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
|
||||||
|
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
|
||||||
|
[_AM_DEPENDENCIES([OBJC])],
|
||||||
|
[m4_define([AC_PROG_OBJC],
|
||||||
|
m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
|
||||||
|
AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
|
||||||
|
[_AM_DEPENDENCIES([OBJCXX])],
|
||||||
|
[m4_define([AC_PROG_OBJCXX],
|
||||||
|
m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
|
||||||
|
])
|
||||||
|
AC_REQUIRE([AM_SILENT_RULES])dnl
|
||||||
|
dnl The testsuite driver may need to know about EXEEXT, so add the
|
||||||
|
dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
|
||||||
|
dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
|
||||||
|
AC_CONFIG_COMMANDS_PRE(dnl
|
||||||
|
[m4_provide_if([_AM_COMPILER_EXEEXT],
|
||||||
|
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
|
||||||
|
|
||||||
|
# POSIX will say in a future version that running "rm -f" with no argument
|
||||||
|
# is OK; and we want to be able to make that assumption in our Makefile
|
||||||
|
# recipes. So use an aggressive probe to check that the usage we want is
|
||||||
|
# actually supported "in the wild" to an acceptable degree.
|
||||||
|
# See automake bug#10828.
|
||||||
|
# To make any issue more visible, cause the running configure to be aborted
|
||||||
|
# by default if the 'rm' program in use doesn't match our expectations; the
|
||||||
|
# user can still override this though.
|
||||||
|
if rm -f && rm -fr && rm -rf; then : OK; else
|
||||||
|
cat >&2 <<'END'
|
||||||
|
Oops!
|
||||||
|
|
||||||
|
Your 'rm' program seems unable to run without file operands specified
|
||||||
|
on the command line, even when the '-f' option is present. This is contrary
|
||||||
|
to the behaviour of most rm programs out there, and not conforming with
|
||||||
|
the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
|
||||||
|
|
||||||
|
Please tell bug-automake@gnu.org about your system, including the value
|
||||||
|
of your $PATH and any error possibly output before this message. This
|
||||||
|
can help us improve future automake versions.
|
||||||
|
|
||||||
|
END
|
||||||
|
if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
|
||||||
|
echo 'Configuration will proceed anyway, since you have set the' >&2
|
||||||
|
echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
|
||||||
|
echo >&2
|
||||||
|
else
|
||||||
|
cat >&2 <<'END'
|
||||||
|
Aborting the configuration process, to ensure you take notice of the issue.
|
||||||
|
|
||||||
|
You can download and install GNU coreutils to get an 'rm' implementation
|
||||||
|
that behaves properly: <https://www.gnu.org/software/coreutils/>.
|
||||||
|
|
||||||
|
If you want to complete the configuration process using your problematic
|
||||||
|
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
||||||
|
to "yes", and re-run configure.
|
||||||
|
|
||||||
|
END
|
||||||
|
AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl The trailing newline in this macro's definition is deliberate, for
|
||||||
|
dnl backward compatibility and to allow trailing 'dnl'-style comments
|
||||||
|
dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
||||||
|
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
|
||||||
|
dnl mangled by Autoconf and run in a shell conditional statement.
|
||||||
|
m4_define([_AC_COMPILER_EXEEXT],
|
||||||
|
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
|
||||||
|
|
||||||
|
# When config.status generates a header, we must update the stamp-h file.
|
||||||
|
# This file resides in the same directory as the config header
|
||||||
|
# that is generated. The stamp files are numbered to have different names.
|
||||||
|
|
||||||
|
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
|
||||||
|
# loop where config.status creates the headers, so we can generate
|
||||||
|
# our stamp files there.
|
||||||
|
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
|
||||||
|
[# Compute $1's index in $config_headers.
|
||||||
|
_am_arg=$1
|
||||||
|
_am_stamp_count=1
|
||||||
|
for _am_header in $config_headers :; do
|
||||||
|
case $_am_header in
|
||||||
|
$_am_arg | $_am_arg:* )
|
||||||
|
break ;;
|
||||||
|
* )
|
||||||
|
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||||
|
|
||||||
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# AM_PROG_INSTALL_SH
|
||||||
|
# ------------------
|
||||||
|
# Define $install_sh.
|
||||||
|
AC_DEFUN([AM_PROG_INSTALL_SH],
|
||||||
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
|
if test x"${install_sh+set}" != xset; then
|
||||||
|
case $am_aux_dir in
|
||||||
|
*\ * | *\ *)
|
||||||
|
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
||||||
|
*)
|
||||||
|
install_sh="\${SHELL} $am_aux_dir/install-sh"
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
AC_SUBST([install_sh])])
|
||||||
|
|
||||||
|
# Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# Check whether the underlying file-system supports filenames
|
||||||
|
# with a leading dot. For instance MS-DOS doesn't.
|
||||||
|
AC_DEFUN([AM_SET_LEADING_DOT],
|
||||||
|
[rm -rf .tst 2>/dev/null
|
||||||
|
mkdir .tst 2>/dev/null
|
||||||
|
if test -d .tst; then
|
||||||
|
am__leading_dot=.
|
||||||
|
else
|
||||||
|
am__leading_dot=_
|
||||||
|
fi
|
||||||
|
rmdir .tst 2>/dev/null
|
||||||
|
AC_SUBST([am__leading_dot])])
|
||||||
|
|
||||||
|
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# AM_MISSING_PROG(NAME, PROGRAM)
|
||||||
|
# ------------------------------
|
||||||
|
AC_DEFUN([AM_MISSING_PROG],
|
||||||
|
[AC_REQUIRE([AM_MISSING_HAS_RUN])
|
||||||
|
$1=${$1-"${am_missing_run}$2"}
|
||||||
|
AC_SUBST($1)])
|
||||||
|
|
||||||
|
# AM_MISSING_HAS_RUN
|
||||||
|
# ------------------
|
||||||
|
# Define MISSING if not defined so far and test if it is modern enough.
|
||||||
|
# If it is, set am_missing_run to use it, otherwise, to nothing.
|
||||||
|
AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||||
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
|
AC_REQUIRE_AUX_FILE([missing])dnl
|
||||||
|
if test x"${MISSING+set}" != xset; then
|
||||||
|
case $am_aux_dir in
|
||||||
|
*\ * | *\ *)
|
||||||
|
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
|
||||||
|
*)
|
||||||
|
MISSING="\${SHELL} $am_aux_dir/missing" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
# Use eval to expand $SHELL
|
||||||
|
if eval "$MISSING --is-lightweight"; then
|
||||||
|
am_missing_run="$MISSING "
|
||||||
|
else
|
||||||
|
am_missing_run=
|
||||||
|
AC_MSG_WARN(['missing' script is too old or missing])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# _AM_MANGLE_OPTION(NAME)
|
||||||
|
# -----------------------
|
||||||
|
AC_DEFUN([_AM_MANGLE_OPTION],
|
||||||
|
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
|
||||||
|
|
||||||
|
# _AM_SET_OPTION(NAME)
|
||||||
|
# --------------------
|
||||||
|
# Set option NAME. Presently that only means defining a flag for this option.
|
||||||
|
AC_DEFUN([_AM_SET_OPTION],
|
||||||
|
[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
|
||||||
|
|
||||||
|
# _AM_SET_OPTIONS(OPTIONS)
|
||||||
|
# ------------------------
|
||||||
|
# OPTIONS is a space-separated list of Automake options.
|
||||||
|
AC_DEFUN([_AM_SET_OPTIONS],
|
||||||
|
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
|
||||||
|
|
||||||
|
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
|
||||||
|
# -------------------------------------------
|
||||||
|
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
||||||
|
AC_DEFUN([_AM_IF_OPTION],
|
||||||
|
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||||
|
|
||||||
|
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# AM_SANITY_CHECK
|
||||||
|
# ---------------
|
||||||
|
AC_DEFUN([AM_SANITY_CHECK],
|
||||||
|
[AC_MSG_CHECKING([whether build environment is sane])
|
||||||
|
# Reject unsafe characters in $srcdir or the absolute working directory
|
||||||
|
# name. Accept space and tab only in the latter.
|
||||||
|
am_lf='
|
||||||
|
'
|
||||||
|
case `pwd` in
|
||||||
|
*[[\\\"\#\$\&\'\`$am_lf]]*)
|
||||||
|
AC_MSG_ERROR([unsafe absolute working directory name]);;
|
||||||
|
esac
|
||||||
|
case $srcdir in
|
||||||
|
*[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
|
||||||
|
AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Do 'set' in a subshell so we don't clobber the current shell's
|
||||||
|
# arguments. Must try -L first in case configure is actually a
|
||||||
|
# symlink; some systems play weird games with the mod time of symlinks
|
||||||
|
# (eg FreeBSD returns the mod time of the symlink's containing
|
||||||
|
# directory).
|
||||||
|
if (
|
||||||
|
am_has_slept=no
|
||||||
|
for am_try in 1 2; do
|
||||||
|
echo "timestamp, slept: $am_has_slept" > conftest.file
|
||||||
|
set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
|
||||||
|
if test "$[*]" = "X"; then
|
||||||
|
# -L didn't work.
|
||||||
|
set X `ls -t "$srcdir/configure" conftest.file`
|
||||||
|
fi
|
||||||
|
if test "$[*]" != "X $srcdir/configure conftest.file" \
|
||||||
|
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
|
||||||
|
|
||||||
|
# If neither matched, then we have a broken ls. This can happen
|
||||||
|
# if, for instance, CONFIG_SHELL is bash and it inherits a
|
||||||
|
# broken ls alias from the environment. This has actually
|
||||||
|
# happened. Such a system could not be considered "sane".
|
||||||
|
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
|
||||||
|
alias in your environment])
|
||||||
|
fi
|
||||||
|
if test "$[2]" = conftest.file || test $am_try -eq 2; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
# Just in case.
|
||||||
|
sleep 1
|
||||||
|
am_has_slept=yes
|
||||||
|
done
|
||||||
|
test "$[2]" = conftest.file
|
||||||
|
)
|
||||||
|
then
|
||||||
|
# Ok.
|
||||||
|
:
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([newly created file is older than distributed files!
|
||||||
|
Check your system clock])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
# If we didn't sleep, we still need to ensure time stamps of config.status and
|
||||||
|
# generated files are strictly newer.
|
||||||
|
am_sleep_pid=
|
||||||
|
if grep 'slept: no' conftest.file >/dev/null 2>&1; then
|
||||||
|
( sleep 1 ) &
|
||||||
|
am_sleep_pid=$!
|
||||||
|
fi
|
||||||
|
AC_CONFIG_COMMANDS_PRE(
|
||||||
|
[AC_MSG_CHECKING([that generated files are newer than configure])
|
||||||
|
if test -n "$am_sleep_pid"; then
|
||||||
|
# Hide warnings about reused PIDs.
|
||||||
|
wait $am_sleep_pid 2>/dev/null
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([done])])
|
||||||
|
rm -f conftest.file
|
||||||
|
])
|
||||||
|
|
||||||
|
# Copyright (C) 2009-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# AM_SILENT_RULES([DEFAULT])
|
||||||
|
# --------------------------
|
||||||
|
# Enable less verbose build rules; with the default set to DEFAULT
|
||||||
|
# ("yes" being less verbose, "no" or empty being verbose).
|
||||||
|
AC_DEFUN([AM_SILENT_RULES],
|
||||||
|
[AC_ARG_ENABLE([silent-rules], [dnl
|
||||||
|
AS_HELP_STRING(
|
||||||
|
[--enable-silent-rules],
|
||||||
|
[less verbose build output (undo: "make V=1")])
|
||||||
|
AS_HELP_STRING(
|
||||||
|
[--disable-silent-rules],
|
||||||
|
[verbose build output (undo: "make V=0")])dnl
|
||||||
|
])
|
||||||
|
case $enable_silent_rules in @%:@ (((
|
||||||
|
yes) AM_DEFAULT_VERBOSITY=0;;
|
||||||
|
no) AM_DEFAULT_VERBOSITY=1;;
|
||||||
|
*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
|
||||||
|
esac
|
||||||
|
dnl
|
||||||
|
dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
|
||||||
|
dnl do not support nested variable expansions.
|
||||||
|
dnl See automake bug#9928 and bug#10237.
|
||||||
|
am_make=${MAKE-make}
|
||||||
|
AC_CACHE_CHECK([whether $am_make supports nested variables],
|
||||||
|
[am_cv_make_support_nested_variables],
|
||||||
|
[if AS_ECHO([['TRUE=$(BAR$(V))
|
||||||
|
BAR0=false
|
||||||
|
BAR1=true
|
||||||
|
V=1
|
||||||
|
am__doit:
|
||||||
|
@$(TRUE)
|
||||||
|
.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
|
||||||
|
am_cv_make_support_nested_variables=yes
|
||||||
|
else
|
||||||
|
am_cv_make_support_nested_variables=no
|
||||||
|
fi])
|
||||||
|
if test $am_cv_make_support_nested_variables = yes; then
|
||||||
|
dnl Using '$V' instead of '$(V)' breaks IRIX make.
|
||||||
|
AM_V='$(V)'
|
||||||
|
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
|
||||||
|
else
|
||||||
|
AM_V=$AM_DEFAULT_VERBOSITY
|
||||||
|
AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
|
||||||
|
fi
|
||||||
|
AC_SUBST([AM_V])dnl
|
||||||
|
AM_SUBST_NOTMAKE([AM_V])dnl
|
||||||
|
AC_SUBST([AM_DEFAULT_V])dnl
|
||||||
|
AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
|
||||||
|
AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
|
||||||
|
AM_BACKSLASH='\'
|
||||||
|
AC_SUBST([AM_BACKSLASH])dnl
|
||||||
|
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# AM_PROG_INSTALL_STRIP
|
||||||
|
# ---------------------
|
||||||
|
# One issue with vendor 'install' (even GNU) is that you can't
|
||||||
|
# specify the program used to strip binaries. This is especially
|
||||||
|
# annoying in cross-compiling environments, where the build's strip
|
||||||
|
# is unlikely to handle the host's binaries.
|
||||||
|
# Fortunately install-sh will honor a STRIPPROG variable, so we
|
||||||
|
# always use install-sh in "make install-strip", and initialize
|
||||||
|
# STRIPPROG with the value of the STRIP variable (set by the user).
|
||||||
|
AC_DEFUN([AM_PROG_INSTALL_STRIP],
|
||||||
|
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
|
||||||
|
# Installed binaries are usually stripped using 'strip' when the user
|
||||||
|
# run "make install-strip". However 'strip' might not be the right
|
||||||
|
# tool to use in cross-compilation environments, therefore Automake
|
||||||
|
# will honor the 'STRIP' environment variable to overrule this program.
|
||||||
|
dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
|
||||||
|
if test "$cross_compiling" != no; then
|
||||||
|
AC_CHECK_TOOL([STRIP], [strip], :)
|
||||||
|
fi
|
||||||
|
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||||
|
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||||
|
|
||||||
|
# Copyright (C) 2006-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# _AM_SUBST_NOTMAKE(VARIABLE)
|
||||||
|
# ---------------------------
|
||||||
|
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
|
||||||
|
# This macro is traced by Automake.
|
||||||
|
AC_DEFUN([_AM_SUBST_NOTMAKE])
|
||||||
|
|
||||||
|
# AM_SUBST_NOTMAKE(VARIABLE)
|
||||||
|
# --------------------------
|
||||||
|
# Public sister of _AM_SUBST_NOTMAKE.
|
||||||
|
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
||||||
|
|
||||||
|
# Check how to create a tarball. -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 2004-2018 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file 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.
|
||||||
|
|
||||||
|
# _AM_PROG_TAR(FORMAT)
|
||||||
|
# --------------------
|
||||||
|
# Check how to create a tarball in format FORMAT.
|
||||||
|
# FORMAT should be one of 'v7', 'ustar', or 'pax'.
|
||||||
|
#
|
||||||
|
# Substitute a variable $(am__tar) that is a command
|
||||||
|
# writing to stdout a FORMAT-tarball containing the directory
|
||||||
|
# $tardir.
|
||||||
|
# tardir=directory && $(am__tar) > result.tar
|
||||||
|
#
|
||||||
|
# Substitute a variable $(am__untar) that extract such
|
||||||
|
# a tarball read from stdin.
|
||||||
|
# $(am__untar) < result.tar
|
||||||
|
#
|
||||||
|
AC_DEFUN([_AM_PROG_TAR],
|
||||||
|
[# Always define AMTAR for backward compatibility. Yes, it's still used
|
||||||
|
# in the wild :-( We should find a proper way to deprecate it ...
|
||||||
|
AC_SUBST([AMTAR], ['$${TAR-tar}'])
|
||||||
|
|
||||||
|
# We'll loop over all known methods to create a tar archive until one works.
|
||||||
|
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
|
||||||
|
|
||||||
|
m4_if([$1], [v7],
|
||||||
|
[am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
|
||||||
|
|
||||||
|
[m4_case([$1],
|
||||||
|
[ustar],
|
||||||
|
[# The POSIX 1988 'ustar' format is defined with fixed-size fields.
|
||||||
|
# There is notably a 21 bits limit for the UID and the GID. In fact,
|
||||||
|
# the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
|
||||||
|
# and bug#13588).
|
||||||
|
am_max_uid=2097151 # 2^21 - 1
|
||||||
|
am_max_gid=$am_max_uid
|
||||||
|
# The $UID and $GID variables are not portable, so we need to resort
|
||||||
|
# to the POSIX-mandated id(1) utility. Errors in the 'id' calls
|
||||||
|
# below are definitely unexpected, so allow the users to see them
|
||||||
|
# (that is, avoid stderr redirection).
|
||||||
|
am_uid=`id -u || echo unknown`
|
||||||
|
am_gid=`id -g || echo unknown`
|
||||||
|
AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
|
||||||
|
if test $am_uid -le $am_max_uid; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
_am_tools=none
|
||||||
|
fi
|
||||||
|
AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
|
||||||
|
if test $am_gid -le $am_max_gid; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
_am_tools=none
|
||||||
|
fi],
|
||||||
|
|
||||||
|
[pax],
|
||||||
|
[],
|
||||||
|
|
||||||
|
[m4_fatal([Unknown tar format])])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([how to create a $1 tar archive])
|
||||||
|
|
||||||
|
# Go ahead even if we have the value already cached. We do so because we
|
||||||
|
# need to set the values for the 'am__tar' and 'am__untar' variables.
|
||||||
|
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
|
||||||
|
|
||||||
|
for _am_tool in $_am_tools; do
|
||||||
|
case $_am_tool in
|
||||||
|
gnutar)
|
||||||
|
for _am_tar in tar gnutar gtar; do
|
||||||
|
AM_RUN_LOG([$_am_tar --version]) && break
|
||||||
|
done
|
||||||
|
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
|
||||||
|
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
|
||||||
|
am__untar="$_am_tar -xf -"
|
||||||
|
;;
|
||||||
|
plaintar)
|
||||||
|
# Must skip GNU tar: if it does not support --format= it doesn't create
|
||||||
|
# ustar tarball either.
|
||||||
|
(tar --version) >/dev/null 2>&1 && continue
|
||||||
|
am__tar='tar chf - "$$tardir"'
|
||||||
|
am__tar_='tar chf - "$tardir"'
|
||||||
|
am__untar='tar xf -'
|
||||||
|
;;
|
||||||
|
pax)
|
||||||
|
am__tar='pax -L -x $1 -w "$$tardir"'
|
||||||
|
am__tar_='pax -L -x $1 -w "$tardir"'
|
||||||
|
am__untar='pax -r'
|
||||||
|
;;
|
||||||
|
cpio)
|
||||||
|
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
|
||||||
|
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
|
||||||
|
am__untar='cpio -i -H $1 -d'
|
||||||
|
;;
|
||||||
|
none)
|
||||||
|
am__tar=false
|
||||||
|
am__tar_=false
|
||||||
|
am__untar=false
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If the value was cached, stop now. We just wanted to have am__tar
|
||||||
|
# and am__untar set.
|
||||||
|
test -n "${am_cv_prog_tar_$1}" && break
|
||||||
|
|
||||||
|
# tar/untar a dummy directory, and stop if the command works.
|
||||||
|
rm -rf conftest.dir
|
||||||
|
mkdir conftest.dir
|
||||||
|
echo GrepMe > conftest.dir/file
|
||||||
|
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
|
||||||
|
rm -rf conftest.dir
|
||||||
|
if test -s conftest.tar; then
|
||||||
|
AM_RUN_LOG([$am__untar <conftest.tar])
|
||||||
|
AM_RUN_LOG([cat conftest.dir/file])
|
||||||
|
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
rm -rf conftest.dir
|
||||||
|
|
||||||
|
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
|
||||||
|
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
|
||||||
|
|
||||||
|
AC_SUBST([am__tar])
|
||||||
|
AC_SUBST([am__untar])
|
||||||
|
]) # _AM_PROG_TAR
|
||||||
|
|
86
configure.ac
Normal file
86
configure.ac
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
AC_PREREQ(2.61)
|
||||||
|
AC_INIT([drool], [2.0.0], [admin@dns-oarc.net], [drool], [https://github.com/DNS-OARC/drool/issues])
|
||||||
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||||
|
AC_CONFIG_SRCDIR([src/drool.in])
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
DNSJIT_ROOT=
|
||||||
|
AC_ARG_WITH([dnsjit], [AS_HELP_STRING([--with-dnsjit=PATH], [Use PATH when checking for dnsjit binaries])], [
|
||||||
|
AC_PATH_PROG([DNSJIT],[dnsjit],,[$withval/bin])
|
||||||
|
DNSJIT_ROOT="$withval"
|
||||||
|
], [
|
||||||
|
AC_PATH_PROG([DNSJIT],[dnsjit])
|
||||||
|
])
|
||||||
|
AC_SUBST([DNSJIT_ROOT])
|
||||||
|
AS_IF([test "x$ac_cv_path_DNSJIT" = "x"], [
|
||||||
|
AC_MSG_ERROR([dnsjit was not found])
|
||||||
|
])
|
||||||
|
AC_MSG_CHECKING([for dnsjit >= 1.0.0])
|
||||||
|
AS_IF(["$DNSJIT" "$srcdir/dnsjit_version.lua" 1 0 0 2>/dev/null], [
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
AC_MSG_ERROR([dnsjit version does not meet the requirements])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Check --enable-warn-all, placeholer for OARC projects wide options
|
||||||
|
AC_ARG_ENABLE([warn-all])
|
||||||
|
|
||||||
|
# Check --with-extra-cflags, placeholer for OARC projects wide options
|
||||||
|
AC_ARG_WITH([extra-cflags])
|
||||||
|
|
||||||
|
# Check --with-extra-ldflags, placeholer for OARC projects wide options
|
||||||
|
AC_ARG_WITH([extra-ldflags])
|
||||||
|
|
||||||
|
# Check --with-shebang
|
||||||
|
AC_ARG_WITH([shebang], [AS_HELP_STRING([--with-shebang=shebang], [Set the shebang to use (without #!, default to /usr/bin/env dnsjit)])], [
|
||||||
|
AC_MSG_NOTICE([using shebang... $withval])
|
||||||
|
AC_SUBST([DROOL_SHEBANG], ["$withval"])
|
||||||
|
], [
|
||||||
|
AC_MSG_NOTICE([using shebang... /usr/bin/env dnsjit])
|
||||||
|
AC_SUBST([DROOL_SHEBANG], ["/usr/bin/env dnsjit"])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Output Makefiles
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
Makefile
|
||||||
|
src/Makefile
|
||||||
|
src/test/Makefile
|
||||||
|
])
|
||||||
|
AC_OUTPUT
|
11
dnsjit_version.lua
Normal file
11
dnsjit_version.lua
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
local _, major, minor, patch = unpack(arg)
|
||||||
|
major = tonumber(major)
|
||||||
|
minor = tonumber(minor)
|
||||||
|
patch = tonumber(patch)
|
||||||
|
if DNSJIT_MAJOR_VERSION > major then os.exit(0) end
|
||||||
|
if DNSJIT_MAJOR_VERSION < major then os.exit(1) end
|
||||||
|
if DNSJIT_MINOR_VERSION > minor then os.exit(0) end
|
||||||
|
if DNSJIT_MINOR_VERSION < minor then os.exit(1) end
|
||||||
|
if DNSJIT_PATCH_VERSION > patch then os.exit(0) end
|
||||||
|
if DNSJIT_PATCH_VERSION < patch then os.exit(1) end
|
||||||
|
os.exit(0)
|
518
install-sh
Executable file
518
install-sh
Executable file
|
@ -0,0 +1,518 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2018-03-11.20; # UTC
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
tab=' '
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" $tab$nl"
|
||||||
|
|
||||||
|
# Set DOITPROG to "echo" to test this script.
|
||||||
|
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
doit_exec=${doit:-exec}
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
is_target_a_directory=possibly
|
||||||
|
|
||||||
|
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:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-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.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t)
|
||||||
|
is_target_a_directory=always
|
||||||
|
dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) is_target_a_directory=never;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# We allow the use of options -d and -T together, by making -d
|
||||||
|
# take the precedence; this is for compatibility with GNU install.
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
echo "$0: target directory not allowed when installing a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; 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
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||||
|
if test ! -d "$dst_arg"; then
|
||||||
|
echo "$0: $dst_arg: Is not a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
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 "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test "$is_target_a_directory" = never; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dstbase=`basename "$src"`
|
||||||
|
case $dst in
|
||||||
|
*/) dst=$dst$dstbase;;
|
||||||
|
*) dst=$dst/$dstbase;;
|
||||||
|
esac
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
dstdir=`dirname "$dst"`
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
*/) dstdirslash=$dstdir;;
|
||||||
|
*) dstdirslash=$dstdir/;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Note that $RANDOM variable is not portable (e.g. dash); Use it
|
||||||
|
# here however when possible just to lower collision chance.
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
# Because "mkdir -p" follows existing symlinks and we likely work
|
||||||
|
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
||||||
|
# directory is successfully created first before we actually test
|
||||||
|
# 'mkdir -p' feature.
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
test_tmpdir="$tmpdir/a"
|
||||||
|
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=${dstdirslash}_inst.$$_
|
||||||
|
rmtmp=${dstdirslash}_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $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 $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
set +f &&
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 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.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
0
m4/.placeholder
Normal file
0
m4/.placeholder
Normal file
215
missing
Executable file
215
missing
Executable file
|
@ -0,0 +1,215 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Common wrapper for a few potentially missing GNU programs.
|
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
|
# Originally written 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
|
||||||
|
--is-lightweight)
|
||||||
|
# Used by our autoconf macros to check whether the available missing
|
||||||
|
# script is modern enough.
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
|
||||||
|
--run)
|
||||||
|
# Back-compat with the calling convention used by older automake.
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
||||||
|
to PROGRAM being missing or too old.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal autoconf autoheader autom4te automake makeinfo
|
||||||
|
bison yacc flex lex help2man
|
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||||
|
'g' are ignored when checking the name.
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# Run the given program, remember its exit status.
|
||||||
|
"$@"; st=$?
|
||||||
|
|
||||||
|
# If it succeeded, we are done.
|
||||||
|
test $st -eq 0 && exit 0
|
||||||
|
|
||||||
|
# Also exit now if we it failed (or wasn't found), and '--version' was
|
||||||
|
# passed; such an option is passed most likely to detect whether the
|
||||||
|
# program is present and works.
|
||||||
|
case $2 in --version|--help) exit $st;; esac
|
||||||
|
|
||||||
|
# Exit code 63 means version mismatch. This often happens when the user
|
||||||
|
# tries to use an ancient version of a tool on a file that requires a
|
||||||
|
# minimum version.
|
||||||
|
if test $st -eq 63; then
|
||||||
|
msg="probably too old"
|
||||||
|
elif test $st -eq 127; then
|
||||||
|
# Program was missing.
|
||||||
|
msg="missing on your system"
|
||||||
|
else
|
||||||
|
# Program was found and executed, but failed. Give up.
|
||||||
|
exit $st
|
||||||
|
fi
|
||||||
|
|
||||||
|
perl_URL=https://www.perl.org/
|
||||||
|
flex_URL=https://github.com/westes/flex
|
||||||
|
gnu_software_URL=https://www.gnu.org/software
|
||||||
|
|
||||||
|
program_details ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
aclocal|automake)
|
||||||
|
echo "The '$1' program is part of the GNU Automake package:"
|
||||||
|
echo "<$gnu_software_URL/automake>"
|
||||||
|
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
||||||
|
echo "<$gnu_software_URL/autoconf>"
|
||||||
|
echo "<$gnu_software_URL/m4/>"
|
||||||
|
echo "<$perl_URL>"
|
||||||
|
;;
|
||||||
|
autoconf|autom4te|autoheader)
|
||||||
|
echo "The '$1' program is part of the GNU Autoconf package:"
|
||||||
|
echo "<$gnu_software_URL/autoconf/>"
|
||||||
|
echo "It also requires GNU m4 and Perl in order to run:"
|
||||||
|
echo "<$gnu_software_URL/m4/>"
|
||||||
|
echo "<$perl_URL>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
give_advice ()
|
||||||
|
{
|
||||||
|
# Normalize program name to check for.
|
||||||
|
normalized_program=`echo "$1" | sed '
|
||||||
|
s/^gnu-//; t
|
||||||
|
s/^gnu//; t
|
||||||
|
s/^g//; t'`
|
||||||
|
|
||||||
|
printf '%s\n' "'$1' is $msg."
|
||||||
|
|
||||||
|
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
||||||
|
case $normalized_program in
|
||||||
|
autoconf*)
|
||||||
|
echo "You should only need it if you modified 'configure.ac',"
|
||||||
|
echo "or m4 files included by it."
|
||||||
|
program_details 'autoconf'
|
||||||
|
;;
|
||||||
|
autoheader*)
|
||||||
|
echo "You should only need it if you modified 'acconfig.h' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'autoheader'
|
||||||
|
;;
|
||||||
|
automake*)
|
||||||
|
echo "You should only need it if you modified 'Makefile.am' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'automake'
|
||||||
|
;;
|
||||||
|
aclocal*)
|
||||||
|
echo "You should only need it if you modified 'acinclude.m4' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'aclocal'
|
||||||
|
;;
|
||||||
|
autom4te*)
|
||||||
|
echo "You might have modified some maintainer files that require"
|
||||||
|
echo "the 'autom4te' program to be rebuilt."
|
||||||
|
program_details 'autom4te'
|
||||||
|
;;
|
||||||
|
bison*|yacc*)
|
||||||
|
echo "You should only need it if you modified a '.y' file."
|
||||||
|
echo "You may want to install the GNU Bison package:"
|
||||||
|
echo "<$gnu_software_URL/bison/>"
|
||||||
|
;;
|
||||||
|
lex*|flex*)
|
||||||
|
echo "You should only need it if you modified a '.l' file."
|
||||||
|
echo "You may want to install the Fast Lexical Analyzer package:"
|
||||||
|
echo "<$flex_URL>"
|
||||||
|
;;
|
||||||
|
help2man*)
|
||||||
|
echo "You should only need it if you modified a dependency" \
|
||||||
|
"of a man page."
|
||||||
|
echo "You may want to install the GNU Help2man package:"
|
||||||
|
echo "<$gnu_software_URL/help2man/>"
|
||||||
|
;;
|
||||||
|
makeinfo*)
|
||||||
|
echo "You should only need it if you modified a '.texi' file, or"
|
||||||
|
echo "any other file indirectly affecting the aspect of the manual."
|
||||||
|
echo "You might want to install the Texinfo package:"
|
||||||
|
echo "<$gnu_software_URL/texinfo/>"
|
||||||
|
echo "The spurious makeinfo call might also be the consequence of"
|
||||||
|
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
||||||
|
echo "want to install GNU make:"
|
||||||
|
echo "<$gnu_software_URL/make/>"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "You might have modified some files without having the proper"
|
||||||
|
echo "tools for further handling them. Check the 'README' file, it"
|
||||||
|
echo "often tells you about the needed prerequisites for installing"
|
||||||
|
echo "this package. You may also peek at any GNU archive site, in"
|
||||||
|
echo "case some other package contains this missing '$1' program."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
||||||
|
-e '2,$s/^/ /' >&2
|
||||||
|
|
||||||
|
# Propagate the correct exit status (expected to be 127 for a program
|
||||||
|
# not found, 63 for a program that failed due to version mismatch).
|
||||||
|
exit $st
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
72
src/Makefile.am
Normal file
72
src/Makefile.am
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
|
||||||
|
CLEANFILES = drool \
|
||||||
|
drool.1 \
|
||||||
|
drool-replay.1 \
|
||||||
|
drool-respdiff.1
|
||||||
|
|
||||||
|
SUBDIRS = test
|
||||||
|
|
||||||
|
EXTRA_DIST = drool.in \
|
||||||
|
drool.1in \
|
||||||
|
drool-replay.1in \
|
||||||
|
drool-respdiff.1in
|
||||||
|
|
||||||
|
bin_SCRIPTS = drool
|
||||||
|
droollibdir = $(datadir)/drool/lib/drool
|
||||||
|
dist_droollib_DATA = lib/drool/replay.lua \
|
||||||
|
lib/drool/respdiff.lua
|
||||||
|
|
||||||
|
man1_MANS = drool.1 \
|
||||||
|
drool-replay.1 \
|
||||||
|
drool-respdiff.1
|
||||||
|
|
||||||
|
drool: drool.in Makefile
|
||||||
|
sed -e 's,[@]PACKAGE_NAME[@],$(PACKAGE_NAME),g' \
|
||||||
|
-e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \
|
||||||
|
-e 's,[@]PACKAGE_URL[@],$(PACKAGE_URL),g' \
|
||||||
|
-e 's,[@]PACKAGE_BUGREPORT[@],$(PACKAGE_BUGREPORT),g' \
|
||||||
|
-e 's,[@]droollibdir[@],$(datadir)/drool/lib,g' \
|
||||||
|
-e 's,[@]DROOL_SHEBANG[@],$(DROOL_SHEBANG),g' \
|
||||||
|
< "$(srcdir)/drool.in" > drool
|
||||||
|
chmod +x drool
|
||||||
|
|
||||||
|
.1in.1:
|
||||||
|
sed -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \
|
||||||
|
-e 's,[@]PACKAGE_URL[@],$(PACKAGE_URL),g' \
|
||||||
|
-e 's,[@]PACKAGE_BUGREPORT[@],$(PACKAGE_BUGREPORT),g' \
|
||||||
|
< "$<" > "$@"
|
784
src/Makefile.in
Normal file
784
src/Makefile.in
Normal file
|
@ -0,0 +1,784 @@
|
||||||
|
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2018 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@
|
||||||
|
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = { \
|
||||||
|
if test -z '$(MAKELEVEL)'; then \
|
||||||
|
false; \
|
||||||
|
elif test -n '$(MAKE_HOST)'; then \
|
||||||
|
true; \
|
||||||
|
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||||
|
true; \
|
||||||
|
else \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
}
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
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
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(dist_droollib_DATA) \
|
||||||
|
$(am__DIST_COMMON)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__install_max = 40
|
||||||
|
am__nobase_strip_setup = \
|
||||||
|
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||||
|
am__nobase_strip = \
|
||||||
|
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||||
|
am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
|
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||||
|
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||||
|
if (++n[$$2] == $(am__install_max)) \
|
||||||
|
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||||
|
END { for (dir in files) print dir, files[dir] }'
|
||||||
|
am__base_list = \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
|
am__uninstall_files_from_dir = { \
|
||||||
|
test -z "$$files" \
|
||||||
|
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||||
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
|
}
|
||||||
|
am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
|
||||||
|
"$(DESTDIR)$(droollibdir)"
|
||||||
|
SCRIPTS = $(bin_SCRIPTS)
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||||
|
ctags-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 \
|
||||||
|
tags-recursive uninstall-recursive
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
man1dir = $(mandir)/man1
|
||||||
|
NROFF = nroff
|
||||||
|
MANS = $(man1_MANS)
|
||||||
|
DATA = $(dist_droollib_DATA)
|
||||||
|
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||||
|
distclean-recursive maintainer-clean-recursive
|
||||||
|
am__recursive_targets = \
|
||||||
|
$(RECURSIVE_TARGETS) \
|
||||||
|
$(RECURSIVE_CLEAN_TARGETS) \
|
||||||
|
$(am__extra_recursive_targets)
|
||||||
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
|
distdir distdir-am
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
# *not* preserved.
|
||||||
|
am__uniquify_input = $(AWK) '\
|
||||||
|
BEGIN { nonempty = 0; } \
|
||||||
|
{ items[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in items) print i; }; } \
|
||||||
|
'
|
||||||
|
# Make sure the list of sources is unique. This is necessary because,
|
||||||
|
# e.g., the same source file might be shared among _SOURCES variables
|
||||||
|
# for different programs/libraries.
|
||||||
|
am__define_uniq_tagged_files = \
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | $(am__uniquify_input)`
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in
|
||||||
|
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@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DNSJIT = @DNSJIT@
|
||||||
|
DNSJIT_ROOT = @DNSJIT_ROOT@
|
||||||
|
DROOL_SHEBANG = @DROOL_SHEBANG@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
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@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
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@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
|
||||||
|
CLEANFILES = drool \
|
||||||
|
drool.1 \
|
||||||
|
drool-replay.1 \
|
||||||
|
drool-respdiff.1
|
||||||
|
|
||||||
|
SUBDIRS = test
|
||||||
|
EXTRA_DIST = drool.in \
|
||||||
|
drool.1in \
|
||||||
|
drool-replay.1in \
|
||||||
|
drool-respdiff.1in
|
||||||
|
|
||||||
|
bin_SCRIPTS = drool
|
||||||
|
droollibdir = $(datadir)/drool/lib/drool
|
||||||
|
dist_droollib_DATA = lib/drool/replay.lua \
|
||||||
|
lib/drool/respdiff.lua
|
||||||
|
|
||||||
|
man1_MANS = drool.1 \
|
||||||
|
drool-replay.1 \
|
||||||
|
drool-respdiff.1
|
||||||
|
|
||||||
|
all: all-recursive
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .1 .1in
|
||||||
|
$(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) --foreign src/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign src/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__maybe_remake_depfiles)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
|
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-binSCRIPTS: $(bin_SCRIPTS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||||
|
done | \
|
||||||
|
sed -e 'p;s,.*/,,;n' \
|
||||||
|
-e 'h;s|.*|.|' \
|
||||||
|
-e 'p;x;s,.*/,,;$(transform)' | 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; \
|
||||||
|
if (++n[d] == $(am__install_max)) { \
|
||||||
|
print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
|
||||||
|
else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
|
||||||
|
$(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
|
||||||
|
} \
|
||||||
|
; done
|
||||||
|
|
||||||
|
uninstall-binSCRIPTS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
|
||||||
|
files=`for p in $$list; do echo "$$p"; done | \
|
||||||
|
sed -e 's,.*/,,;$(transform)'`; \
|
||||||
|
dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
|
||||||
|
install-man1: $(man1_MANS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list1='$(man1_MANS)'; \
|
||||||
|
list2=''; \
|
||||||
|
test -n "$(man1dir)" \
|
||||||
|
&& test -n "`echo $$list1$$list2`" \
|
||||||
|
|| exit 0; \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
|
||||||
|
{ for i in $$list1; do echo "$$i"; done; \
|
||||||
|
if test -n "$$list2"; then \
|
||||||
|
for i in $$list2; do echo "$$i"; done \
|
||||||
|
| sed -n '/\.1[a-z]*$$/p'; \
|
||||||
|
fi; \
|
||||||
|
} | while read p; do \
|
||||||
|
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; echo "$$p"; \
|
||||||
|
done | \
|
||||||
|
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
|
||||||
|
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
|
||||||
|
sed 'N;N;s,\n, ,g' | { \
|
||||||
|
list=; while read file base inst; do \
|
||||||
|
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
|
||||||
|
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
|
||||||
|
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
test -z "$$files" || { \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
|
||||||
|
done; }
|
||||||
|
|
||||||
|
uninstall-man1:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
|
||||||
|
files=`{ for i in $$list; do echo "$$i"; done; \
|
||||||
|
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
|
||||||
|
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
||||||
|
dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
|
||||||
|
install-dist_droollibDATA: $(dist_droollib_DATA)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(dist_droollib_DATA)'; test -n "$(droollibdir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(droollibdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(droollibdir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(droollibdir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(droollibdir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-dist_droollibDATA:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(dist_droollib_DATA)'; test -n "$(droollibdir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(droollibdir)'; $(am__uninstall_files_from_dir)
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
$(am__recursive_targets):
|
||||||
|
@fail=; \
|
||||||
|
if $(am__make_keepgoing); then \
|
||||||
|
failcom='fail=yes'; \
|
||||||
|
else \
|
||||||
|
failcom='exit 1'; \
|
||||||
|
fi; \
|
||||||
|
dot_seen=no; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
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"
|
||||||
|
|
||||||
|
ID: $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||||
|
tags: tags-recursive
|
||||||
|
TAGS: tags
|
||||||
|
|
||||||
|
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
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; \
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
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-recursive
|
||||||
|
|
||||||
|
CTAGS: ctags
|
||||||
|
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
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"
|
||||||
|
cscopelist: cscopelist-recursive
|
||||||
|
|
||||||
|
cscopelist-am: $(am__tagged_files)
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
case "$(srcdir)" in \
|
||||||
|
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||||
|
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||||
|
esac; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f "$$i"; then \
|
||||||
|
echo "$(subdir)/$$i"; \
|
||||||
|
else \
|
||||||
|
echo "$$sdir/$$i"; \
|
||||||
|
fi; \
|
||||||
|
done >> $(top_builddir)/cscope.files
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(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 \
|
||||||
|
$(am__make_dryrun) \
|
||||||
|
|| test -d "$(distdir)/$$subdir" \
|
||||||
|
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||||
|
|| exit 1; \
|
||||||
|
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 $(SCRIPTS) $(MANS) $(DATA)
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
installdirs-am:
|
||||||
|
for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(droollibdir)"; 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:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
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."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
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-dist_droollibDATA install-man
|
||||||
|
|
||||||
|
install-dvi: install-dvi-recursive
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am: install-binSCRIPTS
|
||||||
|
|
||||||
|
install-html: install-html-recursive
|
||||||
|
|
||||||
|
install-html-am:
|
||||||
|
|
||||||
|
install-info: install-info-recursive
|
||||||
|
|
||||||
|
install-info-am:
|
||||||
|
|
||||||
|
install-man: install-man1
|
||||||
|
|
||||||
|
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: uninstall-binSCRIPTS uninstall-dist_droollibDATA \
|
||||||
|
uninstall-man
|
||||||
|
|
||||||
|
uninstall-man: uninstall-man1
|
||||||
|
|
||||||
|
.MAKE: $(am__recursive_targets) install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
|
||||||
|
check-am clean clean-generic cscopelist-am ctags ctags-am \
|
||||||
|
distclean distclean-generic distclean-tags distdir dvi dvi-am \
|
||||||
|
html html-am info info-am install install-am \
|
||||||
|
install-binSCRIPTS install-data install-data-am \
|
||||||
|
install-dist_droollibDATA install-dvi install-dvi-am \
|
||||||
|
install-exec install-exec-am install-html install-html-am \
|
||||||
|
install-info install-info-am install-man install-man1 \
|
||||||
|
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-am uninstall uninstall-am uninstall-binSCRIPTS \
|
||||||
|
uninstall-dist_droollibDATA uninstall-man uninstall-man1
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
|
drool: drool.in Makefile
|
||||||
|
sed -e 's,[@]PACKAGE_NAME[@],$(PACKAGE_NAME),g' \
|
||||||
|
-e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \
|
||||||
|
-e 's,[@]PACKAGE_URL[@],$(PACKAGE_URL),g' \
|
||||||
|
-e 's,[@]PACKAGE_BUGREPORT[@],$(PACKAGE_BUGREPORT),g' \
|
||||||
|
-e 's,[@]droollibdir[@],$(datadir)/drool/lib,g' \
|
||||||
|
-e 's,[@]DROOL_SHEBANG[@],$(DROOL_SHEBANG),g' \
|
||||||
|
< "$(srcdir)/drool.in" > drool
|
||||||
|
chmod +x drool
|
||||||
|
|
||||||
|
.1in.1:
|
||||||
|
sed -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \
|
||||||
|
-e 's,[@]PACKAGE_URL[@],$(PACKAGE_URL),g' \
|
||||||
|
-e 's,[@]PACKAGE_BUGREPORT[@],$(PACKAGE_BUGREPORT),g' \
|
||||||
|
< "$<" > "$@"
|
||||||
|
|
||||||
|
# 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:
|
160
src/drool-replay.1in
Normal file
160
src/drool-replay.1in
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
.\" DNS Reply Tool (drool)
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
.\" Copyright (c) 2017, Comcast Corporation
|
||||||
|
.\" 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
.\" COPYRIGHT HOLDER 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.
|
||||||
|
.\"
|
||||||
|
.TH drool 1 "@PACKAGE_VERSION@" "DNS Replay Tool"
|
||||||
|
.SH NAME
|
||||||
|
drool \- DNS Replay Tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B drool replay
|
||||||
|
[
|
||||||
|
.I options
|
||||||
|
]
|
||||||
|
.B file
|
||||||
|
.B host
|
||||||
|
.B port
|
||||||
|
.SH DESCRIPTION
|
||||||
|
\fBdrool\fR can replay DNS traffic from packet capture (PCAP) files and send
|
||||||
|
it to a specified server, with options such as to manipulate the timing
|
||||||
|
between packets, as well as loop packets infinitely or for a set number
|
||||||
|
of iterations.
|
||||||
|
This tool's goal is to be able to produce a high amount of UDP packets per
|
||||||
|
second and TCP sessions per second on common hardware.
|
||||||
|
|
||||||
|
The purpose can be to simulate Distributed Denial of Service (DDoS) attacks
|
||||||
|
on the DNS and measure normal DNS querying.
|
||||||
|
For example, the tool could enable you to take a snapshot of a DDoS and be
|
||||||
|
able to replay it later to test if new code or hardening techniques are
|
||||||
|
useful, safe & effective.
|
||||||
|
Another example is to be able to replay a packet stream for a bug that is
|
||||||
|
sequence- and/or timing-related in order to validate the efficacy of
|
||||||
|
subsequent bug fixes.
|
||||||
|
.SH OPTIONS
|
||||||
|
These options are specific for the
|
||||||
|
.B replay
|
||||||
|
command, see
|
||||||
|
.IR drool (1)
|
||||||
|
for generic options.
|
||||||
|
.TP
|
||||||
|
.B \-D
|
||||||
|
Show DNS queries and responses as processing goes.
|
||||||
|
.TP
|
||||||
|
.B \-n \-\-no\-responses
|
||||||
|
Do not wait for responses before sending next request.
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-tcp
|
||||||
|
Do not use TCP.
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-udp
|
||||||
|
Do not use UDP.
|
||||||
|
.TP
|
||||||
|
.B \-T \-\-threads
|
||||||
|
Use threads.
|
||||||
|
.TP
|
||||||
|
.B \-\-tcp\-threads N
|
||||||
|
Set the number of TCP threads to use, default 2.
|
||||||
|
.TP
|
||||||
|
.B \-\-udp\-threads N
|
||||||
|
Set the number of UDP threads to use, default 4.
|
||||||
|
.TP
|
||||||
|
.B \-\-timeout N.N
|
||||||
|
Set timeout for waiting on responses [seconds.nanoseconds], default 10.0.
|
||||||
|
.TP
|
||||||
|
.B \-t \-\-timing mode[=option]
|
||||||
|
Set the timing mode, see TIMING MODES.
|
||||||
|
.SH EXAMPLES
|
||||||
|
.TP
|
||||||
|
.B drool replay \-\-timing multiply=0.5 \-\-no\-tcp file.pcap 127.0.0.1 53
|
||||||
|
|
||||||
|
Send all DNS queries twice as fast as found in the PCAP file to localhost
|
||||||
|
using UDP.
|
||||||
|
.TP
|
||||||
|
.B drool replay \-\-timing keep \-\-no\-udp file.pcap 127.0.0.1 53
|
||||||
|
|
||||||
|
Send all DNS queries over TCP to localhost as they were recorded.
|
||||||
|
.TP
|
||||||
|
.B drool replay \-\-no\-tcp \-\-no\-responses \-\-threads \-\-udp\-threads 3 file.pcap 127.0.0.1 53
|
||||||
|
|
||||||
|
Take all DNS queries found in the PCAP file and send them as fast as possible
|
||||||
|
over UDP to localhost by ignoring both timings, replies and starting 3 threads
|
||||||
|
that will simultaneously send queries.
|
||||||
|
.SH TIMING MODES
|
||||||
|
.TP
|
||||||
|
.B ignore
|
||||||
|
Set the timing mode to ignore all timings and try to send traffic as fast
|
||||||
|
as possible (default).
|
||||||
|
.TP
|
||||||
|
.B keep
|
||||||
|
Set the timing mode to try and keep up with interval between the traffic
|
||||||
|
received.
|
||||||
|
.TP
|
||||||
|
.B add=<nanoseconds>
|
||||||
|
Set the timing mode to add the given nanoseconds to the interval between
|
||||||
|
the traffic received.
|
||||||
|
.TP
|
||||||
|
.B reduce=<nanoseconds>
|
||||||
|
Set the timing mode to reduce the interval between the traffic received
|
||||||
|
with the given nanoseconds.
|
||||||
|
.TP
|
||||||
|
.B multiply=<float>
|
||||||
|
Set the timing mode to multiply the interval between the traffic received,
|
||||||
|
this can be thought as percent with 1.00 being 100% of the interval, 2.00
|
||||||
|
being 200%, 0.10 being 10% and so on.
|
||||||
|
.TP
|
||||||
|
.B fixed=<nanoseconds>
|
||||||
|
Set the timing between packets to the given nanoseconds.
|
||||||
|
.SH SEE ALSO
|
||||||
|
drool(1)
|
||||||
|
.SH AUTHORS
|
||||||
|
Jerry Lundström, DNS-OARC
|
||||||
|
.LP
|
||||||
|
Maintained by DNS-OARC
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
.I https://www.dns-oarc.net/
|
||||||
|
.RE
|
||||||
|
.LP
|
||||||
|
.SH BUGS
|
||||||
|
For issues and feature requests please use:
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
\fI@PACKAGE_URL@\fP
|
||||||
|
.RE
|
||||||
|
.LP
|
||||||
|
For question and help please use:
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
\fI@PACKAGE_BUGREPORT@\fP
|
||||||
|
.RE
|
||||||
|
.LP
|
143
src/drool-respdiff.1in
Normal file
143
src/drool-respdiff.1in
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
.\" DNS Reply Tool (drool)
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
.\" Copyright (c) 2017, Comcast Corporation
|
||||||
|
.\" 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
.\" COPYRIGHT HOLDER 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.
|
||||||
|
.\"
|
||||||
|
.TH drool 1 "@PACKAGE_VERSION@" "DNS Replay Tool"
|
||||||
|
.SH NAME
|
||||||
|
drool \- DNS Replay Tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B drool respdiff
|
||||||
|
[
|
||||||
|
.I options
|
||||||
|
]
|
||||||
|
.B path
|
||||||
|
.B name
|
||||||
|
.B file
|
||||||
|
.B name
|
||||||
|
.B host
|
||||||
|
.B port
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This tool is to be used in conjunction with the tool-chain
|
||||||
|
.I respdiff
|
||||||
|
by CZ.NIC (see
|
||||||
|
.IR https://gitlab.labs.nic.cz/knot/respdiff ).
|
||||||
|
.LP
|
||||||
|
It will replay DNS queries found in the PCAP, but only if a correlating
|
||||||
|
response is also found, against the target
|
||||||
|
.I host
|
||||||
|
and
|
||||||
|
.IR port .
|
||||||
|
The query, original response and the received response is then stored into
|
||||||
|
a LMDB database located at
|
||||||
|
.IR path .
|
||||||
|
The
|
||||||
|
.I name
|
||||||
|
before the PCAP
|
||||||
|
.I file
|
||||||
|
and the
|
||||||
|
.I name
|
||||||
|
before the target
|
||||||
|
.I host
|
||||||
|
are stored in the meta table which should correspond with the configuration
|
||||||
|
use for
|
||||||
|
.I respdiff
|
||||||
|
in order for it to be able to read the results correctly.
|
||||||
|
.SH OPTIONS
|
||||||
|
These options are specific for the
|
||||||
|
.B respdiff
|
||||||
|
command, see
|
||||||
|
.IR drool (1)
|
||||||
|
for generic options.
|
||||||
|
.TP
|
||||||
|
.B \-D
|
||||||
|
Show DNS queries and responses as processing goes.
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-tcp
|
||||||
|
Do not use TCP.
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-udp
|
||||||
|
Do not use UDP.
|
||||||
|
.TP
|
||||||
|
.B \-T \-\-threads
|
||||||
|
Use threads.
|
||||||
|
.TP
|
||||||
|
.B \-\-tcp\-threads N
|
||||||
|
Set the number of TCP threads to use, default 2.
|
||||||
|
.TP
|
||||||
|
.B \-\-udp\-threads N
|
||||||
|
Set the number of UDP threads to use, default 4.
|
||||||
|
.TP
|
||||||
|
.B \-\-timeout N.N
|
||||||
|
Set timeout for waiting on responses [seconds.nanoseconds], default 10.0.
|
||||||
|
.TP
|
||||||
|
.B \-\-size BYTES
|
||||||
|
Set the size (in bytes, multiple of OS page size) of the LMDB database, default 10485760.
|
||||||
|
.SH DATABASE SIZE
|
||||||
|
Note that you will need to set a database size that is large enough for all
|
||||||
|
queries, all original responses, all received responses and all analysis done
|
||||||
|
by
|
||||||
|
.I respdiff
|
||||||
|
tool-chain in order for a successful analysis to be done.
|
||||||
|
.SH EXAMPLE
|
||||||
|
This example replays a PCAP file against localhost and then uses the
|
||||||
|
.I respdiff
|
||||||
|
tool-chain to analyze the results.
|
||||||
|
.LP
|
||||||
|
$ drool respdiff /lmdb/path pcap file.pcap target 127.0.0.1 53
|
||||||
|
$ msgdiff.py /lmdb/path
|
||||||
|
$ diffsum.py /lmdb/path
|
||||||
|
.SH SEE ALSO
|
||||||
|
drool(1)
|
||||||
|
.SH AUTHORS
|
||||||
|
Jerry Lundström, DNS-OARC
|
||||||
|
.LP
|
||||||
|
Maintained by DNS-OARC
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
.I https://www.dns-oarc.net/
|
||||||
|
.RE
|
||||||
|
.LP
|
||||||
|
.SH BUGS
|
||||||
|
For issues and feature requests please use:
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
\fI@PACKAGE_URL@\fP
|
||||||
|
.RE
|
||||||
|
.LP
|
||||||
|
For question and help please use:
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
\fI@PACKAGE_BUGREPORT@\fP
|
||||||
|
.RE
|
||||||
|
.LP
|
125
src/drool.1in
Normal file
125
src/drool.1in
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
.\" DNS Reply Tool (drool)
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
.\" Copyright (c) 2017, Comcast Corporation
|
||||||
|
.\" 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
.\" COPYRIGHT HOLDER 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.
|
||||||
|
.\"
|
||||||
|
.TH drool 1 "@PACKAGE_VERSION@" "DNS Replay Tool"
|
||||||
|
.SH NAME
|
||||||
|
drool \- DNS Replay Tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B drool command
|
||||||
|
[
|
||||||
|
.I options
|
||||||
|
] <
|
||||||
|
.I arguments
|
||||||
|
>
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B drool
|
||||||
|
can replay DNS traffic from packet capture (PCAP) files and send
|
||||||
|
it to a specified server, with options such as to manipulate the timing
|
||||||
|
between packets, as well as loop packets infinitely or for a set number
|
||||||
|
of iterations.
|
||||||
|
This tool's goal is to be able to produce a high amount of UDP packets per
|
||||||
|
second and TCP sessions per second on common hardware.
|
||||||
|
|
||||||
|
The purpose can be to simulate Distributed Denial of Service (DDoS) attacks
|
||||||
|
on the DNS and measure normal DNS querying.
|
||||||
|
For example, the tool could enable you to take a snapshot of a DDoS and be
|
||||||
|
able to replay it later to test if new code or hardening techniques are
|
||||||
|
useful, safe & effective.
|
||||||
|
Another example is to be able to replay a packet stream for a bug that is
|
||||||
|
sequence- and/or timing-related in order to validate the efficacy of
|
||||||
|
subsequent bug fixes.
|
||||||
|
.SH COMMANDS
|
||||||
|
.B drool
|
||||||
|
is divided into various commands for different scenarios.
|
||||||
|
Each command has it's own man-page, may take different arguments and may
|
||||||
|
have additional options.
|
||||||
|
.TP
|
||||||
|
.B replay
|
||||||
|
Replay DNS from a PCAP file, see
|
||||||
|
.IR drool-replay (1).
|
||||||
|
.TP
|
||||||
|
.B respdiff
|
||||||
|
Replay DNS and store the responses along with the responses found in the PCAP
|
||||||
|
for analysis with the
|
||||||
|
.I respdiff
|
||||||
|
tool-chain, see
|
||||||
|
.IR drool-respdiff (1).
|
||||||
|
.SH OPTIONS
|
||||||
|
These options are generic for all
|
||||||
|
.B drool
|
||||||
|
commands.
|
||||||
|
.TP
|
||||||
|
.B \-\-csv
|
||||||
|
Output statistics as CSV.
|
||||||
|
.TP
|
||||||
|
.B \-\-json
|
||||||
|
Output statistics as JSON.
|
||||||
|
.TP
|
||||||
|
.B \-v \-\-verbose
|
||||||
|
Enable verbose logging, can be given multiple times to increase verbosity level.
|
||||||
|
.TP
|
||||||
|
.B \-h \-\-help
|
||||||
|
Print help and exit.
|
||||||
|
.TP
|
||||||
|
.B \-V \-\-version
|
||||||
|
Print version and exit.
|
||||||
|
.SH EXIT VALUES
|
||||||
|
0 \- no error
|
||||||
|
.br
|
||||||
|
1 \- generic error
|
||||||
|
.SH SEE ALSO
|
||||||
|
drool-replay(1)
|
||||||
|
.SH AUTHORS
|
||||||
|
Jerry Lundström, DNS-OARC
|
||||||
|
.LP
|
||||||
|
Maintained by DNS-OARC
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
.I https://www.dns-oarc.net/
|
||||||
|
.RE
|
||||||
|
.LP
|
||||||
|
.SH BUGS
|
||||||
|
For issues and feature requests please use:
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
.I @PACKAGE_URL@
|
||||||
|
.RE
|
||||||
|
.LP
|
||||||
|
For question and help please use:
|
||||||
|
.LP
|
||||||
|
.RS
|
||||||
|
.I @PACKAGE_BUGREPORT@
|
||||||
|
.RE
|
||||||
|
.LP
|
149
src/drool.in
Normal file
149
src/drool.in
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
#!@DROOL_SHEBANG@
|
||||||
|
-- DNS Reply Tool (drool)
|
||||||
|
--
|
||||||
|
-- Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
-- Copyright (c) 2017, Comcast Corporation
|
||||||
|
-- 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
-- COPYRIGHT HOLDER 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.
|
||||||
|
package.path = package.path .. ";@droollibdir@/?.lua"
|
||||||
|
|
||||||
|
local clock = require("dnsjit.lib.clock")
|
||||||
|
local log = require("dnsjit.core.log").new("drool")
|
||||||
|
local getopt = require("dnsjit.lib.getopt").new({
|
||||||
|
{ "V", "version", false, "Print version and exit", "?" },
|
||||||
|
{ "v", "verbose", 0, "Enable and increase verbosity for each time given", "?+" },
|
||||||
|
{ nil, "json", false, "Output statistics as JSON", "?" },
|
||||||
|
{ nil, "csv", false, "Output statistics as CSV", "?" },
|
||||||
|
})
|
||||||
|
getopt.usage_desc = arg[1] .. " command [options...] <arguments...>"
|
||||||
|
|
||||||
|
local cmds = {
|
||||||
|
replay = "drool.replay",
|
||||||
|
respdiff = "drool.respdiff",
|
||||||
|
}
|
||||||
|
|
||||||
|
if not arg[2] or not cmds[arg[2]] then
|
||||||
|
getopt:parse()
|
||||||
|
|
||||||
|
if getopt:val("help") then
|
||||||
|
getopt:usage()
|
||||||
|
os.exit(0)
|
||||||
|
end
|
||||||
|
if getopt:val("version") then
|
||||||
|
print("drool version @PACKAGE_VERSION@")
|
||||||
|
os.exit(0)
|
||||||
|
end
|
||||||
|
if arg[2] then
|
||||||
|
log:critical("Command "..arg[2].." not found")
|
||||||
|
end
|
||||||
|
|
||||||
|
getopt:usage()
|
||||||
|
os.exit(-1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local cmd = require(cmds[arg[2]]).new(getopt)
|
||||||
|
getopt:parse()
|
||||||
|
|
||||||
|
if getopt:val("help") then
|
||||||
|
getopt:usage()
|
||||||
|
os.exit(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
local v = getopt:val("v")
|
||||||
|
if v > 0 then
|
||||||
|
require("dnsjit.core.log").enable("warning")
|
||||||
|
end
|
||||||
|
if v > 1 then
|
||||||
|
require("dnsjit.core.log").enable("notice")
|
||||||
|
end
|
||||||
|
if v > 2 then
|
||||||
|
require("dnsjit.core.log").enable("info")
|
||||||
|
end
|
||||||
|
if v > 3 then
|
||||||
|
require("dnsjit.core.log").enable("debug")
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd:getopt(getopt)
|
||||||
|
cmd:setup()
|
||||||
|
local start_sec, start_nsec = clock:monotonic()
|
||||||
|
cmd:run()
|
||||||
|
local end_sec, end_nsec = clock:monotonic()
|
||||||
|
cmd:finish()
|
||||||
|
local fin_sec, fin_nsec = clock:monotonic()
|
||||||
|
|
||||||
|
local runtime = 0
|
||||||
|
if end_sec > start_sec then
|
||||||
|
runtime = ((end_sec - start_sec) - 1) + ((1000000000 - start_nsec + end_nsec)/1000000000)
|
||||||
|
elseif end_sec == start_sec and end_nsec > start_nsec then
|
||||||
|
runtime = (end_nsec - start_nsec) / 1000000000
|
||||||
|
end
|
||||||
|
|
||||||
|
local finish = 0
|
||||||
|
if fin_sec > end_sec then
|
||||||
|
finish = ((fin_sec - end_sec) - 1) + ((1000000000 - end_nsec + fin_nsec)/1000000000)
|
||||||
|
elseif fin_sec == end_sec and fin_nsec > end_nsec then
|
||||||
|
finish = (fin_nsec - end_nsec) / 1000000000
|
||||||
|
end
|
||||||
|
|
||||||
|
if getopt:val("json") then
|
||||||
|
print("{")
|
||||||
|
print(" \"runtime\": " .. runtime .. ",")
|
||||||
|
print(" \"finish\": " .. finish .. ",")
|
||||||
|
print(" \"packets\": " .. cmd.packets .. ",")
|
||||||
|
print(" \"queries\": " .. cmd.queries .. ",")
|
||||||
|
print(" \"sent\": " .. cmd.sent .. ",")
|
||||||
|
print(" \"received\": " .. cmd.received .. ",")
|
||||||
|
print(" \"responses\": " .. cmd.responses .. ",")
|
||||||
|
print(" \"timeouts\": " .. cmd.timeouts .. ",")
|
||||||
|
print(" \"errors\": " .. cmd.errors)
|
||||||
|
print("}")
|
||||||
|
elseif getopt:val("csv") then
|
||||||
|
print("runtime,finish,packets,queries,sent,received,responses,timeouts,errors")
|
||||||
|
print(runtime ..","..
|
||||||
|
finish ..","..
|
||||||
|
cmd.packets ..","..
|
||||||
|
cmd.queries ..","..
|
||||||
|
cmd.sent ..","..
|
||||||
|
cmd.received ..","..
|
||||||
|
cmd.responses ..","..
|
||||||
|
cmd.timeouts ..","..
|
||||||
|
cmd.errors)
|
||||||
|
else
|
||||||
|
print("runtime", runtime+finish, "run", runtime, "finish", finish)
|
||||||
|
print("", "total", "/sec")
|
||||||
|
print("packets", cmd.packets, cmd.packets/runtime)
|
||||||
|
print("queries", cmd.queries, cmd.queries/runtime)
|
||||||
|
print("sent", cmd.sent, cmd.sent/runtime)
|
||||||
|
print("received", cmd.received, cmd.received/runtime)
|
||||||
|
print("responses", cmd.responses, cmd.responses/runtime)
|
||||||
|
print("timeouts", cmd.timeouts)
|
||||||
|
print("errors", cmd.errors)
|
||||||
|
end
|
596
src/lib/drool/replay.lua
Normal file
596
src/lib/drool/replay.lua
Normal file
|
@ -0,0 +1,596 @@
|
||||||
|
-- DNS Reply Tool (drool)
|
||||||
|
--
|
||||||
|
-- Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
-- Copyright (c) 2017, Comcast Corporation
|
||||||
|
-- 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
-- COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
module(...,package.seeall)
|
||||||
|
|
||||||
|
local ffi = require("ffi")
|
||||||
|
local C = ffi.C
|
||||||
|
ffi.cdef[[
|
||||||
|
struct replay_stats {
|
||||||
|
int64_t sent, received, responses, timeouts, errors;
|
||||||
|
};
|
||||||
|
void* malloc(size_t);
|
||||||
|
void free(void*);
|
||||||
|
]]
|
||||||
|
|
||||||
|
local object = require("dnsjit.core.objects")
|
||||||
|
require("dnsjit.core.timespec_h")
|
||||||
|
|
||||||
|
Replay = {}
|
||||||
|
|
||||||
|
function Replay.new(getopt)
|
||||||
|
local self = setmetatable({
|
||||||
|
file = nil,
|
||||||
|
host = nil,
|
||||||
|
port = nil,
|
||||||
|
no_responses = false,
|
||||||
|
use_threads = false,
|
||||||
|
print_dns = false,
|
||||||
|
timeout = 10.0,
|
||||||
|
timing = nil,
|
||||||
|
timing_mode = "ignore",
|
||||||
|
timing_opt = nil,
|
||||||
|
layer = nil,
|
||||||
|
input = nil,
|
||||||
|
no_udp = false,
|
||||||
|
no_tcp = false,
|
||||||
|
udp_threads = 4,
|
||||||
|
tcp_threads = 2,
|
||||||
|
|
||||||
|
packets = 0,
|
||||||
|
queries = 0,
|
||||||
|
sent = 0,
|
||||||
|
received = 0,
|
||||||
|
responses = 0,
|
||||||
|
errors = 0,
|
||||||
|
timeouts = 0,
|
||||||
|
|
||||||
|
log = require("dnsjit.core.log").new("replay"),
|
||||||
|
|
||||||
|
_timespec = ffi.new("core_timespec_t"),
|
||||||
|
_udp_channels = {},
|
||||||
|
_tcp_channels = {},
|
||||||
|
_threads = {},
|
||||||
|
_udpcli = nil,
|
||||||
|
_tcpcli = nil,
|
||||||
|
_stat_channels = {},
|
||||||
|
}, { __index = Replay })
|
||||||
|
|
||||||
|
if getopt then
|
||||||
|
getopt.usage_desc = arg[1] .. " replay [options...] file host port"
|
||||||
|
getopt:add("t", "timing", "ignore", "Set the timing mode [mode=option], default ignore", "?")
|
||||||
|
getopt:add("n", "no-responses", false, "Do not wait for responses before sending next request", "?")
|
||||||
|
getopt:add(nil, "no-udp", false, "Do not use UDP", "?")
|
||||||
|
getopt:add(nil, "no-tcp", false, "Do not use TCP", "?")
|
||||||
|
getopt:add("T", "threads", false, "Use threads", "?")
|
||||||
|
getopt:add(nil, "udp-threads", 4, "Set the number of UDP threads to use, default 4", "?")
|
||||||
|
getopt:add(nil, "tcp-threads", 2, "Set the number of TCP threads to use, default 2", "?")
|
||||||
|
getopt:add(nil, "timeout", "10.0", "Set timeout for waiting on responses [seconds.nanoseconds], default 10.0", "?")
|
||||||
|
getopt:add("D", nil, false, "Show DNS queries and responses as processing goes", "?")
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Replay:getopt(getopt)
|
||||||
|
local _, file, host, port = unpack(getopt.left)
|
||||||
|
|
||||||
|
if getopt:val("no-udp") and getopt:val("no-tcp") then
|
||||||
|
self.log:fatal("can not disable all transports")
|
||||||
|
end
|
||||||
|
if getopt:val("udp-threads") < 1 then
|
||||||
|
self.log:fatal("--udp-threads must be 1 or greater")
|
||||||
|
end
|
||||||
|
if getopt:val("tcp-threads") < 1 then
|
||||||
|
self.log:fatal("--tcp-threads must be 1 or greater")
|
||||||
|
end
|
||||||
|
|
||||||
|
if file == nil then
|
||||||
|
self.log:fatal("no file given")
|
||||||
|
end
|
||||||
|
self.file = file
|
||||||
|
if host == nil then
|
||||||
|
self.log:fatal("no target host given")
|
||||||
|
end
|
||||||
|
self.host = host
|
||||||
|
if port == nil then
|
||||||
|
self.log:fatal("no target port given")
|
||||||
|
end
|
||||||
|
self.port = port
|
||||||
|
self.use_threads = getopt:val("T")
|
||||||
|
self.timeout = tonumber(getopt:val("timeout"))
|
||||||
|
self.no_responses = getopt:val("n")
|
||||||
|
self.print_dns = getopt:val("D")
|
||||||
|
self.no_udp = getopt:val("no-udp")
|
||||||
|
self.udp_threads = getopt:val("udp-threads")
|
||||||
|
self.no_tcp = getopt:val("no-tcp")
|
||||||
|
self.tcp_threads = getopt:val("tcp-threads")
|
||||||
|
|
||||||
|
if getopt:val("t") ~= "ignore" then
|
||||||
|
self.timing_mode, self.timing_opt = getopt:val("t"):match("(%w+)=([%w%.]+)")
|
||||||
|
if self.timing_mode == nil then
|
||||||
|
self.timing_mode = getopt:val("t")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local _thr_func = function(thr)
|
||||||
|
local mode, thrid, host, port, chan, stats, resp, print_dns, to_sec, to_nsec = thr:pop(10)
|
||||||
|
local log = require("dnsjit.core.log").new(mode .. "#" .. thrid)
|
||||||
|
require("dnsjit.core.objects")
|
||||||
|
local ffi = require("ffi")
|
||||||
|
local C = ffi.C
|
||||||
|
ffi.cdef[[
|
||||||
|
struct replay_stats {
|
||||||
|
int64_t sent, received, responses, timeouts, errors;
|
||||||
|
};
|
||||||
|
void* malloc(size_t);
|
||||||
|
void free(void*);
|
||||||
|
]]
|
||||||
|
local dns = require("dnsjit.core.object.dns").new()
|
||||||
|
|
||||||
|
if print_dns == 1 then
|
||||||
|
print_dns = function(payload)
|
||||||
|
dns.obj_prev = payload
|
||||||
|
dns:print()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print_dns = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local cli, recv, ctx, prod
|
||||||
|
if mode == "udp" then
|
||||||
|
cli = require("dnsjit.output.udpcli").new()
|
||||||
|
else
|
||||||
|
cli = require("dnsjit.output.tcpcli").new()
|
||||||
|
end
|
||||||
|
cli:timeout(to_sec, to_nsec)
|
||||||
|
if cli:connect(host, port) ~= 0 then
|
||||||
|
log:fatal("unable to connect to host " .. host .. " port " .. port)
|
||||||
|
end
|
||||||
|
recv, ctx = cli:receive()
|
||||||
|
prod = cli:produce()
|
||||||
|
|
||||||
|
local stat = ffi.cast("struct replay_stats*", C.malloc(ffi.sizeof("struct replay_stats")))
|
||||||
|
ffi.fill(stat, ffi.sizeof("struct replay_stats"))
|
||||||
|
ffi.gc(stat, C.free)
|
||||||
|
|
||||||
|
local send
|
||||||
|
if resp == 0 then
|
||||||
|
send = function(obj)
|
||||||
|
log:info("sending query")
|
||||||
|
recv(ctx, obj)
|
||||||
|
if print_dns then
|
||||||
|
print_dns(obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send = function(obj)
|
||||||
|
log:info("sending query")
|
||||||
|
recv(ctx, obj)
|
||||||
|
if print_dns then
|
||||||
|
print_dns(obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
local response = prod(ctx)
|
||||||
|
if response == nil then
|
||||||
|
log:warning("producer error")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local payload = response:cast()
|
||||||
|
if payload.len == 0 then
|
||||||
|
stat.timeouts = stat.timeouts + 1
|
||||||
|
log:info("timeout")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
stat.responses = stat.responses + 1
|
||||||
|
log:info("got response")
|
||||||
|
if print_dns then
|
||||||
|
print_dns(response)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local obj = chan:get()
|
||||||
|
if obj == nil then break end
|
||||||
|
obj = ffi.cast("core_object_t*", obj)
|
||||||
|
dns.obj_prev = obj
|
||||||
|
if dns:parse_header() == 0 and dns.qr == 0 then
|
||||||
|
send(obj)
|
||||||
|
stat.sent = stat.sent + 1
|
||||||
|
end
|
||||||
|
obj:free()
|
||||||
|
end
|
||||||
|
|
||||||
|
stat.errors = cli:errors()
|
||||||
|
ffi.gc(stat, nil)
|
||||||
|
stats:put(stat)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Replay:setup()
|
||||||
|
self.input = require("dnsjit.input.mmpcap").new()
|
||||||
|
if self.input:open(self.file) ~= 0 then
|
||||||
|
self.log:fatal("unable to open file " .. self.file)
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.timing_mode ~= "ignore" then
|
||||||
|
self.timing = require("dnsjit.filter.timing").new()
|
||||||
|
self.timing:producer(self.input)
|
||||||
|
|
||||||
|
if self.timing_mode == "keep" then
|
||||||
|
else
|
||||||
|
if self.timing_mode == "inc" or self.timing_mode == "increase" then
|
||||||
|
self.timing:increase(tonumber(self.timing_opt))
|
||||||
|
elseif self.timing_mode == "red" or self.timing_mode == "reduce" then
|
||||||
|
self.timing:reduce(tonumber(self.timing_opt))
|
||||||
|
elseif self.timing_mode == "mul" or self.timing_mode == "multiply" then
|
||||||
|
self.timing:multiply(tonumber(self.timing_opt))
|
||||||
|
elseif self.timing_mode == "fix" or self.timing_mode == "fixed" then
|
||||||
|
self.timing:fixed(tonumber(self.timing_opt))
|
||||||
|
else
|
||||||
|
self.log:fatal("Invalid timing mode " .. self.timing_mode)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.layer = require("dnsjit.filter.layer").new()
|
||||||
|
if self.timing then
|
||||||
|
self.layer:producer(self.timing)
|
||||||
|
else
|
||||||
|
self.layer:producer(self.input)
|
||||||
|
end
|
||||||
|
|
||||||
|
self._timespec.sec = math.floor(self.timeout)
|
||||||
|
self._timespec.nsec = (self.timeout - math.floor(self.timeout)) * 1000000000
|
||||||
|
|
||||||
|
if self.use_threads then
|
||||||
|
if not self.no_udp then
|
||||||
|
self.log:info("starting " .. self.udp_threads .. " UDP threads")
|
||||||
|
for n = 1, self.udp_threads do
|
||||||
|
local chan = require("dnsjit.core.channel").new()
|
||||||
|
local stats = require("dnsjit.core.channel").new()
|
||||||
|
local thr = require("dnsjit.core.thread").new()
|
||||||
|
|
||||||
|
thr:start(_thr_func)
|
||||||
|
thr:push("udp", n, self.host, self.port, chan, stats)
|
||||||
|
if self.no_responses then
|
||||||
|
thr:push(0)
|
||||||
|
else
|
||||||
|
thr:push(1)
|
||||||
|
end
|
||||||
|
if self.print_dns then
|
||||||
|
thr:push(1)
|
||||||
|
else
|
||||||
|
thr:push(0)
|
||||||
|
end
|
||||||
|
thr:push(tonumber(self._timespec.sec), tonumber(self._timespec.nsec))
|
||||||
|
|
||||||
|
table.insert(self._udp_channels, chan)
|
||||||
|
table.insert(self._stat_channels, stats)
|
||||||
|
table.insert(self._threads, thr)
|
||||||
|
self.log:info("UDP thread " .. n .. " started")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not self.no_tcp then
|
||||||
|
self.log:info("starting " .. self.tcp_threads .. " TCP threads")
|
||||||
|
for n = 1, self.tcp_threads do
|
||||||
|
local chan = require("dnsjit.core.channel").new()
|
||||||
|
local stats = require("dnsjit.core.channel").new()
|
||||||
|
local thr = require("dnsjit.core.thread").new()
|
||||||
|
|
||||||
|
thr:start(_thr_func)
|
||||||
|
thr:push("tcp", n, self.host, self.port, chan, stats)
|
||||||
|
if self.no_responses then
|
||||||
|
thr:push(0)
|
||||||
|
else
|
||||||
|
thr:push(1)
|
||||||
|
end
|
||||||
|
if self.print_dns then
|
||||||
|
thr:push(1)
|
||||||
|
else
|
||||||
|
thr:push(0)
|
||||||
|
end
|
||||||
|
thr:push(tonumber(self._timespec.sec), tonumber(self._timespec.nsec))
|
||||||
|
|
||||||
|
table.insert(self._tcp_channels, chan)
|
||||||
|
table.insert(self._stat_channels, stats)
|
||||||
|
table.insert(self._threads, thr)
|
||||||
|
self.log:info("TCP thread " .. n .. " started")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if not self.no_udp then
|
||||||
|
self._udpcli = require("dnsjit.output.udpcli").new()
|
||||||
|
self._udpcli:timeout(self._timespec.sec, self._timespec.nsec)
|
||||||
|
if self._udpcli:connect(self.host, self.port) ~= 0 then
|
||||||
|
self.log:fatal("unable to connect to host " .. self.host .. " port " .. self.port .. " with UDP")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not self.no_tcp then
|
||||||
|
self._tcpcli = require("dnsjit.output.tcpcli").new()
|
||||||
|
self._tcpcli:timeout(self._timespec.sec, self._timespec.nsec)
|
||||||
|
if self._tcpcli:connect(self.host, self.port) ~= 0 then
|
||||||
|
self.log:fatal("unable to connect to host " .. self.host .. " port " .. self.port .. " with TCP")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Replay:run()
|
||||||
|
local lprod, lctx = self.layer:produce()
|
||||||
|
local udpcli = self._udpcli
|
||||||
|
local tcpcli = self._tcpcli
|
||||||
|
local log, packets, queries, responses, errors, timeouts = self.log, 0, 0, 0, 0, 0
|
||||||
|
local send
|
||||||
|
|
||||||
|
if self.use_threads then
|
||||||
|
-- TODO: generate code for all udp/tcp channels, see split gen code in test
|
||||||
|
local udpidx, tcpidx = 1, 1
|
||||||
|
|
||||||
|
local send_udp, send_tcp
|
||||||
|
send_udp = function(obj)
|
||||||
|
local chan = self._udp_channels[udpidx]
|
||||||
|
if not chan then
|
||||||
|
udpidx = 1
|
||||||
|
chan = self._udp_channels[1]
|
||||||
|
end
|
||||||
|
chan:put(obj:copy())
|
||||||
|
udpidx = udpidx + 1
|
||||||
|
end
|
||||||
|
send_tcp = function(obj)
|
||||||
|
local chan = self._tcp_channels[tcpidx]
|
||||||
|
if not chan then
|
||||||
|
tcpidx = 1
|
||||||
|
chan = self._tcp_channels[1]
|
||||||
|
end
|
||||||
|
chan:put(obj:copy())
|
||||||
|
tcpidx = tcpidx + 1
|
||||||
|
end
|
||||||
|
if self._udp_channels[1] and self._tcp_channels[1] then
|
||||||
|
send = function(obj)
|
||||||
|
local protocol = obj.obj_prev
|
||||||
|
while protocol ~= nil do
|
||||||
|
if protocol.obj_type == object.UDP then
|
||||||
|
send_udp(obj)
|
||||||
|
break
|
||||||
|
elseif protocol.obj_type == object.TCP then
|
||||||
|
send_tcp(obj)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
protocol = protocol.obj_prev
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif self._udp_channels[1] then
|
||||||
|
send = send_udp
|
||||||
|
elseif self._tcp_channels[1] then
|
||||||
|
send = send_tcp
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local urecv, uctx, uprod
|
||||||
|
if udpcli then
|
||||||
|
urecv, uctx = udpcli:receive()
|
||||||
|
uprod = udpcli:produce()
|
||||||
|
end
|
||||||
|
local trecv, tctx, tprod
|
||||||
|
if tcpcli then
|
||||||
|
trecv, tctx = tcpcli:receive()
|
||||||
|
tprod = tcpcli:produce()
|
||||||
|
end
|
||||||
|
|
||||||
|
local dns = require("dnsjit.core.object.dns").new()
|
||||||
|
local print_dns
|
||||||
|
if self.print_dns then
|
||||||
|
print_dns = function(payload)
|
||||||
|
dns.obj_prev = payload
|
||||||
|
dns:print()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local send_udp, send_tcp
|
||||||
|
if self.no_responses then
|
||||||
|
send_udp = function(obj)
|
||||||
|
log:info("sending udp query")
|
||||||
|
urecv(uctx, obj)
|
||||||
|
if print_dns then
|
||||||
|
print_dns(obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
send_tcp = function(obj)
|
||||||
|
log:info("sending tcp query")
|
||||||
|
trecv(tctx, obj)
|
||||||
|
if print_dns then
|
||||||
|
print_dns(obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_udp = function(obj)
|
||||||
|
log:info("sending udp query")
|
||||||
|
urecv(uctx, obj)
|
||||||
|
if print_dns then
|
||||||
|
print_dns(obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
local response = uprod(uctx)
|
||||||
|
if response == nil then
|
||||||
|
log:warning("producer error")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local payload = response:cast()
|
||||||
|
if payload.len == 0 then
|
||||||
|
timeouts = timeouts + 1
|
||||||
|
log:info("timeout")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
responses = responses + 1
|
||||||
|
log:info("got response")
|
||||||
|
if print_dns then
|
||||||
|
print_dns(response)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
send_tcp = function(obj)
|
||||||
|
log:info("sending tcp query")
|
||||||
|
trecv(tctx, obj)
|
||||||
|
if print_dns then
|
||||||
|
print_dns(obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
local response = tprod(tctx)
|
||||||
|
if response == nil then
|
||||||
|
log:warning("producer error")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local payload = response:cast()
|
||||||
|
if payload.len == 0 then
|
||||||
|
timeouts = timeouts + 1
|
||||||
|
log:info("timeout")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
responses = responses + 1
|
||||||
|
log:info("got response")
|
||||||
|
if print_dns then
|
||||||
|
print_dns(response)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if udpcli and tcpcli then
|
||||||
|
send = function(obj)
|
||||||
|
dns.obj_prev = obj
|
||||||
|
if dns:parse_header() == 0 and dns.qr == 0 then
|
||||||
|
queries = queries + 1
|
||||||
|
|
||||||
|
local protocol = obj.obj_prev
|
||||||
|
while protocol ~= nil do
|
||||||
|
if protocol.obj_type == object.UDP then
|
||||||
|
send_udp(obj)
|
||||||
|
break
|
||||||
|
elseif protocol.obj_type == object.TCP then
|
||||||
|
send_tcp(obj)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
protocol = protocol.obj_prev
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif udpcli then
|
||||||
|
send = function(obj)
|
||||||
|
dns.obj_prev = obj
|
||||||
|
if dns:parse_header() == 0 and dns.qr == 0 then
|
||||||
|
queries = queries + 1
|
||||||
|
send_udp(obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif tcpcli then
|
||||||
|
send = function(obj)
|
||||||
|
dns.obj_prev = obj
|
||||||
|
if dns:parse_header() == 0 and dns.qr == 0 then
|
||||||
|
queries = queries + 1
|
||||||
|
send_tcp(obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local obj = lprod(lctx)
|
||||||
|
if obj == nil then break end
|
||||||
|
packets = packets + 1
|
||||||
|
local payload = obj:cast()
|
||||||
|
if obj:type() == "payload" and payload.len > 0 then
|
||||||
|
send(obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.use_threads then
|
||||||
|
for _, chan in pairs(self._udp_channels) do
|
||||||
|
chan:put(nil)
|
||||||
|
end
|
||||||
|
for _, chan in pairs(self._tcp_channels) do
|
||||||
|
chan:put(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.packets = packets
|
||||||
|
self.queries = queries
|
||||||
|
self.sent = 0
|
||||||
|
if udpcli then
|
||||||
|
self.sent = self.sent + udpcli:packets()
|
||||||
|
end
|
||||||
|
if tcpcli then
|
||||||
|
self.sent = self.sent + tcpcli:packets()
|
||||||
|
end
|
||||||
|
-- TODO: received == responses ?
|
||||||
|
self.received = responses
|
||||||
|
self.responses = responses
|
||||||
|
self.timeouts = timeouts
|
||||||
|
self.errors = errors
|
||||||
|
if udpcli then
|
||||||
|
self.errors = self.errors + udpcli:errors()
|
||||||
|
end
|
||||||
|
if tcpcli then
|
||||||
|
self.errors = self.errors + tcpcli:errors()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Replay:finish()
|
||||||
|
if self.use_threads then
|
||||||
|
for _, thr in pairs(self._threads) do
|
||||||
|
thr:stop()
|
||||||
|
end
|
||||||
|
for _, stats in pairs(self._stat_channels) do
|
||||||
|
local stat = ffi.cast("struct replay_stats*", stats:get())
|
||||||
|
self.queries = self.queries + stat.sent
|
||||||
|
self.sent = self.sent + stat.sent
|
||||||
|
self.received = self.received + stat.received
|
||||||
|
self.responses = self.responses + stat.responses
|
||||||
|
self.timeouts = self.timeouts + stat.timeouts
|
||||||
|
self.errors = self.errors + stat.errors
|
||||||
|
C.free(stat)
|
||||||
|
end
|
||||||
|
self.queries = tonumber(self.queries)
|
||||||
|
self.sent = tonumber(self.sent)
|
||||||
|
self.received = tonumber(self.received)
|
||||||
|
self.responses = tonumber(self.responses)
|
||||||
|
self.timeouts = tonumber(self.timeouts)
|
||||||
|
self.errors = tonumber(self.errors)
|
||||||
|
|
||||||
|
-- TODO: received == responses ?
|
||||||
|
self.received = self.responses
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Replay
|
571
src/lib/drool/respdiff.lua
Normal file
571
src/lib/drool/respdiff.lua
Normal file
|
@ -0,0 +1,571 @@
|
||||||
|
-- DNS Reply Tool (drool)
|
||||||
|
--
|
||||||
|
-- Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
-- Copyright (c) 2017, Comcast Corporation
|
||||||
|
-- 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
-- COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
module(...,package.seeall)
|
||||||
|
|
||||||
|
local ffi = require("ffi")
|
||||||
|
local C = ffi.C
|
||||||
|
ffi.cdef[[
|
||||||
|
struct respdiff_stats {
|
||||||
|
int64_t sent, received, responses, timeouts, errors;
|
||||||
|
};
|
||||||
|
void* malloc(size_t);
|
||||||
|
void free(void*);
|
||||||
|
]]
|
||||||
|
|
||||||
|
local clock = require("dnsjit.lib.clock")
|
||||||
|
local object = require("dnsjit.core.objects")
|
||||||
|
require("dnsjit.core.timespec_h")
|
||||||
|
|
||||||
|
Respdiff = {}
|
||||||
|
|
||||||
|
function Respdiff.new(getopt)
|
||||||
|
local self = setmetatable({
|
||||||
|
path = nil,
|
||||||
|
fname = nil,
|
||||||
|
file = nil,
|
||||||
|
hname = nil,
|
||||||
|
host = nil,
|
||||||
|
port = nil,
|
||||||
|
|
||||||
|
use_threads = false,
|
||||||
|
timeout = 10.0,
|
||||||
|
layer = nil,
|
||||||
|
input = nil,
|
||||||
|
respdiff = nil,
|
||||||
|
no_udp = false,
|
||||||
|
no_tcp = false,
|
||||||
|
udp_threads = 4,
|
||||||
|
tcp_threads = 2,
|
||||||
|
size = 10485760,
|
||||||
|
|
||||||
|
packets = 0,
|
||||||
|
queries = 0,
|
||||||
|
sent = 0,
|
||||||
|
received = 0,
|
||||||
|
responses = 0,
|
||||||
|
errors = 0,
|
||||||
|
timeouts = 0,
|
||||||
|
|
||||||
|
log = require("dnsjit.core.log").new("respdiff"),
|
||||||
|
|
||||||
|
_timespec = ffi.new("core_timespec_t"),
|
||||||
|
_udp_channels = {},
|
||||||
|
_tcp_channels = {},
|
||||||
|
_threads = {},
|
||||||
|
_udpcli = nil,
|
||||||
|
_tcpcli = nil,
|
||||||
|
_stat_channels = {},
|
||||||
|
_result_channels = {},
|
||||||
|
}, { __index = Respdiff })
|
||||||
|
|
||||||
|
if getopt then
|
||||||
|
getopt.usage_desc = arg[1] .. " respdiff [options...] path name file name host port"
|
||||||
|
getopt:add(nil, "no-udp", false, "Do not use UDP", "?")
|
||||||
|
getopt:add(nil, "no-tcp", false, "Do not use TCP", "?")
|
||||||
|
getopt:add("T", "threads", false, "Use threads", "?")
|
||||||
|
getopt:add(nil, "udp-threads", 4, "Set the number of UDP threads to use, default 4", "?")
|
||||||
|
getopt:add(nil, "tcp-threads", 2, "Set the number of TCP threads to use, default 2", "?")
|
||||||
|
getopt:add(nil, "timeout", "10.0", "Set timeout for waiting on responses [seconds.nanoseconds], default 10.0", "?")
|
||||||
|
getopt:add(nil, "size", 10485760, "Set the size (in bytes, multiple of OS page size) of the LMDB database, default 10485760.", "?")
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Respdiff:getopt(getopt)
|
||||||
|
local _, path, fname, file, hname, host, port = unpack(getopt.left)
|
||||||
|
|
||||||
|
if getopt:val("no-udp") and getopt:val("no-tcp") then
|
||||||
|
self.log:fatal("can not disable all transports")
|
||||||
|
end
|
||||||
|
if getopt:val("udp-threads") < 1 then
|
||||||
|
self.log:fatal("--udp-threads must be 1 or greater")
|
||||||
|
end
|
||||||
|
if getopt:val("tcp-threads") < 1 then
|
||||||
|
self.log:fatal("--tcp-threads must be 1 or greater")
|
||||||
|
end
|
||||||
|
|
||||||
|
if path == nil then
|
||||||
|
self.log:fatal("no path given")
|
||||||
|
end
|
||||||
|
self.path = path
|
||||||
|
if fname == nil then
|
||||||
|
self.log:fatal("no name for file given")
|
||||||
|
end
|
||||||
|
self.fname = fname
|
||||||
|
if file == nil then
|
||||||
|
self.log:fatal("no file given")
|
||||||
|
end
|
||||||
|
self.file = file
|
||||||
|
if hname == nil then
|
||||||
|
self.log:fatal("no name for host given")
|
||||||
|
end
|
||||||
|
self.hname = hname
|
||||||
|
if host == nil then
|
||||||
|
self.log:fatal("no target host given")
|
||||||
|
end
|
||||||
|
self.host = host
|
||||||
|
if port == nil then
|
||||||
|
self.log:fatal("no target port given")
|
||||||
|
end
|
||||||
|
self.port = port
|
||||||
|
|
||||||
|
self.use_threads = getopt:val("T")
|
||||||
|
self.timeout = tonumber(getopt:val("timeout"))
|
||||||
|
self.no_udp = getopt:val("no-udp")
|
||||||
|
self.udp_threads = getopt:val("udp-threads")
|
||||||
|
self.no_tcp = getopt:val("no-tcp")
|
||||||
|
self.tcp_threads = getopt:val("tcp-threads")
|
||||||
|
self.size = getopt:val("size")
|
||||||
|
end
|
||||||
|
|
||||||
|
local _thr_func = function(thr)
|
||||||
|
local mode, thrid, host, port, chan, stats, to_sec, to_nsec, result = thr:pop(9)
|
||||||
|
local log = require("dnsjit.core.log").new(mode .. "#" .. thrid)
|
||||||
|
require("dnsjit.core.objects")
|
||||||
|
local ffi = require("ffi")
|
||||||
|
local C = ffi.C
|
||||||
|
ffi.cdef[[
|
||||||
|
struct respdiff_stats {
|
||||||
|
int64_t sent, received, responses, timeouts, errors;
|
||||||
|
};
|
||||||
|
void* malloc(size_t);
|
||||||
|
void free(void*);
|
||||||
|
]]
|
||||||
|
|
||||||
|
local cli, recv, ctx, prod
|
||||||
|
if mode == "udp" then
|
||||||
|
cli = require("dnsjit.output.udpcli").new()
|
||||||
|
else
|
||||||
|
cli = require("dnsjit.output.tcpcli").new()
|
||||||
|
end
|
||||||
|
cli:timeout(to_sec, to_nsec)
|
||||||
|
if cli:connect(host, port) ~= 0 then
|
||||||
|
log:fatal("unable to connect to host " .. host .. " port " .. port)
|
||||||
|
end
|
||||||
|
recv, ctx = cli:receive()
|
||||||
|
prod = cli:produce()
|
||||||
|
|
||||||
|
local stat = ffi.cast("struct respdiff_stats*", C.malloc(ffi.sizeof("struct respdiff_stats")))
|
||||||
|
ffi.fill(stat, ffi.sizeof("struct respdiff_stats"))
|
||||||
|
ffi.gc(stat, C.free)
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local obj = chan:get()
|
||||||
|
if obj == nil then break end
|
||||||
|
obj = ffi.cast("core_object_t*", obj)
|
||||||
|
local resp = ffi.cast("core_object_t*", obj.obj_prev)
|
||||||
|
|
||||||
|
log:info("sending query")
|
||||||
|
recv(ctx, obj)
|
||||||
|
stat.sent = stat.sent + 1
|
||||||
|
|
||||||
|
local response = prod(ctx)
|
||||||
|
if response == nil then
|
||||||
|
log:warning("producer error")
|
||||||
|
stat.errors = stat.errors + 1
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local payload = response:cast()
|
||||||
|
if payload.len == 0 then
|
||||||
|
stat.timeouts = stat.timeouts + 1
|
||||||
|
log:info("timeout")
|
||||||
|
else
|
||||||
|
stat.responses = stat.responses + 1
|
||||||
|
log:info("got response")
|
||||||
|
resp.obj_prev = response:copy()
|
||||||
|
end
|
||||||
|
result:put(obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
stat.errors = stat.errors + cli:errors()
|
||||||
|
ffi.gc(stat, nil)
|
||||||
|
stats:put(stat)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Respdiff:setup()
|
||||||
|
self.input = require("dnsjit.input.mmpcap").new()
|
||||||
|
if self.input:open(self.file) ~= 0 then
|
||||||
|
self.log:fatal("unable to open file " .. self.file)
|
||||||
|
end
|
||||||
|
|
||||||
|
self.layer = require("dnsjit.filter.layer").new()
|
||||||
|
self.layer:producer(self.input)
|
||||||
|
|
||||||
|
self.respdiff = require("dnsjit.output.respdiff").new(self.path, self.fname, self.hname, self.size)
|
||||||
|
|
||||||
|
self._timespec.sec = math.floor(self.timeout)
|
||||||
|
self._timespec.nsec = (self.timeout - math.floor(self.timeout)) * 1000000000
|
||||||
|
|
||||||
|
if self.use_threads then
|
||||||
|
if not self.no_udp then
|
||||||
|
self.log:info("starting " .. self.udp_threads .. " UDP threads")
|
||||||
|
for n = 1, self.udp_threads do
|
||||||
|
local chan = require("dnsjit.core.channel").new()
|
||||||
|
local stats = require("dnsjit.core.channel").new()
|
||||||
|
local result = require("dnsjit.core.channel").new()
|
||||||
|
local thr = require("dnsjit.core.thread").new()
|
||||||
|
|
||||||
|
thr:start(_thr_func)
|
||||||
|
thr:push("udp", n, self.host, self.port, chan, stats, tonumber(self._timespec.sec), tonumber(self._timespec.nsec), result)
|
||||||
|
|
||||||
|
table.insert(self._udp_channels, chan)
|
||||||
|
table.insert(self._stat_channels, stats)
|
||||||
|
table.insert(self._result_channels, result)
|
||||||
|
table.insert(self._threads, thr)
|
||||||
|
self.log:info("UDP thread " .. n .. " started")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not self.no_tcp then
|
||||||
|
self.log:info("starting " .. self.tcp_threads .. " TCP threads")
|
||||||
|
for n = 1, self.tcp_threads do
|
||||||
|
local chan = require("dnsjit.core.channel").new()
|
||||||
|
local stats = require("dnsjit.core.channel").new()
|
||||||
|
local result = require("dnsjit.core.channel").new()
|
||||||
|
local thr = require("dnsjit.core.thread").new()
|
||||||
|
|
||||||
|
thr:start(_thr_func)
|
||||||
|
thr:push("tcp", n, self.host, self.port, chan, stats, tonumber(self._timespec.sec), tonumber(self._timespec.nsec), result)
|
||||||
|
|
||||||
|
table.insert(self._tcp_channels, chan)
|
||||||
|
table.insert(self._stat_channels, stats)
|
||||||
|
table.insert(self._result_channels, result)
|
||||||
|
table.insert(self._threads, thr)
|
||||||
|
self.log:info("TCP thread " .. n .. " started")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if not self.no_udp then
|
||||||
|
self._udpcli = require("dnsjit.output.udpcli").new()
|
||||||
|
self._udpcli:timeout(self._timespec.sec, self._timespec.nsec)
|
||||||
|
if self._udpcli:connect(self.host, self.port) ~= 0 then
|
||||||
|
self.log:fatal("unable to connect to host " .. self.host .. " port " .. self.port .. " with UDP")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not self.no_tcp then
|
||||||
|
self._tcpcli = require("dnsjit.output.tcpcli").new()
|
||||||
|
self._tcpcli:timeout(self._timespec.sec, self._timespec.nsec)
|
||||||
|
if self._tcpcli:connect(self.host, self.port) ~= 0 then
|
||||||
|
self.log:fatal("unable to connect to host " .. self.host .. " port " .. self.port .. " with TCP")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Respdiff:run()
|
||||||
|
local lprod, lctx = self.layer:produce()
|
||||||
|
local udpcli = self._udpcli
|
||||||
|
local tcpcli = self._tcpcli
|
||||||
|
local log, packets, queries, responses, errors, timeouts = self.log, 0, 0, 0, 0, 0
|
||||||
|
local send
|
||||||
|
local resprecv, respctx = self.respdiff:receive()
|
||||||
|
|
||||||
|
if self.use_threads then
|
||||||
|
-- TODO: generate code for all udp/tcp channels, see split gen code in test
|
||||||
|
local udpidx, tcpidx = 1, 1
|
||||||
|
|
||||||
|
local send_udp = function(obj, resp)
|
||||||
|
local chan = self._udp_channels[udpidx]
|
||||||
|
if not chan then
|
||||||
|
udpidx = 1
|
||||||
|
chan = self._udp_channels[1]
|
||||||
|
end
|
||||||
|
local obj_copy, resp_copy = obj:copy(), resp:copy()
|
||||||
|
obj_copy = ffi.cast("core_object_t*", obj_copy)
|
||||||
|
obj_copy.obj_prev = resp_copy
|
||||||
|
chan:put(obj_copy)
|
||||||
|
udpidx = udpidx + 1
|
||||||
|
end
|
||||||
|
local send_tcp = function(obj, resp)
|
||||||
|
local chan = self._tcp_channels[tcpidx]
|
||||||
|
if not chan then
|
||||||
|
tcpidx = 1
|
||||||
|
chan = self._tcp_channels[1]
|
||||||
|
end
|
||||||
|
local obj_copy, resp_copy = obj:copy(), resp:copy()
|
||||||
|
obj_copy = ffi.cast("core_object_t*", obj_copy)
|
||||||
|
obj_copy.obj_prev = resp_copy
|
||||||
|
chan:put(obj_copy)
|
||||||
|
tcpidx = tcpidx + 1
|
||||||
|
end
|
||||||
|
if self._udp_channels[1] and self._tcp_channels[1] then
|
||||||
|
send = function(obj, resp, protocol)
|
||||||
|
if protocol.obj_type == object.UDP then
|
||||||
|
send_udp(obj, resp)
|
||||||
|
elseif protocol.obj_type == object.TCP then
|
||||||
|
send_tcp(obj, resp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif self._udp_channels[1] then
|
||||||
|
send = send_udp
|
||||||
|
elseif self._tcp_channels[1] then
|
||||||
|
send = send_tcp
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local urecv, uctx, uprod
|
||||||
|
if udpcli then
|
||||||
|
urecv, uctx = udpcli:receive()
|
||||||
|
uprod = udpcli:produce()
|
||||||
|
end
|
||||||
|
local trecv, tctx, tprod
|
||||||
|
if tcpcli then
|
||||||
|
trecv, tctx = tcpcli:receive()
|
||||||
|
tprod = tcpcli:produce()
|
||||||
|
end
|
||||||
|
|
||||||
|
local send_udp = function(obj, resp)
|
||||||
|
log:info("sending udp query")
|
||||||
|
urecv(uctx, obj)
|
||||||
|
|
||||||
|
local response = uprod(uctx)
|
||||||
|
if response == nil then
|
||||||
|
log:warning("producer error")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
obj = ffi.cast("core_object_t*", obj)
|
||||||
|
obj.obj_prev = resp
|
||||||
|
resp = ffi.cast("core_object_t*", resp)
|
||||||
|
|
||||||
|
local payload = response:cast()
|
||||||
|
if payload.len == 0 then
|
||||||
|
timeouts = timeouts + 1
|
||||||
|
log:info("timeout")
|
||||||
|
resp.obj_prev = nil
|
||||||
|
else
|
||||||
|
responses = responses + 1
|
||||||
|
log:info("got response")
|
||||||
|
resp.obj_prev = response
|
||||||
|
end
|
||||||
|
resprecv(respctx, obj)
|
||||||
|
end
|
||||||
|
local send_tcp = function(obj, resp)
|
||||||
|
log:info("sending tcp query")
|
||||||
|
trecv(tctx, obj)
|
||||||
|
|
||||||
|
local response = tprod(tctx)
|
||||||
|
if response == nil then
|
||||||
|
log:warning("producer error")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
obj = ffi.cast("core_object_t*", obj)
|
||||||
|
obj.obj_prev = resp
|
||||||
|
resp = ffi.cast("core_object_t*", resp)
|
||||||
|
|
||||||
|
local payload = response:cast()
|
||||||
|
if payload.len == 0 then
|
||||||
|
timeouts = timeouts + 1
|
||||||
|
log:info("timeout")
|
||||||
|
resp.obj_prev = nil
|
||||||
|
else
|
||||||
|
responses = responses + 1
|
||||||
|
log:info("got response")
|
||||||
|
resp.obj_prev = response
|
||||||
|
end
|
||||||
|
resprecv(respctx, obj)
|
||||||
|
end
|
||||||
|
if udpcli and tcpcli then
|
||||||
|
send = function(obj, resp, protocol)
|
||||||
|
if protocol.obj_type == object.UDP then
|
||||||
|
send_udp(obj, resp)
|
||||||
|
elseif protocol.obj_type == object.TCP then
|
||||||
|
send_tcp(obj, resp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif udpcli then
|
||||||
|
send = send_udp
|
||||||
|
elseif tcpcli then
|
||||||
|
send = send_tcp
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.start_sec = clock:realtime()
|
||||||
|
|
||||||
|
local qtbl = {}
|
||||||
|
local dns = require("dnsjit.core.object.dns").new()
|
||||||
|
while true do
|
||||||
|
local obj = lprod(lctx)
|
||||||
|
if obj == nil then break end
|
||||||
|
packets = packets + 1
|
||||||
|
local payload = obj:cast()
|
||||||
|
if obj:type() == "payload" and payload.len > 0 then
|
||||||
|
|
||||||
|
local transport = obj.obj_prev
|
||||||
|
while transport ~= nil do
|
||||||
|
if transport.obj_type == object.IP or transport.obj_type == object.IP6 then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
transport = transport.obj_prev
|
||||||
|
end
|
||||||
|
local protocol = obj.obj_prev
|
||||||
|
while protocol ~= nil do
|
||||||
|
if protocol.obj_type == object.UDP or protocol.obj_type == object.TCP then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
protocol = protocol.obj_prev
|
||||||
|
end
|
||||||
|
|
||||||
|
if transport ~= nil and protocol ~= nil then
|
||||||
|
transport = transport:cast()
|
||||||
|
protocol = protocol:cast()
|
||||||
|
|
||||||
|
dns.obj_prev = obj
|
||||||
|
if dns:parse_header() == 0 then
|
||||||
|
if dns.qr == 0 then
|
||||||
|
local k = string.format("%s %d %s %d", transport:source(), protocol.sport, transport:destination(), protocol.dport)
|
||||||
|
log:info("query " .. k .. " id " .. dns.id)
|
||||||
|
qtbl[k] = {
|
||||||
|
id = dns.id,
|
||||||
|
payload = payload:copy(),
|
||||||
|
}
|
||||||
|
else
|
||||||
|
local k = string.format("%s %d %s %d", transport:destination(), protocol.dport, transport:source(), protocol.sport)
|
||||||
|
local q = qtbl[k]
|
||||||
|
if q and q.id == dns.id then
|
||||||
|
log:info("response " .. k .. " id " .. dns.id)
|
||||||
|
queries = queries + 1
|
||||||
|
send(q.payload:uncast(), obj, protocol)
|
||||||
|
qtbl[k] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.use_threads and responses < queries then
|
||||||
|
for _, result in pairs(self._result_channels) do
|
||||||
|
local res = result:try_get()
|
||||||
|
if res ~= nil then
|
||||||
|
res = ffi.cast("core_object_t*", res)
|
||||||
|
resprecv(respctx, res)
|
||||||
|
responses = responses + 1
|
||||||
|
|
||||||
|
if res.obj_prev.obj_prev ~= nil then
|
||||||
|
ffi.cast("core_object_t*", res.obj_prev.obj_prev):free()
|
||||||
|
end
|
||||||
|
ffi.cast("core_object_t*", res.obj_prev):free()
|
||||||
|
res:free()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.use_threads then
|
||||||
|
for _, chan in pairs(self._udp_channels) do
|
||||||
|
chan:put(nil)
|
||||||
|
end
|
||||||
|
for _, chan in pairs(self._tcp_channels) do
|
||||||
|
chan:put(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.packets = packets
|
||||||
|
self.queries = queries
|
||||||
|
self.sent = 0
|
||||||
|
if udpcli then
|
||||||
|
self.sent = self.sent + udpcli:packets()
|
||||||
|
end
|
||||||
|
if tcpcli then
|
||||||
|
self.sent = self.sent + tcpcli:packets()
|
||||||
|
end
|
||||||
|
-- TODO: received == responses ?
|
||||||
|
self.received = responses
|
||||||
|
self.responses = responses
|
||||||
|
self.timeouts = timeouts
|
||||||
|
self.errors = errors
|
||||||
|
if udpcli then
|
||||||
|
self.errors = self.errors + udpcli:errors()
|
||||||
|
end
|
||||||
|
if tcpcli then
|
||||||
|
self.errors = self.errors + tcpcli:errors()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Respdiff:finish()
|
||||||
|
if self.use_threads then
|
||||||
|
local left = 0 - self.responses
|
||||||
|
self.responses = 0
|
||||||
|
|
||||||
|
for _, thr in pairs(self._threads) do
|
||||||
|
thr:stop()
|
||||||
|
end
|
||||||
|
for _, stats in pairs(self._stat_channels) do
|
||||||
|
local stat = ffi.cast("struct respdiff_stats*", stats:get())
|
||||||
|
self.sent = self.sent + stat.sent
|
||||||
|
self.received = self.received + stat.received
|
||||||
|
self.responses = self.responses + stat.responses
|
||||||
|
self.timeouts = self.timeouts + stat.timeouts
|
||||||
|
self.errors = self.errors + stat.errors
|
||||||
|
C.free(stat)
|
||||||
|
end
|
||||||
|
self.sent = tonumber(self.sent)
|
||||||
|
self.received = tonumber(self.received)
|
||||||
|
self.responses = tonumber(self.responses)
|
||||||
|
self.timeouts = tonumber(self.timeouts)
|
||||||
|
self.errors = tonumber(self.errors)
|
||||||
|
|
||||||
|
-- TODO: received == responses ?
|
||||||
|
self.received = self.responses
|
||||||
|
|
||||||
|
left = left + self.responses + self.timeouts
|
||||||
|
local resprecv, respctx = self.respdiff:receive()
|
||||||
|
local tries = 0
|
||||||
|
while left > 0 and tries < 10000 do
|
||||||
|
for _, result in pairs(self._result_channels) do
|
||||||
|
local res = result:try_get()
|
||||||
|
if res ~= nil then
|
||||||
|
res = ffi.cast("core_object_t*", res)
|
||||||
|
resprecv(respctx, res)
|
||||||
|
left = left - 1
|
||||||
|
tries = 0
|
||||||
|
|
||||||
|
if res.obj_prev.obj_prev ~= nil then
|
||||||
|
ffi.cast("core_object_t*", res.obj_prev.obj_prev):free()
|
||||||
|
end
|
||||||
|
ffi.cast("core_object_t*", res.obj_prev):free()
|
||||||
|
res:free()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
tries = tries + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local end_sec = clock:realtime()
|
||||||
|
self.respdiff:commit(self.start_sec, end_sec)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Respdiff
|
BIN
src/test/1qtcp.pcap
Normal file
BIN
src/test/1qtcp.pcap
Normal file
Binary file not shown.
61
src/test/Makefile.am
Normal file
61
src/test/Makefile.am
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in env.sh
|
||||||
|
|
||||||
|
CLEANFILES = test*.log test*.trs \
|
||||||
|
*.pcap-dist \
|
||||||
|
test2.out test2.out2 \
|
||||||
|
test2-threads.out test2-threads.out2
|
||||||
|
|
||||||
|
TESTS = test1.sh test2.sh
|
||||||
|
|
||||||
|
BUILT_SOURCES = env.sh
|
||||||
|
|
||||||
|
env.sh:
|
||||||
|
echo "export PATH=\"\$$PATH:@DNSJIT_ROOT@/bin\"" >"$@"
|
||||||
|
echo "export LUA_CPATH=\"@DNSJIT_ROOT@/lib/lua/5.1/?.so;;\"" >>"$@"
|
||||||
|
echo "export LUA_PATH=\"@DNSJIT_ROOT@/share/lua/5.1/?.lua;;\"" >>"$@"
|
||||||
|
|
||||||
|
test1.sh: env.sh
|
||||||
|
|
||||||
|
test2.sh: env.sh dns.pcap-dist 1qtcp.pcap-dist
|
||||||
|
|
||||||
|
.pcap.pcap-dist:
|
||||||
|
cp "$<" "$@"
|
||||||
|
|
||||||
|
EXTRA_DIST = $(TESTS) \
|
||||||
|
dns.pcap 1qtcp.pcap \
|
||||||
|
test2.gold
|
822
src/test/Makefile.in
Normal file
822
src/test/Makefile.in
Normal file
|
@ -0,0 +1,822 @@
|
||||||
|
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2018 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@
|
||||||
|
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = { \
|
||||||
|
if test -z '$(MAKELEVEL)'; then \
|
||||||
|
false; \
|
||||||
|
elif test -n '$(MAKE_HOST)'; then \
|
||||||
|
true; \
|
||||||
|
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||||
|
true; \
|
||||||
|
else \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
}
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
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/test
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
|
am__tty_colors_dummy = \
|
||||||
|
mgn= red= grn= lgn= blu= brg= std=; \
|
||||||
|
am__color_tests=no
|
||||||
|
am__tty_colors = { \
|
||||||
|
$(am__tty_colors_dummy); \
|
||||||
|
if test "X$(AM_COLOR_TESTS)" = Xno; then \
|
||||||
|
am__color_tests=no; \
|
||||||
|
elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
|
||||||
|
am__color_tests=yes; \
|
||||||
|
elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
|
||||||
|
am__color_tests=yes; \
|
||||||
|
fi; \
|
||||||
|
if test $$am__color_tests = yes; then \
|
||||||
|
red='[0;31m'; \
|
||||||
|
grn='[0;32m'; \
|
||||||
|
lgn='[1;32m'; \
|
||||||
|
blu='[1;34m'; \
|
||||||
|
mgn='[0;35m'; \
|
||||||
|
brg='[1m'; \
|
||||||
|
std='[m'; \
|
||||||
|
fi; \
|
||||||
|
}
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__install_max = 40
|
||||||
|
am__nobase_strip_setup = \
|
||||||
|
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||||
|
am__nobase_strip = \
|
||||||
|
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||||
|
am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
|
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||||
|
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||||
|
if (++n[$$2] == $(am__install_max)) \
|
||||||
|
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||||
|
END { for (dir in files) print dir, files[dir] }'
|
||||||
|
am__base_list = \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
|
am__uninstall_files_from_dir = { \
|
||||||
|
test -z "$$files" \
|
||||||
|
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||||
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
|
}
|
||||||
|
am__recheck_rx = ^[ ]*:recheck:[ ]*
|
||||||
|
am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
|
||||||
|
am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
|
||||||
|
# A command that, given a newline-separated list of test names on the
|
||||||
|
# standard input, print the name of the tests that are to be re-run
|
||||||
|
# upon "make recheck".
|
||||||
|
am__list_recheck_tests = $(AWK) '{ \
|
||||||
|
recheck = 1; \
|
||||||
|
while ((rc = (getline line < ($$0 ".trs"))) != 0) \
|
||||||
|
{ \
|
||||||
|
if (rc < 0) \
|
||||||
|
{ \
|
||||||
|
if ((getline line2 < ($$0 ".log")) < 0) \
|
||||||
|
recheck = 0; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
|
||||||
|
{ \
|
||||||
|
recheck = 0; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
|
||||||
|
{ \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
}; \
|
||||||
|
if (recheck) \
|
||||||
|
print $$0; \
|
||||||
|
close ($$0 ".trs"); \
|
||||||
|
close ($$0 ".log"); \
|
||||||
|
}'
|
||||||
|
# A command that, given a newline-separated list of test names on the
|
||||||
|
# standard input, create the global log from their .trs and .log files.
|
||||||
|
am__create_global_log = $(AWK) ' \
|
||||||
|
function fatal(msg) \
|
||||||
|
{ \
|
||||||
|
print "fatal: making $@: " msg | "cat >&2"; \
|
||||||
|
exit 1; \
|
||||||
|
} \
|
||||||
|
function rst_section(header) \
|
||||||
|
{ \
|
||||||
|
print header; \
|
||||||
|
len = length(header); \
|
||||||
|
for (i = 1; i <= len; i = i + 1) \
|
||||||
|
printf "="; \
|
||||||
|
printf "\n\n"; \
|
||||||
|
} \
|
||||||
|
{ \
|
||||||
|
copy_in_global_log = 1; \
|
||||||
|
global_test_result = "RUN"; \
|
||||||
|
while ((rc = (getline line < ($$0 ".trs"))) != 0) \
|
||||||
|
{ \
|
||||||
|
if (rc < 0) \
|
||||||
|
fatal("failed to read from " $$0 ".trs"); \
|
||||||
|
if (line ~ /$(am__global_test_result_rx)/) \
|
||||||
|
{ \
|
||||||
|
sub("$(am__global_test_result_rx)", "", line); \
|
||||||
|
sub("[ ]*$$", "", line); \
|
||||||
|
global_test_result = line; \
|
||||||
|
} \
|
||||||
|
else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
|
||||||
|
copy_in_global_log = 0; \
|
||||||
|
}; \
|
||||||
|
if (copy_in_global_log) \
|
||||||
|
{ \
|
||||||
|
rst_section(global_test_result ": " $$0); \
|
||||||
|
while ((rc = (getline line < ($$0 ".log"))) != 0) \
|
||||||
|
{ \
|
||||||
|
if (rc < 0) \
|
||||||
|
fatal("failed to read from " $$0 ".log"); \
|
||||||
|
print line; \
|
||||||
|
}; \
|
||||||
|
printf "\n"; \
|
||||||
|
}; \
|
||||||
|
close ($$0 ".trs"); \
|
||||||
|
close ($$0 ".log"); \
|
||||||
|
}'
|
||||||
|
# Restructured Text title.
|
||||||
|
am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
|
||||||
|
# Solaris 10 'make', and several other traditional 'make' implementations,
|
||||||
|
# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
|
||||||
|
# by disabling -e (using the XSI extension "set +e") if it's set.
|
||||||
|
am__sh_e_setup = case $$- in *e*) set +e;; esac
|
||||||
|
# Default flags passed to test drivers.
|
||||||
|
am__common_driver_flags = \
|
||||||
|
--color-tests "$$am__color_tests" \
|
||||||
|
--enable-hard-errors "$$am__enable_hard_errors" \
|
||||||
|
--expect-failure "$$am__expect_failure"
|
||||||
|
# To be inserted before the command running the test. Creates the
|
||||||
|
# directory for the log if needed. Stores in $dir the directory
|
||||||
|
# containing $f, in $tst the test, in $log the log. Executes the
|
||||||
|
# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
|
||||||
|
# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
|
||||||
|
# will run the test scripts (or their associated LOG_COMPILER, if
|
||||||
|
# thy have one).
|
||||||
|
am__check_pre = \
|
||||||
|
$(am__sh_e_setup); \
|
||||||
|
$(am__vpath_adj_setup) $(am__vpath_adj) \
|
||||||
|
$(am__tty_colors); \
|
||||||
|
srcdir=$(srcdir); export srcdir; \
|
||||||
|
case "$@" in \
|
||||||
|
*/*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
|
||||||
|
*) am__odir=.;; \
|
||||||
|
esac; \
|
||||||
|
test "x$$am__odir" = x"." || test -d "$$am__odir" \
|
||||||
|
|| $(MKDIR_P) "$$am__odir" || exit $$?; \
|
||||||
|
if test -f "./$$f"; then dir=./; \
|
||||||
|
elif test -f "$$f"; then dir=; \
|
||||||
|
else dir="$(srcdir)/"; fi; \
|
||||||
|
tst=$$dir$$f; log='$@'; \
|
||||||
|
if test -n '$(DISABLE_HARD_ERRORS)'; then \
|
||||||
|
am__enable_hard_errors=no; \
|
||||||
|
else \
|
||||||
|
am__enable_hard_errors=yes; \
|
||||||
|
fi; \
|
||||||
|
case " $(XFAIL_TESTS) " in \
|
||||||
|
*[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
|
||||||
|
am__expect_failure=yes;; \
|
||||||
|
*) \
|
||||||
|
am__expect_failure=no;; \
|
||||||
|
esac; \
|
||||||
|
$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
|
||||||
|
# A shell command to get the names of the tests scripts with any registered
|
||||||
|
# extension removed (i.e., equivalently, the names of the test logs, with
|
||||||
|
# the '.log' extension removed). The result is saved in the shell variable
|
||||||
|
# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
|
||||||
|
# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
|
||||||
|
# since that might cause problem with VPATH rewrites for suffix-less tests.
|
||||||
|
# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
|
||||||
|
am__set_TESTS_bases = \
|
||||||
|
bases='$(TEST_LOGS)'; \
|
||||||
|
bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
|
||||||
|
bases=`echo $$bases`
|
||||||
|
RECHECK_LOGS = $(TEST_LOGS)
|
||||||
|
AM_RECURSIVE_TARGETS = check recheck
|
||||||
|
TEST_SUITE_LOG = test-suite.log
|
||||||
|
TEST_EXTENSIONS = .test
|
||||||
|
LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
|
||||||
|
LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
|
||||||
|
am__set_b = \
|
||||||
|
case '$@' in \
|
||||||
|
*/*) \
|
||||||
|
case '$*' in \
|
||||||
|
*/*) b='$*';; \
|
||||||
|
*) b=`echo '$@' | sed 's/\.log$$//'`; \
|
||||||
|
esac;; \
|
||||||
|
*) \
|
||||||
|
b='$*';; \
|
||||||
|
esac
|
||||||
|
am__test_logs1 = $(TESTS:=.log)
|
||||||
|
TEST_LOGS = $(am__test_logs1:.test.log=.log)
|
||||||
|
TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
|
||||||
|
TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
|
||||||
|
$(TEST_LOG_FLAGS)
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/test-driver
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DNSJIT = @DNSJIT@
|
||||||
|
DNSJIT_ROOT = @DNSJIT_ROOT@
|
||||||
|
DROOL_SHEBANG = @DROOL_SHEBANG@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
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@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
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@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in env.sh
|
||||||
|
CLEANFILES = test*.log test*.trs \
|
||||||
|
*.pcap-dist \
|
||||||
|
test2.out test2.out2 \
|
||||||
|
test2-threads.out test2-threads.out2
|
||||||
|
|
||||||
|
TESTS = test1.sh test2.sh
|
||||||
|
BUILT_SOURCES = env.sh
|
||||||
|
EXTRA_DIST = $(TESTS) \
|
||||||
|
dns.pcap 1qtcp.pcap \
|
||||||
|
test2.gold
|
||||||
|
|
||||||
|
all: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .log .pcap .pcap-dist .test .trs
|
||||||
|
$(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) --foreign src/test/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign src/test/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__maybe_remake_depfiles)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
|
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:
|
||||||
|
|
||||||
|
ctags CTAGS:
|
||||||
|
|
||||||
|
cscope cscopelist:
|
||||||
|
|
||||||
|
|
||||||
|
# Recover from deleted '.trs' file; this should ensure that
|
||||||
|
# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
|
||||||
|
# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
|
||||||
|
# to avoid problems with "make -n".
|
||||||
|
.log.trs:
|
||||||
|
rm -f $< $@
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $<
|
||||||
|
|
||||||
|
# Leading 'am--fnord' is there to ensure the list of targets does not
|
||||||
|
# expand to empty, as could happen e.g. with make check TESTS=''.
|
||||||
|
am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
|
||||||
|
am--force-recheck:
|
||||||
|
@:
|
||||||
|
|
||||||
|
$(TEST_SUITE_LOG): $(TEST_LOGS)
|
||||||
|
@$(am__set_TESTS_bases); \
|
||||||
|
am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
|
||||||
|
redo_bases=`for i in $$bases; do \
|
||||||
|
am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
|
||||||
|
done`; \
|
||||||
|
if test -n "$$redo_bases"; then \
|
||||||
|
redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
|
||||||
|
redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
|
||||||
|
if $(am__make_dryrun); then :; else \
|
||||||
|
rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
if test -n "$$am__remaking_logs"; then \
|
||||||
|
echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
|
||||||
|
"recursion detected" >&2; \
|
||||||
|
elif test -n "$$redo_logs"; then \
|
||||||
|
am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
|
||||||
|
fi; \
|
||||||
|
if $(am__make_dryrun); then :; else \
|
||||||
|
st=0; \
|
||||||
|
errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
|
||||||
|
for i in $$redo_bases; do \
|
||||||
|
test -f $$i.trs && test -r $$i.trs \
|
||||||
|
|| { echo "$$errmsg $$i.trs" >&2; st=1; }; \
|
||||||
|
test -f $$i.log && test -r $$i.log \
|
||||||
|
|| { echo "$$errmsg $$i.log" >&2; st=1; }; \
|
||||||
|
done; \
|
||||||
|
test $$st -eq 0 || exit 1; \
|
||||||
|
fi
|
||||||
|
@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
|
||||||
|
ws='[ ]'; \
|
||||||
|
results=`for b in $$bases; do echo $$b.trs; done`; \
|
||||||
|
test -n "$$results" || results=/dev/null; \
|
||||||
|
all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
|
||||||
|
pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
|
||||||
|
fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
|
||||||
|
skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
|
||||||
|
xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
|
||||||
|
xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
|
||||||
|
error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
|
||||||
|
if test `expr $$fail + $$xpass + $$error` -eq 0; then \
|
||||||
|
success=true; \
|
||||||
|
else \
|
||||||
|
success=false; \
|
||||||
|
fi; \
|
||||||
|
br='==================='; br=$$br$$br$$br$$br; \
|
||||||
|
result_count () \
|
||||||
|
{ \
|
||||||
|
if test x"$$1" = x"--maybe-color"; then \
|
||||||
|
maybe_colorize=yes; \
|
||||||
|
elif test x"$$1" = x"--no-color"; then \
|
||||||
|
maybe_colorize=no; \
|
||||||
|
else \
|
||||||
|
echo "$@: invalid 'result_count' usage" >&2; exit 4; \
|
||||||
|
fi; \
|
||||||
|
shift; \
|
||||||
|
desc=$$1 count=$$2; \
|
||||||
|
if test $$maybe_colorize = yes && test $$count -gt 0; then \
|
||||||
|
color_start=$$3 color_end=$$std; \
|
||||||
|
else \
|
||||||
|
color_start= color_end=; \
|
||||||
|
fi; \
|
||||||
|
echo "$${color_start}# $$desc $$count$${color_end}"; \
|
||||||
|
}; \
|
||||||
|
create_testsuite_report () \
|
||||||
|
{ \
|
||||||
|
result_count $$1 "TOTAL:" $$all "$$brg"; \
|
||||||
|
result_count $$1 "PASS: " $$pass "$$grn"; \
|
||||||
|
result_count $$1 "SKIP: " $$skip "$$blu"; \
|
||||||
|
result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
|
||||||
|
result_count $$1 "FAIL: " $$fail "$$red"; \
|
||||||
|
result_count $$1 "XPASS:" $$xpass "$$red"; \
|
||||||
|
result_count $$1 "ERROR:" $$error "$$mgn"; \
|
||||||
|
}; \
|
||||||
|
{ \
|
||||||
|
echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
|
||||||
|
$(am__rst_title); \
|
||||||
|
create_testsuite_report --no-color; \
|
||||||
|
echo; \
|
||||||
|
echo ".. contents:: :depth: 2"; \
|
||||||
|
echo; \
|
||||||
|
for b in $$bases; do echo $$b; done \
|
||||||
|
| $(am__create_global_log); \
|
||||||
|
} >$(TEST_SUITE_LOG).tmp || exit 1; \
|
||||||
|
mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
|
||||||
|
if $$success; then \
|
||||||
|
col="$$grn"; \
|
||||||
|
else \
|
||||||
|
col="$$red"; \
|
||||||
|
test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
|
||||||
|
fi; \
|
||||||
|
echo "$${col}$$br$${std}"; \
|
||||||
|
echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
|
||||||
|
echo "$${col}$$br$${std}"; \
|
||||||
|
create_testsuite_report --maybe-color; \
|
||||||
|
echo "$$col$$br$$std"; \
|
||||||
|
if $$success; then :; else \
|
||||||
|
echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
|
||||||
|
if test -n "$(PACKAGE_BUGREPORT)"; then \
|
||||||
|
echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
|
||||||
|
fi; \
|
||||||
|
echo "$$col$$br$$std"; \
|
||||||
|
fi; \
|
||||||
|
$$success || exit 1
|
||||||
|
|
||||||
|
check-TESTS:
|
||||||
|
@list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
|
||||||
|
@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
|
||||||
|
@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
|
||||||
|
@set +e; $(am__set_TESTS_bases); \
|
||||||
|
log_list=`for i in $$bases; do echo $$i.log; done`; \
|
||||||
|
trs_list=`for i in $$bases; do echo $$i.trs; done`; \
|
||||||
|
log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
|
||||||
|
exit $$?;
|
||||||
|
recheck: all
|
||||||
|
@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
|
||||||
|
@set +e; $(am__set_TESTS_bases); \
|
||||||
|
bases=`for i in $$bases; do echo $$i; done \
|
||||||
|
| $(am__list_recheck_tests)` || exit 1; \
|
||||||
|
log_list=`for i in $$bases; do echo $$i.log; done`; \
|
||||||
|
log_list=`echo $$log_list`; \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
|
||||||
|
am__force_recheck=am--force-recheck \
|
||||||
|
TEST_LOGS="$$log_list"; \
|
||||||
|
exit $$?
|
||||||
|
test1.sh.log: test1.sh
|
||||||
|
@p='test1.sh'; \
|
||||||
|
b='test1.sh'; \
|
||||||
|
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
|
||||||
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
|
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||||
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
|
test2.sh.log: test2.sh
|
||||||
|
@p='test2.sh'; \
|
||||||
|
b='test2.sh'; \
|
||||||
|
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
|
||||||
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
|
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||||
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
|
.test.log:
|
||||||
|
@p='$<'; \
|
||||||
|
$(am__set_b); \
|
||||||
|
$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
|
||||||
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
|
$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
|
||||||
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
|
|
||||||
|
distdir: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(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
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) check-TESTS
|
||||||
|
check: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) check-am
|
||||||
|
all-am: Makefile
|
||||||
|
installdirs:
|
||||||
|
install: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) 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:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
|
||||||
|
-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
|
||||||
|
-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
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."
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
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: all check check-am install install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: all all-am check check-TESTS check-am clean clean-generic \
|
||||||
|
cscopelist-am ctags-am 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 recheck tags-am uninstall uninstall-am
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
|
env.sh:
|
||||||
|
echo "export PATH=\"\$$PATH:@DNSJIT_ROOT@/bin\"" >"$@"
|
||||||
|
echo "export LUA_CPATH=\"@DNSJIT_ROOT@/lib/lua/5.1/?.so;;\"" >>"$@"
|
||||||
|
echo "export LUA_PATH=\"@DNSJIT_ROOT@/share/lua/5.1/?.lua;;\"" >>"$@"
|
||||||
|
|
||||||
|
test1.sh: env.sh
|
||||||
|
|
||||||
|
test2.sh: env.sh dns.pcap-dist 1qtcp.pcap-dist
|
||||||
|
|
||||||
|
.pcap.pcap-dist:
|
||||||
|
cp "$<" "$@"
|
||||||
|
|
||||||
|
# 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:
|
BIN
src/test/dns.pcap
Normal file
BIN
src/test/dns.pcap
Normal file
Binary file not shown.
42
src/test/test1.sh
Executable file
42
src/test/test1.sh
Executable file
|
@ -0,0 +1,42 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
#
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
. ./env.sh
|
||||||
|
|
||||||
|
export LUA_PATH="$srcdir/../lib/?.lua;$LUA_PATH"
|
||||||
|
../drool -h
|
||||||
|
../drool replay -h
|
28
src/test/test2.gold
Normal file
28
src/test/test2.gold
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
packets 133
|
||||||
|
queries 41
|
||||||
|
sent 41
|
||||||
|
received 0
|
||||||
|
responses 0
|
||||||
|
timeouts 0
|
||||||
|
errors 0
|
||||||
|
packets 133
|
||||||
|
queries 41
|
||||||
|
sent 41
|
||||||
|
received 0
|
||||||
|
responses 0
|
||||||
|
timeouts 0
|
||||||
|
errors 0
|
||||||
|
packets 10
|
||||||
|
queries 2
|
||||||
|
sent 2
|
||||||
|
received 0
|
||||||
|
responses 0
|
||||||
|
timeouts 0
|
||||||
|
errors 0
|
||||||
|
packets 10
|
||||||
|
queries 2
|
||||||
|
sent 2
|
||||||
|
received 0
|
||||||
|
responses 0
|
||||||
|
timeouts 0
|
||||||
|
errors 0
|
56
src/test/test2.sh
Executable file
56
src/test/test2.sh
Executable file
|
@ -0,0 +1,56 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
#
|
||||||
|
# DNS Reply Tool (drool)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017-2021, OARC, Inc.
|
||||||
|
# Copyright (c) 2017, Comcast Corporation
|
||||||
|
# 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. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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
|
||||||
|
# COPYRIGHT HOLDER 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.
|
||||||
|
|
||||||
|
. ./env.sh
|
||||||
|
|
||||||
|
export LUA_PATH="$srcdir/../lib/?.lua;$LUA_PATH"
|
||||||
|
|
||||||
|
if [ -n "$DROOL_TEST_NETWORK" ]; then
|
||||||
|
rm -f test2.out test2.out2
|
||||||
|
for pcap in ./dns.pcap-dist ./1qtcp.pcap-dist; do
|
||||||
|
../drool replay -n --no-tcp "$pcap" 127.0.0.1 53 | tail -n 7 >>test2.out
|
||||||
|
../drool replay -n --no-tcp "$pcap" ::1 53 | tail -n 7 >>test2.out
|
||||||
|
../drool replay -T -n --no-tcp "$pcap" 127.0.0.1 53 | tail -n 7 >>test2-threads.out
|
||||||
|
../drool replay -T -n --no-tcp "$pcap" ::1 53 | tail -n 7 >>test2-threads.out
|
||||||
|
done
|
||||||
|
awk '{print $1 " " $2}' <test2.out >test2.out2
|
||||||
|
diff test2.out2 "$srcdir/test2.gold"
|
||||||
|
awk '{print $1 " " $2}' <test2-threads.out >test2-threads.out2
|
||||||
|
diff test2-threads.out2 "$srcdir/test2.gold"
|
||||||
|
else
|
||||||
|
echo "Not testing network (set DROOL_TEST_NETWORK to enable)"
|
||||||
|
fi
|
148
test-driver
Executable file
148
test-driver
Executable file
|
@ -0,0 +1,148 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# test-driver - basic testsuite driver script.
|
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2011-2018 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, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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>.
|
||||||
|
|
||||||
|
# Make unconditional expansion of undefined variables an error. This
|
||||||
|
# helps a lot in preventing typo-related bugs.
|
||||||
|
set -u
|
||||||
|
|
||||||
|
usage_error ()
|
||||||
|
{
|
||||||
|
echo "$0: $*" >&2
|
||||||
|
print_usage >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage ()
|
||||||
|
{
|
||||||
|
cat <<END
|
||||||
|
Usage:
|
||||||
|
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
||||||
|
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
||||||
|
[--enable-hard-errors={yes|no}] [--]
|
||||||
|
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
||||||
|
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
test_name= # Used for reporting.
|
||||||
|
log_file= # Where to save the output of the test script.
|
||||||
|
trs_file= # Where to save the metadata of the test run.
|
||||||
|
expect_failure=no
|
||||||
|
color_tests=no
|
||||||
|
enable_hard_errors=yes
|
||||||
|
while test $# -gt 0; do
|
||||||
|
case $1 in
|
||||||
|
--help) print_usage; exit $?;;
|
||||||
|
--version) echo "test-driver $scriptversion"; exit $?;;
|
||||||
|
--test-name) test_name=$2; shift;;
|
||||||
|
--log-file) log_file=$2; shift;;
|
||||||
|
--trs-file) trs_file=$2; shift;;
|
||||||
|
--color-tests) color_tests=$2; shift;;
|
||||||
|
--expect-failure) expect_failure=$2; shift;;
|
||||||
|
--enable-hard-errors) enable_hard_errors=$2; shift;;
|
||||||
|
--) shift; break;;
|
||||||
|
-*) usage_error "invalid option: '$1'";;
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
missing_opts=
|
||||||
|
test x"$test_name" = x && missing_opts="$missing_opts --test-name"
|
||||||
|
test x"$log_file" = x && missing_opts="$missing_opts --log-file"
|
||||||
|
test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
|
||||||
|
if test x"$missing_opts" != x; then
|
||||||
|
usage_error "the following mandatory options are missing:$missing_opts"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
usage_error "missing argument"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $color_tests = yes; then
|
||||||
|
# Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
|
||||||
|
red='[0;31m' # Red.
|
||||||
|
grn='[0;32m' # Green.
|
||||||
|
lgn='[1;32m' # Light green.
|
||||||
|
blu='[1;34m' # Blue.
|
||||||
|
mgn='[0;35m' # Magenta.
|
||||||
|
std='[m' # No color.
|
||||||
|
else
|
||||||
|
red= grn= lgn= blu= mgn= std=
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
|
||||||
|
trap "st=129; $do_exit" 1
|
||||||
|
trap "st=130; $do_exit" 2
|
||||||
|
trap "st=141; $do_exit" 13
|
||||||
|
trap "st=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Test script is run here.
|
||||||
|
"$@" >$log_file 2>&1
|
||||||
|
estatus=$?
|
||||||
|
|
||||||
|
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
||||||
|
tweaked_estatus=1
|
||||||
|
else
|
||||||
|
tweaked_estatus=$estatus
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $tweaked_estatus:$expect_failure in
|
||||||
|
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
|
||||||
|
0:*) col=$grn res=PASS recheck=no gcopy=no;;
|
||||||
|
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
|
||||||
|
99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
|
||||||
|
*:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
|
||||||
|
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Report the test outcome and exit status in the logs, so that one can
|
||||||
|
# know whether the test passed or failed simply by looking at the '.log'
|
||||||
|
# file, without the need of also peaking into the corresponding '.trs'
|
||||||
|
# file (automake bug#11814).
|
||||||
|
echo "$res $test_name (exit status: $estatus)" >>$log_file
|
||||||
|
|
||||||
|
# Report outcome to console.
|
||||||
|
echo "${col}${res}${std}: $test_name"
|
||||||
|
|
||||||
|
# Register the test result, and other relevant metadata.
|
||||||
|
echo ":test-result: $res" > $trs_file
|
||||||
|
echo ":global-test-result: $res" >> $trs_file
|
||||||
|
echo ":recheck: $recheck" >> $trs_file
|
||||||
|
echo ":copy-in-global-log: $gcopy" >> $trs_file
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
Loading…
Add table
Reference in a new issue