Commit 1f15b81d authored by Simon Kelley's avatar Simon Kelley

import of dnsmasq-2.51.tar.gz

parent 77e94da7
version 2.51
Add support for internationalised DNS. Non-ASCII characters
in domain names found in /etc/hosts, /etc/ethers and
/etc/dnsmasq.conf will be correctly handled by translation to
punycode, as specified in RFC3490. This function is only
available if dnsmasq is compiled with internationalisation
support, and adds a dependency on GNU libidn. Without i18n
support, dnsmasq continues to be compilable with just
standard tools. Thanks to Yves Dorfsman for the
suggestion.
Add two more environment variables for lease-change scripts:
First, DNSMASQ_SUPPLIED_HOSTNAME; this is set to the hostname
supplied by a client, even if the actual hostname used is
over-ridden by dhcp-host or dhcp-ignore-names directives.
Also DNSMASQ_RELAY_ADDRESS which gives the address of
a DHCP relay, if used.
Suggestions from Michael Rack.
Fix regression which broke echo of relay-agent
options. Thanks to Michael Rack for spotting this.
Don't treat option 67 as being interchangeable with
dhcp-boot parameters if it's specified as
dhcp-option-force.
Make the code to call scripts on lease-change compile-time
optional. It can be switched off by editing src/config.h
or building with "make COPTS=-DNO_SCRIPT".
Make the TFTP server cope with filenames from Windows/DOS
which use '\' as pathname separator. Thanks to Ralf for
the patch.
Updated Polish translation. Thanks to Jan Psota.
Warn if an IP address is duplicated in /etc/ethers. Thanks
to Felix Schwarz for pointing this out.
Teach --conf-dir to take an option list of file suffices
which will be ignored when scanning the directory. Useful
for backup files etc. Thanks to Helmut Hullen for the
suggestion.
Add new DHCP option named tftpserver-address, which
corresponds to the third argument of dhcp-boot. This
allows the complete functionality of dhcp-boot to be
replicated with dhcp-option. Useful when using
dhcp-optsfile.
Test which upstream nameserver to use every 10 seconds
or 50 queries and not just when a query times out and
is retried. This should improve performance when there
is a slow nameserver in the list. Thanks to Joe for the
suggestion.
Don't do any PXE processing, even for clients with the
correct vendorclass, unless at least one pxe-prompt or
pxe-service option is given. This stops dnsmasq
interfering with proxy PXE subsystems when it is just
the DHCP server. Thanks to Spencer Clark for spotting this.
Limit the blocksize used for TFTP transfers to a value
which avoids packet fragmentation, based on the MTU of the
local interface. Many netboot ROMs can't cope with
fragmented packets.
Honour dhcp-ignore configuration for PXE and proxy-PXE
requests. Thanks to Niels Basjes for the bug report.
Updated French translation. Thanks to Gildas Le Nadan.
version 2.50 version 2.50
Fix security problem which allowed any host permitted to Fix security problem which allowed any host permitted to
do TFTP to possibly compromise dnsmasq by remote buffer do TFTP to possibly compromise dnsmasq by remote buffer
...@@ -358,3 +431,8 @@ version 2.43 ...@@ -358,3 +431,8 @@ version 2.43
ports. Thanks to Patrick McLean for spotting this. ports. Thanks to Patrick McLean for spotting this.
Updated French translation. Thanks to Gildas Le Nadan. Updated French translation. Thanks to Gildas Le Nadan.
version 2.42
The changelog for version 2.42 and earlier is
available in CHANGELOG.archive.
...@@ -24,18 +24,22 @@ MAN = man ...@@ -24,18 +24,22 @@ MAN = man
PKG_CONFIG = pkg-config PKG_CONFIG = pkg-config
INSTALL = install INSTALL = install
MSGMERGE = msgmerge
MSGFMT = msgfmt
XGETTEXT = xgettext
DBUS_CFLAGS="`echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --cflags dbus-1`" #################################################################
DBUS_LIBS=" `echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --libs dbus-1`"
SUNOS_LIBS=" `if uname | grep SunOS 2>&1 >/dev/null; then echo -lsocket -lnsl -lposix4; fi `" DNSMASQ_CFLAGS=`echo $(COPTS) | ../bld/pkg-wrapper HAVE_DBUS $(PKG_CONFIG) --cflags dbus-1`
DNSMASQ_LIBS= `echo $(COPTS) | ../bld/pkg-wrapper HAVE_DBUS $(PKG_CONFIG) --libs dbus-1`
SUNOS_LIBS= `if uname | grep SunOS 2>&1 >/dev/null; then echo -lsocket -lnsl -lposix4; fi`
all : dnsmasq all : dnsmasq
dnsmasq : dnsmasq :
cd $(SRC) && $(MAKE) \ @cd $(SRC) && $(MAKE) \
DBUS_CFLAGS=$(DBUS_CFLAGS) \ DNSMASQ_CFLAGS="$(DNSMASQ_CFLAGS)" \
DBUS_LIBS=$(DBUS_LIBS) \ DNSMASQ_LIBS="$(DNSMASQ_LIBS) $(SUNOS_LIBS)" \
SUNOS_LIBS=$(SUNOS_LIBS) \
-f ../bld/Makefile dnsmasq -f ../bld/Makefile dnsmasq
clean : clean :
...@@ -50,24 +54,25 @@ install-common : ...@@ -50,24 +54,25 @@ install-common :
$(INSTALL) -m 755 $(SRC)/dnsmasq $(DESTDIR)$(BINDIR) $(INSTALL) -m 755 $(SRC)/dnsmasq $(DESTDIR)$(BINDIR)
all-i18n : all-i18n :
cd $(SRC) && $(MAKE) \ @cd $(SRC) && $(MAKE) \
I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' \ I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' \
DBUS_CFLAGS=$(DBUS_CFLAGS) \ DNSMASQ_CFLAGS="$(DNSMASQ_CFLAGS) `$(PKG_CONFIG) --cflags libidn`" \
DBUS_LIBS=$(DBUS_LIBS) \ DNSMASQ_LIBS="$(DNSMASQ_LIBS) $(SUNOS_LIBS) `$(PKG_CONFIG) --libs libidn`" \
SUNOS_LIBS=$(SUNOS_LIBS) \
-f ../bld/Makefile dnsmasq -f ../bld/Makefile dnsmasq
cd $(PO); for f in *.po; do \ @cd $(PO); for f in *.po; do \
cd ../$(SRC) && $(MAKE) -f ../bld/Makefile $${f%.po}.mo; \ cd ../$(SRC) && $(MAKE) \
MSGMERGE=$(MSGMERGE) MSGFMT=$(MSGFMT) XGETTEXT=$(XGETTEXT) \
-f ../bld/Makefile $${f%.po}.mo; \
done done
install-i18n : all-i18n install-common install-i18n : all-i18n install-common
cd $(SRC); ../bld/install-mo $(DESTDIR)$(LOCALEDIR) cd $(SRC); ../bld/install-mo $(DESTDIR)$(LOCALEDIR) $(INSTALL)
cd $(MAN); ../bld/install-man $(DESTDIR)$(MANDIR) cd $(MAN); ../bld/install-man $(DESTDIR)$(MANDIR) $(INSTALL)
merge : merge :
$(MAKE) I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' -f ../bld/Makefile -C $(SRC) dnsmasq.pot @cd $(SRC) && $(MAKE) XGETTEXT=$(XGETTEXT) -f ../bld/Makefile dnsmasq.pot
cd $(PO); for f in *.po; do \ @cd $(PO); for f in *.po; do \
msgmerge --no-wrap -U $$f ../$(SRC)/dnsmasq.pot; \ echo -n msgmerge $$f && $(MSGMERGE) --no-wrap -U $$f ../$(SRC)/dnsmasq.pot; \
done done
...@@ -5,13 +5,13 @@ OBJS = cache.o rfc1035.o util.o option.o forward.o network.o \ ...@@ -5,13 +5,13 @@ OBJS = cache.o rfc1035.o util.o option.o forward.o network.o \
helper.o tftp.o log.o helper.o tftp.o log.o
.c.o: .c.o:
$(CC) $(CFLAGS) $(COPTS) $(DBUS_MINOR) $(I18N) $(DBUS_CFLAGS) $(SUNOS_VER) $(RPM_OPT_FLAGS) -c $< $(CC) $(CFLAGS) $(COPTS) $(I18N) $(DNSMASQ_CFLAGS) $(RPM_OPT_FLAGS) -c $<
dnsmasq : $(OBJS) dnsmasq : $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(DBUS_LIBS) $(SUNOS_LIBS) $(LIBS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(DNSMASQ_LIBS) $(LIBS)
dnsmasq.pot : $(OBJS:.o=.c) dnsmasq.h config.h dnsmasq.pot : $(OBJS:.o=.c) dnsmasq.h config.h
xgettext -d dnsmasq --foreign-user --keyword=_ -o dnsmasq.pot -i $(OBJS:.o=.c) $(XGETTEXT) -d dnsmasq --foreign-user --omit-header --keyword=_ -o $@ -i $(OBJS:.o=.c)
%.mo : ../po/%.po dnsmasq.pot %.mo : ../po/%.po dnsmasq.pot
msgmerge -o - ../po/$*.po dnsmasq.pot | msgfmt -o $*.mo - $(MSGMERGE) -o - ../po/$*.po dnsmasq.pot | $(MSGFMT) -o $*.mo -
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
for f in *; do for f in *; do
if [ -d $f ]; then if [ -d $f ]; then
install -m 755 -d $1/$f/man8 $2 -m 755 -d $1/$f/man8
install -m 644 $f/dnsmasq.8 $1/$f/man8 $2 -m 644 $f/dnsmasq.8 $1/$f/man8
echo installing $1/$f/man8/dnsmasq.8 echo installing $1/$f/man8/dnsmasq.8
fi fi
done done
#!/bin/sh #!/bin/sh
for f in *.mo; do for f in *.mo; do
install -m 755 -d $1/${f%.mo}/LC_MESSAGES $2 -m 755 -d $1/${f%.mo}/LC_MESSAGES
install -m 644 $f $1/${f%.mo}/LC_MESSAGES/dnsmasq.mo $2 -m 644 $f $1/${f%.mo}/LC_MESSAGES/dnsmasq.mo
echo installing $1/${f%.mo}/LC_MESSAGES/dnsmasq.mo echo installing $1/${f%.mo}/LC_MESSAGES/dnsmasq.mo
done done
......
#!/bin/sh #!/bin/sh
if grep "^\#.*define.*HAVE_DBUS" config.h 2>&1 >/dev/null || \ search=$1
grep HAVE_DBUS 2>&1 >/dev/null ; then shift
if grep "^\#.*define.*$search" config.h 2>&1 >/dev/null || \
grep $search 2>&1 >/dev/null ; then
exec $* exec $*
fi fi
......
...@@ -396,6 +396,11 @@ ...@@ -396,6 +396,11 @@
# the user dnsmasq is running as will be send over the net. # the user dnsmasq is running as will be send over the net.
#tftp-secure #tftp-secure
# This option stops dnsmasq from negotiating a larger blocksize for TFTP
# transfers. It will slow things down, but may rescue some broken TFTP
# clients.
#tftp-no-blocksize
# Set the boot file name only when the "red" tag is set. # Set the boot file name only when the "red" tag is set.
#dhcp-boot=net:red,pxelinux.red-net #dhcp-boot=net:red,pxelinux.red-net
......
...@@ -45,7 +45,8 @@ additional hosts file. If a directory is given, then read all the files containe ...@@ -45,7 +45,8 @@ additional hosts file. If a directory is given, then read all the files containe
.TP .TP
.B \-E, --expand-hosts .B \-E, --expand-hosts
Add the domain to simple names (without a period) in /etc/hosts Add the domain to simple names (without a period) in /etc/hosts
in the same way as for DHCP-derived names. in the same way as for DHCP-derived names. Note that this does not
apply to domain names in cnames, PTR records, TXT records etc.
.TP .TP
.B \-T, --local-ttl=<time> .B \-T, --local-ttl=<time>
When replying with information from /etc/hosts or the DHCP leases When replying with information from /etc/hosts or the DHCP leases
...@@ -547,7 +548,12 @@ the file will be re-read when dnsmasq receives SIGHUP. ...@@ -547,7 +548,12 @@ the file will be re-read when dnsmasq receives SIGHUP.
.B --dhcp-optsfile=<file> .B --dhcp-optsfile=<file>
Read DHCP option information from the specified file. The advantage of Read DHCP option information from the specified file. The advantage of
using this option is the same as for --dhcp-hostsfile: the using this option is the same as for --dhcp-hostsfile: the
dhcp-optsfile will be re-read when dnsmasq receives SIGHUP. dhcp-optsfile will be re-read when dnsmasq receives SIGHUP. Note that
it is possible to encode the information in a
.B --dhcp-boot
flag as DHCP options, using the options names bootfile-name,
server-ip-address and tftp-server. This allows these to be included
in a dhcp-optsfile.
.TP .TP
.B \-Z, --read-ethers .B \-Z, --read-ethers
Read /etc/ethers for information about hosts for the DHCP server. The Read /etc/ethers for information about hosts for the DHCP server. The
...@@ -842,8 +848,9 @@ The environment is inherited from the invoker of dnsmasq, and if the ...@@ -842,8 +848,9 @@ The environment is inherited from the invoker of dnsmasq, and if the
host provided a client-id, this is stored in the environment variable host provided a client-id, this is stored in the environment variable
DNSMASQ_CLIENT_ID. If the fully-qualified domain name of the host is DNSMASQ_CLIENT_ID. If the fully-qualified domain name of the host is
known, the domain part is stored in DNSMASQ_DOMAIN. known, the domain part is stored in DNSMASQ_DOMAIN.
If the client provides vendor-class or user-class If the client provides vendor-class, hostname or user-class,
information, these are provided in DNSMASQ_VENDOR_CLASS and these are provided in DNSMASQ_VENDOR_CLASS
DNSMASQ_SUPPLIED_HOSTNAME and
DNSMASQ_USER_CLASS0..DNSMASQ_USER_CLASSn variables, but only for DNSMASQ_USER_CLASS0..DNSMASQ_USER_CLASSn variables, but only for
"add" actions or "old" actions when a host resumes an existing lease, "add" actions or "old" actions when a host resumes an existing lease,
since these data are not held in dnsmasq's lease since these data are not held in dnsmasq's lease
...@@ -857,7 +864,8 @@ removed, an "old" event is generated with the new state of the lease, ...@@ -857,7 +864,8 @@ removed, an "old" event is generated with the new state of the lease,
ie no name, and the former name is provided in the environment ie no name, and the former name is provided in the environment
variable DNSMASQ_OLD_HOSTNAME. DNSMASQ_INTERFACE stores the name of variable DNSMASQ_OLD_HOSTNAME. DNSMASQ_INTERFACE stores the name of
the interface on which the request arrived; this is not set for "old" the interface on which the request arrived; this is not set for "old"
actions when dnsmasq restarts. actions when dnsmasq restarts. DNSMASQ_RELAY_ADDRESS is set if the client
used a DHCP relay to contact dnsmasq and the IP address of the relay is known.
All file descriptors are All file descriptors are
closed except stdin, stdout and stderr which are open to /dev/null closed except stdin, stdout and stderr which are open to /dev/null
(except in debug mode). (except in debug mode).
...@@ -995,10 +1003,11 @@ of concurrent TFTP connections is limited by the size of the port range. ...@@ -995,10 +1003,11 @@ of concurrent TFTP connections is limited by the size of the port range.
Specify a different configuration file. The conf-file option is also allowed in Specify a different configuration file. The conf-file option is also allowed in
configuration files, to include multiple configuration files. configuration files, to include multiple configuration files.
.TP .TP
.B \-7, --conf-dir=<directory> .B \-7, --conf-dir=<directory>[,<file-extension>......]
Read all the files in the given directory as configuration Read all the files in the given directory as configuration
files. Files whose names end in ~ or start with . or start and end files. If extension(s) are given, any files which end in those
with # are skipped. This flag may be given on the command extensions are skipped. Any files whose names end in ~ or start with . or start and end
with # are always skipped. This flag may be given on the command
line or in a configuration file. line or in a configuration file.
.SH CONFIG FILE .SH CONFIG FILE
At startup, dnsmasq reads At startup, dnsmasq reads
...@@ -1238,6 +1247,24 @@ or an additional hosts file. The list can be very long, ...@@ -1238,6 +1247,24 @@ or an additional hosts file. The list can be very long,
dnsmasq has been tested successfully with one million names. That size dnsmasq has been tested successfully with one million names. That size
file needs a 1GHz processor and about 60Mb of RAM. file needs a 1GHz processor and about 60Mb of RAM.
.SH INTERNATIONALISATION
Dnsmasq can be compiled to support internationalisation. To do this,
the make targets "all-i18n" and "install-i18n" should be used instead of
the standard targets "all" and "install". When internationalisation
is compiled in, dnsmasq will produce log messages in the local
language and support internationalised domain names (IDN). Domain
names in /etc/hosts, /etc/ethers and /etc/dnsmasq.conf which contain
non-ASCII characters will be translated to the DNS-internal punycode
representation. Note that
dnsmasq determines both the language for messages and the assumed
charset for configuration
files from the LANG environment variable. This should be set to the system
default value by the script which is responsible for starting
dnsmasq. When editing the configuration files, be careful to do so
using only the system-default locale and not user-specific one, since
dnsmasq has no direct way of determining the charset in use, and must
assume that it is the system default.
.SH FILES .SH FILES
.IR /etc/dnsmasq.conf .IR /etc/dnsmasq.conf
......
...@@ -51,7 +51,8 @@ fichiers contenus dans ce répertoire. ...@@ -51,7 +51,8 @@ fichiers contenus dans ce répertoire.
.B \-E, --expand-hosts .B \-E, --expand-hosts
Ajoute le nom de domaine aux noms simples (ne contenant pas de point dans le Ajoute le nom de domaine aux noms simples (ne contenant pas de point dans le
nom) contenus dans le fichier /etc/hosts, de la même façon que pour le service nom) contenus dans le fichier /etc/hosts, de la même façon que pour le service
DHCP. DHCP. Notez que cela ne s'applique pas au nom de domaine dans les CNAME, les
enregistrements PTR, TXT, etc...
.TP .TP
.B \-T, --local-ttl=<durée> .B \-T, --local-ttl=<durée>
Lorsque Dnsmasq répond avec une information provenant du fichier /etc/hosts ou Lorsque Dnsmasq répond avec une information provenant du fichier /etc/hosts ou
...@@ -634,7 +635,11 @@ relu lorsque Dnsmasq reçoit un signal SIGHUP. ...@@ -634,7 +635,11 @@ relu lorsque Dnsmasq reçoit un signal SIGHUP.
.B --dhcp-optsfile=<fichier> .B --dhcp-optsfile=<fichier>
Lis les informations relatives aux options DHCP dans le fichier spécifié. Lis les informations relatives aux options DHCP dans le fichier spécifié.
L'intérêt d'utiliser cette option est le même que pour --dhcp-hostsfile : le L'intérêt d'utiliser cette option est le même que pour --dhcp-hostsfile : le
fichier spécifié ser rechargé à la réception par dnsmasq d'un signal SIGHUP. fichier spécifié sera rechargé à la réception par dnsmasq d'un signal SIGHUP.
Notez qu'il est possible d'encoder l'information via
.B --dhcp-boot
en utilisant les noms optionnels bootfile-name, server-ip-address et
tftp-server. Ceci permet d'inclure ces options dans un fichier "dhcp-optsfile".DNSMASQ_SUPPLIED_HOSTNAME
.TP .TP
.B \-Z, --read-ethers .B \-Z, --read-ethers
Lis les informations d'hôtes DHCP dans le fichier /etc/ethers. Le format de Lis les informations d'hôtes DHCP dans le fichier /etc/ethers. Le format de
...@@ -961,22 +966,25 @@ L'environnement est hérité de celui de l'invocation du processus Dnsmasq, et ...@@ -961,22 +966,25 @@ L'environnement est hérité de celui de l'invocation du processus Dnsmasq, et
si l'hôte fournit un identifiant de client, celui-ci est stocké dans la si l'hôte fournit un identifiant de client, celui-ci est stocké dans la
variable d'environnement DNSMASQ_CLIENT_ID. Si un nom de domaine pleinement variable d'environnement DNSMASQ_CLIENT_ID. Si un nom de domaine pleinement
qualifié (FQDN) est connu pour l'hôte, la part relative au domaine est stockée qualifié (FQDN) est connu pour l'hôte, la part relative au domaine est stockée
dans DNSMASQ_DOMAIN. Si le client fournit une information de classe de vendeur dans DNSMASQ_DOMAIN. Si le client fournit une information de classe de vendeur,
ou de classe d'utilisateur, celles-ci sont positionnées dans les variables de classe d'utilisateur ou un nom d'hôte, celles-ci sont positionnées dans les
DNSMASQ_VENDOR_CLASS et DNSMASQ_USER_CLASS0 à DNSMASQ_USER_CLASSn variables DNSMASQ_VENDOR_CLASS et DNSMASQ_USER_CLASS0 à DNSMASQ_USER_CLASSn
respectivement, mais seulement pour les actions "add" et "old" lorsqu'un hôte et DNSMASQ_SUPPLIED_HOSTNAME respectivement, mais seulement pour les actions
reprend un bail existant, ces variables n'étant pas stockées dans la base de "add" et "old" lorsqu'un hôte reprend un bail existant, ces variables n'étant
baux de Dnsmasq. Si Dnsmasq a été compilé avec l'option HAVE_BROKEN_RTC pas stockées dans la base de baux de Dnsmasq. Si Dnsmasq a été compilé avec
("horloge RTC défectueuse"), alors la durée du bail (en secondes) est stockée l'option HAVE_BROKEN_RTC ("horloge RTC défectueuse"), alors la durée du bail
dans la variable DNSMASQ_LEASE_LENGTH, sinon la date d'expiration du bail est (en secondes) est stockée dans la variable DNSMASQ_LEASE_LENGTH, sinon la date
toujours stocké dans la variable d'environnement DNSMASQ_LEASE_EXPIRES. Le d'expiration du bail est toujours stocké dans la variable d'environnement
nombre de secondes avant expiration est toujours stocké dans DNSMASQ_LEASE_EXPIRES. Le nombre de secondes avant expiration est toujours
DNSMASQ_TIME_REMAINING. Si un bail était associé à un nom d'hôte et que celui-ci stocké dans DNSMASQ_TIME_REMAINING. Si un bail était associé à un nom d'hôte et
est supprimé, un évênement de type "old" est généré avec le nouveau statut du que celui-ci est supprimé, un évênement de type "old" est généré avec le
bail, c-à-d sans nom d'hôte, et le nom initial est fourni dans la variable nouveau statut du bail, c-à-d sans nom d'hôte, et le nom initial est fourni
d'environnement DNSMASQ_OLD_HOSTNAME. La variable DNSMASQ_INTERFACE contient le nom de dans la variable d'environnement DNSMASQ_OLD_HOSTNAME. La variable
l'interface sur laquelle la requête est arrivée; ceci n'est pas renseigné DNSMASQ_INTERFACE contient le nom de l'interface sur laquelle la requête est
dans le cas des actions "old" ayant lieu après un redémarrage de dnsmasq. arrivée; ceci n'est pas renseigné dans le cas des actions "old" ayant lieu
après un redémarrage de dnsmasq. La variable DNSMASQ_RELAY_ADDRESS est
renseignée si le client a utilisé un relai DHCP pour contacter Dnsmasq, si
l'adresse IP du relai est connue.
Tous les descripteurs de fichiers sont fermés, sauf stdin, stdout et stderr qui Tous les descripteurs de fichiers sont fermés, sauf stdin, stdout et stderr qui
sont ouverts sur /dev/null (sauf en mode déverminage). sont ouverts sur /dev/null (sauf en mode déverminage).
Le script n'est pas lancé de manière concurrente : si un autre changement de Le script n'est pas lancé de manière concurrente : si un autre changement de
...@@ -1152,10 +1160,12 @@ Spécifie un fichier de configuration différent. L'option "conf-file" est ...@@ -1152,10 +1160,12 @@ Spécifie un fichier de configuration différent. L'option "conf-file" est
également autorisée dans des fichiers de configuration, ce qui permet également autorisée dans des fichiers de configuration, ce qui permet
l'inclusion de multiples fichiers de configuration. l'inclusion de multiples fichiers de configuration.
.TP .TP
.B \-7, --conf-dir=<répertoire> .B \-7, --conf-dir=<répertoire>[,<extension de fichier>...]
Lis tous les fichiers du répertoire spécifié et les traite comme des fichiers de Lis tous les fichiers du répertoire spécifié et les traite comme des fichiers de
configuration. Les fichiers dont les noms se terminent en ~ ou commençant par ., configuration. Si des extensions sont données, tout fichier finissant par ces
ainsi que ceux commençant ou se terminant par # ne sont pas pris en compte. extensions seront ignorés. Tout fichier dont le nom se termine en ~ ou commence
par ., ainsi que ceux commençant ou se terminant par # seront systématiquement
ignorés.
Cette option peut être donnée en ligne de commande ou dans un fichier de Cette option peut être donnée en ligne de commande ou dans un fichier de
configuration. configuration.
.SH FICHIER DE CONFIGURATION .SH FICHIER DE CONFIGURATION
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -226,7 +226,7 @@ char *cache_get_name(struct crec *crecp) ...@@ -226,7 +226,7 @@ char *cache_get_name(struct crec *crecp)
{ {
if (crecp->flags & F_BIGNAME) if (crecp->flags & F_BIGNAME)
return crecp->name.bname->name; return crecp->name.bname->name;
else if (crecp->flags & F_DHCP) else if (crecp->flags & (F_DHCP | F_CONFIG))
return crecp->name.namep; return crecp->name.namep;
return crecp->name.sname; return crecp->name.sname;
...@@ -366,7 +366,7 @@ struct crec *cache_insert(char *name, struct all_addr *addr, ...@@ -366,7 +366,7 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
log_query(flags | F_UPSTREAM, name, addr, NULL); log_query(flags | F_UPSTREAM, name, addr, NULL);
/* CONFIG bit no needed except for logging */ /* CONFIG bit means something else when stored in cache entries */
flags &= ~F_CONFIG; flags &= ~F_CONFIG;
/* if previous insertion failed give up now. */ /* if previous insertion failed give up now. */
...@@ -693,10 +693,10 @@ static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrl ...@@ -693,10 +693,10 @@ static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrl
if (!nameexists) if (!nameexists)
for (a = daemon->cnames; a; a = a->next) for (a = daemon->cnames; a; a = a->next)
if (hostname_isequal(cache->name.sname, a->target) && if (hostname_isequal(cache->name.sname, a->target) &&
(lookup = whine_malloc(sizeof(struct crec) + strlen(a->alias)+1-SMALLDNAME))) (lookup = whine_malloc(sizeof(struct crec))))
{ {
lookup->flags = F_FORWARD | F_IMMORTAL | F_HOSTS | F_CNAME; lookup->flags = F_FORWARD | F_IMMORTAL | F_CONFIG | F_HOSTS | F_CNAME;
strcpy(lookup->name.sname, a->alias); lookup->name.namep = a->alias;
lookup->addr.cname.cache = cache; lookup->addr.cname.cache = cache;
lookup->addr.cname.uid = index; lookup->addr.cname.uid = index;
cache_hash(lookup); cache_hash(lookup);
...@@ -821,35 +821,38 @@ static int read_hostsfile(char *filename, int index, int cache_size) ...@@ -821,35 +821,38 @@ static int read_hostsfile(char *filename, int index, int cache_size)
while (atnl == 0) while (atnl == 0)
{ {
struct crec *cache; struct crec *cache;
int fqdn; int fqdn, nomem;
char *canon;
if ((atnl = gettok(f, token)) == EOF) if ((atnl = gettok(f, token)) == EOF)
break; break;
fqdn = !!strchr(token, '.'); fqdn = !!strchr(token, '.');
if (canonicalise(token)) if ((canon = canonicalise(token, &nomem)))
{ {
/* If set, add a version of the name with a default domain appended */ /* If set, add a version of the name with a default domain appended */
if ((daemon->options & OPT_EXPAND) && domain_suffix && !fqdn && if ((daemon->options & OPT_EXPAND) && domain_suffix && !fqdn &&
(cache = whine_malloc(sizeof(struct crec) + (cache = whine_malloc(sizeof(struct crec) +
strlen(token)+2+strlen(domain_suffix)-SMALLDNAME))) strlen(canon)+2+strlen(domain_suffix)-SMALLDNAME)))
{ {
strcpy(cache->name.sname, token); strcpy(cache->name.sname, canon);
strcat(cache->name.sname, "."); strcat(cache->name.sname, ".");
strcat(cache->name.sname, domain_suffix); strcat(cache->name.sname, domain_suffix);
add_hosts_entry(cache, &addr, addrlen, flags, index, addr_dup); add_hosts_entry(cache, &addr, addrlen, flags, index, addr_dup);
addr_dup = 1; addr_dup = 1;
name_count++; name_count++;
} }
if ((cache = whine_malloc(sizeof(struct crec) + strlen(token)+1-SMALLDNAME))) if ((cache = whine_malloc(sizeof(struct crec) + strlen(canon)+1-SMALLDNAME)))
{ {
strcpy(cache->name.sname, token); strcpy(cache->name.sname, canon);
add_hosts_entry(cache, &addr, addrlen, flags, index, addr_dup); add_hosts_entry(cache, &addr, addrlen, flags, index, addr_dup);
name_count++; name_count++;
} }
free(canon);
} }
else else if (!nomem)
my_syslog(LOG_ERR, _("bad name at %s line %d"), filename, lineno); my_syslog(LOG_ERR, _("bad name at %s line %d"), filename, lineno);
} }
} }
...@@ -1103,7 +1106,7 @@ void cache_add_dhcp_entry(char *host_name, ...@@ -1103,7 +1106,7 @@ void cache_add_dhcp_entry(char *host_name,
if (aliasc) if (aliasc)
{ {
aliasc->flags = F_FORWARD | F_DHCP | F_CNAME; aliasc->flags = F_FORWARD | F_CONFIG | F_DHCP | F_CNAME;
if (ttd == 0) if (ttd == 0)
aliasc->flags |= F_IMMORTAL; aliasc->flags |= F_IMMORTAL;
else else
...@@ -1285,12 +1288,12 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr, char *ar ...@@ -1285,12 +1288,12 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr, char *ar
dest = "<CNAME>"; dest = "<CNAME>";
} }
if (flags & F_DHCP) if (flags & F_CONFIG)
source = "config";
else if (flags & F_DHCP)
source = "DHCP"; source = "DHCP";
else if (flags & F_HOSTS) else if (flags & F_HOSTS)
source = arg; source = arg;
else if (flags & F_CONFIG)
source = "config";
else if (flags & F_UPSTREAM) else if (flags & F_UPSTREAM)
source = "reply"; source = "reply";
else if (flags & F_SERVER) else if (flags & F_SERVER)
......
...@@ -14,13 +14,15 @@ ...@@ -14,13 +14,15 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define VERSION "2.50" #define VERSION "2.51"
#define FTABSIZ 150 /* max number of outstanding requests (default) */ #define FTABSIZ 150 /* max number of outstanding requests (default) */
#define MAX_PROCS 20 /* max no children for TCP requests */ #define MAX_PROCS 20 /* max no children for TCP requests */
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */ #define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
#define EDNS_PKTSZ 1280 /* default max EDNS.0 UDP packet from RFC2671 */ #define EDNS_PKTSZ 1280 /* default max EDNS.0 UDP packet from RFC2671 */
#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */ #define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
#define FORWARD_TEST 50 /* try all servers every 50 queries */
#define FORWARD_TIME 10 /* or 10 seconds */
#define RANDOM_SOCKS 64 /* max simultaneous random ports */ #define RANDOM_SOCKS 64 /* max simultaneous random ports */
#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */ #define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
#define CACHESIZ 150 /* default cache size */ #define CACHESIZ 150 /* default cache size */
...@@ -126,6 +128,9 @@ HAVE_TFTP ...@@ -126,6 +128,9 @@ HAVE_TFTP
HAVE_DHCP HAVE_DHCP
define this to get dnsmasq's DHCP server. define this to get dnsmasq's DHCP server.
HAVE_SCRIPT
define this to get the ability to call scripts on lease-change
HAVE_GETOPT_LONG HAVE_GETOPT_LONG
define this if you have GNU libc or GNU getopt. define this if you have GNU libc or GNU getopt.
...@@ -162,6 +167,7 @@ NOTES: ...@@ -162,6 +167,7 @@ NOTES:
/* platform independent options- uncomment to enable */ /* platform independent options- uncomment to enable */
#define HAVE_DHCP #define HAVE_DHCP
#define HAVE_TFTP #define HAVE_TFTP
#define HAVE_SCRIPT
/* #define HAVE_BROKEN_RTC */ /* #define HAVE_BROKEN_RTC */
/* #define HAVE_DBUS */ /* #define HAVE_DBUS */
...@@ -175,6 +181,13 @@ NOTES: ...@@ -175,6 +181,13 @@ NOTES:
#undef HAVE_DHCP #undef HAVE_DHCP
#endif #endif
/* Allow scripts to be disabled with COPTS=-DNO_SCRIPT */
#ifdef NO_SCRIPT
#undef HAVE_SCRIPT
#endif
/* platform dependent options. */ /* platform dependent options. */
/* Must preceed __linux__ since uClinux defines __linux__ too. */ /* Must preceed __linux__ since uClinux defines __linux__ too. */
...@@ -273,3 +286,8 @@ NOTES: ...@@ -273,3 +286,8 @@ NOTES:
# define ADDRSTRLEN 16 /* 4*3 + 3 dots + NULL */ # define ADDRSTRLEN 16 /* 4*3 + 3 dots + NULL */
#endif #endif
/* Can't do scripts without fork */
#ifdef NOFORK
# undef HAVE_SCRIPT
#endif
...@@ -390,16 +390,25 @@ void check_dbus_listeners(fd_set *rset, fd_set *wset, fd_set *eset) ...@@ -390,16 +390,25 @@ void check_dbus_listeners(fd_set *rset, fd_set *wset, fd_set *eset)
} }
} }
void emit_dbus_signal(int action, char *mac, char *hostname, char *addr) void emit_dbus_signal(int action, struct dhcp_lease *lease, char *hostname)
{ {
DBusConnection *connection = (DBusConnection *)daemon->dbus; DBusConnection *connection = (DBusConnection *)daemon->dbus;
DBusMessage* message = NULL; DBusMessage* message = NULL;
DBusMessageIter args; DBusMessageIter args;
const char *action_str; char *action_str, *addr, *mac = daemon->namebuff;
unsigned char *p;
int i;
if (!connection) if (!connection)
return; return;
if (!hostname)
hostname = "";
p = extended_hwaddr(lease->hwaddr_type, lease->hwaddr_len,
lease->hwaddr, lease->clid_len, lease->clid, &i);
print_mac(mac, p, i);
if (action == ACTION_DEL) if (action == ACTION_DEL)
action_str = "DhcpLeaseDeleted"; action_str = "DhcpLeaseDeleted";
else if (action == ACTION_ADD) else if (action == ACTION_ADD)
...@@ -409,6 +418,8 @@ void emit_dbus_signal(int action, char *mac, char *hostname, char *addr) ...@@ -409,6 +418,8 @@ void emit_dbus_signal(int action, char *mac, char *hostname, char *addr)
else else
return; return;
addr = inet_ntoa(lease->addr);
if (!(message = dbus_message_new_signal(DNSMASQ_PATH, DNSMASQ_SERVICE, action_str))) if (!(message = dbus_message_new_signal(DNSMASQ_PATH, DNSMASQ_SERVICE, action_str)))
return; return;
......
...@@ -754,6 +754,8 @@ void dhcp_read_ethers(void) ...@@ -754,6 +754,8 @@ void dhcp_read_ethers(void)
while (fgets(buff, MAXDNAME, f)) while (fgets(buff, MAXDNAME, f))
{ {
char *host = NULL;
lineno++; lineno++;
while (strlen(buff) > 0 && isspace((int)buff[strlen(buff)-1])) while (strlen(buff) > 0 && isspace((int)buff[strlen(buff)-1]))
...@@ -792,19 +794,28 @@ void dhcp_read_ethers(void) ...@@ -792,19 +794,28 @@ void dhcp_read_ethers(void)
} }
else else
{ {
if (!canonicalise(ip)) int nomem;
if (!(host = canonicalise(ip, &nomem)) || !legal_hostname(host))
{ {
if (!nomem)
my_syslog(MS_DHCP | LOG_ERR, _("bad name at %s line %d"), ETHERSFILE, lineno); my_syslog(MS_DHCP | LOG_ERR, _("bad name at %s line %d"), ETHERSFILE, lineno);
free(host);
continue; continue;
} }
flags = CONFIG_NAME; flags = CONFIG_NAME;
for (config = daemon->dhcp_conf; config; config = config->next) for (config = daemon->dhcp_conf; config; config = config->next)
if ((config->flags & CONFIG_NAME) && hostname_isequal(config->hostname, ip)) if ((config->flags & CONFIG_NAME) && hostname_isequal(config->hostname, host))
break; break;
} }
if (config && (config->flags & CONFIG_FROM_ETHERS))
{
my_syslog(MS_DHCP | LOG_ERR, _("ignoring %s line %d, duplicate name or IP address"), ETHERSFILE, lineno);
continue;
}
if (!config) if (!config)
{ {
for (config = daemon->dhcp_conf; config; config = config->next) for (config = daemon->dhcp_conf; config; config = config->next)
...@@ -834,10 +845,8 @@ void dhcp_read_ethers(void) ...@@ -834,10 +845,8 @@ void dhcp_read_ethers(void)
if (flags & CONFIG_NAME) if (flags & CONFIG_NAME)
{ {
if ((config->hostname = whine_malloc(strlen(ip)+1))) config->hostname = host;
strcpy(config->hostname, ip); host = NULL;
else
config->flags &= ~CONFIG_NAME;
} }
if (flags & CONFIG_ADDR) if (flags & CONFIG_ADDR)
...@@ -856,6 +865,9 @@ void dhcp_read_ethers(void) ...@@ -856,6 +865,9 @@ void dhcp_read_ethers(void)
config->hwaddr->next = NULL; config->hwaddr->next = NULL;
} }
count++; count++;
free(host);
} }
fclose(f); fclose(f);
...@@ -945,7 +957,8 @@ void dhcp_update_configs(struct dhcp_config *configs) ...@@ -945,7 +957,8 @@ void dhcp_update_configs(struct dhcp_config *configs)
/* If we've not found a hostname any other way, try and see if there's one in /etc/hosts /* If we've not found a hostname any other way, try and see if there's one in /etc/hosts
for this address. If it has a domain part, that must match the set domain and for this address. If it has a domain part, that must match the set domain and
it gets stripped. */ it gets stripped. The set of legal domain names is bigger than the set of legal hostnames
so check here that the domain name is legal as a hostname. */
char *host_from_dns(struct in_addr addr) char *host_from_dns(struct in_addr addr)
{ {
struct crec *lookup; struct crec *lookup;
...@@ -963,7 +976,7 @@ char *host_from_dns(struct in_addr addr) ...@@ -963,7 +976,7 @@ char *host_from_dns(struct in_addr addr)
hostname[255] = 0; hostname[255] = 0;
d1 = strip_hostname(hostname); d1 = strip_hostname(hostname);
d2 = get_domain(addr); d2 = get_domain(addr);
if (d1 && (!d2 || hostname_isequal(d1, d2))) if (!legal_hostname(hostname) || (d1 && (!d2 || !hostname_isequal(d1, d2))))
hostname = NULL; hostname = NULL;
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -262,10 +262,14 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, ...@@ -262,10 +262,14 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
if (type != 0 || (daemon->options & OPT_ORDER)) if (type != 0 || (daemon->options & OPT_ORDER))
start = daemon->servers; start = daemon->servers;
else if (!(start = daemon->last_server)) else if (!(start = daemon->last_server) ||
daemon->forwardcount++ > FORWARD_TEST ||
difftime(now, daemon->forwardtime) > FORWARD_TIME)
{ {
start = daemon->servers; start = daemon->servers;
forward->forwardall = 1; forward->forwardall = 1;
daemon->forwardcount = 0;
daemon->forwardtime = now;
} }
} }
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -119,7 +119,7 @@ static int iface_allowed(struct irec **irecp, int if_index, ...@@ -119,7 +119,7 @@ static int iface_allowed(struct irec **irecp, int if_index,
union mysockaddr *addr, struct in_addr netmask) union mysockaddr *addr, struct in_addr netmask)
{ {
struct irec *iface; struct irec *iface;
int fd; int fd, mtu = 0, loopback;
struct ifreq ifr; struct ifreq ifr;
int dhcp_ok = 1; int dhcp_ok = 1;
struct iname *tmp; struct iname *tmp;
...@@ -143,11 +143,16 @@ static int iface_allowed(struct irec **irecp, int if_index, ...@@ -143,11 +143,16 @@ static int iface_allowed(struct irec **irecp, int if_index,
return 0; return 0;
} }
loopback = ifr.ifr_flags & IFF_LOOPBACK;
if (ioctl(fd, SIOCGIFMTU, &ifr) != -1)
mtu = ifr.ifr_mtu;
close(fd); close(fd);
/* If we are restricting the set of interfaces to use, make /* If we are restricting the set of interfaces to use, make
sure that loopback interfaces are in that set. */ sure that loopback interfaces are in that set. */
if (daemon->if_names && (ifr.ifr_flags & IFF_LOOPBACK)) if (daemon->if_names && loopback)
{ {
struct iname *lo; struct iname *lo;
for (lo = daemon->if_names; lo; lo = lo->next) for (lo = daemon->if_names; lo; lo = lo->next)
...@@ -188,6 +193,7 @@ static int iface_allowed(struct irec **irecp, int if_index, ...@@ -188,6 +193,7 @@ static int iface_allowed(struct irec **irecp, int if_index,
iface->addr = *addr; iface->addr = *addr;
iface->netmask = netmask; iface->netmask = netmask;
iface->dhcp_ok = dhcp_ok; iface->dhcp_ok = dhcp_ok;
iface->mtu = mtu;
iface->next = *irecp; iface->next = *irecp;
*irecp = iface; *irecp = iface;
return 1; return 1;
......
This diff is collapsed.
...@@ -138,7 +138,8 @@ static int extract_name(HEADER *header, size_t plen, unsigned char **pp, ...@@ -138,7 +138,8 @@ static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
for(j=0; j<l; j++, p++) for(j=0; j<l; j++, p++)
if (isExtract) if (isExtract)
{ {
if (legal_char(*p)) unsigned char c = *p;
if (isascii(c) && !iscntrl(c) && c != '.')
*cp++ = *p; *cp++ = *p;
else else
return 0; return 0;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment