Compare commits

...

10 Commits
v2.20 ... v2.30

Author SHA1 Message Date
Simon Kelley
26d0dbaf24 import of dnsmasq-2.30.tar.gz 2012-01-05 17:31:12 +00:00
Simon Kelley
309331f52c import of dnsmasq-2.29.tar.gz 2012-01-05 17:31:12 +00:00
Simon Kelley
5e9e0efb01 import of dnsmasq-2.28.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
cdeda28f82 import of dnsmasq-2.27.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
aedef83058 import of dnsmasq-2.26.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
e17fb629a2 import of dnsmasq-2.25.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
b8187c80a8 import of dnsmasq-2.24.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
3d8df260e1 import of dnsmasq-2.23.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
91dccd0958 import of dnsmasq-2.22.tar.gz 2012-01-05 17:31:11 +00:00
Simon Kelley
0a852541d3 import of dnsmasq-2.21.tar.gz 2012-01-05 17:31:11 +00:00
51 changed files with 13966 additions and 2527 deletions

439
CHANGELOG
View File

@@ -1369,5 +1369,444 @@ version 2.20
Added preference values for MX records.
Added the --localise-queries option.
version 2.21
Improve handling of SERVFAIL and REFUSED errors. Receiving
these now initiates search for a new good server, and a
server which returns them is not a candidate as a good
server. Thanks to Istvan Varadi for pointing out the
problem.
Tweak the time code in BROKEN_RTC mode.
Sanity check lease times in dhcp-range and dhcp-host
configurations and force them to be at least two minutes
(120s) leases shorter than a minute confuse some clients,
notably Apple MacOS X. Rory Campbell-Lange found this
problem.
Only warn once about an upstream server which is refusing to do
recursive queries.
Fix DHCP address allocation problem when netid tags are in
use. Thanks to Will Murnane for the bug report and
subsequent testing.
Add an additional data section to the reply for MX and SRV
queries. Add support for DNS TXT records. Thanks to Robert
Kean and John Hampton for prompts and testing of these.
Apply address rewriting to records in the additional data section
of DNS packets. This makes things like MX records work
with the alias function. Thanks to Chad Skeeters for
pointing out the need for this.
Added support for quoted strings in config file.
Detect and defeat cache-poisoning attacks which attempt to
send (malicious) answers to questions we didn't
send. These are ignored now even if the attacker manages
to guess a random query-id.
Provide DHCP support for interfaces with multiple IP
addresses or aliases. This in only enabled under Linux.
See the FAQ entry for details.
Revisit the MAC-address and client-id matching code to
provide saner behaviour with PXE boots, where some
requests have a client-id and some don't.
Fixed off-by-one buffer overflow in lease file reading
code. Thanks to Rob Holland for the bug report.
Added wildcard matching for MAC addresses in dhcp-host
options. A sensible suggestion by Nathaniel McCallum.
version 2.22
Fixed build problems on (many) systems with older libc
headers where <linux/types.h> is required before
<linux/netlink.h>. Enabled HAVE_RTNETLINK under uclibc now
that this fix is in place.
Added support for encapsulated vendor-class-specific DHCP
options. Thanks to Eric Shattow for help with this.
Fix regression in 2.21 which broke commas in filenames and
corrupted argv. Thanks to Eric Scott for the bugreport.
Fixed stupid thinko which caused dnsmasq to wedge during
startup with certain MX-record options. Another 2.21 regression.
Fixed broken-ness when reading /etc/ethers. 2.21 broke
this too.
Fixed wedge with certain DHCP options. Yet another 2.21
regression. Rob Holland and Roy Marples chased this one
down.
version 2.23
Added a check to ensure that there cannot be more than one
dhcp-host option for any one IP address, even if the
addresses are assigned indirectly via a hostname and
/etc/hosts.
Include a "server identifier" in DHCPNAK replies, as
required by RFC2131.
Added method support for DBus
(http://www.freedesktop.org/Software/dbus)
This is a superior way to re-configure dnsmasq on-the-fly
with different upstream nameservers, as the host moves
between networks. DBus support must be enabled in
src/config.h and should be considered experimental at this
point. See DBus-interface for the specification of the
DBus method calls supported.
Added information to the FAQ about setting the DNS domain
in windows XP and Mac OS X, thanks to Rick Hull.
Added sanity check to resolv.conf polling code to cope
with backwards-moving clocks. Thanks to Leonardo Canducci
for help with this.
Handle so-called "A-for-A" queries, which are queries for
the address associated with a name which is already a
dotted-quad address. These should be handled by the
resolver code, but sometimes aren't and there's no point
in forwarding them.
Added "no-dhcp-interface" option to disable DHCP service
on an interface, whilst still providing DNS.
Fix format-string problem - config file names get passed
to fprintf as a format string, so % characters could cause
crashes. Thanks to Rob Holland for sleuthing that one.
Fixed multiple compiler warnings from gcc 4. Thanks to
Tim Cutts for the report.
Send the hostname option on DHCP offer messages as well as
DHCP ack messages. This is required by the Rio Digital
Audio Receiver. Thanks to Ron Frederick for the patch.
Add 'd' (for day) as a possible time multiplier in lease
time specifications. Thanks to Michael Deegan.
Make quoting suppress recognition of IP addresses, so
dhcp-option=66,1.2.3.4 now means something different to
dhcp-option=66,"1.2.3.4", which sets the option to a
string value. Thanks to Brian Macauley for the bug report.
Fixed the option parsing code to avoid segfaults from some
invalid configurations. Thanks to Wookey for spotting that one.
Provide information about which compile-time options were
selected, both in the log at startup and as part of the output
from dnsmasq --version. Thanks to Dirk Schenkewitz for
the suggestion.
Fix pathalogical behaviour when a broken client keeps sending
DHCPDISCOVER messages repeatedly and fast. Because dealing with
each of these takes a few seconds, (because of the ping) then a
queue of DHCP packets could build up. Now, the results of a ping
test are assumed to be valid for 30 seconds, so repeated waits are
not required. Thanks to Luca Landi for finding this.
Allow DHCPINFORM requests without hardware address
information. These are generated by some browsers, looking
for proxy information. Thanks to Stanley Jaddoe for the
bug report on that.
Add support of the "client FQDN" DHCP option. If present,
this is used to allow the client to tell dnsmasq its name,
in preference to (mis)using the hostname option. See
http://tools.ietf.org/wg/dhc/draft-ietf-dhc-fqdn-option/\
draft-ietf-dhc-fqdn-option-10.txt
for details of the draft spec.
Added startup scripts for MacOS X Tiger/Panther to the
contrib collection. Thanks to Tim Cutts.
Tweak DHCP network selection so that clients which turn up
on our network in REBINDING state and with a lease for a
foreign network will get a NAK response. Thanks to Dan
Shechter for work on this and an initial patch and thanks
to Gyorgy Farkas for further testing.
Fix DNS query forwarding for empty queries and forward
queries even when the recursion-desired bit is clear. This
allows "dig +trace" to work. Problem report from Uwe
Gansert.
Added "const" declarations where appropriate, thanks to
Andreas Mohr for the patch.
Added --bootp-dynamic option and associated
functionality. Thanks to Josef Wolf for the suggestion.
version 2.24
Updated contrib/openvpn/dnsmasq.patch from Joseph Tate.
Tweaked DHCP NAK code, a DHCP NAK is now unicast as a
fallback in cases where a broadcast is futile: namely in
response to a unicast REQUEST from a non-local network
which was not sent via a relay.
Slightly changed the semantics of domain matching in
--server and --address configs. --server=/domain.com/ still
matches domain.com and sub.domain.com but does not
now match newdomain.com The semantics of
--server=/.domain.com/ are unchanged.
Thanks to Chris Blaise for the patch.
Added backwards-compatible internationalisation support.
The existing make targets, (all, dnsmasq, install) work as
before. New ones (all-i18n, and install-i18n) add gettext.
The translations live in po/ There are not too many
strings, so if anybody can provide translations (and for
the manpage....) please send them in.
Tweak behaviour on receipt of REFUSED or SERVFAIL rcodes,
now the query gets retried on all servers before returning
the error to the source of the query. Thanks to Javier
Kohen for the report.
Added Polish translation - thanks to Tomasz Sochanski.
Changed default manpage install location from /usr/man
to /usr/share/man
Added Spanish translation - thanks to Christopher Chatham.
Log a warning when a DHCP packet is truncated due to lack
of space. (Thanks to Michael Welle for the prompt to do
this.)
Added French translation - thanks to Lionel Tricon.
Added Indonesian translation - thanks to Salman AS.
Tweaked the netlink code to cope with interface broadcast
address not set, or set to 0.0.0.0.
Fixed problem assigning fixed addresses to hosts when more
than one dhcp-range is available. Thanks to Sorin Panca
for help chasing this down.
Added more explict error mesages to the hosts file and
ethers file reading code. Markus Kaiserswerth suffered to
make this happen.
Ensure that a hostname supplied by a DHCP client can never
override one configured on the server. Previously, any
host claiming a name would be given it, even if that
over-rode a dhcp-host declaration, leading to potentially
confusing situations.
Added Slackware package-build stuff into contrib/ The i18n
effort broke the current scripts, and working ones were
needed for testing, so they ended up here rather than make
Pat re-invent the wheel.
Added Romanian translation, thanks to Sorin Panca for
that.
version 2.25
Fixed RedHat spec file for FC4 - thanks to Werner Hoelzl
and Andrew Bird.
Fixed Suse spec file - thanks to Steven Springl.
Fixed DHCP bug when two distict subnets are on the same
physical interface. Thanks to Pawel Zawora for finding
this and suggesting the fix.
Added logging to make it explicit when dnsmasq falls back
from using RT-netlink sockets to the old ioctl API for
getting information about interfaces. Doing this
completely silently made remote debugging hard.
Merged uclibc build fixes from the OpenWRT package into
src/config.h
Added Norwegian translation - thanks to Jan Erik Askildt.
version 2.26
Fixed SuSe rpm patch problem - thanks to Steven Springl.
Fixed crash when attempting to send a DHCP NAK to a host
which believes it has a lease on an unknown
network. Thanks to Lutz Pressler for the bug report and
patch.
version 2.27
Tweaked DHCP behaviour when a client attempts to renew a lease
which dnsmasq doesn't know about. Previously that would always
result in a DHCPNAK. Now, in dhcp-authoritative mode, the
lease will be created, if it's legal. This makes dnsmasq work
better if the lease database is lost, for example on an OpenWRT
system which reboots. Thanks to Stephen Rose for work on
this.
Added the ability to support RFC-3442 style destination
descriptors in dhcp-options. This makes classless static
routes easy to do, eg dhcp-option=121,192.168.1.0/24,1.2.3.4
Added error-checking to the code which writes the lease
file. If this fails for any reason, an error is logged,
and a retry occurs after one minute. This should improve
things eg when a filesystem is full. Thanks to Jens Holze
for the bug report.
Fixed breakage of the "/#/ matches any domain" facility
which happened in 2.24. Thanks to Peter Surda for the bug
report.
Use "size_t" and "ssize_t" types where appropriate in the
code.
Fix buggy CNAME handling in mixed IPv4 and IPv6
queries. Thanks to Andreas Pelme for help finding that.
Added some code to attempt to re-transmit DNS queries when
a network interface comes up. This helps on DoD links,
where frequently the packet which triggers dialling is
a DNS query, which then gets lost. By re-sending, we can
avoid the lookup failing. This function is only active
when netlink support is compiled in, and therefore only
under Linux. Thanks to Jean Wolter for help with this.
Tweaked the DHCP tag-matching code to work correctly with
NOT-tag conditions. Thanks to Lutz Pressler for finding
the bug.
Generalised netid-tag matching in dhcp-range statements to
allow more than one tag.
Added --dhcp-mac to do MAC address matching in the same
way as vendorclass and userclass matching. A good
suggestion from Lutz Pressler.
Add workaround for buggy early Microsoft DHCP clients
which need zero-termination in string options.
Thanks to Fabiano Pires for help with this.
Generalised the DHCP code to cope with any hardware
address type, at least on Linux. *BSD is still limited to
ethernet only.
version 2.28
Eliminated all raw network access when running on
Linux. All DHCP network activity now goes through the IP
stack. Packet sockets are no longer required. Apart from
being a neat hack, this should also allow DHCP over IPsec
to work better. On *BSD and OS X, the old method of raw net
access through BPF is retained.
Simplified build options. Networking is now slimmed down
to a choice of "linux" or "other". Netlink is always used
under Linux. Since netlink has been available since 2.2
and non-optional in an IPv4-configured kernel since 2.4,
and the dnsmasq netlink code is now well tested, this
should work out fine.
Removed decayed build support for libc5 and Solaris.
Removed pselect code: use a pipe for race-free signal
handling instead, as this works everywhere.
No longer enable the ISC leasefile reading code in the
distributed sources. I doubt there are many people left
using this 1.x compatibility code. Those that are will
have to explicitly enable it in src/config.h.
Don't send the "DHCP maximum message size" option, even if
requested. RFC2131 says this is a "MUST NOT".
Support larger-than-minimum DHCP message. Dnsmasq is now
happy to get larger than 576-byte DHCP messages, and will
return large messages, if permitted by the "maximum
message size" option of the message to which it is
replying. There's now an arbitrary sanity limit of 16384
bytes.
Added --no-ping option. This fixes an RFC2131 "SHOULD".
Building on the 2.27 MAC-address changes, allow clients to
provide no MAC address at all, relying on the client-id as
a unique identifier. This should make things like DHCP for
USB come easier.
Fixed regression in netlink code under 2.2.x kernels which
occurred in 2.27. Erik Jan Tromp is the vintage kernel fan
who found this. P.S. It looks like this "netlink bind:
permission denied" problem occured in kernels at least as
late a 2.4.18. Good information from Alain Richoux.
Added a warning when it's impossible to give a host its
configured address because the address is leased
elsewhere. A sensible suggestion from Mircea Bardac.
Added minimal support for RFC 3046 DHCP relay agent-id
options. The DHCP server now echoes these back to the
relay, as required by the RFC. Also, RFC 3527 link selection
sub-options are honoured.
Set the process "dumpable" flag when running in debug
mode: this makes getting core dumps from root processes
much easier.
Fixed one-byte buffer overflow which seems to only cause
problems when dnsmasq is linked with uclibc. Thanks to
Eric House and Eric Spakman for help in chasing this down.
Tolerate configuration screwups which lead to the DHCP
server attemping to allocate its own address to a
client; eg setting the whole subnet range as a DHCP
range. Addresses in use by the server are now excluded
from use by clients.
Did some thinking about HAVE_BROKEN_RTC mode, and made it
much simpler and better. The key is to just keep lease
lengths in the lease file. Since these normally never
change, even as the lease is renewed, the lease file never
needs to change except when machines arrive on the network
or leave. This eliminates the code for timed writes, and
reduces the amount of wear on a flash filesystem to the
absolute minimum. Also re-did the basic time function in
this mode to use the portable times(), rather than parsing
/proc/uptime.
Believe the source port number when replying to unicast
DHCP requests and DHCP requests via a relay, instead of always
using the standard ports. This will allow relays on
non-standard ports and DHCPINFORM from unprivileged ports
to work. The source port sent by unconfigured clients is still
ignored, since this may be unreliable. This means that a DHCP
client must use the standard port to do full configuration.
version 2.29
Fixed compilation on OpenBSD (thanks to Tom Hensel for the
report).
Fixed false "no interface" errors when --bind-interfaces is
set along with --interface=lo or --listen-address. Thanks
to Paul Wise for the report.
Updated patch for SuSE rpm. Thanks to Steven Springl.
It turns out that there are some Linux kernel
configurations which make using the capability system
impossible. If this situation occurs then continue, running
as root, and log a warning. Thanks to Scott Wehrenberg
for help tracking this down.
version 2.30
Fixed crash when a DHCP client requested a broadcast
reply. This problem was introduced in version 2.29.
Thanks to Sandra Dekkers for the bug report.

94
DBus-interface Normal file
View File

@@ -0,0 +1,94 @@
DBus support must be enabled at compile-time and run-time. Ensure
that src/config.h contains the line
#define HAVE_DBUS.
and that /etc/dnsmasq.conf contains the line
enable-dbus
Because dnsmasq can operate stand-alone from the DBus, and may need to provide
service before the dbus daemon is available, it will continue to run
if the DBus connection is not available at startup. The DBus will be polled
every 250ms until a connection is established. Start of polling and final
connection establishment are both logged. When dnsmasq establishes a
connection to the dbus, it sends the signal "Up". Anything controlling
the server settings in dnsmasq should re-invoke the SetServers method
(q.v.) when it sees this signal. This allows dnsmasq to be restarted
and avoids startup races with the provider of nameserver information.
Dnsmasq provides one service on the DBus: uk.org.thekelleys.dnsmasq
and a single object: /uk/org/thekelleys/dnsmasq
Methods are of the form
uk.org.thekelleys.<method>
Available methods are:
GetVersion
----------
Returns a string containing the version of dnsmasq running.
ClearCache
----------
Returns nothing. Clears the domain name cache and re-reads
/etc/hosts. The same as sending dnsmasq a HUP signal.
SetServers
----------
Returns nothing. Takes a set of arguments representing the new
upstream DNS servers to be used by dnsmasq. IPv4 addresses are
represented as a UINT32 (in network byte order) and IPv6 addresses
are represented as sixteen BYTEs (since there is no UINT128 type).
Each server address may be followed by one or more STRINGS, which are
the domains for which the preceding server should be used.
Examples.
UINT32: <address1>
UNIT32: <address2>
is equivalent to
--server=<address1> --server=<address2>
UINT32 <address1>
UINT32 <address2>
STRING "somedomain.com"
is equivalent to
--server=<address1> --server=/somedomain.com/<address2>
UINT32 <address1>
UINT32 <address2>
STRING "somedomain.com"
UINT32 <address3>
STRING "anotherdomain.com"
STRING "thirddomain.com"
is equivalent to
--server=<address1>
--server=/somedomain.com/<address2>
--server=/anotherdomain.com/thirddomain.com/<address3>
Am IPv4 address of 0.0.0.0 is interpreted as "no address, local only",
so
UINT32: <0.0.0.0>
STRING "local.domain"
is equivalent to
--local=/local.domain/
Each call to SetServers completely replaces the set of servers
specified by via the DBus, but it leaves any servers specified via the
command line or /etc/dnsmasq.conf or /etc/resolv.conf alone.

119
FAQ
View File

@@ -21,8 +21,7 @@ Q: Why doesn't dnsmasq support DNS queries over TCP? Don't the RFC's specify
that?
A: Update: from version 2.10, it does. There are a few limitations:
data obtained via TCP is not cached, and dynamically-created
interfaces may break under certain circumstances. Source-address
data obtained via TCP is not cached, and source-address
or query-port specifications are ignored for TCP.
Q: When I send SIGUSR1 to dump the contents of the cache, some entries have
@@ -40,18 +39,15 @@ A: They are negative entries: that's what the N flag means. Dnsmasq asked
Q: Will dnsmasq compile/run on non-Linux systems?
A: Yes, there is explicit support for *BSD and Solaris.
A: Yes, there is explicit support for *BSD and MacOS X. There are
start-up scripts for MacOS X Tiger and Panther in /contrib. Earlier
dnsmasq releases ran under Solaris, but that capability has
probably rotted. Dnsmasq will link with uclibc to provide small
binaries suitable for use in embedded systems such as
routers. (There's special code to support machines with flash
filesystems and no battery-backed RTC.)
For other systems, try altering the settings in config.h.
A: Update for V2. Doing DHCP is rather non-portable, so there may be
a few teething troubles. The initial 2.0 release is known to work
on Linux 2.2.x, Linux 2.4.x and Linux 2.6.x with uclibc and glibc
2.3. It also works on FreeBSD 4.8. The crucial problem is sending
raw packets, bypassing the IP stack. Dnsmasq contains code to do
using PF_PACKET sockets (which is for Linux) and the Berkeley packet
filter (which works with BSD). If you are trying to port to another
Un*x, bpf is the most likeley candidate. See config.h
Q: My companies' nameserver knows about some names which aren't in the
public DNS. Even though I put it first in /etc/resolv.conf, it
dosen't work: dnsmasq seems not to use the nameservers in the order
@@ -89,7 +85,7 @@ A: This has been seen when a system is bringing up a PPP interface at
Q: I'm running on BSD and dnsmasq won't accept long options on the
command line.
A: Dnsmasq when built on BSD systems doesn't use GNU getopt by
A: Dnsmasq when built on some BSD systems doesn't use GNU getopt by
default. You can either just use the single-letter options or
change config.h and the Makefile to use getopt-long. Note that
options in /etc/dnsmasq.conf must always be the long form,
@@ -106,13 +102,23 @@ A: Resolver code sometime does strange things when given names without
"ping" will get a lookup failure, appending a dot to the end of the
hostname will fix things. (ie "ping myhost" fails, but "ping
myhost." works. The solution is to make sure that all your hosts
have a domain set ("domain" in resolv.conf, the network applet in
windows, or set a domain in your DHCP server). Any domain will do,
but "localnet" is traditional. Now when you resolve "myhost" the
resolver will attempt to look up "myhost.localnet" so you need to
have dnsmasq reply to that name. The way to do that is to include
the domain in each name on /etc/hosts and/or to use the
--expand-hosts and --domain-suffix options.
have a domain set ("domain" in resolv.conf, or set a domain in
your DHCP server, see below fr Windows XP and Mac OS X).
Any domain will do, but "localnet" is traditional. Now when you
resolve "myhost" the resolver will attempt to look up
"myhost.localnet" so you need to have dnsmasq reply to that name.
The way to do that is to include the domain in each name on
/etc/hosts and/or to use the --expand-hosts and --domain options.
Q: How do I set the DNS domain in Windows XP or MacOS X (ref: previous
question)?
A: for XP, Control Panel > Network Connections > { Connection to gateway /
DNS } > Properties > { Highlight TCP/IP } > Properties > Advanced >
DNS Tab > DNS suffix for this connection:
A: for OS X, System Preferences > Network > {Connection to gateway / DNS } >
Search domains:
Q: Can I get dnsmasq to save the contents of its cache to disk when
I shut my machine down and re-load when it starts again?
@@ -282,7 +288,9 @@ Q: Can I get email notification when a new version of dnsmasq is
A: Yes, new releases of dnsmasq are always announced through
freshmeat.net, and they allow you to subcribe to email alerts when
new versions of particular projects are released.
new versions of particular projects are released. New releases are
also announced in the dnsmasq-discuss mailing list, subscribe at
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
Q: What does the dhcp-authoritative option do?
@@ -302,7 +310,7 @@ A: Because when a Gentoo box shuts down, it releases its lease with
Q: My laptop has two network interfaces, a wired one and a wireless
one. I never use both interfaces at the same time, and I'd like the
same IP and configuration to be used irrespcetive of which
interface is in use. How can I do that.
interface is in use. How can I do that?
A: By default, the identity of a machine is determined by using the
MAC address, which is associated with interface hardware. Once an
@@ -316,5 +324,70 @@ A: By default, the identity of a machine is determined by using the
dhcpcd uses the "-I" flag. Windows uses a registry setting,
see http://www.jsiinc.com/SUBF/TIP2800/rh2845.htm
Q: Can dnsmasq do DHCP on IP-alias interfaces?
A: Yes, from version-2.21. The support is only available running under
Linux, on a kernel which provides the RT-netlink facility. All 2.4
and 2.6 kernels provide RT-netlink and it's an option in 2.2
kernels.
If a physical interface has more than one IP address or aliases
with extra IP addresses, then any dhcp-ranges corresponding to
these addresses can be used for address allocation. So if an
interface has addresses 192.168.1.0/24 and 192.68.2.0/24 and there
are DHCP ranges 192.168.1.100-192.168.1.200 and
192.168.2.100-192.168.2.200 then both ranges would be used for host
connected to the physical interface. A more typical use might be to
have one of the address-ranges as static-only, and have known
hosts allocated addresses on that subnet using dhcp-host options,
while anonymous hosts go on the other.
Q: Dnsmasq sometimes logs "nameserver xxx.xxx.xxx.xxx refused
to do a recursive query" and DNS stops working. What's going on?
A: Probably the nameserver is an authoritative nameserver for a
particular domain, but is not configured to answer general DNS
queries for an arbitrary domain. It is not suitable for use by
dnsmasq as an upstream server and should be removed from the
configuration. Note that if you have more than one upstream
nameserver configured dnsmasq will load-balance across them and
it may be some time before dnsmasq gets around to using a
particular nameserver. This means that a particular configuration
may work for sometime with a broken upstream nameserver
configuration.
Q: Does the dnsmasq DHCP server probe addresses before allocating
them, as recommended in RFC2131?
A: Yes, dynmaically allocated IP addresses are checked by sending an
ICMP echo request (ping). If a reply is received, then dnsmasq
assumes that the address is in use, and attempts to allocate an
different address. The wait for a reply is between two and three
seconds. Because the DHCP server is not re-entrant, it cannot serve
other DHCP requests during this time. To avoid dropping requests,
the address probe may be skipped when dnsmasq is under heavy load.
Q: I'm using dnsmasq on a machine with the Firestarter firewall, and
DHCP doesn't work. What's the problem?
A: This a variant on the iptables problem. Explicit details on how to
proceed can be found at
http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/2005q3/000431.html
Q: Dnsmasq logs "running as root because setting capabilities failed"
when it starts up. Why did that happen and what can do to fix it?
A: Change your kernel configuration: either deselect CONFIG_SECURITY
_or_ select CONFIG_SECURITY_CAPABILITIES.

View File

@@ -1,22 +1,42 @@
PREFIX?=/usr/local
BINDIR = ${PREFIX}/sbin
MANDIR = ${PREFIX}/man
MANDIR = ${PREFIX}/share/man
LOCALEDIR = ${PREFIX}/share/locale
SRC = src
PO = po
MAN = man
CFLAGS?= -O2
all :
@cd $(SRC); $(MAKE) dnsmasq
$(MAKE) I18N=-DNO_GETTEXT -f ../bld/Makefile -C $(SRC) dnsmasq
clean :
rm -f *~ contrib/*/*~ */*~ $(SRC)/*.o $(SRC)/dnsmasq core build
rm -f *~ $(SRC)/*.mo contrib/*/*~ */*~ $(SRC)/*.pot
rm -f $(SRC)/*.o $(SRC)/dnsmasq core */core
install : all
install : all install-common
install-common :
install -d $(DESTDIR)$(BINDIR) -d $(DESTDIR)$(MANDIR)/man8
install -m 644 dnsmasq.8 $(DESTDIR)$(MANDIR)/man8
install -m 644 $(MAN)/dnsmasq.8 $(DESTDIR)$(MANDIR)/man8
install -m 755 $(SRC)/dnsmasq $(DESTDIR)$(BINDIR)
all-i18n :
$(MAKE) I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' -f ../bld/Makefile -C $(SRC) dnsmasq
cd $(PO); for f in *.po; do \
$(MAKE) -f ../bld/Makefile -C ../$(SRC) $${f/.po/.mo}; \
done
install-i18n : all-i18n install-common
cd $(SRC); ../bld/install-mo $(DESTDIR)$(LOCALEDIR)
cd $(MAN); ../bld/install-man $(DESTDIR)$(MANDIR)
merge :
$(MAKE) I18N=-DLOCALEDIR='\"$(LOCALEDIR)\"' -f ../bld/Makefile -C $(SRC) dnsmasq.pot
cd $(PO); for f in *.po; do \
msgmerge -U $$f ../$(SRC)/dnsmasq.pot; \
done

18
bld/Makefile Normal file
View File

@@ -0,0 +1,18 @@
CFLAGS ?= -O2
PKG_CONFIG ?= pkg-config
OBJS = cache.o rfc1035.o util.o option.o forward.o isc.o network.o \
dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o
.c.o:
$(CC) $(CFLAGS) $(I18N) `../bld/pkg-wrapper $(PKG_CONFIG) --cflags dbus-1` $(RPM_OPT_FLAGS) -Wall -W -c $<
dnsmasq : $(OBJS)
$(CC) -o $@ $(OBJS) `../bld/pkg-wrapper $(PKG_CONFIG) --libs dbus-1` $(LIBS)
dnsmasq.pot : $(OBJS:.o=.c) dnsmasq.h config.h
xgettext -d dnsmasq --foreign-user --keyword=_ -o dnsmasq.pot -i $(OBJS:.o=.c)
%.mo : ../po/%.po dnsmasq.pot
msgmerge -o - ../po/$*.po dnsmasq.pot | msgfmt -o $*.mo -

9
bld/install-man Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
for f in *; do
if [ -d $f ]; then
install -d $1/$f/man8
install -m 644 $f/dnsmasq.8 $1/$f/man8
echo installing $1/$f/man8/dnsmasq.8
fi
done

9
bld/install-mo Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
for f in *.mo; do
install -d $1/${f/.mo/}/LC_MESSAGES
install -m 644 $f $1/${f/.mo/}/LC_MESSAGES/dnsmasq.mo
echo installing $1/${f/.mo/}/LC_MESSAGES/dnsmasq.mo
done

7
bld/pkg-wrapper Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
if grep -q "^\#.*define.*HAVE_DBUS" config.h ; then
exec $*
fi

22
contrib/dnsmasq_MacOSX/DNSmasq Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/sh
. /etc/rc.common
StartService() {
if [ "${DNSMASQ:=-NO-}" = "-YES-" ] ; then
/usr/local/sbin/dnsmasq -q -n
fi
}
StopService() {
pid=`GetPID dnsmasq`
if [ $? -eq 0 ]; then
kill $pid
fi
}
RestartService() {
StopService "$@"
StartService "$@"
}
RunService "$1"

View File

@@ -0,0 +1,42 @@
{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf100
{\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fnil\fcharset77 Monaco;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\margl1440\margr1440\vieww11120\viewh10100\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
\f0\fs24 \cf0 1. If you've used DNSenabler, or if you're using Mac OS X Server, or if you have in any other way activated Mac OS X's built-in DHCP and/or DNS servers, disable them. This would usually involve checking that they are either set to -NO- or absent altogether in
\f1 /etc/hostconfig
\f0 . If you've never done anything to do with DNS or DHCP servers on a client version of MacOS X, you won't need to worry about this; it will already be configured for you.\
\
2. Add a configuration item to
\f1 /etc/hostconfig
\f0 as follows:\
\
\f1 DNSMASQ=-YES-
\f0 \
\
3. Create a system-wide StartupItems directory for dnsmasq:\
\
\f1 sudo mkdir -p /Library/StartupItems/DNSmasq\
\f0 \
4. Copy the files
\f1 DNSmasq
\f0 and
\f1 StartupParameters.plist
\f0 into this directory, and make sure the former is executable:\
\
\f1 sudo cp DNSmasq StartupParameters.plist /Library/StartupItems/DNSmasq\
sudo chmod 755 /Library/StartupItems/DNSmasq/DNSmasq\
\f0 \
5. Start the service:\
\
\f1 sudo /Library/StartupItems/DNSmasq/DNSmasq start\
\f0 \cf0 \
That should be all...}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>DNSmasq</string>
<key>OrderPreference</key>
<string>None</string>
<key>Provides</key>
<array>
<string>DNSmasq</string>
</array>
<key>Uses</key>
<array>
<string>Network</string>
</array>
</dict>
</plist>

44
contrib/openvpn/README Normal file
View File

@@ -0,0 +1,44 @@
The patch I have attached lets me get the behavior I wish out of
dnsmasq. I also include my version of dhclient-enter-hooks as
required for the switchover from pre-dnsmasq and dhclient.
On 8/16/05, Joseph Tate <dragonstrider@gmail.com> wrote:
> I'm trying to use dnsmasq on a laptop in order to facilitate openvpn
> connections. As such, the only configuration option I'm concerned
> about is a single server=3D/example.com/192.168.0.1 line.
>
> The way I currently have it set up is I modified dhclient to write its
> resolv.conf data to /etc/resolv.conf.dhclient and configured
> /etc/dnsmasq.conf to look there for its upstream dns servers.
> /etc/resolv.conf is set to nameserver 127.0.0.1
>
> All of this works great. When I start the openvpn service, it the
> routes, and queries to the domain in the server=3D line work just fine.
>
> The only problem is that the hostname for my system doesn't get set
> correctly. With the resolv.conf data written to something other than
> /etc/resolv.conf, the ifup scripts don't have a valid dns server to do
> the ipcalc call to set the laptop's hostname. If I start dnsmasq
> before the network comes up, something gets fubar'd. I'm not sure how
> to describe it exactly, but network services are slow to load, and
> restarting networking and dnsmasq doesn't solve the problem. Perhaps
> dnsmasq is answering the dhcp request when the network starts?
> Certainly not desired behavior.
>
> Anyway, my question: is there a way to have the best of both worlds?
> DHCP requests to another server, and DNS lookups that work at all
> times?
>
> My current best idea on how to solve this problem is modifying the
> dnsmasq initscript to tweak /etc/dhclient-enter-hooks to change where
> dhclient writes resolv.conf data, and fixing up /etc/resolv.conf on
> the fly to set 127.0.0.1 to the nameserver (and somehow keep the
> search domains intact), but I'm hoping that I'm just missing some key
> piece of the puzzle and that this problem has been solved before. Any
> insights?
>
> --
> Joseph Tate
> Personal e-mail: jtate AT dragonstrider DOT com
> Web: http://www.dragonstrider.com
>

View File

@@ -0,0 +1,30 @@
#!/bin/bash
function save_previous() {
if [ -e $1 -a ! -e $1.predhclient ]; then
mv $1 $1.predhclient
fi
}
function write_resolv_conf() {
RESOLVCONF=$1
if [ -n "$new_domain_name" ] || [ -n "$new_domain_name_servers" ]; then
save_previous $RESOLVCONF
echo '; generated by /etc/dhclient-enter-hooks' > $RESOLVCONF
if [ -n "$SEARCH" ]; then
echo search $SEARCH >> $RESOLVCONF
else
if [ -n "$new_domain_name" ]; then
echo search $new_domain_name >> $RESOLVCONF
fi
fi
chmod 644 $RESOLVCONF
for nameserver in $new_domain_name_servers; do
echo nameserver $nameserver >>$RESOLVCONF
done
fi
}
make_resolv_conf() {
write_resolv_conf /etc/resolv.conf
}

View File

@@ -0,0 +1,61 @@
--- dnsmasq-2.22/rpm/dnsmasq.rh 2005-03-24 09:51:18.000000000 -0500
+++ dnsmasq-2.22/rpm/dnsmasq.rh.new 2005-08-25 10:52:04.310568784 -0400
@@ -2,7 +2,7 @@
#
# Startup script for the DNS caching server
#
-# chkconfig: 2345 99 01
+# chkconfig: 2345 07 89
# description: This script starts your DNS caching server
# processname: dnsmasq
# pidfile: /var/run/dnsmasq.pid
@@ -10,6 +10,25 @@
# Source function library.
. /etc/rc.d/init.d/functions
+function setup_dhclient_enter_hooks() {
+ if [ -f /etc/dhclient-enter-hooks ]; then
+ . /etc/dhclient-enter-hooks
+ cp /etc/resolv.conf /etc/resolv.conf.dnsmasq
+ cp /etc/dhclient-enter-hooks /etc/dhclient-enter-hooks.dnsmasq
+ sed -e 's/resolv\.conf$/resolv.conf.dnsmasq/' /etc/dhclient-enter-hooks.dnsmasq > /etc/dhclient-enter-hooks
+ sed -e 's/\(nameserver[ tab]\+\)[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/\1127.0.0.1/' /etc/resolv.conf.dnsmasq > /etc/resolv.conf
+ fi
+}
+
+function teardown_dhclient_enter_hooks() {
+ if [ -f /etc/dhclient-enter-hooks -a -f /etc/dhclient-enter-hooks.dnsmasq ]; then
+ if [ -f /etc/resolv.conf.dnsmasq ]; then
+ mv /etc/resolv.conf.dnsmasq /etc/resolv.conf
+ fi
+ mv /etc/dhclient-enter-hooks.dnsmasq /etc/dhclient-enter-hooks
+ fi
+}
+
# Source networking configuration.
. /etc/sysconfig/network
@@ -24,7 +43,7 @@
MAILHOSTNAME=""
# change this line if you want dns to get its upstream servers from
# somewhere other that /etc/resolv.conf
-RESOLV_CONF=""
+RESOLV_CONF="/etc/resolv.conf.dnsmasq"
# change this if you want dnsmasq to cache any "hostname" or "client-hostname" from
# a dhcpd's lease file
@@ -54,6 +73,7 @@
case "$1" in
start)
echo -n "Starting dnsmasq: "
+ setup_dhclient_enter_hooks
daemon $dnsmasq $OPTIONS
RETVAL=$?
echo
@@ -62,6 +82,7 @@
stop)
if test "x`pidof dnsmasq`" != x; then
echo -n "Shutting down dnsmasq: "
+ teardown_dhclient_enter_hooks
killproc dnsmasq
fi
RETVAL=$?

View File

@@ -0,0 +1,56 @@
#!/bin/sh
CWD=`pwd`
PKG=/tmp/package-dnsmasq
VERSION=2.24
ARCH=${ARCH:-i486}
BUILD=${BUILD:-1}
if [ "$ARCH" = "i386" ]; then
SLKCFLAGS="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
SLKCFLAGS="-O2 -march=i486 -mcpu=i686"
elif [ "$ARCH" = "s390" ]; then
SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2"
fi
rm -rf $PKG
mkdir -p $PKG
cd /tmp
rm -rf dnsmasq-$VERSION
tar xzvf $CWD/dnsmasq-$VERSION.tar.gz
cd dnsmasq-$VERSION
zcat $CWD/dnsmasq.leasedir.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit
chown -R root.root .
make install-i18n PREFIX=/usr DESTDIR=$PKG MANDIR=/usr/man
chmod 755 $PKG/usr/sbin/dnsmasq
chown -R root.bin $PKG/usr/sbin
gzip -9 $PKG/usr/man/man8/dnsmasq.8
for f in $PKG/usr/share/man/*; do
if [ -f $$f/man8/dnsmasq.8 ]; then
gzip -9 $$f/man8/dnsmasq.8 ;
fi
done
gzip -9 $PKG/usr/man/*/man8/dnsmasq.8
mkdir -p $PKG/var/state/dnsmasq
( cd $PKG
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
)
mkdir $PKG/etc
cat dnsmasq.conf.example > $PKG/etc/dnsmasq.conf.new
mkdir $PKG/etc/rc.d
zcat $CWD/rc.dnsmasq.gz > $PKG/etc/rc.d/rc.dnsmasq.new
mkdir -p $PKG/usr/doc/dnsmasq-$VERSION
cp -a \
CHANGELOG COPYING FAQ UPGRADING_to_2.0 doc.html setup.html \
$PKG/usr/doc/dnsmasq-$VERSION
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh
cd $PKG
makepkg -l y -c n ../dnsmasq-$VERSION-$ARCH-$BUILD.tgz

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,19 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
dnsmasq: dnsmasq (small DNS and DHCP server)
dnsmasq:
dnsmasq: Dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP
dnsmasq: server. It is designed to provide DNS (and optionally DHCP) to a
dnsmasq: small network, and can serve the names of local machines which are not
dnsmasq: in the global DNS.
dnsmasq:
dnsmasq: Dnsmasq was written by Simon Kelley.
dnsmasq:
dnsmasq:
dnsmasq:

View File

@@ -5,9 +5,9 @@
###############################################################################
Name: dnsmasq
Version: 2.20
Version: 2.30
Release: 1
Copyright: GPL
License: GPL
Group: System Environment/Daemons
Vendor: Simon Kelley
Packager: Simon Kelley
@@ -38,7 +38,7 @@ leases and BOOTP for network booting of diskless machines.
%prep
%setup -q
%build
make
make all-i18n PREFIX=/usr
###############################################################################
@@ -55,9 +55,9 @@ mkdir -p -m 755 $RPM_BUILD_ROOT/etc/rc.d/init.d
mkdir -p -m 755 $RPM_BUILD_ROOT/usr/share/man/man8
cp rpm/dnsmasq.rh $RPM_BUILD_ROOT/etc/rc.d/init.d/dnsmasq
strip src/dnsmasq
make install-i18n DESTDIR=$RPM_BUILD_ROOT PREFIX=/usr
strip $RPM_BUILD_ROOT/usr/sbin/dnsmasq
cp src/dnsmasq $RPM_BUILD_ROOT/usr/sbin
cp dnsmasq.8 $RPM_BUILD_ROOT/usr/share/man/man8
cp dnsmasq.conf.example $RPM_BUILD_ROOT/etc/dnsmasq.conf
###############################################################################
@@ -127,6 +127,7 @@ fi
%attr(0755,root,root) /etc/rc.d/init.d/dnsmasq
%attr(0664,root,root) /etc/dnsmasq.conf
%attr(0755,root,root) /usr/sbin/dnsmasq
#%attr(0644,root,root) /usr/share/man/*/man8/dnsmasq*
%attr(0644,root,root) /usr/share/man/man8/dnsmasq*
%attr(0644,root,root) /usr/share/locale/*/LC_MESSAGES/*

View File

@@ -5,7 +5,7 @@
###############################################################################
Name: dnsmasq
Version: 2.20
Version: 2.30
Release: 1
Copyright: GPL
Group: Productivity/Networking/DNS/Servers
@@ -43,7 +43,7 @@ patch -p0 <rpm/%{name}-SuSE.patch
%build
%{?suse_update_config:%{suse_update_config -f}}
make
make all-i18n DESTDIR=$RPM_BUILD_ROOT PREFIX=/usr
###############################################################################
#
@@ -54,15 +54,11 @@ make
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p ${RPM_BUILD_ROOT}/etc/init.d
mkdir -p ${RPM_BUILD_ROOT}/usr/sbin
mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man8
make install-i18n DESTDIR=$RPM_BUILD_ROOT PREFIX=/usr
install -o root -g root -m 755 rpm/rc.dnsmasq-suse $RPM_BUILD_ROOT/etc/init.d/dnsmasq
install -o root -g root -m 644 dnsmasq.conf.example $RPM_BUILD_ROOT/etc/dnsmasq.conf
strip src/dnsmasq
install -o root -g root -m 755 src/dnsmasq $RPM_BUILD_ROOT/usr/sbin
strip $RPM_BUILD_ROOT/usr/sbin/dnsmasq
ln -sf ../../etc/init.d/dnsmasq $RPM_BUILD_ROOT/usr/sbin/rcdnsmasq
gzip -9 dnsmasq.8
install -o root -g root -m 644 dnsmasq.8.gz $RPM_BUILD_ROOT%{_mandir}/man8
###############################################################################
#
@@ -108,6 +104,7 @@ rm -rf $RPM_BUILD_ROOT
%config /etc/dnsmasq.conf
/usr/sbin/rcdnsmasq
/usr/sbin/dnsmasq
/usr/share/locale/*/LC_MESSAGES/*
%doc %{_mandir}/man8/dnsmasq.8.gz

View File

@@ -4,13 +4,13 @@
# as the long options legal on the command line. See
# "/usr/sbin/dnsmasq --help" or "man 8 dnsmasq" for details.
# The following two options make you a better netizen, since they
# The following two options make you a better netizen, since they
# tell dnsmasq to filter out queries which the public DNS cannot
# answer, and which load the servers (especially the root servers)
# answer, and which load the servers (especially the root servers)
# uneccessarily. If you have a dial-on-demand link they also stop
# these requests from bringing up the link uneccessarily.
# Never forward plain names (with a dot or domain part)
# Never forward plain names (without a dot or domain part)
domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv
@@ -18,14 +18,14 @@ bogus-priv
# Uncomment this to filter useless windows-originated DNS requests
# which can trigger dial-on-demand links needlessly.
# Note that (amongst other things) this blocks all SRV requests,
# Note that (amongst other things) this blocks all SRV requests,
# so don't use it if you use eg Kerberos.
# This option only affects forwarding, SRV records originating for
# dnsmasq (via srv-host= lines) are not suppressed by it.
#filterwin2k
# Change this line if you want dns to get its upstream servers from
# somewhere other that /etc/resolv.conf
# somewhere other that /etc/resolv.conf
#resolv-file=
# By default, dnsmasq will send queries to any of the upstream
@@ -36,7 +36,7 @@ bogus-priv
#strict-order
# If you don't want dnsmasq to read /etc/resolv.conf or any other
# file, getting its servers for this file instead (see below), then
# file, getting its servers from this file instead (see below), then
# uncomment this
#no-resolv
@@ -44,7 +44,7 @@ bogus-priv
# files for changes and re-read them then uncomment this.
#no-poll
# Add other name servers here, with domain specs if they are for
# Add other name servers here, with domain specs if they are for
# non-public domains.
#server=/localnet/192.168.0.1
@@ -62,8 +62,9 @@ bogus-priv
#user=
#group=
# If you want dnsmasq to listen for requests only on specified interfaces
# (and the loopback) give the name of the interface (eg eth0) here.
# If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.
#interface=
# Or you can specify which interface _not_ to listen on
@@ -71,15 +72,19 @@ bogus-priv
# Or which to listen on by address (remember to include 127.0.0.1 if
# you use this.)
#listen-address=
# If you want dnsmasq to provide only DNS service on an interface,
# configure it as shown above, and then use the following line to
# disable DHCP on it.
#no-dhcp-interface=
# On systems which support it, dnsmasq binds the wildcard address,
# even when it is listening on only some interfaces. It then discards
# requests that it shouldn't reply to. This has the advantage of
# requests that it shouldn't reply to. This has the advantage of
# working even when interfaces come and go and change address. If you
# want dnsmasq to really bind only the interfaces it is listening on,
# uncomment this option. About the only time you may need this is when
# uncomment this option. About the only time you may need this is when
# running another nameserver on the same machine.
#bind-interfaces
#bind-interfaces
# If you don't want dnsmasq to read /etc/hosts, uncomment the
# following line.
@@ -100,16 +105,16 @@ bogus-priv
# domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
#domain=thekelleys.org.uk
# Uncomment this to enable the integrated DHCP server, you need
# to supply the range of addresses available for lease and optionally
# to supply the range of addresses available for lease and optionally
# a lease time. If you have more than one network, you will need to
# repeat this for each network on which you want to supply DHCP
# service.
#dhcp-range=192.168.0.50,192.168.0.150,12h
# This is an example of a DHCP range where the netmask is given. This
# is needed for networks we reach the dnsmasq DHCP server via a relay
# is needed for networks we reach the dnsmasq DHCP server via a relay
# agent. If you don't know what a DHCP relay agent is, you probably
# don't need to worry about this.
#dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h
@@ -124,7 +129,7 @@ bogus-priv
# need to be on the same network. The order of the parameters in these
# do not matter, it's permissble to give name,adddress and MAC in any order
# Always allocate the host with ethernet address 11:22:33:44:55:66
# Always allocate the host with ethernet address 11:22:33:44:55:66
# The IP address 192.168.0.60
#dhcp-host=11:22:33:44:55:66,192.168.0.60
@@ -140,7 +145,7 @@ bogus-priv
# 192.168.0.70 and an infinite lease
#dhcp-host=bert,192.168.0.70,infinite
# Always give the host with client identifier 01:02:02:04
# Always give the host with client identifier 01:02:02:04
# the IP address 192.168.0.60
#dhcp-host=id:01:02:02:04,192.168.0.60
@@ -153,28 +158,36 @@ bogus-priv
# it asks for a DHCP lease.
#dhcp-host=judge
# Never offer DHCP service to a machine whose ethernet
# Never offer DHCP service to a machine whose ethernet
# address is 11:22:33:44:55:66
#dhcp-host=11:22:33:44:55:66,ignore
# Ignore any client-id presented by the machine with ethernet
# address 11:22:33:44:55:66. This is useful to prevent a machine
# address 11:22:33:44:55:66. This is useful to prevent a machine
# being treated differently when running under different OS's or
# between PXE boot and OS boot.
#dhcp-host=11:22:33:44:55:66,id:*
# Send extra options which are tagged as "red" to
# Send extra options which are tagged as "red" to
# the machine with ethernet address 11:22:33:44:55:66
#dhcp-host=11:22:33:44:55:66,net:red
# Send extra options which are tagged as "red" to
# any machine with ethernet address starting 11:22:33:
#dhcp-host=11:22:33:*:*:*,net:red
# Send extra options which are tagged as "red" to any machine whose
# DHCP vendorclass string includes the substring "Linux"
#dhcp-vendorclass=red,Linux
# Send extra options which are tagged as "red" to any machine one
# Send extra options which are tagged as "red" to any machine one
# of whose DHCP userclass strings includes the substring "accounts"
#dhcp-userclass=red,accounts
# Send extra options which are tagged as "red" to any machine whose
# MAC address matches the pattern.
#dhcp-mac=red,00:60:8C:*:*:*
# If this line is uncommented, dnsmasq will read /etc/ethers and act
# on the ethernet-address/IP pairs found there just as if they had
# been given as --dhcp-host options. Useful if you keep
@@ -195,10 +208,14 @@ bogus-priv
# DNS server - 6
# broadcast address - 28
# Override the default route supplied by dnsmasq, which assumes the
# router is the same machine as the one running dnsmasq.
#dhcp-option=3,1.2.3.4
# Set the NTP time server addresses to 192.168.0.4 and 10.10.0.5
#dhcp-option=42,192.168.0.4,10.10.0.5
# Set the NTP time server address to be the same machine as
# Set the NTP time server address to be the same machine as
# is running dnsmasq
#dhcp-option=42,0.0.0.0
@@ -215,17 +232,17 @@ bogus-priv
#dhcp-option=128,e4:45:74:68:00:00
#dhcp-option=129,NIC=eepro100
# Specify an option which will only be sent to the "red" network
# Specify an option which will only be sent to the "red" network
# (see dhcp-range for the declaration of the "red" network)
#dhcp-option=red,42,192.168.1.1
# The following DHCP options set up dnsmasq in the same way as is specified
# for the ISC dhcpcd in
# for the ISC dhcpcd in
# http://www.samba.org/samba/ftp/docs/textdocs/DHCP-Server-Configuration.txt
# adapted for a typical dnsmasq installation where the host running
# dnsmasq is also the host running samba.
# you may want to uncomment them if you use Windows clients and Samba.
#dhcp-option=19,0 # option ip-forwarding off
#dhcp-option=19,0 # option ip-forwarding off
#dhcp-option=44,0.0.0.0 # set netbios-over-TCP/IP nameserver(s) aka WINS server(s)
#dhcp-option=45,0.0.0.0 # netbios datagram distribution server
#dhcp-option=46,8 # netbios node type
@@ -233,7 +250,17 @@ bogus-priv
# Send RFC-3397 DNS domain search DHCP option. WARNING: Your DHCP client
# probably doesn't support this......
#dhcp-option=119,eng.apple.com,marketing.apple.com
#dhcp-option=119,eng.apple.com,marketing.apple.com
# Send RFC-3442 classless static routes (note the netmask encoding)
#dhcp-option=121,192.168.1.0/24,1.2.3.4,10.0.0.0/8,5.6.7.8
# Send encapsulated vendor-class specific options. The vendor-class
# is sent as DHCP option 60, and all the options marked with the
# vendor class are send encapsulated in DHCP option 43. The meaning of
# the options is defined by the vendor-class. This example sets the
# mtftp address to 0.0.0.0 for PXEClients
#dhcp-option=vendor:PXEClient,1,0.0.0.0
# Set the boot filename and tftpd server name and address
# for BOOTP. You will only need this is you want to
@@ -248,10 +275,10 @@ bogus-priv
# the line below.
#dhcp-leasefile=/var/lib/misc/dnsmasq.leases
# Set the DHCP server to authoritative mode. In this mode it will barge in
# and take over the lease for any client which broadcasts on the network,
# Set the DHCP server to authoritative mode. In this mode it will barge in
# and take over the lease for any client which broadcasts on the network,
# whether it has a record of the lease or not. This avoids long timeouts
# when a machine wakes up on a new network. DO NOT enable this if there's
# when a machine wakes up on a new network. DO NOT enable this if there's
# the slighest chance that you might end up accidentally configuring a DHCP
# server for your campus/company accidentally. The ISC server uses the same
# the same option, and this URL provides more information:
@@ -266,8 +293,8 @@ bogus-priv
# Normally responses which come form /etc/hosts and the DHCP lease
# file have Time-To-Live set as zero, which conventionally means
# do not cache further. If you are happy to trade lower load on the
# server for potentially stale date, you can set a time-to-live (in
# do not cache further. If you are happy to trade lower load on the
# server for potentially stale date, you can set a time-to-live (in
# seconds) here.
#local-ttl=
@@ -302,15 +329,16 @@ bogus-priv
# Return an MX record pointing to itself for all local machines.
#selfmx
# Change the following lines if you want dnsmasq to serve SRV
# Change the following lines if you want dnsmasq to serve SRV
# records. These are useful if you want to serve ldap requests for
# Active Directory and other windows-originated DNS requests.
# See RFC 2782.
# You may add multiple srv-host lines.
# You may add multiple srv-host lines.
# The fields are <name>,<target>,<port>,<priority>,<weight>
# If the domain part if missing from the name (so that is just has the
# service and protocol sections) then the domain given by the domain=
# config option is used.
# config option is used. (Note that expand-hosts does not need to be
# set for this to work.)
# A SRV record sending LDAP for the example.com domain to
# ldapserver.example.com port 289
@@ -326,17 +354,25 @@ bogus-priv
#srv-host=_ldap._tcp.example.com,ldapserver.example.com,389,2
# A SRV record indicating that there is no LDAP server for the domain
# example.com
# example.com
#srv-host=_ldap._tcp.example.com
# Change the following lines to enable dnsmasq to serve TXT records.
# These are used for things like SPF and zeroconf. (Note that the
# domain-name expansion done for SRV records _does_not
# occur for TXT records.)
#Example SPF.
#txt-record=example.com,v=spf1 a -all
#Example zeroconf
#txt-record=_http._tcp.example.com,name=value,paper=A4
# For debugging purposes, log each DNS query as it passes through
# dnsmasq.
#log-queries
# Include a another lot of configuration options.
#conf-file=/etc/dnsmasq.more.conf

View File

@@ -4,7 +4,7 @@
</HEAD>
<BODY BGCOLOR="WHITE">
<H1 ALIGN=center>Dnsmasq</H1>
Dnsmasq is lightweight, easy to configure DNS forwarder and DHCP
Dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP
server. It is designed to provide DNS and, optionally, DHCP, to a
small network. It can serve the names of local machines which are
not in the global DNS. The DHCP server integrates with the DNS
@@ -22,7 +22,7 @@ Supported platforms include Linux (with glibc and uclibc), *BSD and
Mac OS X.
Dnsmasq is included in at least the following Linux distributions:
Gentoo, Debian, Slackware, Suse,
Smoothwall, IP-Cop, floppyfw, Firebox, LEAF, Freesco, CoyoteLinux and
Smoothwall, IP-Cop, floppyfw, Firebox, LEAF, Freesco, fli4l, CoyoteLinux and
Clarkconnect. It is also available as a FreeBSD port and is used in
Linksys wireless routers and the m0n0wall project.
<P>
@@ -103,12 +103,12 @@ bzip2 dnsmasq-zzz.tar
</PRE>
<H2>Links.</H2>
Ulrich Ivens has a nice HOWTO in German on installing dnsmasq at <A
HREF="http://howto.linux-hardware-shop.de/dnsmasq.html">http://howto.linux-hardware-shop.de/dnsmasq.html</A>
There is an article in German on dnsmasq at <A
HREF="http://www.linuxnetmag.com/de/issue7/m7dnsmasq1.html">http://www.linuxnetmag.com/de/issue7/m7dnsmasq1.html</A>
and Damien Raude-Morvan has one in French at <A HREF="http://www.drazzib.com/docs-dnsmasq.html">http://www.drazzib.com/docs-dnsmasq.html</A>
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>
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>
<H2>License.</H2>
Dnsmasq is distributed under the GPL. See the file COPYING in the distribution
for details.

View File

@@ -48,7 +48,8 @@ data under some circumstances.
.TP
.B \-k, --keep-in-foreground
Do not go into the background at startup but otherwise run as
normal. This is intended for use when dnsmasq is run under daemontools.
normal. This is intended for use when dnsmasq is run under daemontools
or launchd.
.TP
.B \-d, --no-daemon
Debug mode: don't fork to the background, don't write a pid file,
@@ -64,7 +65,7 @@ Specify an alternate path for dnsmasq to record its process-id in. Normally /var
.TP
.B \-u, --user=<username>
Specify the userid to which dnsmasq will change after startup. Dnsmasq must normally be started as root, but it will drop root
priviledges after startup by changing id to another user. Normally this user is "nobody" but that
privileges after startup by changing id to another user. Normally this user is "nobody" but that
can be over-ridden with this switch.
.TP
.B \-g, --group=<groupname>
@@ -101,14 +102,11 @@ or
options are given dnsmasq listens on all available interfaces except any
given in
.B \--except-interface
options. If IP alias interfaces (eg "eth1:0") are used with
options. IP alias interfaces (eg "eth1:0") cannot be used with
.B --interface
or
.B --except-interface
options, then the
.B --bind-interfaces
option will be automatically set. This is required for deeply boring
sockets-API reasons.
options, use --listen-address instead.
.TP
.B \-I, --except-interface=<interface name>
Do not listen on the specified interface. Note that the order of
@@ -120,6 +118,9 @@ options does not matter and that
.B --except-interface
options always override the others.
.TP
.B \-2, --no-dhcp-interface=<interface name>
Do not provide DHCP on the specified interface, but do provide DNS service.
.TP
.B \-a, --listen-address=<ipaddr>
Listen on the given IP address(es). Both
.B \--interface
@@ -144,14 +145,12 @@ working even when interfaces come and go and change address. This
option forces dnsmasq to really bind only the interfaces it is
listening on. About the only time when this is useful is when
running another nameserver (or another instance of dnsmasq) on the
same machine or when using IP
alias. Specifying interfaces with IP alias automatically turns this
option on. Setting this option also enables multiple instances of
same machine. Setting this option also enables multiple instances of
dnsmasq which provide DHCP service to run in the same machine.
.TP
.B \-y, --localise-queries
Return answers to DNS queries from /etc/hosts which depend on the interface over which the query was
recieved. If a name in /etc/hosts has more than one address associated with
received. If a name in /etc/hosts has more than one address associated with
it, and at least one of those addresses is on the same subnet as the
interface to which the query was sent, then return only the
address(es) on that subnet. This allows for a server to have multiple
@@ -175,11 +174,11 @@ Cisco PIX routers call "DNS doctoring".
.B \-B, --bogus-nxdomain=<ipaddr>
Transform replies which contain the IP address given into "No such
domain" replies. This is intended to counteract a devious move made by
Versign in September 2003 when they started returning the address of
Verisign in September 2003 when they started returning the address of
an advertising web page in response to queries for unregistered names,
instead of the correct NXDOMAIN response. This option tells dnsmasq to
fake the correct response when it sees this behaviour. As at Sept 2003
the IP address being returnd by Verisign is 64.94.110.11
the IP address being returned by Verisign is 64.94.110.11
.TP
.B \-f, --filterwin2k
Later versions of windows make periodic DNS requests which don't get sensible answers from
@@ -201,6 +200,12 @@ time is the one used.
Don't read /etc/resolv.conf. Get upstream servers only from the command
line or the dnsmasq configuration file.
.TP
.B \-1, --enable-dbus
Allow dnsmasq configuration to be updated via DBus method calls. The
configuration which can be changed is upstream DNS servers (and
corresponding domains) and cache clear. Requires that dnsmasq has
been built with DBus support.
.TP
.B \-o, --strict-order
By default, dnsmasq will send queries to any of the upstream servers
it knows about and tries to favour servers to are known to
@@ -212,11 +217,11 @@ Don't poll /etc/resolv.conf for changes.
.TP
.B \-D, --domain-needed
Tells dnsmasq to never forward queries for plain names, without dots
or domain parts, to upstream nameservers. If the name is not knowm
or domain parts, to upstream nameservers. If the name is not known
from /etc/hosts or DHCP then a "not found" answer is returned.
.TP
.B \-S, --server=[/[<domain>]/[domain/]][<ipaddr>[#<port>][@<source>[#<port>]]]
Specify IP address of upsream severs directly. Setting this flag does
Specify IP address of upstream severs directly. Setting this flag does
not suppress reading of /etc/resolv.conf, use -R to do that. If one or
more
optional domains are given, that server is used only for those domains
@@ -224,7 +229,7 @@ and they are queried only using the specified server. This is
intended for private nameservers: if you have a nameserver on your
network which deals with names of the form
xxx.internal.thekelleys.org.uk at 192.168.1.1 then giving the flag
.B -S /.internal.thekelleys.org.uk/192.168.1.1
.B -S /internal.thekelleys.org.uk/192.168.1.1
will send all queries for
internal machines to that nameserver, everything else will go to the
servers in /etc/resolv.conf. An empty domain specification,
@@ -302,13 +307,11 @@ is one and the defaults for
weight and priority are zero. Be careful if transposing data from BIND
zone files: the port, weight and priority numbers are in a different
order. More than one SRV record for a given service/domain is allowed,
all that match are returned. Specifying at least one
.B --srv-host
option also turns on replies to SOA queries for the
domain given by the
.B --domain
option. The data in these is stereotyped, but is enough for resolvers
to deduce that the domain is a valid one for resolving SRV records.
all that match are returned.
.TP
.B \-Y, --txt-record=<name>[[,<text>],<text>]
Return a TXT DNS record. The value of TXT record is a set of strings,
so any number may be included, split by commas.
.TP
.B \-c, --cache-size=<cachesize>
Set the size of dnsmasq's cache. The default is 150 names. Setting the cache size to zero disables caching.
@@ -319,19 +322,19 @@ Disable negative caching. Negative caching allows dnsmasq to remember
identical queries without forwarding them again. This flag disables
negative caching.
.TP
.B \-F, --dhcp-range=[network-id,]<start-addr>,<end-addr>[[,<netmask>],<broadcast>][,<default lease time>]
.B \-F, --dhcp-range=[[net:]network-id,]<start-addr>,<end-addr>[[,<netmask>],<broadcast>][,<default lease time>]
Enable the DHCP server. Addresses will be given out from the range
<start-addr> to <end-addr> and from statically defined addresses given
in
.B dhcp-host
options. If the lease time is given, then leases
will be given for that length of time. The lease time is on 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". This
option may be repeated, with different addresses, to enable DHCP
service to more than one network. For directly connected networks (ie,
networks on which the machine running dnsmasq has an interface) the
netmask is optional. It is, however, required for networks which
recieve 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
one interface when using DHCP, and the name of that interface must be
given using the
@@ -339,8 +342,10 @@ given using the
option. This limitation currently affects OpenBSD. It is always
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
dhcp options may be specified on a per-network basis. The end address
may be replaced by the keyword
dhcp options may be specified on a per-network basis.
When it is prefixed with 'net:' then its meaning changes from setting
a tag to matching it. Only one tag may be set, but more than one tag may be matched.
The end address may be replaced by the keyword
.B static
which tells dnsmasq to enable DHCP for the network specified, but not
to dynamically allocate IP addresses. Only hosts which have static
@@ -358,7 +363,7 @@ which case the IP address and lease times will apply to any machine
claiming that name. For example
.B --dhcp-host=00:20:e0:3b:13:af,wap,infinite
tells dnsmasq to give
the machine with ethernet address 00:20:e0:3b:13:af the name wap, and
the machine with hardware address 00:20:e0:3b:13:af the name wap, and
an infinite DHCP lease.
.B --dhcp-host=lap,192.168.0.199
tells
@@ -384,9 +389,22 @@ instance
.B --dhcp-host=00:20:e0:3b:13:af,ignore
This is
useful when there is another DHCP server on the network which should
be used by some machines. The net:<network-id> parameter enables DHCP options just
for this host in the same way as the the network-id in
.B dhcp-range.
be used by some machines. The net:<network-id> sets the network-id tag
whenever this dhcp-host directive is in use.
This can be used to selectively send DHCP options just
for this host.
Ethernet addresses (but not client-ids) may have
wildcard bytes, so for example
.B --dhcp-host=00:20:e0:3b:13:*,ignore
will cause dnsmasq to ignore a range of hardware addresses. Note that
the "*" will need to be escaped or quoted on a command line, but not
in the configuration file. Hardware addresses normally match any
network (ARP) type, but it is possible to restrict them to a single
ARP type by preceding them with the ARP-type (in HEX) and "-". so
.B --dhcp-host=06-00:20:e0:3b:13:af,1.2.3.4
will only match a
Token-Ring hardware address, since the ARP-address type for token ring
is 6.
.TP
.B \-Z, --read-ethers
Read /etc/ethers for information about hosts for the DHCP server. The
@@ -396,15 +414,15 @@ have exactly the same effect as
.B --dhcp-host
options containing the same information.
.TP
.B \-O, --dhcp-option=[<network-id>,[<network-id>,]]<opt>,[<value>[,<value>]]
Specfify different or extra options to DHCP clients. By default,
.B \-O, --dhcp-option=[<network-id>,[<network-id>,]][vendor:<vendor-class>]<opt>,[<value>[,<value>]]
Specify different or extra options to DHCP clients. By default,
dnsmasq sends some standard options to DHCP clients, the netmask and
broadcast address are set to the same as the host running dnsmasq, and
the DNS server and default route are set to the address of the machine
running dnsmasq. If the domain name option has been set, that is sent.
This option allows these defaults to be overridden,
or other options specified. The <opt> is the number of the option, as
specfied in RFC2132. For example, to set the default route option to
specified in RFC2132. For example, to set the default route option to
192.168.4.4, do
.B --dhcp-option=3,192.168.4.4
and to set the time-server address to 192.168.0.4, do
@@ -414,10 +432,34 @@ machine running dnsmasq". Data types allowed are comma separated
dotted-quad IP addresses, a decimal number, colon-separated hex digits
and a text string. If the optional network-ids are given then
this option is only sent when all the network-ids are matched.
Special processing is done on a text argument for option 119, to
conform with RFC 3397, and dotted-quad IP addresses which are followed
by a slash and then a netmask size are encoded as described in RFC
3442.
Be careful: no checking is done that the correct type of data for the
option number is sent, it is quite possible to
persuade dnsmasq to generate illegal DHCP packets with injudicious use
of this flag.
of this flag. When the value is a decimal number, dnsmasq must determine how
large the data item is. It does this by examining the option number and/or the
value, but can be overridden by appending a single letter flag as follows:
b = one byte, s = two bytes, i = four bytes. This is mainly useful with
encapsulated vendor class options (see below) where dnsmasq cannot
determine data size from the option number. Option data which
consists solely of periods and digits will be interpreted by dnsmasq
as an IP address, and inserted into an option as such. To force a
literal string, use quotes. For instance when using option 66 to send
a literal IP address as TFTP server name, it is necessary to do
.B --dhcp-option=66,"1.2.3.4"
Encapsulated Vendor-class options may also be specified using
--dhcp-option: for instance
.B --dhcp-option=vendor:PXEClient,1,0.0.0.0
sends the vendor class "PXEClient" and the encapsulated vendor class-specific option "mftp-address=0.0.0.0" Only one vendor class is allowed for any
host, but multiple options are allowed, provided they all have
the same vendor class. The address 0.0.0.0 is not treated specially in
encapsulated vendor class options.
.TP
.B \-U, --dhcp-vendorclass=<network-id>,<vendor-class>
Map from a vendor-class string to a network id. Most DHCP clients provide a
@@ -440,7 +482,13 @@ to different classes of hosts. It is possible, for instance to use
this to set a different printer server for hosts in the class
"accounts" than for hosts in the class "engineering".
.TP
.B \ -J, --dhcp-ignore=<network-id>[,<network-id>]
.B \-4, --dhcp-mac=<network-id>,<MAC address>
Map from a MAC address to a network-id. The MAC address may include
wildcards. For example
.B --dhcp-mac=3com,01:34:23:*:*:*
will set the tag "3com" for any host whose MAC address matches the pattern.
.TP
.B \-J, --dhcp-ignore=<network-id>[,<network-id>]
When all the given network-ids match the set of network-ids derived
from the net, host, vendor and user classes, ignore the host and do
not allocate it a DHCP lease.
@@ -459,10 +507,25 @@ create thousands of leases and use lots of memory in the dnsmasq
process.
.TP
.B \-K, --dhcp-authoritative
Should be set when dnsmasq is definatively the only DHCP server on a network.
Should be set when dnsmasq is definately the only DHCP server on a network.
It changes the behaviour from strict RFC compliance so that DHCP requests on
unknown leases from unknown hosts are not ignored. This allows new hosts
to get a lease without a tedious timeout under all circumstances.
to get a lease without a tedious timeout under all circumstances. It also
allows dnsmasq to rebuild its lease database without each client needing to
reaquire a lease, if the database is lost.
.TP
.B \-3, --bootp-dynamic
Enable dynamic allocation of IP addresses to BOOTP clients. Use this
with care, since each address allocated to a BOOTP client is leased
forever, and therefore becomes permanently unavailable for re-use by
other hosts.
.TP
.B \-5, --no-ping
By default, the DHCP server will attempt to ensure that an address in
not in use before allocating it to a host. It does this by sending an
ICMP echo request (aka "ping") to the address in question. If it gets
a reply, then the address must already be in use, and another is
tried. This flag disables this check. Use with caution.
.TP
.B \-l, --dhcp-leasefile=<path>
Use the specified file to store DHCP lease information. If this option
@@ -477,7 +540,7 @@ Specifies the domain for the DHCP server. This has two effects;
firstly it causes the DHCP server to return the domain to any hosts
which request it, and secondly it sets the domain which it is legal
for DHCP-configured hosts to claim. The intention is to constrain hostnames so that an untrusted host on the LAN cannot advertise it's name via dhcp as e.g. "microsoft.com" and capture traffic not meant for it. If no domain suffix is specified, then any DHCP hostname with a domain part (ie with a period) will be disallowed and logged. If suffix is specified, then hostnames with a domain part are allowed, provided the domain part matches the suffix. In addition, when a suffix is set then hostnames without a domain part have the suffix added as an optional domain part. Eg on my network I can set
.B --domain-suffix=thekelleys.org.uk
.B --domain=thekelleys.org.uk
and have a machine whose DHCP hostname is "laptop". The IP address for that machine is available from
.B dnsmasq
both as "laptop" and "laptop.thekelleys.org.uk". If the domain is
@@ -485,22 +548,29 @@ given as "#" then the domain is read from the first "search" directive
in /etc/resolv.conf (or equivalent).
.TP
.B \-E, --expand-hosts
Add the domain-suffix 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.
.TP
.B \-C, --conf-file=<file>
Specify a different configuration file. The conf-file option is also allowed in
configuration files, to include multiple configuration files. Only one
level of nesting is allowed.
.SH CONFIG FILE
At startup, dnsmasq reads
.I /etc/dnsmasq.conf,
if it exists. (On
FreeBSD, the file is
.I /usr/local/etc/dnsmasq.conf
) The format of this
) (but see the
.B \-C
option.) The format of this
file consists of one option per line, exactly as the long options detailed
in the OPTIONS section but without the leading "--". Lines starting with # are comments and ignored. For
options which may only be specified once, the configuration file overrides
the command line. Use the --conf-file option to specify a different
configuration file. The conf-file option is also allowed in
configuration files, to include multiple configuration files. Only one
level of nesting is allowed.
the command line. Quoting is allowed in a config file:
between " quotes the special meanings of ,:. and # are removed and the
following escapes are allowed: \\\\ \\" \\t \\a \\b \\r and \\n. The later
corresponding to tab, bell, backspace, return and newline.
.SH NOTES
When it receives a SIGHUP,
.B dnsmasq
@@ -618,7 +688,8 @@ configurations or in
, and a
.B dhcp-range
configuration option is present to activate the DHCP server
on a particular network. The filename
on a particular network. (Setting --bootp-dynamic removes the need for
static address mappings.) The filename
parameter in a BOOTP request is matched against netids in
.B dhcp-option
configurations, allowing some control over the options returned to

927
po/de.po Normal file
View File

@@ -0,0 +1,927 @@
# German translations for dnsmasq package.
# This file is put in the public domain.
# Simon Kelley <simon@thekelleys.org.uk>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2005-09-27 09:37+0100\n"
"Last-Translator: Simon Kelley <simon@thekelleys.org.uk>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr ""
#: cache.c:606 dhcp.c:655
#, c-format
msgid "bad address at %s line %d"
msgstr ""
# @Simon: Here I need an example to understand it :)
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr ""
# @Simon: Here I need an example to understand it :)
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr "lese %s - %d Adressen"
# @Simon: 'lese' is present, is that ok? If it should be past, it would be
# @Simon: "gelesen: %s - %d Adressen" - note the colon, it's a must, then.
#: cache.c:675
msgid "cleared cache"
msgstr "Cache geleert"
# @Simon: "Cache geleert" is literally "Cache emptied" but I think other translations could be misleading
# @Simon: (I don't know a good german replacement for "Cache" but AFAIK "Cache" is common in german)
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
"Name %s wurde nicht dem DHCP 'Mieter' von %s zugewiesen, da der Name in %"
"smit der Adresse %s bereits existiert"
# @Simon: "Mieter" is rather 'logder, renter, tenant, lessee' but I couldn't find anything that fits better.
# @Simon: So I thought I put it in ''-marks :)
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"Cache Größe %d, %d/%d Cache-Einfügungen verwendeten nicht abgelaufene Cache-"
"Einträge wieder."
# @Simon: "re-used" = "wiederverwenden", but in such a case it must be split apart to "verwendet ... wieder"
# @Simon: "unexpired" = "nicht abgelaufen" (expired=abgelaufen) -- altogether it sounds complicated in german,
# @Simon: I would prefer to use "noch gültige" = "still valid", would that fit to the sense? Then it would be:
# @Simon: msgstr "Cache Größe %d, %d/%d Cache-Einfügungen verwendeten noch gültige Cache-Einträge wieder."
# @Simon: btw, what is the "%d/%d"-part?
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr "Speicher nicht verfügbar"
# @Simon: "Speicher nicht verfügbar" = "memory not available"
# @Simon: "could not get memory" = "konnte keinen Speicher bekommen" or "konnte Speicher nicht bekommen"
# @Simon: ("keinen Speicher" = "no memory", "... nicht bekommen" = "... not get")
# @Simon: both would be correct - but would sound rather clumsy in german
# @Simon: how about "Nicht genügend Speicher verfügbar" = "Not enough memory available" ?
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s in Zeile %d von %%s"
# @Simon: I would like to have an example :) - instead of "von" it would be possible to use "aus",
# @Simon: both translate to "of" and nothing else, but depending on the sense one could be better
# @Simon: than the other.
#: util.c:183
msgid "FAILED to start up"
msgstr "Start gescheitert"
# @Simon: not perfect but I cannot get nearer right now.
#: util.c:304
#, c-format
msgid "infinite"
msgstr "unendlich"
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr "Lokale abzuhörende Adresse(n) angeben."
# @Simon: Quite literal translation, sounds not too polite in german.
# @Simon: How about: "Bitte die lokalen abzuhörende Adresse(n) angeben."
# @Simon: = "Please specify the local address(es) to listen on."
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr "Rückkehr-IP-Adresse für alle Geräte in angebenen Domänen"
# @Simon: I hope "Return ipaddr" is similar to "Return-ipaddr" and not "Return the ipaddr ... !"
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr ""
"'Gefälschte' Rückwärts-Ergebnisse für private Adressbereiche nach RFC1918"
# @Simon: I'm a bit unsure about the meaning of "Fake" here, and the best word for "lookup" is "Nachsehen"
# @Simon: (that is "looking-for") but I think that cannot be used. "Ergebnisse" = "results", is that near enough?
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr "Behandle IP-Adr als NXDOMAIN (wehrt Verisign-Platzhalter ab)."
# @Simon: or "Behandle IP-Adr als NXDOMAIN (gegen Verisign-Platzhalter)."
# @Simon: "gegen" = "against", I believe that might be clumsy in english but it is fine in german.
# @Simon: Just by chance I know what this is for - it is merely against verisign's use of wildcard
# @Simon: entries (that lead to their own servers), right. Therefore, how about:
# @Simon: "Behandle IP-Adr als NXDOMAIN (gegen Verisigns Platzhalter-Gebrauch)."
# @Simon: = "Treat ipaddr as NXDOMAIN (defeats Verisigns wildcard usage)." ?
# @Simon: But the explanatory(?) effect is only a very tiny bit better, I believe - what do U think?
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr "Angabe der Größe des Caches in Einträgen (Voreinstellung: %s)."
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr "Angabe der Konfigurationsdatei (Voreinstellung: %s)."
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr "NICHT in den Hintergrund gehen: Betrieb im Debug-Modus"
# @Simon: = "DO NOT go into the background: Operation in debug-mode"
# @Simon: I know it sounds a bit clumsy in english, but "fork" would be hard to understand
# @Simon: and then I get a problem between "go" and "run" - so...
# @Simon: "Debug-mode" = "Fehlersuch-Modus", literally, but I think "Debug-Modus" is better :)
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr "Anfragen ohne Domänen-Teil NICHT weiterschicken"
# @Simon: "weiterschicken" is rather "pass on" (I hope) but that's the best I found.
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr "Rückgabe auf sich selbst zeigender MX-Einträge für lokale Geräte"
# @Simon: "self-pointing" is a bit difficult, the meaning is clear but takes 3-4 words to express it in german.
# @Simon: "Geräte" is about "hard-devices". There is a word for "host" (it is "Wirt") but it would be misleading.
# @Simon: My online dict suggest "Rechner" (= Computer), but I think "hard-devices" is better because it's more general.
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr "Erweitere einfache Namen in /etc/hosts mit der Domänen-Endung"
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr "'unechte' DNS-Anfragen von Windows-Rechnern nicht weiterleiten"
# @Simon: I'm a bit unsure about "spurious"
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr ""
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr ""
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr ""
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr ""
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr ""
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr ""
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr ""
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr ""
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr ""
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr ""
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr ""
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr ""
#: option.c:148
msgid "Return MX records for local hosts."
msgstr ""
#: option.c:149
msgid "Specify an MX record."
msgstr ""
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr ""
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr ""
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr ""
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr ""
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr ""
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr ""
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr ""
#: option.c:157
msgid "Log queries."
msgstr ""
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr ""
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr ""
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr ""
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr ""
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr ""
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr ""
#: option.c:164
msgid "Specify default target in an MX record."
msgstr ""
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr ""
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr ""
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr ""
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr ""
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr ""
#: option.c:170
msgid "Specify a SRV record."
msgstr ""
#: option.c:171
msgid "Display this message."
msgstr ""
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr ""
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr ""
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
#: option.c:175
msgid "Specify TXT DNS record."
msgstr ""
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr ""
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr ""
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr ""
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr ""
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr ""
#: option.c:181
msgid "Map MAC address (with wildcards) to option set."
msgstr ""
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr ""
#: option.c:425
msgid "bad option"
msgstr ""
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr ""
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr ""
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr ""
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr ""
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr ""
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr ""
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr ""
#: option.c:491
msgid "extraneous parameter"
msgstr ""
#: option.c:499
msgid "missing parameter"
msgstr ""
#: option.c:516
msgid "nested includes not allowed"
msgstr ""
#: option.c:576
msgid "bad MX preference"
msgstr ""
#: option.c:585
msgid "bad MX name"
msgstr ""
#: option.c:603
msgid "bad MX target"
msgstr ""
#: option.c:802 option.c:813
msgid "bad port"
msgstr ""
#: option.c:955
msgid "bad dhcp-range"
msgstr ""
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr ""
#: option.c:1214
msgid "bad dhcp-host"
msgstr ""
#: option.c:1271
msgid "bad dhcp-option"
msgstr ""
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr ""
#: option.c:1459
msgid "dhcp-option too long"
msgstr ""
#: option.c:1656
msgid "bad TXT record"
msgstr ""
#: option.c:1688
msgid "TXT record string too long"
msgstr ""
#: option.c:1727
msgid "bad SRV record"
msgstr ""
#: option.c:1740
msgid "bad SRV target"
msgstr ""
#: option.c:1752
msgid "invalid port number"
msgstr ""
#: option.c:1763
msgid "invalid priority"
msgstr ""
#: option.c:1774
msgid "invalid weight"
msgstr ""
#: option.c:1799
msgid "error"
msgstr ""
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr ""
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr ""
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr ""
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr ""
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr ""
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr ""
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr ""
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr ""
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr ""
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr ""
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr ""
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr ""
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr ""
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr ""
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr ""
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr ""
#: network.c:434
msgid "domain"
msgstr ""
#: network.c:436
msgid "unqualified"
msgstr ""
#: network.c:436
msgid "domains"
msgstr ""
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr ""
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr ""
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr ""
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr ""
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr ""
#: dnsmasq.c:196
#, c-format
msgid "cannot create pipe: %s"
msgstr ""
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr ""
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr ""
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr ""
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr ""
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr ""
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr ""
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr ""
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr ""
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr ""
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr ""
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr ""
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr ""
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr ""
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr ""
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr ""
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr ""
#: dhcp.c:642
#, c-format
msgid "bad line at %s line %d"
msgstr ""
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr ""
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr ""
#: lease.c:71
msgid "too many stored leases"
msgstr ""
#: lease.c:118
#, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr ""
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr ""
#: rfc2131.c:248
msgid "with subnet selector"
msgstr ""
#: rfc2131.c:248
msgid "via"
msgstr ""
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr ""
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr ""
#: rfc2131.c:313
msgid "no address configured"
msgstr ""
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr ""
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr ""
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr ""
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr ""
#: rfc2131.c:558
msgid "unknown lease"
msgstr ""
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr ""
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr ""
#: rfc2131.c:683
msgid "lease not found"
msgstr ""
#: rfc2131.c:715
msgid "address not available"
msgstr ""
#: rfc2131.c:724
msgid "static lease available"
msgstr ""
#: rfc2131.c:728
msgid "address reserved"
msgstr ""
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr ""
#: netlink.c:51
#, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr ""
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr ""
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: bpf.c:74
#, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""

916
po/es.po Normal file
View File

@@ -0,0 +1,916 @@
# Spanish translations for dnsmasq package.
# This file is put in the public domain.
# Christopher Chatham <chrislinux@gmail.com>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2005-10-07 11:04+0100\n"
"Last-Translator: Christopher Chatham <chrislinux@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "no se pudo cargar nombres desde %s: %m"
#: cache.c:606 dhcp.c:655
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "nombre erróneo en %s línea %d"
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr "nombre erróneo en %s línea %d"
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr "direcciónes %s - %d leídas"
#: cache.c:675
msgid "cleared cache"
msgstr "el caché fue limpiado"
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
"no otorgando nombre %s al arriendo DHCP de %s porque el nombre existe en %s "
"con dirección %s"
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"tamaño de caché %d, %d/%d inserciónes de caché reutilizaron entradas no "
"vencidas."
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr "no se pudo conseguir memoria"
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s en línea %d de %%s"
#: util.c:183
msgid "FAILED to start up"
msgstr "el intento de inicio ha FALLADO"
#: util.c:304
#, c-format
msgid "infinite"
msgstr "infinito"
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr "Especificar dirección(es) locales dónde escuchar."
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr ""
"Retornar ipaddr (dirección IP) para todos los hosts en los dominios "
"especificados."
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr ""
"Falsificar búsquedas reversas para rangos de dirección privados RFC1918."
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr "Tratar ipaddr (dirección IP) como NXDOMAIN (derrota comodín Verisign)."
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr ""
"Especificar tamaño de caché en cuanto a entradas (%s por predeterminado)."
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr "Especificar archivo de configuración (%s por predeterminado)."
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr "NO hacer un fork hacia el fondo: correr en modo debug."
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr "NO reenviar búsquedas sin parte de dominio."
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr "Retornar records MX auto-señaladores para hosts locales."
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr ""
"Expandir nombres simples en /etc/hosts con domain-suffix (sufijo de dominio)."
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr "No reenviar pedidos DNS falsos desde máquinas Windows."
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr "Habilitar DHCP dentro del rango brindado con duración del arriendo."
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr "Cambiar a este grupo después del inicio (%s por predeterminado)."
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr "Fijar dirección o nombre de host para una máquina específica."
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr "NO cargar archivo %s."
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr "Especificar un archivo de hosts para leer adicionalmente a %s."
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr "Especificar interface(s) donde escuchar."
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr "Especificar interface(s) donde NO escuchar."
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr "Trazar clase de usuario DHCP a la opción fijada."
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr "No hacer DHCP para hosts en la opción fijada."
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr "NO hacer un fork hacia el fondo, NO correr en modo debug."
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr "Asumir que somos el único servidor DHCP en la red local."
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr "Especificar donde guardar arriendos DHCP (%s por predeterminado)."
#: option.c:148
msgid "Return MX records for local hosts."
msgstr "Retornar récords MX para hosts locales."
#: option.c:149
msgid "Specify an MX record."
msgstr "Especificar un récord MX."
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr "Especificar opciónes BOOTP a servidor DHCP."
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr "NO revisar archivo %s periodicamente, recargar solo con SIGHUP."
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr "NO cachear resultados de búsquedas fallidas."
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr "Usar servidores DNS estrictamente en el órden dado en %s."
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr "Fijar opciones extra para ser enviadas a clientes DHCP."
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr ""
"Especificar puerto donde escuchar por búsquedas DNS (53 por predeterminado)."
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr ""
"Máximo tamaño soportado de paquetes UDP para EDNS.0 (%s por predeterminado)."
#: option.c:157
msgid "Log queries."
msgstr "Bitacorear búsquedas."
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr "Enforzar el puerto original para búsquedas upstream."
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr "NO leer resolv.conf."
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr "Especificar el destino hacia resolv.conf (%s por predeterminado)."
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr ""
"Especificar dirección(es) de servidor upstream con dominios opcionales."
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr "Nunca reenviar búsquedas a dominios especificados."
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr "Especificar dominio para asignar en arriendos DHCP."
#: option.c:164
msgid "Specify default target in an MX record."
msgstr "Especificar destino predeterminado en un récord MX."
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr ""
"Especificar tiempo de vida en segundos para respuestas desde /etc/hosts."
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr "Cambiar a este usuario despues de iniciar (%s por predeterminado)."
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr "Trazar clase de vendedor DHCP a opción fijada."
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr "Mostrar información sobre la versión y copyright de dnsmasq."
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr "Traducir direcciones IPv4 desde servidores upstream."
#: option.c:170
msgid "Specify a SRV record."
msgstr "Especificar un récord SRV."
#: option.c:171
msgid "Display this message."
msgstr "Mostrar este mensaje."
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr "Especificar path de archivo PID (%s por predeterminado)."
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr "Especificar número máximo de arriendos DHCP (%s por predeterminado)."
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
"Responder a búsquedas DNS en base a la interface donde fueron enviadas."
#: option.c:175
msgid "Specify TXT DNS record."
msgstr "Especificar récord DNS TXT."
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr "Acoplar solo a interfaces en uso."
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr "Leer información sobre hosts DHCP estáticos desde %s."
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr "Habilitar la interface DBus para fijar servidores upstream, etc."
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr "No proveer DHCP en esta interface, solo proveer DNS."
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr "Habilitar alocación dinámica de direcciónes para BOOTP."
#: option.c:181
#, fuzzy
msgid "Map MAC address (with wildcards) to option set."
msgstr "Trazar clase de vendedor DHCP a opción fijada."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "falta \""
#: option.c:425
msgid "bad option"
msgstr "opción errónea"
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr "no se puede leer %s: %s"
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
"Modo de uso: dnsmasq [opciones]\n"
"\n"
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr "Usar opciones cortas solo en la línea de comandos.\n"
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr "Opciones válidas son :\n"
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr "Dnsmasq versión %s %s\n"
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
"Opciones de compilación %s\n"
"\n"
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr "Este software viene SIN NINGUNA GARANTIA.\n"
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr "Dnsmasq es software libre, y usted está bienvenido a redistribuirlo\n"
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr "bajo los términos de la GNU General Public License, versión 2.\n"
#: option.c:491
msgid "extraneous parameter"
msgstr "parámetro extraño"
#: option.c:499
msgid "missing parameter"
msgstr "parámetro ausente"
#: option.c:516
msgid "nested includes not allowed"
msgstr "inclusiones jerarquizadas no permitidas"
#: option.c:576
msgid "bad MX preference"
msgstr "preferencia MX errónea"
#: option.c:585
msgid "bad MX name"
msgstr "nombre MX erróneo"
#: option.c:603
msgid "bad MX target"
msgstr "destino MX erróneo"
#: option.c:802 option.c:813
msgid "bad port"
msgstr "puerto erróneo"
#: option.c:955
msgid "bad dhcp-range"
msgstr "dhcp-range (rango DHCP) erróneo"
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr "rango DHCP inconsistente"
#: option.c:1214
msgid "bad dhcp-host"
msgstr "dhcp-host erróneo"
#: option.c:1271
msgid "bad dhcp-option"
msgstr "dhcp-option erróneo"
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr "dominio erróneo en dhcp-option"
#: option.c:1459
msgid "dhcp-option too long"
msgstr "opción dhcp-option demasiado larga"
#: option.c:1656
msgid "bad TXT record"
msgstr "récord TXT erróneo"
#: option.c:1688
msgid "TXT record string too long"
msgstr "récord TXT demasiado largo"
#: option.c:1727
msgid "bad SRV record"
msgstr "récord SRV erróneo"
#: option.c:1740
msgid "bad SRV target"
msgstr "destino SRV erróneo"
#: option.c:1752
msgid "invalid port number"
msgstr "número de puerto inválido"
#: option.c:1763
msgid "invalid priority"
msgstr "prioridad inválida"
#: option.c:1774
msgid "invalid weight"
msgstr "peso inválido"
#: option.c:1799
msgid "error"
msgstr "error"
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr "opciones de línea de comandos erróneas: %s."
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr "no se puede obtener host-name (nombre de host): %s"
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "solo un archivo resolv.conf permitido en modo no-poll."
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr "debe haber exactamente un resolv.conf desde donde leer dominio."
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr "no se pudo leer %s: %m"
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr "ninguna directiva de búsqueda encontrada en %s"
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "servidor DNS %s se reuso a hacer una búsqueda recursiva"
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
"desbordamiento en la tabla de reenvio: revisar si hay loops de servidor."
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr "no se pudo accesar %s: %m"
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "no se pudo cargar %s: %m"
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr "leyendo %s"
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "nombre erróneo en %s"
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
"Ignorando arriendo DHCP para %s porque tiene una parte ilegal de dominio"
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr "no se pudo crear un socket escuchador: %s"
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "no se pudo fijar opciones IPv6 sobre el socket escuchador: %s"
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "no se pudo acoplar socket escuchador para %s: %s"
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr "no se pudo escuchar en el socket: %s"
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorando servidor DNS %s - interface local"
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "ignorando servidor DNS %s - no se pudo crear/acoplar socket: %m"
#: network.c:434
msgid "domain"
msgstr "dominio"
#: network.c:436
msgid "unqualified"
msgstr "no calificado"
#: network.c:436
msgid "domains"
msgstr "dominios"
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr "usando direcciones locales solo para %s %s"
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "usando servidor DNS %s#%d para %s %s"
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr "usando servidor DNS %s#%d"
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"Integración dhcpd ISC no disponible: fijar HAVE_ISC_READER en src/config.h"
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "no se pudo encontrar lista de interfaces: %s"
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr "interface desconocida %s"
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr "ninguna interface con dirección %s"
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr "debe fijarse exactamente una interface en sistemas rotos sin IP_RECVIF"
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr "error DBus: %s"
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus no disponible: fijar HAVE_DBUS en src/config.h"
#: dnsmasq.c:196
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "no se puede leer %s: %s"
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr "versión %s iniciada, tamaño de caché %d"
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr "versión %s iniciada, caché deshabilitado"
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr "opciones de compilación: %s"
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr "soporte DBus habilitado: conectado a bus de sistema"
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr "soporte DBus habilitado: conección a bus pendiente"
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
"fijando opción --bind-interfaces debido a limitaciones de sistema operativo"
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "advertencia: interface %s no existe actualmente"
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, arriendos estáticos solo en %.0s%s, tiempo de arriendo %s"
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, rango de IP %s -- %s, tiempo de arriendo %s"
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr "corriendo como root"
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr "haciendo exit al haber recibido SIGTERM"
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr "conectado a DBus de sistema"
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "no se puede crear socket DHCP: %s"
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "no se pudo fijar opciones en socket DHCP: %s"
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "no se pudo fijar SO_REUSEADDR en socket DHCP: %s"
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "no se pudo acoplar socket de servidor DHCP: %s"
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "no se puede crear socket crudo ICMP: %s."
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "dirección IP duplicada en directiva dhcp-config."
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "rango DHCP %s -- %s no coincide con máscara de red %s"
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr "no se pudo leer %s:%m"
#: dhcp.c:642
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "nombre erróneo en %s línea %d"
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "dirección IP %s (%s) duplicada en directiva dhcp-config"
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
"Ignorando nombre de host DHCP %s porque contiene una parte ilegal de dominio."
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "no se puede abrir o crear archivo de arriendos: %s"
#: lease.c:71
msgid "too many stored leases"
msgstr "demasiados arriendos almacenados"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "no se pudo leer %s: %m"
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "ningún rango de direcciónes disponible para pedido DHCP %s %s"
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "con selector de subred"
#: rfc2131.c:248
msgid "via"
msgstr "vía"
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "deshabilitado"
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "dirección en uso"
#: rfc2131.c:313
msgid "no address configured"
msgstr "ninguna dirección configurada"
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "ninguna dirección disponible"
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "no queda ningún arriendo"
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "red equivocada"
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "deshabilitando dirección DHCP estática %s"
#: rfc2131.c:558
msgid "unknown lease"
msgstr "arriendo desconocido"
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignorado"
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "dirección equivocada"
#: rfc2131.c:683
msgid "lease not found"
msgstr "arriendo no encontrado"
#: rfc2131.c:715
msgid "address not available"
msgstr "dirección no disponible"
#: rfc2131.c:724
msgid "static lease available"
msgstr "arriendo estático disponible"
#: rfc2131.c:728
msgid "address reserved"
msgstr "dirección reservada"
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr "no se puede enviar opción DHCP %d: no queda espacio en el paquete"
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Más de una clase de vendedor coincide, usando %s"
#: netlink.c:51
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "no se puede acoplar socket netlink: %s"
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
"intento de fijar dirección IPv6 a servidor vía DBus - no hay soporte IPv6"
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "fijando servidores upstream desde DBus"
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "no se pudo registrar un manejador de mensajes DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "no se puede crear socket BPF DHCP: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "pedido DHCP por hardware no soportado tipo (%d) recibido en %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "no se puede abrir %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s será escrito cada %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "no se puede crear socket para paquetes DHCP: %s. Está CONFIG_PACKET "
#~ "habilitado en el kernel?"

878
po/fi.po Normal file
View File

@@ -0,0 +1,878 @@
# Finnish translations for dnsmasq package.
# This file is put in the public domain.
# Simon Kelley <simon@thekelleys.org.uk>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2005-11-28 22:05+0000\n"
"Last-Translator: Simon Kelley <simon@thekelleys.org.uk>\n"
"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr ""
#: cache.c:606 dhcp.c:655
#, c-format
msgid "bad address at %s line %d"
msgstr ""
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr ""
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr ""
#: cache.c:675
msgid "cleared cache"
msgstr ""
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
#: cache.c:772
#, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr ""
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr ""
#: util.c:183
msgid "FAILED to start up"
msgstr ""
#: util.c:304
#, c-format
msgid "infinite"
msgstr ""
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr ""
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr ""
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr ""
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr ""
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr ""
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr ""
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr ""
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr ""
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr ""
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr ""
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr ""
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr ""
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr ""
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr ""
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr ""
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr ""
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr ""
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr ""
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr ""
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr ""
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr ""
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr ""
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr ""
#: option.c:148
msgid "Return MX records for local hosts."
msgstr ""
#: option.c:149
msgid "Specify an MX record."
msgstr ""
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr ""
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr ""
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr ""
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr ""
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr ""
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr ""
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr ""
#: option.c:157
msgid "Log queries."
msgstr ""
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr ""
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr ""
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr ""
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr ""
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr ""
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr ""
#: option.c:164
msgid "Specify default target in an MX record."
msgstr ""
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr ""
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr ""
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr ""
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr ""
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr ""
#: option.c:170
msgid "Specify a SRV record."
msgstr ""
#: option.c:171
msgid "Display this message."
msgstr ""
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr ""
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr ""
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
#: option.c:175
msgid "Specify TXT DNS record."
msgstr ""
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr ""
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr ""
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr ""
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr ""
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr ""
#: option.c:181
msgid "Map MAC address (with wildcards) to option set."
msgstr ""
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr ""
#: option.c:425
msgid "bad option"
msgstr ""
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr ""
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr ""
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr ""
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr ""
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr ""
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr ""
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr ""
#: option.c:491
msgid "extraneous parameter"
msgstr ""
#: option.c:499
msgid "missing parameter"
msgstr ""
#: option.c:516
msgid "nested includes not allowed"
msgstr ""
#: option.c:576
msgid "bad MX preference"
msgstr ""
#: option.c:585
msgid "bad MX name"
msgstr ""
#: option.c:603
msgid "bad MX target"
msgstr ""
#: option.c:802 option.c:813
msgid "bad port"
msgstr ""
#: option.c:955
msgid "bad dhcp-range"
msgstr ""
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr ""
#: option.c:1214
msgid "bad dhcp-host"
msgstr ""
#: option.c:1271
msgid "bad dhcp-option"
msgstr ""
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr ""
#: option.c:1459
msgid "dhcp-option too long"
msgstr ""
#: option.c:1656
msgid "bad TXT record"
msgstr ""
#: option.c:1688
msgid "TXT record string too long"
msgstr ""
#: option.c:1727
msgid "bad SRV record"
msgstr ""
#: option.c:1740
msgid "bad SRV target"
msgstr ""
#: option.c:1752
msgid "invalid port number"
msgstr ""
#: option.c:1763
msgid "invalid priority"
msgstr ""
#: option.c:1774
msgid "invalid weight"
msgstr ""
#: option.c:1799
msgid "error"
msgstr ""
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr ""
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr ""
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr ""
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr ""
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr ""
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr ""
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr ""
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr ""
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr ""
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr ""
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr ""
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr ""
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr ""
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr ""
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr ""
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr ""
#: network.c:434
msgid "domain"
msgstr ""
#: network.c:436
msgid "unqualified"
msgstr ""
#: network.c:436
msgid "domains"
msgstr ""
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr ""
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr ""
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr ""
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr ""
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr ""
#: dnsmasq.c:196
#, c-format
msgid "cannot create pipe: %s"
msgstr ""
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr ""
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr ""
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr ""
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr ""
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr ""
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr ""
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr ""
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr ""
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr ""
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr ""
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr ""
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr ""
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr ""
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr ""
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr ""
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr ""
#: dhcp.c:642
#, c-format
msgid "bad line at %s line %d"
msgstr ""
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr ""
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr ""
#: lease.c:71
msgid "too many stored leases"
msgstr ""
#: lease.c:118
#, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr ""
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr ""
#: rfc2131.c:248
msgid "with subnet selector"
msgstr ""
#: rfc2131.c:248
msgid "via"
msgstr ""
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr ""
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr ""
#: rfc2131.c:313
msgid "no address configured"
msgstr ""
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr ""
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr ""
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr ""
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr ""
#: rfc2131.c:558
msgid "unknown lease"
msgstr ""
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr ""
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr ""
#: rfc2131.c:683
msgid "lease not found"
msgstr ""
#: rfc2131.c:715
msgid "address not available"
msgstr ""
#: rfc2131.c:724
msgid "static lease available"
msgstr ""
#: rfc2131.c:728
msgid "address reserved"
msgstr ""
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr ""
#: netlink.c:51
#, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr ""
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr ""
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: bpf.c:74
#, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""

934
po/fr.po Normal file
View File

@@ -0,0 +1,934 @@
# French translations for dnsmasq package.
# This file is put in the public domain.
# Lionel Tricon <lionel.tricon@free.fr>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2005-10-02 19:05+0100\n"
"Last-Translator: Lionel Tricon <lionel.tricon@free.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "Impossible de charger les noms a partir de %s: %m"
#: cache.c:606 dhcp.c:655
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "mauvais nom dans %s ligne %d"
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr "mauvais nom dans %s ligne %d"
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr "lecture %s - %d adresses"
#: cache.c:675
msgid "cleared cache"
msgstr "cache nettoye"
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
"ne donne pas de nom %s au bail DHCP de %s parce-que le nom existe dans %s "
"avec l'adresse %s"
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"taille de cache %d, %d/%d insertions dans le cache ont reutilisees des "
"entrees qui n'ont pas expirees"
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr "impossible d'allouer de la memoire"
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s a la ligne %d de %%s"
#: util.c:183
msgid "FAILED to start up"
msgstr "IMPOSSIBLE de demarrer"
#: util.c:304
#, c-format
msgid "infinite"
msgstr "illimite"
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr ""
"Specifie la ou les adresse(s) locales ou le demon doit se mettre a l'ecoute."
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr ""
"Retourne les adresses IP pour toutes les machines presentent dans les "
"domaines specifies"
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr "Traduction inverse truquee pour la plage d'adresse privee RFC1918"
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr ""
"Traite l'adresse IP comme un domaine inexistant NXDOMAIN (contourne le "
"systemede redirection de Verisign)"
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr "Specifie la taille du cache en entree (par defaut a %s)."
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr "Specifie le nom du fichier de configuration (par defaut %s)"
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr "Ne passe pas en tache de fond: demarre en mode debug"
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr "Ne retransmet pas les requetes qui n'ont pas de domaine."
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr "Retourne les champs MX pour les machines locales."
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr ""
"Etend les noms uniques des machines dans /etc/hosts avec le suffixe du "
"domaine."
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr ""
"Ne retransmet pas les fausses requetes DNS en provenance des machines "
"Windows."
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr ""
"Autorise DHCP dans la plage d'adresses donnee sur la duree de validite du "
"bail."
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr "On change pour ce groupe apres le demarrage (par defaut a %s)."
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr "On assigne une adresse ou un nom pour une machine specifiee."
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr "Ne charge PAS le fichier %s."
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr "Specifie un nom de fichier hosts a lire en complement de %s"
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr "Specifie la ou les interface(s) ou le demon doit se mettre a l'ecoute."
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr "Specifie la ou les interface(s) que le demon ne doit PAS traiter."
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr "Associe les 'user class' DHCP aux options."
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr "Ne pas autoriser DHCP pour les machines enumerees dans les options."
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr "Ne passe pas en tache de fond, ne s'execute pas en mode debug."
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr "On considere que l'on est le seul serveur DHCP sur le reseau local."
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr "Specifie ou il faut sauvegarder les baux DHCP (par defaut a %s)."
#: option.c:148
msgid "Return MX records for local hosts."
msgstr "Retourne les champs MX pour les machines locales."
#: option.c:149
msgid "Specify an MX record."
msgstr "Specifie un champ MX."
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr "Specifie les options BOOTP pour le serveur DHCP."
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr ""
"Ne pas scruter le fichier %s, recharger les modifications seulement sur "
"reception du signal SIGHUP."
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr "Ne place pas en cache le resultat des requetes qui ont echouees."
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr "Utilise les serveurs de noms dans l'ordre donne dans %s."
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr "Options supplementaires a associer aux clients DHCP."
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr ""
"Specifie le port ou il faut ecouter les requetes DNS (par defaut a 53)."
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr ""
"Taille maximale des paquets UDP supportee pour EDNS.0 (par defaut a %s)."
#: option.c:157
msgid "Log queries."
msgstr "Logue les requetes."
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr "Force le port d'origine des requetes vers les serveurs amonts."
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr "Ne pas lire le fichier resolv.conf."
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr "Specifie le chemin pour le fichier resolv.conf (par defaut a %s)."
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr ""
"Specifie la ou les adresses des serveurs amonts avec des domaines optionels."
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr "Ne jamais retransmettre les requetes pour les domaines specifies."
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr "Specifie le domaine qui doit etre assigne aux baux DHCP."
#: option.c:164
msgid "Specify default target in an MX record."
msgstr "Speficie la cible par defaut dans un champ MX."
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr ""
"Specifie le TTL en secondes pour les reponses qui utilisent /etc/hosts."
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr "Change pour cet utilisateur apres le demarrage (par defaut a %s)."
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr "Associe les 'vendor class' DHCP aux options."
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr "Affiche la version de Dnsmasq et les informations liees au copyright."
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr "Traduit les adresses IPV4 des serveurs amonts."
#: option.c:170
msgid "Specify a SRV record."
msgstr " Specifie un champ SRV."
#: option.c:171
msgid "Display this message."
msgstr "Affiche ce message."
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr "Specifie un chemin pour le fichier PID (par defaut a %s)."
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr "Specifie le nombre maximum de baux DHCP (par defaut a %s)."
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
"Repond aux requetes DNS en se basant sur l'interface ou a ete envoyee la "
"requete."
#: option.c:175
msgid "Specify TXT DNS record."
msgstr "Specifie un champ DNS TXT"
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr "Associe seulement aux interfaces en utilisation."
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr "Lecture des informations de DHCP statique a partir de %s."
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr "Autorise l'interface DBus a configurer les serveurs amonts, etc."
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr "Ne fourni pas DHCP pour cette interface, mais seulement DNS."
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr "Autorise l'allocation dynamique d'adresse pour bootp."
#: option.c:181
#, fuzzy
msgid "Map MAC address (with wildcards) to option set."
msgstr "Associe les 'vendor class' DHCP aux options."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "il manque \""
#: option.c:425
msgid "bad option"
msgstr "mauvaise option"
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr "Ne peut pas lire %s: %s"
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
"Usage: dnsmasq [options]\n"
"\n"
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr "Utilisez les options courtes uniquement sur la ligne de commande.\n"
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr "Les options valides sont :\n"
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr "Version de Dnsmasq %s %s\n"
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
"Options a la compilation %s\n"
"\n"
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr "Ce logiciel est fourni sans GARANTIE aucune.\n"
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr "Dnsmasq est un logiciel libre, et vous etes invite a le redistribuer\n"
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr ""
"sous les termes de la licence GPL (GNU General Public License), version 2.\n"
#: option.c:491
msgid "extraneous parameter"
msgstr "parametre supplementaire"
#: option.c:499
msgid "missing parameter"
msgstr "parametre manquant"
#: option.c:516
msgid "nested includes not allowed"
msgstr "Inclusions d'inclusions non autorisees"
#: option.c:576
msgid "bad MX preference"
msgstr "Mauvaise preference MX"
#: option.c:585
msgid "bad MX name"
msgstr "mauvais nom MX"
#: option.c:603
msgid "bad MX target"
msgstr "mauvaise cible MX"
#: option.c:802 option.c:813
msgid "bad port"
msgstr "mauvais port"
#: option.c:955
msgid "bad dhcp-range"
msgstr "mauvaise plage d'adresses DHCP (dhcp-range)"
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr "plage d'adresses DHCP incoherente"
#: option.c:1214
msgid "bad dhcp-host"
msgstr "mauvais dhcp-host"
#: option.c:1271
msgid "bad dhcp-option"
msgstr "mauvais dhcp-option"
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr "mauvais domaine dans dhcp-option"
#: option.c:1459
msgid "dhcp-option too long"
msgstr "dhcp-option trop long"
#: option.c:1656
msgid "bad TXT record"
msgstr "mauvais champ TXT"
#: option.c:1688
msgid "TXT record string too long"
msgstr "chaîne du champ TXT trop longue"
#: option.c:1727
msgid "bad SRV record"
msgstr "mauvais champ SRV"
#: option.c:1740
msgid "bad SRV target"
msgstr "mauvaise cible SRV"
#: option.c:1752
msgid "invalid port number"
msgstr "numero de port invalide"
#: option.c:1763
msgid "invalid priority"
msgstr "priorite invalide"
#: option.c:1774
msgid "invalid weight"
msgstr "poids invalide"
#: option.c:1799
msgid "error"
msgstr "erreur"
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr "mauvaises options en ligne de commande: %s."
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr "ne peut pas obtenir le nom de la machine: %s"
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "seul un fichier resolv.conf est autorise dans le mode no-poll"
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
"on doit avoir exactement un seul fichier resolv.conf pour y recuperer le nom "
"de domaine."
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr "impossible de lire %s: %m"
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr "pas de directive de recherche trouvee dans %s"
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "le serveur de nom %s a refuse de faire une recherche recursive"
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
"Table de stockage des requetes DNS pleine : verifiez la configuration du "
"serveur (risque de boucle recursive)."
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr "impossible d'acceder a %s: %m"
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "impossible de charger %s: %m"
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr "Lecture %s"
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "mauvais nom dans %s"
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
"On ignore le bail DHCP pour %s car il possede un nom de domaine illegal"
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr "impossible de creer une socket de lecture: %s"
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "impossible d'activer les options IPV6 sur la socket de lecture: %s"
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "impossible de lier la socket de lecture pour %s: %s"
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr "impossible de lire sur la socket: %s"
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "on ignore le serveur de nom %s - interface locale"
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "on ignore le serveur de nom %s - ne peut construire/lier la socket: %m"
#: network.c:434
msgid "domain"
msgstr "domaine"
#: network.c:436
msgid "unqualified"
msgstr "non-qualifie"
#: network.c:436
msgid "domains"
msgstr "domaines"
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr "on utilise les adresses locales seulement pour %s %s"
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "on utilise le serveur de nom %s#%d pour %s %s"
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr "on utilise le serveur de nom %s#%d"
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"L'integration DHCP ISC n'est pas disponible: activez HAVE_ISC_READER dans "
"src/config.h"
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "impossible de trouver la liste des interfaces: %s"
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr "interface %s inconnue"
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr "pas d'interface avec l'adresse %s"
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
"on doit declarer exactement une interface sur les systemes sans IP_RECVIF"
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr "Erreur DBus: %s"
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus n'est pas disponible: declarez HAVE_DBUS dans src/config.h"
#: dnsmasq.c:196
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "Ne peut pas lire %s: %s"
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr "demarre, version %s taille de cache %d"
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr "demarre, version %s cache desactive"
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr "options a la compilation: %s"
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr "Support DBus autorise: connecte au bus systeme"
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr "Support DBus autorise: connexion au bus en suspend"
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "Active l'option --bind-interfaces a cause des limitations de l'OS"
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "Attention: l'interface %s n'existe pas actuellement"
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
"DHCP, baux statiques seulement sur %.0s%s, duree de validite de bail %s"
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, plage d'adresse %s -- %s, duree de bail %s"
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr "execute sous root"
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr "sortie sur reception du signal SIGTERM"
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr "connecte au systeme DBus"
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "ne peut creer la socket DHCP : %s"
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "impossible d'appliquer les options sur la socket DHCP: %s"
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "impossible de declarer SO_REUSEADDR sur la socket DHCP: %s"
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "impossible de lier la socket serveur DHCP: %s"
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "ne peut creer de socket en mode raw pour ICMP: %s."
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "adresse IP %s dupliquee dans la directive dhcp-config."
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
"La plage d'adresses DHCP %s -- %s n'est pas coherente avec le masque de "
"reseau %s"
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr "impossible de lire %s:%m"
#: dhcp.c:642
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "mauvais nom dans %s ligne %d"
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "adresse IP %s (%s) dupliquee dans la directive dhcp-config."
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
"On ignore le nom de machine DHCP %s parce-qu'il possede un nom de domaine "
"illegal"
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "ne peut ouvrir ou creer des fichiers de baux: %s"
#: lease.c:71
msgid "too many stored leases"
msgstr "beaucoup trop de baux enregistres"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "impossible de lire %s: %m"
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "pas de plage d'adresse disponible pour la requete DHCP %s %s"
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "avec selecteur de sous-reseau"
#: rfc2131.c:248
msgid "via"
msgstr "par l'intermediaire de"
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "desactive"
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adresse deja utilisee"
#: rfc2131.c:313
msgid "no address configured"
msgstr "pas d'adresse configuree"
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "pas d'adresse disponible"
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "aucun baux laisses"
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "mauvais reseau"
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "desactive l'adresse statique DHCP %s"
#: rfc2131.c:558
msgid "unknown lease"
msgstr "bail inconnu"
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignore"
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "mauvaise adresse"
#: rfc2131.c:683
msgid "lease not found"
msgstr "bail non trouve"
#: rfc2131.c:715
msgid "address not available"
msgstr "adresse non disponible"
#: rfc2131.c:724
msgid "static lease available"
msgstr "bail statique disponible"
#: rfc2131.c:728
msgid "address reserved"
msgstr "adresse reservee"
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Plus d'une seule classe de fournisseur correspond, on utilise %s"
#: netlink.c:51
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "ne peux lier une socket netlink: %s"
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
"tentative de lier une adresse serveur IPV6 via DBus - pas de support IPV6"
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "configuration des serveurs amonts a partir de DBus"
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "ne peut enregistrer une routine de traitement des messages DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "impossible de creer une socket BPF pour DHCP: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "requete DHCP pour un type de materiel non supporte (%d) recue sur %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "ne peut pas ouvrir %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s sera ecrit chaque %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "impossible de creer une socket DHCP en mode paquet: %s. Est-ce que "
#~ "CONFIG_PACKET est active dans votre noyau?"

1096
po/id.po Normal file

File diff suppressed because it is too large Load Diff

906
po/no.po Normal file
View File

@@ -0,0 +1,906 @@
# Norwegian translations for dnsmasq package.
# This file is put in the public domain.
# Simon Kelley <simon@thekelleys.org.uk>, 2006.
#
# Current translator: Jan Erik Askildt <jeaskildt@gmail.com>, 2006
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.25\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2006-01-11 17:39+0000\n"
"Last-Translator: Jan Erik Askildt <jeaskildt@gmail.com>\n"
"Language-Team: Norwegian <i18n-nb@lister.ping.uio.no>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "feilet å laste navn fra %s: %m"
#: cache.c:606 dhcp.c:655
#, c-format
msgid "bad address at %s line %d"
msgstr "dårlig adresse ved %s linje %d"
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr "dårlig navn ved %s linje %d"
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr "les %s - %d adresser"
#: cache.c:675
msgid "cleared cache"
msgstr "mellomlager tømt"
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
"gir ikke navnet %s til DHCP leien for %s fordi navnet eksisterer i %s med "
"adressen %s"
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"mellomlager størrelse %d, %d/%d mellomlager innsettinger re-bruker "
"mellomlager plasser som ikke er utløpt"
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr "kunne ikke få minne"
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s på linje %d av %%s"
#: util.c:183
msgid "FAILED to start up"
msgstr "FEILET å starte opp"
#: util.c:304
#, c-format
msgid "infinite"
msgstr "uendelig"
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr "Spesifiser lokal(e) adresse(r) å lytte på."
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr "Returner ipaddr for alle verter i det spesifiserte domenet."
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr "Forfalsk revers oppslag for RFC1918 private adresse områder."
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr "Behandle ipaddr som NXDOMAIN (omgår Verisign wildcard)."
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr "Spesifiser størrelsen på mellomlager plassene (standard er %s)."
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr "Spesifiser konfigurasjonsfil (standard er %s)."
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr "IKKE legg (fork) som bakgrunnsprosess: kjør i debug modus."
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr "IKKE videresend oppslag som mangler domene del."
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr "Returner selv-pekende MX post for lokale verter."
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr "Utvid enkle navn i /etc/hosts med domene-suffiks."
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr "Ikke videresend falske/uekte DNS forespørsler fra Windows verter."
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr "Aktiver DHCP i det gitte området med leie varighet"
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr "Skift til denne gruppen etter oppstart (standard er %s)."
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr "Sett adresse eller vertsnavn for en spesifikk maskin."
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr "IKKE last %s filen."
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr "Spesifiser en verts (hosts) fil som skal leses i tilleg til %s."
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr "Spesifiser nettverkskort det skal lyttes på."
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr "Spesifiser nettverkskort det IKKE skal lyttes på."
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr "Map DHCP bruker klasse til opsjon sett."
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr "Ikke utfør DHCP for klienter i opsjon sett."
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr "IKKE last (fork) som bakgrunnsprosess, IKKE kjør i debug modus."
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr "Anta at vi er den eneste DHCP tjeneren på det lokale nettverket."
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr "Spesifiser hvor DHCP leiene skal lagres (standard er %s)."
#: option.c:148
msgid "Return MX records for local hosts."
msgstr "Returner MX records for lokale verter."
#: option.c:149
msgid "Specify an MX record."
msgstr "Spesifiser en MX post."
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr "Spesifiser BOOTP opsjoner til DHCP tjener."
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr "IKKE spør (poll) %s fil, les på nytt kun ved SIGHUP"
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr "IKKE mellomlagre søkeresultater som feiler."
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr "Bruk navnetjenere kun som bestemt i rekkefølgen gitt i %s."
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr "Sett ekstra opsjoner som skal fordeles til DHCP klientene."
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr "Spesifiser lytteport for DNS oppslag (standard er 53)."
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr "Maksimal støttet UDP pakkestørrelse for EDNS.0 (standard er %s)."
#: option.c:157
msgid "Log queries."
msgstr "Logg oppslag."
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr "Tving bruk av opprinnelig port for oppstrøms oppslag."
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr "IKKE les resolv.conf."
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr "Spesifiser stien til resolv.conf (standard er %s)."
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr "Spesifiser adressen(e) til oppstrøms tjenere med valgfrie domener."
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr "Aldri videresend oppslag til spesifiserte domener."
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr "Spesifiser domenet som skal tildeles i DHCP leien."
#: option.c:164
msgid "Specify default target in an MX record."
msgstr "Spesifiser default mål i en MX post."
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr "Spesifiser time-to-live i sekunder for svar fra /etc/hosts."
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr "Skift til denne bruker etter oppstart (standard er %s)."
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr "Map DHCP produsent klasse til opsjon sett."
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr "Vis dnsmasq versjon og copyright informasjon."
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr "Oversett IPv4 adresser fra oppstrøms tjenere."
#: option.c:170
msgid "Specify a SRV record."
msgstr "Spesifiser en SRV post."
#: option.c:171
msgid "Display this message."
msgstr "Vis denne meldingen."
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr "Spesifiser stien til PID fil. (standard er %s)."
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr "Spesifiser maksimum antall DHCP leier (standard er %s)"
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr "Svar DNS oppslag basert på nettverkskortet oppslaget ble sendt til."
#: option.c:175
msgid "Specify TXT DNS record."
msgstr "Spesifiser TXT DNS post."
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr "Bind kun til nettverkskort som er i bruk."
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr "Les DHCP statisk vert informasjon fra %s."
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr "Aktiver DBus interface for å sette oppstrøms tjenere, osv."
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr "Ikke lever DHCP på dette nettverkskortet, kun lever DNS."
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr "Aktiver dynamisk adresse allokering for bootp."
#: option.c:181
#, fuzzy
msgid "Map MAC address (with wildcards) to option set."
msgstr "Map DHCP produsent klasse til opsjon sett."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "mangler \""
#: option.c:425
msgid "bad option"
msgstr "dårlig opsjon"
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr "kan ikke lese %s: %s"
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
"Bruk: dnsmasq [opsjoner]\n"
"\n"
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr "Bruk korte opsjoner kun på kommandolinjen.\n"
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr "Gyldige opsjoner er :\n"
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr "Dnsmasq versjon %s %s\n"
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
"Kompileringsopsjoner %s\n"
"\n"
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr "Denne programvaren kommer med ABSOLUTT INGEN GARANTI.\n"
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr "DNsmasq er fri programvare, du er velkommen til å redistribuere den\n"
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr "under vilkårene gitt i GNU General Public License, versjon 2.\n"
#: option.c:491
msgid "extraneous parameter"
msgstr "overflødig parameter"
#: option.c:499
msgid "missing parameter"
msgstr "mangler parameter"
#: option.c:516
msgid "nested includes not allowed"
msgstr "nøstede inkluderinger er ikke tillatt"
#: option.c:576
msgid "bad MX preference"
msgstr "dårlig MX preferanse"
#: option.c:585
msgid "bad MX name"
msgstr "dårlig MX navn"
#: option.c:603
msgid "bad MX target"
msgstr "dårlig MX mål"
#: option.c:802 option.c:813
msgid "bad port"
msgstr "dårlig port"
#: option.c:955
msgid "bad dhcp-range"
msgstr "dårlig dhcp-område"
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr "ikke konsistent DHCP område"
#: option.c:1214
msgid "bad dhcp-host"
msgstr "dårlig dhcp-vert"
#: option.c:1271
msgid "bad dhcp-option"
msgstr "dårlig dhcp-opsjon"
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr "dårlig domene i dhcp-opsjon"
#: option.c:1459
msgid "dhcp-option too long"
msgstr "dhcp-opsjon for lang"
#: option.c:1656
msgid "bad TXT record"
msgstr "dårlig TXT post"
#: option.c:1688
msgid "TXT record string too long"
msgstr "TXT post streng for lang"
#: option.c:1727
msgid "bad SRV record"
msgstr "dårlig SRV post"
#: option.c:1740
msgid "bad SRV target"
msgstr "dårlig SRV mål"
#: option.c:1752
msgid "invalid port number"
msgstr "ugyldig portnummer"
#: option.c:1763
msgid "invalid priority"
msgstr "ugyldig prioritet"
#: option.c:1774
msgid "invalid weight"
msgstr "ugyldig vekt"
#: option.c:1799
msgid "error"
msgstr "feil"
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr "dårlige kommandlinje opsjoner: %s."
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr "klarer ikke å få vertsnavn: %s"
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "kun en resolv.conf fil tillat i no-poll modus."
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr "må ha nøyaktig en resolv.conf å lese domene fra."
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr "feilet å lese %s: %m"
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr "intet søke direktiv funnet i %s"
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "navnetjener %s nektet å gjøre et rekursivt oppslag"
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr "fremsendelse (forwarding) tabell overflyt: sjekk etter tjener løkker."
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr "feilet å få tilgang til %s: %m"
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "feilet å laste %s: %m"
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr "leser %s"
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "dårlig navn i %s"
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr "Ignorerer DHCP leie for %s siden den har en ulovlig domene del"
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr "feilet å lage lytte socket: %s"
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "feilet å sette IPv6 opsjoner på lytte socket: %s"
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "feilet å binde lytte socket for %s: %s"
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr "feilet å lytte på socket: %s"
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorerer navnetjener %s - lokal tilknytning"
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "ignorerer navnetjener %s - kan ikke lage/dinde socket: %m"
#: network.c:434
msgid "domain"
msgstr "domene"
#: network.c:436
msgid "unqualified"
msgstr "ikke kvalifisert"
#: network.c:436
msgid "domains"
msgstr "domener"
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr "benytter lokale adresser kun for %s %s"
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "benytter navnetjener %s#%d for %s %s"
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr "benytter navnetjener %s#%d"
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"ISC dhcpf integrasjon ikke tilgjengelig: sett HAVE_ISC_READER i src/config.h"
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "feilet å finne liste av tilknytninger (interfaces): %s"
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr "ukjent tilknytning (interface) %s"
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr "ingen tilknytning (interface) med adresse %s"
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr "må sette nøyaktig et interface på ødelagte systemer uten IP_RECVIF"
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr "DBus feil: %s"
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus ikke tilgjengelig: sett HAVE_DBUS i src/config.h"
#: dnsmasq.c:196
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "kan ikke lese %s: %s"
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr "startet, versjon %s mellomlager størrelse %d"
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr "startet, versjon %s mellomlager deaktivert"
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr "kompilerings opsjoner: %s"
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr "DBus støtte aktivert: koblet til system buss"
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr "DBus støtte aktivert: avventer buss tilkobling"
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "setter --bind-interfaces opsjon på grunn av OS begrensninger"
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "advarsel: nettverkskort %s eksisterer ikke for tiden"
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, statisk leie kun på %.0s%s, leie tid %s"
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, IP område %s -- %s, leie tid %s"
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr "kjører som rot (root)"
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr "avslutter etter mottak av SIGTERM"
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr "tilkoblet til system DBus"
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "kan ikke lage DHCP socket : %s"
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "feilet å sette opsjoner på DHCP socket: %s"
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "feilet å sette SO_REUSEADDR på DHCP socket: %s"
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "feilet å binde DHCP tjener socket: %s"
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "kan ikke lage ICMP raw socket: %s"
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "dubliserte IP adresser i %s dhcp-config direktiv."
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "DHCP område %s -- %s er ikke konsistent med nettmaske %s"
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr "feilet å lese %s:%m"
#: dhcp.c:642
#, c-format
msgid "bad line at %s line %d"
msgstr "dårlig linje ved %s linje %d"
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "dubliserte IP adresser i %s (%s) i dhcp-config direktiv"
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr "Ignorerer DHCP verts navn %s på grunn av ulovlig domene del"
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "kan ikke åpne eller lage leie fil: %s"
#: lease.c:71
msgid "too many stored leases"
msgstr "for mange lagrede leier"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "feilet å lese %s: %m"
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "ingen adresse område tilgjengelig for DHCP krav %s %s"
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "med subnet velger"
#: rfc2131.c:248
msgid "via"
msgstr "via"
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "deaktivert"
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adresse i bruk"
#: rfc2131.c:313
msgid "no address configured"
msgstr "ingen adresse konfigurert"
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "ingen adresse tilgjengelig"
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "ingen leier igjen"
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "galt nettverk"
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "deaktiverer DHCP statisk adresse %s"
#: rfc2131.c:558
msgid "unknown lease"
msgstr "ukjent leie"
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "oversett"
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "gal adresse"
#: rfc2131.c:683
msgid "lease not found"
msgstr "leie ikke funnet"
#: rfc2131.c:715
msgid "address not available"
msgstr "adresse ikke tilgjengelig"
#: rfc2131.c:724
msgid "static lease available"
msgstr "statisk leie tilgjengelig"
#: rfc2131.c:728
msgid "address reserved"
msgstr "adresse reservert"
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr "kan ikke sende DHCP opsjon %d: ikke mer plass i pakken"
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Mer enn en produsent klasse som passer, bruker %s"
#: netlink.c:51
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "kan ikke binde netlink socket: %s"
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr "forsøk på å sette en IPv6 tjener adresse via DBus - ingen IPv6 støtte"
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "setter oppstrøms tjener fra DBus"
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "kunne ikke registrere en DBus meldingshåndterer"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "kan ikke lage DHCP BPF socket: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "DHCP krav for ikke støttet maskinvare type (%d) mottatt på %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "kan ikke åpne %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s vil bli skrevet hver %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "kan ikke lage DHCP pakke socket: %s. Er CONFIG_PACKET aktivert i din "
#~ "kjerne?"
#~ msgid "Cannot use RTnetlink socket, falling back to ioctl API"
#~ msgstr "Kan ikke benytte RTnetlink socket, faller tilbake til ioctl API"

917
po/pl.po Normal file
View File

@@ -0,0 +1,917 @@
# Polish translations for dnsmasq package.
# This file is put in the public domain.
# Tomasz Sochañski <nerdhero@gmail.com>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2005-10-04 19:17+0100\n"
"Last-Translator: Tomasz Sochañski <nerdhero@gmail.com>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "b³±d ³adowania nazw z %s: %m"
#: cache.c:606 dhcp.c:655
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "b³êdna nazwa w %s, linia %d"
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr "b³êdna nazwa w %s, linia %d"
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr "przeczytano %s - %d adresów"
#: cache.c:675
msgid "cleared cache"
msgstr "wyczyszczono cache"
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
"nazwa %s nie zosta³a nadana dzier¿awie DHCP %s, poniewa¿ nazwa istnieje w %s "
"i ma adres %s"
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"wielko¶æ cache %d, %d/%d wpisów cache u¿yto ponownie z niewygas³ych wpisów"
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr "nie mo¿na pobraæ pamiêci"
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s w linii %d z %%s"
#: util.c:183
msgid "FAILED to start up"
msgstr "B£¡D uruchomienia"
#: util.c:304
#, c-format
msgid "infinite"
msgstr "nieskoñczona"
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr "Adres(y) lokalne do nas³uchiwania."
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr "Zwracanie adresu IP dla wszystkich hostów w podanych domenach."
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr "Symulacja reverse lookups dla adresów prywatnych opisanych w RFC1918."
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr "Adres IP traktowany jak NXDOMAIN"
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr "Wielko¶æ pamiêci cache we wpisach (domy¶lna: %s)"
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr "¦cie¿ka do pliku konfiguracyjnego (domy¶lna: %s)"
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr "NIE twórz procesu potomnego w tle: dzia³anie w trybie debugowania."
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr "Wy³±czenie przekazywania zapytañ bez czê¶ci domenowej."
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr "Zwracanie samowskazuj±cego rekordu MX dla lokalnych hostów."
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr "Rozwijanie prostych nazw z /etc/hosts przyrostkiem domenowym."
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr "Wy³±czenie przekazywania pozornych zapytañ DNS z komputerów Windows"
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr "Enable DHCP w zakresie okre¶lonym czasem dzier¿awy."
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr "Po starcie zmiana grupy procesu na podan± (domy¶lnie: %s)."
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr "Ustawienie adresu lub nazwy hosta dla okre¶lonej maszyny."
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr "Ignorowanie pliku %s."
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr "Dodatkowy plik hostów poza %s."
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr "Interfejs(y) do nas³uchiwania."
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr "Interfejs(y), na których nie nas³uchiwaæ."
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr "W³±czenie mapowania klasy u¿ytkownika DHCP do option set."
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr ""
"Wy³±czenie odpowiadania na ¿adania DHCP hostów okre¶lonych w option set"
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr ""
"Wy³±czenie tworzenia procesu potomnego w tle, wy³±czenie dzia³ania w trybie "
"debug."
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr "Za³o¿enie, ¿e jeste¶my jedynym serwerem DHCP w sieci lokalnej."
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr "¦cie¿ka przechowywania pliku dzier¿aw DHCP (domy¶lna: %s)"
#: option.c:148
msgid "Return MX records for local hosts."
msgstr "W³±czenie zwracania rekord MX dla hostów lokalnych."
#: option.c:149
msgid "Specify an MX record."
msgstr "Specyfikacja rekordu MX."
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr "Okre¶lenie opcji BOOTP serwera DHCP."
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr ""
"Wy³aczenie analizy pliku %s, ponownie ³adowanie tylko po otrzymaniu sygna³u "
"HUP"
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr ""
"Wy³±czenie zapisywania w pamiêci podrêcznej nieudanych wyników wyszukiwania."
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr "W³±czenie u¿ywania serwerów nazw w kolejno¶ci podanej w %s."
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr "Dodatkowe opcje ustawieñ dla klientów DHCP."
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr "Port nas³uchiwania zapytañ DNS (domy¶lnie: 53)."
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr "Maksymalna obs³ugiwana wielko¶æ pakietu EDNS.0 (domy¶lnie: %s)."
#: option.c:157
msgid "Log queries."
msgstr "Zapytania zapisywane w pliku log."
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr ""
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr "Wy³±czenie czytania pliku resolv.conf"
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr "Podaj ¶cie¿kê do pliku resolv.conf (domy¶lnie: %s)."
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr ""
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr "Wy³±czenie przekazywania zapytañ do okre¶lonych domen."
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr "Nazwa domeny, która bêdzie przypisana w dzier¿awach DHCP."
#: option.c:164
msgid "Specify default target in an MX record."
msgstr "Okre¶lenie domy¶lnego celu w rekordzie MX."
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr ""
"Okre¶lenie czasu wa¿no¶ci (time-to-live) w sekundach odpowiedzi branych z /"
"etc/hosts."
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr "Po starcie zmiana u¿ytkownika procesu na podanego. (domy¶lnie: %s)."
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr "Mapowanie nazwy dystrybutora DHCP do ustawieñ opcji."
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr ""
"W³±czenie pokazywania wersji dnsmasq i informacji o ochronie praw autorskich."
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr ""
#: option.c:170
msgid "Specify a SRV record."
msgstr "Okre¶lenie rekordu SRV."
#: option.c:171
msgid "Display this message."
msgstr "Wy¶wietlenie tych informacji."
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr "Okre¶lenie ¶cie¿ki do pliku PID. (domy¶lnie: %s)."
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr "Maksymalna liczba dzier¿aw DHCP. (domy¶lnie: %s)."
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
"Odpowiedzi na zapytania DNS uzale¿nione od interfejsu, który odebra³ "
"zapytanie."
#: option.c:175
msgid "Specify TXT DNS record."
msgstr "Rekord TXT DNS."
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr "W³±czenie nas³uchiwania tylko na u¿ywanych interfejsach."
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr "Statycznych informacji DHCP hosta z pliku %s."
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr ""
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr "Wy³±czenie DHCP na tym interfejsie, w³±czenie tylko DNS."
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr "W³±czenie automatycznej alokacji adresu dla BOOTP."
#: option.c:181
#, fuzzy
msgid "Map MAC address (with wildcards) to option set."
msgstr "Mapowanie nazwy dystrybutora DHCP do ustawieñ opcji."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "brakuje \""
#: option.c:425
msgid "bad option"
msgstr "nieprawid³owa opcja"
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr "b³±d odczytu z %s: %s"
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
"U¿ycie: dnsmasq [opcje]\n"
"\n"
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr "Tylko krótkie opcje w linii komend.\n"
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr "Obs³ugiwane opcje:\n"
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr "Dnsmasq, wersja %s %s\n"
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
"Wkompilowane opcje %s\n"
"\n"
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr "Oprogramowanie to nie zawiera ¿adnych gwarancji.\n"
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr "Dnsmasq jest wolnym oprogramowaniem, mo¿esz je rozprowadzaæ\n"
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr "na warunkach okre¶lonych w GNU General Public Licence, wersja 2.\n"
#: option.c:491
msgid "extraneous parameter"
msgstr "dodatkowy parametr"
#: option.c:499
msgid "missing parameter"
msgstr "brak parametru"
#: option.c:516
msgid "nested includes not allowed"
msgstr "zagnie¿d¿one do³±czanie plików jest niedozwolone"
#: option.c:576
msgid "bad MX preference"
msgstr ""
#: option.c:585
msgid "bad MX name"
msgstr "b³êdna nazwa MX"
#: option.c:603
msgid "bad MX target"
msgstr "b³êdny cel MX"
#: option.c:802 option.c:813
msgid "bad port"
msgstr "nieprawid³owy port"
#: option.c:955
msgid "bad dhcp-range"
msgstr "nieprawid³owy zakres dhcp-range"
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr "niespójny zakres DHCP"
#: option.c:1214
msgid "bad dhcp-host"
msgstr "b³±d w dhcp-host"
#: option.c:1271
msgid "bad dhcp-option"
msgstr "b³±d w dhcp-option"
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr "nieprawid³owa nazwa domeny w dhcp-option"
#: option.c:1459
msgid "dhcp-option too long"
msgstr "zbyt d³uga nazwa w dhcp-option"
#: option.c:1656
msgid "bad TXT record"
msgstr "nieprawid³owy rekord TX"
#: option.c:1688
msgid "TXT record string too long"
msgstr "zbyt d³ugi rekord TXT"
#: option.c:1727
msgid "bad SRV record"
msgstr "b³±d w rekordzie SRV"
#: option.c:1740
msgid "bad SRV target"
msgstr "nieprawid³owy cel SRV"
#: option.c:1752
msgid "invalid port number"
msgstr "nieprawid³owy port"
#: option.c:1763
msgid "invalid priority"
msgstr "nieprawid³owy priorytet"
#: option.c:1774
msgid "invalid weight"
msgstr "nieprawid³owe znaczenie"
#: option.c:1799
msgid "error"
msgstr "b³±d"
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr "nieprawid³owa opcja linii komend: %s."
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr "nie mo¿na pobraæ nazwy hosta: %s"
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "tylko jeden plik resolv.conf jest dopuszczany w trybie no-poll."
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr "musisz mieæ dok³adnie jeden plik resolv.conf do odczytu domen."
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr "b³±d w odczycie %s: %m"
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr "brak wytycznych wyszukiwania w %s"
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "serwer nazw %s odmawia wykonania zapytania rekursywnego"
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
"przekroczenie zakresu tablicy przekazywania: sprawd¼ zapêtlenie serwera."
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr "b³±d w dostêpie do %s: %m"
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "b³±d ³adowania %s: %m"
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr "czytanie %s"
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "nieprawid³owa nazwa w %s"
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
"Ignorujê dzier¿awy DHCP dla %s poniewa¿ zawieraj± nieprawid³ow± czê¶æ "
"domenow±"
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr "b³±d podczas tworzenia gniazda: %s"
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "b³±d ustawienia opcji IPV6 na nas³uchuj±cym gnie¼dzie: %s"
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "b³±d pod³±czenia nas³uchuj±cego gniazda dla %s: %s"
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr "b³±d w³±czenia nas³uchiwania gniazda: %s"
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorowanie serwera nazw %s - interfejs lokalny"
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "ignorowanie serwera nazw %s - nie mo¿na utworzyæ/dowi±zaæ gniazda: %m"
#: network.c:434
msgid "domain"
msgstr "domena"
#: network.c:436
msgid "unqualified"
msgstr "niekwalifikowany(a/e)"
#: network.c:436
msgid "domains"
msgstr "domeny"
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr "w³±czenie u¿ywania lokalnych adresów tylko dla %s %s"
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "u¿ywany serwer nazw: %s#%d dla %s %s"
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr "u¿ywany serwer nazw %s#%d"
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"Intergracja z ISC dhcpd nie jest dostêpna: ustaw HAVE_ISC_READER w src/"
"config.h"
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "b³±d w znalezieniu listy interfejsów sieciowych: %s"
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr "nieznany interfejs %s"
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr "brak interfejsu z adresem %s"
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr "musisz ustawiæ dok³adnie jeden interfejs w systemach bez IP_RECVIF"
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr "b³±d DBus: %s"
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus jest niedostêpny: ustaw HAVE_DBUS w src/config.h"
#: dnsmasq.c:196
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "b³±d odczytu z %s: %s"
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr "uruchomiony, wersja %s wielko¶æ cache %d"
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr "uruchomiony, wersja %s cache wy³±czony"
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr "opcje kompilacji: %s"
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr "obs³uga DBus w³±czona: pod³±czono do szyny systemowej"
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr "obs³uga DBus w³±czona: pod³±czanie do szyny systemowej w toku"
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "ustawiam opcjê --bind-interfaces z powodu limitów systemu operacyjnego"
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "ostrze¿enie: interfejs %s obecnie nie istnieje"
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, statyczne dzier¿awy tylko na %.0s%s, czas dzier¿awy %s"
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, zakres IP %s -- %s, czas dzier¿awy %s"
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr "pracuje z uprawnieniami u¿ytkownika root"
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr "wy³±czenie po otrzymaniu sygnalu SIGTERM"
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr "po³±czono do systemowego DBus"
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "nie mo¿na utworzyæ gniazda DHCP : %s"
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "b³±d ustawienia opcji gniazda DHCP: %s"
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "b³±d ustawienia SO_REUSEADDR gniazda DHCP: %s"
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "b³±d pod³±czenia gniazda serwera DHCP: %s"
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "b³±d utworzenia surowego gniazda ICMP: %s."
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "powtórzenie adresu IP %s w opcji dhcp-config"
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "zakres DHCP %s -- %s jest niespójny z mask± sieciow± %s"
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr "b³±d odczytu %s:%m"
#: dhcp.c:642
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "b³êdna nazwa w %s, linia %d"
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "powtórzenie adresu IP %s (%s) w opcji dhcp-config"
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
"Ignorujê nazwê hosta DHCP %s, poniewa¿ posiada nieprawid³ow± czê¶æ domenow±"
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "b³±d otwarcia lub utworzenia pliku dzier¿aw: %s"
#: lease.c:71
msgid "too many stored leases"
msgstr "zbyt du¿a ilo¶æ zapisanych dzier¿aw"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "b³±d w odczycie %s: %m"
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "¿aden zakres adresowy nie jest dostêpny dla ¿adania DHCP %s %s"
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "z selekcj± podsieci"
#: rfc2131.c:248
msgid "via"
msgstr "przez"
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "wy³±czony(a)"
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adres w u¿yciu"
#: rfc2131.c:313
msgid "no address configured"
msgstr "brak skonfigurowanego adresu"
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "brak dostêpnego adresu"
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "brak wolnych dzier¿aw"
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "nieprawid³owa sieæ"
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "wy³±czanie statycznego adresu DHCP %s"
#: rfc2131.c:558
msgid "unknown lease"
msgstr "nieznana dzier¿awa"
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignorujê"
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "b³êdny adres"
#: rfc2131.c:683
msgid "lease not found"
msgstr "dzier¿awa nie znaleziona"
#: rfc2131.c:715
msgid "address not available"
msgstr "adres niedostêpny"
#: rfc2131.c:724
msgid "static lease available"
msgstr "dostêpna statyczna dzier¿awa"
#: rfc2131.c:728
msgid "address reserved"
msgstr "adres zarezerwowany"
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Wiêcej ni¿ jeden dystrybutor pasuj±cy, u¿ywam %s"
#: netlink.c:51
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "nie mo¿na pod³±czyæ gniazda netlink: %s"
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr "próba ustawienia adresu IPv6 serwera przez DBus - brak obs³ugi IPv6"
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "nie mo¿na zarejestrowaæ uchwytu wiadomo¶ci DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "b³±d utworzenia gniazda DHCP BPF: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "¿±danie DHCP nieobs³ugiwanego typu sprzêtowego (%d) otrzymane na %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "nie mo¿na otworzyæ %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s bêdzie zapisywane co %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "b³±d utworzenia gniazda pakietów DHCP: %s. Czy w Twoim kernelu "
#~ "uaktywni³e¶ opcjê CONFIG_PACKET?"

878
po/pt_BR.po Normal file
View File

@@ -0,0 +1,878 @@
# Portuguese translations for dnsmasq package.
# This file is put in the public domain.
# Simon Kelley <simon@thekelleys.org.uk>, 2006.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.26\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2006-01-16 20:42+0000\n"
"Last-Translator: Simon Kelley <simon@thekelleys.org.uk>\n"
"Language-Team: Portuguese <ldp-br@bazar.conectiva.com.br>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr ""
#: cache.c:606 dhcp.c:655
#, c-format
msgid "bad address at %s line %d"
msgstr ""
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr ""
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr ""
#: cache.c:675
msgid "cleared cache"
msgstr ""
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
#: cache.c:772
#, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr ""
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr ""
#: util.c:183
msgid "FAILED to start up"
msgstr ""
#: util.c:304
#, c-format
msgid "infinite"
msgstr ""
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr ""
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr ""
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr ""
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr ""
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr ""
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr ""
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr ""
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr ""
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr ""
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr ""
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr ""
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr ""
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr ""
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr ""
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr ""
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr ""
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr ""
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr ""
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr ""
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr ""
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr ""
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr ""
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr ""
#: option.c:148
msgid "Return MX records for local hosts."
msgstr ""
#: option.c:149
msgid "Specify an MX record."
msgstr ""
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr ""
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr ""
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr ""
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr ""
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr ""
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr ""
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr ""
#: option.c:157
msgid "Log queries."
msgstr ""
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr ""
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr ""
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr ""
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr ""
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr ""
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr ""
#: option.c:164
msgid "Specify default target in an MX record."
msgstr ""
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr ""
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr ""
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr ""
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr ""
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr ""
#: option.c:170
msgid "Specify a SRV record."
msgstr ""
#: option.c:171
msgid "Display this message."
msgstr ""
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr ""
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr ""
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
#: option.c:175
msgid "Specify TXT DNS record."
msgstr ""
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr ""
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr ""
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr ""
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr ""
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr ""
#: option.c:181
msgid "Map MAC address (with wildcards) to option set."
msgstr ""
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr ""
#: option.c:425
msgid "bad option"
msgstr ""
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr ""
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr ""
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr ""
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr ""
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr ""
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr ""
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr ""
#: option.c:491
msgid "extraneous parameter"
msgstr ""
#: option.c:499
msgid "missing parameter"
msgstr ""
#: option.c:516
msgid "nested includes not allowed"
msgstr ""
#: option.c:576
msgid "bad MX preference"
msgstr ""
#: option.c:585
msgid "bad MX name"
msgstr ""
#: option.c:603
msgid "bad MX target"
msgstr ""
#: option.c:802 option.c:813
msgid "bad port"
msgstr ""
#: option.c:955
msgid "bad dhcp-range"
msgstr ""
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr ""
#: option.c:1214
msgid "bad dhcp-host"
msgstr ""
#: option.c:1271
msgid "bad dhcp-option"
msgstr ""
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr ""
#: option.c:1459
msgid "dhcp-option too long"
msgstr ""
#: option.c:1656
msgid "bad TXT record"
msgstr ""
#: option.c:1688
msgid "TXT record string too long"
msgstr ""
#: option.c:1727
msgid "bad SRV record"
msgstr ""
#: option.c:1740
msgid "bad SRV target"
msgstr ""
#: option.c:1752
msgid "invalid port number"
msgstr ""
#: option.c:1763
msgid "invalid priority"
msgstr ""
#: option.c:1774
msgid "invalid weight"
msgstr ""
#: option.c:1799
msgid "error"
msgstr ""
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr ""
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr ""
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr ""
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr ""
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr ""
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr ""
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr ""
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr ""
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr ""
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr ""
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr ""
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr ""
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr ""
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr ""
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr ""
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr ""
#: network.c:434
msgid "domain"
msgstr ""
#: network.c:436
msgid "unqualified"
msgstr ""
#: network.c:436
msgid "domains"
msgstr ""
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr ""
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr ""
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr ""
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr ""
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr ""
#: dnsmasq.c:196
#, c-format
msgid "cannot create pipe: %s"
msgstr ""
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr ""
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr ""
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr ""
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr ""
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr ""
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr ""
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr ""
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr ""
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr ""
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr ""
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr ""
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr ""
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr ""
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr ""
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr ""
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr ""
#: dhcp.c:642
#, c-format
msgid "bad line at %s line %d"
msgstr ""
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr ""
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr ""
#: lease.c:71
msgid "too many stored leases"
msgstr ""
#: lease.c:118
#, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr ""
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr ""
#: rfc2131.c:248
msgid "with subnet selector"
msgstr ""
#: rfc2131.c:248
msgid "via"
msgstr ""
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr ""
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr ""
#: rfc2131.c:313
msgid "no address configured"
msgstr ""
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr ""
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr ""
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr ""
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr ""
#: rfc2131.c:558
msgid "unknown lease"
msgstr ""
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr ""
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr ""
#: rfc2131.c:683
msgid "lease not found"
msgstr ""
#: rfc2131.c:715
msgid "address not available"
msgstr ""
#: rfc2131.c:724
msgid "static lease available"
msgstr ""
#: rfc2131.c:728
msgid "address reserved"
msgstr ""
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr ""
#: netlink.c:51
#, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr ""
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr ""
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: bpf.c:74
#, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""

907
po/ro.po Normal file
View File

@@ -0,0 +1,907 @@
# Romanian translations for dnsmasq package.
# This file is put in the public domain.
# Simon Kelley <simon@thekelleys.org.uk>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-04-23 19:58+0100\n"
"PO-Revision-Date: 2005-11-22 16:46+0000\n"
"Last-Translator: Simon Kelley <simon@thekelleys.org.uk>\n"
"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
# for compatibility purposes the letters â, ă, ş, ţ and î can be written as their look-alike correspondent.
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "încărcarea numelor din %s: %m a eşuat"
#: cache.c:606 dhcp.c:655
#, c-format
msgid "bad address at %s line %d"
msgstr "adresă greşită în %s, linia %d"
#: cache.c:633 dhcp.c:669
#, c-format
msgid "bad name at %s line %d"
msgstr "nume greşit în %s linia %d"
#: cache.c:639 dhcp.c:723
#, c-format
msgid "read %s - %d addresses"
msgstr "citesc %s - %d adrese"
#: cache.c:675
msgid "cleared cache"
msgstr "memoria temporară a fost ştearsă"
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
"with address %s"
msgstr ""
"nu pot da numele %s împrumutului de adresă DHCP a lui %s deoarece "
"numeleexistă în %s cu adresa %s"
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"cantitate de memorie temporară %d, %d/%d stocări temporare aureutilizat "
"locaţii neexpirate."
#: util.c:153 option.c:1294
msgid "could not get memory"
msgstr "nu am putut aloca memorie"
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s la linia %d din %%s"
#: util.c:183
msgid "FAILED to start up"
msgstr "pornirea A EŞUAT"
#: util.c:304
#, c-format
msgid "infinite"
msgstr "infinit"
#: option.c:125
msgid "Specify local address(es) to listen on."
msgstr "Specificaţi adresele locale deservite."
#: option.c:126
msgid "Return ipaddr for all hosts in specified domains."
msgstr "Afişează adresele IP ale maşinilor în domeniul dat."
#: option.c:127
msgid "Fake reverse lookups for RFC1918 private address ranges."
msgstr ""
"Simulează căutări după adresă pentru domenii de adresă private (RFC1918)."
#: option.c:128
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
msgstr "Interpretează adresa IP ca NXDOMAIN (împotriva manipulărilor Verisign)"
#: option.c:129
#, c-format
msgid "Specify the size of the cache in entries (defaults to %s)."
msgstr "Specifică mărimea înregistrărilor temporare (implicit e %s)."
#: option.c:130
#, c-format
msgid "Specify configuration file (defaults to %s)."
msgstr "Specifică fişier de configurare (implicit e %s)."
#: option.c:131
msgid "Do NOT fork into the background: run in debug mode."
msgstr "NU porneşte în fundal: rulează în modul depanare."
#: option.c:132
msgid "Do NOT forward queries with no domain part."
msgstr "NU înainta cererile ce nu conţin domeniu DNS."
#: option.c:133
msgid "Return self-pointing MX records for local hosts."
msgstr "Răspunde cu înregistrări MX spre el însuşi pentru maşini locale."
#: option.c:134
msgid "Expand simple names in /etc/hosts with domain-suffix."
msgstr "Adaugă numelor simple din /etc/hosts numele domeniului ca sufix."
#: option.c:135
msgid "Don't forward spurious DNS requests from Windows hosts."
msgstr "Nu inainta cereri DNS defecte provenite de la maşini Windows."
#: option.c:136
msgid "Enable DHCP in the range given with lease duration."
msgstr "Activează DHCP în domeniul dat cu durată limitată de împrumut."
#: option.c:137
#, c-format
msgid "Change to this group after startup (defaults to %s)."
msgstr "Rulează sub acest grup după pornire (implicit e %s)."
#: option.c:138
msgid "Set address or hostname for a specified machine."
msgstr "Schimbă adresa sau numele maşinii specificate."
#: option.c:139
#, c-format
msgid "Do NOT load %s file."
msgstr "Nu încarcă fişierul %s."
#: option.c:140
#, c-format
msgid "Specify a hosts file to be read in addition to %s."
msgstr "Specifică spre citire un fişier hosts adiţional la %s."
#: option.c:141
msgid "Specify interface(s) to listen on."
msgstr "Specifică interfeţele deservite."
#: option.c:142
msgid "Specify interface(s) NOT to listen on."
msgstr "Specifică interfeţele NE-deservite."
#: option.c:143
msgid "Map DHCP user class to option set."
msgstr "Leagă clasa de utilizator DHCP cu grup de opţiuni."
#: option.c:144
msgid "Don't do DHCP for hosts in option set."
msgstr "Nu furniza DHCP maşinilor din grupul de opţiuni."
#: option.c:145
msgid "Do NOT fork into the background, do NOT run in debug mode."
msgstr "NU porneşte în fundal, NU rulează în modul depanare."
#: option.c:146
msgid "Assume we are the only DHCP server on the local network."
msgstr "Presupune că suntem singurul server DHCP din reţeaua locală."
#: option.c:147
#, c-format
msgid "Specify where to store DHCP leases (defaults to %s)."
msgstr "Specifică fişierul de stocare a împrumuturilor DHCP (implicit e %s)."
#: option.c:148
msgid "Return MX records for local hosts."
msgstr "Răspunde cu întregistrări MX pentru maşini locale."
#: option.c:149
msgid "Specify an MX record."
msgstr "Specifică o înregistrare MX."
#: option.c:150
msgid "Specify BOOTP options to DHCP server."
msgstr "Specifică opţiuni BOOTP serverului DHCP."
#: option.c:151
#, c-format
msgid "Do NOT poll %s file, reload only on SIGHUP."
msgstr "Nu încărca fişierul %s, citeşte-l doar la SIGHUP."
#: option.c:152
msgid "Do NOT cache failed search results."
msgstr "NU memora rezultatele de căutare DNS eşuatată."
#: option.c:153
#, c-format
msgid "Use nameservers strictly in the order given in %s."
msgstr "Foloseşte servere DNS strict în ordinea dată în %s."
#: option.c:154
msgid "Set extra options to be set to DHCP clients."
msgstr "Configurează opţiuni în plusce trebuie trimise clienţilor DHCP."
#: option.c:155
msgid "Specify port to listen for DNS requests on (defaults to 53)."
msgstr "Specifică numărul portului pentru cereri DNS (implicit e 53)."
#: option.c:156
#, c-format
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
msgstr "Marimea maximă a pachetului UDP pentru EDNS.0 (implicit e %s)."
#: option.c:157
msgid "Log queries."
msgstr "Înregistrează tranzacţiile."
#: option.c:158
msgid "Force the originating port for upstream queries."
msgstr "Forţează acest port pentru datele ce pleacă."
#: option.c:159
msgid "Do NOT read resolv.conf."
msgstr "NU citi fişierul resolv.conf"
#: option.c:160
#, c-format
msgid "Specify path to resolv.conf (defaults to %s)."
msgstr "Specifică calea către resolv.conf (implicit e %s)."
#: option.c:161
msgid "Specify address(es) of upstream servers with optional domains."
msgstr "Specifică adresele server(elor) superioare cu domenii opţionale."
#: option.c:162
msgid "Never forward queries to specified domains."
msgstr "Nu înaintează cererile spre domeniile specificate."
#: option.c:163
msgid "Specify the domain to be assigned in DHCP leases."
msgstr "Specifică domeniul de transmis prin DHCP."
#: option.c:164
msgid "Specify default target in an MX record."
msgstr "Specifică o ţintă într-o înregistrare MX."
#: option.c:165
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
msgstr "Specifică TTL în secunde pentru răspunsurile din /etc/hosts."
#: option.c:166
#, c-format
msgid "Change to this user after startup. (defaults to %s)."
msgstr "Rulează sub acest utilizator după pornire. (implicit e %s)."
#: option.c:167
msgid "Map DHCP vendor class to option set."
msgstr "Trimite opţiuni DHCP în funcţie de marca plăcii de reţea."
#: option.c:168
msgid "Display dnsmasq version and copyright information."
msgstr "Afişează versiunea dnsmasq şi drepturile de autor."
#: option.c:169
msgid "Translate IPv4 addresses from upstream servers."
msgstr "Traduce adresele IPv4 de la serverele DNS superioare."
#: option.c:170
msgid "Specify a SRV record."
msgstr "Specifică o înregistrare SRV."
#: option.c:171
msgid "Display this message."
msgstr "Afişează acest mesaj."
#: option.c:172
#, c-format
msgid "Specify path of PID file. (defaults to %s)."
msgstr "Specifică o cale pentru fişierul PID. (implicit %s)."
#: option.c:173
#, c-format
msgid "Specify maximum number of DHCP leases (defaults to %s)."
msgstr "Specifică numărul maxim de împrumuturi DHCP (implicit %s)."
#: option.c:174
msgid "Answer DNS queries based on the interface a query was sent to."
msgstr ""
"Răspunde cererilor DNS în funcţie de interfaţa pe care a venit cererea."
#: option.c:175
msgid "Specify TXT DNS record."
msgstr "Specifică o înregistrare TXT."
#: option.c:176
msgid "Bind only to interfaces in use."
msgstr "Ascultă doar pe interfeţele active."
#: option.c:177
#, c-format
msgid "Read DHCP static host information from %s."
msgstr "Citeşte informaţii DHCP statice despre maşină din %s."
#: option.c:178
msgid "Enable the DBus interface for setting upstream servers, etc."
msgstr "Activeaza interfaţa DBus pentru configurarea serverelor superioare."
#: option.c:179
msgid "Do not provide DHCP on this interface, only provide DNS."
msgstr "Nu activează DHCP ci doar DNS pe această interfaţă."
#: option.c:180
msgid "Enable dynamic address allocation for bootp."
msgstr "Activează alocarea dinamică a adreselor pentru BOOTP."
#: option.c:181
#, fuzzy
msgid "Map MAC address (with wildcards) to option set."
msgstr "Trimite opţiuni DHCP în funcţie de marca plăcii de reţea."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "lipseşte \""
#: option.c:425
msgid "bad option"
msgstr "opţiune invalidă"
#: option.c:442
#, c-format
msgid "cannot read %s: %s"
msgstr "nu pot citi %s: %s"
#: option.c:448
#, c-format
msgid ""
"Usage: dnsmasq [options]\n"
"\n"
msgstr ""
"Utilizare: dnsmasq [opţiuni]\n"
"\n"
#: option.c:450
#, c-format
msgid "Use short options only on the command line.\n"
msgstr "Folosiţi opţiunile prescurtate doar în linie de comandă.\n"
#: option.c:452
#, c-format
msgid "Valid options are :\n"
msgstr "Opţiunile valide sunt:\n"
#: option.c:477
#, c-format
msgid "Dnsmasq version %s %s\n"
msgstr "dnsmasq versiunea %s %s\n"
#: option.c:478
#, c-format
msgid ""
"Compile time options %s\n"
"\n"
msgstr ""
"Opţiuni cu care a fost compilat %s\n"
"\n"
#: option.c:479
#, c-format
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
msgstr "Acest program vine FĂRĂ NICI O GARANŢIE.\n"
#: option.c:480
#, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr "Dnsmasq este un program gratuit, sunteţi invitaţi să-l redistribuiţi\n"
#: option.c:481
#, c-format
msgid "under the terms of the GNU General Public License, version 2.\n"
msgstr "în termenii Licenţei publice generale GNU, versiunea 2.\n"
#: option.c:491
msgid "extraneous parameter"
msgstr "parametru nerecunoscut"
#: option.c:499
msgid "missing parameter"
msgstr "parametru lipsa"
#: option.c:516
msgid "nested includes not allowed"
msgstr "incluziunile locale nu sunt permise"
#: option.c:576
msgid "bad MX preference"
msgstr "preferinţă MX invalidă"
#: option.c:585
msgid "bad MX name"
msgstr "nume MX invalid"
#: option.c:603
msgid "bad MX target"
msgstr "ţintă MX invalidă"
#: option.c:802 option.c:813
msgid "bad port"
msgstr "port invalid"
#: option.c:955
msgid "bad dhcp-range"
msgstr "dhcp-range invalid"
#: option.c:984
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1029
msgid "inconsistent DHCP range"
msgstr "domeniu DHCP inconsistent"
#: option.c:1214
msgid "bad dhcp-host"
msgstr "dhcp-host invalid"
#: option.c:1271
msgid "bad dhcp-option"
msgstr "dhcp-option invalid"
#: option.c:1289
msgid "bad domain in dhcp-option"
msgstr "domeniu DNS invalid în declaraţia dhcp-option"
#: option.c:1459
msgid "dhcp-option too long"
msgstr "declararea dhcp-option este prea lungă"
#: option.c:1656
msgid "bad TXT record"
msgstr "înregistrare TXT invalidă"
#: option.c:1688
msgid "TXT record string too long"
msgstr "şirul de caractere pentru înregistrarea TXT este prea lung"
#: option.c:1727
msgid "bad SRV record"
msgstr "înregistrare SRV invalidă"
#: option.c:1740
msgid "bad SRV target"
msgstr "ţintă SRV invalidă"
#: option.c:1752
msgid "invalid port number"
msgstr "număr de port invalid"
#: option.c:1763
msgid "invalid priority"
msgstr "prioritate invalidă"
#: option.c:1774
msgid "invalid weight"
msgstr "pondere invalidă"
#: option.c:1799
msgid "error"
msgstr "eroare"
#: option.c:1801
#, c-format
msgid "bad command line options: %s."
msgstr "opţiuni în linie de comandă invalide: %s."
#: option.c:1803
msgid "try --help"
msgstr ""
#: option.c:1805
msgid "try -w"
msgstr ""
#: option.c:1845
#, c-format
msgid "cannot get host-name: %s"
msgstr "nu pot citi numele maşinii: %s"
#: option.c:1874
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "se permite un singur fişier resolv.conf în modul no-poll"
#: option.c:1881
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
"am nevoie de un singur resolv.conf din care să citesc numele domeniului."
#: option.c:1884 network.c:481
#, c-format
msgid "failed to read %s: %m"
msgstr "nu pot citi %s: %n"
#: option.c:1902
#, c-format
msgid "no search directive found in %s"
msgstr "nu s-a găsit nici un criteriu de căutare în %s"
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "serverul DNS %s refuză interogările recursive"
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr "depăşire de memorie în tabela cu înaintări DNS: verificaţi de bucle."
#: isc.c:73 dnsmasq.c:460
#, c-format
msgid "failed to access %s: %m"
msgstr "accesarea serverului %s a eşuat: %n"
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "nu pot încărca %s: %n"
#: isc.c:93 network.c:485
#, c-format
msgid "reading %s"
msgstr "citesc %s"
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "nume invalid în %s"
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr "Împrumutul DHCP pentru %s va fi ignorat deoarece are domeniu invalid"
#: network.c:308 dnsmasq.c:129
#, c-format
msgid "failed to create listening socket: %s"
msgstr "creearea socket-ului de ascultare a eşuat: %s"
#: network.c:315
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "configurarea opţiunilor IPv6 a eşuat pe socket-ul de ascultare: %s"
#: network.c:333
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "activarea socket-ului de ascultare pentru %s a eşuat: %s"
#: network.c:341
#, c-format
msgid "failed to listen on socket: %s"
msgstr "ascultarea pe socket a eşuat: %s"
#: network.c:411
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorăm serverul DNS %s - interfaţă locală"
#: network.c:420
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "ignorăm serverul DNS %s - nu pot creea/activa socket-ul: %s"
#: network.c:434
msgid "domain"
msgstr "domeniu"
#: network.c:436
msgid "unqualified"
msgstr "invalid"
#: network.c:436
msgid "domains"
msgstr "domenii"
#: network.c:439
#, c-format
msgid "using local addresses only for %s %s"
msgstr "folosim adresele locale doar pentru %S %s"
#: network.c:441
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "folosim serverul DNS %s#%d pentru %s %s"
#: network.c:444
#, c-format
msgid "using nameserver %s#%d"
msgstr "folosim serverul DNS %s#%d"
#: dnsmasq.c:94
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"Integrarea cu ISC dhcpd nu este disponibilă:puneţi HAVE_ISC_HEADER în src/"
"config.h"
#: dnsmasq.c:111
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "enumerarea interfeţelor a eşuat: %s"
#: dnsmasq.c:119
#, c-format
msgid "unknown interface %s"
msgstr "interfaţă necunoscută %s"
#: dnsmasq.c:125
#, c-format
msgid "no interface with address %s"
msgstr "nu exista interfaţă pentru adresa %s"
#: dnsmasq.c:145
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
"trebuie specificată exact o singură interfaţă pe sistemele defectece nu au "
"IP_RECVIF"
#: dnsmasq.c:158 dnsmasq.c:536
#, c-format
msgid "DBus error: %s"
msgstr "eroare DBus: %s"
#: dnsmasq.c:161
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus nu este disponibil: puneţi HAVE_DBUS in src/config.h"
#: dnsmasq.c:196
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "nu pot citi %s: %s"
#: dnsmasq.c:331
#, c-format
msgid "started, version %s cachesize %d"
msgstr "am ponit, versiunea %s memorie temporară %d"
#: dnsmasq.c:333
#, c-format
msgid "started, version %s cache disabled"
msgstr "am pornit, versiunea %s memorie temporară dezactivată"
#: dnsmasq.c:335
#, c-format
msgid "compile time options: %s"
msgstr "compilat cu opţiunile: %s"
#: dnsmasq.c:341
msgid "DBus support enabled: connected to system bus"
msgstr "suportul DBus activ: sunt conectat la magistrala sistem"
#: dnsmasq.c:343
msgid "DBus support enabled: bus connection pending"
msgstr "suportul DBus activ: aştept conexiunea la magistrală"
#: dnsmasq.c:348
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "specific opţiunea --bind-interfaces din cauza limitărilor SO"
#: dnsmasq.c:353
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "atenţie: interfaţa %s nu există momentan"
#: dnsmasq.c:365
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, împrumuturi statice doar către %.0s%s, timpul reînoirii %s"
#: dnsmasq.c:366
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, domeniu IP %s -- %s, timpul reînoirii %s"
#: dnsmasq.c:376
#, c-format
msgid "warning: setting capabilities failed: %m"
msgstr ""
#: dnsmasq.c:378
msgid "running as root"
msgstr "rulez ca root"
#: dnsmasq.c:511
msgid "exiting on receipt of SIGTERM"
msgstr "am primit SIGTERM, am terminat"
#: dnsmasq.c:538
msgid "connected to system DBus"
msgstr "magistrala sistem Dbus conectată"
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "nu pot creea socket DHCP : %s"
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "configurarea opţiunilor socketului DHCP a eşuat: %s"
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "configurarea SO_REUSEADDR pe socket-ul DHCP a eşuat: %s"
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "activarea socket-ului server-ului DHCP a eşuat: %s"
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "nu pot creea socket ICMP raw: %s."
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "adresă IP duplicat %s în declaraţia dhcp-config."
#: dhcp.c:307
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "domeniu DHCP %s -- %s nu este consistent cu masca de reţea %s"
#: dhcp.c:623
#, c-format
msgid "failed to read %s:%m"
msgstr "citirea %s:%n a eşuat"
#: dhcp.c:642
#, c-format
msgid "bad line at %s line %d"
msgstr "linie invalidă în %s rândul %d"
#: dhcp.c:746
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "adresă IP duplicat %s (%s) în declaraţia dhcp-config."
#: dhcp.c:782
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr "Ignor numele DHCP al maşinii %s deoarece are domeniu DNS ilegal"
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "nu pot creea sau deschide fişierul cu împrumuturi: %s"
#: lease.c:71
msgid "too many stored leases"
msgstr "prea multe împrumuturi stocate"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "nu pot citi %s: %n"
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "nici un domeniu de adrese disponibil pentru cererea DHCP %s %s"
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "cu selectorul de subreţea"
#: rfc2131.c:248
msgid "via"
msgstr "prin"
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "dezactivat"
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adresa este folosită"
#: rfc2131.c:313
msgid "no address configured"
msgstr "adresă lipsă"
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "nici o adresă disponibilă"
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "nu mai am de unde să împrumut"
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "reţea greşită"
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "dezactivăm adresele DHCP statice %s"
#: rfc2131.c:558
msgid "unknown lease"
msgstr "împrumut necunoscut"
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignorat"
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "adresă greşită"
#: rfc2131.c:683
msgid "lease not found"
msgstr "împrumutul nu a fost găsit"
#: rfc2131.c:715
msgid "address not available"
msgstr "adresă indisponibilă"
#: rfc2131.c:724
msgid "static lease available"
msgstr "împrumut static este disponibil"
#: rfc2131.c:728
msgid "address reserved"
msgstr "adresă rezervată"
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr "nu pot trimite opţiunea DHCP %d: nu mai este loc în pachet"
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Se potrivesc mai multe clase de mărci de interfeţe, folosim %s"
#: netlink.c:51
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "nu pot să activez socket-ul netlink: %s"
#: netlink.c:218
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr "incerc să configurez un server IPv6 prin Dbus - nu este suport IPv6"
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "configurăm serverele superioare prin Dbus"
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "nu pot activa o interfaţă de mesaje DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "nu pot creea socket DHCP BPF: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "cerere DHCP pentru dispozitiv nesuportat (%d) recepţionată prin %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "nu pot deschide %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s va fi rescris odată la fiecare %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "nu pot creea socket DHCP packet: %s. Aveţi activată în nucleulsistemului "
#~ "opţiunea CONFIG_PACKET ?"

View File

@@ -1,5 +1,5 @@
--- dnsmasq.8 2004-08-08 20:57:56.000000000 +0200
+++ dnsmasq.8 2004-08-12 00:40:01.000000000 +0200
--- man/dnsmasq.8 2004-08-08 20:57:56.000000000 +0200
+++ man/dnsmasq.8 2004-08-12 00:40:01.000000000 +0200
@@ -69,7 +69,7 @@
.TP
.B \-g, --group=<groupname>
@@ -17,15 +17,7 @@
#define CHUSER "nobody"
-#define CHGRP "dip"
+#define CHGRP "dialout"
#define IP6INTERFACES "/proc/net/if_inet6"
#define UPTIME "/proc/uptime"
#define DHCP_SERVER_PORT 67
@@ -187,7 +187,7 @@
#define DHCP_CLIENT_PORT 68
/* platform independent options. */
#undef HAVE_BROKEN_RTC
-#define HAVE_ISC_READER
+#undef HAVE_ISC_READER
#if defined(HAVE_BROKEN_RTC) && defined(HAVE_ISC_READER)
# error HAVE_ISC_READER is not compatible with HAVE_BROKEN_RTC

View File

@@ -1,16 +0,0 @@
# Uncomment this on Solaris.
#LIBS = -lsocket -lnsl
CFLAGS?= -O2
OBJS = cache.o rfc1035.o util.o option.o forward.o isc.o \
network.o dnsmasq.o dhcp.o lease.o rfc2131.o
.c.o: dnsmasq.h config.h
$(CC) $(CFLAGS) $(RPM_OPT_FLAGS) -Wall -W -c $*.c
dnsmasq : $(OBJS) dnsmasq.h config.h
$(CC) -o $@ $(OBJS) $(LIBS)

235
src/bpf.c Normal file
View File

@@ -0,0 +1,235 @@
/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 dated June, 1991.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "dnsmasq.h"
#ifndef HAVE_LINUX_NETWORK
#include <net/bpf.h>
static struct iovec ifconf = {
.iov_base = NULL,
.iov_len = 0
};
static struct iovec ifreq = {
.iov_base = NULL,
.iov_len = 0
};
struct header {
struct ether_header ether;
struct ip ip;
struct udphdr {
u16 uh_sport; /* source port */
u16 uh_dport; /* destination port */
u16 uh_ulen; /* udp length */
u16 uh_sum; /* udp checksum */
} udp;
};
void init_bpf(struct daemon *daemon)
{
int i = 0;
while (1)
{
/* useful size which happens to be sufficient */
if (expand_buf(&ifreq, sizeof(struct ifreq)))
{
sprintf(ifreq.iov_base, "/dev/bpf%d", i++);
if ((daemon->dhcp_raw_fd = open(ifreq.iov_base, O_RDWR, 0)) != -1)
return;
}
if (errno != EBUSY)
die(_("cannot create DHCP BPF socket: %s"), NULL);
}
}
void send_via_bpf(struct daemon *daemon, struct dhcp_packet *mess, size_t len,
struct in_addr iface_addr, struct ifreq *ifr)
{
/* Hairy stuff, packet either has to go to the
net broadcast or the destination can't reply to ARP yet,
but we do know the physical address.
Build the packet by steam, and send directly, bypassing
the kernel IP stack */
struct header header;
u32 i, sum;
struct iovec iov[2];
/* Only know how to do ethernet on *BSD */
if (mess->htype != ARPHRD_ETHER || mess->hlen != ETHER_ADDR_LEN)
{
syslog(LOG_WARNING, _("DHCP request for unsupported hardware type (%d) received on %s"),
mess->htype, ifr->ifr_name);
return;
}
ifr->ifr_addr.sa_family = AF_LINK;
if (ioctl(daemon->dhcpfd, SIOCGIFADDR, ifr) < 0)
return;
memcpy(header.ether.ether_shost, LLADDR((struct sockaddr_dl *)&ifr->ifr_addr), ETHER_ADDR_LEN);
header.ether.ether_type = htons(ETHERTYPE_IP);
if (ntohs(mess->flags) & 0x8000)
{
memset(header.ether.ether_dhost, 255, ETHER_ADDR_LEN);
header.ip.ip_dst.s_addr = INADDR_BROADCAST;
}
else
{
memcpy(header.ether.ether_dhost, mess->chaddr, ETHER_ADDR_LEN);
header.ip.ip_dst.s_addr = mess->yiaddr.s_addr;
}
header.ip.ip_p = IPPROTO_UDP;
header.ip.ip_src.s_addr = iface_addr.s_addr;
header.ip.ip_len = htons(sizeof(struct ip) +
sizeof(struct udphdr) +
len) ;
header.ip.ip_hl = sizeof(struct ip) / 4;
header.ip.ip_v = IPVERSION;
header.ip.ip_tos = 0;
header.ip.ip_id = htons(0);
header.ip.ip_off = htons(0x4000); /* don't fragment */
header.ip.ip_ttl = IPDEFTTL;
header.ip.ip_sum = 0;
for (sum = 0, i = 0; i < sizeof(struct ip) / 2; i++)
sum += ((u16 *)&header.ip)[i];
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
header.ip.ip_sum = (sum == 0xffff) ? sum : ~sum;
header.udp.uh_sport = htons(DHCP_SERVER_PORT);
header.udp.uh_dport = htons(DHCP_CLIENT_PORT);
if (len & 1)
((char *)mess)[len] = 0; /* for checksum, in case length is odd. */
header.udp.uh_sum = 0;
header.udp.uh_ulen = sum = htons(sizeof(struct udphdr) + len);
sum += htons(IPPROTO_UDP);
for (i = 0; i < 4; i++)
sum += ((u16 *)&header.ip.ip_src)[i];
for (i = 0; i < sizeof(struct udphdr)/2; i++)
sum += ((u16 *)&header.udp)[i];
for (i = 0; i < (len + 1) / 2; i++)
sum += ((u16 *)mess)[i];
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
header.udp.uh_sum = (sum == 0xffff) ? sum : ~sum;
ioctl(daemon->dhcp_raw_fd, BIOCSETIF, ifr);
iov[0].iov_base = &header;
iov[0].iov_len = sizeof(struct header);
iov[1].iov_base = mess;
iov[1].iov_len = len;
while (writev(daemon->dhcp_raw_fd, iov, 2) == -1 && retry_send());
}
int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), int (*ipv6_callback)())
{
char *ptr;
struct ifreq *ifr;
struct ifconf ifc;
int fd, errsav, ret = 0;
int lastlen = 0;
size_t len;
if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
return 0;
for (len = 0; ; len += 10*sizeof(struct ifreq))
{
if (!expand_buf(&ifconf, len))
goto err;
ifc.ifc_len = len;
ifc.ifc_buf = ifconf.iov_base;
if (ioctl(fd, SIOCGIFCONF, &ifc) == -1)
{
if (errno != EINVAL || lastlen != 0)
goto err;
}
else
{
if (ifc.ifc_len == lastlen)
break; /* got a big enough buffer now */
lastlen = ifc.ifc_len;
}
}
for (ptr = ifc.ifc_buf; ptr < ifc.ifc_buf + ifc.ifc_len; ptr += len )
{
/* subsequent entries may not be aligned, so copy into
an aligned buffer to avoid nasty complaints about
unaligned accesses. */
#ifdef HAVE_SOCKADDR_SA_LEN
len = ((struct ifreq *)ptr)->ifr_addr.sa_len + IF_NAMESIZE;
#else
len = sizeof(struct ifreq);
#endif
if (!expand_buf(&ifreq, len))
goto err;
ifr = ifreq.iov_base;
memcpy(ifr, ptr, len);
if (ifr->ifr_addr.sa_family == AF_INET && ipv4_callback)
{
struct in_addr addr, netmask, broadcast;
broadcast.s_addr = 0;
addr = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
if (ioctl(fd, SIOCGIFNETMASK, ifr) == -1)
continue;
netmask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
if (ioctl(fd, SIOCGIFBRDADDR, ifr) != -1)
broadcast = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
if (!((*ipv4_callback)(daemon, addr,
(int)if_nametoindex(ifr->ifr_name),
netmask, broadcast,
parm)))
goto err;
}
#ifdef HAVE_IPV6
else if (ifr->ifr_addr.sa_family == AF_INET6 && ipv6_callback)
{
struct in6_addr *addr = &((struct sockaddr_in6 *)&ifr->ifr_addr)->sin6_addr;
/* voodoo to clear interface field in address */
if (!(daemon->options & OPT_NOWILD) && IN6_IS_ADDR_LINKLOCAL(addr))
{
addr->s6_addr[2] = 0;
addr->s6_addr[3] = 0;
}
if (!((*ipv6_callback)(daemon, addr,
(int)((struct sockaddr_in6 *)&ifr->ifr_addr)->sin6_scope_id,
(int)if_nametoindex(ifr->ifr_name),
parm)))
goto err;
}
#endif
}
ret = 1;
err:
errsav = errno;
close(fd);
errno = errsav;
return ret;
}
#endif

View File

@@ -18,6 +18,7 @@ static int cache_inserted, cache_live_freed, insert_error;
static union bigname *big_free;
static int bignames_left, log_queries, cache_size, hash_size;
static int uid;
static char *addrbuff;
static void cache_free(struct crec *crecp);
static void cache_unlink(struct crec *crecp);
@@ -29,7 +30,11 @@ void cache_init(int size, int logq)
struct crec *crecp;
int i;
log_queries = logq;
if ((log_queries = logq))
addrbuff = safe_malloc(ADDRSTRLEN);
else
addrbuff = NULL;
cache_head = cache_tail = NULL;
dhcp_inuse = dhcp_spare = NULL;
new_chain = NULL;
@@ -59,12 +64,12 @@ void cache_init(int size, int logq)
hash_table[i] = NULL;
}
static struct crec **hash_bucket(unsigned char *name)
static struct crec **hash_bucket(char *name)
{
unsigned int c, val = 0;
/* don't use tolower and friends here - they may be messed up by LOCALE */
while((c = *name++))
while((c = (unsigned char) *name++))
if (c >= 'A' && c <= 'Z')
val += c + 'a' - 'A';
else
@@ -194,7 +199,7 @@ static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsign
}
}
else if ((crecp->flags & F_FORWARD) &&
((flags & crecp->flags & (F_IPV4 | F_IPV6)) || (crecp->flags & F_CNAME)) &&
((flags & crecp->flags & (F_IPV4 | F_IPV6)) || ((crecp->flags | flags) & F_CNAME)) &&
hostname_isequal(cache_get_name(crecp), name))
{
if (crecp->flags & (F_HOSTS | F_DHCP))
@@ -562,7 +567,7 @@ static void read_hostsfile(char *filename, int opts, char *buff, char *domain_su
if (!f)
{
syslog(LOG_ERR, "failed to load names from %s: %m", filename);
syslog(LOG_ERR, _("failed to load names from %s: %m"), filename);
return;
}
@@ -579,12 +584,12 @@ static void read_hostsfile(char *filename, int opts, char *buff, char *domain_su
continue;
#ifdef HAVE_IPV6
if (inet_pton(AF_INET, token, &addr) == 1)
if (inet_pton(AF_INET, token, &addr) > 0)
{
flags = F_HOSTS | F_IMMORTAL | F_FORWARD | F_REVERSE | F_IPV4;
addrlen = INADDRSZ;
}
else if (inet_pton(AF_INET6, token, &addr) == 1)
else if (inet_pton(AF_INET6, token, &addr) > 0)
{
flags = F_HOSTS | F_IMMORTAL | F_FORWARD | F_REVERSE | F_IPV6;
addrlen = IN6ADDRSZ;
@@ -597,7 +602,10 @@ static void read_hostsfile(char *filename, int opts, char *buff, char *domain_su
}
#endif
else
continue;
{
syslog(LOG_ERR, _("bad address at %s line %d"), filename, lineno);
continue;
}
while ((token = strtok(NULL, " \t\n\r")) && (*token != '#'))
{
@@ -622,13 +630,13 @@ static void read_hostsfile(char *filename, int opts, char *buff, char *domain_su
}
}
else
syslog(LOG_ERR, "bad name at %s line %d", filename, lineno);
syslog(LOG_ERR, _("bad name at %s line %d"), filename, lineno);
}
}
fclose(f);
syslog(LOG_INFO, "read %s - %d addresses", filename, count);
syslog(LOG_INFO, _("read %s - %d addresses"), filename, count);
}
void cache_reload(int opts, char *buff, char *domain_suffix, struct hostsfile *addn_hosts)
@@ -664,7 +672,7 @@ void cache_reload(int opts, char *buff, char *domain_suffix, struct hostsfile *a
if ((opts & OPT_NO_HOSTS) && !addn_hosts)
{
if (cache_size > 0)
syslog(LOG_INFO, "cleared cache");
syslog(LOG_INFO, _("cleared cache"));
return;
}
@@ -717,8 +725,8 @@ void cache_add_dhcp_entry(struct daemon *daemon, char *host_name,
{
strcpy(daemon->namebuff, inet_ntoa(crec->addr.addr.addr.addr4));
syslog(LOG_WARNING,
"not giving name %s to the DHCP lease of %s because "
"the name exists in %s with address %s",
_("not giving name %s to the DHCP lease of %s because "
"the name exists in %s with address %s"),
host_name, inet_ntoa(*host_address),
record_source(daemon->addn_hosts, crec->uid), daemon->namebuff);
}
@@ -759,17 +767,17 @@ void cache_add_dhcp_entry(struct daemon *daemon, char *host_name,
void dump_cache(struct daemon *daemon)
void dump_cache(struct daemon *daemon, time_t now)
{
syslog(LOG_INFO, "cache size %d, %d/%d cache insertions re-used unexpired cache entries.",
daemon->cachesize, cache_live_freed, cache_inserted);
syslog(LOG_INFO, _("time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache entries."),
(unsigned long)now, daemon->cachesize, cache_live_freed, cache_inserted);
if (daemon->options & (OPT_DEBUG | OPT_LOG))
if ((daemon->options & (OPT_DEBUG | OPT_LOG)) &&
(addrbuff || (addrbuff = malloc(ADDRSTRLEN))))
{
struct crec *cache ;
char addrbuff[ADDRSTRLEN];
int i;
syslog(LOG_DEBUG, "Host Address Flags Expires\n");
syslog(LOG_DEBUG, "Host Address Flags Expires");
for (i=0; i<hash_size; i++)
for (cache = hash_table[i]; cache; cache = cache->hash_next)
@@ -794,7 +802,7 @@ void dump_cache(struct daemon *daemon)
#endif
syslog(LOG_DEBUG,
#ifdef HAVE_BROKEN_RTC
"%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %ld\n",
"%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %lu",
#else
"%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %s",
#endif
@@ -810,7 +818,7 @@ void dump_cache(struct daemon *daemon)
cache->flags & F_NXDOMAIN ? "X" : " ",
cache->flags & F_HOSTS ? "H" : " ",
#ifdef HAVE_BROKEN_RTC
cache->flags & F_IMMORTAL ? 0: (unsigned long)cache->ttd
cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now)
#else
cache->flags & F_IMMORTAL ? "\n" : ctime(&(cache->ttd))
#endif
@@ -841,13 +849,10 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr,
char *source;
char *verb = "is";
char types[20];
char addrbuff[ADDRSTRLEN];
if (!log_queries)
return;
strcpy(types, " ");
if (flags & F_NEG)
{
if (flags & F_REVERSE)
@@ -875,6 +880,8 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr,
strcpy(addrbuff, "<MX>");
else if (flags & F_IPV6)
strcpy(addrbuff, "<SRV>");
else if (flags & F_NXDOMAIN)
strcpy(addrbuff, "<TXT>");
else
strcpy(addrbuff, "<CNAME>");
}
@@ -902,9 +909,9 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr,
else if (flags & F_QUERY)
{
unsigned int i;
static struct {
static const struct {
unsigned int type;
char *name;
const char * const name;
} typestr[] = {
{ 1, "A" },
{ 2, "NS" },
@@ -937,19 +944,22 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr,
if (type != 0)
{
sprintf(types, "[type=%d] ", type);
sprintf(types, "query[type=%d]", type);
for (i = 0; i < (sizeof(typestr)/sizeof(typestr[0])); i++)
if (typestr[i].type == type)
sprintf(types,"[%s] ", typestr[i].name);
sprintf(types,"query[%s]", typestr[i].name);
}
source = "query";
source = types;
verb = "from";
}
else
source = "cached";
if (strlen(name) == 0)
name = ".";
if ((flags & F_FORWARD) | (flags & F_NEG))
syslog(LOG_DEBUG, "%s %s%s%s %s", source, name, types, verb, addrbuff);
syslog(LOG_DEBUG, "%s %s %s %s", source, name, verb, addrbuff);
else if (flags & F_REVERSE)
syslog(LOG_DEBUG, "%s %s is %s", source, addrbuff, name);
}

View File

@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -10,19 +10,20 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#define VERSION "2.20"
#define VERSION "2.30"
#define FTABSIZ 150 /* max number of outstanding requests */
#define MAX_PROCS 20 /* max no children for TCP requests */
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
#define EDNS_PKTSZ 1280 /* default max EDNS.0 UDP packet from RFC2671 */
#define TIMEOUT 20 /* drop UDP queries after TIMEOUT seconds */
#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
#define LOGRATE 120 /* log table overflows every LOGRATE seconds */
#define CACHESIZ 150 /* default cache size */
#define MAXTOK 50 /* token in DHCP leases */
#define MAXLEASES 150 /* maximum number of DHCP leases */
#define PING_WAIT 3 /* wait for ping address-in-use test */
#define PING_CACHE_TIME 30 /* Ping test assumed to be valid this long. */
#define DHCP_PACKET_MAX 16384 /* hard limit on DHCP packet size */
#define SMALLDNAME 40 /* most domain names are smaller than this */
#define HOSTSFILE "/etc/hosts"
#define ETHERSFILE "/etc/ethers"
@@ -45,11 +46,13 @@
#define DEFLEASE 3600 /* default lease time, 1 hour */
#define CHUSER "nobody"
#define CHGRP "dip"
#define IP6INTERFACES "/proc/net/if_inet6"
#define UPTIME "/proc/uptime"
#define DHCP_SERVER_PORT 67
#define DHCP_CLIENT_PORT 68
/* DBUS interface specifics */
#define DNSMASQ_SERVICE "uk.org.thekelleys.dnsmasq"
#define DNSMASQ_PATH "/uk/org/thekelleys/dnsmasq"
/* Logfile stuff - change this to change the options and facility */
/* debug is true if the --no-daemon flag is given */
#ifdef LOG_PERROR
@@ -74,26 +77,6 @@
# define T_OPT 41
#endif
/* Decide if we're going to support IPv6 */
/* We assume that systems which don't have IPv6
headers don't have ntop and pton either */
#if defined(INET6_ADDRSTRLEN) && defined(IPV6_V6ONLY) && !defined(NO_IPV6)
# define HAVE_IPV6
# define ADDRSTRLEN INET6_ADDRSTRLEN
# if defined(SOL_IPV6)
# define IPV6_LEVEL SOL_IPV6
# else
# define IPV6_LEVEL IPPROTO_IPV6
# endif
#elif defined(INET_ADDRSTRLEN)
# undef HAVE_IPV6
# define ADDRSTRLEN INET_ADDRSTRLEN
#else
# undef HAVE_IPV6
# define ADDRSTRLEN 16 /* 4*3 + 3 dots + NULL */
#endif
/* Get linux C library versions. */
#if defined(__linux__) && !defined(__UCLIBC__) && !defined(__uClinux__)
# include <libio.h>
@@ -104,26 +87,25 @@
new system, you may want to edit these.
May replace this with Autoconf one day.
HAVE_LINUX_IPV6_PROC
define this to do IPv6 interface discovery using
proc/net/if_inet6 ala LINUX.
HAVE_LINUX_NETWORK
define this to do networking the Linux way. When it's defined, the code will
use IP_PKTINFO, Linux capabilities and the RTnetlink system. If it's not defined,
a few facilities will be lost, namely support for multiple addresses on an interface,
DNS query retransmission, and (on some systems) wildcard interface binding.
HAVE_BROKEN_RTC
define this on embeded systems which don't have an RTC
which keeps time over reboots. Causes dnsmasq to use uptime()
for timing, and keep relative time values in its leases file.
Also enables "Flash disk mode". Normally, dnsmasq tries very hard to
keep the on-disk leases file up-to-date: rewriting it after every change.
When HAVE_BROKEN_RTC is in effect, a different regime is used:
The leases file is written when dnsmasq terminates, when it receives
SIGALRM, when a brand new lease is allocated, or every n seconds,
where n is one third of the smallest time configured for leases
in a --dhcp-range or --dhcp-host option.
define this on embedded systems which don't have an RTC
which keeps time over reboots. Causes dnsmasq to use uptime
for timing, and keep lease lengths rather than expiry times
in its leases file. This also make dnsmasq "flash disk friendly".
Normally, dnsmasq tries very hard to keep the on-disk leases file
up-to-date: rewriting it after every renewal. When HAVE_BROKEN_RTC
is in effect, the lease file is only written when a new lease is
created, or an old one destroyed. (Because those are the only times
it changes.) This vastly reduces the number of file writes, and makes
it viable to keep the lease file on a flash filesystem.
NOTE: when enabling or disabling this, be sure to delete any old
leases file, otherwise dnsmasq may get very confused.
This configuration currently only works on Linux, but could be made to
work on other systems by teaching dnsmasq_time() in utils.c how to
read the system uptime.
HAVE_ISC_READER
define this to include the old ISC dhcpcd integration. Note that you cannot
@@ -152,15 +134,14 @@ HAVE_DEV_URANDOM
HAVE_SOCKADDR_SA_LEN
define this if struct sockaddr has sa_len field (*BSD)
HAVE_PSELECT
If your C library implements pselect, define this.
HAVE_BPF
If your OS implements Berkeley Packet filter, define this.
HAVE_DBUS
Define this if you want to link against libdbus, and have dnsmasq
define some methods to allow (re)configuration of the upstream DNS
servers via DBus.
NOTES:
For Linux you should define
HAVE_LINUX_IPV6_PROC
HAVE_LINUX_NETWORK
HAVE_GETOPT_LONG
HAVE_RANDOM
HAVE_DEV_RANDOM
@@ -172,9 +153,8 @@ NOTES:
For *BSD systems you should define
HAVE_SOCKADDR_SA_LEN
HAVE_RANDOM
HAVE_BPF
you should NOT define
HAVE_LINUX_IPV6_PROC
HAVE_LINUX_NETWORK
and you MAY define
HAVE_ARC4RANDOM - OpenBSD and FreeBSD and NetBSD version 2.0 or later
HAVE_DEV_URANDOM - OpenBSD and FreeBSD and NetBSD
@@ -185,9 +165,10 @@ NOTES:
*/
/* platform independent options. */
#undef HAVE_BROKEN_RTC
#define HAVE_ISC_READER
/* platform independent options- uncomment to enable */
/* #define HAVE_BROKEN_RTC */
/* #define HAVE_ISC_READER */
/* #define HAVE_DBUS */
#if defined(HAVE_BROKEN_RTC) && defined(HAVE_ISC_READER)
# error HAVE_ISC_READER is not compatible with HAVE_BROKEN_RTC
@@ -196,66 +177,58 @@ NOTES:
/* platform dependent options. */
/* Must preceed __linux__ since uClinux defines __linux__ too. */
#if defined(__uClinux__) || defined(__UCLIBC__)
#undef HAVE_LINUX_IPV6_PROC
#if defined(__uClinux__)
#define HAVE_LINUX_NETWORK
#define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#if defined(__uClinux__)
/* Never use fork() on uClinux. Note that this is subtly different from the
--keep-in-foreground option, since it also suppresses forking new
processes for TCP connections. It's intended for use on MMU-less kernels. */
# define NO_FORK
#endif
#define NO_FORK
/* libc5 - must precede __linux__ too */
/* Note to build a libc5 binary on a modern Debian system:
install the packages altgcc libc5 and libc5-altdev
then run "make CC=i486-linuxlibc1-gcc" */
/* Note that compling dnsmasq 2.x under libc5 and kernel 2.0.x
is probably doomed - no packet socket for starters. */
#elif defined(__linux__) && \
defined(_LINUX_C_LIB_VERSION_MAJOR) && \
(_LINUX_C_LIB_VERSION_MAJOR == 5 )
#undef HAVE_IPV6
#undef HAVE_LINUX_IPV6_PROC
#define HAVE_GETOPT_LONG
#elif defined(__UCLIBC__)
#define HAVE_LINUX_NETWORK
#if defined(__UCLIBC_HAS_GNU_GETOPT__) || \
((__UCLIBC_MAJOR__==0) && (__UCLIBC_MINOR__==9) && (__UCLIBC_SUBLEVEL__<21))
# define HAVE_GETOPT_LONG
#else
# undef HAVE_GETOPT_LONG
#endif
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
/* Fix various misfeatures of libc5 headers */
typedef unsigned long in_addr_t;
typedef size_t socklen_t;
#if !defined(__UCLIBC_HAS_MMU__)
# define NO_FORK
#endif
#if !defined(__UCLIBC_HAS_IPV6__)
# define NO_IPV6
#endif
/* This is for glibc 2.x */
#elif defined(__linux__)
#define HAVE_LINUX_IPV6_PROC
#define HAVE_LINUX_NETWORK
#define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#define HAVE_PSELECT
/* 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;
#if defined(HAVE_IPV6)
# define HAVE_BROKEN_SOCKADDR_IN6
#endif
#endif
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_LINUX_NETWORK
/* Later verions of FreeBSD have getopt_long() */
#if defined(optional_argument) && defined(required_argument)
# define HAVE_GETOPT_LONG
@@ -266,47 +239,47 @@ typedef unsigned long in_addr_t;
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
#elif defined(__APPLE__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_LINUX_NETWORK
#undef HAVE_GETOPT_LONG
#define HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
/* Define before sys/socket.h is included so we get socklen_t */
#define _BSD_SOCKLEN_T_
/* This is not defined in Mac OS X arpa/nameserv.h */
#define IN6ADDRSZ 16
#elif defined(__NetBSD__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_LINUX_NETWORK
#define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#define HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
/* env "LIBS=-lsocket -lnsl" make */
#elif defined(__sun) || defined(__sun__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#undef HAVE_DEV_URANDOM
#undef HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
#endif
/* Decide if we're going to support IPv6 */
/* We assume that systems which don't have IPv6
headers don't have ntop and pton either */
#if defined(INET6_ADDRSTRLEN) && defined(IPV6_V6ONLY) && !defined(NO_IPV6)
# define HAVE_IPV6
# define ADDRSTRLEN INET6_ADDRSTRLEN
# if defined(SOL_IPV6)
# define IPV6_LEVEL SOL_IPV6
# else
# define IPV6_LEVEL IPPROTO_IPV6
# endif
#elif defined(INET_ADDRSTRLEN)
# undef HAVE_IPV6
# define ADDRSTRLEN INET_ADDRSTRLEN
#else
# undef HAVE_IPV6
# define ADDRSTRLEN 16 /* 4*3 + 3 dots + NULL */
#endif

343
src/dbus.c Normal file
View File

@@ -0,0 +1,343 @@
/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 dated June, 1991.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "dnsmasq.h"
#ifdef HAVE_DBUS
#define DBUS_API_SUBJECT_TO_CHANGE
#include <dbus/dbus.h>
struct watch {
DBusWatch *watch;
struct watch *next;
};
static dbus_bool_t add_watch(DBusWatch *watch, void *data)
{
struct daemon *daemon = data;
struct watch *w;
for (w = daemon->watches; w; w = w->next)
if (w->watch == watch)
return TRUE;
if (!(w = malloc(sizeof(struct watch))))
return FALSE;
w->watch = watch;
w->next = daemon->watches;
daemon->watches = w;
dbus_watch_set_data (watch, (void *)daemon, NULL);
return TRUE;
}
static void remove_watch(DBusWatch *watch, void *data)
{
struct daemon *daemon = data;
struct watch **up, *w;
for (up = &(daemon->watches), w = daemon->watches; w; w = w->next)
if (w->watch == watch)
{
*up = w->next;
free(w);
}
else
up = &(w->next);
}
static void dbus_read_servers(struct daemon *daemon, DBusMessage *message)
{
struct server *serv, *tmp, **up;
DBusMessageIter iter;
union mysockaddr addr, source_addr;
char *domain;
dbus_message_iter_init(message, &iter);
/* mark everything from DBUS */
for (serv = daemon->servers; serv; serv = serv->next)
if (serv->flags & SERV_FROM_DBUS)
serv->flags |= SERV_MARK;
while (1)
{
int skip = 0;
if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_UINT32)
{
u32 a;
dbus_message_iter_get_basic(&iter, &a);
dbus_message_iter_next (&iter);
#ifdef HAVE_SOCKADDR_SA_LEN
source_addr.in.sin_len = addr.in.sin_len = sizeof(struct sockaddr_in);
#endif
addr.in.sin_addr.s_addr = ntohl(a);
source_addr.in.sin_family = addr.in.sin_family = AF_INET;
addr.in.sin_port = htons(NAMESERVER_PORT);
source_addr.in.sin_addr.s_addr = INADDR_ANY;
source_addr.in.sin_port = htons(daemon->query_port);
}
else if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_BYTE)
{
unsigned char p[sizeof(struct in6_addr)];
unsigned int i;
skip = 1;
for(i = 0; i < sizeof(struct in6_addr); i++)
{
dbus_message_iter_get_basic(&iter, &p[i]);
dbus_message_iter_next (&iter);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_BYTE)
break;
}
#ifndef HAVE_IPV6
syslog(LOG_WARNING, _("attempt to set an IPv6 server address via DBus - no IPv6 support"));
#else
if (i == sizeof(struct in6_addr)-1)
{
memcpy(&addr.in6.sin6_addr, p, sizeof(addr.in6));
#ifdef HAVE_SOCKADDR_SA_LEN
source_addr.in6.sin6_len = addr.in6.sin6_len = sizeof(addr.in6);
#endif
source_addr.in6.sin6_family = addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_port = htons(NAMESERVER_PORT);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = 0;
source_addr.in6.sin6_scope_id = addr.in6.sin6_scope_id = 0;
source_addr.in6.sin6_addr = in6addr_any;
source_addr.in6.sin6_port = htons(daemon->query_port);
skip = 0;
}
#endif
}
else
/* At the end */
break;
do {
if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING)
{
dbus_message_iter_get_basic(&iter, &domain);
dbus_message_iter_next (&iter);
}
else
domain = NULL;
if (!skip)
{
/* See if this is already there, and unmark */
for (serv = daemon->servers; serv; serv = serv->next)
if ((serv->flags & SERV_FROM_DBUS) &&
(serv->flags & SERV_MARK))
{
if (!(serv->flags & SERV_HAS_DOMAIN) && !domain)
{
serv->flags &= ~SERV_MARK;
break;
}
if ((serv->flags & SERV_HAS_DOMAIN) &&
domain &&
hostname_isequal(domain, serv->domain))
{
serv->flags &= ~SERV_MARK;
break;
}
}
if (!serv && (serv = malloc(sizeof (struct server))))
{
/* Not found, create a new one. */
if (domain)
serv->domain = malloc(strlen(domain)+1);
if (domain && !serv->domain)
{
free(serv);
serv = NULL;
}
else
{
serv->next = daemon->servers;
daemon->servers = serv;
serv->flags = SERV_FROM_DBUS;
serv->sfd = NULL;
if (domain)
{
strcpy(serv->domain, domain);
serv->flags |= SERV_HAS_DOMAIN;
}
}
}
if (serv)
{
if (source_addr.in.sin_family == AF_INET &&
addr.in.sin_addr.s_addr == 0 &&
serv->domain)
serv->flags |= SERV_NO_ADDR;
else
{
serv->flags &= ~SERV_NO_ADDR;
serv->addr = addr;
serv->source_addr = source_addr;
}
}
}
} while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING);
}
/* unlink and free anything still marked. */
for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp)
{
tmp = serv->next;
if (serv->flags & SERV_MARK)
{
*up = serv->next;
free(serv);
}
else
up = &serv->next;
}
}
DBusHandlerResult message_handler(DBusConnection *connection,
DBusMessage *message,
void *user_data)
{
char *method = (char *)dbus_message_get_member(message);
struct daemon *daemon = (struct daemon *)user_data;
if (strcmp(method, "GetVersion") == 0)
{
char *v = VERSION;
DBusMessage *reply = dbus_message_new_method_return(message);
dbus_message_append_args(reply, DBUS_TYPE_STRING, &v, DBUS_TYPE_INVALID);
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
}
else if (strcmp(method, "SetServers") == 0)
{
syslog(LOG_INFO, _("setting upstream servers from DBus"));
dbus_read_servers(daemon, message);
check_servers(daemon);
}
else if (strcmp(method, "ClearCache") == 0)
clear_cache_and_reload(daemon);
else
return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
return (DBUS_HANDLER_RESULT_HANDLED);
}
/* returns NULL or error message, may fail silently if dbus daemon not yet up. */
char *dbus_init(struct daemon *daemon)
{
DBusConnection *connection = NULL;
DBusObjectPathVTable dnsmasq_vtable = {NULL, &message_handler, NULL, NULL, NULL, NULL };
DBusError dbus_error;
DBusMessage *message;
dbus_error_init (&dbus_error);
if (!(connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error)))
return NULL;
dbus_connection_set_exit_on_disconnect(connection, FALSE);
dbus_connection_set_watch_functions(connection, add_watch, remove_watch,
NULL, (void *)daemon, NULL);
dbus_error_init (&dbus_error);
dbus_bus_request_name (connection, DNSMASQ_SERVICE, 0, &dbus_error);
if (dbus_error_is_set (&dbus_error))
return (char *)dbus_error.message;
if (!dbus_connection_register_object_path(connection, DNSMASQ_PATH,
&dnsmasq_vtable, daemon))
return _("could not register a DBus message handler");
daemon->dbus = connection;
if ((message = dbus_message_new_signal(DNSMASQ_PATH, DNSMASQ_SERVICE, "Up")))
dbus_connection_send(connection, message, NULL);
return NULL;
}
int set_dbus_listeners(struct daemon *daemon, int maxfd,
fd_set *rset, fd_set *wset, fd_set *eset)
{
struct watch *w;
for (w = daemon->watches; w; w = w->next)
if (dbus_watch_get_enabled(w->watch))
{
unsigned int flags = dbus_watch_get_flags(w->watch);
int fd = dbus_watch_get_fd(w->watch);
if (fd > maxfd)
maxfd = fd;
if (flags & DBUS_WATCH_READABLE)
FD_SET(fd, rset);
if (flags & DBUS_WATCH_WRITABLE)
FD_SET(fd, wset);
FD_SET(fd, eset);
}
return maxfd;
}
void check_dbus_listeners(struct daemon *daemon,
fd_set *rset, fd_set *wset, fd_set *eset)
{
DBusConnection *connection = (DBusConnection *)daemon->dbus;
struct watch *w;
for (w = daemon->watches; w; w = w->next)
if (dbus_watch_get_enabled(w->watch))
{
unsigned int flags = 0;
int fd = dbus_watch_get_fd(w->watch);
if (FD_ISSET(fd, rset))
flags |= DBUS_WATCH_READABLE;
if (FD_ISSET(fd, wset))
flags |= DBUS_WATCH_WRITABLE;
if (FD_ISSET(fd, eset))
flags |= DBUS_WATCH_ERROR;
if (flags != 0)
dbus_watch_handle(w->watch, flags);
}
if (connection)
{
dbus_connection_ref (connection);
while (dbus_connection_dispatch (connection) == DBUS_DISPATCH_DATA_REMAINS);
dbus_connection_unref (connection);
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -10,11 +10,35 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static int sigterm, sighup, sigusr1, sigalarm, num_kids, in_child;
static char *compile_opts =
#ifndef HAVE_IPV6
"no-"
#endif
"IPv6 "
#ifndef HAVE_GETOPT_LONG
"no-"
#endif
"GNU-getopt "
#ifdef HAVE_BROKEN_RTC
"no-RTC "
#endif
#ifndef HAVE_ISC_READER
"no-"
#endif
"ISC-leasefile "
#ifndef HAVE_DBUS
"no-"
#endif
"DBus "
#ifdef NO_GETTEXT
"no-"
#endif
"I18N ";
static pid_t pid;
static int pipewrite;
static int set_dns_listeners(struct daemon *daemon, fd_set *set, int maxfd);
static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now);
@@ -23,25 +47,21 @@ static void sig_handler(int sig);
int main (int argc, char **argv)
{
struct daemon *daemon;
int first_loop = 1;
int bind_fallback = 0;
time_t resolv_changed = 0;
int bad_capabilities = 0;
time_t now, last = 0;
struct irec *interfaces;
struct sigaction sigact;
sigset_t sigmask;
struct iname *if_tmp;
int flags, piperead, pipefd[2];
unsigned char sig;
sighup = 1; /* init cache the first time through */
sigusr1 = 0; /* but don't dump */
sigterm = 0; /* or die */
#ifdef HAVE_BROKEN_RTC
sigalarm = 1; /* need regular lease dumps */
#else
sigalarm = 0; /* or not */
#ifndef NO_GETTEXT
setlocale(LC_ALL, "");
bindtextdomain("dnsmasq", LOCALEDIR);
textdomain("dnsmasq");
#endif
num_kids = 0;
in_child = 0;
pid = 0;
sigact.sa_handler = sig_handler;
sigact.sa_flags = 0;
@@ -56,21 +76,13 @@ int main (int argc, char **argv)
sigact.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sigact, NULL);
/* now block all the signals, they stay that way except
during the call to pselect */
sigaddset(&sigact.sa_mask, SIGUSR1);
sigaddset(&sigact.sa_mask, SIGTERM);
sigaddset(&sigact.sa_mask, SIGHUP);
sigaddset(&sigact.sa_mask, SIGALRM);
sigaddset(&sigact.sa_mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigact.sa_mask, &sigmask);
daemon = read_opts(argc, argv);
daemon = read_opts(argc, argv, compile_opts);
if (daemon->edns_pktsz < PACKETSZ)
daemon->edns_pktsz = PACKETSZ;
daemon->packet = safe_malloc(daemon->edns_pktsz > DNSMASQ_PACKETSZ ?
daemon->edns_pktsz : DNSMASQ_PACKETSZ);
daemon->packet_buff_sz = daemon->edns_pktsz > DNSMASQ_PACKETSZ ?
daemon->edns_pktsz : DNSMASQ_PACKETSZ;
daemon->packet = safe_malloc(daemon->packet_buff_sz);
if (!daemon->lease_file)
{
@@ -79,70 +91,76 @@ int main (int argc, char **argv)
}
#ifndef HAVE_ISC_READER
else if (!daemon->dhcp)
die("ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h", NULL);
die(_("ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"), NULL);
#endif
if (!enumerate_interfaces(daemon, &interfaces, NULL, NULL))
die("failed to find list of interfaces: %s", NULL);
if (!(daemon->options & OPT_NOWILD) &&
!(daemon->listeners = create_wildcard_listeners(daemon->port)))
#ifdef HAVE_LINUX_NETWORK
netlink_init(daemon);
#elif !(defined(IP_RECVDSTADDR) && \
defined(IP_RECVIF) && \
defined(IP_SENDSRCADDR))
if (!(daemon->options & OPT_NOWILD))
{
bind_fallback = 1;
daemon->options |= OPT_NOWILD;
}
#endif
daemon->interfaces = NULL;
if (!enumerate_interfaces(daemon))
die(_("failed to find list of interfaces: %s"), NULL);
if (daemon->options & OPT_NOWILD)
{
daemon->listeners = create_bound_listeners(interfaces, daemon->port);
daemon->listeners = create_bound_listeners(daemon);
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
if (if_tmp->name && !if_tmp->used)
die("unknown interface %s", if_tmp->name);
die(_("unknown interface %s"), if_tmp->name);
for (if_tmp = daemon->if_addrs; if_tmp; if_tmp = if_tmp->next)
if (!if_tmp->used)
{
char *addrbuff = daemon->namebuff;
#ifdef HAVE_IPV6
if (if_tmp->addr.sa.sa_family == AF_INET)
inet_ntop(AF_INET, &if_tmp->addr.in.sin_addr,
addrbuff, ADDRSTRLEN);
else
inet_ntop(AF_INET6, &if_tmp->addr.in6.sin6_addr,
addrbuff, ADDRSTRLEN);
#else
strcpy(addrbuff, inet_ntoa(if_tmp->addr.in.sin_addr));
#endif
die("no interface with address %s", addrbuff);
prettyprint_addr(&if_tmp->addr, daemon->namebuff);
die(_("no interface with address %s"), daemon->namebuff);
}
}
else if (!(daemon->listeners = create_wildcard_listeners(daemon->port)))
die(_("failed to create listening socket: %s"), NULL);
forward_init(1);
cache_init(daemon->cachesize, daemon->options & OPT_LOG);
#ifdef HAVE_BROKEN_RTC
if ((daemon->uptime_fd = open(UPTIME, O_RDONLY)) == -1)
die("cannot open " UPTIME ":%s", NULL);
#endif
now = dnsmasq_time(daemon->uptime_fd);
now = dnsmasq_time();
if (daemon->dhcp)
{
#if !defined(IP_PKTINFO) && !defined(IP_RECVIF)
#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);
die(_("must set exactly one interface on broken systems without IP_RECVIF"), NULL);
#endif
dhcp_init(daemon);
lease_init(daemon, now);
}
if (daemon->options & OPT_DBUS)
#ifdef HAVE_DBUS
{
char *err;
daemon->dbus = NULL;
daemon->watches = NULL;
if ((err = dbus_init(daemon)))
die(_("DBus error: %s"), err);
}
#else
die(_("DBus not available: set HAVE_DBUS in src/config.h"), NULL);
#endif
/* If query_port is set then create a socket now, before dumping root
for use to access nameservers without more specific source addresses.
This allows query_port to be a low port */
@@ -160,7 +178,8 @@ int main (int argc, char **argv)
addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = in6addr_any;
addr.in6.sin6_port = htons(daemon->query_port);
addr.in6.sin6_flowinfo = htonl(0);
addr.in6.sin6_flowinfo = 0;
addr.in6.sin6_scope_id = 0;
#ifdef HAVE_SOCKADDR_SA_LEN
addr.in6.sin6_len = sizeof(struct sockaddr_in6);
#endif
@@ -168,19 +187,61 @@ int main (int argc, char **argv)
#endif
}
setbuf(stdout, NULL);
if (!(daemon->options & OPT_DEBUG))
/* Use a pipe to carry signals back to the event loop in a race-free manner */
if (pipe(pipefd) == -1 ||
(flags = fcntl(pipefd[0], F_GETFL)) == -1 ||
fcntl(pipefd[0], F_SETFL, flags | O_NONBLOCK) == -1 ||
(flags = fcntl(pipefd[1], F_GETFL)) == -1 ||
fcntl(pipefd[1], F_SETFL, flags | O_NONBLOCK) == -1)
die(_("cannot create pipe: %s"), NULL);
piperead = pipefd[0];
pipewrite = pipefd[1];
/* prime the pipe to load stuff first time. */
sig = SIGHUP;
write(pipewrite, &sig, 1);
if (!(daemon->options & OPT_DEBUG))
{
FILE *pidfile;
struct serverfd *serverfdp;
struct listener *listener;
struct passwd *ent_pw;
int i;
struct passwd *ent_pw = daemon->username ? getpwnam(daemon->username) : NULL;
fd_set test_set;
int maxfd, i;
#ifdef HAVE_LINUX_NETWORK
cap_user_header_t hdr = NULL;
cap_user_data_t data = NULL;
/* On linux, we keep CAP_NETADMIN (for ARP-injection) and
CAP_NET_RAW (for icmp) if we're doing dhcp */
if (ent_pw)
{
hdr = safe_malloc(sizeof(*hdr));
data = safe_malloc(sizeof(*data));
hdr->version = _LINUX_CAPABILITY_VERSION;
hdr->pid = 0; /* this process */
data->effective = data->permitted = data->inheritable =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) |
(1 << CAP_SETGID) | (1 << CAP_SETUID);
/* Tell kernel to not clear capabilities when dropping root */
if (capset(hdr, data) == -1 || prctl(PR_SET_KEEPCAPS, 1) == -1)
{
bad_capabilities = errno;
ent_pw = NULL;
}
}
#endif
FD_ZERO(&test_set);
maxfd = set_dns_listeners(daemon, &test_set, -1);
#ifdef HAVE_DBUS
maxfd = set_dbus_listeners(daemon, maxfd, &test_set, &test_set, &test_set);
#endif
/* The following code "daemonizes" the process.
See Stevens section 12.4 */
#ifndef NO_FORK
if (!(daemon->options & OPT_NO_FORK))
{
@@ -208,38 +269,35 @@ int main (int argc, char **argv)
for (i=0; i<64; i++)
{
for (listener = daemon->listeners; listener; listener = listener->next)
if (listener->fd == i || listener->tcpfd == i)
break;
if (listener)
if (i == piperead || i == pipewrite)
continue;
#ifdef HAVE_BROKEN_RTC
if (i == daemon->uptime_fd)
#ifdef HAVE_LINUX_NETWORK
if (i == daemon->netlinkfd)
continue;
#endif
if (daemon->dhcp &&
(i == daemon->lease_fd ||
i == daemon->dhcpfd ||
i == daemon->dhcp_raw_fd ||
i == daemon->dhcp_icmp_fd))
continue;
for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
if (serverfdp->fd == i)
break;
if (serverfdp)
if (daemon->dhcp &&
(i == fileno(daemon->lease_stream) ||
#ifndef HAVE_LINUX_NETWORK
i == daemon->dhcp_raw_fd ||
i == daemon->dhcp_icmp_fd ||
#endif
i == daemon->dhcpfd))
continue;
if (i <= maxfd && FD_ISSET(i, &test_set))
continue;
close(i);
}
/* Change uid and gid for security */
if (daemon->username && (ent_pw = getpwnam(daemon->username)))
if (ent_pw)
{
gid_t dummy;
struct group *gp;
/* remove all supplimentary groups */
setgroups(0, &dummy);
/* change group for /etc/ppp/resolv.conf
@@ -249,136 +307,135 @@ int main (int argc, char **argv)
setgid(gp->gr_gid);
/* finally drop root */
setuid(ent_pw->pw_uid);
#ifdef HAVE_LINUX_NETWORK
data->effective = data->permitted =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
data->inheritable = 0;
/* lose the setuid and setgid capbilities */
capset(hdr, data);
#endif
}
}
#ifdef HAVE_LINUX_NETWORK
else
prctl(PR_SET_DUMPABLE, 1);
#endif
openlog("dnsmasq",
DNSMASQ_LOG_OPT(daemon->options & OPT_DEBUG),
DNSMASQ_LOG_FAC(daemon->options & OPT_DEBUG));
if (daemon->cachesize != 0)
syslog(LOG_INFO, "started, version %s cachesize %d", VERSION, daemon->cachesize);
syslog(LOG_INFO, _("started, version %s cachesize %d"), VERSION, daemon->cachesize);
else
syslog(LOG_INFO, "started, version %s cache disabled", VERSION);
syslog(LOG_INFO, _("started, version %s cache disabled"), VERSION);
syslog(LOG_INFO, _("compile time options: %s"), compile_opts);
#ifdef HAVE_DBUS
if (daemon->options & OPT_DBUS)
{
if (daemon->dbus)
syslog(LOG_INFO, _("DBus support enabled: connected to system bus"));
else
syslog(LOG_INFO, _("DBus support enabled: bus connection pending"));
}
#endif
if (bind_fallback)
syslog(LOG_WARNING, "setting --bind-interfaces option because of OS limitations");
syslog(LOG_WARNING, _("setting --bind-interfaces option because of OS limitations"));
if (!(daemon->options & OPT_NOWILD))
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
if (if_tmp->name && !if_tmp->used)
syslog(LOG_WARNING, "warning: interface %s does not currently exist", if_tmp->name);
syslog(LOG_WARNING, _("warning: interface %s does not currently exist"), if_tmp->name);
if (daemon->dhcp)
{
struct dhcp_context *dhcp_tmp;
for (dhcp_tmp = daemon->dhcp; dhcp_tmp; dhcp_tmp = dhcp_tmp->next)
{
char *time = daemon->dhcp_buff2;
prettyprint_time(daemon->dhcp_buff2, dhcp_tmp->lease_time);
strcpy(daemon->dhcp_buff, inet_ntoa(dhcp_tmp->start));
if (dhcp_tmp->lease_time == 0)
sprintf(time, "infinite");
else
{
unsigned int x, p = 0, t = (unsigned int)dhcp_tmp->lease_time;
if ((x = t/3600))
p += sprintf(&time[p], "%dh", x);
if ((x = (t/60)%60))
p += sprintf(&time[p], "%dm", x);
if ((x = t%60))
p += sprintf(&time[p], "%ds", x);
}
syslog(LOG_INFO,
dhcp_tmp->static_only ?
"DHCP, static leases only on %.0s%s, lease time %s" :
"DHCP, IP range %s -- %s, lease time %s",
daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), time);
(dhcp_tmp->flags & CONTEXT_STATIC) ?
_("DHCP, static leases only on %.0s%s, lease time %s") :
_("DHCP, IP range %s -- %s, lease time %s"),
daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), daemon->dhcp_buff2);
}
#ifdef HAVE_BROKEN_RTC
syslog(LOG_INFO, "DHCP, %s will be written every %ds", daemon->lease_file, daemon->min_leasetime/3);
#endif
}
if (!(daemon->options & OPT_DEBUG) && (getuid() == 0 || geteuid() == 0))
syslog(LOG_WARNING, "running as root");
check_servers(daemon, interfaces);
while (sigterm == 0)
{
fd_set rset;
if (sighup)
if (bad_capabilities)
{
cache_reload(daemon->options, daemon->namebuff, daemon->domain_suffix, daemon->addn_hosts);
if (daemon->dhcp)
{
if (daemon->options & OPT_ETHERS)
dhcp_read_ethers(daemon);
dhcp_update_configs(daemon->dhcp_conf);
lease_update_from_configs(daemon->dhcp_conf, daemon->domain_suffix);
lease_update_file(0, now);
lease_update_dns(daemon);
}
if (daemon->resolv_files && (daemon->options & OPT_NO_POLL))
{
reload_servers(daemon->resolv_files->name, daemon);
check_servers(daemon, interfaces);
}
sighup = 0;
}
if (sigusr1)
{
dump_cache(daemon);
sigusr1 = 0;
}
if (sigalarm)
{
if (daemon->dhcp)
{
lease_update_file(1, now);
#ifdef HAVE_BROKEN_RTC
alarm(daemon->min_leasetime/3);
#endif
}
sigalarm = 0;
errno = bad_capabilities;
syslog(LOG_WARNING, _("warning: setting capabilities failed: %m"));
}
syslog(LOG_WARNING, _("running as root"));
}
check_servers(daemon);
pid = getpid();
while (1)
{
int maxfd;
struct timeval t, *tp = NULL;
fd_set rset, wset, eset;
t.tv_sec = 0; /* no warning */
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_ZERO(&eset);
if (!first_loop)
maxfd = set_dns_listeners(daemon, &rset, -1);
#ifdef HAVE_DBUS
/* Whilst polling for the dbus, wake every quarter second */
if ((daemon->options & OPT_DBUS) && !daemon->dbus)
{
int maxfd = set_dns_listeners(daemon, &rset, 0);
if (daemon->dhcp)
{
FD_SET(daemon->dhcpfd, &rset);
if (daemon->dhcpfd > maxfd)
maxfd = daemon->dhcpfd;
}
#ifdef HAVE_PSELECT
if (pselect(maxfd+1, &rset, NULL, NULL, NULL, &sigmask) < 0)
FD_ZERO(&rset); /* rset otherwise undefined after error */
#else
{
sigset_t save_mask;
sigprocmask(SIG_SETMASK, &sigmask, &save_mask);
if (select(maxfd+1, &rset, NULL, NULL, NULL) < 0)
FD_ZERO(&rset); /* rset otherwise undefined after error */
sigprocmask(SIG_SETMASK, &save_mask, NULL);
}
#endif
tp = &t;
tp->tv_sec = 0;
tp->tv_usec = 250000;
}
first_loop = 0;
now = dnsmasq_time(daemon->uptime_fd);
maxfd = set_dbus_listeners(daemon, maxfd, &rset, &wset, &eset);
#endif
if (daemon->dhcp)
{
FD_SET(daemon->dhcpfd, &rset);
if (daemon->dhcpfd > maxfd)
maxfd = daemon->dhcpfd;
}
#ifdef HAVE_LINUX_NETWORK
FD_SET(daemon->netlinkfd, &rset);
if (daemon->netlinkfd > maxfd)
maxfd = daemon->netlinkfd;
#endif
FD_SET(piperead, &rset);
if (piperead > maxfd)
maxfd = piperead;
if (select(maxfd+1, &rset, &wset, &eset, tp) < 0)
{
/* otherwise undefined after error */
FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset);
}
now = dnsmasq_time();
/* Check for changes to resolv files once per second max. */
if (last == 0 || difftime(now, last) > 1.0)
/* Don't go silent for long periods if the clock goes backwards. */
if (last == 0 || difftime(now, last) > 1.0 || difftime(now, last) < 1.0)
{
last = now;
@@ -400,71 +457,132 @@ int main (int argc, char **argv)
if (stat(res->name, &statbuf) == -1)
{
if (!res->logged)
syslog(LOG_WARNING, "failed to access %s: %m", res->name);
syslog(LOG_WARNING, _("failed to access %s: %m"), res->name);
res->logged = 1;
}
else
{
res->logged = 0;
if (difftime(statbuf.st_mtime, last_change) > 0.0)
if (statbuf.st_mtime != res->mtime)
{
last_change = statbuf.st_mtime;
latest = res;
res->mtime = statbuf.st_mtime;
if (difftime(res->mtime, last_change) > 0.0)
{
last_change = res->mtime;
latest = res;
}
}
}
res = res->next;
}
if (latest && difftime(last_change, resolv_changed) > 0.0)
if (latest)
{
resolv_changed = last_change;
reload_servers(latest->name, daemon);
check_servers(daemon, interfaces);
check_servers(daemon);
}
}
}
if (FD_ISSET(piperead, &rset))
{
if (read(piperead, &sig, 1) == 1)
switch (sig)
{
case SIGHUP:
clear_cache_and_reload(daemon);
if (daemon->resolv_files && (daemon->options & OPT_NO_POLL))
{
reload_servers(daemon->resolv_files->name, daemon);
check_servers(daemon);
}
break;
case SIGUSR1:
dump_cache(daemon, now);
break;
case SIGALRM:
if (daemon->dhcp)
lease_update_file(daemon);
break;
case SIGTERM:
syslog(LOG_INFO, _("exiting on receipt of SIGTERM"));
if (daemon->dhcp)
fclose(daemon->lease_stream);
exit(0);
case SIGCHLD:
/* See Stevens 5.10 */
while (waitpid(-1, NULL, WNOHANG) > 0)
daemon->num_kids--;
break;
}
}
#ifdef HAVE_LINUX_NETWORK
if (FD_ISSET(daemon->netlinkfd, &rset))
netlink_multicast(daemon);
#endif
#ifdef HAVE_DBUS
/* if we didn't create a DBus connection, retry now. */
if ((daemon->options & OPT_DBUS) && !daemon->dbus)
{
char *err;
if ((err = dbus_init(daemon)))
syslog(LOG_WARNING, _("DBus error: %s"), err);
if (daemon->dbus)
syslog(LOG_INFO, _("connected to system DBus"));
}
check_dbus_listeners(daemon, &rset, &wset, &eset);
#endif
check_dns_listeners(daemon, &rset, now);
if (daemon->dhcp && FD_ISSET(daemon->dhcpfd, &rset))
dhcp_packet(daemon, now);
}
syslog(LOG_INFO, "exiting on receipt of SIGTERM");
if (daemon->dhcp)
{
#ifdef HAVE_BROKEN_RTC
lease_update_file(1, now);
#endif
close(daemon->lease_fd);
}
return 0;
}
static void sig_handler(int sig)
{
if (sig == SIGTERM)
sigterm = 1;
else if (sig == SIGHUP)
sighup = 1;
else if (sig == SIGUSR1)
sigusr1 = 1;
else if (sig == SIGALRM)
if (pid == 0)
{
/* ignore anything other than TERM during startup */
if (sig == SIGTERM)
exit(0);
}
else if (pid == getpid())
{
/* master process */
unsigned char sigchr = sig;
int errsave = errno;
write(pipewrite, &sigchr, 1);
errno = errsave;
}
else
{
/* alarm is used to kill children after a fixed time. */
if (in_child)
if (sig == SIGALRM)
exit(0);
else
sigalarm = 1;
}
else if (sig == SIGCHLD)
}
void clear_cache_and_reload(struct daemon *daemon)
{
cache_reload(daemon->options, daemon->namebuff, daemon->domain_suffix, daemon->addn_hosts);
if (daemon->dhcp)
{
/* See Stevens 5.10 */
while (waitpid(-1, NULL, WNOHANG) > 0)
num_kids--;
if (daemon->options & OPT_ETHERS)
dhcp_read_ethers(daemon);
dhcp_update_configs(daemon->dhcp_conf);
lease_update_from_configs(daemon);
lease_update_file(daemon);
lease_update_dns(daemon);
}
}
@@ -510,50 +628,55 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
if (FD_ISSET(listener->tcpfd, set))
{
int confd;
struct in_addr netmask, dst_addr_4;
while((confd = accept(listener->tcpfd, NULL, NULL)) == -1 && errno == EINTR);
if (confd != -1)
{
union mysockaddr tcp_addr;
socklen_t tcp_len = sizeof(union mysockaddr);
/* Check for allowed interfaces when binding the wildcard address:
we do this by looking for an interface with the same address as
the local address of the TCP connection, then looking to see if that's
an allowed interface. As a side effect, we get the netmask of the
interface too, for localisation. */
if ((num_kids >= MAX_PROCS) ||
(!(daemon->options & OPT_NOWILD) &&
(getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1 ||
!enumerate_interfaces(daemon, NULL, &tcp_addr, &netmask))))
struct irec *iface = NULL;
if (daemon->options & OPT_NOWILD)
iface = listener->iface;
else
{
union mysockaddr tcp_addr;
socklen_t tcp_len = sizeof(union mysockaddr);
/* Check for allowed interfaces when binding the wildcard address:
we do this by looking for an interface with the same address as
the local address of the TCP connection, then looking to see if that's
an allowed interface. As a side effect, we get the netmask of the
interface too, for localisation. */
/* interface may be new since startup */
if (enumerate_interfaces(daemon) &&
getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) != -1)
for (iface = daemon->interfaces; iface; iface = iface->next)
if (sockaddr_isequal(&iface->addr, &tcp_addr))
break;
}
if ((daemon->num_kids >= MAX_PROCS) || !iface)
close(confd);
#ifndef NO_FORK
else if (!(daemon->options & OPT_DEBUG) && fork())
{
num_kids++;
daemon->num_kids++;
close(confd);
}
#endif
else
{
char *buff;
unsigned char *buff;
struct server *s;
int flags;
struct in_addr dst_addr_4;
dst_addr_4.s_addr = 0;
/* Arrange for SIGALARM after CHILD_LIFETIME seconds to
terminate the process. */
if (!(daemon->options & OPT_DEBUG))
{
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGALRM);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
alarm(CHILD_LIFETIME);
in_child = 1;
}
alarm(CHILD_LIFETIME);
/* start with no upstream connections. */
for (s = daemon->servers; s; s = s->next)
@@ -566,20 +689,9 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
fcntl(confd, F_SETFL, flags & ~O_NONBLOCK);
if (listener->family == AF_INET)
{
if (daemon->options & OPT_NOWILD)
{
netmask = listener->iface->netmask;
dst_addr_4 = listener->iface->addr.in.sin_addr;
}
else
/* netmask already set by enumerate_interfaces */
dst_addr_4 = tcp_addr.in.sin_addr;
}
else
dst_addr_4.s_addr = 0;
dst_addr_4 = iface->addr.in.sin_addr;
buff = tcp_request(daemon, confd, now, dst_addr_4, netmask);
buff = tcp_request(daemon, confd, now, dst_addr_4, iface->netmask);
if (!(daemon->options & OPT_DEBUG))
exit(0);
@@ -596,21 +708,35 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
}
}
int make_icmp_sock(void)
{
int fd, flags;
int zeroopt = 0;
if ((fd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP)) != -1)
{
if ((flags = fcntl(fd, F_GETFL, 0)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
setsockopt(fd, SOL_SOCKET, SO_DONTROUTE, &zeroopt, sizeof(zeroopt)) == -1)
{
close(fd);
fd = -1;
}
}
return fd;
}
int icmp_ping(struct daemon *daemon, struct in_addr addr)
{
/* Try and get an ICMP echo from a machine.
Note that we can't create the raw socket each time
we do this, since that needs root. Therefore the socket has to hang
around all the time. Since most of the time we won't read the
socket, it will accumulate buffers full of ICMP messages,
wasting memory. To avoid that we set the receive buffer
length to zero except when we're actively pinging. */
/* Try and get an ICMP echo from a machine. */
/* Note that whilst in the three second wait, we check for
(and service) events on the DNS sockets, (so doing that
better not use any resources our caller has in use...)
but we remain deaf to signals or further DHCP packets. */
int fd;
struct sockaddr_in saddr;
struct {
struct ip ip;
@@ -618,9 +744,18 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
} packet;
unsigned short id = rand16();
unsigned int i, j;
int opt = 2000, gotreply = 0;
int gotreply = 0;
time_t start, now;
#ifdef HAVE_LINUX_NETWORK
if ((fd = make_icmp_sock()) == -1)
return 0;
#else
int opt = 2000;
fd = daemon->dhcp_icmp_fd;
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
#endif
saddr.sin_family = AF_INET;
saddr.sin_port = 0;
saddr.sin_addr = addr;
@@ -637,34 +772,34 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
j = (j & 0xffff) + (j >> 16);
packet.icmp.icmp_cksum = (j == 0xffff) ? j : ~j;
setsockopt(daemon->dhcp_icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
while (sendto(daemon->dhcp_icmp_fd, (char *)&packet.icmp, sizeof(struct icmp), 0,
while (sendto(fd, (char *)&packet.icmp, sizeof(struct icmp), 0,
(struct sockaddr *)&saddr, sizeof(saddr)) == -1 &&
retry_send());
for (now = start = dnsmasq_time(daemon->uptime_fd); difftime(now, start) < 3.0;)
for (now = start = dnsmasq_time();
difftime(now, start) < (float)PING_WAIT;)
{
struct timeval tv;
fd_set rset;
struct sockaddr_in faddr;
int maxfd, len = sizeof(faddr);
int maxfd;
socklen_t len = sizeof(faddr);
tv.tv_usec = 250000;
tv.tv_sec = 0;
FD_ZERO(&rset);
FD_SET(daemon->dhcp_icmp_fd, &rset);
maxfd = set_dns_listeners(daemon, &rset, daemon->dhcp_icmp_fd);
FD_SET(fd, &rset);
maxfd = set_dns_listeners(daemon, &rset, fd);
if (select(maxfd+1, &rset, NULL, NULL, &tv) < 0)
FD_ZERO(&rset);
now = dnsmasq_time(daemon->uptime_fd);
now = dnsmasq_time();
check_dns_listeners(daemon, &rset, now);
if (FD_ISSET(daemon->dhcp_icmp_fd, &rset) &&
recvfrom(daemon->dhcp_icmp_fd, &packet, sizeof(packet), 0,
if (FD_ISSET(fd, &rset) &&
recvfrom(fd, &packet, sizeof(packet), 0,
(struct sockaddr *)&faddr, &len) == sizeof(packet) &&
saddr.sin_addr.s_addr == faddr.sin_addr.s_addr &&
packet.icmp.icmp_type == ICMP_ECHOREPLY &&
@@ -676,8 +811,14 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
}
}
#ifdef HAVE_LINUX_NETWORK
close(fd);
#else
opt = 1;
setsockopt(daemon->dhcp_icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
#endif
return gotreply;
}

View File

@@ -10,17 +10,8 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#define COPYRIGHT "Copyright (C) 2000-2006 Simon Kelley"
#define COPYRIGHT "Copyright (C) 2000-2005 Simon Kelley"
#ifdef __linux__
/* for pselect.... */
# define _XOPEN_SOURCE 600
/* but then DNS headers don't compile without.... */
#define _BSD_SOURCE
#endif
/* get these before config.h for IPv6 stuff... */
#include <sys/types.h>
#include <netinet/in.h>
@@ -37,16 +28,22 @@
#include <getopt.h>
#include "config.h"
#define gettext_noop(S) (S)
#ifdef NO_GETTEXT
# define _(S) (S)
#else
# include <libintl.h>
# include <locale.h>
# define _(S) gettext(S)
#endif
#include <arpa/inet.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/wait.h>
#if defined(__sun) || defined(__sun__)
# include <sys/sockio.h>
#endif
#include <sys/time.h>
#include <limits.h>
#include <net/if.h>
@@ -71,16 +68,24 @@
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#ifdef HAVE_BPF
# include <net/bpf.h>
# include <net/if_dl.h>
#else
# include <netpacket/packet.h>
#endif
#include <sys/uio.h>
#ifndef HAVE_LINUX_NETWORK
# include <net/if_dl.h>
#endif
/* Size: we check after adding each record, so there must be
memory for the largest packet, and the largest record */
#ifdef HAVE_LINUX_NETWORK
#include <linux/capability.h>
/* There doesn't seem to be a universally-available
userpace header for this. */
extern int capset(cap_user_header_t header, cap_user_data_t data);
#include <sys/prctl.h>
#endif
/* Min buffer size: we check after adding each record, so there must be
memory for the largest packet, and the largest record so the
min for DNS is PACKETSZ+MAXDNAME+RRFIXEDSZ which is < 1000.
This might be increased is EDNS packet size if greater than the minimum.
*/
#define DNSMASQ_PACKETSZ PACKETSZ+MAXDNAME+RRFIXEDSZ
#define OPT_BOGUSPRIV 1
@@ -102,6 +107,9 @@
#define OPT_NO_FORK 65536
#define OPT_AUTHORITATIVE 131072
#define OPT_LOCALISE 262144
#define OPT_DBUS 524288
#define OPT_BOOTP_DYNAMIC 1048576
#define OPT_NO_PING 2097152
struct all_addr {
union {
@@ -123,16 +131,17 @@ struct doctor {
struct doctor *next;
};
struct mx_record {
char *mxname, *mxtarget;
int preference;
struct mx_record *next;
struct mx_srv_record {
char *name, *target;
int issrv, srvport, priority, weight;
unsigned int offset;
struct mx_srv_record *next;
};
struct srv_record {
char *srvname, *srvtarget;
int srvport, priority, weight;
struct srv_record *next;
struct txt_record {
char *name, *txt;
unsigned short class, len;
struct txt_record *next;
};
union bigname {
@@ -177,7 +186,7 @@ struct crec {
#define F_NOERR 32768
/* struct sockaddr is not large enough to hold any address,
and specifically not big enough to hold and IPv6 address.
and specifically not big enough to hold an IPv6 address.
Blech. Roll our own. */
union mysockaddr {
struct sockaddr sa;
@@ -199,14 +208,18 @@ union mysockaddr {
#endif
};
#define SERV_FROM_RESOLV 1 /* 1 for servers from resolv, 0 for command line. */
#define SERV_NO_ADDR 2 /* no server, this domain is local only */
#define SERV_LITERAL_ADDRESS 4 /* addr is the answer, not the server */
#define SERV_HAS_SOURCE 8 /* source address specified */
#define SERV_HAS_DOMAIN 16 /* server for one domain only */
#define SERV_FOR_NODOTS 32 /* server for names with no domain part only */
#define SERV_FROM_RESOLV 1 /* 1 for servers from resolv, 0 for command line. */
#define SERV_NO_ADDR 2 /* no server, this domain is local only */
#define SERV_LITERAL_ADDRESS 4 /* addr is the answer, not the server */
#define SERV_HAS_SOURCE 8 /* source address specified */
#define SERV_HAS_DOMAIN 16 /* server for one domain only */
#define SERV_FOR_NODOTS 32 /* server for names with no domain part only */
#define SERV_WARNED_RECURSIVE 64 /* avoid warning spam */
#define SERV_FROM_DBUS 128 /* 1 if source is DBus */
#define SERV_MARK 256 /* for mark-and-delete */
#define SERV_TYPE (SERV_HAS_DOMAIN | SERV_FOR_NODOTS)
struct serverfd {
int fd;
union mysockaddr source_addr;
@@ -245,8 +258,8 @@ struct iname {
/* resolv-file parms from command-line */
struct resolvc {
struct resolvc *next;
int is_default;
int logged;
int is_default, logged;
time_t mtime;
char *name;
};
@@ -254,7 +267,7 @@ struct resolvc {
struct hostsfile {
struct hostsfile *next;
char *fname;
int index; /* matches to cache entries fro logging */
int index; /* matches to cache entries for logging */
};
struct frec {
@@ -263,18 +276,25 @@ struct frec {
struct server *sentto;
unsigned int iface;
unsigned short orig_id, new_id;
int fd;
int fd, forwardall;
unsigned int crc;
time_t time;
struct frec *next;
};
#define DHCP_CHADDR_MAX 16
struct dhcp_lease {
int clid_len; /* length of client identifier */
unsigned char *clid; /* clientid */
char *hostname, *fqdn; /* name from client-hostname option or config */
int auth_name; /* hostname came from config, not from client */
time_t expires; /* lease expiry */
unsigned char hwaddr[ETHER_ADDR_LEN];
#ifdef HAVE_BROKEN_RTC
unsigned int length;
#endif
int hwaddr_len, hwaddr_type;
unsigned char hwaddr[DHCP_CHADDR_MAX];
struct in_addr addr;
struct dhcp_lease *next;
};
@@ -292,30 +312,34 @@ struct dhcp_config {
unsigned int flags;
int clid_len; /* length of client identifier */
unsigned char *clid; /* clientid */
unsigned char hwaddr[ETHER_ADDR_LEN];
int hwaddr_len, hwaddr_type;
unsigned char hwaddr[DHCP_CHADDR_MAX];
char *hostname;
struct dhcp_netid netid;
struct in_addr addr;
unsigned int lease_time;
unsigned int lease_time, wildcard_mask;
struct dhcp_config *next;
};
#define CONFIG_DISABLE 1
#define CONFIG_CLID 2
#define CONFIG_HWADDR 4
#define CONFIG_TIME 8
#define CONFIG_NAME 16
#define CONFIG_ADDR 32
#define CONFIG_NETID 64
#define CONFIG_NOCLID 128
#define CONFIG_DISABLE 1
#define CONFIG_CLID 2
#define CONFIG_HWADDR 4
#define CONFIG_TIME 8
#define CONFIG_NAME 16
#define CONFIG_ADDR 32
#define CONFIG_NETID 64
#define CONFIG_NOCLID 128
struct dhcp_opt {
int opt, len, is_addr;
unsigned char *val;
int opt, len, flags;
unsigned char *val, *vendor_class;
struct dhcp_netid *netid;
struct dhcp_opt *next;
};
#define DHOPT_ADDR 1
#define DHOPT_STRING 2
struct dhcp_boot {
char *file, *sname;
struct in_addr next_server;
@@ -330,38 +354,48 @@ struct dhcp_vendor {
struct dhcp_vendor *next;
};
struct dhcp_mac {
unsigned int mask;
int hwaddr_len, hwaddr_type;
unsigned char hwaddr[DHCP_CHADDR_MAX];
struct dhcp_netid netid;
struct dhcp_mac *next;
};
struct dhcp_context {
unsigned int lease_time, addr_epoch;
struct in_addr netmask, broadcast, router;
struct in_addr netmask, broadcast;
struct in_addr local, router;
struct in_addr start, end; /* range of available addresses */
int static_only, filter_netid;
struct dhcp_netid netid;
int flags;
struct dhcp_netid netid, *filter;
struct dhcp_context *next, *current;
};
#define CONTEXT_STATIC 1
#define CONTEXT_NETMASK 2
#define CONTEXT_BRDCAST 4
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
struct udp_dhcp_packet {
struct ip ip;
struct udphdr {
u16 uh_sport; /* source port */
u16 uh_dport; /* destination port */
u16 uh_ulen; /* udp length */
u16 uh_sum; /* udp checksum */
} udp;
struct dhcp_packet {
u8 op, htype, hlen, hops;
u32 xid;
u16 secs, flags;
struct in_addr ciaddr, yiaddr, siaddr, giaddr;
u8 chaddr[16], sname[64], file[128];
u8 options[312];
} data;
struct dhcp_packet {
u8 op, htype, hlen, hops;
u32 xid;
u16 secs, flags;
struct in_addr ciaddr, yiaddr, siaddr, giaddr;
u8 chaddr[DHCP_CHADDR_MAX], sname[64], file[128];
u8 options[312];
};
struct ping_result {
struct in_addr addr;
time_t time;
struct ping_result *next;
};
struct daemon {
/* datastuctures representing the command-line and
@@ -370,14 +404,14 @@ struct daemon {
unsigned int options;
struct resolvc default_resolv, *resolv_files;
struct mx_record *mxnames;
struct mx_srv_record *mxnames;
struct txt_record *txt;
char *mxtarget;
char *lease_file;
char *username, *groupname;
char *domain_suffix;
struct srv_record *srvnames;
char *runfile;
struct iname *if_names, *if_addrs, *if_except;
struct iname *if_names, *if_addrs, *if_except, *dhcp_except;
struct bogus_addr *bogus_addr;
struct server *servers;
int cachesize;
@@ -386,8 +420,9 @@ struct daemon {
struct hostsfile *addn_hosts;
struct dhcp_context *dhcp;
struct dhcp_config *dhcp_conf;
struct dhcp_opt *dhcp_opts;
struct dhcp_opt *dhcp_opts, *vendor_opts;
struct dhcp_vendor *dhcp_vendors;
struct dhcp_mac *dhcp_macs;
struct dhcp_boot *boot_config;
struct dhcp_netid_list *dhcp_ignore;
int dhcp_max;
@@ -397,16 +432,35 @@ struct daemon {
/* globally used stuff for DNS */
char *packet; /* packet buffer */
int packet_buff_sz; /* size of above */
char *namebuff; /* MAXDNAME size buffer */
struct serverfd *sfds;
struct irec *interfaces;
struct listener *listeners;
struct server *last_server;
int uptime_fd;
struct server *srv_save; /* Used for resend on DoD */
size_t packet_len; /* " " */
int num_kids;
/* DHCP state */
int dhcpfd, dhcp_raw_fd, dhcp_icmp_fd, lease_fd;
struct udp_dhcp_packet *dhcp_packet;
int dhcpfd;
#ifdef HAVE_LINUX_NETWORK
int netlinkfd;
#else
int dhcp_raw_fd, dhcp_icmp_fd;
#endif
struct iovec dhcp_packet;
char *dhcp_buff, *dhcp_buff2;
struct ping_result *ping_results;
FILE *lease_stream;
/* DBus stuff */
#ifdef HAVE_DBUS
/* void * here to avoid depending on dbus headers outside dbus.c */
void *dbus;
struct watch *watches;
#endif
};
/* cache.c */
@@ -425,62 +479,68 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
void cache_reload(int opts, char *buff, char *domain_suffix, struct hostsfile *addn_hosts);
void cache_add_dhcp_entry(struct daemon *daemon, char *host_name, struct in_addr *host_address, time_t ttd);
void cache_unhash_dhcp(void);
void dump_cache(struct daemon *daemon);
void dump_cache(struct daemon *daemon, time_t now);
char *cache_get_name(struct crec *crecp);
/* rfc1035.c */
unsigned short extract_request(HEADER *header, unsigned int qlen,
unsigned short extract_request(HEADER *header, size_t qlen,
char *name, unsigned short *typep);
int setup_reply(HEADER *header, unsigned int qlen,
struct all_addr *addrp, unsigned short flags,
unsigned long local_ttl);
void extract_addresses(HEADER *header, unsigned int qlen, char *namebuff,
size_t setup_reply(HEADER *header, size_t qlen,
struct all_addr *addrp, unsigned short flags,
unsigned long local_ttl);
void extract_addresses(HEADER *header, size_t qlen, char *namebuff,
time_t now, struct daemon *daemon);
int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon *daemon,
size_t answer_request(HEADER *header, char *limit, size_t qlen, struct daemon *daemon,
struct in_addr local_addr, struct in_addr local_netmask, time_t now);
int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name,
int check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name,
struct bogus_addr *addr, time_t now);
unsigned char *find_pseudoheader(HEADER *header, unsigned int plen,
unsigned int *len, unsigned char **p);
unsigned char *find_pseudoheader(HEADER *header, size_t plen,
size_t *len, unsigned char **p);
int check_for_local_domain(char *name, time_t now, struct daemon *daemon);
unsigned int questions_crc(HEADER *header, unsigned int plen);
int resize_packet(HEADER *header, unsigned int plen,
unsigned char *pheader, unsigned int hlen);
unsigned int questions_crc(HEADER *header, size_t plen, char *buff);
size_t resize_packet(HEADER *header, size_t plen,
unsigned char *pheader, size_t hlen);
/* util.c */
unsigned short rand16(void);
int legal_char(char c);
int canonicalise(char *s);
int atoi_check(char *a, int *res);
unsigned char *do_rfc1035_name(unsigned char *p, char *sval);
void die(char *message, char *arg1);
void complain(char *message, char *arg1);
void *safe_malloc(int size);
char *safe_string_alloc(char *cp);
void complain(char *message, int lineno, char *file);
void *safe_malloc(size_t size);
int sa_len(union mysockaddr *addr);
int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2);
int hostname_isequal(unsigned char *a, unsigned char *b);
time_t dnsmasq_time(int fd);
int hostname_isequal(char *a, char *b);
time_t dnsmasq_time(void);
int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask);
int retry_send(void);
void prettyprint_time(char *buf, unsigned int t);
int prettyprint_addr(union mysockaddr *addr, char *buf);
int parse_hex(char *in, unsigned char *out, int maxlen,
unsigned int *wildcard_mask, int *mac_type);
int memcmp_masked(unsigned char *a, unsigned char *b, int len,
unsigned int mask);
int expand_buf(struct iovec *iov, size_t size);
/* option.c */
struct daemon *read_opts (int argc, char **argv);
struct daemon *read_opts (int argc, char **argv, char *compile_opts);
/* forward.c */
void forward_init(int first);
void reply_query(struct serverfd *sfd, struct daemon *daemon, time_t now);
void receive_query(struct listener *listen, struct daemon *daemon, time_t now);
char *tcp_request(struct daemon *daemon, int confd, time_t now,
struct in_addr local_addr, struct in_addr netmask);
unsigned char *tcp_request(struct daemon *daemon, int confd, time_t now,
struct in_addr local_addr, struct in_addr netmask);
/* network.c */
struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **sfds);
void reload_servers(char *fname, struct daemon *daemon);
void check_servers(struct daemon *daemon, struct irec *interfaces);
int enumerate_interfaces(struct daemon *daemon, struct irec **chainp,
union mysockaddr *test_addrp, struct in_addr *netmaskp);
void check_servers(struct daemon *daemon);
int enumerate_interfaces(struct daemon *daemon);
struct listener *create_wildcard_listeners(int port);
struct listener *create_bound_listeners(struct irec *interfaces, int port);
struct listener *create_bound_listeners(struct daemon *daemon);
int iface_check(struct daemon *daemon, int family,
struct all_addr *addr, char *name);
/* dhcp.c */
void dhcp_init(struct daemon *daemon);
@@ -488,14 +548,15 @@ void dhcp_packet(struct daemon *daemon, time_t now);
struct dhcp_context *address_available(struct dhcp_context *context, struct in_addr addr);
struct dhcp_context *narrow_context(struct dhcp_context *context, struct in_addr taddr);
int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool);
int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int negonly);
int address_allocate(struct dhcp_context *context, struct daemon *daemon,
struct in_addr *addrp, unsigned char *hwaddr,
struct dhcp_netid *netids);
struct in_addr *addrp, unsigned char *hwaddr, int hw_len,
struct dhcp_netid *netids, time_t now);
struct dhcp_config *find_config(struct dhcp_config *configs,
struct dhcp_context *context,
unsigned char *clid, int clid_len,
unsigned char *hwaddr, char *hostname);
unsigned char *hwaddr, int hw_len,
int hw_type, char *hostname);
void dhcp_update_configs(struct dhcp_config *configs);
void dhcp_read_ethers(struct daemon *daemon);
struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr);
@@ -503,26 +564,59 @@ char *strip_hostname(struct daemon *daemon, char *hostname);
char *host_from_dns(struct daemon *daemon, struct in_addr addr);
/* lease.c */
void lease_update_file(int force, time_t now);
void lease_update_file(struct daemon *daemon);
void lease_update_dns(struct daemon *daemon);
void lease_init(struct daemon *daemon, time_t now);
struct dhcp_lease *lease_allocate(unsigned char *clid, int clid_len, struct in_addr addr);
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr);
void lease_set_hostname(struct dhcp_lease *lease, char *name, char *suffix);
void lease_set_expires(struct dhcp_lease *lease, time_t exp);
struct dhcp_lease *lease_find_by_client(unsigned char *clid, int clid_len);
struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid,
int hw_len, int hw_type, int clid_len, struct in_addr addr);
int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
unsigned char *clid, int hw_len, int hw_type, int clid_len);
void lease_set_hostname(struct dhcp_lease *lease, char *name,
char *suffix, int auth);
void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
unsigned char *clid, int clid_len);
struct dhcp_lease *lease_find_by_addr(struct in_addr addr);
void lease_prune(struct dhcp_lease *target, time_t now);
void lease_update_from_configs(struct dhcp_config *dhcp_configs, char *domain);
void lease_update_from_configs(struct daemon *daemon);
/* rfc2131.c */
int dhcp_reply(struct daemon *daemon, struct in_addr iface_addr, char *iface_name, unsigned int sz, time_t now);
size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *iface_name, size_t sz, time_t now, int unicast_dest);
/* dnsmasq.c */
int make_icmp_sock(void);
int icmp_ping(struct daemon *daemon, struct in_addr addr);
void clear_cache_and_reload(struct daemon *daemon);
/* isc.c */
#ifdef HAVE_ISC_READER
void load_dhcp(struct daemon *daemon, time_t now);
#endif
/* netlink.c */
#ifdef HAVE_LINUX_NETWORK
void netlink_init(struct daemon *daemon);
int iface_enumerate(struct daemon *daemon, void *parm,
int (*ipv4_callback)(), int (*ipv6_callback)());
void netlink_multicast(struct daemon *daemon);
void arp_inject(int fd, struct in_addr addr,
int iface, unsigned char *mac, unsigned int mac_len);
#endif
/* bpf.c */
#ifndef HAVE_LINUX_NETWORK
void init_bpf(struct daemon *daemon);
void send_via_bpf(struct daemon *daemon, struct dhcp_packet *mess, size_t len,
struct in_addr iface_addr, struct ifreq *ifr);
int iface_enumerate(struct daemon *daemon, void *parm,
int (*ipv4_callback)(), int (*ipv6_callback)());
#endif
/* dbus.c */
#ifdef HAVE_DBUS
char *dbus_init(struct daemon *daemon);
void check_dbus_listeners(struct daemon *daemon,
fd_set *rset, fd_set *wset, fd_set *eset);
int set_dbus_listeners(struct daemon *daemon, int maxfd,
fd_set *rset, fd_set *wset, fd_set *eset);
#endif

View File

@@ -10,8 +10,6 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static struct frec *frec_list;
@@ -36,7 +34,7 @@ void forward_init(int first)
/* Send a UDP packet with it's source address set as "source"
unless nowild is true, when we just send it with the kernel default */
static void send_from(int fd, int nowild, char *packet, int len,
static void send_from(int fd, int nowild, char *packet, size_t len,
union mysockaddr *to, struct all_addr *source,
unsigned int iface)
{
@@ -44,7 +42,7 @@ static void send_from(int fd, int nowild, char *packet, int len,
struct iovec iov[1];
union {
struct cmsghdr align; /* this ensures alignment */
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
char control[CMSG_SPACE(sizeof(struct in_pktinfo))];
#elif defined(IP_SENDSRCADDR)
char control[CMSG_SPACE(sizeof(struct in_addr))];
@@ -74,7 +72,7 @@ static void send_from(int fd, int nowild, char *packet, int len,
if (to->sa.sa_family == AF_INET)
{
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
struct in_pktinfo *pkt = (struct in_pktinfo *)CMSG_DATA(cmptr);
pkt->ipi_ifindex = 0;
pkt->ipi_spec_dst = source->addr.addr4;
@@ -89,9 +87,8 @@ static void send_from(int fd, int nowild, char *packet, int len,
cmptr->cmsg_type = IP_SENDSRCADDR;
#endif
}
#ifdef HAVE_IPV6
else
#ifdef HAVE_IPV6
{
struct in6_pktinfo *pkt = (struct in6_pktinfo *)CMSG_DATA(cmptr);
pkt->ipi6_ifindex = iface; /* Need iface for IPv6 to handle link-local addrs */
@@ -100,6 +97,8 @@ static void send_from(int fd, int nowild, char *packet, int len,
cmptr->cmsg_type = IPV6_PKTINFO;
cmptr->cmsg_level = IPV6_LEVEL;
}
#else
iface = 0; /* eliminate warning */
#endif
}
@@ -134,7 +133,7 @@ static unsigned short search_servers(struct daemon *daemon, time_t now, struct a
for (serv = daemon->servers; serv; serv=serv->next)
/* domain matches take priority over NODOTS matches */
if ((serv->flags & SERV_FOR_NODOTS) && *type != SERV_HAS_DOMAIN && !strchr(qdomain, '.'))
if ((serv->flags & SERV_FOR_NODOTS) && *type != SERV_HAS_DOMAIN && !strchr(qdomain, '.') && namelen != 0)
{
unsigned short sflag = serv->addr.sa.sa_family == AF_INET ? F_IPV4 : F_IPV6;
*type = SERV_FOR_NODOTS;
@@ -159,9 +158,11 @@ static unsigned short search_servers(struct daemon *daemon, time_t now, struct a
else if (serv->flags & SERV_HAS_DOMAIN)
{
unsigned int domainlen = strlen(serv->domain);
char *matchstart = qdomain + namelen - domainlen;
if (namelen >= domainlen &&
hostname_isequal(qdomain + namelen - domainlen, serv->domain) &&
domainlen >= matchlen)
hostname_isequal(matchstart, serv->domain) &&
domainlen >= matchlen &&
(domainlen == 0 || namelen == domainlen || *(serv->domain) == '.' || *(matchstart-1) == '.' ))
{
unsigned short sflag = serv->addr.sa.sa_family == AF_INET ? F_IPV4 : F_IPV6;
*type = SERV_HAS_DOMAIN;
@@ -194,7 +195,7 @@ static unsigned short search_servers(struct daemon *daemon, time_t now, struct a
else
log_query(F_CONFIG | F_FORWARD | flags, qdomain, *addrpp, 0, NULL, 0);
}
else if (qtype && (daemon->options & OPT_NODOTS_LOCAL) && !strchr(qdomain, '.'))
else if (qtype && (daemon->options & OPT_NODOTS_LOCAL) && !strchr(qdomain, '.') && namelen != 0)
flags = F_NXDOMAIN;
if (flags == F_NXDOMAIN && check_for_local_domain(qdomain, now, daemon))
@@ -209,27 +210,26 @@ static unsigned short search_servers(struct daemon *daemon, time_t now, struct a
/* returns new last_server */
static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *udpaddr,
struct all_addr *dst_addr, unsigned int dst_iface,
HEADER *header, int plen, time_t now)
HEADER *header, size_t plen, time_t now, struct frec *forward)
{
struct frec *forward;
char *domain = NULL;
int forwardall = 0, type = 0;
int type = 0;
struct all_addr *addrp = NULL;
unsigned int crc = questions_crc(header, plen, daemon->namebuff);
unsigned short flags = 0;
unsigned short gotname = extract_request(header, (unsigned int)plen, daemon->namebuff, NULL);
unsigned short gotname = extract_request(header, plen, daemon->namebuff, NULL);
struct server *start = NULL;
unsigned int crc = questions_crc(header,(unsigned int)plen);
/* may be recursion not speced or no servers available. */
if (!header->rd || !daemon->servers)
/* may be no servers available. */
if (!daemon->servers)
forward = NULL;
else if ((forward = lookup_frec_by_sender(ntohs(header->id), udpaddr, crc)))
else if (forward || (forward = lookup_frec_by_sender(ntohs(header->id), udpaddr, crc)))
{
/* retry on existing query, send to all available servers */
domain = forward->sentto->domain;
if (!(daemon->options & OPT_ORDER))
{
forwardall = 1;
forward->forwardall = 1;
daemon->last_server = NULL;
}
type = forward->sentto->flags & SERV_TYPE;
@@ -248,6 +248,16 @@ static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *ud
if (forward)
{
forward->source = *udpaddr;
forward->dest = *dst_addr;
forward->iface = dst_iface;
forward->new_id = get_id();
forward->fd = udpfd;
forward->orig_id = ntohs(header->id);
forward->crc = crc;
forward->forwardall = 0;
header->id = htons(forward->new_id);
/* In strict_order mode, or when using domain specific servers
always try servers in the order specified in resolv.conf,
otherwise, use the one last known to work. */
@@ -257,17 +267,8 @@ static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *ud
else if (!(start = daemon->last_server))
{
start = daemon->servers;
forwardall = 1;
forward->forwardall = 1;
}
forward->source = *udpaddr;
forward->dest = *dst_addr;
forward->iface = dst_iface;
forward->new_id = get_id();
forward->fd = udpfd;
forward->orig_id = ntohs(header->id);
forward->crc = crc;
header->id = htons(forward->new_id);
}
}
@@ -299,6 +300,10 @@ static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *ud
}
else
{
/* Keep info in case we want to re-send this packet */
daemon->srv_save = start;
daemon->packet_len = plen;
if (!gotname)
strcpy(daemon->namebuff, "query");
if (start->addr.sa.sa_family == AF_INET)
@@ -313,8 +318,9 @@ static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *ud
#endif
forwarded = 1;
forward->sentto = start;
if (!forwardall)
if (!forward->forwardall)
break;
forward->forwardall++;
}
}
@@ -334,18 +340,22 @@ static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *ud
}
/* could not send on, return empty answer or address if known for whole domain */
plen = setup_reply(header, (unsigned int)plen, addrp, flags, daemon->local_ttl);
send_from(udpfd, daemon->options & OPT_NOWILD, (char *)header, plen, udpaddr, dst_addr, dst_iface);
if (udpfd != -1)
{
plen = setup_reply(header, plen, addrp, flags, daemon->local_ttl);
send_from(udpfd, daemon->options & OPT_NOWILD, (char *)header, plen, udpaddr, dst_addr, dst_iface);
}
return;
}
static int process_reply(struct daemon *daemon, HEADER *header, time_t now,
union mysockaddr *serveraddr, unsigned int n)
static size_t process_reply(struct daemon *daemon, HEADER *header, time_t now,
unsigned int query_crc, struct server *server, size_t n)
{
unsigned char *pheader, *sizep;
unsigned int plen, munged = 0;
int munged = 0;
size_t plen;
/* If upstream is advertising a larger UDP packet size
than we allow, trim it so that we don't get overlarge
requests for the client. */
@@ -360,25 +370,19 @@ static int process_reply(struct daemon *daemon, HEADER *header, time_t now,
PUTSHORT(daemon->edns_pktsz, psave);
}
/* Complain loudly if the upstream server is non-recursive. */
if (!header->ra && header->rcode == NOERROR && ntohs(header->ancount) == 0)
{
char addrbuff[ADDRSTRLEN];
#ifdef HAVE_IPV6
if (serveraddr->sa.sa_family == AF_INET)
inet_ntop(AF_INET, &serveraddr->in.sin_addr, addrbuff, ADDRSTRLEN);
else if (serveraddr->sa.sa_family == AF_INET6)
inet_ntop(AF_INET6, &serveraddr->in6.sin6_addr, addrbuff, ADDRSTRLEN);
#else
strcpy(addrbuff, inet_ntoa(serveraddr->in.sin_addr));
#endif
syslog(LOG_WARNING, "nameserver %s refused to do a recursive query", addrbuff);
return 0;
}
if (header->opcode != QUERY || (header->rcode != NOERROR && header->rcode != NXDOMAIN))
return n;
/* Complain loudly if the upstream server is non-recursive. */
if (!header->ra && header->rcode == NOERROR && ntohs(header->ancount) == 0 &&
server && !(server->flags & SERV_WARNED_RECURSIVE))
{
prettyprint_addr(&server->addr, daemon->namebuff);
syslog(LOG_WARNING, _("nameserver %s refused to do a recursive query"), daemon->namebuff);
if (!(daemon->options & OPT_LOG))
server->flags |= SERV_WARNED_RECURSIVE;
}
if (daemon->bogus_addr && header->rcode != NXDOMAIN &&
check_for_bogus_wildcard(header, n, daemon->namebuff, daemon->bogus_addr, now))
{
@@ -400,7 +404,11 @@ static int process_reply(struct daemon *daemon, HEADER *header, time_t now,
header->rcode = NOERROR;
}
extract_addresses(header, n, daemon->namebuff, now, daemon);
/* If the crc of the question section doesn't match the crc we sent, then
someone might be attempting to insert bogus values into the cache by
sending replies containing questions and bogus answers. */
if (query_crc == questions_crc(header, n, daemon->namebuff))
extract_addresses(header, n, daemon->namebuff, now, daemon);
}
/* do this after extract_addresses. Ensure NODATA reply and remove
@@ -428,13 +436,17 @@ void reply_query(struct serverfd *sfd, struct daemon *daemon, time_t now)
HEADER *header;
union mysockaddr serveraddr;
socklen_t addrlen = sizeof(serveraddr);
int n = recvfrom(sfd->fd, daemon->packet, daemon->edns_pktsz, 0, &serveraddr.sa, &addrlen);
ssize_t n = recvfrom(sfd->fd, daemon->packet, daemon->edns_pktsz, 0, &serveraddr.sa, &addrlen);
size_t nn;
/* packet buffer overwritten */
daemon->srv_save = NULL;
/* Determine the address of the server replying so that we can mark that as good */
serveraddr.sa.sa_family = sfd->source_addr.sa.sa_family;
#ifdef HAVE_IPV6
if (serveraddr.sa.sa_family == AF_INET6)
serveraddr.in6.sin6_flowinfo = htonl(0);
serveraddr.in6.sin6_flowinfo = 0;
#endif
header = (HEADER *)daemon->packet;
@@ -442,26 +454,62 @@ void reply_query(struct serverfd *sfd, struct daemon *daemon, time_t now)
if (n >= (int)sizeof(HEADER) && header->qr && forward)
{
/* find good server by address if possible, otherwise assume the last one we sent to */
if ((forward->sentto->flags & SERV_TYPE) == 0)
struct server *server = forward->sentto;
if ((header->rcode == SERVFAIL || header->rcode == REFUSED) && forward->forwardall == 0)
/* for broken servers, attempt to send to another one. */
{
unsigned char *pheader;
size_t plen;
/* recreate query from reply */
pheader = find_pseudoheader(header, (size_t)n, &plen, NULL);
header->ancount = htons(0);
header->nscount = htons(0);
header->arcount = htons(0);
if ((nn = resize_packet(header, (size_t)n, pheader, plen)))
{
forward->forwardall = 1;
header->qr = 0;
header->tc = 0;
forward_query(daemon, -1, NULL, NULL, 0, header, nn, now, forward);
return;
}
}
if ((forward->sentto->flags & SERV_TYPE) == 0)
{
if (header->rcode == SERVFAIL || header->rcode == REFUSED)
server = NULL;
else
{
struct server *last_server;
/* find good server by address if possible, otherwise assume the last one we sent to */
for (last_server = daemon->servers; last_server; last_server = last_server->next)
if (!(last_server->flags & (SERV_LITERAL_ADDRESS | SERV_HAS_DOMAIN | SERV_FOR_NODOTS | SERV_NO_ADDR)) &&
sockaddr_isequal(&last_server->addr, &serveraddr))
{
server = last_server;
break;
}
}
daemon->last_server = server;
}
/* If the answer is an error, keep the forward record in place in case
we get a good reply from another server. Kill it when we've
had replies from all to avoid filling the forwarding table when
everything is broken */
if (forward->forwardall == 0 || --forward->forwardall == 1 ||
(header->rcode != REFUSED && header->rcode != SERVFAIL))
{
struct server *last_server;
daemon->last_server = forward->sentto;
for (last_server = daemon->servers; last_server; last_server = last_server->next)
if (!(last_server->flags & (SERV_LITERAL_ADDRESS | SERV_HAS_DOMAIN | SERV_FOR_NODOTS | SERV_NO_ADDR)) &&
sockaddr_isequal(&last_server->addr, &serveraddr))
{
daemon->last_server = last_server;
break;
}
}
if ((n = process_reply(daemon, header, now, &serveraddr, (unsigned int)n)))
{
header->id = htons(forward->orig_id);
header->ra = 1; /* recursion if available */
send_from(forward->fd, daemon->options & OPT_NOWILD, daemon->packet, n,
&forward->source, &forward->dest, forward->iface);
if ((nn = process_reply(daemon, header, now, forward->crc, server, (size_t)n)))
{
header->id = htons(forward->orig_id);
header->ra = 1; /* recursion if available */
send_from(forward->fd, daemon->options & OPT_NOWILD, daemon->packet, nn,
&forward->source, &forward->dest, forward->iface);
}
forward->new_id = 0; /* cancel */
}
}
@@ -472,10 +520,11 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
HEADER *header = (HEADER *)daemon->packet;
union mysockaddr source_addr;
unsigned short type;
struct iname *tmp;
struct all_addr dst_addr;
struct in_addr netmask, dst_addr_4;
int m, n, if_index = 0;
size_t m;
ssize_t n;
int if_index = 0;
struct iovec iov[1];
struct msghdr msg;
struct cmsghdr *cmptr;
@@ -484,7 +533,7 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
#ifdef HAVE_IPV6
char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
#endif
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
char control[CMSG_SPACE(sizeof(struct in_pktinfo))];
#elif defined(IP_RECVDSTADDR)
char control[CMSG_SPACE(sizeof(struct in_addr)) +
@@ -492,13 +541,19 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
#endif
} control_u;
/* packet buffer overwritten */
daemon->srv_save = NULL;
if (listen->family == AF_INET && (daemon->options & OPT_NOWILD))
{
dst_addr_4 = listen->iface->addr.in.sin_addr;
netmask = listen->iface->netmask;
}
else
dst_addr_4.s_addr = 0;
{
dst_addr_4.s_addr = 0;
netmask.s_addr = 0;
}
iov[0].iov_base = daemon->packet;
iov[0].iov_len = daemon->edns_pktsz;
@@ -514,13 +569,15 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
if ((n = recvmsg(listen->fd, &msg, 0)) == -1)
return;
if (n < (int)sizeof(HEADER) || header->qr)
if (n < (int)sizeof(HEADER) ||
(msg.msg_flags & MSG_TRUNC) ||
header->qr)
return;
source_addr.sa.sa_family = listen->family;
#ifdef HAVE_IPV6
if (listen->family == AF_INET6)
source_addr.in6.sin6_flowinfo = htonl(0);
source_addr.in6.sin6_flowinfo = 0;
#endif
if (!(daemon->options & OPT_NOWILD))
@@ -530,7 +587,7 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
if (msg.msg_controllen < sizeof(struct cmsghdr))
return;
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
if (listen->family == AF_INET)
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == SOL_IP && cmptr->cmsg_type == IP_PKTINFO)
@@ -585,36 +642,11 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
netmask = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
}
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
return;
if (daemon->if_names || daemon->if_addrs)
{
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
break;
if (!tmp)
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (tmp->addr.sa.sa_family == listen->family)
{
if (tmp->addr.sa.sa_family == AF_INET &&
tmp->addr.in.sin_addr.s_addr == dst_addr.addr.addr4.s_addr)
break;
#ifdef HAVE_IPV6
else if (tmp->addr.sa.sa_family == AF_INET6 &&
memcmp(&tmp->addr.in6.sin6_addr,
&dst_addr.addr.addr6,
sizeof(struct in6_addr)) == 0)
break;
#endif
}
if (!tmp)
return;
}
if (!iface_check(daemon, listen->family, &dst_addr, ifr.ifr_name))
return;
}
if (extract_request(header, (unsigned int)n, daemon->namebuff, &type))
if (extract_request(header, (size_t)n, daemon->namebuff, &type))
{
if (listen->family == AF_INET)
log_query(F_QUERY | F_IPV4 | F_FORWARD, daemon->namebuff,
@@ -626,18 +658,18 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
#endif
}
m = answer_request (header, ((char *) header) + PACKETSZ, (unsigned int)n, daemon,
m = answer_request (header, ((char *) header) + PACKETSZ, (size_t)n, daemon,
dst_addr_4, netmask, now);
if (m >= 1)
send_from(listen->fd, daemon->options & OPT_NOWILD, (char *)header, m, &source_addr, &dst_addr, if_index);
else
forward_query(daemon, listen->fd, &source_addr, &dst_addr, if_index,
header, n, now);
header, (size_t)n, now, NULL);
}
static int read_write(int fd, char *packet, int size, int rw)
static int read_write(int fd, unsigned char *packet, int size, int rw)
{
int n, done;
ssize_t n, done;
for (done = 0; done < size; done += n)
{
@@ -651,7 +683,7 @@ static int read_write(int fd, char *packet, int size, int rw)
return 0;
else if (n == -1)
{
if (retry_send())
if (errno == EINTR)
goto retry;
else
return 0;
@@ -664,14 +696,15 @@ static int read_write(int fd, char *packet, int size, int rw)
blocking as neccessary, and then return. Note, need to be a bit careful
about resources for debug mode, when the fork is suppressed: that's
done by the caller. */
char *tcp_request(struct daemon *daemon, int confd, time_t now,
struct in_addr local_addr, struct in_addr netmask)
unsigned char *tcp_request(struct daemon *daemon, int confd, time_t now,
struct in_addr local_addr, struct in_addr netmask)
{
int size = 0, m;
int size = 0;
size_t m;
unsigned short qtype, gotname;
unsigned char c1, c2;
/* Max TCP packet + slop */
char *packet = malloc(65536 + MAXDNAME + RRFIXEDSZ);
unsigned char *packet = malloc(65536 + MAXDNAME + RRFIXEDSZ);
HEADER *header;
struct server *last_server;
@@ -728,7 +761,8 @@ char *tcp_request(struct daemon *daemon, int confd, time_t now,
if (!flags && last_server)
{
struct server *firstsendto = NULL;
unsigned int crc = questions_crc(header, (unsigned int)size, daemon->namebuff);
/* Loop round available servers until we succeed in connecting to one.
Note that this code subtley ensures that consecutive queries on this connection
which can go to the same server, do so. */
@@ -793,7 +827,7 @@ char *tcp_request(struct daemon *daemon, int confd, time_t now,
/* There's no point in updating the cache, since this process will exit and
lose the information after one query. We make this call for the alias and
bogus-nxdomain side-effects. */
m = process_reply(daemon, header, now, &last_server->addr, (unsigned int)m);
m = process_reply(daemon, header, now, crc, last_server, (unsigned int)m);
break;
}
@@ -851,7 +885,7 @@ static struct frec *get_new_frec(time_t now)
if (!warntime || difftime(now, warntime) > LOGRATE)
{
warntime = now;
syslog(LOG_WARNING, "forwarding table overflow: check for server loops.");
syslog(LOG_WARNING, _("forwarding table overflow: check for server loops."));
}
return NULL;
}
@@ -860,6 +894,7 @@ static struct frec *get_new_frec(time_t now)
{
f->next = frec_list;
f->time = now;
f->new_id = 0;
frec_list = f;
}
return f; /* OK if malloc fails and this is NULL */

View File

@@ -17,6 +17,8 @@
#ifdef HAVE_ISC_READER
#define MAXTOK 50
struct isc_lease {
char *name, *fqdn;
time_t expires;
@@ -68,7 +70,7 @@ void load_dhcp(struct daemon *daemon, time_t now)
if (stat(daemon->lease_file, &statbuf) == -1)
{
if (!logged_lease)
syslog(LOG_WARNING, "failed to access %s: %m", daemon->lease_file);
syslog(LOG_WARNING, _("failed to access %s: %m"), daemon->lease_file);
logged_lease = 1;
return;
}
@@ -84,11 +86,11 @@ void load_dhcp(struct daemon *daemon, time_t now)
if (!(fp = fopen (daemon->lease_file, "r")))
{
syslog (LOG_ERR, "failed to load %s: %m", daemon->lease_file);
syslog (LOG_ERR, _("failed to load %s: %m"), daemon->lease_file);
return;
}
syslog (LOG_INFO, "reading %s", daemon->lease_file);
syslog (LOG_INFO, _("reading %s"), daemon->lease_file);
while ((next_token(token, MAXTOK, fp)))
{
@@ -110,7 +112,7 @@ void load_dhcp(struct daemon *daemon, time_t now)
if (!canonicalise(hostname))
{
*hostname = 0;
syslog(LOG_ERR, "bad name in %s", daemon->lease_file);
syslog(LOG_ERR, _("bad name in %s"), daemon->lease_file);
}
}
else if ((strcmp(token, "ends") == 0) ||
@@ -136,8 +138,8 @@ void load_dhcp(struct daemon *daemon, time_t now)
it is noted that it might not be entirely accurate for odd seconds.
Since we're trying to get the same answer as dhcpd, that's just
fine here. */
static int months [11] = { 31, 59, 90, 120, 151, 181,
212, 243, 273, 304, 334 };
static const int months [11] = { 31, 59, 90, 120, 151, 181,
212, 243, 273, 304, 334 };
time_t time = ((((((365 * (lease_time.tm_year - 1970) + /* Days in years since '70 */
(lease_time.tm_year - 1969) / 4 + /* Leap days since '70 */
(lease_time.tm_mon > 1 /* Days in months this year */
@@ -172,7 +174,7 @@ void load_dhcp(struct daemon *daemon, time_t now)
if (!daemon->domain_suffix || hostname_isequal(dot+1, daemon->domain_suffix))
{
syslog(LOG_WARNING,
"Ignoring DHCP lease for %s because it has an illegal domain part",
_("Ignoring DHCP lease for %s because it has an illegal domain part"),
hostname);
continue;
}

View File

@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -10,160 +10,159 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static struct dhcp_lease *leases;
static FILE *lease_file;
static int dns_dirty, file_dirty, new_lease;
static int leases_left;
static int dns_dirty, file_dirty, leases_left;
void lease_init(struct daemon *daemon, time_t now)
{
unsigned int e0, e1, e2, e3, e4, e5, a0, a1, a2, a3;
unsigned int a0, a1, a2, a3;
unsigned long ei;
time_t expires;
unsigned char hwaddr[ETHER_ADDR_LEN];
unsigned char hwaddr[DHCP_CHADDR_MAX];
struct in_addr addr;
struct dhcp_lease *lease;
int clid_len = 0;
int has_old = 0;
char *buff = daemon->dhcp_buff;
char *buff2 = daemon->dhcp_buff2;
int clid_len = 0, hw_len, hw_type;
dns_dirty = 1;
file_dirty = 0;
leases = NULL;
leases_left = daemon->dhcp_max;
/* NOTE: need a+ mode to create file if it doesn't exist */
if (!(lease_file = fopen(daemon->lease_file, "a+")))
die("cannot open or create leases file: %s", NULL);
if (!(daemon->lease_stream = fopen(daemon->lease_file, "a+")))
die(_("cannot open or create leases file: %s"), NULL);
/* a+ mode lease pointer at end. */
rewind(lease_file);
rewind(daemon->lease_stream);
while (fscanf(lease_file, "%lu %x:%x:%x:%x:%x:%x %d.%d.%d.%d %257s %257s",
&ei, &e0, &e1, &e2, &e3, &e4, &e5, &a0, &a1, &a2, &a3,
buff, buff2) == 13)
/* client-id max length is 255 which is 255*2 digits + 254 colons
borrow DNS packet buffer which is always larger than 1000 bytes */
while (fscanf(daemon->lease_stream, "%lu %255s %d.%d.%d.%d %255s %764s",
&ei, daemon->dhcp_buff2, &a0, &a1, &a2, &a3,
daemon->dhcp_buff, daemon->packet) == 8)
{
#ifdef HAVE_BROKEN_RTC
if (ei)
expires = (time_t)ei + now;
else
expires = (time_t)0;
#else
#ifndef HAVE_BROKEN_RTC
/* strictly time_t is opaque, but this hack should work on all sane systems,
even when sizeof(time_t) == 8 */
expires = (time_t)ei;
time_t expires = (time_t)ei;
if (ei != 0 && difftime(now, expires) > 0)
{
has_old = 1;
file_dirty = 1;
continue; /* expired */
}
#endif
hwaddr[0] = e0;
hwaddr[1] = e1;
hwaddr[2] = e2;
hwaddr[3] = e3;
hwaddr[4] = e4;
hwaddr[5] = e5;
hw_len = parse_hex(daemon->dhcp_buff2, hwaddr, DHCP_CHADDR_MAX, NULL, &hw_type);
/* For backwards compatibility, no explict MAC address type means ether. */
if (hw_type == 0 && hw_len != 0)
hw_type = ARPHRD_ETHER;
addr.s_addr = htonl((a0<<24) + (a1<<16) + (a2<<8) + a3);
/* decode hex in place */
if (strcmp(buff2, "*") == 0)
if (strcmp(daemon->packet, "*") == 0)
clid_len = 0;
else
{
int s = (strlen(buff2)/3) + 1;
for (clid_len = 0; clid_len < s; clid_len++)
{
buff2[(clid_len*3)+2] = 0;
buff2[clid_len] = strtol(&buff2[clid_len*3], NULL, 16);
}
}
clid_len = parse_hex(daemon->packet, (unsigned char *)daemon->packet, 255, NULL, NULL);
if (!(lease = lease_allocate(buff2, clid_len, addr)))
die ("too many stored leases", NULL);
if (!(lease = lease_allocate(hwaddr, (unsigned char *)daemon->packet, hw_len, hw_type, clid_len, addr)))
die (_("too many stored leases"), NULL);
#ifdef HAVE_BROKEN_RTC
if (ei != 0)
lease->expires = (time_t)ei + now;
else
lease->expires = (time_t)0;
lease->length = ei;
#else
lease->expires = expires;
memcpy(lease->hwaddr, hwaddr, ETHER_ADDR_LEN);
#endif
if (strcmp(buff, "*") != 0)
lease_set_hostname(lease, buff, daemon->domain_suffix);
if (strcmp(daemon->dhcp_buff, "*") != 0)
lease_set_hostname(lease, daemon->dhcp_buff, daemon->domain_suffix, 0);
}
dns_dirty = 1;
file_dirty = has_old;
new_lease = 0;
daemon->lease_fd = fileno(lease_file);
}
void lease_update_from_configs(struct dhcp_config *dhcp_configs, char *domain)
void lease_update_from_configs(struct daemon *daemon)
{
/* changes to the config may change current leases. */
struct dhcp_lease *lease;
struct dhcp_config *config;
char *name;
for (lease = leases; lease; lease = lease->next)
if ((config = find_config(dhcp_configs, NULL, lease->clid, lease->clid_len, lease->hwaddr, NULL)) &&
(config->flags & CONFIG_NAME))
lease_set_hostname(lease, config->hostname, domain);
if ((config = find_config(daemon->dhcp_conf, NULL, lease->clid, lease->clid_len,
lease->hwaddr, lease->hwaddr_len, lease->hwaddr_type, NULL)) &&
(config->flags & CONFIG_NAME) &&
(!(config->flags & CONFIG_ADDR) || config->addr.s_addr == lease->addr.s_addr))
lease_set_hostname(lease, config->hostname, daemon->domain_suffix, 1);
else if ((name = host_from_dns(daemon, lease->addr)))
lease_set_hostname(lease, name, daemon->domain_suffix, 1); /* updates auth flag only */
}
void lease_update_file(int force, time_t now)
void lease_update_file(struct daemon *daemon)
{
struct dhcp_lease *lease;
int i = force; /* avoid warning */
unsigned long expires;
#ifdef HAVE_BROKEN_RTC
if (force || new_lease)
int i;
if (file_dirty != 0)
{
lease_prune(NULL, now);
#else
if (file_dirty)
{
#endif
rewind(lease_file);
ftruncate(fileno(lease_file), 0);
errno = 0;
rewind(daemon->lease_stream);
if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0)
{
write_err:
syslog(LOG_ERR, _("failed to write %s: %m (retry in %ds)"), daemon->lease_file, LEASE_RETRY);
alarm(LEASE_RETRY);
return;
}
for (lease = leases; lease; lease = lease->next)
{
#ifdef HAVE_BROKEN_RTC
if (lease->expires)
expires = (unsigned long) difftime(lease->expires, now);
else
expires = 0;
if (fprintf(daemon->lease_stream, "%u ", lease->length) < 0)
goto write_err;
#else
expires = now; /* eliminate warning */
expires = (unsigned long)lease->expires;
if (fprintf(daemon->lease_stream, "%lu ", (unsigned long)lease->expires) < 0)
goto write_err;
#endif
fprintf(lease_file, "%lu %.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %s ",
expires, lease->hwaddr[0], lease->hwaddr[1],
lease->hwaddr[2], lease->hwaddr[3], lease->hwaddr[4],
lease->hwaddr[5], inet_ntoa(lease->addr),
lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : "*");
if ((lease->hwaddr_type != ARPHRD_ETHER || lease->hwaddr_len == 0) &&
fprintf(daemon->lease_stream, "%.2x-", lease->hwaddr_type) < 0)
goto write_err;
for (i = 0; i < lease->hwaddr_len; i++)
{
if (fprintf(daemon->lease_stream, "%.2x", lease->hwaddr[i]) < 0)
goto write_err;
if (i != lease->hwaddr_len - 1 &&
fprintf(daemon->lease_stream, ":") < 0)
goto write_err;
}
if (fprintf(daemon->lease_stream, " %s %s ", inet_ntoa(lease->addr),
lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : "*") < 0)
goto write_err;
if (lease->clid_len)
if (lease->clid && lease->clid_len != 0)
{
for (i = 0; i < lease->clid_len - 1; i++)
fprintf(lease_file, "%.2x:", lease->clid[i]);
fprintf(lease_file, "%.2x\n", lease->clid[i]);
if (fprintf(daemon->lease_stream, "%.2x:", lease->clid[i]) < 0)
goto write_err;
if (fprintf(daemon->lease_stream, "%.2x\n", lease->clid[i]) < 0)
goto write_err;
}
else
fprintf(lease_file, "*\n");
if (fprintf(daemon->lease_stream, "*\n") < 0)
goto write_err;
}
fflush(lease_file);
fsync(fileno(lease_file));
if (fflush(daemon->lease_stream) != 0)
goto write_err;
if (fsync(fileno(daemon->lease_stream)) < 0)
goto write_err;
file_dirty = 0;
new_lease = 0;
}
}
@@ -215,23 +214,24 @@ void lease_prune(struct dhcp_lease *target, time_t now)
}
struct dhcp_lease *lease_find_by_client(unsigned char *clid, int clid_len)
struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
unsigned char *clid, int clid_len)
{
struct dhcp_lease *lease;
if (clid_len)
{
for (lease = leases; lease; lease = lease->next)
if (lease->clid && clid_len == lease->clid_len &&
if (clid)
for (lease = leases; lease; lease = lease->next)
if (lease->clid && clid_len == lease->clid_len &&
memcmp(clid, lease->clid, clid_len) == 0)
return lease;
}
else
{
for (lease = leases; lease; lease = lease->next)
if (memcmp(clid, lease->hwaddr, ETHER_ADDR_LEN) == 0)
return lease;
}
for (lease = leases; lease; lease = lease->next)
if ((!lease->clid || !clid) &&
hw_len != 0 &&
lease->hwaddr_len == hw_len &&
lease->hwaddr_type == hw_type &&
memcmp(hwaddr, lease->hwaddr, hw_len) == 0)
return lease;
return NULL;
}
@@ -248,77 +248,137 @@ struct dhcp_lease *lease_find_by_addr(struct in_addr addr)
}
struct dhcp_lease *lease_allocate(unsigned char *clid, int clid_len, struct in_addr addr)
struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid,
int hw_len, int hw_type, int clid_len, struct in_addr addr)
{
struct dhcp_lease *lease;
if (!leases_left || !(lease = malloc(sizeof(struct dhcp_lease))))
return NULL;
lease->clid = NULL;
lease->clid_len = clid_len;
if (clid_len)
{
if (!(lease->clid = malloc(clid_len)))
{
free(lease);
return NULL;
}
memcpy(lease->clid, clid, clid_len);
}
lease->hostname = lease->fqdn = NULL;
lease->hostname = lease->fqdn = NULL;
lease->addr = addr;
memset(lease->hwaddr, 0, ETHER_ADDR_LEN);
memset(lease->hwaddr, 0, DHCP_CHADDR_MAX);
lease->hwaddr_len = 0;
lease->hwaddr_type = 0;
lease->expires = 1;
#ifdef HAVE_BROKEN_RTC
lease->length = 0xffffffff; /* illegal value */
#endif
if (!lease_set_hwaddr(lease, hwaddr, clid, hw_len, hw_type, clid_len))
{
free(lease);
return NULL;
}
lease->next = leases;
leases = lease;
file_dirty = 1;
new_lease = 1;
leases_left--;
return lease;
}
void lease_set_expires(struct dhcp_lease *lease, time_t exp)
void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now)
{
time_t exp = now + (time_t)len;
if (len == 0xffffffff)
{
exp = 0;
len = 0;
}
if (exp != lease->expires)
file_dirty = dns_dirty = 1;
{
dns_dirty = 1;
lease->expires = exp;
#ifndef HAVE_BROKEN_RTC
file_dirty = 1;
#endif
}
#ifdef HAVE_BROKEN_RTC
if (len != lease->length)
{
lease->length = len;
file_dirty = 1;
}
#endif
}
lease->expires = exp;
}
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr)
int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
unsigned char *clid, int hw_len, int hw_type, int clid_len)
{
if (memcmp(lease->hwaddr, hwaddr, ETHER_ADDR_LEN) != 0)
/* must have some sort of unique-id */
if (hw_len == 0 && (clid_len == 0 || !clid))
return 0;
if (hw_len != lease->hwaddr_len ||
hw_type != lease->hwaddr_type ||
hw_len == 0 ||
memcmp(lease->hwaddr, hwaddr, hw_len) != 0)
{
file_dirty = 1;
memcpy(lease->hwaddr, hwaddr, ETHER_ADDR_LEN);
memcpy(lease->hwaddr, hwaddr, hw_len);
lease->hwaddr_len = hw_len;
lease->hwaddr_type = hw_type;
}
/* only update clid when one is available, stops packets
without a clid removing the record. Lease init uses
clid_len == 0 for no clid. */
if (clid_len != 0 && clid)
{
if (!lease->clid)
lease->clid_len = 0;
if (lease->clid_len != clid_len)
{
file_dirty = 1;
if (lease->clid)
free(lease->clid);
if (!(lease->clid = malloc(clid_len)))
return 0;
}
else if (memcmp(lease->clid, clid, clid_len) != 0)
file_dirty = 1;
lease->clid_len = clid_len;
memcpy(lease->clid, clid, clid_len);
}
return 1;
}
void lease_set_hostname(struct dhcp_lease *lease, char *name, char *suffix)
void lease_set_hostname(struct dhcp_lease *lease, char *name, char *suffix, int auth)
{
struct dhcp_lease *lease_tmp;
char *new_name = NULL, *new_fqdn = NULL;
if (lease->hostname && name && hostname_isequal(lease->hostname, name))
return;
{
lease->auth_name = auth;
return;
}
if (!name && !lease->hostname)
return;
/* If a machine turns up on a new net without dropping the old lease,
or two machines claim the same name, then we end up with two interfaces with
the same name. Check for that here and remove the name from the old lease. */
the same name. Check for that here and remove the name from the old lease.
Don't allow a name from the client to override a name from dnsmasq config. */
if (name)
{
for (lease_tmp = leases; lease_tmp; lease_tmp = lease_tmp->next)
if (lease_tmp->hostname && hostname_isequal(lease_tmp->hostname, name))
{
if (lease_tmp->auth_name && !auth)
return;
new_name = lease_tmp->hostname;
lease_tmp->hostname = NULL;
if (lease_tmp->fqdn)
@@ -326,6 +386,7 @@ void lease_set_hostname(struct dhcp_lease *lease, char *name, char *suffix)
new_fqdn = lease_tmp->fqdn;
lease_tmp->fqdn = NULL;
}
break;
}
if (!new_name && (new_name = malloc(strlen(name) + 1)))
@@ -346,8 +407,10 @@ void lease_set_hostname(struct dhcp_lease *lease, char *name, char *suffix)
lease->hostname = new_name;
lease->fqdn = new_fqdn;
lease->auth_name = auth;
file_dirty = dns_dirty = 1;
file_dirty = 1;
dns_dirty = 1;
}

278
src/netlink.c Normal file
View File

@@ -0,0 +1,278 @@
/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 dated June, 1991.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "dnsmasq.h"
#ifdef HAVE_LINUX_NETWORK
#include <linux/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
static struct iovec iov;
static void nl_err(struct nlmsghdr *h);
static void nl_routechange(struct daemon *daemon, struct nlmsghdr *h);
void netlink_init(struct daemon *daemon)
{
struct sockaddr_nl addr;
addr.nl_family = AF_NETLINK;
addr.nl_pad = 0;
addr.nl_pid = 0; /* autobind */
#ifdef HAVE_IPV6
addr.nl_groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
#else
addr.nl_groups = RTMGRP_IPV4_ROUTE;
#endif
/* May not be able to have permission to set multicast groups don't die in that case */
if ((daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) != -1)
{
if (bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
addr.nl_groups = 0;
if (errno != EPERM || bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
daemon->netlinkfd = -1;
}
}
if (daemon->netlinkfd == -1)
die(_("cannot create RTnetlink socket: %s"), NULL);
iov.iov_len = 200;
iov.iov_base = safe_malloc(iov.iov_len);
}
static ssize_t netlink_recv(struct daemon *daemon)
{
struct msghdr msg;
ssize_t rc;
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
while (1)
{
msg.msg_flags = 0;
while ((rc = recvmsg(daemon->netlinkfd, &msg, MSG_PEEK)) == -1 && errno == EINTR);
/* 2.2.x doesn't suport MSG_PEEK at all, returning EOPNOTSUPP, so we just grab a
big buffer and pray in that case. */
if (rc == -1 && errno == EOPNOTSUPP)
{
if (!expand_buf(&iov, 2000))
return -1;
break;
}
if (rc == -1 || !(msg.msg_flags & MSG_TRUNC))
break;
if (!expand_buf(&iov, iov.iov_len + 100))
return -1;
}
/* finally, read it for real */
while ((rc = recvmsg(daemon->netlinkfd, &msg, 0)) == -1 && errno == EINTR);
return rc;
}
int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), int (*ipv6_callback)())
{
struct sockaddr_nl addr;
struct nlmsghdr *h;
ssize_t len;
static unsigned int seq = 0;
int family = AF_INET;
struct {
struct nlmsghdr nlh;
struct rtgenmsg g;
} req;
addr.nl_family = AF_NETLINK;
addr.nl_pad = 0;
addr.nl_groups = 0;
addr.nl_pid = 0; /* address to kernel */
again:
req.nlh.nlmsg_len = sizeof(req);
req.nlh.nlmsg_type = RTM_GETADDR;
req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
req.nlh.nlmsg_pid = 0;
req.nlh.nlmsg_seq = ++seq;
req.g.rtgen_family = family;
/* Don't block in recvfrom if send fails */
while((len = sendto(daemon->netlinkfd, (void *)&req, sizeof(req), 0,
(struct sockaddr *)&addr, sizeof(addr))) == -1 && retry_send());
if (len == -1)
return 0;
while (1)
{
if ((len = netlink_recv(daemon)) == -1)
return 0;
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (h->nlmsg_type == NLMSG_ERROR)
nl_err(h);
else if (h->nlmsg_seq != seq)
nl_routechange(daemon, h); /* May be multicast arriving async */
else if (h->nlmsg_type == NLMSG_DONE)
{
#ifdef HAVE_IPV6
if (family == AF_INET && ipv6_callback)
{
family = AF_INET6;
goto again;
}
#endif
return 1;
}
else if (h->nlmsg_type == RTM_NEWADDR)
{
struct ifaddrmsg *ifa = NLMSG_DATA(h);
struct rtattr *rta = IFA_RTA(ifa);
unsigned int len1 = h->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa));
if (ifa->ifa_family == AF_INET)
{
struct in_addr netmask, addr, broadcast;
netmask.s_addr = htonl(0xffffffff << (32 - ifa->ifa_prefixlen));
addr.s_addr = 0;
broadcast.s_addr = 0;
while (RTA_OK(rta, len1))
{
if (rta->rta_type == IFA_LOCAL)
addr = *((struct in_addr *)(rta+1));
else if (rta->rta_type == IFA_BROADCAST)
broadcast = *((struct in_addr *)(rta+1));
rta = RTA_NEXT(rta, len1);
}
if (addr.s_addr && ipv4_callback)
if (!((*ipv4_callback)(daemon, addr, ifa->ifa_index, netmask, broadcast, parm)))
return 0;
}
#ifdef HAVE_IPV6
else if (ifa->ifa_family == AF_INET6)
{
struct in6_addr *addrp = NULL;
while (RTA_OK(rta, len1))
{
if (rta->rta_type == IFA_ADDRESS)
addrp = ((struct in6_addr *)(rta+1));
rta = RTA_NEXT(rta, len1);
}
if (addrp && ipv6_callback)
if (!((*ipv6_callback)(daemon, addrp, ifa->ifa_index, ifa->ifa_index, parm)))
return 0;
}
#endif
}
}
}
void netlink_multicast(struct daemon *daemon)
{
ssize_t len;
struct nlmsghdr *h;
if ((len = netlink_recv(daemon)) != -1)
{
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (h->nlmsg_type == NLMSG_ERROR)
nl_err(h);
else
nl_routechange(daemon, h);
}
}
static void nl_err(struct nlmsghdr *h)
{
struct nlmsgerr *err = NLMSG_DATA(h);
if (err->error != 0)
syslog(LOG_ERR, _("RTnetlink returns error: %s"), strerror(-(err->error)));
}
/* We arrange to receive netlink multicast messages whenever the network route is added.
If this happens and we still have a DNS packet in the buffer, we re-send it.
This helps on DoD links, where frequently the packet which triggers dialling is
a DNS query, which then gets lost. By re-sending, we can avoid the lookup
failing. */
static void nl_routechange(struct daemon *daemon, struct nlmsghdr *h)
{
if (h->nlmsg_type == RTM_NEWROUTE && daemon->srv_save)
{
struct rtmsg *rtm = NLMSG_DATA(h);
if (rtm->rtm_type == RTN_UNICAST &&
rtm->rtm_scope == RT_SCOPE_LINK)
while(sendto(daemon->srv_save->sfd->fd, daemon->packet, daemon->packet_len, 0,
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
}
}
void arp_inject(int fd, struct in_addr ip_addr, int iface,
unsigned char *mac, unsigned int mac_len)
{
struct sockaddr_nl addr;
struct {
struct nlmsghdr nlh;
struct ndmsg m;
struct rtattr addr_attr;
struct in_addr addr;
struct rtattr ll_attr;
char mac[DHCP_CHADDR_MAX];
} req;
memset(&req, 0, sizeof(req));
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
req.nlh.nlmsg_len = sizeof(req);
req.nlh.nlmsg_type = RTM_NEWNEIGH;
req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_REPLACE | NLM_F_CREATE;
req.m.ndm_family = AF_INET;
req.m.ndm_ifindex = iface;
req.m.ndm_state = NUD_REACHABLE;
req.addr_attr.rta_type = NDA_DST;
req.addr_attr.rta_len = RTA_LENGTH(sizeof(struct in_addr));
req.addr = ip_addr;
req.ll_attr.rta_type = NDA_LLADDR;
req.ll_attr.rta_len = RTA_LENGTH(mac_len);
memcpy(req.mac, mac, mac_len);
while(sendto(fd, (void *)&req, sizeof(req), 0, (struct sockaddr *)&addr, sizeof(addr)) == -1 &&
retry_send());
}
#endif

View File

@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000 - 2005 Simon Kelley
/* dnsmasq is Copyright (c) 2000 - 2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -10,272 +10,191 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static int iface_allowed(struct daemon *daemon, struct irec *iface,
char *name, int is_loopback, union mysockaddr *addr)
int iface_check(struct daemon *daemon, int family, struct all_addr *addr, char *name)
{
struct iname *tmp;
int ret = 1;
/* Note: have to check all and not bail out early, so that we set the
"used" flags. */
if (daemon->if_names || daemon->if_addrs)
{
ret = 0;
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
ret = tmp->used = 1;
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (tmp->addr.sa.sa_family == family)
{
if (family == AF_INET &&
tmp->addr.in.sin_addr.s_addr == addr->addr.addr4.s_addr)
ret = tmp->used = 1;
#ifdef HAVE_IPV6
else if (family == AF_INET6 &&
IN6_ARE_ADDR_EQUAL(&tmp->addr.in6.sin6_addr,
&addr->addr.addr6))
ret = tmp->used = 1;
#endif
}
}
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
ret = 0;
return ret;
}
static int iface_allowed(struct daemon *daemon, struct irec **irecp, int if_index,
union mysockaddr *addr, struct in_addr netmask)
{
struct irec *iface;
int fd;
struct ifreq ifr;
/* check whether the interface IP has been added already
we call this routine multiple times. */
for (iface = *irecp; iface; iface = iface->next)
if (sockaddr_isequal(&iface->addr, addr))
return 1;
#ifdef HAVE_LINUX_NETWORK
ifr.ifr_ifindex = if_index;
#endif
if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1 ||
#ifdef HAVE_LINUX_NETWORK
ioctl(fd, SIOCGIFNAME, &ifr) == -1 ||
#else
!if_indextoname(if_index, ifr.ifr_name) ||
#endif
ioctl(fd, SIOCGIFFLAGS, &ifr) == -1)
{
if (fd != -1)
{
int errsave = errno;
close(fd);
errno = errsave;
}
return 0;
}
close(fd);
/* If we are restricting the set of interfaces to use, make
sure that loopback interfaces are in that set. */
if (daemon->if_names && is_loopback)
if (daemon->if_names && (ifr.ifr_flags & IFF_LOOPBACK))
{
struct iname *lo;
for (lo = daemon->if_names; lo; lo = lo->next)
if (lo->name && strcmp(lo->name, name) == 0)
if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0)
{
lo->isloop = 1;
break;
}
if (!lo)
if (!lo && (lo = malloc(sizeof(struct iname))))
{
lo = safe_malloc(sizeof(struct iname));
lo->name = safe_string_alloc(name);
lo->name = safe_malloc(strlen(ifr.ifr_name)+1);
strcpy(lo->name, ifr.ifr_name);
lo->isloop = lo->used = 1;
lo->next = daemon->if_names;
daemon->if_names = lo;
}
}
/* check blacklist */
if (daemon->if_except)
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && strcmp(tmp->name, name) == 0)
return 0;
/* we may need to check the whitelist */
if (daemon->if_names || daemon->if_addrs)
{
int found = 0;
if (addr->sa.sa_family == AF_INET &&
!iface_check(daemon, AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name))
return 1;
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
found = tmp->used = 1;
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (sockaddr_isequal(&tmp->addr, addr))
found = tmp->used = 1;
if (!found)
return 0;
#ifdef HAVE_IPV6
if (addr->sa.sa_family == AF_INET6 &&
!iface_check(daemon, AF_INET6, (struct all_addr *)&addr->in6.sin6_addr, ifr.ifr_name))
return 1;
#endif
/* add to list */
if ((iface = malloc(sizeof(struct irec))))
{
iface->addr = *addr;
iface->netmask = netmask;
iface->next = *irecp;
*irecp = iface;
return 1;
}
/* check whether the interface IP has been added already
it is possible to have multiple interfaces with the same address */
for (; iface; iface = iface->next)
if (sockaddr_isequal(&iface->addr, addr))
break;
if (iface)
return 0;
return 1;
errno = ENOMEM;
return 0;
}
/* This does two different jobs: if chainp is non-NULL, it puts
a list of all the interfaces allowed by config into *chainp.
If chainp is NULL, it returns 1 if addr is an address of an interface
allowed by config and if that address is IPv4, it fills in the
netmask of the interface.
If chainp is non-NULL, a zero return indicates a fatal error.
If chainp is NULL, errors result in a match failure and zero return.
*/
int enumerate_interfaces(struct daemon *daemon, struct irec **chainp,
union mysockaddr *test_addrp, struct in_addr *netmaskp)
#ifdef HAVE_IPV6
static int iface_allowed_v6(struct daemon *daemon, struct in6_addr *local,
int scope, int if_index, void *vparam)
{
#if defined(HAVE_LINUX_IPV6_PROC) && defined(HAVE_IPV6)
FILE *f;
#endif
union mysockaddr addr;
struct irec *iface = NULL;
char *buf, *ptr;
struct ifreq *ifr = NULL;
struct ifconf ifc;
int lastlen = 0;
int len = 20 * sizeof(struct ifreq);
int fd = socket(PF_INET, SOCK_DGRAM, 0);
struct in_addr netmask;
int ret = 0;
if (fd == -1)
return 0;
#ifdef HAVE_IPV6
if (test_addrp && test_addrp->sa.sa_family == AF_INET6)
test_addrp->in6.sin6_flowinfo = htonl(0);
#endif
while (1)
{
buf = safe_malloc(len);
ifc.ifc_len = len;
ifc.ifc_buf = buf;
if (ioctl(fd, SIOCGIFCONF, &ifc) < 0)
{
if (errno != EINVAL || lastlen != 0)
goto exit;
}
else
{
if (ifc.ifc_len == lastlen)
break; /* got a big enough buffer now */
lastlen = ifc.ifc_len;
}
len += 10*sizeof(struct ifreq);
free(buf);
}
struct in_addr netmask; /* dummy */
for (ptr = buf; ptr < buf + ifc.ifc_len; )
{
#ifdef HAVE_SOCKADDR_SA_LEN
/* subsequent entries may not be aligned, so copy into
an aligned buffer to avoid nasty complaints about
unaligned accesses. */
int ifr_len = ((struct ifreq *)ptr)->ifr_addr.sa_len + IF_NAMESIZE;
if (!(ifr = realloc(ifr, ifr_len)))
goto exit;
memcpy(ifr, ptr, ifr_len);
ptr += ifr_len;
#else
ifr = (struct ifreq *)ptr;
ptr += sizeof(struct ifreq);
#endif
/* copy address since getting flags overwrites */
if (ifr->ifr_addr.sa_family == AF_INET)
{
addr.in = *((struct sockaddr_in *) &ifr->ifr_addr);
addr.in.sin_port = htons(daemon->port);
if (ioctl(fd, SIOCGIFNETMASK, ifr) == -1)
goto exit;
netmask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
}
#ifdef HAVE_IPV6
else if (ifr->ifr_addr.sa_family == AF_INET6)
{
#ifdef HAVE_BROKEN_SOCKADDR_IN6
addr.in6 = *((struct my_sockaddr_in6 *) &ifr->ifr_addr);
#else
addr.in6 = *((struct sockaddr_in6 *) &ifr->ifr_addr);
#endif
addr.in6.sin6_port = htons(daemon->port);
addr.in6.sin6_flowinfo = htonl(0);
}
#endif
else
continue; /* unknown address family */
if (ioctl(fd, SIOCGIFFLAGS, ifr) < 0)
goto exit;
if (iface_allowed(daemon, iface, ifr->ifr_name, ifr->ifr_flags & IFF_LOOPBACK, &addr))
{
if (chainp)
{
struct irec *new = safe_malloc(sizeof(struct irec));
new->addr = addr;
new->netmask = netmask;
new->next = iface;
iface = new;
}
else if (sockaddr_isequal(&addr, test_addrp))
{
*netmaskp = netmask;
ret = 1;
goto exit;
}
}
}
#if defined(HAVE_LINUX_IPV6_PROC) && defined(HAVE_IPV6)
/* IPv6 addresses don't seem to work with SIOCGIFCONF. Barf */
/* This code snarfed from net-tools 1.60 and certainly linux specific, though
it shouldn't break on other Unices, and their SIOGIFCONF might work. */
if ((f = fopen(IP6INTERFACES, "r")))
{
unsigned int plen, scope, flags, if_idx;
char devname[20], addrstring[32];
while (fscanf(f, "%32s %x %x %x %x %20s\n",
addrstring, &if_idx, &plen, &scope, &flags, devname) != EOF)
{
int i;
struct ifreq sifr;
unsigned char *addr6p = (unsigned char *) &addr.in6.sin6_addr;
memset(&addr, 0, sizeof(addr));
addr.sa.sa_family = AF_INET6;
for (i=0; i<16; i++)
{
unsigned int byte;
sscanf(addrstring+i+i, "%02x", &byte);
addr6p[i] = byte;
}
addr.in6.sin6_port = htons(daemon->port);
addr.in6.sin6_flowinfo = htonl(0);
addr.in6.sin6_scope_id = htonl(scope);
strncpy(sifr.ifr_name, devname, IF_NAMESIZE);
if (ioctl(fd, SIOCGIFFLAGS, &sifr) < 0)
goto exit;
if (iface_allowed(daemon, iface, sifr.ifr_name, sifr.ifr_flags & IFF_LOOPBACK, &addr))
{
if (chainp)
{
struct irec *new = safe_malloc(sizeof(struct irec));
new->addr = addr;
new->next = iface;
iface = new;
}
else if (sockaddr_isequal(&addr, test_addrp))
{
ret = 1;
goto exit;
}
}
}
fclose(f);
}
#endif /* LINUX */
netmask.s_addr = 0;
if (chainp)
{
*chainp = iface;
ret = 1;
}
exit:
if (buf)
free(buf);
#ifdef HAVE_SOCKADDR_SA_LEN
if (ifr)
free(ifr);
addr.in6.sin6_len = sizeof(addr.in6);
#endif
close(fd);
addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = *local;
addr.in6.sin6_port = htons(daemon->port);
addr.in6.sin6_scope_id = scope;
addr.in6.sin6_flowinfo = 0;
return ret;
return iface_allowed(daemon, (struct irec **)vparam, if_index, &addr, netmask);
}
#endif
static int iface_allowed_v4(struct daemon *daemon, struct in_addr local, int if_index,
struct in_addr netmask, struct in_addr broadcast, void *vparam)
{
union mysockaddr addr;
#ifdef HAVE_SOCKADDR_SA_LEN
addr.in.sin_len = sizeof(addr.in);
#endif
addr.in.sin_family = AF_INET;
addr.in.sin_addr = broadcast; /* warning */
addr.in.sin_addr = local;
addr.in.sin_port = htons(daemon->port);
return iface_allowed(daemon, (struct irec **)vparam, if_index, &addr, netmask);
}
int enumerate_interfaces(struct daemon *daemon)
{
#ifdef HAVE_IPV6
return iface_enumerate(daemon, &daemon->interfaces, iface_allowed_v4, iface_allowed_v6);
#else
return iface_enumerate(daemon, &daemon->interfaces, iface_allowed_v4, NULL);
#endif
}
#ifdef HAVE_IPV6
#if defined(HAVE_IPV6)
static int create_ipv6_listener(struct listener **link, int port)
{
union mysockaddr addr;
int tcpfd, fd, flags, save;
int tcpfd, fd, flags;
struct listener *l;
int opt = 1;
addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = in6addr_any;
addr.in6.sin6_port = htons(port);
addr.in6.sin6_flowinfo = htonl(0);
addr.in6.sin6_flowinfo = 0;
addr.in6.sin6_scope_id = 0;
#ifdef HAVE_SOCKADDR_SA_LEN
addr.in6.sin6_len = sizeof(struct sockaddr_in6);
addr.in6.sin6_len = sizeof(addr.in6);
#endif
/* No error of the kernel doesn't support IPv6 */
@@ -285,13 +204,8 @@ static int create_ipv6_listener(struct listener **link, int port)
errno == EINVAL);
if ((tcpfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
{
save = errno;
close(fd);
errno = save;
return 0;
}
return 0;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
setsockopt(tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
setsockopt(fd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
@@ -308,14 +222,8 @@ static int create_ipv6_listener(struct listener **link, int port)
bind(tcpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1 ||
listen(tcpfd, 5) == -1 ||
bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1)
{
save = errno;
close(fd);
close(tcpfd);
errno = save;
return 0;
}
return 0;
l = safe_malloc(sizeof(struct listener));
l->fd = fd;
l->tcpfd = tcpfd;
@@ -329,9 +237,6 @@ static int create_ipv6_listener(struct listener **link, int port)
struct listener *create_wildcard_listeners(int port)
{
#if !(defined(IP_PKTINFO) || (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
return NULL;
#else
union mysockaddr addr;
int opt = 1;
struct listener *l, *l6 = NULL;
@@ -345,15 +250,10 @@ struct listener *create_wildcard_listeners(int port)
addr.in.sin_len = sizeof(struct sockaddr_in);
#endif
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ||
(tcpfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return NULL;
if ((tcpfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
close (fd);
return NULL;
}
if (setsockopt(tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
bind(tcpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1 ||
listen(tcpfd, 5) == -1 ||
@@ -365,19 +265,15 @@ struct listener *create_wildcard_listeners(int port)
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
(flags = fcntl(fd, F_GETFL, 0)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
setsockopt(fd, SOL_IP, IP_PKTINFO, &opt, sizeof(opt)) == -1 ||
#elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt)) == -1 ||
setsockopt(fd, IPPROTO_IP, IP_RECVIF, &opt, sizeof(opt)) == -1 ||
#endif
bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1)
{
close(fd);
close(tcpfd);
return NULL;
}
return NULL;
l = safe_malloc(sizeof(struct listener));
l->family = AF_INET;
l->fd = fd;
@@ -385,18 +281,16 @@ struct listener *create_wildcard_listeners(int port)
l->next = l6;
return l;
#endif
}
struct listener *create_bound_listeners(struct irec *interfaces, int port)
struct listener *create_bound_listeners(struct daemon *daemon)
{
struct listener *listeners = NULL;
struct irec *iface;
int flags = port, opt = 1;
int flags, opt = 1;
for (iface = interfaces ;iface; iface = iface->next)
for (iface = daemon->interfaces; iface; iface = iface->next)
{
struct listener *new = safe_malloc(sizeof(struct listener));
new->family = iface->addr.sa.sa_family;
@@ -411,14 +305,14 @@ struct listener *create_bound_listeners(struct irec *interfaces, int port)
fcntl(new->tcpfd, F_SETFL, flags | O_NONBLOCK) == -1 ||
(flags = fcntl(new->fd, F_GETFL, 0)) == -1 ||
fcntl(new->fd, F_SETFL, flags | O_NONBLOCK) == -1)
die("failed to create listening socket: %s", NULL);
die(_("failed to create listening socket: %s"), NULL);
#ifdef HAVE_IPV6
if (iface->addr.sa.sa_family == AF_INET6)
{
if (setsockopt(new->fd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
setsockopt(new->tcpfd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1)
die("failed to set IPV6 options on listening socket: %s", NULL);
die(_("failed to set IPV6 options on listening socket: %s"), NULL);
}
#endif
@@ -434,13 +328,17 @@ struct listener *create_bound_listeners(struct irec *interfaces, int port)
}
else
#endif
die("failed to bind listening socket: %s", NULL);
{
prettyprint_addr(&iface->addr, daemon->namebuff);
die(_("failed to bind listening socket for %s: %s"),
daemon->namebuff);
}
}
else
{
listeners = new;
if (listen(new->tcpfd, 5) == -1)
die("failed to listen on socket: %s", NULL);
die(_("failed to listen on socket: %s"), NULL);
}
}
@@ -486,9 +384,8 @@ struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **sfds)
return sfd;
}
void check_servers(struct daemon *daemon, struct irec *interfaces)
void check_servers(struct daemon *daemon)
{
char addrbuff[ADDRSTRLEN];
struct irec *iface;
struct server *new, *tmp, *ret = NULL;
int port = 0;
@@ -496,7 +393,7 @@ void check_servers(struct daemon *daemon, struct irec *interfaces)
/* forward table rules reference servers, so have to blow them away */
forward_init(0);
daemon->last_server = NULL;
daemon->last_server = daemon->srv_save = NULL;
for (new = daemon->servers; new; new = tmp)
{
@@ -504,27 +401,14 @@ void check_servers(struct daemon *daemon, struct irec *interfaces)
if (!(new->flags & (SERV_LITERAL_ADDRESS | SERV_NO_ADDR)))
{
#ifdef HAVE_IPV6
if (new->addr.sa.sa_family == AF_INET)
{
inet_ntop(AF_INET, &new->addr.in.sin_addr, addrbuff, ADDRSTRLEN);
port = ntohs(new->addr.in.sin_port);
}
else if (new->addr.sa.sa_family == AF_INET6)
{
inet_ntop(AF_INET6, &new->addr.in6.sin6_addr, addrbuff, ADDRSTRLEN);
port = ntohs(new->addr.in6.sin6_port);
}
#else
strcpy(addrbuff, inet_ntoa(new->addr.in.sin_addr));
port = ntohs(new->addr.in.sin_port);
#endif
for (iface = interfaces; iface; iface = iface->next)
port = prettyprint_addr(&new->addr, daemon->namebuff);
for (iface = daemon->interfaces; iface; iface = iface->next)
if (sockaddr_isequal(&new->addr, &iface->addr))
break;
if (iface)
{
syslog(LOG_WARNING, "ignoring nameserver %s - local interface", addrbuff);
syslog(LOG_WARNING, _("ignoring nameserver %s - local interface"), daemon->namebuff);
free(new);
continue;
}
@@ -533,7 +417,7 @@ void check_servers(struct daemon *daemon, struct irec *interfaces)
if (!new->sfd && !(new->sfd = allocate_sfd(&new->source_addr, &daemon->sfds)))
{
syslog(LOG_WARNING,
"ignoring nameserver %s - cannot make/bind socket: %m", addrbuff);
_("ignoring nameserver %s - cannot make/bind socket: %m"), daemon->namebuff);
free(new);
continue;
}
@@ -547,17 +431,17 @@ void check_servers(struct daemon *daemon, struct irec *interfaces)
{
char *s1, *s2;
if (new->flags & SERV_HAS_DOMAIN)
s1 = "domain", s2 = new->domain;
s1 = _("domain"), s2 = new->domain;
else
s1 = "unqualified", s2 = "domains";
s1 = _("unqualified"), s2 = _("domains");
if (new->flags & SERV_NO_ADDR)
syslog(LOG_INFO, "using local addresses only for %s %s", s1, s2);
syslog(LOG_INFO, _("using local addresses only for %s %s"), s1, s2);
else if (!(new->flags & SERV_LITERAL_ADDRESS))
syslog(LOG_INFO, "using nameserver %s#%d for %s %s", addrbuff, port, s1, s2);
syslog(LOG_INFO, _("using nameserver %s#%d for %s %s"), daemon->namebuff, port, s1, s2);
}
else
syslog(LOG_INFO, "using nameserver %s#%d", addrbuff, port);
syslog(LOG_INFO, _("using nameserver %s#%d"), daemon->namebuff, port);
}
daemon->servers = ret;
@@ -594,11 +478,11 @@ void reload_servers(char *fname, struct daemon *daemon)
f = fopen(fname, "r");
if (!f)
{
syslog(LOG_ERR, "failed to read %s: %m", fname);
syslog(LOG_ERR, _("failed to read %s: %m"), fname);
}
else
{
syslog(LOG_INFO, "reading %s", fname);
syslog(LOG_INFO, _("reading %s"), fname);
while ((line = fgets(daemon->namebuff, MAXDNAME, f)))
{
union mysockaddr addr, source_addr;
@@ -611,13 +495,13 @@ void reload_servers(char *fname, struct daemon *daemon)
continue;
#ifdef HAVE_IPV6
if (inet_pton(AF_INET, token, &addr.in.sin_addr))
if (inet_pton(AF_INET, token, &addr.in.sin_addr) > 0)
#else
if ((addr.in.sin_addr.s_addr = inet_addr(token)) != (in_addr_t) -1)
#endif
{
#ifdef HAVE_SOCKADDR_SA_LEN
source_addr.in.sin_len = addr.in.sin_len = sizeof(struct sockaddr_in);
source_addr.in.sin_len = addr.in.sin_len = sizeof(source_addr.in);
#endif
source_addr.in.sin_family = addr.in.sin_family = AF_INET;
addr.in.sin_port = htons(NAMESERVER_PORT);
@@ -625,14 +509,15 @@ void reload_servers(char *fname, struct daemon *daemon)
source_addr.in.sin_port = htons(daemon->query_port);
}
#ifdef HAVE_IPV6
else if (inet_pton(AF_INET6, token, &addr.in6.sin6_addr))
else if (inet_pton(AF_INET6, token, &addr.in6.sin6_addr) > 0)
{
#ifdef HAVE_SOCKADDR_SA_LEN
source_addr.in6.sin6_len = addr.in6.sin6_len = sizeof(struct sockaddr_in6);
source_addr.in6.sin6_len = addr.in6.sin6_len = sizeof(source_addr.in6);
#endif
source_addr.in6.sin6_family = addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_port = htons(NAMESERVER_PORT);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = htonl(0);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = 0;
source_addr.in6.sin6_scope_id = addr.in6.sin6_scope_id = 0;
source_addr.in6.sin6_addr = in6addr_any;
source_addr.in6.sin6_port = htons(daemon->query_port);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000 Simon Kelley
/* dnsmasq is Copyright (c) 2000 - 2005 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -14,13 +14,13 @@
static int add_resource_record(HEADER *header, char *limit, int *truncp,
unsigned int nameoffset, unsigned char **pp,
unsigned long ttl, int *offset, unsigned short type,
unsigned long ttl, unsigned int *offset, unsigned short type,
unsigned short class, char *format, ...);
static int extract_name(HEADER *header, unsigned int plen, unsigned char **pp,
unsigned char *name, int isExtract)
static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
char *name, int isExtract)
{
unsigned char *cp = name, *p = *pp, *p1 = NULL;
unsigned char *cp = (unsigned char *)name, *p = *pp, *p1 = NULL;
unsigned int j, l, hops = 0;
int retvalue = 1;
@@ -32,13 +32,13 @@ static int extract_name(HEADER *header, unsigned int plen, unsigned char **pp,
unsigned int label_type = l & 0xc0;
if (label_type == 0xc0) /* pointer */
{
if (p - (unsigned char *)header + 1u >= plen)
if ((size_t)(p - (unsigned char *)header + 1) >= plen)
return 0;
/* get offset */
l = (l&0x3f) << 8;
l |= *p++;
if (l >= (unsigned int)plen)
if (l >= plen)
return 0;
if (!p1) /* first jump, save location to go back to */
@@ -68,9 +68,9 @@ static int extract_name(HEADER *header, unsigned int plen, unsigned char **pp,
digs = ((count-1)>>2)+1;
/* output is \[x<hex>/siz]. which is digs+9 chars */
if (cp - name + digs + 9 >= MAXDNAME)
if (cp - (unsigned char *)name + digs + 9 >= MAXDNAME)
return 0;
if (p - (unsigned char *)header + ((count-1)>>3) + 1u >= plen)
if ((size_t)(p - (unsigned char *)header + ((count-1)>>3) + 1) >= plen)
return 0;
*cp++ = '\\';
@@ -86,15 +86,15 @@ static int extract_name(HEADER *header, unsigned int plen, unsigned char **pp,
*cp++ = dig < 10 ? dig + '0' : dig + 'A' - 10;
}
cp += sprintf(cp, "/%d]", count);
cp += sprintf((char *)cp, "/%d]", count);
/* do this here to overwrite the zero char from sprintf */
*cp++ = '.';
}
else
{ /* label_type = 0 -> label. */
if (cp - name + l + 1 >= MAXDNAME)
if (cp - (unsigned char *)name + l + 1 >= MAXDNAME)
return 0;
if (p - (unsigned char *)header + 1u >= plen)
if ((size_t)(p - (unsigned char *)header + 1) >= plen)
return 0;
for(j=0; j<l; j++, p++)
if (isExtract)
@@ -134,7 +134,11 @@ static int extract_name(HEADER *header, unsigned int plen, unsigned char **pp,
}
if (isExtract)
*--cp = 0; /* terminate: lose final period */
{
if (cp != (unsigned char *)name)
cp--;
*cp = 0; /* terminate: lose final period */
}
else if (*cp != 0)
retvalue = 2;
@@ -253,7 +257,7 @@ static int in_arpa_name_2_addr(char *namein, struct all_addr *addrp)
return 0;
}
static unsigned char *skip_name(unsigned char *ansp, HEADER *header, unsigned int plen)
static unsigned char *skip_name(unsigned char *ansp, HEADER *header, size_t plen)
{
while(1)
{
@@ -298,7 +302,7 @@ static unsigned char *skip_name(unsigned char *ansp, HEADER *header, unsigned in
return ansp;
}
static unsigned char *skip_questions(HEADER *header, unsigned int plen)
static unsigned char *skip_questions(HEADER *header, size_t plen)
{
int q, qdcount = ntohs(header->qdcount);
unsigned char *ansp = (unsigned char *)(header+1);
@@ -315,7 +319,7 @@ static unsigned char *skip_questions(HEADER *header, unsigned int plen)
return ansp;
}
static unsigned char *skip_section(unsigned char *ansp, int count, HEADER *header, unsigned int plen)
static unsigned char *skip_section(unsigned char *ansp, int count, HEADER *header, size_t plen)
{
int i, rdlen;
@@ -333,26 +337,54 @@ static unsigned char *skip_section(unsigned char *ansp, int count, HEADER *heade
return ansp;
}
/* CRC all the bytes of the question section. This is used to
safely detect query retransmision. */
unsigned int questions_crc(HEADER *header, unsigned int plen)
/* CRC the question section. This is used to safely detect query
retransmision and to detect answers to questions we didn't ask, which
might be poisoning attacks. Note that we decode the name rather
than CRC the raw bytes, since replies might be compressed differently.
We ignore case in the names for the same reason. */
unsigned int questions_crc(HEADER *header, size_t plen, char *name)
{
unsigned char *start, *end = skip_questions(header, plen);
int q;
unsigned int crc = 0xffffffff;
unsigned char *p1, *p = (unsigned char *)(header+1);
for (q = 0; q < ntohs(header->qdcount); q++)
{
if (!extract_name(header, plen, &p, name, 1))
return crc; /* bad packet */
for (p1 = (unsigned char *)name; *p1; p1++)
{
int i = 8;
char c = *p1;
if (c >= 'A' && c <= 'Z')
c += 'a' - 'A';
crc ^= c << 24;
while (i--)
crc = crc & 0x80000000 ? (crc << 1) ^ 0x04c11db7 : crc << 1;
}
/* CRC the class and type as well */
for (p1 = p; p1 < p+4; p1++)
{
int i = 8;
crc ^= *p1 << 24;
while (i--)
crc = crc & 0x80000000 ? (crc << 1) ^ 0x04c11db7 : crc << 1;
}
p += 4;
if ((unsigned int)(p - (unsigned char *)header) > plen)
return crc; /* bad packet */
}
if (end)
for (start = (unsigned char *)(header+1); start < end; start++)
{
int i = 8;
crc ^= *start << 24;
while (i--)
crc = crc & 0x80000000 ? (crc << 1) ^ 0x04c11db7 : crc << 1;
}
return crc;
}
int resize_packet(HEADER *header, unsigned int plen, unsigned char *pheader, unsigned int hlen)
size_t resize_packet(HEADER *header, size_t plen, unsigned char *pheader, size_t hlen)
{
unsigned char *ansp = skip_questions(header, plen);
@@ -375,7 +407,7 @@ int resize_packet(HEADER *header, unsigned int plen, unsigned char *pheader, uns
return ansp - (unsigned char *)header;
}
unsigned char *find_pseudoheader(HEADER *header, unsigned int plen, unsigned int *len, unsigned char **p)
unsigned char *find_pseudoheader(HEADER *header, size_t plen, size_t *len, unsigned char **p)
{
/* See if packet has an RFC2671 pseudoheader, and if so return a pointer to it.
also return length of pseudoheader in *len and pointer to the UDP size in *p */
@@ -400,7 +432,7 @@ unsigned char *find_pseudoheader(HEADER *header, unsigned int plen, unsigned int
save = ansp;
ansp += 6; /* class, TTL */
GETSHORT(rdlen, ansp);
if ((unsigned int)(ansp + rdlen - (unsigned char *)header) > plen)
if ((size_t)(ansp + rdlen - (unsigned char *)header) > plen)
return NULL;
ansp += rdlen;
if (type == T_OPT)
@@ -437,14 +469,12 @@ static void dns_doctor(HEADER *header, struct doctor *doctor, struct in_addr *ad
addr->s_addr &= ~doctor->mask.s_addr;
addr->s_addr |= (doctor->out.s_addr & doctor->mask.s_addr);
/* Since we munged the data, the server it came from is no longer authoritative */
header->nscount = htons(0);
header->arcount = htons(0);
header->aa = 0;
break;
}
}
static int find_soa(HEADER *header, unsigned int qlen)
static int find_soa(HEADER *header, struct doctor *doctor, size_t qlen)
{
unsigned char *p;
int qtype, qclass, rdlen;
@@ -487,22 +517,50 @@ static int find_soa(HEADER *header, unsigned int qlen)
else
p += rdlen;
if ((unsigned int)(p - (unsigned char *)header) > qlen)
if ((size_t)(p - (unsigned char *)header) > qlen)
return 0; /* bad packet */
}
if (doctor)
for (i=0; i<ntohs(header->arcount); i++)
{
if (!(p = skip_name(p, header, qlen)))
return 0; /* bad packet */
GETSHORT(qtype, p);
GETSHORT(qclass, p);
GETLONG(ttl, p);
GETSHORT(rdlen, p);
if ((qclass == C_IN) && (qtype == T_A))
dns_doctor(header, doctor, (struct in_addr *)p);
p += rdlen;
if ((size_t)(p - (unsigned char *)header) > qlen)
return 0; /* bad packet */
}
return found_soa ? minttl : 0;
}
/* Note that the following code can create CNAME chains that don't point to a real record,
either because of lack of memory, or lack of SOA records. These are treated by the cache code as
expired and cleaned out that way. */
void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now, struct daemon *daemon)
void extract_addresses(HEADER *header, size_t qlen, char *name, time_t now, struct daemon *daemon)
{
unsigned char *p, *p1, *endrr;
int i, j, qtype, qclass, aqtype, aqclass, ardlen, res, searched_soa = 0;
unsigned long ttl = 0;
cache_start_insert();
/* find_soa is needed for dns_doctor side-effects, so don't call it lazily if there are any. */
if (daemon->doctors)
{
searched_soa = 1;
ttl = find_soa(header, daemon->doctors, qlen);
}
/* go through the questions. */
p = (unsigned char *)(header+1);
@@ -512,7 +570,7 @@ void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now
int found = 0, cname_count = 5;
struct crec *cpp = NULL;
int flags = header->rcode == NXDOMAIN ? F_NXDOMAIN : 0;
unsigned long cttl = ULONG_MAX, attl, ttl = 0;
unsigned long cttl = ULONG_MAX, attl;
if (!extract_name(header, qlen, &p, name, 1))
return; /* bad packet */
@@ -571,7 +629,7 @@ void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now
}
p1 = endrr;
if ((unsigned int)(p1 - (unsigned char *)header) > qlen)
if ((size_t)(p1 - (unsigned char *)header) > qlen)
return; /* bad packet */
}
}
@@ -581,7 +639,7 @@ void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now
if (!searched_soa)
{
searched_soa = 1;
ttl = find_soa(header, qlen);
ttl = find_soa(header, NULL, qlen);
}
if (ttl)
cache_insert(name, &addr, now, ttl, name_encoding | F_REVERSE | F_NEG | flags);
@@ -655,7 +713,7 @@ void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now
}
p1 = endrr;
if ((unsigned int)(p1 - (unsigned char *)header) > qlen)
if ((size_t)(p1 - (unsigned char *)header) > qlen)
return; /* bad packet */
}
}
@@ -665,7 +723,7 @@ void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now
if (!searched_soa)
{
searched_soa = 1;
ttl = find_soa(header, qlen);
ttl = find_soa(header, NULL, qlen);
}
/* If there's no SOA to get the TTL from, but there is a CNAME
pointing at this, inherit it's TTL */
@@ -688,7 +746,7 @@ void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now
/* If the packet holds exactly one query
return 1 and leave the name from the query in name. */
unsigned short extract_request(HEADER *header,unsigned int qlen, char *name, unsigned short *typep)
unsigned short extract_request(HEADER *header, size_t qlen, char *name, unsigned short *typep)
{
unsigned char *p = (unsigned char *)(header+1);
int qtype, qclass;
@@ -705,11 +763,11 @@ unsigned short extract_request(HEADER *header,unsigned int qlen, char *name, uns
GETSHORT(qtype, p);
GETSHORT(qclass, p);
if (typep)
*typep = qtype;
if (qclass == C_IN)
{
if (typep)
*typep = qtype;
if (qtype == T_A)
return F_IPV4;
if (qtype == T_AAAA)
@@ -722,7 +780,7 @@ unsigned short extract_request(HEADER *header,unsigned int qlen, char *name, uns
}
int setup_reply(HEADER *header, unsigned int qlen,
size_t setup_reply(HEADER *header, size_t qlen,
struct all_addr *addrp, unsigned short flags, unsigned long ttl)
{
unsigned char *p = skip_questions(header, qlen);
@@ -766,28 +824,28 @@ int setup_reply(HEADER *header, unsigned int qlen,
int check_for_local_domain(char *name, time_t now, struct daemon *daemon)
{
struct crec *crecp;
struct mx_record *mx;
struct srv_record *srv;
struct mx_srv_record *mx;
struct txt_record *txt;
if ((crecp = cache_find_by_name(NULL, name, now, F_IPV4 | F_IPV6)) &&
(crecp->flags & (F_HOSTS | F_DHCP)))
return 1;
for (mx = daemon->mxnames; mx; mx = mx->next)
if (hostname_isequal(name, mx->mxname))
if (hostname_isequal(name, mx->name))
return 1;
for (srv = daemon->srvnames; srv; srv = srv->next)
if (hostname_isequal(name, srv->srvname))
for (txt = daemon->txt; txt; txt = txt->next)
if (hostname_isequal(name, txt->name))
return 1;
return 0;
}
/* Is the packet a reply with the answer address equal to addr?
If so mung is into an NXDOMAIN reply and also put that information
in the cache. */
int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name,
int check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name,
struct bogus_addr *baddr, time_t now)
{
unsigned char *p;
@@ -829,7 +887,7 @@ int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name,
}
static int add_resource_record(HEADER *header, char *limit, int *truncp, unsigned int nameoffset, unsigned char **pp,
unsigned long ttl, int *offset, unsigned short type, unsigned short class, char *format, ...)
unsigned long ttl, unsigned int *offset, unsigned short type, unsigned short class, char *format, ...)
{
va_list ap;
unsigned char *sav, *p = *pp;
@@ -880,25 +938,17 @@ static int add_resource_record(HEADER *header, char *limit, int *truncp, unsigne
case 'd':
/* get domain-name answer arg and store it in RDATA field */
sval = va_arg(ap, char *);
while (sval && *sval)
{
unsigned char *cp = p++;
for (j = 0; *sval && (*sval != '.'); sval++, j++)
*p++ = *sval;
*cp = j;
if (*sval)
sval++;
}
if (offset)
*offset = p - (unsigned char *)header;
p = do_rfc1035_name(p, va_arg(ap, char *));
*p++ = 0;
break;
case 't':
usval = va_arg(ap, int);
sval = va_arg(ap, char *);
j = strlen(sval);
*p++ = j;
memcpy(p, sval, j);
p += j;
memcpy(p, sval, usval);
p += usval;
break;
}
@@ -907,9 +957,6 @@ static int add_resource_record(HEADER *header, char *limit, int *truncp, unsigne
j = p - sav - 2;
PUTSHORT(j, sav); /* Now, store real RDLength */
if (offset)
*offset = sav - (unsigned char *)header;
/* check for overflow of buffer */
if (limit && ((unsigned char *)limit - p) < 0)
{
@@ -923,8 +970,8 @@ static int add_resource_record(HEADER *header, char *limit, int *truncp, unsigne
}
/* return zero if we can't answer from cache, or packet size if we can */
int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon *daemon,
struct in_addr local_addr, struct in_addr local_netmask, time_t now)
size_t answer_request(HEADER *header, char *limit, size_t qlen, struct daemon *daemon,
struct in_addr local_addr, struct in_addr local_netmask, time_t now)
{
char *name = daemon->namebuff;
unsigned char *p, *ansp, *pheader;
@@ -933,11 +980,12 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
unsigned int nameoffset;
unsigned short flag;
int qdcount = ntohs(header->qdcount);
int q, ans, anscount = 0;
int q, ans, anscount = 0, addncount = 0;
int dryrun = 0, sec_reqd = 0;
struct crec *crecp;
int nxdomain = 0, auth = 1, trunc = 0;
struct mx_srv_record *rec;
if (!qdcount || header->opcode != QUERY )
return 0;
@@ -968,6 +1016,9 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
dryrun = 1;
}
for (rec = daemon->mxnames; rec; rec = rec->next)
rec->offset = 0;
rerun:
/* determine end of question section (we put answers there) */
if (!(ansp = skip_questions(header, qlen)))
@@ -994,27 +1045,28 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
ans = 0; /* have we answered this question */
if (qclass == C_CHAOS && qtype == T_TXT)
/* special query to get version. */
if (qtype == T_TXT || qtype == T_ANY)
{
ans = 1;
if (!dryrun)
struct txt_record *t;
for(t = daemon->txt; t ; t = t->next)
{
if (hostname_isequal(name, "version.bind"))
sprintf(name, "dnsmasq-%s", VERSION);
else if (hostname_isequal(name, "authors.bind"))
sprintf(name, "Simon Kelley");
else if (hostname_isequal(name, "copyright.bind"))
sprintf(name, COPYRIGHT);
else
*name = 0;
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, 0, NULL,
T_TXT, C_CHAOS, "t", name))
anscount++;
}
}
if (t->class == qclass && hostname_isequal(name, t->name))
{
ans = 1;
if (!dryrun)
{
log_query(F_CNAME | F_FORWARD | F_CONFIG | F_NXDOMAIN, name, NULL, 0, NULL, 0);
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
daemon->local_ttl, NULL,
T_TXT, t->class, "t", t->len, t->txt))
anscount++;
else if (qclass == C_IN)
}
}
}
}
if (qclass == C_IN)
{
if (qtype == T_PTR || qtype == T_ANY)
{
@@ -1073,17 +1125,31 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
for (flag = F_IPV4; flag; flag = (flag == F_IPV4) ? F_IPV6 : 0)
{
unsigned short type = T_A;
if (flag == F_IPV6)
#ifdef HAVE_IPV6
type = T_AAAA;
type = T_AAAA;
#else
break;
break;
#endif
if (qtype != type && qtype != T_ANY)
continue;
/* Check for "A for A" queries. */
if (qtype == T_A && (addr.addr.addr4.s_addr = inet_addr(name)) != (in_addr_t) -1)
{
ans = 1;
if (!dryrun)
{
log_query(F_FORWARD | F_CONFIG | F_IPV4, name, &addr, 0, NULL, 0);
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
daemon->local_ttl, NULL, type, C_IN, "4", &addr))
anscount++;
}
continue;
}
cname_restart:
if ((crecp = cache_find_by_name(NULL, name, now, flag | F_CNAME)))
{
@@ -1172,18 +1238,21 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
if (qtype == T_MX || qtype == T_ANY)
{
int found = 0;
struct mx_record *mx;
for (mx = daemon->mxnames; mx; mx = mx->next)
if (hostname_isequal(name, mx->mxname))
for (rec = daemon->mxnames; rec; rec = rec->next)
if (!rec->issrv && hostname_isequal(name, rec->name))
{
ans = found = 1;
if (!dryrun)
{
unsigned int offset;
log_query(F_CNAME | F_FORWARD | F_CONFIG | F_IPV4, name, NULL, 0, NULL, 0);
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl, NULL,
T_MX, C_IN, "sd", mx->preference,
mx->mxtarget ? mx->mxtarget : daemon->mxtarget))
anscount++;
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl,
&offset, T_MX, C_IN, "sd", rec->weight, rec->target))
{
anscount++;
if (rec->target)
rec->offset = offset;
}
}
}
@@ -1205,19 +1274,23 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
if (qtype == T_SRV || qtype == T_ANY)
{
int found = 0;
struct srv_record *srv;
for (srv = daemon->srvnames; srv; srv = srv->next)
if (hostname_isequal(name, srv->srvname))
for (rec = daemon->mxnames; rec; rec = rec->next)
if (rec->issrv && hostname_isequal(name, rec->name))
{
found = ans = 1;
if (!dryrun)
{
unsigned int offset;
log_query(F_CNAME | F_FORWARD | F_CONFIG | F_IPV6, name, NULL, 0, NULL, 0);
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl,
NULL, T_SRV, C_IN, "sssd",
srv->priority, srv->weight, srv->srvport, srv->srvtarget))
anscount++;
&offset, T_SRV, C_IN, "sssd",
rec->priority, rec->weight, rec->srvport, rec->target))
{
anscount++;
if (rec->target)
rec->offset = offset;
}
}
}
@@ -1250,6 +1323,39 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
goto rerun;
}
/* create an additional data section, for stuff in SRV and MX record replies. */
for (rec = daemon->mxnames; rec; rec = rec->next)
if (rec->offset != 0)
{
/* squash dupes */
struct mx_srv_record *tmp;
for (tmp = rec->next; tmp; tmp = tmp->next)
if (tmp->offset != 0 && hostname_isequal(rec->target, tmp->target))
tmp->offset = 0;
crecp = NULL;
while ((crecp = cache_find_by_name(crecp, rec->target, now, F_IPV4 | F_IPV6)))
{
unsigned long ttl;
#ifdef HAVE_IPV6
int type = crecp->flags & F_IPV4 ? T_A : T_AAAA;
#else
int type = T_A;
#endif
if (crecp->flags & F_NEG)
continue;
if (crecp->flags & (F_IMMORTAL | F_DHCP))
ttl = daemon->local_ttl;
else
ttl = crecp->ttd - now;
if (add_resource_record(header, limit, NULL, rec->offset, &ansp, ttl, NULL, type, C_IN,
crecp->flags & F_IPV4 ? "4" : "6", &crecp->addr))
addncount++;
}
}
/* done all questions, set up header and return length of result */
header->qr = 1; /* response */
header->aa = auth; /* authoritive - only hosts and DHCP derived names. */
@@ -1261,7 +1367,7 @@ int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon
header->rcode = NOERROR; /* no error */
header->ancount = htons(anscount);
header->nscount = htons(0);
header->arcount = htons(0);
header->arcount = htons(addncount);
return ansp - (unsigned char *)header;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000 Simon Kelley
/* dnsmasq is Copyright (c) 2000 - 2005 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -15,6 +15,10 @@
#include "dnsmasq.h"
#ifdef HAVE_BROKEN_RTC
#include <sys/times.h>
#endif
/* Prefer arc4random(3) over random(3) over rand(3) */
/* Also prefer /dev/urandom over /dev/random, to preserve the entropy pool */
#ifdef HAVE_ARC4RANDOM
@@ -85,18 +89,6 @@ unsigned short rand16(void)
return( (unsigned short) (rand() >> 15) );
}
int atoi_check(char *a, int *res)
{
char *p;
for (p = a; *p; p++)
if (*p < '0' || *p > '9')
return 0;
*res = atoi(a);
return 1;
}
int legal_char(char c)
{
/* check for legal char a-z A-Z 0-9 -
@@ -114,7 +106,7 @@ int canonicalise(char *s)
{
/* check for legal chars and remove trailing .
also fail empty string and label > 63 chars */
int dotgap = 0, l = strlen(s);
size_t dotgap = 0, l = strlen(s);
char c;
if (l == 0 || l > MAXDNAME) return 0;
@@ -125,40 +117,45 @@ int canonicalise(char *s)
s[l-1] = 0;
}
while ((c = *s++))
if (c == '.')
dotgap = 0;
else if (!legal_char(c) || (++dotgap > MAXLABEL))
return 0;
while ((c = *s))
{
if (c == '.')
dotgap = 0;
else if (!legal_char(c) || (++dotgap > MAXLABEL))
return 0;
s++;
}
return 1;
}
unsigned char *do_rfc1035_name(unsigned char *p, char *sval)
{
int j;
while (sval && *sval)
{
unsigned char *cp = p++;
for (j = 0; *sval && (*sval != '.'); sval++, j++)
*p++ = *sval;
*cp = j;
if (*sval)
sval++;
}
return p;
}
/* for use during startup */
void *safe_malloc(int size)
void *safe_malloc(size_t size)
{
void *ret = malloc(size);
if (!ret)
die("could not get memory", NULL);
die(_("could not get memory"), NULL);
return ret;
}
char *safe_string_alloc(char *cp)
{
char *ret = NULL;
}
if (cp && strlen(cp) != 0)
{
ret = safe_malloc(strlen(cp)+1);
strcpy(ret, cp);
}
return ret;
}
void complain(char *message, char *arg1)
static void log_err(char *message, char *arg1)
{
char *errmess = strerror(errno);
@@ -172,10 +169,18 @@ void complain(char *message, char *arg1)
syslog(LOG_CRIT, message, arg1, errmess);
}
void complain(char *message, int lineno, char *file)
{
char buff[256];
sprintf(buff, _("%s at line %d of %%s"), message, lineno);
log_err(buff, file);
}
void die(char *message, char *arg1)
{
complain(message, arg1);
syslog(LOG_CRIT, "FAILED to start up");
log_err(message, arg1);
syslog(LOG_CRIT, _("FAILED to start up"));
exit(1);
}
@@ -185,13 +190,12 @@ int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2)
{
if (s1->sa.sa_family == AF_INET &&
s1->in.sin_port == s2->in.sin_port &&
memcmp(&s1->in.sin_addr, &s2->in.sin_addr, sizeof(struct in_addr)) == 0)
s1->in.sin_addr.s_addr == s2->in.sin_addr.s_addr)
return 1;
#ifdef HAVE_IPV6
if (s1->sa.sa_family == AF_INET6 &&
s1->in6.sin6_port == s2->in6.sin6_port &&
s1->in6.sin6_flowinfo == s2->in6.sin6_flowinfo &&
memcmp(&s1->in6.sin6_addr, &s2->in6.sin6_addr, sizeof(struct in6_addr)) == 0)
IN6_ARE_ADDR_EQUAL(&s1->in6.sin6_addr, &s2->in6.sin6_addr))
return 1;
#endif
}
@@ -213,13 +217,13 @@ int sa_len(union mysockaddr *addr)
}
/* don't use strcasecmp and friends here - they may be messed up by LOCALE */
int hostname_isequal(unsigned char *a, unsigned char *b)
int hostname_isequal(char *a, char *b)
{
unsigned int c1, c2;
do {
c1 = *a++;
c2 = *b++;
c1 = (unsigned char) *a++;
c2 = (unsigned char) *b++;
if (c1 >= 'A' && c1 <= 'Z')
c1 += 'a' - 'A';
@@ -233,18 +237,17 @@ int hostname_isequal(unsigned char *a, unsigned char *b)
return 1;
}
time_t dnsmasq_time(int fd)
time_t dnsmasq_time(void)
{
#ifdef HAVE_BROKEN_RTC
/* we use uptime as a time-base, rather than epoch time
because epoch time can break when a machine contacts
a nameserver and updates it. */
char buf[30];
lseek(fd, 0, SEEK_SET);
read(fd, buf, 30);
return (time_t)atol(buf);
struct tms dummy;
static long tps = 0;
if (tps == 0)
tps = sysconf(_SC_CLK_TCK);
return (time_t)(times(&dummy)/tps);
#else
fd = 0; /* stop warning */
return time(NULL);
#endif
}
@@ -270,3 +273,126 @@ int retry_send(void)
return 0;
}
/* returns port number from address */
int prettyprint_addr(union mysockaddr *addr, char *buf)
{
int port = 0;
#ifdef HAVE_IPV6
if (addr->sa.sa_family == AF_INET)
{
inet_ntop(AF_INET, &addr->in.sin_addr, buf, ADDRSTRLEN);
port = ntohs(addr->in.sin_port);
}
else if (addr->sa.sa_family == AF_INET6)
{
inet_ntop(AF_INET6, &addr->in6.sin6_addr, buf, ADDRSTRLEN);
port = ntohs(addr->in6.sin6_port);
}
#else
strcpy(buf, inet_ntoa(addr->in.sin_addr));
port = ntohs(addr->in.sin_port);
#endif
return port;
}
void prettyprint_time(char *buf, unsigned int t)
{
if (t == 0xffffffff)
sprintf(buf, _("infinite"));
else
{
unsigned int x, p = 0;
if ((x = t/86400))
p += sprintf(&buf[p], "%dd", x);
if ((x = (t/3600)%24))
p += sprintf(&buf[p], "%dh", x);
if ((x = (t/60)%60))
p += sprintf(&buf[p], "%dm", x);
if ((x = t%60))
p += sprintf(&buf[p], "%ds", x);
}
}
/* in may equal out, when maxlen may be -1 (No max len). */
int parse_hex(char *in, unsigned char *out, int maxlen,
unsigned int *wildcard_mask, int *mac_type)
{
int mask = 0, i = 0;
char *r;
if (mac_type)
*mac_type = 0;
while (maxlen == -1 || i < maxlen)
{
for (r = in; *r != 0 && *r != ':' && *r != '-'; r++);
if (*r == 0)
maxlen = i;
if (r != in )
{
if (*r == '-' && i == 0 && mac_type)
{
*r = 0;
*mac_type = strtol(in, NULL, 16);
mac_type = NULL;
}
else
{
*r = 0;
mask = mask << 1;
if (strcmp(in, "*") == 0)
mask |= 1;
else
out[i] = strtol(in, NULL, 16);
i++;
}
}
in = r+1;
}
if (wildcard_mask)
*wildcard_mask = mask;
return i;
}
int memcmp_masked(unsigned char *a, unsigned char *b, int len, unsigned int mask)
{
int i;
for (i = len - 1; i >= 0; i--, mask = mask >> 1)
if (!(mask & 1) && a[i] != b[i])
return 0;
return 1;
}
/* _note_ may copy buffer */
int expand_buf(struct iovec *iov, size_t size)
{
void *new;
if (size <= iov->iov_len)
return 1;
if (!(new = malloc(size)))
{
errno = ENOMEM;
return 0;
}
if (iov->iov_base)
{
memcpy(new, iov->iov_base, iov->iov_len);
free(iov->iov_base);
}
iov->iov_base = new;
iov->iov_len = size;
return 1;
}