Commit 7622fc06 authored by Simon Kelley's avatar Simon Kelley

import of dnsmasq-2.48.tar.gz

parent 73a08a24
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -23,24 +23,19 @@ PO = po ...@@ -23,24 +23,19 @@ PO = po
MAN = man MAN = man
PKG_CONFIG = pkg-config PKG_CONFIG = pkg-config
AWK = nawk
INSTALL = install INSTALL = install
DBUS_MINOR=" `echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --modversion dbus-1 | $(AWK) -F . -- '{ if ($$(NF-1)) print \"-DDBUS_MINOR=\"$$(NF-1) }'`"
DBUS_CFLAGS="`echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --cflags dbus-1`" DBUS_CFLAGS="`echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --cflags dbus-1`"
DBUS_LIBS=" `echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --libs dbus-1`" DBUS_LIBS=" `echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --libs dbus-1`"
SUNOS_VER=" `if uname | grep SunOS 2>&1 >/dev/null; then uname -r | $(AWK) -F . -- '{ print \"-DSUNOS_VER=\"$$2 }'; fi`"
SUNOS_LIBS=" `if uname | grep SunOS 2>&1 >/dev/null; then echo -lsocket -lnsl -lposix4; fi `" 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_MINOR=$(DBUS_MINOR) \
DBUS_CFLAGS=$(DBUS_CFLAGS) \ DBUS_CFLAGS=$(DBUS_CFLAGS) \
DBUS_LIBS=$(DBUS_LIBS) \ DBUS_LIBS=$(DBUS_LIBS) \
SUNOS_LIBS=$(SUNOS_LIBS) \ SUNOS_LIBS=$(SUNOS_LIBS) \
SUNOS_VER=$(SUNOS_VER) \
-f ../bld/Makefile dnsmasq -f ../bld/Makefile dnsmasq
clean : clean :
...@@ -57,11 +52,9 @@ install-common : ...@@ -57,11 +52,9 @@ install-common :
all-i18n : all-i18n :
cd $(SRC) && $(MAKE) \ cd $(SRC) && $(MAKE) \
I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' \ I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' \
DBUS_MINOR=$(DBUS_MINOR) \
DBUS_CFLAGS=$(DBUS_CFLAGS) \ DBUS_CFLAGS=$(DBUS_CFLAGS) \
DBUS_LIBS=$(DBUS_LIBS) \ DBUS_LIBS=$(DBUS_LIBS) \
SUNOS_LIBS=$(SUNOS_LIBS) \ SUNOS_LIBS=$(SUNOS_LIBS) \
SUNOS_VER=$(SUNOS_VER) \
-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) -f ../bld/Makefile $${f%.po}.mo; \
......
A remake of patch Bob Carroll had posted to dnsmasq,
now compatible with version 2.47. Hopefully he doesn't
mind (sending a copy of this mail to him too).
Maybe the patch in question is not acceptible
as it doesn't add new switch, rather it binds itself to "strict-order".
What it does is: if you have strict-order in the
dnsmasq config file and query a domain that would result
in NXDOMAIN, it iterates the whole given nameserver list
until the last one says NXDOMAIN.
diff -ur dnsmasq-2.47/src/forward.c dnsmasq-2.47-patched/src/forward.c
--- dnsmasq-2.47/src/forward.c 2009-02-01 17:59:48.000000000 +0200
+++ dnsmasq-2.47-patched/src/forward.c 2009-03-18 19:10:22.000000000 +0200
@@ -488,9 +488,12 @@
return;
server = forward->sentto;
+
+ if ( (header->rcode == NXDOMAIN) && ((daemon->options & OPT_ORDER) != 0) && (server->next != NULL) )
+ header->rcode = SERVFAIL;
if ((header->rcode == SERVFAIL || header->rcode == REFUSED) &&
- !(daemon->options & OPT_ORDER) &&
+ ((daemon->options & OPT_ORDER) != 0) &&
forward->forwardall == 0)
/* for broken servers, attempt to send to another one. */
{
...@@ -329,7 +329,7 @@ ...@@ -329,7 +329,7 @@
# Reboot time. (Note 'i' to send 32-bit value) # Reboot time. (Note 'i' to send 32-bit value)
#dhcp-option-force=211,30i #dhcp-option-force=211,30i
# Set the boot filename for BOOTP. You will only need # Set the boot filename for netboot/PXE. You will only need
# this is you want to boot machines over the network and you will need # this is you want to boot machines over the network and you will need
# a TFTP server; either dnsmasq's built in TFTP server or an # a TFTP server; either dnsmasq's built in TFTP server or an
# external one. (See below for how to enable the TFTP server.) # external one. (See below for how to enable the TFTP server.)
...@@ -358,6 +358,34 @@ ...@@ -358,6 +358,34 @@
#dhcp-match=hammers, option:client-arch, 6 #x86-64 #dhcp-match=hammers, option:client-arch, 6 #x86-64
#dhcp-match=mactels, option:client-arch, 7 #EFI x86-64 #dhcp-match=mactels, option:client-arch, 7 #EFI x86-64
# Do real PXE, rather than just booting a single file, this is an
# alternative to dhcp-boot.
#pxe-prompt="What system shall I netboot?"
# or with timeout before first available action is taken:
#pxe-prompt="Press F8 for menu.", 60
# Available boot services. for PXE.
#pxe-service=x86PC, "Boot from local disk", 0
# Loads <tftp-root>/pxelinux.0 from dnsmasq TFTP server.
#pxe-service=x86PC, "Install Linux", pxelinux
# Loads <tftp-root>/pxelinux.0 from TFTP server at 1.2.3.4.
# Beware this fails on old PXE ROMS.
#pxe-service=x86PC, "Install Linux", pxelinux, 1.2.3.4
# Use bootserver on network, found my multicast or broadcast.
#pxe-service=x86PC, "Install windows from RIS server", 1
# Use bootserver at a known IP address.
#pxe-service=x86PC, "Install windows from RIS server", 1, 1.2.3.4
# If you have multicast-FTP available,
# information for that can be passed in a similar way using options 1
# to 5. See page 19 of
# http://download.intel.com/design/archives/wfm/downloads/pxespec.pdf
# Enable dnsmasq's built-in TFTP server # Enable dnsmasq's built-in TFTP server
#enable-tftp #enable-tftp
...@@ -371,8 +399,9 @@ ...@@ -371,8 +399,9 @@
# 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
# An example of dhcp-boot with an external server: the name and IP # An example of dhcp-boot with an external TFTP server: the name and IP
# address of the server are given after the filename. # address of the server are given after the filename.
# Can fail with old PXE ROMS. Overridden by --pxe-service.
#dhcp-boot=/var/ftpd/pxelinux.0,boothost,192.168.0.3 #dhcp-boot=/var/ftpd/pxelinux.0,boothost,192.168.0.3
# Set the limit on DHCP leases, the default is 150 # Set the limit on DHCP leases, the default is 150
......
...@@ -11,7 +11,7 @@ Dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP ...@@ -11,7 +11,7 @@ Dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP
server and allows machines with DHCP-allocated addresses server and allows machines with DHCP-allocated addresses
to appear in the DNS with names configured either in each host or to appear in the DNS with names configured either in each host or
in a central configuration file. Dnsmasq supports static and dynamic in a central configuration file. Dnsmasq supports static and dynamic
DHCP leases and BOOTP/TFTP for network booting of diskless machines. DHCP leases and BOOTP/TFTP/PXE for network booting of diskless machines.
<P> <P>
Dnsmasq is targeted at home networks using NAT and Dnsmasq is targeted at home networks using NAT and
connected to the internet via a modem, cable-modem or ADSL connected to the internet via a modem, cable-modem or ADSL
...@@ -94,7 +94,10 @@ There is a good article about dnsmasq at <A ...@@ -94,7 +94,10 @@ There is a good article about dnsmasq at <A
HREF="http://www.enterprisenetworkingplanet.com/netos/article.php/3377351">http://www.enterprisenetworkingplanet.com/netos/article.php/3377351</A> HREF="http://www.enterprisenetworkingplanet.com/netos/article.php/3377351">http://www.enterprisenetworkingplanet.com/netos/article.php/3377351</A>
and another at <A and another at <A
HREF="http://www.linux.com/articles/149040">http://www.linux.com/articles/149040</A> HREF="http://www.linux.com/articles/149040">http://www.linux.com/articles/149040</A>
and Ilya Evseev has an article in Russian about dnsmasq to be found at <A HREF="http://ilya-evseev.narod.ru/articles/dnsmasq"> http://ilya-evseev.narod.ru/articles/dnsmasq</A> and Ilya Evseev has an article in Russian about dnsmasq to be found at
<A HREF="http://ilya-evseev.narod.ru/articles/dnsmasq">
http://ilya-evseev.narod.ru/articles/dnsmasq</A>. Ismael Ull has an
article about dnsmasq in Spanish at <A HREF="http://www.mey-online.com.ar/blog/index.php/archives/guia-rapida-de-dnsmasq">http://www.mey-online.com.ar/blog/index.php/archives/guia-rapida-de-dnsmasq</A>
<H2>License.</H2> <H2>License.</H2>
Dnsmasq is distributed under the GPL. See the file COPYING in the distribution Dnsmasq is distributed under the GPL. See the file COPYING in the distribution
for details. for details.
......
...@@ -31,13 +31,17 @@ BSD, unless the GNU getopt library is linked, the long form of the ...@@ -31,13 +31,17 @@ BSD, unless the GNU getopt library is linked, the long form of the
options does not work on the command line; it is still recognised in options does not work on the command line; it is still recognised in
the configuration file. the configuration file.
.TP .TP
.B --test
Read and syntax check configuration file(s). Exit with code 0 if all
is OK, or a non-zero code otherwise. Do not start up dnsmasq.
.TP
.B \-h, --no-hosts .B \-h, --no-hosts
Don't read the hostnames in /etc/hosts. Don't read the hostnames in /etc/hosts.
.TP .TP
.B \-H, --addn-hosts=<file> .B \-H, --addn-hosts=<file>
Additional hosts file. Read the specified file as well as /etc/hosts. If -h is given, read Additional hosts file. Read the specified file as well as /etc/hosts. If -h is given, read
only the specified file. This option may be repeated for more than one only the specified file. This option may be repeated for more than one
additional hosts file. additional hosts file. If a directory is given, then read all the files contained in that directory.
.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
...@@ -422,25 +426,22 @@ Set the maximum number of concurrent DNS queries. The default value is ...@@ -422,25 +426,22 @@ Set the maximum number of concurrent DNS queries. The default value is
where this needs to be increased is when using web-server log file where this needs to be increased is when using web-server log file
resolvers, which can generate large numbers of concurrent queries. resolvers, which can generate large numbers of concurrent queries.
.TP .TP
.B \-F, --dhcp-range=[[net:]network-id,]<start-addr>,<end-addr>[[,<netmask>],<broadcast>][,<default lease time>] .B \-F, --dhcp-range=[[net:]network-id,]<start-addr>,<end-addr>[[,<netmask>],<broadcast>][,<lease time>]
Enable the DHCP server. Addresses will be given out from the range Enable the DHCP server. Addresses will be given out from the range
<start-addr> to <end-addr> and from statically defined addresses given <start-addr> to <end-addr> and from statically defined addresses given
in in
.B dhcp-host .B dhcp-host
options. If the lease time is given, then leases options. If the lease time is given, then leases
will be given for that length of time. The lease time is in seconds, will be given for that length of time. The lease time is in seconds,
or minutes (eg 45m) or hours (eg 1h) or the literal "infinite". The or minutes (eg 45m) or hours (eg 1h) or "infinite". If not given,
the default lease time is one hour. The
minimum lease time is two minutes. This minimum lease time is two minutes. This
option may be repeated, with different addresses, to enable DHCP option may be repeated, with different addresses, to enable DHCP
service to more than one network. For directly connected networks (ie, service to more than one network. For directly connected networks (ie,
networks on which the machine running dnsmasq has an interface) the networks on which the machine running dnsmasq has an interface) the
netmask is optional. It is, however, required for networks which netmask is optional. It is, however, required for networks which
receive DHCP service via a relay agent. The broadcast address is receive DHCP service via a relay agent. The broadcast address is
always optional. On some broken systems, dnsmasq can listen on only always optional. It is always
one interface when using DHCP, and the name of that interface must be
given using the
.B interface
option. This limitation currently affects OpenBSD before version 4.0. It is always
allowed to have more than one dhcp-range in a single subnet. The optional allowed to have more than one dhcp-range in a single subnet. The optional
network-id is a alphanumeric label which marks this network so that network-id is a alphanumeric label which marks this network so that
dhcp options may be specified on a per-network basis. dhcp options may be specified on a per-network basis.
...@@ -449,10 +450,18 @@ a tag to matching it. Only one tag may be set, but more than one tag may be matc ...@@ -449,10 +450,18 @@ a tag to matching it. Only one tag may be set, but more than one tag may be matc
The end address may be replaced by the keyword The end address may be replaced by the keyword
.B static .B static
which tells dnsmasq to enable DHCP for the network specified, but not which tells dnsmasq to enable DHCP for the network specified, but not
to dynamically allocate IP addresses. Only hosts which have static to dynamically allocate IP addresses: only hosts which have static
addresses given via addresses given via
.B dhcp-host .B dhcp-host
or from /etc/ethers will be served. or from /etc/ethers will be served. The end address may be replaced by
the keyword
.B proxy
in which case dnsmasq will provide proxy-DHCP on the specified
subnet. (See
.B pxe-prompt
and
.B pxe-service
for details.)
.TP .TP
.B \-G, --dhcp-host=[<hwaddr>][,id:<client_id>|*][,net:<netid>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore] .B \-G, --dhcp-host=[<hwaddr>][,id:<client_id>|*][,net:<netid>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore]
Specify per host parameters for the DHCP server. This allows a machine Specify per host parameters for the DHCP server. This allows a machine
...@@ -720,6 +729,57 @@ is providing a TFTP service (see ...@@ -720,6 +729,57 @@ is providing a TFTP service (see
If the optional network-id(s) are given, If the optional network-id(s) are given,
they must match for this configuration to be sent. Note that they must match for this configuration to be sent. Note that
network-ids are prefixed by "net:" to distinguish them. network-ids are prefixed by "net:" to distinguish them.
.TP
.B --pxe-service=[net:<network-id>,]<CSA>,<menu text>,<basename>|<bootservicetype>[,<server address>]
Most uses of PXE boot-ROMS simply allow the PXE
system to obtain an IP address and then download the file specified by
.B dhcp-boot
and execute it. However the PXE system is capable of more complex
functions when supported by a suitable DHCP server.
This specifies a boot option which may appear in a PXE boot menu. <CSA> is
client system type, only services of the correct type will appear in a
menu. The known types are x86PC, PC98, IA64_EFI, Alpha, Arc_x86,
Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI and X86-64_EFI; an
integer may be used for other types. The
parameter after the menu text may be a file name, in which case dnsmasq acts as a
boot server and directs the PXE client to download the file by TFTP,
either from itself (
.B enable-tftp
must be set for this to work) or another TFTP server if the final IP
address is given.
Note that the "layer"
suffix (normally ".0") is supplied by PXE, and should not be added to
the basename. If an integer boot service type, rather than a basename
is given, then the PXE client will search for a
suitable boot service for that type on the network. This search may be done
by multicast or broadcast, or direct to a server if its IP address is provided. A boot service
type of 0 is special, and will abort the net boot procedure and
continue booting from local media.
.TP
.B --pxe-prompt=[net:<network-id>,]<prompt>[,<timeout>]
Setting this provides a prompt to be displayed after PXE boot. If the
timeout is given then after the
timeout has elapsed with no keyboard input, the first available menu
option will be automatically executed. If the timeout is zero then the first available menu
item will be executed immediately. If
.B pxe-prompt
is ommitted the system will wait for user input if there are multiple
items in the menu, but boot immediately if
there is only one. See
.B pxe-service
for details of menu items.
Dnsmasq supports PXE "proxy-DHCP", in this case another DHCP server on
the network is responsible for allocating IP addresses, and dnsmasq
simply provides the information given in
.B pxe-prompt
and
.B pxe-service
to allow netbooting. This mode is enabled using the
.B proxy
keyword in
.B dhcp-range.
.TP .TP
.B \-X, --dhcp-lease-max=<number> .B \-X, --dhcp-lease-max=<number>
Limits dnsmasq to the specified maximum number of DHCP leases. The Limits dnsmasq to the specified maximum number of DHCP leases. The
...@@ -829,8 +889,8 @@ to the client-id and lease length and expiry time. ...@@ -829,8 +889,8 @@ to the client-id and lease length and expiry time.
.TP .TP
.B --bridge-interface=<interface>,<alias>[,<alias>] .B --bridge-interface=<interface>,<alias>[,<alias>]
Treat DHCP request packets arriving at any of the <alias> interfaces Treat DHCP request packets arriving at any of the <alias> interfaces
as if they had arrived at <interface>. This option is only available as if they had arrived at <interface>. This option is necessary when
on BSD platforms, and is necessary when using "old style" bridging, since using "old style" bridging on BSD platforms, since
packets arrive at tap interfaces which don't have an IP address. packets arrive at tap interfaces which don't have an IP address.
.TP .TP
.B \-s, --domain=<domain>[,<address range>] .B \-s, --domain=<domain>[,<address range>]
......
...@@ -16,9 +16,8 @@ fichier /etc/hosts afin que les noms locaux n'apparaissant pas dans les DNS ...@@ -16,9 +16,8 @@ fichier /etc/hosts afin que les noms locaux n'apparaissant pas dans les DNS
globaux soient tout de même résolus, et assure également la résolution de nom globaux soient tout de même résolus, et assure également la résolution de nom
pour les hôtes présents dans le service DHCP. pour les hôtes présents dans le service DHCP.
.PP .PP
Le serveur DHCP Dnsmasq DHCP supporte les définitions d'adresses statiques, les Le serveur DHCP Dnsmasq DHCP supporte les définitions d'adresses statiques et les
réseaux multiples, le relai DHCP et les spécifications de sous-réseaux conformes réseaux multiples. Il envoie par défaut un jeu raisonnable de paramètres DHCP, et
à la RFC3011. Il envoie par défaut un jeu raisonnable de paramètres DHCP, et
peut être configuré pour envoyer n'importe quel option DHCP. peut être configuré pour envoyer n'importe quel option DHCP.
Il inclut un serveur TFTP sécurisé en lecture seule permettant le démarrage via Il inclut un serveur TFTP sécurisé en lecture seule permettant le démarrage via
le réseau/PXE de clients DHCP et supporte également le protocole BOOTP. le réseau/PXE de clients DHCP et supporte également le protocole BOOTP.
...@@ -33,6 +32,11 @@ Sur BSD, à moins que le logiciel ne soit compilé avec la bibliothèque GNU ...@@ -33,6 +32,11 @@ Sur BSD, à moins que le logiciel ne soit compilé avec la bibliothèque GNU
getopt, la forme longue des options ne fonctionne pas en ligne de commande; Elle getopt, la forme longue des options ne fonctionne pas en ligne de commande; Elle
est toujours supportée dans le fichier de configuration. est toujours supportée dans le fichier de configuration.
.TP .TP
.B --test
Vérifie la syntaxe du ou des fichiers de configurations. Se termine avec le
code de retour 0 si tout est OK, ou un code différent de 0 dans le cas
contraire. Ne démarre pas Dnsmasq.
.TP
.B \-h, --no-hosts .B \-h, --no-hosts
Ne pas charger les noms du fichier /etc/hosts. Ne pas charger les noms du fichier /etc/hosts.
.TP .TP
...@@ -41,7 +45,8 @@ Fichiers d'hôtes additionnels. Lire le fichier spécifié en plus de /etc/hosts ...@@ -41,7 +45,8 @@ Fichiers d'hôtes additionnels. Lire le fichier spécifié en plus de /etc/hosts
Si Si
.B -h .B -h
est spécifié, lire uniquement le fichier spécifié. Cette option peut être est spécifié, lire uniquement le fichier spécifié. Cette option peut être
répétée afin d'ajouter d'autres fichiers. répétée afin d'ajouter d'autres fichiers. Si un répertoire est donné, lis les
fichiers contenus dans ce répertoire.
.TP .TP
.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
...@@ -497,7 +502,7 @@ lorsqu'un serveur web a la résolution de nom activée pour l'enregistrement de ...@@ -497,7 +502,7 @@ lorsqu'un serveur web a la résolution de nom activée pour l'enregistrement de
son journal des requêtes, ce qui peut générer un nombre important de requêtes son journal des requêtes, ce qui peut générer un nombre important de requêtes
simultanées. simultanées.
.TP .TP
.B \-F, --dhcp-range=[[net:]identifiant de réseau,]<adresse de début>,<adresse de fin>[[,<masque de réseau>],<broadcast>][,<durée de bail par défaut>] .B \-F, --dhcp-range=[[net:]identifiant de réseau,]<adresse de début>,<adresse de fin>[[,<masque de réseau>],<broadcast>][,<durée de bail>]
Active le serveur DHCP. Les adresses seront données dans la plage comprise entre Active le serveur DHCP. Les adresses seront données dans la plage comprise entre
<adresse de début> et <adresse de fin> et à partir des adresses définies <adresse de début> et <adresse de fin> et à partir des adresses définies
statiquement dans l'option statiquement dans l'option
...@@ -505,7 +510,9 @@ statiquement dans l'option ...@@ -505,7 +510,9 @@ statiquement dans l'option
Si une durée de bail est donnée, alors les baux seront donnés pour cette Si une durée de bail est donnée, alors les baux seront donnés pour cette
durée. La durée de bail est donnée en secondes, en minutes (exemple : 45m), durée. La durée de bail est donnée en secondes, en minutes (exemple : 45m),
en heures (exemple : 1h) ou être la chaine de caractère "infinite" pour une en heures (exemple : 1h) ou être la chaine de caractère "infinite" pour une
durée indéterminée. La valeur minimum pour un bail DHCP est de 2 minutes. durée indéterminée. Si aucune valeur n'est donnée, une durée de bail par défaut
de une heure est appliquée. La valeur minimum pour un bail DHCP est de 2
minutes.
Cette option peut être répétée, avec différentes adresses, Cette option peut être répétée, avec différentes adresses,
pour activer le service DHCP sur plus d'un réseau. Pour des réseaux directement pour activer le service DHCP sur plus d'un réseau. Pour des réseaux directement
connectés (c'est-à-dire des réseaux dans lesquels la machine sur laquelle tourne connectés (c'est-à-dire des réseaux dans lesquels la machine sur laquelle tourne
...@@ -513,11 +520,8 @@ Dnsmasq possède une interface), le masque de réseau est optionnel. Il est par ...@@ -513,11 +520,8 @@ Dnsmasq possède une interface), le masque de réseau est optionnel. Il est par
contre requis pour les réseaux pour lesquels le service DHCP se fait via un contre requis pour les réseaux pour lesquels le service DHCP se fait via un
relais DHCP ("relay agent"). L'adresse de broadcast est toujours optionnelle. relais DHCP ("relay agent"). L'adresse de broadcast est toujours optionnelle.
Sur certains systèmes, Dnsmasq ne peut écouter que sur une interface lorsqu'il Il est toujours possible d'avoir plus d'une plage DHCP pour un même
utilise DHCP, et le nom de l'interface doit être spécifié par l'option sous-réseau.
.B interface.
Cette limitation affecte tous les systèmes OpenBSD avant la version 4.0. Il
est toujours possible d'avoir plus d'une plage DHCP pour un même sous-réseau.
L'identifiant de réseau optionnel est un label alphanumérique qui permet de L'identifiant de réseau optionnel est un label alphanumérique qui permet de
marquer ce réseau afin de fournir des options DHCP spécifiques à chaque réseau. marquer ce réseau afin de fournir des options DHCP spécifiques à chaque réseau.
...@@ -528,10 +532,19 @@ label, il définit le label pour laquelle la règle s'applique. Un seul label pe ...@@ -528,10 +532,19 @@ label, il définit le label pour laquelle la règle s'applique. Un seul label pe
L'adresse de fin peut être remplacée par le mot-clef L'adresse de fin peut être remplacée par le mot-clef
.B static .B static
("statique") qui indique à Dnsmasq d'activer le service DHCP pour le réseau ("statique") qui indique à Dnsmasq d'activer le service DHCP pour le réseau
spécifié, mais de ne pas activer l'allocation dynamique d'adresses IP. Seuls les spécifié, mais de ne pas activer l'allocation dynamique d'adresses IP : Seuls
hôtes possédant des adresses IP statiques fournies via les hôtes possédant des adresses IP statiques fournies via
.B dhcp-host .B dhcp-host
ou présentes dans le fichier /etc/ethers seront alors servis par le DHCP. ou présentes dans le fichier /etc/ethers seront alors servis par le DHCP.
L'adresse de fin peut-être remplacée par le mot-clef
.B proxy
, auquel cas Dnsmasq fournira un service de DHCP proxy pour le sous-réseau
spécifié. (voir
.B pxe-prompt
et
.B pxe-service
pour plus de détails).
.TP .TP
.B \-G, --dhcp-host=[<adresse matérielle>][,id:<identifiant client>|*][,net:<identifiant de réseau>][,<adresse IP>][,<nom d'hôte>][,<durée de bail>][,ignore] .B \-G, --dhcp-host=[<adresse matérielle>][,id:<identifiant client>|*][,net:<identifiant de réseau>][,<adresse IP>][,<nom d'hôte>][,<durée de bail>][,ignore]
Spécifie les paramètres DHCP relatifs à un hôte. Cela permet à une machine Spécifie les paramètres DHCP relatifs à un hôte. Cela permet à une machine
...@@ -828,7 +841,59 @@ le réseau. ...@@ -828,7 +841,59 @@ le réseau.
Si d'éventuels identifiants de réseau sont fournis, ils doivent coïncider avec Si d'éventuels identifiants de réseau sont fournis, ils doivent coïncider avec
ceux du client pour que cet élement de configuration lui soit envoyé. Il est à ceux du client pour que cet élement de configuration lui soit envoyé. Il est à
noter que les identifiants de réseau doivent-être préfixés par "net:". noter que les identifiants de réseau doivent-être préfixés par "net:".
.TP .TP
.B --pxe-service=[net:<identifiant de réseau>,]<CSA>,<entrée de menu>,<nom de fichier>|<type de service de démarrage>[,<adresse de serveur>]
La plupart des ROMS de démarrage PXE ne permettent au système PXE que la simple
obtention d'une adresse IP, le téléchargement du fichier spécifié dans
.B dhcp-boot
et son exécution. Cependant, le système PXE est capable de fonctions bien plus
complexes pour peu que le serveur DHCP soit adapté.
Ceci spécifie l'option de démarrage qui apparaitra dans un menu de démarrage
PXE. <CSA> est le type du système client. Seuls des types de services valides
apparaitront dans un menu. Les types connus sont x86PC, PC98, IA64_EFI, Alpha,
Arc_x86, Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI et X86-64_EFI;
D'autres types peuvent-être spécifiés sous la forme d'une valeur entière. Le
paramètre après le texte correspondant à l'entrée dans le menu peut être un nom
de fichier, auquel cas Dnsmasq agit comme un serveur de démarrage et indique au
client PXE qu'il faut télécharger ce fichier via TFTP, soit depuis ce serveur
(l'option
.B enable-tftp
doit être spécifiée pour que cela marche), soit depuis un autre serveur TFTP
si une adresse de serveur est fournie.
Veuillez noter que le suffixe de "couche" (en principe ".0") est fourni par PXE
et ne doit pas être rajouté au nom de fichier. Si une valeur numérique entière
est fournir pour le type de démarrage, en remplacement du nom de fichier, le
client PXE devra chercher un service de démarrage de ce type sur le réseau.
Cette recherche peut être faite via multicast ou broadcast, ou directement
auprès d'un serveur si son adresse IP est fournie dans l'option. Un service de
démarrage de type 0 est spécial et provoquera une interruption du démarrage par
le réseau ainsi que la poursuite du démarrage sur un média local.
.TP
.B --pxe-prompt=[net:<identifiant de réseau>,]<invite>[,<délai>]
Cette option permet d'afficher une invite à la suite du démarrage PXE. Si un
délai est fourni, alors la première entrée du menu de démarrage sera
automatiquement exécutée après ce délai. Si le délai vaut 0, alors la première
entrée disponible sera exécutée immédiatement. Si
.B pxe-prompt
est omis, le système attendra un choix de l'utilisateur s'il existe plusieurs
entrées dans le menu, ou démarrera immédiatement dans le cas où il n'y a qu'une
seule entrée. Voir
.B pxe-service
pour plus de détails sur les entrées de menu.
Dnsmasq peut servir de "proxy-DHCP" PXE, dans le cas où un autre serveur DHCP
sur le réseau est responsable de l'allocation des adresses IP, auquel cas
Dnsmasq se contente de fournir les informations données dans les options
.B pxe-prompt
et
.B pxe-service
pour permettre le démarrage par le réseau. Ce mode est activé en utilisant le
mot-clef
.B proxy
dans
.B dhcp-range.
.TP
.B \-X, --dhcp-lease-max=<nombre> .B \-X, --dhcp-lease-max=<nombre>
Limite Dnsmasq à un maximum de <nombre> baux DHCP. Le défaut est de 150. Cette Limite Dnsmasq à un maximum de <nombre> baux DHCP. Le défaut est de 150. Cette
limite permet d'éviter des attaques de déni de service ("DoS") par des hôtes limite permet d'éviter des attaques de déni de service ("DoS") par des hôtes
...@@ -951,9 +1016,9 @@ longueur de bail ou de date d'expiration. ...@@ -951,9 +1016,9 @@ longueur de bail ou de date d'expiration.
.B --bridge-interface=<interface>,<alias>[,<alias>] .B --bridge-interface=<interface>,<alias>[,<alias>]
Traiter les requêtes DHCP arrivant sur n'importe laquelle des interfaces <alias> Traiter les requêtes DHCP arrivant sur n'importe laquelle des interfaces <alias>
comme si elles arrivaient de l'interface <interface>. Cette option est comme si elles arrivaient de l'interface <interface>. Cette option est
uniquement disponible sur les plateformes BSD, et est uniquement nécessaire nécessaire lors de l'utilisation de pont ethernet "ancien mode" sur plate-forme
lors de l'utilisation de pont ethernet "ancien mode", puisque dans ce cas les BSD, puisque dans ce cas les paquets arrivent sur des interfaces "tap" n'ont
paquets arrivent sur des interfaces "tap" n'ayant pas d'adresse IP. pas d'adresse IP.
.TP .TP
.B \-s, --domain=<domaine>[,<gamme d'adresses>] .B \-s, --domain=<domaine>[,<gamme d'adresses>]
Spécifie le domaine du serveur DHCP. Le domaine peut être donné de manière Spécifie le domaine du serveur DHCP. Le domaine peut être donné de manière
......
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.
...@@ -130,7 +130,7 @@ int iface_enumerate(void *parm, int (*ipv4_callback)(), int (*ipv6_callback)()) ...@@ -130,7 +130,7 @@ int iface_enumerate(void *parm, int (*ipv4_callback)(), int (*ipv6_callback)())
#endif #endif
#if defined(HAVE_BSD_NETWORK) #if defined(HAVE_BSD_NETWORK) && defined(HAVE_DHCP)
#include <net/bpf.h> #include <net/bpf.h>
void init_bpf(void) void init_bpf(void)
...@@ -175,7 +175,7 @@ void send_via_bpf(struct dhcp_packet *mess, size_t len, ...@@ -175,7 +175,7 @@ void send_via_bpf(struct dhcp_packet *mess, size_t len,
/* Only know how to do ethernet on *BSD */ /* Only know how to do ethernet on *BSD */
if (mess->htype != ARPHRD_ETHER || mess->hlen != ETHER_ADDR_LEN) if (mess->htype != ARPHRD_ETHER || mess->hlen != ETHER_ADDR_LEN)
{ {
my_syslog(LOG_WARNING, _("DHCP request for unsupported hardware type (%d) received on %s"), my_syslog(MS_DHCP | LOG_WARNING, _("DHCP request for unsupported hardware type (%d) received on %s"),
mess->htype, ifr->ifr_name); mess->htype, ifr->ifr_name);
return; return;
} }
......
...@@ -17,7 +17,10 @@ ...@@ -17,7 +17,10 @@
#include "dnsmasq.h" #include "dnsmasq.h"
static struct crec *cache_head = NULL, *cache_tail = NULL, **hash_table = NULL; static struct crec *cache_head = NULL, *cache_tail = NULL, **hash_table = NULL;
static struct crec *dhcp_spare = NULL, *new_chain = NULL; #ifdef HAVE_DHCP
static struct crec *dhcp_spare = NULL;
#endif
static struct crec *new_chain = NULL;
static int cache_inserted = 0, cache_live_freed = 0, insert_error; static int cache_inserted = 0, cache_live_freed = 0, insert_error;
static union bigname *big_free = NULL; static union bigname *big_free = NULL;
static int bignames_left, hash_size; static int bignames_left, hash_size;
...@@ -859,10 +862,11 @@ static int read_hostsfile(char *filename, int index, int cache_size) ...@@ -859,10 +862,11 @@ static int read_hostsfile(char *filename, int index, int cache_size)
return name_count; return name_count;
} }
void cache_reload(struct hostsfile *addn_hosts) void cache_reload(void)
{ {
struct crec *cache, **up, *tmp; struct crec *cache, **up, *tmp;
int i, total_size = daemon->cachesize; int i, total_size = daemon->cachesize;
struct hostsfile *ah;
cache_inserted = cache_live_freed = 0; cache_inserted = cache_live_freed = 0;
...@@ -889,7 +893,7 @@ void cache_reload(struct hostsfile *addn_hosts) ...@@ -889,7 +893,7 @@ void cache_reload(struct hostsfile *addn_hosts)
up = &cache->hash_next; up = &cache->hash_next;
} }
if ((daemon->options & OPT_NO_HOSTS) && !addn_hosts) if ((daemon->options & OPT_NO_HOSTS) && !daemon->addn_hosts)
{ {
if (daemon->cachesize > 0) if (daemon->cachesize > 0)
my_syslog(LOG_INFO, _("cleared cache")); my_syslog(LOG_INFO, _("cleared cache"));
...@@ -898,13 +902,116 @@ void cache_reload(struct hostsfile *addn_hosts) ...@@ -898,13 +902,116 @@ void cache_reload(struct hostsfile *addn_hosts)
if (!(daemon->options & OPT_NO_HOSTS)) if (!(daemon->options & OPT_NO_HOSTS))
total_size = read_hostsfile(HOSTSFILE, 0, total_size); total_size = read_hostsfile(HOSTSFILE, 0, total_size);
while (addn_hosts)
for (i = 0, ah = daemon->addn_hosts; ah; ah = ah->next)
{ {
total_size = read_hostsfile(addn_hosts->fname, addn_hosts->index, total_size); if (i <= ah->index)
addn_hosts = addn_hosts->next; i = ah->index + 1;
}
if (ah->flags & AH_DIR)
ah->flags |= AH_INACTIVE;
else
ah->flags &= ~AH_INACTIVE;
}
for (ah = daemon->addn_hosts; ah; ah = ah->next)
if (!(ah->flags & AH_INACTIVE))
{
struct stat buf;
if (stat(ah->fname, &buf) != -1 && S_ISDIR(buf.st_mode))
{
DIR *dir_stream;
struct dirent *ent;
/* don't read this as a file */
ah->flags |= AH_INACTIVE;
if (!(dir_stream = opendir(ah->fname)))
my_syslog(LOG_ERR, _("cannot access directory %s: %s"),
ah->fname, strerror(errno));
else
{
while ((ent = readdir(dir_stream)))
{
size_t lendir = strlen(ah->fname);
size_t lenfile = strlen(ent->d_name);
struct hostsfile *ah1;
char *path;
/* ignore emacs backups and dotfiles */
if (lenfile == 0 ||
ent->d_name[lenfile - 1] == '~' ||
(ent->d_name[0] == '#' && ent->d_name[lenfile - 1] == '#') ||
ent->d_name[0] == '.')
continue;
/* see if we have an existing record.
dir is ah->fname
file is ent->d_name
path to match is ah1->fname */
for (ah1 = daemon->addn_hosts; ah1; ah1 = ah1->next)
{
if (lendir < strlen(ah1->fname) &&
strstr(ah1->fname, ah->fname) == ah1->fname &&
ah1->fname[lendir] == '/' &&
strcmp(ah1->fname + lendir + 1, ent->d_name) == 0)
{
ah1->flags &= ~AH_INACTIVE;
break;
}
}
/* make new record */
if (!ah1)
{
if (!(ah1 = whine_malloc(sizeof(struct hostsfile))))
continue;
if (!(path = whine_malloc(lendir + lenfile + 2)))
{
free(ah1);
continue;
}
strcpy(path, ah->fname);
strcat(path, "/");
strcat(path, ent->d_name);
ah1->fname = path;
ah1->index = i++;
ah1->flags = AH_DIR;
ah1->next = daemon->addn_hosts;
daemon->addn_hosts = ah1;
}
/* inactivate record if not regular file */
if ((ah1->flags & AH_DIR) && stat(ah1->fname, &buf) != -1 && !S_ISREG(buf.st_mode))
ah1->flags |= AH_INACTIVE;
}
closedir(dir_stream);
}
}
}
for (ah = daemon->addn_hosts; ah; ah = ah->next)
if (!(ah->flags & AH_INACTIVE))
total_size = read_hostsfile(ah->fname, ah->index, total_size);
} }
char *get_domain(struct in_addr addr)
{
struct cond_domain *c;
for (c = daemon->cond_domain; c; c = c->next)
if (ntohl(addr.s_addr) >= ntohl(c->start.s_addr) &&
ntohl(addr.s_addr) <= ntohl(c->end.s_addr))
return c->domain;
return daemon->domain_suffix;
}
#ifdef HAVE_DHCP
void cache_unhash_dhcp(void) void cache_unhash_dhcp(void)
{ {
struct crec *cache, **up; struct crec *cache, **up;
...@@ -942,7 +1049,7 @@ void cache_add_dhcp_entry(char *host_name, ...@@ -942,7 +1049,7 @@ void cache_add_dhcp_entry(char *host_name,
_("not giving name %s to the DHCP lease of %s because " _("not giving name %s to the DHCP lease of %s because "
"the name exists in %s with address %s"), "the name exists in %s with address %s"),
host_name, inet_ntoa(*host_address), host_name, inet_ntoa(*host_address),
record_source(daemon->addn_hosts, crec->uid), daemon->namebuff); record_source(crec->uid), daemon->namebuff);
return; return;
} }
else else
...@@ -1009,6 +1116,7 @@ void cache_add_dhcp_entry(char *host_name, ...@@ -1009,6 +1116,7 @@ void cache_add_dhcp_entry(char *host_name,
} }
} }
} }
#endif
void dump_cache(time_t now) void dump_cache(time_t now)
...@@ -1099,20 +1207,18 @@ void dump_cache(time_t now) ...@@ -1099,20 +1207,18 @@ void dump_cache(time_t now)
} }
} }
char *record_source(struct hostsfile *addn_hosts, int index) char *record_source(int index)
{ {
char *source = HOSTSFILE; struct hostsfile *ah;
while (addn_hosts)
{ if (index == 0)
if (addn_hosts->index == index) return HOSTSFILE;
{
source = addn_hosts->fname;
break;
}
addn_hosts = addn_hosts->next;
}
return source; for (ah = daemon->addn_hosts; ah; ah = ah->next)
if (ah->index == index)
return ah->fname;
return "<unknown>";
} }
void querystr(char *str, unsigned short type) void querystr(char *str, unsigned short type)
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
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.47" #define VERSION "2.48"
#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 */
...@@ -106,9 +106,6 @@ HAVE_BSD_NETWORK ...@@ -106,9 +106,6 @@ HAVE_BSD_NETWORK
HAVE_SOLARIS_NETWORK HAVE_SOLARIS_NETWORK
define exactly one of these to alter interaction with kernel networking. define exactly one of these to alter interaction with kernel networking.
HAVE_SOLARIS_PRIVS
define for Solaris > 10 which can split privileges.
HAVE_BROKEN_RTC HAVE_BROKEN_RTC
define this on embedded systems which don't have an RTC define this on embedded systems which don't have an RTC
which keeps time over reboots. Causes dnsmasq to use uptime which keeps time over reboots. Causes dnsmasq to use uptime
...@@ -126,6 +123,9 @@ HAVE_BROKEN_RTC ...@@ -126,6 +123,9 @@ HAVE_BROKEN_RTC
HAVE_TFTP HAVE_TFTP
define this to get dnsmasq's built-in TFTP server. define this to get dnsmasq's built-in TFTP server.
HAVE_DHCP
define this to get dnsmasq's DHCP server.
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.
...@@ -141,11 +141,6 @@ HAVE_DBUS ...@@ -141,11 +141,6 @@ HAVE_DBUS
define some methods to allow (re)configuration of the upstream DNS define some methods to allow (re)configuration of the upstream DNS
servers via DBus. servers via DBus.
HAVE_BSD_BRIDGE
Define this to enable the --bridge-interface option, useful on some
BSD systems.
NOTES: NOTES:
For Linux you should define For Linux you should define
HAVE_LINUX_NETWORK HAVE_LINUX_NETWORK
...@@ -165,6 +160,7 @@ NOTES: ...@@ -165,6 +160,7 @@ NOTES:
*/ */
/* platform independent options- uncomment to enable */ /* platform independent options- uncomment to enable */
#define HAVE_DHCP
#define HAVE_TFTP #define HAVE_TFTP
/* #define HAVE_BROKEN_RTC */ /* #define HAVE_BROKEN_RTC */
/* #define HAVE_DBUS */ /* #define HAVE_DBUS */
...@@ -174,6 +170,11 @@ NOTES: ...@@ -174,6 +170,11 @@ NOTES:
#undef HAVE_TFTP #undef HAVE_TFTP
#endif #endif
/* Allow DHCP to be disabled with COPTS=-DNO_DHCP */
#ifdef NO_DHCP
#undef HAVE_DHCP
#endif
/* platform dependent options. */ /* platform dependent options. */
/* Must preceed __linux__ since uClinux defines __linux__ too. */ /* Must preceed __linux__ since uClinux defines __linux__ too. */
...@@ -211,13 +212,6 @@ NOTES: ...@@ -211,13 +212,6 @@ NOTES:
#define HAVE_GETOPT_LONG #define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM #undef HAVE_ARC4RANDOM
#undef HAVE_SOCKADDR_SA_LEN #undef HAVE_SOCKADDR_SA_LEN
/* glibc < 2.2 has broken Sockaddr_in6 so we have to use our own. */
/* glibc < 2.2 doesn't define in_addr_t */
#if defined(__GLIBC__) && (__GLIBC__ == 2) && \
defined(__GLIBC_MINOR__) && (__GLIBC_MINOR__ < 2)
typedef unsigned long in_addr_t;
# define HAVE_BROKEN_SOCKADDR_IN6
#endif
#elif defined(__FreeBSD__) || \ #elif defined(__FreeBSD__) || \
defined(__OpenBSD__) || \ defined(__OpenBSD__) || \
...@@ -232,7 +226,6 @@ typedef unsigned long in_addr_t; ...@@ -232,7 +226,6 @@ typedef unsigned long in_addr_t;
# define HAVE_ARC4RANDOM # define HAVE_ARC4RANDOM
#endif #endif
#define HAVE_SOCKADDR_SA_LEN #define HAVE_SOCKADDR_SA_LEN
#define HAVE_BSD_BRIDGE
#elif defined(__APPLE__) #elif defined(__APPLE__)
#define HAVE_BSD_NETWORK #define HAVE_BSD_NETWORK
...@@ -247,34 +240,16 @@ typedef unsigned long in_addr_t; ...@@ -247,34 +240,16 @@ typedef unsigned long in_addr_t;
#define HAVE_GETOPT_LONG #define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM #undef HAVE_ARC4RANDOM
#define HAVE_SOCKADDR_SA_LEN #define HAVE_SOCKADDR_SA_LEN
#define HAVE_BSD_BRIDGE
#elif defined(__sun) || defined(__sun__) #elif defined(__sun) || defined(__sun__)
#define HAVE_SOLARIS_NETWORK #define HAVE_SOLARIS_NETWORK
/* only Solaris 10 does split privs. */ #define HAVE_GETOPT_LONG
#if (SUNOS_VER >= 10)
# define HAVE_SOLARIS_PRIVS
# define HAVE_GETOPT_LONG
#endif
/* some CMSG stuff missing on early solaris */
#ifndef OSSH_ALIGNBYTES
# define OSSH_ALIGNBYTES (sizeof(int) - 1)
#endif
#ifndef __CMSG_ALIGN
# define __CMSG_ALIGN(p) (((u_int)(p) + OSSH_ALIGNBYTES) &~ OSSH_ALIGNBYTES)
#endif
#ifndef CMSG_LEN
# define CMSG_LEN(len) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
#endif
#ifndef CMSG_SPACE
# define CMSG_SPACE(len) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(len))
#endif
#undef HAVE_ARC4RANDOM #undef HAVE_ARC4RANDOM
#undef HAVE_SOCKADDR_SA_LEN #undef HAVE_SOCKADDR_SA_LEN
#define _XPG4_2 #define _XPG4_2
#define __EXTENSIONS__ #define __EXTENSIONS__
#define ETHER_ADDR_LEN 6 #define ETHER_ADDR_LEN 6
#endif #endif
/* Decide if we're going to support IPv6 */ /* Decide if we're going to support IPv6 */
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#ifdef HAVE_DBUS #ifdef HAVE_DBUS
#define DBUS_API_SUBJECT_TO_CHANGE
#include <dbus/dbus.h> #include <dbus/dbus.h>
const char* introspection_xml = const char* introspection_xml =
...@@ -345,11 +344,7 @@ void set_dbus_listeners(int *maxfdp, ...@@ -345,11 +344,7 @@ void set_dbus_listeners(int *maxfdp,
if (dbus_watch_get_enabled(w->watch)) if (dbus_watch_get_enabled(w->watch))
{ {
unsigned int flags = dbus_watch_get_flags(w->watch); unsigned int flags = dbus_watch_get_flags(w->watch);
#if (DBUS_MINOR > 0)
int fd = dbus_watch_get_unix_fd(w->watch); int fd = dbus_watch_get_unix_fd(w->watch);
#else
int fd = dbus_watch_get_fd(w->watch);
#endif
bump_maxfd(fd, maxfdp); bump_maxfd(fd, maxfdp);
...@@ -372,11 +367,7 @@ void check_dbus_listeners(fd_set *rset, fd_set *wset, fd_set *eset) ...@@ -372,11 +367,7 @@ void check_dbus_listeners(fd_set *rset, fd_set *wset, fd_set *eset)
if (dbus_watch_get_enabled(w->watch)) if (dbus_watch_get_enabled(w->watch))
{ {
unsigned int flags = 0; unsigned int flags = 0;
#if (DBUS_MINOR > 0)
int fd = dbus_watch_get_unix_fd(w->watch); int fd = dbus_watch_get_unix_fd(w->watch);
#else
int fd = dbus_watch_get_fd(w->watch);
#endif
if (FD_ISSET(fd, rset)) if (FD_ISSET(fd, rset))
flags |= DBUS_WATCH_READABLE; flags |= DBUS_WATCH_READABLE;
......
This diff is collapsed.
...@@ -33,9 +33,6 @@ static char *compile_opts = ...@@ -33,9 +33,6 @@ static char *compile_opts =
#ifdef NO_FORK #ifdef NO_FORK
"no-MMU " "no-MMU "
#endif #endif
#ifdef HAVE_BSD_BRIDGE
"BSD-bridge "
#endif
#ifndef HAVE_DBUS #ifndef HAVE_DBUS
"no-" "no-"
#endif #endif
...@@ -44,6 +41,10 @@ static char *compile_opts = ...@@ -44,6 +41,10 @@ static char *compile_opts =
"no-" "no-"
#endif #endif
"I18N " "I18N "
#ifndef HAVE_DHCP
"no-"
#endif
"DHCP "
#ifndef HAVE_TFTP #ifndef HAVE_TFTP
"no-" "no-"
#endif #endif
...@@ -67,9 +68,11 @@ int main (int argc, char **argv) ...@@ -67,9 +68,11 @@ int main (int argc, char **argv)
struct iname *if_tmp; struct iname *if_tmp;
int piperead, pipefd[2], err_pipe[2]; int piperead, pipefd[2], err_pipe[2];
struct passwd *ent_pw = NULL; struct passwd *ent_pw = NULL;
#ifdef HAVE_DHCP
uid_t script_uid = 0; uid_t script_uid = 0;
gid_t script_gid = 0; gid_t script_gid = 0;
struct group *gp= NULL; #endif
struct group *gp = NULL;
long i, max_fd = sysconf(_SC_OPEN_MAX); long i, max_fd = sysconf(_SC_OPEN_MAX);
char *baduser = NULL; char *baduser = NULL;
int log_err; int log_err;
...@@ -108,11 +111,13 @@ int main (int argc, char **argv) ...@@ -108,11 +111,13 @@ int main (int argc, char **argv)
daemon->edns_pktsz : DNSMASQ_PACKETSZ; daemon->edns_pktsz : DNSMASQ_PACKETSZ;
daemon->packet = safe_malloc(daemon->packet_buff_sz); daemon->packet = safe_malloc(daemon->packet_buff_sz);
#ifdef HAVE_DHCP
if (!daemon->lease_file) if (!daemon->lease_file)
{ {
if (daemon->dhcp) if (daemon->dhcp)
daemon->lease_file = LEASEFILE; daemon->lease_file = LEASEFILE;
} }
#endif
/* Close any file descriptors we inherited apart from std{in|out|err} */ /* Close any file descriptors we inherited apart from std{in|out|err} */
for (i = 0; i < max_fd; i++) for (i = 0; i < max_fd; i++)
...@@ -145,23 +150,16 @@ int main (int argc, char **argv) ...@@ -145,23 +150,16 @@ int main (int argc, char **argv)
now = dnsmasq_time(); now = dnsmasq_time();
#ifdef HAVE_DHCP
if (daemon->dhcp) if (daemon->dhcp)
{ {
#if !defined(HAVE_LINUX_NETWORK) && !defined(IP_RECVIF)
int c;
struct iname *tmp;
for (c = 0, tmp = daemon->if_names; tmp; tmp = tmp->next)
if (!tmp->isloop)
c++;
if (c != 1)
die(_("must set exactly one interface on broken systems without IP_RECVIF"), NULL, EC_BADCONF);
#endif
/* Note that order matters here, we must call lease_init before /* Note that order matters here, we must call lease_init before
creating any file descriptors which shouldn't be leaked creating any file descriptors which shouldn't be leaked
to the lease-script init process. */ to the lease-script init process. */
lease_init(now); lease_init(now);
dhcp_init(); dhcp_init();
} }
#endif
if (!enumerate_interfaces()) if (!enumerate_interfaces())
die(_("failed to find list of interfaces: %s"), NULL, EC_MISC); die(_("failed to find list of interfaces: %s"), NULL, EC_MISC);
...@@ -204,6 +202,7 @@ int main (int argc, char **argv) ...@@ -204,6 +202,7 @@ int main (int argc, char **argv)
if (daemon->port != 0) if (daemon->port != 0)
pre_allocate_sfds(); pre_allocate_sfds();
#ifdef HAVE_DHCP
/* Note getpwnam returns static storage */ /* Note getpwnam returns static storage */
if (daemon->dhcp && daemon->lease_change_command && daemon->scriptuser) if (daemon->dhcp && daemon->lease_change_command && daemon->scriptuser)
{ {
...@@ -215,6 +214,7 @@ int main (int argc, char **argv) ...@@ -215,6 +214,7 @@ int main (int argc, char **argv)
else else
baduser = daemon->scriptuser; baduser = daemon->scriptuser;
} }
#endif
if (daemon->username && !(ent_pw = getpwnam(daemon->username))) if (daemon->username && !(ent_pw = getpwnam(daemon->username)))
baduser = daemon->username; baduser = daemon->username;
...@@ -290,8 +290,9 @@ int main (int argc, char **argv) ...@@ -290,8 +290,9 @@ int main (int argc, char **argv)
When startup is complete we close this and the process terminates. */ When startup is complete we close this and the process terminates. */
safe_pipe(err_pipe, 0); safe_pipe(err_pipe, 0);
if ((pid = fork()) == -1 ) if ((pid = fork()) == -1)
die(_("cannot fork into background: %s"), NULL, EC_MISC); /* fd == -1 since we've not forked, never returns. */
send_event(-1, EVENT_FORK_ERR, errno);
if (pid != 0) if (pid != 0)
{ {
...@@ -312,9 +313,11 @@ int main (int argc, char **argv) ...@@ -312,9 +313,11 @@ int main (int argc, char **argv)
/* NO calls to die() from here on. */ /* NO calls to die() from here on. */
setsid(); setsid();
pid = fork();
if ((pid = fork()) == -1)
if (pid != 0 && pid != -1) send_event(err_pipe[1], EVENT_FORK_ERR, errno);
if (pid != 0)
_exit(0); _exit(0);
} }
#endif #endif
...@@ -349,7 +352,7 @@ int main (int argc, char **argv) ...@@ -349,7 +352,7 @@ int main (int argc, char **argv)
/* if we are to run scripts, we need to fork a helper before dropping root. */ /* if we are to run scripts, we need to fork a helper before dropping root. */
daemon->helperfd = -1; daemon->helperfd = -1;
#ifndef NO_FORK #if defined(HAVE_DHCP) && !defined(NO_FORK)
if (daemon->dhcp && daemon->lease_change_command) if (daemon->dhcp && daemon->lease_change_command)
daemon->helperfd = create_helper(pipewrite, err_pipe[1], script_uid, script_gid, max_fd); daemon->helperfd = create_helper(pipewrite, err_pipe[1], script_uid, script_gid, max_fd);
#endif #endif
...@@ -380,7 +383,7 @@ int main (int argc, char **argv) ...@@ -380,7 +383,7 @@ int main (int argc, char **argv)
if (capset(hdr, data) == -1 || prctl(PR_SET_KEEPCAPS, 1) == -1) if (capset(hdr, data) == -1 || prctl(PR_SET_KEEPCAPS, 1) == -1)
bad_capabilities = errno; bad_capabilities = errno;
#elif defined(HAVE_SOLARIS_PRIVS) #elif defined(HAVE_SOLARIS_NETWORK)
/* http://developers.sun.com/solaris/articles/program_privileges.html */ /* http://developers.sun.com/solaris/articles/program_privileges.html */
priv_set_t *priv_set; priv_set_t *priv_set;
...@@ -400,9 +403,6 @@ int main (int argc, char **argv) ...@@ -400,9 +403,6 @@ int main (int argc, char **argv)
if (priv_set) if (priv_set)
priv_freeset(priv_set); priv_freeset(priv_set);
#elif defined(HAVE_SOLARIS_NETWORK)
bad_capabilities = ENOTSUP;
#endif #endif
if (bad_capabilities != 0) if (bad_capabilities != 0)
...@@ -482,6 +482,7 @@ int main (int argc, char **argv) ...@@ -482,6 +482,7 @@ int main (int argc, char **argv)
if (daemon->max_logs != 0) if (daemon->max_logs != 0)
my_syslog(LOG_INFO, _("asynchronous logging enabled, queue limit is %d messages"), daemon->max_logs); my_syslog(LOG_INFO, _("asynchronous logging enabled, queue limit is %d messages"), daemon->max_logs);
#ifdef HAVE_DHCP
if (daemon->dhcp) if (daemon->dhcp)
{ {
struct dhcp_context *dhcp_tmp; struct dhcp_context *dhcp_tmp;
...@@ -490,13 +491,16 @@ int main (int argc, char **argv) ...@@ -490,13 +491,16 @@ int main (int argc, char **argv)
{ {
prettyprint_time(daemon->dhcp_buff2, dhcp_tmp->lease_time); prettyprint_time(daemon->dhcp_buff2, dhcp_tmp->lease_time);
strcpy(daemon->dhcp_buff, inet_ntoa(dhcp_tmp->start)); strcpy(daemon->dhcp_buff, inet_ntoa(dhcp_tmp->start));
my_syslog(LOG_INFO, my_syslog(MS_DHCP | LOG_INFO,
(dhcp_tmp->flags & CONTEXT_STATIC) ? (dhcp_tmp->flags & CONTEXT_STATIC) ?
_("DHCP, static leases only on %.0s%s, lease time %s") : _("DHCP, static leases only on %.0s%s, lease time %s") :
(dhcp_tmp->flags & CONTEXT_PROXY) ?
_("DHCP, proxy on subnet %.0s%s%.0s") :
_("DHCP, IP range %s -- %s, lease time %s"), _("DHCP, IP range %s -- %s, lease time %s"),
daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), daemon->dhcp_buff2); daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), daemon->dhcp_buff2);
} }
} }
#endif
#ifdef HAVE_TFTP #ifdef HAVE_TFTP
if (daemon->options & OPT_TFTP) if (daemon->options & OPT_TFTP)
...@@ -506,7 +510,7 @@ int main (int argc, char **argv) ...@@ -506,7 +510,7 @@ int main (int argc, char **argv)
max_fd = FD_SETSIZE; max_fd = FD_SETSIZE;
#endif #endif
my_syslog(LOG_INFO, "TFTP %s%s %s", my_syslog(MS_TFTP | LOG_INFO, "TFTP %s%s %s",
daemon->tftp_prefix ? _("root is ") : _("enabled"), daemon->tftp_prefix ? _("root is ") : _("enabled"),
daemon->tftp_prefix ? daemon->tftp_prefix: "", daemon->tftp_prefix ? daemon->tftp_prefix: "",
daemon->options & OPT_TFTP_SECURE ? _("secure mode") : ""); daemon->options & OPT_TFTP_SECURE ? _("secure mode") : "");
...@@ -534,7 +538,7 @@ int main (int argc, char **argv) ...@@ -534,7 +538,7 @@ int main (int argc, char **argv)
if (daemon->tftp_max > max_fd) if (daemon->tftp_max > max_fd)
{ {
daemon->tftp_max = max_fd; daemon->tftp_max = max_fd;
my_syslog(LOG_WARNING, my_syslog(MS_TFTP | LOG_WARNING,
_("restricting maximum simultaneous TFTP transfers to %d"), _("restricting maximum simultaneous TFTP transfers to %d"),
daemon->tftp_max); daemon->tftp_max);
} }
...@@ -582,11 +586,13 @@ int main (int argc, char **argv) ...@@ -582,11 +586,13 @@ int main (int argc, char **argv)
set_dbus_listeners(&maxfd, &rset, &wset, &eset); set_dbus_listeners(&maxfd, &rset, &wset, &eset);
#endif #endif
#ifdef HAVE_DHCP
if (daemon->dhcp) if (daemon->dhcp)
{ {
FD_SET(daemon->dhcpfd, &rset); FD_SET(daemon->dhcpfd, &rset);
bump_maxfd(daemon->dhcpfd, &maxfd); bump_maxfd(daemon->dhcpfd, &maxfd);
} }
#endif
#ifdef HAVE_LINUX_NETWORK #ifdef HAVE_LINUX_NETWORK
FD_SET(daemon->netlinkfd, &rset); FD_SET(daemon->netlinkfd, &rset);
...@@ -596,7 +602,8 @@ int main (int argc, char **argv) ...@@ -596,7 +602,8 @@ int main (int argc, char **argv)
FD_SET(piperead, &rset); FD_SET(piperead, &rset);
bump_maxfd(piperead, &maxfd); bump_maxfd(piperead, &maxfd);
#ifndef NO_FORK #ifdef HAVE_DHCP
# ifdef NO_FORK
while (helper_buf_empty() && do_script_run(now)); while (helper_buf_empty() && do_script_run(now));
if (!helper_buf_empty()) if (!helper_buf_empty())
...@@ -604,11 +611,12 @@ int main (int argc, char **argv) ...@@ -604,11 +611,12 @@ int main (int argc, char **argv)
FD_SET(daemon->helperfd, &wset); FD_SET(daemon->helperfd, &wset);
bump_maxfd(daemon->helperfd, &maxfd); bump_maxfd(daemon->helperfd, &maxfd);
} }
#else # else
/* need this for other side-effects */ /* need this for other side-effects */
while (do_script_run(now)); while (do_script_run(now));
# endif
#endif #endif
/* must do this just before select(), when we know no /* must do this just before select(), when we know no
more calls to my_syslog() can occur */ more calls to my_syslog() can occur */
set_log_writer(&wset, &maxfd); set_log_writer(&wset, &maxfd);
...@@ -662,12 +670,14 @@ int main (int argc, char **argv) ...@@ -662,12 +670,14 @@ int main (int argc, char **argv)
check_tftp_listeners(&rset, now); check_tftp_listeners(&rset, now);
#endif #endif
#ifdef HAVE_DHCP
if (daemon->dhcp && FD_ISSET(daemon->dhcpfd, &rset)) if (daemon->dhcp && FD_ISSET(daemon->dhcpfd, &rset))
dhcp_packet(now); dhcp_packet(now);
#ifndef NO_FORK # ifndef NO_FORK
if (daemon->helperfd != -1 && FD_ISSET(daemon->helperfd, &wset)) if (daemon->helperfd != -1 && FD_ISSET(daemon->helperfd, &wset))
helper_write(); helper_write();
# endif
#endif #endif
} }
...@@ -737,6 +747,9 @@ static void fatal_event(struct event_desc *ev) ...@@ -737,6 +747,9 @@ static void fatal_event(struct event_desc *ev)
{ {
case EVENT_DIE: case EVENT_DIE:
exit(0); exit(0);
case EVENT_FORK_ERR:
die(_("cannot fork into background: %s"), NULL, EC_MISC);
case EVENT_PIPE_ERR: case EVENT_PIPE_ERR:
die(_("failed to create helper: %s"), NULL, EC_MISC); die(_("failed to create helper: %s"), NULL, EC_MISC);
...@@ -777,7 +790,9 @@ static void async_event(int pipe, time_t now) ...@@ -777,7 +790,9 @@ static void async_event(int pipe, time_t now)
reload_servers(daemon->resolv_files->name); reload_servers(daemon->resolv_files->name);
check_servers(); check_servers();
} }
#ifdef HAVE_DHCP
rerun_scripts(); rerun_scripts();
#endif
break; break;
case EVENT_DUMP: case EVENT_DUMP:
...@@ -786,11 +801,13 @@ static void async_event(int pipe, time_t now) ...@@ -786,11 +801,13 @@ static void async_event(int pipe, time_t now)
break; break;
case EVENT_ALARM: case EVENT_ALARM:
#ifdef HAVE_DHCP
if (daemon->dhcp) if (daemon->dhcp)
{ {
lease_prune(NULL, now); lease_prune(NULL, now);
lease_update_file(now); lease_update_file(now);
} }
#endif
break; break;
case EVENT_CHILD: case EVENT_CHILD:
...@@ -840,7 +857,7 @@ static void async_event(int pipe, time_t now) ...@@ -840,7 +857,7 @@ static void async_event(int pipe, time_t now)
if (daemon->tcp_pids[i] != 0) if (daemon->tcp_pids[i] != 0)
kill(daemon->tcp_pids[i], SIGALRM); kill(daemon->tcp_pids[i], SIGALRM);
#ifndef NO_FORK #if defined(HAVE_DHCP) && !defined(NO_FORK)
/* handle pending lease transitions */ /* handle pending lease transitions */
if (daemon->helperfd != -1) if (daemon->helperfd != -1)
{ {
...@@ -904,7 +921,7 @@ static void poll_resolv() ...@@ -904,7 +921,7 @@ static void poll_resolv()
warned = 0; warned = 0;
check_servers(); check_servers();
if (daemon->options & OPT_RELOAD) if (daemon->options & OPT_RELOAD)
cache_reload(daemon->addn_hosts); cache_reload();
} }
else else
{ {
...@@ -921,8 +938,9 @@ static void poll_resolv() ...@@ -921,8 +938,9 @@ static void poll_resolv()
void clear_cache_and_reload(time_t now) void clear_cache_and_reload(time_t now)
{ {
if (daemon->port != 0) if (daemon->port != 0)
cache_reload(daemon->addn_hosts); cache_reload();
#ifdef HAVE_DHCP
if (daemon->dhcp) if (daemon->dhcp)
{ {
if (daemon->options & OPT_ETHERS) if (daemon->options & OPT_ETHERS)
...@@ -934,6 +952,7 @@ void clear_cache_and_reload(time_t now) ...@@ -934,6 +952,7 @@ void clear_cache_and_reload(time_t now)
lease_update_file(now); lease_update_file(now);
lease_update_dns(); lease_update_dns();
} }
#endif
} }
static int set_dns_listeners(time_t now, fd_set *set, int *maxfdp) static int set_dns_listeners(time_t now, fd_set *set, int *maxfdp)
...@@ -1135,7 +1154,7 @@ static void check_dns_listeners(fd_set *set, time_t now) ...@@ -1135,7 +1154,7 @@ static void check_dns_listeners(fd_set *set, time_t now)
} }
} }
#ifdef HAVE_DHCP
int make_icmp_sock(void) int make_icmp_sock(void)
{ {
int fd; int fd;
...@@ -1258,5 +1277,6 @@ int icmp_ping(struct in_addr addr) ...@@ -1258,5 +1277,6 @@ int icmp_ping(struct in_addr addr)
return gotreply; return gotreply;
} }
#endif
...@@ -106,7 +106,7 @@ extern int capget(cap_user_header_t header, cap_user_data_t data); ...@@ -106,7 +106,7 @@ extern int capget(cap_user_header_t header, cap_user_data_t data);
#define LINUX_CAPABILITY_VERSION_3 0x20080522 #define LINUX_CAPABILITY_VERSION_3 0x20080522
#include <sys/prctl.h> #include <sys/prctl.h>
#elif defined(HAVE_SOLARIS_PRIVS) #elif defined(HAVE_SOLARIS_NETWORK)
#include <priv.h> #include <priv.h>
#endif #endif
...@@ -135,6 +135,7 @@ struct event_desc { ...@@ -135,6 +135,7 @@ struct event_desc {
#define EVENT_GROUP_ERR 15 #define EVENT_GROUP_ERR 15
#define EVENT_DIE 16 #define EVENT_DIE 16
#define EVENT_LOG_ERR 17 #define EVENT_LOG_ERR 17
#define EVENT_FORK_ERR 18
/* Exit codes. */ /* Exit codes. */
#define EC_GOOD 0 #define EC_GOOD 0
...@@ -185,6 +186,11 @@ struct event_desc { ...@@ -185,6 +186,11 @@ struct event_desc {
#define OPT_NO_OVERRIDE (1u<<30) #define OPT_NO_OVERRIDE (1u<<30)
#define OPT_NO_REBIND (1u<<31) #define OPT_NO_REBIND (1u<<31)
/* extra flags for my_syslog, we use a couple of facilities since they are known
not to occupy the same bits as priorities, no matter how syslog.h is set up. */
#define MS_TFTP LOG_USER
#define MS_DHCP LOG_DAEMON
struct all_addr { struct all_addr {
union { union {
struct in_addr addr4; struct in_addr addr4;
...@@ -287,19 +293,7 @@ struct crec { ...@@ -287,19 +293,7 @@ struct crec {
union mysockaddr { union mysockaddr {
struct sockaddr sa; struct sockaddr sa;
struct sockaddr_in in; struct sockaddr_in in;
#ifdef HAVE_BROKEN_SOCKADDR_IN6 #if defined(HAVE_IPV6)
/* early versions of glibc don't include sin6_scope_id in sockaddr_in6
but latest kernels _require_ it to be set. The choice is to have
dnsmasq fail to compile on back-level libc or fail to run
on latest kernels with IPv6. Or to do this: sorry that it's so gross. */
struct my_sockaddr_in6 {
sa_family_t sin6_family; /* AF_INET6 */
uint16_t sin6_port; /* transport layer port # */
uint32_t sin6_flowinfo; /* IPv6 traffic class & flow info */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* set of interfaces for a scope */
} in6;
#elif defined(HAVE_IPV6)
struct sockaddr_in6 in6; struct sockaddr_in6 in6;
#endif #endif
}; };
...@@ -368,8 +362,11 @@ struct resolvc { ...@@ -368,8 +362,11 @@ struct resolvc {
}; };
/* adn-hosts parms from command-line */ /* adn-hosts parms from command-line */
#define AH_DIR 1
#define AH_INACTIVE 2
struct hostsfile { struct hostsfile {
struct hostsfile *next; struct hostsfile *next;
int flags;
char *fname; char *fname;
int index; /* matches to cache entries for logging */ int index; /* matches to cache entries for logging */
}; };
...@@ -484,6 +481,7 @@ struct dhcp_opt { ...@@ -484,6 +481,7 @@ struct dhcp_opt {
#define DHOPT_MATCH 128 #define DHOPT_MATCH 128
#define DHOPT_VENDOR 256 #define DHOPT_VENDOR 256
#define DHOPT_HEX 512 #define DHOPT_HEX 512
#define DHOPT_VENDOR_MATCH 1024
struct dhcp_boot { struct dhcp_boot {
char *file, *sname; char *file, *sname;
...@@ -492,6 +490,14 @@ struct dhcp_boot { ...@@ -492,6 +490,14 @@ struct dhcp_boot {
struct dhcp_boot *next; struct dhcp_boot *next;
}; };
struct pxe_service {
unsigned short CSA, type;
char *menu, *basename;
struct in_addr server;
struct dhcp_netid *netid;
struct pxe_service *next;
};
#define MATCH_VENDOR 1 #define MATCH_VENDOR 1
#define MATCH_USER 2 #define MATCH_USER 2
#define MATCH_CIRCUIT 3 #define MATCH_CIRCUIT 3
...@@ -514,12 +520,10 @@ struct dhcp_mac { ...@@ -514,12 +520,10 @@ struct dhcp_mac {
struct dhcp_mac *next; struct dhcp_mac *next;
}; };
#ifdef HAVE_BSD_BRIDGE
struct dhcp_bridge { struct dhcp_bridge {
char iface[IF_NAMESIZE]; char iface[IF_NAMESIZE];
struct dhcp_bridge *alias, *next; struct dhcp_bridge *alias, *next;
}; };
#endif
struct cond_domain { struct cond_domain {
char *domain; char *domain;
...@@ -540,6 +544,7 @@ struct dhcp_context { ...@@ -540,6 +544,7 @@ struct dhcp_context {
#define CONTEXT_STATIC 1 #define CONTEXT_STATIC 1
#define CONTEXT_NETMASK 2 #define CONTEXT_NETMASK 2
#define CONTEXT_BRDCAST 4 #define CONTEXT_BRDCAST 4
#define CONTEXT_PROXY 8
typedef unsigned char u8; typedef unsigned char u8;
...@@ -620,6 +625,7 @@ extern struct daemon { ...@@ -620,6 +625,7 @@ extern struct daemon {
struct dhcp_vendor *dhcp_vendors; struct dhcp_vendor *dhcp_vendors;
struct dhcp_mac *dhcp_macs; struct dhcp_mac *dhcp_macs;
struct dhcp_boot *boot_config; struct dhcp_boot *boot_config;
struct pxe_service *pxe_services;
struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *force_broadcast, *bootp_dynamic; struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *force_broadcast, *bootp_dynamic;
char *dhcp_hosts_file, *dhcp_opts_file; char *dhcp_hosts_file, *dhcp_opts_file;
int dhcp_max, tftp_max; int dhcp_max, tftp_max;
...@@ -643,23 +649,21 @@ extern struct daemon { ...@@ -643,23 +649,21 @@ extern struct daemon {
struct server *srv_save; /* Used for resend on DoD */ struct server *srv_save; /* Used for resend on DoD */
size_t packet_len; /* " " */ size_t packet_len; /* " " */
struct randfd *rfd_save; /* " " */ struct randfd *rfd_save; /* " " */
pid_t tcp_pids[MAX_PROCS]; pid_t tcp_pids[MAX_PROCS];
struct randfd randomsocks[RANDOM_SOCKS]; struct randfd randomsocks[RANDOM_SOCKS];
/* DHCP state */ /* DHCP state */
int dhcpfd, helperfd; int dhcpfd, helperfd;
#ifdef HAVE_LINUX_NETWORK #if defined(HAVE_LINUX_NETWORK)
int netlinkfd; int netlinkfd;
#else #elif defined(HAVE_BSD_NETWORK)
int dhcp_raw_fd, dhcp_icmp_fd; int dhcp_raw_fd, dhcp_icmp_fd;
#endif #endif
struct iovec dhcp_packet; struct iovec dhcp_packet;
char *dhcp_buff, *dhcp_buff2; char *dhcp_buff, *dhcp_buff2;
struct ping_result *ping_results; struct ping_result *ping_results;
FILE *lease_stream; FILE *lease_stream;
#ifdef HAVE_BSD_BRIDGE
struct dhcp_bridge *bridges; struct dhcp_bridge *bridges;
#endif
/* DBus stuff */ /* DBus stuff */
/* void * here to avoid depending on dbus headers outside dbus.c */ /* void * here to avoid depending on dbus headers outside dbus.c */
...@@ -676,7 +680,7 @@ pid_t tcp_pids[MAX_PROCS]; ...@@ -676,7 +680,7 @@ pid_t tcp_pids[MAX_PROCS];
/* cache.c */ /* cache.c */
void cache_init(void); void cache_init(void);
void log_query(unsigned short flags, char *name, struct all_addr *addr, char *arg); void log_query(unsigned short flags, char *name, struct all_addr *addr, char *arg);
char *record_source(struct hostsfile *addn_hosts, int index); char *record_source(int index);
void querystr(char *str, unsigned short type); void querystr(char *str, unsigned short type);
struct crec *cache_find_by_addr(struct crec *crecp, struct crec *cache_find_by_addr(struct crec *crecp,
struct all_addr *addr, time_t now, struct all_addr *addr, time_t now,
...@@ -687,11 +691,12 @@ void cache_end_insert(void); ...@@ -687,11 +691,12 @@ void cache_end_insert(void);
void cache_start_insert(void); void cache_start_insert(void);
struct crec *cache_insert(char *name, struct all_addr *addr, struct crec *cache_insert(char *name, struct all_addr *addr,
time_t now, unsigned long ttl, unsigned short flags); time_t now, unsigned long ttl, unsigned short flags);
void cache_reload(struct hostsfile *addn_hosts); void cache_reload(void);
void cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t ttd); void cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t ttd);
void cache_unhash_dhcp(void); void cache_unhash_dhcp(void);
void dump_cache(time_t now); void dump_cache(time_t now);
char *cache_get_name(struct crec *crecp); char *cache_get_name(struct crec *crecp);
char *get_domain(struct in_addr addr);
/* rfc1035.c */ /* rfc1035.c */
unsigned short extract_request(HEADER *header, size_t qlen, unsigned short extract_request(HEADER *header, size_t qlen,
...@@ -748,7 +753,7 @@ void flush_log(void); ...@@ -748,7 +753,7 @@ void flush_log(void);
/* option.c */ /* option.c */
void read_opts (int argc, char **argv, char *compile_opts); void read_opts (int argc, char **argv, char *compile_opts);
char *option_string(unsigned char opt); char *option_string(unsigned char opt, int *is_ip, int *is_name);
void reread_dhcp(void); void reread_dhcp(void);
/* forward.c */ /* forward.c */
...@@ -760,6 +765,7 @@ void server_gone(struct server *server); ...@@ -760,6 +765,7 @@ void server_gone(struct server *server);
struct frec *get_new_frec(time_t now, int *wait); struct frec *get_new_frec(time_t now, int *wait);
/* network.c */ /* network.c */
int indextoname(int fd, int index, char *name);
int local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp); int local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp);
int random_sock(int family); int random_sock(int family);
void pre_allocate_sfds(void); void pre_allocate_sfds(void);
...@@ -768,15 +774,14 @@ void check_servers(void); ...@@ -768,15 +774,14 @@ void check_servers(void);
int enumerate_interfaces(); int enumerate_interfaces();
struct listener *create_wildcard_listeners(void); struct listener *create_wildcard_listeners(void);
struct listener *create_bound_listeners(void); struct listener *create_bound_listeners(void);
int iface_check(int family, struct all_addr *addr, int iface_check(int family, struct all_addr *addr, char *name, int *indexp);
struct ifreq *ifr, int *indexp);
int fix_fd(int fd); int fix_fd(int fd);
struct in_addr get_ifaddr(char *intr); struct in_addr get_ifaddr(char *intr);
/* dhcp.c */ /* dhcp.c */
#ifdef HAVE_DHCP
void dhcp_init(void); void dhcp_init(void);
void dhcp_packet(time_t now); void dhcp_packet(time_t now);
char *get_domain(struct in_addr addr);
struct dhcp_context *address_available(struct dhcp_context *context, struct dhcp_context *address_available(struct dhcp_context *context,
struct in_addr addr, struct in_addr addr,
struct dhcp_netid *netids); struct dhcp_netid *netids);
...@@ -799,8 +804,10 @@ struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct i ...@@ -799,8 +804,10 @@ struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct i
char *strip_hostname(char *hostname); char *strip_hostname(char *hostname);
char *host_from_dns(struct in_addr addr); char *host_from_dns(struct in_addr addr);
char *get_domain(struct in_addr addr); char *get_domain(struct in_addr addr);
#endif
/* lease.c */ /* lease.c */
#ifdef HAVE_DHCP
void lease_update_file(time_t now); void lease_update_file(time_t now);
void lease_update_dns(); void lease_update_dns();
void lease_init(time_t now); void lease_init(time_t now);
...@@ -817,16 +824,21 @@ void lease_prune(struct dhcp_lease *target, time_t now); ...@@ -817,16 +824,21 @@ void lease_prune(struct dhcp_lease *target, time_t now);
void lease_update_from_configs(void); void lease_update_from_configs(void);
int do_script_run(time_t now); int do_script_run(time_t now);
void rerun_scripts(void); void rerun_scripts(void);
#endif
/* rfc2131.c */ /* rfc2131.c */
#ifdef HAVE_DHCP
size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
size_t sz, time_t now, int unicast_dest, int *is_inform); size_t sz, time_t now, int unicast_dest, int *is_inform);
unsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr, unsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr,
int clid_len, unsigned char *clid, int *len_out); int clid_len, unsigned char *clid, int *len_out);
#endif
/* dnsmasq.c */ /* dnsmasq.c */
#ifdef HAVE_DHCP
int make_icmp_sock(void); int make_icmp_sock(void);
int icmp_ping(struct in_addr addr); int icmp_ping(struct in_addr addr);
#endif
void send_event(int fd, int event, int data); void send_event(int fd, int event, int data);
void clear_cache_and_reload(time_t now); void clear_cache_and_reload(time_t now);
...@@ -855,7 +867,7 @@ void emit_dbus_signal(int action, char *mac, char *hostname, char *addr); ...@@ -855,7 +867,7 @@ void emit_dbus_signal(int action, char *mac, char *hostname, char *addr);
#endif #endif
/* helper.c */ /* helper.c */
#ifndef NO_FORK #if defined(HAVE_DHCP) && !defined(NO_FORK)
int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd); int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd);
void helper_write(void); void helper_write(void);
void queue_script(int action, struct dhcp_lease *lease, void queue_script(int action, struct dhcp_lease *lease,
......
...@@ -667,19 +667,8 @@ void receive_query(struct listener *listen, time_t now) ...@@ -667,19 +667,8 @@ void receive_query(struct listener *listen, time_t now)
/* enforce available interface configuration */ /* enforce available interface configuration */
if (if_index == 0) if (!indextoname(listen->fd, if_index, ifr.ifr_name) ||
return; !iface_check(listen->family, &dst_addr, ifr.ifr_name, &if_index))
#ifdef SIOCGIFNAME
ifr.ifr_ifindex = if_index;
if (ioctl(listen->fd, SIOCGIFNAME, &ifr) == -1)
return;
#else
if (!if_indextoname(if_index, ifr.ifr_name))
return;
#endif
if (!iface_check(listen->family, &dst_addr, &ifr, &if_index))
return; return;
if (listen->family == AF_INET && if (listen->family == AF_INET &&
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
main process. main process.
*/ */
#ifndef NO_FORK #if defined(HAVE_DHCP) && !defined(NO_FORK)
static void my_setenv(const char *name, const char *value, int *error); static void my_setenv(const char *name, const char *value, int *error);
...@@ -276,28 +276,8 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) ...@@ -276,28 +276,8 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd)
static void my_setenv(const char *name, const char *value, int *error) static void my_setenv(const char *name, const char *value, int *error)
{ {
if (*error == 0) if (*error == 0 && setenv(name, value, 1) != 0)
{ *error = errno;
#if defined(HAVE_SOLARIS_NETWORK) && !defined(HAVE_SOLARIS_PRIVS)
/* old Solaris is missing setenv..... */
char *p;
if (!(p = malloc(strlen(name) + strlen(value) + 2)))
*error = ENOMEM;
else
{
strcpy(p, name);
strcat(p, "=");
strcat(p, value);
if (putenv(p) != 0)
*error = errno;
}
#else
if (setenv(name, value, 1) != 0)
*error = errno;
#endif
}
} }
/* pack up lease data into a buffer */ /* pack up lease data into a buffer */
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include "dnsmasq.h" #include "dnsmasq.h"
#ifdef HAVE_DHCP
static struct dhcp_lease *leases = NULL, *old_leases = NULL; static struct dhcp_lease *leases = NULL, *old_leases = NULL;
static int dns_dirty, file_dirty, leases_left; static int dns_dirty, file_dirty, leases_left;
...@@ -57,7 +59,7 @@ void lease_init(time_t now) ...@@ -57,7 +59,7 @@ void lease_init(time_t now)
if (!leasestream) if (!leasestream)
die(_("cannot open or create lease file %s: %s"), daemon->lease_file, EC_FILE); die(_("cannot open or create lease file %s: %s"), daemon->lease_file, EC_FILE);
/* a+ mode lease pointer at end. */ /* a+ mode leaves pointer at end. */
rewind(leasestream); rewind(leasestream);
} }
...@@ -235,7 +237,7 @@ void lease_update_file(time_t now) ...@@ -235,7 +237,7 @@ void lease_update_file(time_t now)
if (next_event == 0 || difftime(next_event, LEASE_RETRY + now) > 0.0) if (next_event == 0 || difftime(next_event, LEASE_RETRY + now) > 0.0)
next_event = LEASE_RETRY + now; next_event = LEASE_RETRY + now;
my_syslog(LOG_ERR, _("failed to write %s: %s (retry in %us)"), my_syslog(MS_DHCP | LOG_ERR, _("failed to write %s: %s (retry in %us)"),
daemon->lease_file, strerror(err), daemon->lease_file, strerror(err),
(unsigned int)difftime(next_event, now)); (unsigned int)difftime(next_event, now));
} }
...@@ -607,6 +609,8 @@ int do_script_run(time_t now) ...@@ -607,6 +609,8 @@ int do_script_run(time_t now)
return 0; /* nothing to do */ return 0; /* nothing to do */
} }
#endif
......
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.
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