Commit 09f2de75 authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰

[1239] Changes after review:

- DHCPv4 tests now simulate detection of 127.0.0.1 address
- DHCPv4 tests now open sockets on loopback
- Option::getUintX() now uses code from isc::util::getUintX
- Option::getUintX() methods are now documented
- Test for option::getUintX() implemented
- src/lib/dns/benchmarks/Makefile that was added by mistake removed
parent 5be5e6a6
......@@ -44,6 +44,7 @@ Dhcpv4Srv::Dhcpv4Srv(uint16_t port) {
Dhcpv4Srv::~Dhcpv4Srv() {
cout << "DHCPv4 server shutdown." << endl;
IfaceMgr::instance().closeSockets();
}
bool
......@@ -55,16 +56,16 @@ Dhcpv4Srv::run() {
query = IfaceMgr::instance().receive4();
#if defined(ECHO_SERVER)
query->repack();
query->repack();
IfaceMgr::instance().send(query);
continue;
#endif
if (query) {
try {
query->unpack();
} catch (const std::exception& e) {
/// TODO: Printout reasons of failed parsing
try {
query->unpack();
} catch (const std::exception& e) {
/// TODO: Printout reasons of failed parsing
cout << "Failed to parse incoming packet " << endl;
continue;
}
......@@ -104,7 +105,8 @@ Dhcpv4Srv::run() {
rsp->setIface(query->getIface());
rsp->setIndex(query->getIndex());
cout << "Replying with message type " << (int)rsp->getType() << ":" << endl;
cout << "Replying with message type "
<< static_cast<int>(rsp->getType()) << ":" << endl;
cout << rsp->toText();
cout << "----" << endl;
if (rsp->pack()) {
......
......@@ -34,7 +34,7 @@ const char* const INTERFACE_FILE = "interfaces.txt";
class NakedDhcpv4Srv: public Dhcpv4Srv {
// "naked" Interface Manager, exposes internal fields
public:
NakedDhcpv4Srv() { }
NakedDhcpv4Srv():Dhcpv4Srv(DHCP4_SERVER_PORT + 10000) { }
boost::shared_ptr<Pkt4> processDiscover(boost::shared_ptr<Pkt4>& discover) {
return Dhcpv4Srv::processDiscover(discover);
......@@ -56,12 +56,12 @@ public:
class Dhcpv4SrvTest : public ::testing::Test {
public:
Dhcpv4SrvTest() {
unlink(INTERFACE_FILE);
fstream fakeifaces(INTERFACE_FILE, ios::out|ios::trunc);
if (if_nametoindex("lo")>0) {
fakeifaces << "lo ::1";
} else if (if_nametoindex("lo0")>0) {
fakeifaces << "lo0 ::1";
unlink(INTERFACE_FILE);
fstream fakeifaces(INTERFACE_FILE, ios::out | ios::trunc);
if (if_nametoindex("lo") > 0) {
fakeifaces << "lo 127.0.0.1";
} else if (if_nametoindex("lo0") > 0) {
fakeifaces << "lo0 127.0.0.1";
}
fakeifaces.close();
}
......@@ -77,7 +77,7 @@ TEST_F(Dhcpv4SrvTest, basic) {
Dhcpv4Srv* srv = 0;
ASSERT_NO_THROW({
srv = new Dhcpv4Srv();
srv = new Dhcpv4Srv(DHCP4_SERVER_PORT + 10000);
});
if (srv) {
......
......@@ -52,10 +52,10 @@ class Dhcpv6SrvTest : public ::testing::Test {
public:
Dhcpv6SrvTest() {
unlink(INTERFACE_FILE);
fstream fakeifaces(INTERFACE_FILE, ios::out|ios::trunc);
if (if_nametoindex("lo")>0) {
fstream fakeifaces(INTERFACE_FILE, ios::out | ios::trunc);
if (if_nametoindex("lo") > 0) {
fakeifaces << "lo ::1";
} else if (if_nametoindex("lo0")>0) {
} else if (if_nametoindex("lo0") > 0) {
fakeifaces << "lo0 ::1";
}
fakeifaces.close();
......
......@@ -341,7 +341,8 @@ uint16_t Option::getUint16() {
isc_throw(OutOfRange, "Attempt to read uint16 from option " << type_
<< " that has size " << data_.size());
}
return ( ((uint16_t)data_[0]) << 8 ) + data_[1];
return ( readUint16(&data_[0]) );
}
uint32_t Option::getUint32() {
......@@ -349,10 +350,7 @@ uint32_t Option::getUint32() {
isc_throw(OutOfRange, "Attempt to read uint32 from option " << type_
<< " that has size " << data_.size());
}
return (((uint32_t)data_[0]) << 24)
+ (((uint32_t)data_[1]) << 16)
+ (((uint32_t)data_[2]) << 8)
+ (((uint32_t)data_[3]));
return ( readUint32(&data_[0]) );
}
Option::~Option() {
......
......@@ -237,15 +237,29 @@ public:
bool
delOption(unsigned short type);
/// @brief Returns content of first byte.
///
/// This method will throw OutOfRange if option has 0 length.
///
/// @return value of the first byte
uint8_t getUint8();
/// @brief Returns content of first word.
///
/// This method will throw OutOfRange if option has less than 2 length.
///
/// @return uint16_t value stored on first two bytes
uint16_t getUint16();
/// @brief Returns content of first double word.
///
/// This method will throw OutOfRange if option has less than 4 length.
///
/// @return uint14_t value stored on first four bytes
uint32_t getUint32();
/// just to force that every option has virtual dtor
virtual
~Option();
virtual ~Option();
protected:
......
......@@ -131,7 +131,7 @@ Pkt4::unpack() {
// input buffer (used during message reception)
isc::util::InputBuffer bufferIn(&data_[0], data_.size());
if (bufferIn.getLength()<DHCPV4_PKT_HDR_LEN) {
if (bufferIn.getLength() < DHCPV4_PKT_HDR_LEN) {
isc_throw(OutOfRange, "Received truncated DHCPv4 packet (len="
<< bufferIn.getLength() << " received, at least "
<< DHCPV4_PKT_HDR_LEN << "is expected");
......
......@@ -419,3 +419,41 @@ TEST_F(OptionTest, v6_toText) {
EXPECT_EQ("type=258, len=3: 00:0f:ff", opt->toText());
}
TEST_F(OptionTest, getUintX) {
boost::shared_array<uint8_t> buf(new uint8_t[5]);
buf[0] = 0x5;
buf[1] = 0x4;
buf[2] = 0x3;
buf[3] = 0x2;
buf[4] = 0x1;
// five options with varying lengths
boost::shared_ptr<Option> opt1(new Option(Option::V6, 258, buf, 0, 1));
boost::shared_ptr<Option> opt2(new Option(Option::V6, 258, buf, 0, 2));
boost::shared_ptr<Option> opt3(new Option(Option::V6, 258, buf, 0, 3));
boost::shared_ptr<Option> opt4(new Option(Option::V6, 258, buf, 0, 4));
boost::shared_ptr<Option> opt5(new Option(Option::V6, 258, buf, 0, 5));
EXPECT_EQ(5, opt1->getUint8());
EXPECT_THROW(opt1->getUint16(), OutOfRange);
EXPECT_THROW(opt1->getUint32(), OutOfRange);
EXPECT_EQ(5, opt2->getUint8());
EXPECT_EQ(0x0504, opt2->getUint16());
EXPECT_THROW(opt2->getUint32(), OutOfRange);
EXPECT_EQ(5, opt3->getUint8());
EXPECT_EQ(0x0504, opt3->getUint16());
EXPECT_THROW(opt3->getUint32(), OutOfRange);
EXPECT_EQ(5, opt4->getUint8());
EXPECT_EQ(0x0504, opt4->getUint16());
EXPECT_EQ(0x05040302, opt4->getUint32());
// the same as for 4-byte long, just get first 1,2 or 4 bytes
EXPECT_EQ(5, opt5->getUint8());
EXPECT_EQ(0x0504, opt5->getUint16());
EXPECT_EQ(0x05040302, opt5->getUint32());
}
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# src/lib/dns/benchmarks/Makefile. Generated from Makefile.in by configure.
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
pkgdatadir = $(datadir)/bind10-devel
pkgincludedir = $(includedir)/bind10-devel
pkglibdir = $(libdir)/bind10-devel
pkglibexecdir = $(libexecdir)/bind10-devel
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 = :
build_triplet = x86_64-unknown-linux-gnu
host_triplet = x86_64-unknown-linux-gnu
noinst_PROGRAMS = rdatarender_bench$(EXEEXT)
subdir = src/lib/dns/benchmarks
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
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)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
PROGRAMS = $(noinst_PROGRAMS)
am_rdatarender_bench_OBJECTS = rdatarender_bench.$(OBJEXT)
rdatarender_bench_OBJECTS = $(am_rdatarender_bench_OBJECTS)
am__DEPENDENCIES_1 =
rdatarender_bench_DEPENDENCIES = \
$(top_builddir)/src/lib/dns/libdns++.la \
$(top_builddir)/src/lib/util/libutil.la \
$(top_builddir)/src/lib/exceptions/libexceptions.la \
$(am__DEPENDENCIES_1)
DEFAULT_INCLUDES = -I. -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(rdatarender_bench_SOURCES)
DIST_SOURCES = $(rdatarender_bench_SOURCES)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = ${SHELL} /home/thomson/devel/bind10/missing --run aclocal-1.11
AMTAR = ${SHELL} /home/thomson/devel/bind10/missing --run tar
AR = ar
AUTOCONF = ${SHELL} /home/thomson/devel/bind10/missing --run autoconf
AUTOHEADER = ${SHELL} /home/thomson/devel/bind10/missing --run autoheader
AUTOMAKE = ${SHELL} /home/thomson/devel/bind10/missing --run automake-1.11
AWK = /usr/bin/gawk
B10_CXXFLAGS = -Wall -Wextra -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -Werror -fPIC
BOOST_INCLUDES =
BOTAN_CONFIG = /usr/bin/pkg-config botan-1.8
BOTAN_INCLUDES =
BOTAN_LDFLAGS = -lbotan
BOTAN_RPATH =
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS =
COMMON_PYTHON_PATH = $(abs_top_builddir)/src/lib/python/isc/log_messages:$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python
CPP = gcc -E
CPPFLAGS = -I$(top_srcdir)/ext/asio -I$(top_srcdir)/ext/coroutine -DASIO_DISABLE_THREADS=1
CXX = g++
CXXCPP = g++ -E
CXXDEPMODE = depmode=gcc3
CXXFLAGS = -g -O2
CYGPATH_W = echo
DEFS = -DHAVE_CONFIG_H
DEPDIR = .deps
DISTCHECK_GTEST_CONFIGURE_FLAG = --with-gtest="/home/thomson/devel/gtest-1.6.0"
DSYMUTIL =
DUMPBIN =
ECHO_C =
ECHO_N = -n
ECHO_T =
EGREP = /bin/grep -E
ENV_LIBRARY_PATH = LD_LIBRARY_PATH
EXEEXT =
FGREP = /bin/grep -F
GENHTML =
GREP = /bin/grep
GTEST_CONFIG =
GTEST_INCLUDES = -I/home/thomson/devel/gtest-1.6.0/include
GTEST_LDADD = -lgtest
GTEST_LDFLAGS = -L/home/thomson/devel/gtest-1.6.0/lib
HAVE_PKG_CONFIG = yes
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
LCOV =
LD = /usr/bin/ld -m elf_x86_64
LDFLAGS =
LIBOBJS =
LIBS =
LIBTOOL = $(SHELL) $(top_builddir)/libtool
LIPO =
LN_S = ln -s
LOG4CPLUS_INCLUDES = -I/usr/local/include
LOG4CPLUS_LDFLAGS = -L/usr/local/lib -llog4cplus -pthread
LTLIBOBJS =
MAKEINFO = ${SHELL} /home/thomson/devel/bind10/missing --run makeinfo
MKDIR_P = /bin/mkdir -p
MULTITHREADING_FLAG = -pthread
NM = /usr/bin/nm -B
NMEDIT =
OBJDUMP = objdump
OBJEXT = o
OTOOL =
OTOOL64 =
PACKAGE = bind10-devel
PACKAGE_BUGREPORT = bind10-dev@isc.org
PACKAGE_NAME = bind10-devel
PACKAGE_STRING = bind10-devel 20111021
PACKAGE_TARNAME = bind10-devel
PACKAGE_URL =
PACKAGE_VERSION = 20111021
PATH_SEPARATOR = :
PERL = /usr/bin/perl
PKG_CONFIG = /usr/bin/pkg-config
PKG_CONFIG_LIBDIR =
PKG_CONFIG_PATH =
PTHREAD_LDFLAGS = -lpthread
PYCOVERAGE =
PYCOVERAGE_RUN = /usr/bin/python3.1
PYTHON = /usr/bin/python3.1
PYTHON_CXXFLAGS =
PYTHON_EXEC_PREFIX = ${exec_prefix}
PYTHON_INCLUDES = -I/usr/include/python3.1 -I/usr/include/python3.1
PYTHON_LDFLAGS = -L/usr/lib/python3.1/config -R/usr/lib/python3.1/config
PYTHON_LIB = -lpython3.1
PYTHON_LOGMSGPKG_DIR = $(top_builddir)/src/lib/python/isc/log_messages
PYTHON_PLATFORM = linux2
PYTHON_PREFIX = ${prefix}
PYTHON_SITEPKG_DIR = ${exec_prefix}/lib/python3/dist-packages
PYTHON_VERSION = 3.1
RANLIB = ranlib
SED = /bin/sed
SET_ENV_LIBRARY_PATH = no
SET_MAKE =
SHELL = /bin/bash
SQLITE_CFLAGS =
SQLITE_LIBS = -L/usr/lib/x86_64-linux-gnu -lsqlite3
STRIP = strip
USE_LCOV = no
USE_PYCOVERAGE = no
VERSION = 20111021
WARNING_NO_MISSING_FIELD_INITIALIZERS_CFLAG = -Wno-missing-field-initializers
abs_builddir = /home/thomson/devel/bind10/src/lib/dns/benchmarks
abs_srcdir = /home/thomson/devel/bind10/src/lib/dns/benchmarks
abs_top_builddir = /home/thomson/devel/bind10
abs_top_srcdir = /home/thomson/devel/bind10
ac_ct_CC = gcc
ac_ct_CXX = g++
ac_ct_DUMPBIN =
am__include = include
am__leading_dot = .
am__quote =
am__tar = ${AMTAR} chof - "$$tardir"
am__untar = ${AMTAR} xf -
bindir = ${exec_prefix}/bin
build = x86_64-unknown-linux-gnu
build_alias =
build_cpu = x86_64
build_os = linux-gnu
build_vendor = unknown
builddir = .
datadir = ${datarootdir}
datarootdir = ${prefix}/share
docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
dvidir = ${docdir}
exec_prefix = ${prefix}
host = x86_64-unknown-linux-gnu
host_alias =
host_cpu = x86_64
host_os = linux-gnu
host_vendor = unknown
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
install_sh = ${SHELL} /home/thomson/devel/bind10/install-sh
libdir = ${exec_prefix}/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
localstatedir = ${prefix}/var
lt_ECHO = echo
mandir = ${datarootdir}/man
mkdir_p = /bin/mkdir -p
oldincludedir = /usr/include
pdfdir = ${docdir}
pkgpyexecdir = ${pyexecdir}/bind10-devel
pkgpythondir = ${pythondir}/bind10-devel
prefix = /usr/local
program_transform_name = s,x,x,
psdir = ${docdir}
pyexecdir = ${exec_prefix}/lib/python3/dist-packages
pythondir = ${prefix}/lib/python3/dist-packages
sbindir = ${exec_prefix}/sbin
sharedstatedir = ${prefix}/com
srcdir = .
sysconfdir = ${prefix}/etc
target_alias =
top_build_prefix = ../../../../
top_builddir = ../../../..
top_srcdir = ../../../..
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib \
$(BOOST_INCLUDES)
AM_CXXFLAGS = $(B10_CXXFLAGS)
#AM_LDFLAGS = -static
CLEANFILES = *.gcno *.gcda
rdatarender_bench_SOURCES = rdatarender_bench.cc
rdatarender_bench_LDADD = $(top_builddir)/src/lib/dns/libdns++.la \
$(top_builddir)/src/lib/util/libutil.la \
$(top_builddir)/src/lib/exceptions/libexceptions.la \
$(SQLITE_LIBS)
all: all-am
.SUFFIXES:
.SUFFIXES: .cc .lo .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/dns/benchmarks/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --gnu src/lib/dns/benchmarks/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
clean-noinstPROGRAMS:
@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
echo " rm -f" $$list; \
rm -f $$list || exit $$?; \
test -n "$(EXEEXT)" || exit 0; \
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
rdatarender_bench$(EXEEXT): $(rdatarender_bench_OBJECTS) $(rdatarender_bench_DEPENDENCIES)
@rm -f rdatarender_bench$(EXEEXT)
$(CXXLINK) $(rdatarender_bench_OBJECTS) $(rdatarender_bench_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
include ./$(DEPDIR)/rdatarender_bench.Po
.cc.o:
$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
# source='$<' object='$@' libtool=no \
# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
# $(CXXCOMPILE) -c -o $@ $<
.cc.obj:
$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
# source='$<' object='$@' libtool=no \
# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
# $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cc.lo:
$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
# source='$<' object='$@' libtool=yes \
# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
# $(LTCXXCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am