Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7cebd20fe7 | ||
|
|
26d0dbaf24 | ||
|
|
309331f52c | ||
|
|
5e9e0efb01 | ||
|
|
cdeda28f82 | ||
|
|
aedef83058 | ||
|
|
e17fb629a2 | ||
|
|
b8187c80a8 | ||
|
|
3d8df260e1 | ||
|
|
91dccd0958 | ||
|
|
0a852541d3 | ||
|
|
f6b7dc47c7 | ||
|
|
bb01cb9604 | ||
|
|
59353a6b56 | ||
|
|
26128d2747 | ||
|
|
fd9fa4811d | ||
|
|
36717eeefc | ||
|
|
3be34541c2 | ||
|
|
9c74ec03ca | ||
|
|
c1bb85048b | ||
|
|
dfa666f24b | ||
|
|
feba5c1d25 | ||
|
|
de37951cf4 | ||
|
|
a222641cb0 | ||
|
|
a84fa1d085 | ||
|
|
33820b7ed9 | ||
|
|
8a911ccc75 | ||
|
|
1cff166d37 | ||
|
|
44a2a3165c |
256
FAQ
256
FAQ
@@ -20,12 +20,9 @@ A: The high ports that dnsmasq opens is for replies from the upstream
|
||||
Q: Why doesn't dnsmasq support DNS queries over TCP? Don't the RFC's specify
|
||||
that?
|
||||
|
||||
A: Yes, they do, so technically dnsmasq is not RFC-compliant. In practice, the
|
||||
sorts of queries which dnsmasq is used for are always sent via UDP. Adding
|
||||
TCP support would make dnsmasq much more heavyweight for no practical
|
||||
benefit. If you really want to do zone transfers, forward port 53 TCP
|
||||
using in-kernel port-forwarding or a port-fowarder like rinetd.
|
||||
|
||||
A: Update: from version 2.10, it does. There are a few limitations:
|
||||
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
|
||||
no IP address and are for names like mymachine.mydomain.com.mydomain.com.
|
||||
@@ -42,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
|
||||
@@ -74,6 +68,8 @@ A: Use the standard DNS convention of <reversed address>.in-addr.arpa.
|
||||
For instance to send reverse queries on the range 192.168.0.0 to
|
||||
192.168.0.255 to a nameserver at 10.0.0.1 do
|
||||
server=/0.168.192.in-addr.arpa/10.0.0.1
|
||||
Note that the "bogus-priv" option take priority over this option,
|
||||
so the above will not work when the bogus-priv option is set.
|
||||
|
||||
Q: Dnsmasq fails to start with an error like this: "dnsmasq: bind
|
||||
failed: Cannot assign requested address". What's the problem?
|
||||
@@ -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,16 +102,26 @@ 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.
|
||||
I shut my machine down and re-load when it starts again?
|
||||
|
||||
A: No, that facility is not provided. Very few names in the DNS have
|
||||
their time-to-live set for longer than a few hours so most of the
|
||||
@@ -181,9 +187,207 @@ A: There are a couple of configuration gotchas which have been
|
||||
and from ports 67 and 68 and broadcast packets with source
|
||||
address 0.0.0.0 and destination address 255.255.255.255 are not
|
||||
dropped by iptables/ipchains.
|
||||
|
||||
Q: I'm running Debian, and my machines get an address fine with DHCP,
|
||||
but their names are not appearing in the DNS.
|
||||
|
||||
A: By default, none of the DHCP clients send the host-name when asking
|
||||
for a lease. For most of the clients, you can set the host-name to
|
||||
send with the "hostname" keyword in /etc/network/interfaces. (See
|
||||
"man interfaces" for details.) That doesn't work for dhclient, were
|
||||
you have to add something like "send host-name daisy" to
|
||||
/etc/dhclient.conf [Update: the lastest dhcpcd packages _do_ send
|
||||
the hostname by default.
|
||||
|
||||
Q: I'm network booting my machines, and trying to give them static
|
||||
DHCP-assigned addresses. The machine gets its correct address
|
||||
whilst booting, but then the OS starts and it seems to get
|
||||
allocated a different address.
|
||||
|
||||
A: What is happening is this: The boot process sends a DHCP
|
||||
request and gets allocated the static address corresponding to its
|
||||
MAC address. The boot loader does not send a client-id. Then the OS
|
||||
starts and repeats the DHCP process, but it it does send a
|
||||
client-id. Dnsmasq cannot assume that the two requests are from the
|
||||
same machine (since the client ID's don't match) and even though
|
||||
the MAC address has a static allocation, that address is still in
|
||||
use by the first incarnation of the machine (the one from the boot,
|
||||
without a client ID.) dnsmasq therefore has to give the machine a
|
||||
dynamic address from its pool. There are three ways to solve this:
|
||||
(1) persuade your DHCP client not to send a client ID, or (2) set up
|
||||
the static assignment to the client ID, not the MAC address. The
|
||||
default client-id will be 01:<MAC address>, so change the dhcp-host
|
||||
line from "dhcp-host=11:22:33:44:55:66,1.2.3.4" to
|
||||
"dhcp-host=id:01:11:22:33:44:55:66,1.2.3.4" or (3) tell dnsmasq to
|
||||
ignore client IDs for a particular MAC address, like this:
|
||||
dhcp-host=11:22:33:44:55:66,id:*
|
||||
|
||||
Q: What network types are supported by the DHCP server?
|
||||
|
||||
A: Ethernet (and 802.11 wireless) are supported on all platforms. On
|
||||
Linux Token Ring is also supported.
|
||||
|
||||
Q: What is this strange "bind-interface" option?
|
||||
|
||||
A: The DNS spec says that the reply to a DNS query must come from the
|
||||
same address it was sent to. The traditional way to write an UDP
|
||||
server to do this is to find all of the addresses belonging to the
|
||||
machine (ie all the interfaces on the machine) and then create a
|
||||
socket for each interface which is bound to the address of the
|
||||
interface. Then when a packet is sent to address A, it is received
|
||||
on the socket bound to address A and when the reply is also sent
|
||||
via that socket, the source address is set to A by the kernel and
|
||||
everything works. This is the how dnsmasq works when
|
||||
"bind-interfaces" is set, with the obvious extension that is misses
|
||||
out creating sockets for some interfaces depending on the
|
||||
--interface, --address and --except-interface flags. The
|
||||
disadvantage of this approach is that it breaks if interfaces don't
|
||||
exist or are not configured when the daemon starts and does the
|
||||
socket creation step. In a hotplug-aware world this is a real
|
||||
problem.
|
||||
|
||||
The alternative approach is to have only one socket, which is bound
|
||||
to the correct port and the wildcard IP address (0.0.0.0). That
|
||||
socket will receive _all_ packets sent to port 53, no matter what
|
||||
destination address they have. This solves the problem of
|
||||
interfaces which are created or reconfigured after daemon
|
||||
start-up. To make this work is more complicated because of the
|
||||
"reply source address" problem. When a UDP packet is sent by a
|
||||
socket bound to 0.0.0.0 its source address will be set to the
|
||||
address of one of the machine's interfaces, but which one is not
|
||||
determined and can vary depending on the OS being run. To get round
|
||||
this it is neccessary to use a scary advanced API to determine the
|
||||
address to which a query was sent, and force that to be the source
|
||||
address in the reply. For IPv4 this stuff in non-portable and quite
|
||||
often not even available (It's different between FreeBSD 5.x and
|
||||
Linux, for instance, and FreeBSD 4.x, Linux 2.0.x and OpenBSD don't
|
||||
have it at all.) Hence "bind-interfaces" has to always be available
|
||||
as a fall back. For IPv6 the API is standard and universally
|
||||
available.
|
||||
|
||||
It could be argued that if the --interface or --address flags are
|
||||
used then binding interfaces is more appropriate, but using
|
||||
wildcard binding means that dnsmasq will quite happily start up
|
||||
after being told to use interfaces which don't exist, but which are
|
||||
created later. Wildcard binding breaks the scenario when dnsmasq is
|
||||
listening on one interface and another server (most probably BIND)
|
||||
is listening on another. It's not possible for BIND to bind to an
|
||||
(address,port) pair when dnsmasq has bound (wildcard,port), hence
|
||||
the ability to explicitly turn off wildcard binding.
|
||||
|
||||
Q: Why doesn't Kerberos work/why can't I get sensible answers to
|
||||
queries for SRV records.
|
||||
|
||||
A: Probably because you have the "filterwin2k" option set. Note that
|
||||
it was on by default in example configuration files included in
|
||||
versions before 2.12, so you might have it set on without
|
||||
realising.
|
||||
|
||||
Q: Can I get email notification when a new version of dnsmasq is
|
||||
released?
|
||||
|
||||
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 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?
|
||||
|
||||
A: See http://www.isc.org/index.pl?/sw/dhcp/authoritative.php - that's
|
||||
for the ISC daemon, but the same applies to dnsmasq.
|
||||
|
||||
Q: Why does my Gentoo box pause for a minute before getting a new
|
||||
lease?
|
||||
|
||||
A: Because when a Gentoo box shuts down, it releases its lease with
|
||||
the server but remembers it on the client; this seems to be a
|
||||
Gentoo-specific patch to dhcpcd. On restart it tries to renew
|
||||
a lease which is long gone, as far as dnsmasq is concerned, and
|
||||
dnsmasq ignores it until is times out and restarts the process.
|
||||
To fix this, set the dhcp-authoritative flag in dnsmasq.
|
||||
|
||||
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?
|
||||
|
||||
A: By default, the identity of a machine is determined by using the
|
||||
MAC address, which is associated with interface hardware. Once an
|
||||
IP is bound to the MAC address of one interface, it cannot be
|
||||
associated with another MAC address until after the DHCP lease
|
||||
expires. The solution to this is to use a client-id as the machine
|
||||
identity rather than the MAC address. If you arrange for the same
|
||||
client-id to sent when either interface is in use, the DHCP server
|
||||
will recognise the same machine, and use the same address. The
|
||||
method for setting the client-id varies with DHCP client software,
|
||||
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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
32
Makefile
32
Makefile
@@ -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 *~ */*~ $(SRC)/*.o $(SRC)/dnsmasq core build
|
||||
rm -f *~ $(SRC)/*.mo contrib/*/*~ */*~ $(SRC)/*.pot
|
||||
rm -f $(SRC)/*.o $(SRC)/dnsmasq core */core
|
||||
|
||||
install : $(SRC)/dnsmasq
|
||||
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
|
||||
|
||||
|
||||
|
||||
@@ -7,9 +7,11 @@ Version 1.x of dnsmasq includes a facility for reading the dhcp.leases
|
||||
file written by ISC dhcpd. This allows the names of machines which
|
||||
have addresses allocated by DHCP to be included in the DNS.
|
||||
|
||||
Version 2.x of dnsmasq removes the ISC dhcpd integration and replaces
|
||||
it with a DHCP server integrated into dnsmasq. This is an incompatible
|
||||
change in dnsmasq but it has the following advantages:
|
||||
Version 2.x of dnsmasq replaces the ISC dhcpd integration with a DHCP
|
||||
server integrated into dnsmasq. Versions 2.0-2.5 removed the ISC
|
||||
integration completely, but in version 2.6 it was re-enabled for
|
||||
backwards compatibility purposes. The change to an integrated DHCP
|
||||
server has the following advantages:
|
||||
|
||||
* Small. ISC dhcpd is a large and comprehensive DHCP solution. The
|
||||
dnsmasq DHCP server adds about 15k to DNS-only dnsmasq and provides
|
||||
@@ -29,7 +31,6 @@ change in dnsmasq but it has the following advantages:
|
||||
with the dnsmasq DHCP server.
|
||||
|
||||
|
||||
|
||||
DHCP configuration
|
||||
------------------
|
||||
|
||||
@@ -55,9 +56,9 @@ in the same way as before.
|
||||
Having started dnsmasq, tell any hosts on the network to renew their
|
||||
DHCP lease, so that dnsmasq's DHCP server becomes aware of them. For
|
||||
Linux, this is best done by killing-and-restarting the DHCP client
|
||||
daemon or taking the network interface down and then back up. For
|
||||
Windows use winipcfg.exe
|
||||
|
||||
daemon or taking the network interface down and then back up. For
|
||||
Windows 9x/Me, use the graphical tool "winipcfg". For Windows
|
||||
NT/2000/XP, use the command-line "ipconfig /renew"
|
||||
|
||||
For more complex DHCP configuration, refer to the doc/setup.html, the
|
||||
dnsmasq manpage and the annotated example configuration file. Also
|
||||
|
||||
18
bld/Makefile
Normal file
18
bld/Makefile
Normal 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) $(COPTS) $(I18N) `echo $(COPTS) | ../bld/pkg-wrapper $(PKG_CONFIG) --cflags dbus-1` $(RPM_OPT_FLAGS) -Wall -W -c $<
|
||||
|
||||
dnsmasq : $(OBJS)
|
||||
$(CC) -o $@ $(OBJS) `echo $(COPTS) | ../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
9
bld/install-man
Executable 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
9
bld/install-mo
Executable 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
7
bld/pkg-wrapper
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
if grep -q "^\#.*define.*HAVE_DBUS" config.h || grep -q HAVE_DBUS ; then
|
||||
exec $*
|
||||
fi
|
||||
|
||||
|
||||
57
contrib/dnslist/dhcp.css
Normal file
57
contrib/dnslist/dhcp.css
Normal file
@@ -0,0 +1,57 @@
|
||||
body
|
||||
{
|
||||
font-family: sans-serif;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
font-size: medium;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h1 .updated
|
||||
{
|
||||
color: #999;
|
||||
}
|
||||
|
||||
table
|
||||
{
|
||||
border-collapse: collapse;
|
||||
border-bottom: 2px solid #000;
|
||||
}
|
||||
|
||||
th
|
||||
{
|
||||
background: #DDD;
|
||||
border-top: 2px solid #000;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Any row */
|
||||
|
||||
tr
|
||||
{
|
||||
border-top: 2px solid #000;
|
||||
}
|
||||
|
||||
/* Any row but the first or second (overrides above rule) */
|
||||
|
||||
tr + tr + tr
|
||||
{
|
||||
border-top: 2px solid #999;
|
||||
}
|
||||
|
||||
tr.offline td.hostname
|
||||
{
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.hostname { width: 10em; }
|
||||
.ip_addr { width: 10em; background: #DDD; }
|
||||
.ether_addr { width: 15em; }
|
||||
.client_id { width: 15em; background: #DDD; }
|
||||
.status { width: 5em; }
|
||||
.since { width: 10em; background: #DDD; }
|
||||
.lease { width: 10em; }
|
||||
608
contrib/dnslist/dnslist.pl
Executable file
608
contrib/dnslist/dnslist.pl
Executable file
@@ -0,0 +1,608 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# dnslist - Read state file from dnsmasq and create a nice web page to display
|
||||
# a list of DHCP clients.
|
||||
#
|
||||
# Copyright (C) 2004 Thomas Tuttle
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program*; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# * The license is in fact included at the end of this file, and can
|
||||
# either be viewed by reading everything after "__DATA__" or by
|
||||
# running dnslist with the '-l' option.
|
||||
#
|
||||
# Version: 0.2
|
||||
# Author: Thomas Tuttle
|
||||
# Email: dnslist.20.thinkinginbinary@spamgourmet.org
|
||||
# License: GNU General Public License, version 2.0
|
||||
#
|
||||
# v. 0.0: Too ugly to publish, thrown out.
|
||||
#
|
||||
# v. 0.1: First rewrite.
|
||||
# Added master host list so offline hosts can still be displayed.
|
||||
# Fixed modification detection (a newer modification time is lower.)
|
||||
#
|
||||
# v. 0.2: Fixed Client ID = "*" => "None"
|
||||
# Fixed HTML entities (a client ID of ????<? screwed it up)
|
||||
# Fixed command-line argument processing (apparently, "shift @ARGV" !=
|
||||
# "$_ = shift @ARGV"...)
|
||||
# Added license information.
|
||||
|
||||
use Template;
|
||||
|
||||
# Location of state file. (This is the dnsmasq default.)
|
||||
# Change with -s <file>
|
||||
my $dnsmasq_state_file = '/var/lib/misc/dnsmasq.leases';
|
||||
# Location of template. (Assumed to be in current directory.)
|
||||
# Change with -t <file>
|
||||
my $html_template_file = 'dnslist.tt2';
|
||||
# File to write HTML page to. (This is where Slackware puts WWW pages. It may
|
||||
# be different on other systems. Make sure the permissions are set correctly
|
||||
# for it.)
|
||||
my $html_output_file = '/var/www/htdocs/dhcp.html';
|
||||
# Time to wait after each page update. (The state file is checked for changes
|
||||
# before each update but is not read in each time, in case it is very big. The
|
||||
# page is rewritten just so the "(updated __/__ __:__:__)" text changes ;-)
|
||||
my $wait_time = 2;
|
||||
|
||||
# Read command-line arguments.
|
||||
while ($_ = shift @ARGV) {
|
||||
if (/-s/) { $dnsmasq_state_file = shift; next; }
|
||||
if (/-t/) { $html_template_file = shift; next; }
|
||||
if (/-o/) { $html_output_file = shift; next; }
|
||||
if (/-d/) { $wait_time = shift; next; }
|
||||
if (/-l/) { show_license(); exit; }
|
||||
die "usage: dnslist [-s state_file] [-t template_file] [-o output_file] [-d delay_time]\n";
|
||||
}
|
||||
|
||||
# Master list of clients, offline and online.
|
||||
my $list = {};
|
||||
# Sorted host list. (It's actually sorted by IP--the sub &byip() compares two
|
||||
# IP addresses, octet by octet, and figures out which is higher.)
|
||||
my @hosts = ();
|
||||
# Last time the state file was changed.
|
||||
my $last_state_change;
|
||||
|
||||
# Check for a change to the state file.
|
||||
sub check_state {
|
||||
if (defined $last_state_change) {
|
||||
if (-M $dnsmasq_state_file < $last_state_change) {
|
||||
print "check_state: state file has been changed.\n";
|
||||
$last_state_change = -M $dnsmasq_state_file;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
# Last change undefined, so we are running for the first time.
|
||||
print "check_state: reading state file at startup.\n";
|
||||
read_state();
|
||||
$last_state_change = -M $dnsmasq_state_file;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
# Read data in state file.
|
||||
sub read_state {
|
||||
my $old;
|
||||
my $new;
|
||||
# Open file.
|
||||
unless (open STATE, $dnsmasq_state_file) {
|
||||
warn "read_state: can't open $dnsmasq_state_file!\n";
|
||||
return 0;
|
||||
}
|
||||
# Mark all hosts as offline, saving old state.
|
||||
foreach $ether (keys %{$list}) {
|
||||
$list->{$ether}->{'old_online'} = $list->{$ether}->{'online'};
|
||||
$list->{$ether}->{'online'} = 0;
|
||||
}
|
||||
# Read hosts.
|
||||
while (<STATE>) {
|
||||
chomp;
|
||||
@host{qw/raw_lease ether_addr ip_addr hostname raw_client_id/} = split /\s+/;
|
||||
$ether = $host{ether_addr};
|
||||
# Mark each online host as online.
|
||||
$list->{$ether}->{'online'} = 1;
|
||||
# Copy data to master list.
|
||||
foreach $key (keys %host) {
|
||||
$list->{$ether}->{$key} = $host{$key};
|
||||
}
|
||||
}
|
||||
close STATE;
|
||||
# Handle changes in offline/online state. (The sub &do_host() handles
|
||||
# all of the extra stuff to do with a host's data once it is read.
|
||||
foreach $ether (keys %{$list}) {
|
||||
$old = $list->{$ether}->{'old_online'};
|
||||
$new = $list->{$ether}->{'online'};
|
||||
if (not $old) {
|
||||
if (not $new) {
|
||||
do_host($ether, 'offline');
|
||||
} else {
|
||||
do_host($ether, 'join');
|
||||
}
|
||||
} else {
|
||||
if (not $new) {
|
||||
do_host($ether, 'leave');
|
||||
} else {
|
||||
do_host($ether, 'online');
|
||||
}
|
||||
}
|
||||
}
|
||||
# Sort hosts by IP ;-)
|
||||
@hosts = sort byip values %{$list};
|
||||
# Copy sorted list to template data store.
|
||||
$data->{'hosts'} = [ @hosts ];
|
||||
}
|
||||
|
||||
# Do stuff per host.
|
||||
sub do_host {
|
||||
my ($ether, $status) = @_;
|
||||
|
||||
# Find textual representation of DHCP client ID.
|
||||
if ($list->{$ether}->{'raw_client_id'} eq '*') {
|
||||
$list->{$ether}->{'text_client_id'} = 'None';
|
||||
} else {
|
||||
my $text = "";
|
||||
foreach $char (split /:/, $list->{$ether}->{'raw_client_id'}) {
|
||||
$char = pack('H2', $char);
|
||||
if (ord($char) >= 32 and ord($char) <= 127) {
|
||||
$text .= $char;
|
||||
} else {
|
||||
$text .= "?";
|
||||
}
|
||||
}
|
||||
$list->{$ether}->{'text_client_id'} = $text;
|
||||
}
|
||||
|
||||
# Convert lease expiration date/time to text.
|
||||
if ($list->{$ether}->{'raw_lease'} == 0) {
|
||||
$list->{$ether}->{'text_lease'} = 'Never';
|
||||
} else {
|
||||
$list->{$ether}->{'text_lease'} = nice_time($list->{$ether}->{'raw_lease'});
|
||||
}
|
||||
|
||||
if ($status eq 'offline') {
|
||||
# Nothing to do.
|
||||
} elsif ($status eq 'online') {
|
||||
# Nothing to do.
|
||||
} elsif ($status eq 'join') {
|
||||
# Update times for joining host.
|
||||
print "do_host: $ether joined the network.\n";
|
||||
$list->{$ether}->{'join_time'} = time;
|
||||
$list->{$ether}->{'since'} = nice_time(time);
|
||||
} elsif ($status eq 'leave') {
|
||||
# Update times for leaving host.
|
||||
print "do_host: $ether left the network.\n";
|
||||
$list->{$ether}->{'leave_time'} = time;
|
||||
$list->{$ether}->{'since'} = nice_time(time);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# Convert time to a string representation.
|
||||
sub nice_time {
|
||||
my $time = shift;
|
||||
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $dst) = localtime($time);
|
||||
$sec = pad($sec, '0', 2);
|
||||
$min = pad($min, '0', 2);
|
||||
$hour = pad($hour, '0', 2);
|
||||
$mon = pad($mon, '0', 2);
|
||||
$mday = pad($mday, '0', 2);
|
||||
return "$mon/$mday $hour:$min:$sec";
|
||||
}
|
||||
|
||||
# Pad string to a certain length by repeatedly prepending another string.
|
||||
sub pad {
|
||||
my ($text, $pad, $length) = @_;
|
||||
while (length($text) < $length) {
|
||||
$text = "$pad$text";
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
# Compare two IP addresses. (Uses $a and $b from sort.)
|
||||
sub byip {
|
||||
# Split into octets.
|
||||
my @a = split /\./, $a->{ip_addr};
|
||||
my @b = split /\./, $b->{ip_addr};
|
||||
# Compare octets.
|
||||
foreach $n (0..3) {
|
||||
return $a[$n] <=> $b[$n] if ($a[$n] != $b[$n]);
|
||||
}
|
||||
# If we get here there is no difference.
|
||||
return 0;
|
||||
}
|
||||
|
||||
# Output HTML file.
|
||||
sub write_output {
|
||||
# Create new template object.
|
||||
my $template = Template->new(
|
||||
{
|
||||
ABSOLUTE => 1, # /var/www/... is an absolute path
|
||||
OUTPUT => $html_output_file # put it here, not STDOUT
|
||||
}
|
||||
);
|
||||
$data->{'updated'} = nice_time(time); # add "(updated ...)" to file
|
||||
unless ($template->process($html_template_file, $data)) { # do it
|
||||
warn "write_output: Template Toolkit error: " . $template->error() . "\n";
|
||||
return 0;
|
||||
}
|
||||
print "write_output: page updated.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub show_license {
|
||||
while (<DATA>) {
|
||||
print;
|
||||
$line++;
|
||||
if ($line == 24) { <>; $line = 1; }
|
||||
}
|
||||
}
|
||||
|
||||
# Main loop.
|
||||
while (1) {
|
||||
# Check for state change.
|
||||
if (check_state()) {
|
||||
read_state();
|
||||
sleep 1; # Sleep for a second just so we don't wear anything
|
||||
# out. (By not sleeping the whole time after a change
|
||||
# we can detect rapid changes more easily--like if 300
|
||||
# hosts all come back online, they show up quicker.)
|
||||
} else {
|
||||
sleep $wait_time; # Take a nap.
|
||||
}
|
||||
write_output(); # Write the file anyway.
|
||||
}
|
||||
__DATA__
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
32
contrib/dnslist/dnslist.tt2
Normal file
32
contrib/dnslist/dnslist.tt2
Normal file
@@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>DHCP Clients</title>
|
||||
<link rel="stylesheet" href="dhcp.css"/>
|
||||
<meta http-equiv="Refresh" content="2"/>
|
||||
</head>
|
||||
<body>
|
||||
<h1>DHCP Clients <span class="updated">(updated [% updated %])</span></h1>
|
||||
<table cols="7">
|
||||
<tr>
|
||||
<th class="hostname">Hostname</th>
|
||||
<th class="ip_addr">IP Address</th>
|
||||
<th class="ether_addr">Ethernet Address</th>
|
||||
<th class="client_id">DHCP Client ID</th>
|
||||
<th class="status">Status</th>
|
||||
<th class="since">Since</th>
|
||||
<th class="lease">Lease Expires</th>
|
||||
</tr>
|
||||
[% FOREACH host IN hosts %]
|
||||
<tr class="[% IF host.online %]online[% ELSE %]offline[% END %]">
|
||||
<td class="hostname">[% host.hostname %]</td>
|
||||
<td class="ip_addr">[% host.ip_addr %]</td>
|
||||
<td class="ether_addr">[% host.ether_addr %]</td>
|
||||
<td class="client_id">[% host.text_client_id %] ([% host.raw_client_id %])</td>
|
||||
<td class="status">[% IF host.online %]Online[% ELSE %]Offline[% END %]</td>
|
||||
<td class="since">[% host.since %]</td>
|
||||
<td class="lease">[% host.text_lease %]</td>
|
||||
</tr>
|
||||
[% END %]
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
22
contrib/dnsmasq_MacOSX/DNSmasq
Executable file
22
contrib/dnsmasq_MacOSX/DNSmasq
Executable 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"
|
||||
42
contrib/dnsmasq_MacOSX/README.rtf
Normal file
42
contrib/dnsmasq_MacOSX/README.rtf
Normal 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...}
|
||||
18
contrib/dnsmasq_MacOSX/StartupParameters.plist
Normal file
18
contrib/dnsmasq_MacOSX/StartupParameters.plist
Normal 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>
|
||||
249
contrib/dynamic-dnsmasq/dynamic-dnsmasq.pl
Executable file
249
contrib/dynamic-dnsmasq/dynamic-dnsmasq.pl
Executable file
@@ -0,0 +1,249 @@
|
||||
#!/usr/bin/perl
|
||||
# dynamic-dnsmasq.pl - update dnsmasq's internal dns entries dynamically
|
||||
# Copyright (C) 2004 Peter Willis
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# the purpose of this script is to be able to update dnsmasq's dns
|
||||
# records from a remote dynamic dns client.
|
||||
#
|
||||
# basic use of this script:
|
||||
# dynamic-dnsmasq.pl add testaccount 1234 testaccount.mydomain.com
|
||||
# dynamic-dnsmasq.pl listen &
|
||||
#
|
||||
# this script tries to emulate DynDNS.org's dynamic dns service, so
|
||||
# technically you should be able to use any DynDNS.org client to
|
||||
# update the records here. tested and confirmed to work with ddnsu
|
||||
# 1.3.1. just point the client's host to the IP of this machine,
|
||||
# port 9020, and include the hostname, user and pass, and it should
|
||||
# work.
|
||||
#
|
||||
# make sure "addn-hosts=/etc/dyndns-hosts" is in your /etc/dnsmasq.conf
|
||||
# file and "nopoll" is commented out.
|
||||
|
||||
use strict;
|
||||
use IO::Socket;
|
||||
use MIME::Base64;
|
||||
use DB_File;
|
||||
use Fcntl;
|
||||
|
||||
my $accountdb = "accounts.db";
|
||||
my $recordfile = "/etc/dyndns-hosts";
|
||||
my $dnsmasqpidfile = "/var/run/dnsmasq.pid"; # if this doesn't exist, will look for process in /proc
|
||||
my $listenaddress = "0.0.0.0";
|
||||
my $listenport = 9020;
|
||||
|
||||
# no editing past this point should be necessary
|
||||
|
||||
if ( @ARGV < 1 ) {
|
||||
die "Usage: $0 ADD|DEL|LISTUSERS|WRITEHOSTSFILE|LISTEN\n";
|
||||
} elsif ( lc $ARGV[0] eq "add" ) {
|
||||
die "Usage: $0 ADD USER PASS HOSTNAME\n" unless @ARGV == 4;
|
||||
add_acct($ARGV[1], $ARGV[2], $ARGV[3]);
|
||||
} elsif ( lc $ARGV[0] eq "del" ) {
|
||||
die "Usage: $0 DEL USER\n" unless @ARGV == 2;
|
||||
print "Are you sure you want to delete user \"$ARGV[1]\"? [N/y] ";
|
||||
my $resp = <STDIN>;
|
||||
chomp $resp;
|
||||
if ( lc substr($resp,0,1) eq "y" ) {
|
||||
del_acct($ARGV[1]);
|
||||
}
|
||||
} elsif ( lc $ARGV[0] eq "listusers" or lc $ARGV[0] eq "writehostsfile" ) {
|
||||
my $X = tie my %h, "DB_File", $accountdb, O_RDWR|O_CREAT, 0600, $DB_HASH;
|
||||
my $fh;
|
||||
if ( lc $ARGV[0] eq "writehostsfile" ) {
|
||||
open($fh, ">$recordfile") || die "Couldn't open recordfile \"$recordfile\": $!\n";
|
||||
flock($fh, 2);
|
||||
seek($fh, 0, 0);
|
||||
truncate($fh, 0);
|
||||
}
|
||||
while ( my ($key, $val) = each %h ) {
|
||||
my ($pass, $domain, $ip) = split("\t",$val);
|
||||
if ( lc $ARGV[0] eq "listusers" ) {
|
||||
print "user $key, hostname $domain, ip $ip\n";
|
||||
} else {
|
||||
if ( defined $ip ) {
|
||||
print $fh "$ip\t$domain\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( lc $ARGV[0] eq "writehostsfile" ) {
|
||||
flock($fh, 8);
|
||||
close($fh);
|
||||
dnsmasq_rescan_configs();
|
||||
}
|
||||
undef $X;
|
||||
untie %h;
|
||||
} elsif ( lc $ARGV[0] eq "listen" ) {
|
||||
listen_for_updates();
|
||||
}
|
||||
|
||||
sub listen_for_updates {
|
||||
my $sock = IO::Socket::INET->new(Listen => 5,
|
||||
LocalAddr => $listenaddress, LocalPort => $listenport,
|
||||
Proto => 'tcp', ReuseAddr => 1,
|
||||
MultiHomed => 1) || die "Could not open listening socket: $!\n";
|
||||
$SIG{'CHLD'} = 'IGNORE';
|
||||
while ( my $client = $sock->accept() ) {
|
||||
my $p = fork();
|
||||
if ( $p != 0 ) {
|
||||
next;
|
||||
}
|
||||
$SIG{'CHLD'} = 'DEFAULT';
|
||||
my @headers;
|
||||
my %cgi;
|
||||
while ( <$client> ) {
|
||||
s/(\r|\n)//g;
|
||||
last if $_ eq "";
|
||||
push @headers, $_;
|
||||
}
|
||||
foreach my $header (@headers) {
|
||||
if ( $header =~ /^GET \/nic\/update\?([^\s].+) HTTP\/1\.[01]$/ ) {
|
||||
foreach my $element (split('&', $1)) {
|
||||
$cgi{(split '=', $element)[0]} = (split '=', $element)[1];
|
||||
}
|
||||
} elsif ( $header =~ /^Authorization: basic (.+)$/ ) {
|
||||
unless ( defined $cgi{'hostname'} ) {
|
||||
print_http_response($client, undef, "badsys");
|
||||
exit(1);
|
||||
}
|
||||
if ( !exists $cgi{'myip'} ) {
|
||||
$cgi{'myip'} = $client->peerhost();
|
||||
}
|
||||
my ($user,$pass) = split ":", MIME::Base64::decode($1);
|
||||
if ( authorize($user, $pass, $cgi{'hostname'}, $cgi{'myip'}) == 0 ) {
|
||||
print_http_response($client, $cgi{'myip'}, "good");
|
||||
update_dns(\%cgi);
|
||||
} else {
|
||||
print_http_response($client, undef, "badauth");
|
||||
exit(1);
|
||||
}
|
||||
last;
|
||||
}
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
sub add_acct {
|
||||
my ($user, $pass, $hostname) = @_;
|
||||
my $X = tie my %h, "DB_File", $accountdb, O_RDWR|O_CREAT, 0600, $DB_HASH;
|
||||
$X->put($user, join("\t", ($pass, $hostname)));
|
||||
undef $X;
|
||||
untie %h;
|
||||
}
|
||||
|
||||
sub del_acct {
|
||||
my ($user, $pass, $hostname) = @_;
|
||||
my $X = tie my %h, "DB_File", $accountdb, O_RDWR|O_CREAT, 0600, $DB_HASH;
|
||||
$X->del($user);
|
||||
undef $X;
|
||||
untie %h;
|
||||
}
|
||||
|
||||
|
||||
sub authorize {
|
||||
my $user = shift;
|
||||
my $pass = shift;
|
||||
my $hostname = shift;
|
||||
my $ip = shift;;
|
||||
my $X = tie my %h, "DB_File", $accountdb, O_RDWR|O_CREAT, 0600, $DB_HASH;
|
||||
my ($spass, $shost) = split("\t", $h{$user});
|
||||
if ( defined $h{$user} and ($spass eq $pass) and ($shost eq $hostname) ) {
|
||||
$X->put($user, join("\t", $spass, $shost, $ip));
|
||||
undef $X;
|
||||
untie %h;
|
||||
return(0);
|
||||
}
|
||||
undef $X;
|
||||
untie %h;
|
||||
return(1);
|
||||
}
|
||||
|
||||
sub print_http_response {
|
||||
my $sock = shift;
|
||||
my $ip = shift;
|
||||
my $response = shift;
|
||||
print $sock "HTTP/1.0 200 OK\n";
|
||||
my @tmp = split /\s+/, scalar gmtime();
|
||||
print $sock "Date: $tmp[0], $tmp[2] $tmp[1] $tmp[4] $tmp[3] GMT\n";
|
||||
print $sock "Server: Peter's Fake DynDNS.org Server/1.0\n";
|
||||
print $sock "Content-Type: text/plain; charset=ISO-8859-1\n";
|
||||
print $sock "Connection: close\n";
|
||||
print $sock "Transfer-Encoding: chunked\n";
|
||||
print $sock "\n";
|
||||
#print $sock "12\n"; # this was part of the dyndns response but i'm not sure what it is
|
||||
print $sock "$response", defined($ip)? " $ip" : "" . "\n";
|
||||
}
|
||||
|
||||
sub update_dns {
|
||||
my $hashref = shift;
|
||||
my @records;
|
||||
my $found = 0;
|
||||
# update the addn-hosts file
|
||||
open(FILE, "+<$recordfile") || die "Couldn't open recordfile \"$recordfile\": $!\n";
|
||||
flock(FILE, 2);
|
||||
while ( <FILE> ) {
|
||||
if ( /^(\d+\.\d+\.\d+\.\d+)\s+$$hashref{'hostname'}\n$/si ) {
|
||||
if ( $1 ne $$hashref{'myip'} ) {
|
||||
push @records, "$$hashref{'myip'}\t$$hashref{'hostname'}\n";
|
||||
$found = 1;
|
||||
}
|
||||
} else {
|
||||
push @records, $_;
|
||||
}
|
||||
}
|
||||
unless ( $found ) {
|
||||
push @records, "$$hashref{'myip'}\t$$hashref{'hostname'}\n";
|
||||
}
|
||||
sysseek(FILE, 0, 0);
|
||||
truncate(FILE, 0);
|
||||
syswrite(FILE, join("", @records));
|
||||
flock(FILE, 8);
|
||||
close(FILE);
|
||||
dnsmasq_rescan_configs();
|
||||
return(0);
|
||||
}
|
||||
|
||||
sub dnsmasq_rescan_configs {
|
||||
# send the HUP signal to dnsmasq
|
||||
if ( -r $dnsmasqpidfile ) {
|
||||
open(PID,"<$dnsmasqpidfile") || die "Could not open PID file \"$dnsmasqpidfile\": $!\n";
|
||||
my $pid = <PID>;
|
||||
close(PID);
|
||||
chomp $pid;
|
||||
if ( kill(0, $pid) ) {
|
||||
kill(1, $pid);
|
||||
} else {
|
||||
goto LOOKFORDNSMASQ;
|
||||
}
|
||||
} else {
|
||||
LOOKFORDNSMASQ:
|
||||
opendir(DIR,"/proc") || die "Couldn't opendir /proc: $!\n";
|
||||
my @dirs = grep(/^\d+$/, readdir(DIR));
|
||||
closedir(DIR);
|
||||
foreach my $process (@dirs) {
|
||||
if ( open(FILE,"</proc/$process/cmdline") ) {
|
||||
my $cmdline = <FILE>;
|
||||
close(FILE);
|
||||
if ( (split(/\0/,$cmdline))[0] =~ /dnsmasq/ ) {
|
||||
kill(1, $process);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
44
contrib/openvpn/README
Normal file
44
contrib/openvpn/README
Normal 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
|
||||
>
|
||||
30
contrib/openvpn/dhclient-enter-hooks
Normal file
30
contrib/openvpn/dhclient-enter-hooks
Normal 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
|
||||
}
|
||||
61
contrib/openvpn/dnsmasq.patch
Normal file
61
contrib/openvpn/dnsmasq.patch
Normal 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=$?
|
||||
56
contrib/slackware-dnsmasq/dnsmasq.SlackBuild
Executable file
56
contrib/slackware-dnsmasq/dnsmasq.SlackBuild
Executable 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
|
||||
|
||||
BIN
contrib/slackware-dnsmasq/dnsmasq.leasedir.diff.gz
Normal file
BIN
contrib/slackware-dnsmasq/dnsmasq.leasedir.diff.gz
Normal file
Binary file not shown.
BIN
contrib/slackware-dnsmasq/doinst.sh.gz
Normal file
BIN
contrib/slackware-dnsmasq/doinst.sh.gz
Normal file
Binary file not shown.
BIN
contrib/slackware-dnsmasq/rc.dnsmasq.gz
Normal file
BIN
contrib/slackware-dnsmasq/rc.dnsmasq.gz
Normal file
Binary file not shown.
19
contrib/slackware-dnsmasq/slack-desc
Normal file
19
contrib/slackware-dnsmasq/slack-desc
Normal 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:
|
||||
94
dbus/DBus-interface
Normal file
94
dbus/DBus-interface
Normal 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.
|
||||
|
||||
|
||||
16
dbus/dnsmasq.conf
Normal file
16
dbus/dnsmasq.conf
Normal file
@@ -0,0 +1,16 @@
|
||||
<!DOCTYPE busconfig PUBLIC
|
||||
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
<busconfig>
|
||||
<policy user="root">
|
||||
<allow own="uk.org.thekelleys.dnsmasq"/>
|
||||
<allow send_destination="uk.org.thekelleys.dnsmasq"/>
|
||||
<allow send_interface="uk.org.thekelleys.dnsmasq"/>
|
||||
</policy>
|
||||
<policy context="default">
|
||||
<deny own="uk.org.thekelleys.dnsmasq"/>
|
||||
<deny send_destination="uk.org.thekelleys.dnsmasq"/>
|
||||
<deny send_interface="uk.org.thekelleys.dnsmasq"/>
|
||||
</policy>
|
||||
</busconfig>
|
||||
|
||||
130
dnsmasq-mdk.spec
130
dnsmasq-mdk.spec
@@ -1,130 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# General mumbojumbo
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
Name: dnsmasq
|
||||
Version: 2.2
|
||||
Release: 1
|
||||
Copyright: GPL
|
||||
Group: System Environment/Daemons
|
||||
Vendor: Simon Kelley
|
||||
Packager: Simon Kelley
|
||||
Distribution: Mandrake Linux
|
||||
URL: http://www.thekelleys.org.uk/dnsmasq
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
Requires: chkconfig
|
||||
BuildRoot: /var/tmp/%{name}-%{version}
|
||||
Summary: A lightweight caching nameserver
|
||||
|
||||
%description
|
||||
Dnsmasq is 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 server and allows machines with DHCP-allocated
|
||||
addresses to appear in the DNS with names configured either in each host or
|
||||
in a central configuration file. Dnsmasq supports static and dynamic DHCP
|
||||
leases and BOOTP for network booting of diskless machines.
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Build
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%build
|
||||
make
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Install
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%install
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
mkdir -p -m 755 $RPM_BUILD_ROOT/usr/sbin
|
||||
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
|
||||
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
|
||||
###############################################################################
|
||||
#
|
||||
# Clean up
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Post-install scriptlet
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%post
|
||||
/sbin/chkconfig --add dnsmasq
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Pre-uninstall scriptlet
|
||||
#
|
||||
# If there's a time when your package needs to have one last look around before
|
||||
# the user erases it, the place to do it is in the %preun script. Anything that
|
||||
# a package needs to do immediately prior to RPM taking any action to erase the
|
||||
# package, can be done here.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%preun
|
||||
if [ $1 = 0 ]; then # execute this only if we are NOT doing an upgrade
|
||||
service dnsmasq stop >/dev/null 2>&1
|
||||
/sbin/chkconfig --del dnsmasq
|
||||
fi
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Post-uninstall scriptlet
|
||||
#
|
||||
# The %postun script executes after the package has been removed. It is the
|
||||
# last chance for a package to clean up after itself.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%postun
|
||||
if [ "$1" -ge "1" ]; then
|
||||
service dnsmasq restart >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# File list
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc CHANGELOG COPYING FAQ doc.html setup.html UPGRADING_to_2.0
|
||||
%attr(0755,root,root) /etc/rc.d/init.d/dnsmasq
|
||||
%attr(0664,root,root) /etc/dnsmasq.conf
|
||||
%config /etc/rc.d/init.d/dnsmasq
|
||||
%config /etc/dnsmasq.conf
|
||||
%attr(0755,root,root) /usr/sbin/dnsmasq
|
||||
%attr(0644,root,root) /usr/share/man/man8/dnsmasq.8.bz2
|
||||
|
||||
|
||||
133
dnsmasq-rh.spec
133
dnsmasq-rh.spec
@@ -1,133 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# General mumbojumbo
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
Name: dnsmasq
|
||||
Version: 2.2
|
||||
Release: 1
|
||||
Copyright: GPL
|
||||
Group: System Environment/Daemons
|
||||
Vendor: Simon Kelley
|
||||
Packager: Simon Kelley
|
||||
Distribution: Red Hat Linux
|
||||
URL: http://www.thekelleys.org.uk/dnsmasq
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
Requires: chkconfig
|
||||
BuildRoot: /var/tmp/%{name}-%{version}
|
||||
Summary: A lightweight caching nameserver
|
||||
|
||||
%description
|
||||
Dnsmasq is 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 server and allows machines with DHCP-allocated
|
||||
addresses to appear in the DNS with names configured either in each host or
|
||||
in a central configuration file. Dnsmasq supports static and dynamic DHCP
|
||||
leases and BOOTP for network booting of diskless machines.
|
||||
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Build
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%build
|
||||
make
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Install
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%install
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
mkdir -p -m 755 $RPM_BUILD_ROOT/usr/sbin
|
||||
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
|
||||
cp src/dnsmasq $RPM_BUILD_ROOT/usr/sbin
|
||||
cp dnsmasq.8 $RPM_BUILD_ROOT/usr/share/man/man8
|
||||
gzip $RPM_BUILD_ROOT/usr/share/man/man8/dnsmasq.8
|
||||
cp dnsmasq.conf.example $RPM_BUILD_ROOT/etc/dnsmasq.conf
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Clean up
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Post-install scriptlet
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%post
|
||||
/sbin/chkconfig --add dnsmasq
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Pre-uninstall scriptlet
|
||||
#
|
||||
# If there's a time when your package needs to have one last look around before
|
||||
# the user erases it, the place to do it is in the %preun script. Anything that
|
||||
# a package needs to do immediately prior to RPM taking any action to erase the
|
||||
# package, can be done here.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%preun
|
||||
if [ $1 = 0 ]; then # execute this only if we are NOT doing an upgrade
|
||||
service dnsmasq stop >/dev/null 2>&1
|
||||
/sbin/chkconfig --del dnsmasq
|
||||
fi
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Post-uninstall scriptlet
|
||||
#
|
||||
# The %postun script executes after the package has been removed. It is the
|
||||
# last chance for a package to clean up after itself.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%postun
|
||||
if [ "$1" -ge "1" ]; then
|
||||
service dnsmasq restart >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# File list
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc CHANGELOG COPYING FAQ doc.html setup.html UPGRADING_to_2.0
|
||||
%config /etc/rc.d/init.d/dnsmasq
|
||||
%config /etc/dnsmasq.conf
|
||||
%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.8.gz
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
###############################################################################
|
||||
|
||||
Name: dnsmasq
|
||||
Version: 2.2
|
||||
Version: 2.31
|
||||
Release: 1
|
||||
Copyright: GPL
|
||||
Group: Productivity/Networking/DNS/Servers
|
||||
@@ -16,7 +16,7 @@ Provides: dns_daemon
|
||||
Conflicts: bind bind8 bind9
|
||||
PreReq: %fillup_prereq %insserv_prereq
|
||||
Autoreqprov: on
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
Source0: %{name}-%{version}.tar.bz2
|
||||
BuildRoot: /var/tmp/%{name}-%{version}
|
||||
Summary: A lightweight caching nameserver
|
||||
|
||||
@@ -39,9 +39,11 @@ leases and BOOTP for network booting of diskless machines.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
patch -p0 <rpm/%{name}-SuSE.patch
|
||||
|
||||
%build
|
||||
%{?suse_update_config:%{suse_update_config -f}}
|
||||
make
|
||||
make all-i18n DESTDIR=$RPM_BUILD_ROOT PREFIX=/usr
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
@@ -52,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
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
@@ -101,10 +99,12 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc CHANGELOG COPYING FAQ doc.html setup.html UPGRADING_to_2.0 rpm/README.susefirewall
|
||||
%doc contrib
|
||||
%config /etc/init.d/dnsmasq
|
||||
%config /etc/dnsmasq.conf
|
||||
/usr/sbin/rcdnsmasq
|
||||
/usr/sbin/dnsmasq
|
||||
/usr/share/locale/*/LC_MESSAGES/*
|
||||
%doc %{_mandir}/man8/dnsmasq.8.gz
|
||||
|
||||
|
||||
|
||||
405
dnsmasq.8
405
dnsmasq.8
@@ -1,405 +0,0 @@
|
||||
.TH DNSMASQ 8
|
||||
.SH NAME
|
||||
dnsmasq \- A lightweight DHCP and caching DNS server.
|
||||
.SH SYNOPSIS
|
||||
.B dnsmasq
|
||||
.I [OPTION]...
|
||||
.SH "DESCRIPTION"
|
||||
.BR dnsmasq
|
||||
is a lightweight DNS and DHCP server. It is intended to provide coupled DNS and DHCP service to a
|
||||
LAN.
|
||||
.PP
|
||||
Dnsmasq accepts DNS queries and either answers them from a small, local,
|
||||
cache or forwards them to a real, recursive, DNS server. It loads the
|
||||
contents of /etc/hosts so that local hostnames
|
||||
which do not appear in the global DNS can be resolved and also answers
|
||||
DNS queries for DHCP configured hosts.
|
||||
.PP
|
||||
.BR dnsmasq
|
||||
supports IPv6.
|
||||
.PP
|
||||
.BR dnsmasq
|
||||
is lightweight and easy to configure. It is intended as be run on
|
||||
small router/firewalls and provide a DNS (and optionally, DHCP) service to a LAN.
|
||||
.SH OPTIONS
|
||||
Note that in general missing parameters are allowed and switch off
|
||||
functions, for instance "--pid-file=" disables writing a PID file.
|
||||
.TP
|
||||
.B \-h, --no-hosts
|
||||
Don't read the hostnames in /etc/hosts.
|
||||
.TP
|
||||
.B \-H, --addn-hosts=<file>
|
||||
Additional hosts file. Read the specified file as well as /etc/hosts. If -h is given, read
|
||||
only the specified file. At most one additional hosts file may be
|
||||
given.
|
||||
.TP
|
||||
.B \-T, --local-ttl=<time>
|
||||
When replying with information from /etc/hosts or the DHCP leases
|
||||
file dnsmasq by default sets the time-to-live field to zero, meaning
|
||||
that the requestor should not itself cache the information. This is
|
||||
the correct thing to do in almost all situations. This option allows a
|
||||
time-to-live (in seconds) to be given for these replies. This will
|
||||
reduce the load on the server at the expense of clients using stale
|
||||
data under some circumstances.
|
||||
.TP
|
||||
.B \-d, --no-daemon
|
||||
Debug mode: don't fork to the background, don't write a pid file,
|
||||
don't change user id, generate a complete cache dump on receipt on
|
||||
SIGUSR1, log to stderr as well as syslog.
|
||||
.TP
|
||||
.B \-q, --log-queries
|
||||
Log the results of DNS queries handled by dnsmasq. Enable a full cache dump on receipt of SIGUSR1.
|
||||
.TP
|
||||
.B \-x, --pid-file=<path>
|
||||
Specify an alternate path for dnsmasq to record its process-id in. Normally /var/run/dnsmasq.pid.
|
||||
.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
|
||||
can be over-ridden with this switch.
|
||||
.TP
|
||||
.B \-g, --group=<groupname>
|
||||
Specify the group which dnsmasq will run
|
||||
as. The defaults to "dip", if available, to facilitate access to
|
||||
/etc/ppp/resolv.conf which is not normally world readable.
|
||||
.TP
|
||||
.B \-v, --version
|
||||
Print the version number.
|
||||
.TP
|
||||
.B \-p, --port=<port>
|
||||
Listen on <port> instead of the standard DNS port (53). Useful mainly for
|
||||
debugging.
|
||||
.TP
|
||||
.B \-Q, --query-port=<query_port>
|
||||
Send outbound DNS queries from, and listen for their replies on, the specific UDP port <query_port> instead of using one chosen at runtime. Useful to simplify your
|
||||
firewall rules; without this, your firewall would have to allow connections from outside DNS servers to a range of UDP ports, or dynamically adapt to the
|
||||
port being used by the current dnsmasq instance.
|
||||
.TP
|
||||
.B \-i, --interface=<interface name>
|
||||
Listen only on the specified interface. More than one interface may be specified. Dnsmasq always listens on the loopback (local) interface. If no
|
||||
.B \-i
|
||||
flags are given, dnsmasq listens on all available interfaces unless overridden by
|
||||
.B \-a
|
||||
or
|
||||
.B \-I
|
||||
flags.
|
||||
.TP
|
||||
.B \-I, --except-interface=<interface name>
|
||||
Do not listen on the specified interface.
|
||||
.TP
|
||||
.B \-a, --listen-address
|
||||
Listen only on the given IP address. As with
|
||||
.B \-i
|
||||
more than one address may be specified. Unlike
|
||||
.B \-i
|
||||
the loopback interface is not special: if dnsmasq is to listen on the loopback interface,
|
||||
it's IP, 127.0.0.1, must be explicitly given. If no
|
||||
.B \-a
|
||||
flags are given, dnsmasq listens on all available interfaces unless overridden by
|
||||
.B \-i
|
||||
or
|
||||
.B \-I
|
||||
flags.
|
||||
.TP
|
||||
.B \-b, --bogus-priv
|
||||
Bogus private reverse lookups. All reverse lookups for private IP ranges (ie 192.168.x.x, etc)
|
||||
which are not found in /etc/hosts or the DHCP leases file are resolved to the IP address in dotted-quad form.
|
||||
.TP
|
||||
.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
|
||||
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
|
||||
.TP
|
||||
.B \-f, --filterwin2k
|
||||
Later versions of windows make periodic DNS requests which don't get sensible answers from
|
||||
the public DNS and can cause problems by triggering dial-on-demand links. This flag turns on an option
|
||||
to filter such requests. The requests blocked are for records of types SOA and SRV, and type ANY where the
|
||||
requested name has underscores, to catch LDAP requests.
|
||||
.TP
|
||||
.B \-r, --resolv-file=<file>
|
||||
Read the IP addresses of the upstream nameservers from <file>, instead of
|
||||
/etc/resolv.conf. For the format of this file see
|
||||
.BR resolv.conf (5)
|
||||
the only lines relevant to dnsmasq are nameserver ones. Dnsmasq can
|
||||
be told to poll more than one resolv.conf file, the first file name specified
|
||||
overrides the default, subsequent ones add to the list. This is only
|
||||
allowed when polling; the file with the currently latest modification
|
||||
time is the one used.
|
||||
.TP
|
||||
.B \-R, --no-resolv
|
||||
Don't read /etc/resolv.conf. Get upstream servers only from the command
|
||||
line or the dnsmasq configuration file.
|
||||
.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
|
||||
be up. Setting this flag forces dnsmasq to try each query with each
|
||||
server strictly in the order they appear in /etc/resolv.conf
|
||||
.TP
|
||||
.B \-n, --no-poll
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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,
|
||||
.B //
|
||||
has the special meaning of "unqualified names only" ie names without any
|
||||
dots in them. A non-standard port may be specified as
|
||||
part of the IP
|
||||
address using a # character.
|
||||
More than one -S flag is allowed, with
|
||||
repeated domain or ipaddr parts as required.
|
||||
|
||||
Also permitted is a -S
|
||||
flag which gives a domain but no IP address; this tells dnsmasq that
|
||||
a domain is local and it may answer queries from /etc/hosts or DHCP
|
||||
but should never forward queries on that domain to any upstream
|
||||
servers.
|
||||
.B local
|
||||
is a synonym for
|
||||
.B server
|
||||
to make configuration files clearer in this case.
|
||||
|
||||
The optional second IP address after the @ character tells
|
||||
dnsmasq how to set the source address of the queries to this
|
||||
nameserver. It should be an address belonging to the machine on which
|
||||
dnsmasq is running otherwise this server line will be logged and then
|
||||
ignored. The query-port flag is ignored for any servers which have a
|
||||
source address specified but the port may be specified directly as
|
||||
part of the source address.
|
||||
.TP
|
||||
.B \-A, --address=/<domain>/[domain/]<ipaddr>
|
||||
Specify an IP address to return for any host in the given domains.
|
||||
Queries in the domains are never forwarded and always replied to
|
||||
with the specified IP address which may be IPv4 or IPv6. To give
|
||||
both IPv4 and IPv6 addresses for a domain, use repeated -A flags.
|
||||
Note that /etc/hosts and DHCP leases override this for individual
|
||||
names. A common use of this is to redirect the entire doubleclick.net
|
||||
domain to some friendly local web server to avoid banner ads.
|
||||
.TP
|
||||
.B \-m, --mx-host=<mx name>
|
||||
Return an MX record named <mx name> pointing to the host specified in the --mx-target switch
|
||||
or, if that switch is not given, the host on which dnsmasq
|
||||
is running. This is useful for directing mail from systems on a LAN
|
||||
to a central server.
|
||||
.TP
|
||||
.B \-t, --mx-target=<hostname>
|
||||
Specify target for the MX record returned by dnsmasq. See --mx-host. Note that to turn on the MX function,
|
||||
at least one of --mx-host and --mx-target must be set. If only one of --mx-host and --mx-target
|
||||
is set, the other defaults to the hostname of the machine on which dnsmasq is running.
|
||||
.TP
|
||||
.B \-e, --selfmx
|
||||
Return an MX record pointing to itself for each local
|
||||
machine. Local machines are those in /etc/hosts or with DHCP leases.
|
||||
.TP
|
||||
.B \-L, --localmx
|
||||
Return an MX record pointing to the host given by mx-target (or the
|
||||
machine on which dnsmasq is running) for each
|
||||
local machine. Local machines are those in /etc/hosts or with DHCP
|
||||
leases.
|
||||
.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.
|
||||
.TP
|
||||
.B \-N, --no-negcache
|
||||
Disable negative caching. Negative caching allows dnsmasq to remember
|
||||
"no such domain" answers from upstream nameservers and answer
|
||||
identical queries without forwarding them again. This flag disables
|
||||
negative caching.
|
||||
.TP
|
||||
.B \-F, --dhcp-range=<start-addr>,<end-addr>[,<default lease time>]
|
||||
Enable the DHCP server. Addresses will be given out from the range
|
||||
<start-addr> to <end-addr>, both of which must be on the network
|
||||
attached to a local interface. If the lease time is given, then leases
|
||||
will be given for that length of time. The lease time is on 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 on more than one local interface. (Use of more than one
|
||||
interface currently only works under Linux.)
|
||||
.TP
|
||||
.B \-G, --dhcp-host=[[<hwaddr>]|[id:<client_id>]][,<ipaddr>][,<hostname>][,<lease_time>]
|
||||
Specify per host parameters for the DHCP server. This allows a machine
|
||||
with a particular hardware address to be always allocated the same
|
||||
hostname, IP address and lease time. A hostname specified like this
|
||||
overrides any supplied by the DHCP client on the machine. It is also
|
||||
allowable to ommit the hardware address and include the hostname, in
|
||||
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
|
||||
an infinite DHCP lease.
|
||||
.B --dhcp-host=lap,192.168.0.199
|
||||
tells
|
||||
dnsmasq to always allocate the machine lap the IP address
|
||||
192.168.0.199. Addresses allocated like this are not constrained to be
|
||||
in the range given by the --dhcp-range option, but they must be on the
|
||||
network being served by the DHCP server. It is allowed to use client identifiers rather than
|
||||
hardware addresses to identify hosts by prefixing with 'id:'. Thus:
|
||||
.B --dhcp-host=id:01:02:03:04,.....
|
||||
refers to the host with client identifier 01:02:03:04. It is also
|
||||
allowed to specify the client ID as text, like this:
|
||||
.B --dhcp-host=id:clientidastext,.....
|
||||
If a name appears in /etc/hosts, the associated address can be
|
||||
allocated to a DHCP lease, but only if a
|
||||
.B --dhcp-host
|
||||
option specifying the name also exists.
|
||||
.TP
|
||||
.B \-O, --dhcp-option=<opt>,[<value>[,<value>]]
|
||||
Specfify 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
|
||||
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
|
||||
.B dhcp-option=42,192.168.0.4
|
||||
The special address 0.0.0.0 is taken to mean "the address of the
|
||||
machine running dnsmasq".
|
||||
Be careful: no checking is done that the correct type of data for the
|
||||
option number is sent, and there are option numbers for which it is not
|
||||
possible to generate the correct data type; it is quite possible to
|
||||
persuade dnsmasq to generate illegal DHCP packets with injudicious use
|
||||
of this flag.
|
||||
.TP
|
||||
.B \-M, --dhcp-boot=<filename>,[<servername>[,<server address>]]
|
||||
Set BOOTP options to be returned by the DHCP server. These are needed
|
||||
for machines which network boot, and tell the machine where to collect
|
||||
its initial configuration.
|
||||
.TP
|
||||
.B \-l, --dhcp-leasefile=<path>
|
||||
Use the specified file to store DHCP lease information.
|
||||
.TP
|
||||
.B \-s, --domain=<domain>
|
||||
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
|
||||
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".
|
||||
.TP
|
||||
.B \-E, --expand-hosts
|
||||
Add the domain-suffix to simple names (without a period) in /etc/hosts
|
||||
in the same way as for DHCP-derived names.
|
||||
.SH CONFIG FILE
|
||||
At startup, dnsmasq reads /etc/dnsmasq.conf, if it exists. (On
|
||||
FreeBSD, the file is /usr/local/etc/dnsmasq.conf) 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.
|
||||
.SH NOTES
|
||||
When it receives a SIGHUP,
|
||||
.B dnsmasq
|
||||
clears its cache and then re-loads /etc/hosts. If
|
||||
.B
|
||||
--no-poll
|
||||
is set SIGHUP also re-reads /etc/resolv.conf. SIGHUP
|
||||
does NOT re-read the configuration file.
|
||||
.PP
|
||||
When it receives a SIGUSR1,
|
||||
.B dnsmasq
|
||||
writes cache statistics to the system log. It writes the cache size,
|
||||
the number of names which have had to removed from the cache before
|
||||
they expired in order to make room for new names and the total number
|
||||
of names that have been inserted into the cache. In
|
||||
.B --no-daemon
|
||||
mode or when full logging is enabled (-q), a complete dump of the contents of the cache is made.
|
||||
.PP
|
||||
When it receives a SIGUSR2,
|
||||
.B dnsmasq
|
||||
re-scans network interfaces. This is required if it is to listen for
|
||||
queries on newly created interfaces or interfaces which have changed IP
|
||||
address. For this facility to work, dnsmasq must be told to continue
|
||||
running as user root, using
|
||||
.B --user=root
|
||||
.PP
|
||||
Dnsmasq is a DNS query forwarder: it it not capable of recursively
|
||||
answering arbitrary queries starting from the root servers but
|
||||
forwards such queries to a fully recursive upstream DNS server which is
|
||||
typically provided by an ISP. By default, dnsmasq reads
|
||||
/etc/resolv.conf to discover the IP
|
||||
addresses of the upstream nameservers it should use, since the
|
||||
information is typically stored there. Unless
|
||||
.B --no-poll
|
||||
is used,
|
||||
.B dnsmasq
|
||||
checks the modification time of /etc/resolv.conf (or
|
||||
equivalent if
|
||||
.B \--resolv-file
|
||||
is used) and re-reads it if it changes. This allows the DNS servers to
|
||||
be set dynamically by PPP or DHCP since both protocols provide the
|
||||
information.
|
||||
Absence of /etc/resolv.conf is not an error
|
||||
since it may not have been created before a PPP connection exists. Dnsmasq
|
||||
simply keeps checking in case /etc/resolv.conf is created at any
|
||||
time. Dnsmasq can be told to parse more than one resolv.conf
|
||||
file. This is useful on a laptop, where both PPP and DHCP may be used:
|
||||
dnsmasq can be set to poll both /etc/ppp/resolv.conf and
|
||||
/etc/dhcpc/resolv.conf and will use the contents of whichever changed
|
||||
last, giving automatic switching between DNS servers.
|
||||
.PP
|
||||
Upstream servers may also be specified on the command line or in
|
||||
the configuration file. These server specifications optionally take a
|
||||
domain name which tells dnsmasq to use that server only to find names
|
||||
in that particular domain.
|
||||
.PP
|
||||
In order to configure dnsmasq to act as cache for the host on which it is running, put "nameserver 127.0.0.1" in
|
||||
.I /etc/resolv.conf
|
||||
to force local processes to send queries to
|
||||
dnsmasq. Then either specify the upstream servers directly to dnsmasq
|
||||
using
|
||||
.B \--server
|
||||
options or put their addresses real in another file, say
|
||||
.I /etc/resolv.dnsmasq
|
||||
and run dnsmasq with the
|
||||
.B \-r /etc/resolv.dnsmasq
|
||||
option. This second technique allows for dynamic update of the server
|
||||
addresses by PPP or DHCP.
|
||||
.SH FILES
|
||||
.IR /etc/dnsmasq.conf
|
||||
|
||||
.IR /usr/local/etc/dnsmasq.conf
|
||||
|
||||
.IR /etc/resolv.conf
|
||||
|
||||
.IR /etc/hosts
|
||||
|
||||
.IR /var/lib/misc/dnsmasq.leases
|
||||
|
||||
.IR /var/db/dnsmasq.leases
|
||||
|
||||
.IR /var/run/dnsmasq.pid
|
||||
.SH SEE ALSO
|
||||
.BR hosts (5),
|
||||
.BR resolver (5)
|
||||
.SH AUTHOR
|
||||
This manual page was written by Simon Kelley <simon@thekelleys.org.uk>.
|
||||
|
||||
|
||||
@@ -4,31 +4,28 @@
|
||||
# as the long options legal on the command line. See
|
||||
# "/usr/sbin/dnsmasq --help" or "man 8 dnsmasq" for details.
|
||||
|
||||
# Change these lines if you want dnsmasq to serve MX records.
|
||||
# Only one of mx-host and mx-target need be set, the other defaults
|
||||
# to the name of the host running dnsmasq.
|
||||
#mx-host=
|
||||
#mx-target=
|
||||
#selfmx
|
||||
#localmx
|
||||
|
||||
# The following three 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
|
||||
# Reply to reverse queries for addresses in the non-routed address
|
||||
# space with the dotted.quad address
|
||||
# Never forward addresses in the non-routed address spaces.
|
||||
bogus-priv
|
||||
# Filter useless windows-originated DNS requests
|
||||
filterwin2k
|
||||
|
||||
|
||||
# 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,
|
||||
# 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
|
||||
@@ -39,7 +36,7 @@ filterwin2k
|
||||
#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
|
||||
|
||||
@@ -47,7 +44,7 @@ filterwin2k
|
||||
# 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
|
||||
|
||||
@@ -60,14 +57,14 @@ filterwin2k
|
||||
# webserver.
|
||||
#address=/doubleclick.net/127.0.0.1
|
||||
|
||||
# You no longer (as of version 1.7) need to set these to enable
|
||||
# dnsmasq to read /etc/ppp/resolv.conf since dnsmasq now uses the
|
||||
# "dip" group to achieve this.
|
||||
# If you want dnsmasq to change uid and gid to something other
|
||||
# than the default, edit the following lines.
|
||||
#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
|
||||
@@ -75,6 +72,19 @@ filterwin2k
|
||||
# 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
|
||||
# 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
|
||||
# running another nameserver on the same machine.
|
||||
#bind-interfaces
|
||||
|
||||
# If you don't want dnsmasq to read /etc/hosts, uncomment the
|
||||
# following line.
|
||||
@@ -87,20 +97,39 @@ filterwin2k
|
||||
# automatically added to simple names in a hosts-file.
|
||||
#expand-hosts
|
||||
|
||||
# Set the domain for dnsmasq. this is optional, but if it is set, it
|
||||
# does the following things.
|
||||
# 1) Allows DHCP hosts to have fully qualified domain names, as long
|
||||
# as the domain part matches this setting.
|
||||
# 2) Sets the "domain" DHCP option thereby potentially setting the
|
||||
# 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
|
||||
# a lease time. If you have more than one interface, you will need to
|
||||
# repeat this for each interface on which you want to supply DHCP
|
||||
# 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
|
||||
# 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
|
||||
|
||||
# This is an example of a DHCP range with a network-id, so that
|
||||
# some DHCP options may be set only for this network.
|
||||
#dhcp-range=red,192.168.0.50,192.168.0.150
|
||||
|
||||
# Supply parameters for specified hosts using DHCP. There are lots
|
||||
# of valid alternatives, so we will give examples of each. Note that
|
||||
# IP addresses DO NOT have to be in the range given above, they just
|
||||
# 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
|
||||
|
||||
@@ -116,7 +145,7 @@ filterwin2k
|
||||
# 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
|
||||
|
||||
@@ -129,6 +158,42 @@ filterwin2k
|
||||
# it asks for a DHCP lease.
|
||||
#dhcp-host=judge
|
||||
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
# MAC-address/host mappings there for other purposes.
|
||||
#read-ethers
|
||||
|
||||
# Send options to hosts which ask for a DHCP lease.
|
||||
# See RFC 2132 for details of available options.
|
||||
# Note that all the common settings, such as netmask and
|
||||
@@ -143,10 +208,14 @@ filterwin2k
|
||||
# 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
|
||||
|
||||
@@ -159,29 +228,69 @@ filterwin2k
|
||||
# Set the "all subnets are local" flag
|
||||
#dhcp-option=27,1
|
||||
|
||||
# Send the etherboot magic flag and then etherboot options (a string).
|
||||
#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
|
||||
# (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
|
||||
#dhcp-option=47 # empty netbios scope.
|
||||
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
# boot machines over the network.
|
||||
#dhcp-boot=/var/ftpd/pxelinux.0,boothost,192.168.0.3
|
||||
|
||||
# Set the limit on DHCP leases, the default is 150
|
||||
#dhcp-lease-max=150
|
||||
|
||||
# The DHCP server needs somewhere on disk to keep its lease database.
|
||||
# This defaults to a sane location, but if you want to change it, use
|
||||
# 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,
|
||||
# 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
|
||||
# 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:
|
||||
# http://www.isc.org/index.pl?/sw/dhcp/authoritative.php
|
||||
#dhcp-authoritative
|
||||
|
||||
# Run an executable when a DHCP lease is created or destroyed.
|
||||
# The arguments sent to the script are "add" or "del",
|
||||
# then the MAC address, the IP address and finally the hostname
|
||||
# if there is one.
|
||||
#dhcp-script=/bin/echo
|
||||
|
||||
# Set the cachesize here.
|
||||
#cache-size=150
|
||||
|
||||
@@ -190,8 +299,8 @@ filterwin2k
|
||||
|
||||
# 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=
|
||||
|
||||
@@ -202,12 +311,74 @@ filterwin2k
|
||||
# registries which have implemented wildcard A records.
|
||||
#bogus-nxdomain=64.94.110.11
|
||||
|
||||
# If you want to fix up DNS results from upstream servers, use the
|
||||
# alias option. This only works for IPv4.
|
||||
# This alias makes a result of 1.2.3.4 appear as 5.6.7.8
|
||||
#alias=1.2.3.4,5.6.7.8
|
||||
# and this maps 1.2.3.x to 5.6.7.x
|
||||
#alias=1.2.3.0,5.6.7.0,255.255.255.0
|
||||
|
||||
|
||||
# Change these lines if you want dnsmasq to serve MX records.
|
||||
|
||||
# Return an MX record named "maildomain.com" with target
|
||||
# servermachine.com and preference 50
|
||||
#mx-host=maildomain.com,servermachine.com,50
|
||||
|
||||
# Set the default target for MX records created using the localmx option.
|
||||
#mx-target=servermachine.com
|
||||
|
||||
# Return an MX record pointing to the mx-target for all local
|
||||
# machines.
|
||||
#localmx
|
||||
|
||||
# Return an MX record pointing to itself for all local machines.
|
||||
#selfmx
|
||||
|
||||
# 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.
|
||||
# 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. (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
|
||||
#srv-host=_ldap._tcp.example.com,ldapserver.example.com,389
|
||||
|
||||
# A SRV record sending LDAP for the example.com domain to
|
||||
# ldapserver.example.com port 289 (using domain=)
|
||||
#domain=example.com
|
||||
#srv-host=_ldap._tcp,ldapserver.example.com,389
|
||||
|
||||
# Two SRV records for LDAP, each with different priorities
|
||||
#srv-host=_ldap._tcp.example.com,ldapserver.example.com,389,1
|
||||
#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
|
||||
#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
|
||||
|
||||
60
doc.html
60
doc.html
@@ -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
|
||||
@@ -18,9 +18,14 @@ connected to the internet via a modem, cable-modem or ADSL
|
||||
connection but would be a good choice for any small network where low
|
||||
resource use and ease of configuration are important.
|
||||
<P>
|
||||
Dnsmasq is included in at least the following Linux distributions: Gentoo, Debian,
|
||||
Smoothwall, IP-Cop, floppyfw, Firebox, Freesco and
|
||||
Clarkconnect. It is also available as a FreeBSD port and is used in Linksys wireless routers.
|
||||
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, fli4l,
|
||||
CoyoteLinux, Endian Firewall and
|
||||
Clarkconnect. It is also available as a FreeBSD port and is used in
|
||||
Linksys wireless routers and the m0n0wall project.
|
||||
<P>
|
||||
Dnsmasq provides the following features:
|
||||
<DIR>
|
||||
@@ -38,22 +43,18 @@ machine: If the names of local machines are there, then they can all
|
||||
be addressed without having to maintain /etc/hosts on each machine.
|
||||
</LI>
|
||||
<LI>
|
||||
Dnsmasq will serve names from the DHCP leases file on the firewall machine:
|
||||
If machines specify a hostname when they take out a DHCP lease, then they are
|
||||
addressable in the local DNS. <B>UPDATE</B> Dnsmasq version 2 now offers an integrated DHCP server
|
||||
instead of the lease file reader. This gives better control of the
|
||||
interaction with new functions (for example fixed IP leasess and
|
||||
attaching names to ethernet addresses centrally) it's also much
|
||||
smaller than dnsmasq and ISC dhcpd which is important for router distros.
|
||||
The integrated DHCP server supports static and dynamic DHCP leases and
|
||||
multiple networks and IP ranges. It works across BOOTP relays and
|
||||
supports DHCP options including RFC3397 DNS search lists.
|
||||
Machines which are configured by DHCP have their names automatically
|
||||
included in the DNS and the names can specified by each machine or
|
||||
centrally by associating a name with a MAC address in the dnsmasq
|
||||
config file.
|
||||
</LI>
|
||||
<LI>
|
||||
Dnsmasq caches internet addresses (A records and AAAA records) and address-to-name
|
||||
mappings (PTR records), reducing the load on upstream servers and
|
||||
improving performance (especially on modem connections). From version
|
||||
0.95 the cache honours time-to-live information and removes old
|
||||
records as they expire. From version 0.996 dnsmasq does negative
|
||||
caching. From version 1.2 dnsmasq supports IPv6 addresses, both
|
||||
in its cache and in /etc/hosts.
|
||||
improving performance (especially on modem connections).
|
||||
</LI>
|
||||
<LI>
|
||||
Dnsmasq can be configured to automatically pick up the addresses of
|
||||
@@ -73,20 +74,14 @@ upstream servers handling only those domains. This makes integration
|
||||
with private DNS systems easy.
|
||||
</LI>
|
||||
<LI>
|
||||
Dnsmasq can be configured to return an MX record
|
||||
for the firewall host. This makes it easy to configure the mailer on the local
|
||||
machines to forward all mail to the central mailer on the firewall host. Never
|
||||
lose root messages from your machines again!
|
||||
</LI>
|
||||
<LI>
|
||||
For version 1.15 dnsmasq has a facility to work around Verisign's infamous wildcard A record
|
||||
in the .com and .net TLDs
|
||||
Dnsmasq supports MX records and can be configured to return MX records
|
||||
for any or all local machines.
|
||||
</LI>
|
||||
</DIR>
|
||||
|
||||
<H2>Download.</H2>
|
||||
|
||||
Download dnsmasq <A HREF="http://www.thekelleys.org.uk/dnsmasq/"> here</A>.
|
||||
<A HREF="http://www.thekelleys.org.uk/dnsmasq/"> Download</A> dnsmasq here.
|
||||
The tarball includes this documentation, source, manpage and control files for building .rpms.
|
||||
There are also pre-built i386 .rpms, and a
|
||||
<A HREF="CHANGELOG"> CHANGELOG</A>.
|
||||
@@ -109,13 +104,22 @@ 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.
|
||||
|
||||
<H2>Contact.</H2>
|
||||
Dnsmasq was written by Simon Kelley. You can contact me at <A HREF="mailto:simon@thekelleys.org.uk">simon@thekelleys.org.uk</A>. Bugreports, patches, and suggestions for improvements gratefully accepted.
|
||||
There is a dnsmasq mailing list at <A
|
||||
HREF="http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss">
|
||||
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss</A> which should be the
|
||||
first location for queries, bugreports, suggestions etc.
|
||||
Dnsmasq was written by Simon Kelley. You can contact me at <A
|
||||
HREF="mailto:simon@thekelleys.org.uk">simon@thekelleys.org.uk</A>.
|
||||
</BODY>
|
||||
|
||||
|
||||
747
man/dnsmasq.8
Normal file
747
man/dnsmasq.8
Normal file
@@ -0,0 +1,747 @@
|
||||
.TH DNSMASQ 8
|
||||
.SH NAME
|
||||
dnsmasq \- A lightweight DHCP and caching DNS server.
|
||||
.SH SYNOPSIS
|
||||
.B dnsmasq
|
||||
.I [OPTION]...
|
||||
.SH "DESCRIPTION"
|
||||
.BR dnsmasq
|
||||
is a lightweight DNS and DHCP server. It is intended to provide coupled DNS and DHCP service to a
|
||||
LAN.
|
||||
.PP
|
||||
Dnsmasq accepts DNS queries and either answers them from a small, local,
|
||||
cache or forwards them to a real, recursive, DNS server. It loads the
|
||||
contents of /etc/hosts so that local hostnames
|
||||
which do not appear in the global DNS can be resolved and also answers
|
||||
DNS queries for DHCP configured hosts.
|
||||
.PP
|
||||
The dnsmasq DHCP server supports static address assignments, multiple
|
||||
networks, DHCP-relay and RFC3011 subnet specifiers. It automatically
|
||||
sends a sensible default set of DHCP options, and can be configured to
|
||||
send any desired set of DHCP options. It also supports BOOTP.
|
||||
.PP
|
||||
Dnsmasq
|
||||
supports IPv6.
|
||||
.SH OPTIONS
|
||||
Note that in general missing parameters are allowed and switch off
|
||||
functions, for instance "--pid-file=" disables writing a PID file. On
|
||||
BSD, unless the GNU getopt library is linked, the long form of the
|
||||
options does not work on the command line; it is still recognised in
|
||||
the configuration file.
|
||||
.TP
|
||||
.B \-h, --no-hosts
|
||||
Don't read the hostnames in /etc/hosts.
|
||||
.TP
|
||||
.B \-H, --addn-hosts=<file>
|
||||
Additional hosts file. Read the specified file as well as /etc/hosts. If -h is given, read
|
||||
only the specified file. This option may be repeated for more than one
|
||||
additional hosts file.
|
||||
.TP
|
||||
.B \-T, --local-ttl=<time>
|
||||
When replying with information from /etc/hosts or the DHCP leases
|
||||
file dnsmasq by default sets the time-to-live field to zero, meaning
|
||||
that the requestor should not itself cache the information. This is
|
||||
the correct thing to do in almost all situations. This option allows a
|
||||
time-to-live (in seconds) to be given for these replies. This will
|
||||
reduce the load on the server at the expense of clients using stale
|
||||
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
|
||||
or launchd.
|
||||
.TP
|
||||
.B \-d, --no-daemon
|
||||
Debug mode: don't fork to the background, don't write a pid file,
|
||||
don't change user id, generate a complete cache dump on receipt on
|
||||
SIGUSR1, log to stderr as well as syslog, don't fork new processes
|
||||
to handle TCP queries.
|
||||
.TP
|
||||
.B \-q, --log-queries
|
||||
Log the results of DNS queries handled by dnsmasq. Enable a full cache dump on receipt of SIGUSR1.
|
||||
.TP
|
||||
.B \-x, --pid-file=<path>
|
||||
Specify an alternate path for dnsmasq to record its process-id in. Normally /var/run/dnsmasq.pid.
|
||||
.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
|
||||
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>
|
||||
Specify the group which dnsmasq will run
|
||||
as. The defaults to "dip", if available, to facilitate access to
|
||||
/etc/ppp/resolv.conf which is not normally world readable.
|
||||
.TP
|
||||
.B \-v, --version
|
||||
Print the version number.
|
||||
.TP
|
||||
.B \-p, --port=<port>
|
||||
Listen on <port> instead of the standard DNS port (53). Useful mainly for
|
||||
debugging.
|
||||
.TP
|
||||
.B \-P, --edns-packet-max=<size>
|
||||
Specify the largest EDNS.0 UDP packet which is supported by the DNS
|
||||
forwarder. Defaults to 1280, which is the RFC2671-recommended maximum
|
||||
for ethernet.
|
||||
.TP
|
||||
.B \-Q, --query-port=<query_port>
|
||||
Send outbound DNS queries from, and listen for their replies on, the specific UDP port <query_port> instead of using one chosen at runtime. Useful to simplify your
|
||||
firewall rules; without this, your firewall would have to allow connections from outside DNS servers to a range of UDP ports, or dynamically adapt to the
|
||||
port being used by the current dnsmasq instance.
|
||||
.TP
|
||||
.B \-i, --interface=<interface name>
|
||||
Listen only on the specified interface(s). Dnsmasq automatically adds
|
||||
the loopback (local) interface to the list of interfaces to use when
|
||||
the
|
||||
.B \--interface
|
||||
option is used. If no
|
||||
.B \--interface
|
||||
or
|
||||
.B \--listen-address
|
||||
options are given dnsmasq listens on all available interfaces except any
|
||||
given in
|
||||
.B \--except-interface
|
||||
options. IP alias interfaces (eg "eth1:0") cannot be used with
|
||||
.B --interface
|
||||
or
|
||||
.B --except-interface
|
||||
options, use --listen-address instead.
|
||||
.TP
|
||||
.B \-I, --except-interface=<interface name>
|
||||
Do not listen on the specified interface. Note that the order of
|
||||
.B \--listen-address
|
||||
.B --interface
|
||||
and
|
||||
.B --except-interface
|
||||
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
|
||||
and
|
||||
.B \--listen-address
|
||||
options may be given, in which case the set of both interfaces and
|
||||
addresses is used. Note that if no
|
||||
.B \--interface
|
||||
option is given, but
|
||||
.B \--listen-address
|
||||
is, dnsmasq will not automatically listen on the loopback
|
||||
interface. To achieve this, its IP address, 127.0.0.1, must be
|
||||
explicitly given as a
|
||||
.B \--listen-address
|
||||
option.
|
||||
.TP
|
||||
.B \-z, --bind-interfaces
|
||||
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
|
||||
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. 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
|
||||
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
|
||||
addresses in /etc/hosts corresponding to each of its interfaces, and
|
||||
hosts will get the correct address based on which network they are
|
||||
attached to. Currently this facility is limited to IPv4.
|
||||
.TP
|
||||
.B \-b, --bogus-priv
|
||||
Bogus private reverse lookups. All reverse lookups for private IP ranges (ie 192.168.x.x, etc)
|
||||
which are not found in /etc/hosts or the DHCP leases file are answered
|
||||
with "no such domain" rather than being forwarded upstream.
|
||||
.TP
|
||||
.B \-V, --alias=<old-ip>,<new-ip>[,<mask>]
|
||||
Modify IPv4 addresses returned from upstream nameservers; old-ip is
|
||||
replaced by new-ip. If the optional mask is given then any address
|
||||
which matches the masked old-ip will be re-written. So, for instance
|
||||
.B --alias=1.2.3.0,6.7.8.0,255.255.255.0
|
||||
will map 1.2.3.56 to 6.7.8.56 and 1.2.3.67 to 6.7.8.67. This is what
|
||||
Cisco PIX routers call "DNS doctoring".
|
||||
.TP
|
||||
.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
|
||||
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 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
|
||||
the public DNS and can cause problems by triggering dial-on-demand links. This flag turns on an option
|
||||
to filter such requests. The requests blocked are for records of types SOA and SRV, and type ANY where the
|
||||
requested name has underscores, to catch LDAP requests.
|
||||
.TP
|
||||
.B \-r, --resolv-file=<file>
|
||||
Read the IP addresses of the upstream nameservers from <file>, instead of
|
||||
/etc/resolv.conf. For the format of this file see
|
||||
.BR resolv.conf (5)
|
||||
the only lines relevant to dnsmasq are nameserver ones. Dnsmasq can
|
||||
be told to poll more than one resolv.conf file, the first file name specified
|
||||
overrides the default, subsequent ones add to the list. This is only
|
||||
allowed when polling; the file with the currently latest modification
|
||||
time is the one used.
|
||||
.TP
|
||||
.B \-R, --no-resolv
|
||||
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
|
||||
be up. Setting this flag forces dnsmasq to try each query with each
|
||||
server strictly in the order they appear in /etc/resolv.conf
|
||||
.TP
|
||||
.B \-n, --no-poll
|
||||
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 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 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
|
||||
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
|
||||
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,
|
||||
.B //
|
||||
has the special meaning of "unqualified names only" ie names without any
|
||||
dots in them. A non-standard port may be specified as
|
||||
part of the IP
|
||||
address using a # character.
|
||||
More than one -S flag is allowed, with
|
||||
repeated domain or ipaddr parts as required.
|
||||
|
||||
Also permitted is a -S
|
||||
flag which gives a domain but no IP address; this tells dnsmasq that
|
||||
a domain is local and it may answer queries from /etc/hosts or DHCP
|
||||
but should never forward queries on that domain to any upstream
|
||||
servers.
|
||||
.B local
|
||||
is a synonym for
|
||||
.B server
|
||||
to make configuration files clearer in this case.
|
||||
|
||||
The optional second IP address after the @ character tells
|
||||
dnsmasq how to set the source address of the queries to this
|
||||
nameserver. It should be an address belonging to the machine on which
|
||||
dnsmasq is running otherwise this server line will be logged and then
|
||||
ignored. The query-port flag is ignored for any servers which have a
|
||||
source address specified but the port may be specified directly as
|
||||
part of the source address.
|
||||
.TP
|
||||
.B \-A, --address=/<domain>/[domain/]<ipaddr>
|
||||
Specify an IP address to return for any host in the given domains.
|
||||
Queries in the domains are never forwarded and always replied to
|
||||
with the specified IP address which may be IPv4 or IPv6. To give
|
||||
both IPv4 and IPv6 addresses for a domain, use repeated -A flags.
|
||||
Note that /etc/hosts and DHCP leases override this for individual
|
||||
names. A common use of this is to redirect the entire doubleclick.net
|
||||
domain to some friendly local web server to avoid banner ads. The
|
||||
domain specification works in the same was as for --server, with the
|
||||
additional facility that /#/ matches any domain. Thus
|
||||
--address=/#/1.2.3.4 will always return 1.2.3.4 for any query not
|
||||
answered from /etc/hosts or DHCP and not sent to an upstream
|
||||
nameserver by a more specific --server directive.
|
||||
.TP
|
||||
.B \-m, --mx-host=<mx name>[[,<hostname>],<preference>]
|
||||
Return an MX record named <mx name> pointing to the given hostname (if
|
||||
given), or
|
||||
the host specified in the --mx-target switch
|
||||
or, if that switch is not given, the host on which dnsmasq
|
||||
is running. The default is useful for directing mail from systems on a LAN
|
||||
to a central server. The preference value is optional, and defaults to
|
||||
1 if not given. More than one MX record may be given for a host.
|
||||
.TP
|
||||
.B \-t, --mx-target=<hostname>
|
||||
Specify the default target for the MX record returned by dnsmasq. See
|
||||
--mx-host. If --mx-target is given, but not --mx-host, then dnsmasq
|
||||
returns a MX record containing the MX target for MX queries on the
|
||||
hostname of the machine on which dnsmasq is running.
|
||||
.TP
|
||||
.B \-e, --selfmx
|
||||
Return an MX record pointing to itself for each local
|
||||
machine. Local machines are those in /etc/hosts or with DHCP leases.
|
||||
.TP
|
||||
.B \-L, --localmx
|
||||
Return an MX record pointing to the host given by mx-target (or the
|
||||
machine on which dnsmasq is running) for each
|
||||
local machine. Local machines are those in /etc/hosts or with DHCP
|
||||
leases.
|
||||
.TP
|
||||
.B \-W, --srv-host=<_service>.<_prot>.[<domain>],[<target>[,<port>[,<priority>[,<weight>]]]]
|
||||
Return a SRV DNS record. See RFC2782 for details. If not supplied, the
|
||||
domain defaults to that given by
|
||||
.B --domain.
|
||||
The default for the target domain is empty, and the default for port
|
||||
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.
|
||||
.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.
|
||||
.TP
|
||||
.B \-N, --no-negcache
|
||||
Disable negative caching. Negative caching allows dnsmasq to remember
|
||||
"no such domain" answers from upstream nameservers and answer
|
||||
identical queries without forwarding them again. This flag disables
|
||||
negative caching.
|
||||
.TP
|
||||
.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 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
|
||||
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
|
||||
.B interface
|
||||
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.
|
||||
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
|
||||
addresses given via
|
||||
.B dhcp-host
|
||||
or from /etc/ethers will be served.
|
||||
.TP
|
||||
.B \-G, --dhcp-host=[[<hwaddr>]|[id:[<client_id>][*]]][net:<netid>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore]
|
||||
Specify per host parameters for the DHCP server. This allows a machine
|
||||
with a particular hardware address to be always allocated the same
|
||||
hostname, IP address and lease time. A hostname specified like this
|
||||
overrides any supplied by the DHCP client on the machine. It is also
|
||||
allowable to ommit the hardware address and include the hostname, in
|
||||
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 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
|
||||
dnsmasq to always allocate the machine lap the IP address
|
||||
192.168.0.199. Addresses allocated like this are not constrained to be
|
||||
in the range given by the --dhcp-range option, but they must be on the
|
||||
network being served by the DHCP server. It is allowed to use client identifiers rather than
|
||||
hardware addresses to identify hosts by prefixing with 'id:'. Thus:
|
||||
.B --dhcp-host=id:01:02:03:04,.....
|
||||
refers to the host with client identifier 01:02:03:04. It is also
|
||||
allowed to specify the client ID as text, like this:
|
||||
.B --dhcp-host=id:clientidastext,.....
|
||||
The special option id:* means "ignore any client-id
|
||||
and use MAC addresses only." This is useful when a client presents a client-id sometimes
|
||||
but not others.
|
||||
If a name appears in /etc/hosts, the associated address can be
|
||||
allocated to a DHCP lease, but only if a
|
||||
.B --dhcp-host
|
||||
option specifying the name also exists. The special keyword "ignore"
|
||||
tells dnsmasq to never offer a DHCP lease to a machine. The machine
|
||||
can be specified by hardware address, client ID or hostname, for
|
||||
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> 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
|
||||
format of /etc/ethers is a hardware address, followed by either a
|
||||
hostname or dotted-quad IP address. When read by dnsmasq these lines
|
||||
have exactly the same effect as
|
||||
.B --dhcp-host
|
||||
options containing the same information.
|
||||
.TP
|
||||
.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
|
||||
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
|
||||
.B --dhcp-option=42,192.168.0.4
|
||||
The special address 0.0.0.0 is taken to mean "the address of the
|
||||
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. 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
|
||||
"vendor class" which represents, in some sense, the type of host. This option
|
||||
maps vendor classes to network ids, so that DHCP options may be selectively delivered
|
||||
to different classes of hosts. For example
|
||||
.B dhcp-vendorclass=printers,Hewlett-Packard JetDirect
|
||||
will allow options to be set only for HP printers like so:
|
||||
.B --dhcp-option=printers,3,192.168.4.4
|
||||
The vendor-class string is
|
||||
substring matched against the vendor-class supplied by the client, to
|
||||
allow fuzzy matching.
|
||||
.TP
|
||||
.B \-j, --dhcp-userclass=<network-id>,<user-class>
|
||||
Map from a user-class string to a network id (with substring
|
||||
matching, like vendor classes). Most DHCP clients provide a
|
||||
"user class" which is configurable. This option
|
||||
maps user classes to network ids, so that DHCP options may be selectively delivered
|
||||
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 \-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.
|
||||
.TP
|
||||
.B \-M, --dhcp-boot=[net:<network-id>,]<filename>,[<servername>[,<server address>]]
|
||||
Set BOOTP options to be returned by the DHCP server. These are needed
|
||||
for machines which network boot, and tell the machine where to collect
|
||||
its initial configuration. If the optional network-id(s) are given,
|
||||
they must match for this configuration to be sent. Note that
|
||||
network-ids are prefixed by "net:" to distinguish them.
|
||||
.TP
|
||||
.B \-X, --dhcp-lease-max=<number>
|
||||
Limits dnsmasq to the specified maximum number of DHCP leases. The
|
||||
default is 150. This limit is to prevent DoS attacks from hosts which
|
||||
create thousands of leases and use lots of memory in the dnsmasq
|
||||
process.
|
||||
.TP
|
||||
.B \-K, --dhcp-authoritative
|
||||
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. 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
|
||||
is given but no dhcp-range option is given then dnsmasq version 1
|
||||
behaviour is activated. The file given is assumed to be an ISC dhcpd
|
||||
lease file and parsed for leases which are then added to the DNS
|
||||
system if they have a hostname. This functionality may have been
|
||||
excluded from dnsmasq at compile time, in which case an error will
|
||||
occur. In any case note that ISC leasefile integration is a deprecated
|
||||
feature. It should not be used in new installations, and will be
|
||||
removed in a future release.
|
||||
.TP
|
||||
.B \-6 --dhcp-script=<path>
|
||||
Whenever a new DHCP lease is created, or an old one destroyed, the
|
||||
binary specified by this option is run. The arguments to the binary
|
||||
are "add", "old" or "del", the MAC
|
||||
address of the host (or "<null>"), the IP address, and the hostname,
|
||||
if known. "add" means a lease has been created, "del" means it has
|
||||
been destroyed, "old" is a notification of an existing lease when
|
||||
dnsmasq starts or a change to MAC address or hostname of an existing lease.
|
||||
The process is run as any unprivileged user which dnsmasq
|
||||
runs as, so it may be necessary to inhibit dropping of the root user,
|
||||
using the
|
||||
.B -u
|
||||
directive, if the script needs root privs.
|
||||
The environment is inherited from the invoker of dnsmasq,
|
||||
and all file decriptors are
|
||||
closed except stdin, stdout and stderr which are open to /dev/null
|
||||
(except in debug mode).
|
||||
The script is not invoked concurrently: if subsequent lease
|
||||
changes occur, the script is not invoked again until any existing
|
||||
invokation exits. At dnsmasq startup, the script will be invoked for
|
||||
all existing leases as they are read from the lease file. Expired
|
||||
leases will be called with "del" and others with "old". <path>
|
||||
must be an absolute pathname, no PATH search occurs.
|
||||
.TP
|
||||
.B \-s, --domain=<domain>
|
||||
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=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
|
||||
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 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
|
||||
) (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. 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
|
||||
clears its cache and then re-loads
|
||||
.I /etc/hosts.
|
||||
If
|
||||
.B
|
||||
--no-poll
|
||||
is set SIGHUP also re-reads
|
||||
.I /etc/resolv.conf.
|
||||
SIGHUP
|
||||
does NOT re-read the configuration file.
|
||||
.PP
|
||||
When it receives a SIGUSR1,
|
||||
.B dnsmasq
|
||||
writes cache statistics to the system log. It writes the cache size,
|
||||
the number of names which have had to removed from the cache before
|
||||
they expired in order to make room for new names and the total number
|
||||
of names that have been inserted into the cache. In
|
||||
.B --no-daemon
|
||||
mode or when full logging is enabled (-q), a complete dump of the contents of the cache is made.
|
||||
.PP
|
||||
Dnsmasq is a DNS query forwarder: it it not capable of recursively
|
||||
answering arbitrary queries starting from the root servers but
|
||||
forwards such queries to a fully recursive upstream DNS server which is
|
||||
typically provided by an ISP. By default, dnsmasq reads
|
||||
.I /etc/resolv.conf
|
||||
to discover the IP
|
||||
addresses of the upstream nameservers it should use, since the
|
||||
information is typically stored there. Unless
|
||||
.B --no-poll
|
||||
is used,
|
||||
.B dnsmasq
|
||||
checks the modification time of
|
||||
.I /etc/resolv.conf
|
||||
(or equivalent if
|
||||
.B \--resolv-file
|
||||
is used) and re-reads it if it changes. This allows the DNS servers to
|
||||
be set dynamically by PPP or DHCP since both protocols provide the
|
||||
information.
|
||||
Absence of
|
||||
.I /etc/resolv.conf
|
||||
is not an error
|
||||
since it may not have been created before a PPP connection exists. Dnsmasq
|
||||
simply keeps checking in case
|
||||
.I /etc/resolv.conf
|
||||
is created at any
|
||||
time. Dnsmasq can be told to parse more than one resolv.conf
|
||||
file. This is useful on a laptop, where both PPP and DHCP may be used:
|
||||
dnsmasq can be set to poll both
|
||||
.I /etc/ppp/resolv.conf
|
||||
and
|
||||
.I /etc/dhcpc/resolv.conf
|
||||
and will use the contents of whichever changed
|
||||
last, giving automatic switching between DNS servers.
|
||||
.PP
|
||||
Upstream servers may also be specified on the command line or in
|
||||
the configuration file. These server specifications optionally take a
|
||||
domain name which tells dnsmasq to use that server only to find names
|
||||
in that particular domain.
|
||||
.PP
|
||||
In order to configure dnsmasq to act as cache for the host on which it is running, put "nameserver 127.0.0.1" in
|
||||
.I /etc/resolv.conf
|
||||
to force local processes to send queries to
|
||||
dnsmasq. Then either specify the upstream servers directly to dnsmasq
|
||||
using
|
||||
.B \--server
|
||||
options or put their addresses real in another file, say
|
||||
.I /etc/resolv.dnsmasq
|
||||
and run dnsmasq with the
|
||||
.B \-r /etc/resolv.dnsmasq
|
||||
option. This second technique allows for dynamic update of the server
|
||||
addresses by PPP or DHCP.
|
||||
.PP
|
||||
Addresses in /etc/hosts will "shadow" different addresses for the same
|
||||
names in the upstream DNS, so "mycompany.com 1.2.3.4" in /etc/hosts will ensure that
|
||||
queries for "mycompany.com" always return 1.2.3.4 even if queries in
|
||||
the upstream DNS would otherwise return a different address. There is
|
||||
one exception to this: if the upstream DNS contains a CNAME which
|
||||
points to a shadowed name, then looking up the CNAME through dnsmasq
|
||||
will result in the unshadowed address associated with the target of
|
||||
the CNAME. To work around this, add the CNAME to /etc/hosts so that
|
||||
the CNAME is shadowed too.
|
||||
|
||||
.PP
|
||||
The network-id system works as follows: For each DHCP request, dnsmasq
|
||||
collects a set of valid network-id tags, one from the
|
||||
.B dhcp-range
|
||||
used to allocate the address, one from any matching
|
||||
.B dhcp-host
|
||||
and possibly many from matching vendor classes and user
|
||||
classes sent by the DHCP client. Any
|
||||
.B dhcp-option
|
||||
which has network-id tags will be used in preference to an untagged
|
||||
.B dhcp-option,
|
||||
provided that _all_ the tags match somewhere in the
|
||||
set collected as described above. The prefix '#' on a tag means 'not'
|
||||
so --dhcp=option=#purple,3,1.2.3.4 sends the option when the
|
||||
network-id tag purple is not in the set of valid tags.
|
||||
.PP
|
||||
If the network-id in a
|
||||
.B dhcp-range
|
||||
is prefixed with 'net:' then its meaning changes from setting a
|
||||
tag to matching it. Thus if there is more than dhcp-range on a subnet,
|
||||
and one is tagged with a network-id which is set (for instance
|
||||
from a vendorclass option) then hosts which set the netid tag will be
|
||||
allocated addresses in the tagged range.
|
||||
.PP
|
||||
The DHCP server in dnsmasq will function as a BOOTP server also,
|
||||
provided that the MAC address and IP address for clients are given,
|
||||
either using
|
||||
.B dhcp-host
|
||||
configurations or in
|
||||
.I /etc/ethers
|
||||
, and a
|
||||
.B dhcp-range
|
||||
configuration option is present to activate the DHCP server
|
||||
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
|
||||
different classes of hosts.
|
||||
|
||||
.SH FILES
|
||||
.IR /etc/dnsmasq.conf
|
||||
|
||||
.IR /usr/local/etc/dnsmasq.conf
|
||||
|
||||
.IR /etc/resolv.conf
|
||||
|
||||
.IR /etc/hosts
|
||||
|
||||
.IR /etc/ethers
|
||||
|
||||
.IR /var/lib/misc/dnsmasq.leases
|
||||
|
||||
.IR /var/db/dnsmasq.leases
|
||||
|
||||
.IR /var/run/dnsmasq.pid
|
||||
.SH SEE ALSO
|
||||
.BR hosts (5),
|
||||
.BR resolver (5)
|
||||
.SH AUTHOR
|
||||
This manual page was written by Simon Kelley <simon@thekelleys.org.uk>.
|
||||
|
||||
|
||||
944
po/de.po
Normal file
944
po/de.po
Normal file
@@ -0,0 +1,944 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
# @Simon: Here I need an example to understand it :)
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
# @Simon: Here I need an example to understand it :)
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
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:127
|
||||
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:128
|
||||
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:129
|
||||
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:130
|
||||
#, 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:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr "Angabe der Konfigurationsdatei (Voreinstellung: %s)."
|
||||
|
||||
#: option.c:132
|
||||
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:133
|
||||
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:134
|
||||
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:135
|
||||
msgid "Expand simple names in /etc/hosts with domain-suffix."
|
||||
msgstr "Erweitere einfache Namen in /etc/hosts mit der Domänen-Endung"
|
||||
|
||||
#: option.c:136
|
||||
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:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:138
|
||||
#, c-format
|
||||
msgid "Change to this group after startup (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:141
|
||||
#, c-format
|
||||
msgid "Specify a hosts file to be read in addition to %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:146
|
||||
msgid "Do NOT fork into the background, do NOT run in debug mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:147
|
||||
msgid "Assume we are the only DHCP server on the local network."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:148
|
||||
#, c-format
|
||||
msgid "Specify where to store DHCP leases (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:152
|
||||
#, c-format
|
||||
msgid "Do NOT poll %s file, reload only on SIGHUP."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:154
|
||||
#, c-format
|
||||
msgid "Use nameservers strictly in the order given in %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:156
|
||||
msgid "Specify port to listen for DNS requests on (defaults to 53)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:157
|
||||
#, c-format
|
||||
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:158
|
||||
msgid "Log queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:166
|
||||
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:167
|
||||
#, c-format
|
||||
msgid "Change to this user after startup. (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:174
|
||||
#, c-format
|
||||
msgid "Specify maximum number of DHCP leases (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:175
|
||||
msgid "Answer DNS queries based on the interface a query was sent to."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:182
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr ""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:452
|
||||
#, c-format
|
||||
msgid "Use short options only on the command line.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:482
|
||||
#, c-format
|
||||
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:483
|
||||
#, c-format
|
||||
msgid "under the terms of the GNU General Public License, version 2.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1885
|
||||
msgid "only one resolv.conf file allowed in no-poll mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1892
|
||||
msgid "must have exactly one resolv.conf to read domain from."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:321
|
||||
#, c-format
|
||||
msgid "failed to set IPV6 options on listening socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:339
|
||||
#, c-format
|
||||
msgid "failed to bind listening socket for %s: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:424
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:438
|
||||
msgid "domain"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, c-format
|
||||
msgid "DBus error: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:161
|
||||
msgid "DBus not available: set HAVE_DBUS in src/config.h"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:192
|
||||
#, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, c-format
|
||||
msgid "DHCP, static leases only on %.0s%s, lease time %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:587
|
||||
msgid "connected to system DBus"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:32
|
||||
#, c-format
|
||||
msgid "cannot create DHCP socket : %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:48
|
||||
#, c-format
|
||||
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:316
|
||||
#, c-format
|
||||
msgid "DHCP range %s -- %s is not consistent with netmask %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:651
|
||||
#, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:755
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s (%s) in dhcp-config directive"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:791
|
||||
#, c-format
|
||||
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:175
|
||||
#, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:436
|
||||
#, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, c-format
|
||||
msgid "no address range available for DHCP request %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "with subnet selector"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, c-format
|
||||
msgid "cannot send DHCP option %d: no space left in packet"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:1237
|
||||
#, c-format
|
||||
msgid "More than one vendor class matches, using %s"
|
||||
msgstr ""
|
||||
|
||||
#: netlink.c:51
|
||||
#, c-format
|
||||
msgid "cannot create netlink socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: netlink.c:224
|
||||
#, c-format
|
||||
msgid "netlink 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: bpf.c:79
|
||||
#, c-format
|
||||
msgid "DHCP request for unsupported hardware type (%d) received on %s"
|
||||
msgstr ""
|
||||
933
po/es.po
Normal file
933
po/es.po
Normal file
@@ -0,0 +1,933 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, fuzzy, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr "nombre erróneo en %s línea %d"
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr "nombre erróneo en %s línea %d"
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
msgid "Specify local address(es) to listen on."
|
||||
msgstr "Especificar dirección(es) locales dónde escuchar."
|
||||
|
||||
#: option.c:127
|
||||
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:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr ""
|
||||
"Falsificar búsquedas reversas para rangos de dirección privados RFC1918."
|
||||
|
||||
#: option.c:129
|
||||
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
|
||||
msgstr "Tratar ipaddr (dirección IP) como NXDOMAIN (derrota comodín Verisign)."
|
||||
|
||||
#: option.c:130
|
||||
#, 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:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr "Especificar archivo de configuración (%s por predeterminado)."
|
||||
|
||||
#: option.c:132
|
||||
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:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr "NO reenviar búsquedas sin parte de dominio."
|
||||
|
||||
#: option.c:134
|
||||
msgid "Return self-pointing MX records for local hosts."
|
||||
msgstr "Retornar records MX auto-señaladores para hosts locales."
|
||||
|
||||
#: option.c:135
|
||||
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:136
|
||||
msgid "Don't forward spurious DNS requests from Windows hosts."
|
||||
msgstr "No reenviar pedidos DNS falsos desde máquinas Windows."
|
||||
|
||||
#: option.c:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr "Habilitar DHCP dentro del rango brindado con duración del arriendo."
|
||||
|
||||
#: option.c:138
|
||||
#, 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:139
|
||||
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:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr "NO cargar archivo %s."
|
||||
|
||||
#: option.c:141
|
||||
#, 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:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr "Especificar interface(s) donde escuchar."
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr "Especificar interface(s) donde NO escuchar."
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr "Trazar clase de usuario DHCP a la opción fijada."
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr "No hacer DHCP para hosts en la opción fijada."
|
||||
|
||||
#: option.c:146
|
||||
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:147
|
||||
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:148
|
||||
#, c-format
|
||||
msgid "Specify where to store DHCP leases (defaults to %s)."
|
||||
msgstr "Especificar donde guardar arriendos DHCP (%s por predeterminado)."
|
||||
|
||||
#: option.c:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr "Retornar récords MX para hosts locales."
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr "Especificar un récord MX."
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr "Especificar opciónes BOOTP a servidor DHCP."
|
||||
|
||||
#: option.c:152
|
||||
#, c-format
|
||||
msgid "Do NOT poll %s file, reload only on SIGHUP."
|
||||
msgstr "NO revisar archivo %s periodicamente, recargar solo con SIGHUP."
|
||||
|
||||
#: option.c:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr "NO cachear resultados de búsquedas fallidas."
|
||||
|
||||
#: option.c:154
|
||||
#, 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:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr "Fijar opciones extra para ser enviadas a clientes DHCP."
|
||||
|
||||
#: option.c:156
|
||||
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:157
|
||||
#, 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:158
|
||||
msgid "Log queries."
|
||||
msgstr "Bitacorear búsquedas."
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr "Enforzar el puerto original para búsquedas upstream."
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr "NO leer resolv.conf."
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr "Especificar el destino hacia resolv.conf (%s por predeterminado)."
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr ""
|
||||
"Especificar dirección(es) de servidor upstream con dominios opcionales."
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr "Nunca reenviar búsquedas a dominios especificados."
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr "Especificar dominio para asignar en arriendos DHCP."
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr "Especificar destino predeterminado en un récord MX."
|
||||
|
||||
#: option.c:166
|
||||
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:167
|
||||
#, 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:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr "Trazar clase de vendedor DHCP a opción fijada."
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr "Mostrar información sobre la versión y copyright de dnsmasq."
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr "Traducir direcciones IPv4 desde servidores upstream."
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr "Especificar un récord SRV."
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr "Mostrar este mensaje."
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr "Especificar path de archivo PID (%s por predeterminado)."
|
||||
|
||||
#: option.c:174
|
||||
#, 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:175
|
||||
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:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr "Especificar récord DNS TXT."
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr "Acoplar solo a interfaces en uso."
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr "Leer información sobre hosts DHCP estáticos desde %s."
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr "Habilitar la interface DBus para fijar servidores upstream, etc."
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr "No proveer DHCP en esta interface, solo proveer DNS."
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr "Habilitar alocación dinámica de direcciónes para BOOTP."
|
||||
|
||||
#: option.c:182
|
||||
#, fuzzy
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr "Trazar clase de vendedor DHCP a opción fijada."
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr "falta \""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr "opción errónea"
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr "no se puede leer %s: %s"
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Modo de uso: dnsmasq [opciones]\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:452
|
||||
#, 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:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr "Opciones válidas son :\n"
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr "Dnsmasq versión %s %s\n"
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Opciones de compilación %s\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr "Este software viene SIN NINGUNA GARANTIA.\n"
|
||||
|
||||
#: option.c:482
|
||||
#, 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:483
|
||||
#, 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:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr "parámetro extraño"
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr "parámetro ausente"
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr "inclusiones jerarquizadas no permitidas"
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr "preferencia MX errónea"
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr "nombre MX erróneo"
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr "destino MX erróneo"
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr "puerto erróneo"
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr "dhcp-range (rango DHCP) erróneo"
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr "rango DHCP inconsistente"
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr "dhcp-host erróneo"
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr "dhcp-option erróneo"
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr "dominio erróneo en dhcp-option"
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr "opción dhcp-option demasiado larga"
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr "récord TXT erróneo"
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr "récord TXT demasiado largo"
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr "récord SRV erróneo"
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr "destino SRV erróneo"
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr "número de puerto inválido"
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr "prioridad inválida"
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr "peso inválido"
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr "error"
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr "opciones de línea de comandos erróneas: %s."
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr "no se puede obtener host-name (nombre de host): %s"
|
||||
|
||||
#: option.c:1885
|
||||
msgid "only one resolv.conf file allowed in no-poll mode."
|
||||
msgstr "solo un archivo resolv.conf permitido en modo no-poll."
|
||||
|
||||
#: option.c:1892
|
||||
msgid "must have exactly one resolv.conf to read domain from."
|
||||
msgstr "debe haber exactamente un resolv.conf desde donde leer dominio."
|
||||
|
||||
#: option.c:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr "no se pudo leer %s: %m"
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr "no se pudo crear un socket escuchador: %s"
|
||||
|
||||
#: network.c:321
|
||||
#, 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:339
|
||||
#, c-format
|
||||
msgid "failed to bind listening socket for %s: %s"
|
||||
msgstr "no se pudo acoplar socket escuchador para %s: %s"
|
||||
|
||||
#: network.c:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr "no se pudo escuchar en el socket: %s"
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr "ignorando servidor DNS %s - interface local"
|
||||
|
||||
#: network.c:424
|
||||
#, 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:438
|
||||
msgid "domain"
|
||||
msgstr "dominio"
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr "no calificado"
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr "dominios"
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr "usando direcciones locales solo para %s %s"
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr "usando servidor DNS %s#%d para %s %s"
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, 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:192
|
||||
#, fuzzy, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr "no se puede leer %s: %s"
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr "versión %s iniciada, tamaño de caché %d"
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr "versión %s iniciada, caché deshabilitado"
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr "opciones de compilación: %s"
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr "soporte DBus habilitado: conectado a bus de sistema"
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr "soporte DBus habilitado: conección a bus pendiente"
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr ""
|
||||
"fijando opción --bind-interfaces debido a limitaciones de sistema operativo"
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr "advertencia: interface %s no existe actualmente"
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, 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:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr "DHCP, rango de IP %s -- %s, tiempo de arriendo %s"
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr "corriendo como root"
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr "haciendo exit al haber recibido SIGTERM"
|
||||
|
||||
#: dnsmasq.c:587
|
||||
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:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr "no se pudo fijar opciones en socket DHCP: %s"
|
||||
|
||||
#: dhcp.c:48
|
||||
#, 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:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr "no se pudo acoplar socket de servidor DHCP: %s"
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr "no se puede crear socket crudo ICMP: %s."
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr "dirección IP duplicada en directiva dhcp-config."
|
||||
|
||||
#: dhcp.c:316
|
||||
#, 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:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr "no se pudo leer %s:%m"
|
||||
|
||||
#: dhcp.c:651
|
||||
#, fuzzy, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr "nombre erróneo en %s línea %d"
|
||||
|
||||
#: dhcp.c:755
|
||||
#, 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:791
|
||||
#, 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:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr "no se puede abrir o crear archivo de arriendos: %s"
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr "demasiados arriendos almacenados"
|
||||
|
||||
#: lease.c:175
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr "no se pudo leer %s: %m"
|
||||
|
||||
#: lease.c:436
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr "no se pudo accesar %s: %m"
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, 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:247
|
||||
msgid "with subnet selector"
|
||||
msgstr "con selector de subred"
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr "vía"
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr "deshabilitado"
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr "dirección en uso"
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr "ninguna dirección configurada"
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr "ninguna dirección disponible"
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr "no queda ningún arriendo"
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr "red equivocada"
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr "deshabilitando dirección DHCP estática %s"
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr "arriendo desconocido"
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr "ignorado"
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr "dirección equivocada"
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr "arriendo no encontrado"
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr "dirección no disponible"
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr "arriendo estático disponible"
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr "dirección reservada"
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, 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:1237
|
||||
#, 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 netlink socket: %s"
|
||||
msgstr "no se puede acoplar socket netlink: %s"
|
||||
|
||||
#: netlink.c:224
|
||||
#, fuzzy, c-format
|
||||
msgid "netlink returns error: %s"
|
||||
msgstr "error DBus: %s"
|
||||
|
||||
#: 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr "no se puede crear socket BPF DHCP: %s"
|
||||
|
||||
#: bpf.c:79
|
||||
#, 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?"
|
||||
895
po/fi.po
Normal file
895
po/fi.po
Normal file
@@ -0,0 +1,895 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
msgid "Specify local address(es) to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:127
|
||||
msgid "Return ipaddr for all hosts in specified domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:129
|
||||
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:130
|
||||
#, c-format
|
||||
msgid "Specify the size of the cache in entries (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:132
|
||||
msgid "Do NOT fork into the background: run in debug mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:134
|
||||
msgid "Return self-pointing MX records for local hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:135
|
||||
msgid "Expand simple names in /etc/hosts with domain-suffix."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:136
|
||||
msgid "Don't forward spurious DNS requests from Windows hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:138
|
||||
#, c-format
|
||||
msgid "Change to this group after startup (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:141
|
||||
#, c-format
|
||||
msgid "Specify a hosts file to be read in addition to %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:146
|
||||
msgid "Do NOT fork into the background, do NOT run in debug mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:147
|
||||
msgid "Assume we are the only DHCP server on the local network."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:148
|
||||
#, c-format
|
||||
msgid "Specify where to store DHCP leases (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:152
|
||||
#, c-format
|
||||
msgid "Do NOT poll %s file, reload only on SIGHUP."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:154
|
||||
#, c-format
|
||||
msgid "Use nameservers strictly in the order given in %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:156
|
||||
msgid "Specify port to listen for DNS requests on (defaults to 53)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:157
|
||||
#, c-format
|
||||
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:158
|
||||
msgid "Log queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:166
|
||||
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:167
|
||||
#, c-format
|
||||
msgid "Change to this user after startup. (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:174
|
||||
#, c-format
|
||||
msgid "Specify maximum number of DHCP leases (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:175
|
||||
msgid "Answer DNS queries based on the interface a query was sent to."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:182
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr ""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:452
|
||||
#, c-format
|
||||
msgid "Use short options only on the command line.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:482
|
||||
#, c-format
|
||||
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:483
|
||||
#, c-format
|
||||
msgid "under the terms of the GNU General Public License, version 2.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1885
|
||||
msgid "only one resolv.conf file allowed in no-poll mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1892
|
||||
msgid "must have exactly one resolv.conf to read domain from."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:321
|
||||
#, c-format
|
||||
msgid "failed to set IPV6 options on listening socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:339
|
||||
#, c-format
|
||||
msgid "failed to bind listening socket for %s: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:424
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:438
|
||||
msgid "domain"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, c-format
|
||||
msgid "DBus error: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:161
|
||||
msgid "DBus not available: set HAVE_DBUS in src/config.h"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:192
|
||||
#, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, c-format
|
||||
msgid "DHCP, static leases only on %.0s%s, lease time %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:587
|
||||
msgid "connected to system DBus"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:32
|
||||
#, c-format
|
||||
msgid "cannot create DHCP socket : %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:48
|
||||
#, c-format
|
||||
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:316
|
||||
#, c-format
|
||||
msgid "DHCP range %s -- %s is not consistent with netmask %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:651
|
||||
#, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:755
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s (%s) in dhcp-config directive"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:791
|
||||
#, c-format
|
||||
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:175
|
||||
#, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:436
|
||||
#, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, c-format
|
||||
msgid "no address range available for DHCP request %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "with subnet selector"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, c-format
|
||||
msgid "cannot send DHCP option %d: no space left in packet"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:1237
|
||||
#, c-format
|
||||
msgid "More than one vendor class matches, using %s"
|
||||
msgstr ""
|
||||
|
||||
#: netlink.c:51
|
||||
#, c-format
|
||||
msgid "cannot create netlink socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: netlink.c:224
|
||||
#, c-format
|
||||
msgid "netlink 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: bpf.c:79
|
||||
#, c-format
|
||||
msgid "DHCP request for unsupported hardware type (%d) received on %s"
|
||||
msgstr ""
|
||||
951
po/fr.po
Normal file
951
po/fr.po
Normal file
@@ -0,0 +1,951 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, fuzzy, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr "mauvais nom dans %s ligne %d"
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr "mauvais nom dans %s ligne %d"
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
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:127
|
||||
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:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr "Traduction inverse truquee pour la plage d'adresse privee RFC1918"
|
||||
|
||||
#: option.c:129
|
||||
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:130
|
||||
#, 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:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr "Specifie le nom du fichier de configuration (par defaut %s)"
|
||||
|
||||
#: option.c:132
|
||||
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:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr "Ne retransmet pas les requetes qui n'ont pas de domaine."
|
||||
|
||||
#: option.c:134
|
||||
msgid "Return self-pointing MX records for local hosts."
|
||||
msgstr "Retourne les champs MX pour les machines locales."
|
||||
|
||||
#: option.c:135
|
||||
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:136
|
||||
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:137
|
||||
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:138
|
||||
#, 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:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr "On assigne une adresse ou un nom pour une machine specifiee."
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr "Ne charge PAS le fichier %s."
|
||||
|
||||
#: option.c:141
|
||||
#, 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:142
|
||||
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:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr "Specifie la ou les interface(s) que le demon ne doit PAS traiter."
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr "Associe les 'user class' DHCP aux options."
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr "Ne pas autoriser DHCP pour les machines enumerees dans les options."
|
||||
|
||||
#: option.c:146
|
||||
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:147
|
||||
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:148
|
||||
#, 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:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr "Retourne les champs MX pour les machines locales."
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr "Specifie un champ MX."
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr "Specifie les options BOOTP pour le serveur DHCP."
|
||||
|
||||
#: option.c:152
|
||||
#, 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:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr "Ne place pas en cache le resultat des requetes qui ont echouees."
|
||||
|
||||
#: option.c:154
|
||||
#, 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:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr "Options supplementaires a associer aux clients DHCP."
|
||||
|
||||
#: option.c:156
|
||||
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:157
|
||||
#, 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:158
|
||||
msgid "Log queries."
|
||||
msgstr "Logue les requetes."
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr "Force le port d'origine des requetes vers les serveurs amonts."
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr "Ne pas lire le fichier resolv.conf."
|
||||
|
||||
#: option.c:161
|
||||
#, 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:162
|
||||
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:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr "Ne jamais retransmettre les requetes pour les domaines specifies."
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr "Specifie le domaine qui doit etre assigne aux baux DHCP."
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr "Speficie la cible par defaut dans un champ MX."
|
||||
|
||||
#: option.c:166
|
||||
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:167
|
||||
#, 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:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr "Associe les 'vendor class' DHCP aux options."
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr "Affiche la version de Dnsmasq et les informations liees au copyright."
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr "Traduit les adresses IPV4 des serveurs amonts."
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr " Specifie un champ SRV."
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr "Affiche ce message."
|
||||
|
||||
#: option.c:173
|
||||
#, 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:174
|
||||
#, 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:175
|
||||
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:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr "Specifie un champ DNS TXT"
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr "Associe seulement aux interfaces en utilisation."
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr "Lecture des informations de DHCP statique a partir de %s."
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr "Autorise l'interface DBus a configurer les serveurs amonts, etc."
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr "Ne fourni pas DHCP pour cette interface, mais seulement DNS."
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr "Autorise l'allocation dynamique d'adresse pour bootp."
|
||||
|
||||
#: option.c:182
|
||||
#, fuzzy
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr "Associe les 'vendor class' DHCP aux options."
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr "il manque \""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr "mauvaise option"
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr "Ne peut pas lire %s: %s"
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:452
|
||||
#, 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:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr "Les options valides sont :\n"
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr "Version de Dnsmasq %s %s\n"
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Options a la compilation %s\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr "Ce logiciel est fourni sans GARANTIE aucune.\n"
|
||||
|
||||
#: option.c:482
|
||||
#, 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:483
|
||||
#, 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:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr "parametre supplementaire"
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr "parametre manquant"
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr "Inclusions d'inclusions non autorisees"
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr "Mauvaise preference MX"
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr "mauvais nom MX"
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr "mauvaise cible MX"
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr "mauvais port"
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr "mauvaise plage d'adresses DHCP (dhcp-range)"
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr "plage d'adresses DHCP incoherente"
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr "mauvais dhcp-host"
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr "mauvais dhcp-option"
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr "mauvais domaine dans dhcp-option"
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr "dhcp-option trop long"
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr "mauvais champ TXT"
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr "chaîne du champ TXT trop longue"
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr "mauvais champ SRV"
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr "mauvaise cible SRV"
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr "numero de port invalide"
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr "priorite invalide"
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr "poids invalide"
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr "erreur"
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr "mauvaises options en ligne de commande: %s."
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr "ne peut pas obtenir le nom de la machine: %s"
|
||||
|
||||
#: option.c:1885
|
||||
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:1892
|
||||
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:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr "impossible de lire %s: %m"
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr "impossible de creer une socket de lecture: %s"
|
||||
|
||||
#: network.c:321
|
||||
#, 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:339
|
||||
#, c-format
|
||||
msgid "failed to bind listening socket for %s: %s"
|
||||
msgstr "impossible de lier la socket de lecture pour %s: %s"
|
||||
|
||||
#: network.c:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr "impossible de lire sur la socket: %s"
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr "on ignore le serveur de nom %s - interface locale"
|
||||
|
||||
#: network.c:424
|
||||
#, 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:438
|
||||
msgid "domain"
|
||||
msgstr "domaine"
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr "non-qualifie"
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr "domaines"
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr "on utilise les adresses locales seulement pour %s %s"
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr "on utilise le serveur de nom %s#%d pour %s %s"
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, 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:192
|
||||
#, fuzzy, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr "Ne peut pas lire %s: %s"
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr "demarre, version %s taille de cache %d"
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr "demarre, version %s cache desactive"
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr "options a la compilation: %s"
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr "Support DBus autorise: connecte au bus systeme"
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr "Support DBus autorise: connexion au bus en suspend"
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr "Active l'option --bind-interfaces a cause des limitations de l'OS"
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr "Attention: l'interface %s n'existe pas actuellement"
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, 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:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr "DHCP, plage d'adresse %s -- %s, duree de bail %s"
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr "execute sous root"
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr "sortie sur reception du signal SIGTERM"
|
||||
|
||||
#: dnsmasq.c:587
|
||||
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:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr "impossible d'appliquer les options sur la socket DHCP: %s"
|
||||
|
||||
#: dhcp.c:48
|
||||
#, 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:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr "impossible de lier la socket serveur DHCP: %s"
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr "ne peut creer de socket en mode raw pour ICMP: %s."
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr "adresse IP %s dupliquee dans la directive dhcp-config."
|
||||
|
||||
#: dhcp.c:316
|
||||
#, 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:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr "impossible de lire %s:%m"
|
||||
|
||||
#: dhcp.c:651
|
||||
#, fuzzy, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr "mauvais nom dans %s ligne %d"
|
||||
|
||||
#: dhcp.c:755
|
||||
#, 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:791
|
||||
#, 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:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr "ne peut ouvrir ou creer des fichiers de baux: %s"
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr "beaucoup trop de baux enregistres"
|
||||
|
||||
#: lease.c:175
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr "impossible de lire %s: %m"
|
||||
|
||||
#: lease.c:436
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr "impossible d'acceder a %s: %m"
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, 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:247
|
||||
msgid "with subnet selector"
|
||||
msgstr "avec selecteur de sous-reseau"
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr "par l'intermediaire de"
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr "desactive"
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr "adresse deja utilisee"
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr "pas d'adresse configuree"
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr "pas d'adresse disponible"
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr "aucun baux laisses"
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr "mauvais reseau"
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr "desactive l'adresse statique DHCP %s"
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr "bail inconnu"
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr "ignore"
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr "mauvaise adresse"
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr "bail non trouve"
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr "adresse non disponible"
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr "bail statique disponible"
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr "adresse reservee"
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, c-format
|
||||
msgid "cannot send DHCP option %d: no space left in packet"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:1237
|
||||
#, 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 netlink socket: %s"
|
||||
msgstr "ne peux lier une socket netlink: %s"
|
||||
|
||||
#: netlink.c:224
|
||||
#, fuzzy, c-format
|
||||
msgid "netlink returns error: %s"
|
||||
msgstr "Erreur DBus: %s"
|
||||
|
||||
#: 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr "impossible de creer une socket BPF pour DHCP: %s"
|
||||
|
||||
#: bpf.c:79
|
||||
#, 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?"
|
||||
923
po/no.po
Normal file
923
po/no.po
Normal file
@@ -0,0 +1,923 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr "dårlig adresse ved %s linje %d"
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr "dårlig navn ved %s linje %d"
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
msgid "Specify local address(es) to listen on."
|
||||
msgstr "Spesifiser lokal(e) adresse(r) å lytte på."
|
||||
|
||||
#: option.c:127
|
||||
msgid "Return ipaddr for all hosts in specified domains."
|
||||
msgstr "Returner ipaddr for alle verter i det spesifiserte domenet."
|
||||
|
||||
#: option.c:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr "Forfalsk revers oppslag for RFC1918 private adresse områder."
|
||||
|
||||
#: option.c:129
|
||||
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
|
||||
msgstr "Behandle ipaddr som NXDOMAIN (omgår Verisign wildcard)."
|
||||
|
||||
#: option.c:130
|
||||
#, 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:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr "Spesifiser konfigurasjonsfil (standard er %s)."
|
||||
|
||||
#: option.c:132
|
||||
msgid "Do NOT fork into the background: run in debug mode."
|
||||
msgstr "IKKE legg (fork) som bakgrunnsprosess: kjør i debug modus."
|
||||
|
||||
#: option.c:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr "IKKE videresend oppslag som mangler domene del."
|
||||
|
||||
#: option.c:134
|
||||
msgid "Return self-pointing MX records for local hosts."
|
||||
msgstr "Returner selv-pekende MX post for lokale verter."
|
||||
|
||||
#: option.c:135
|
||||
msgid "Expand simple names in /etc/hosts with domain-suffix."
|
||||
msgstr "Utvid enkle navn i /etc/hosts med domene-suffiks."
|
||||
|
||||
#: option.c:136
|
||||
msgid "Don't forward spurious DNS requests from Windows hosts."
|
||||
msgstr "Ikke videresend falske/uekte DNS forespørsler fra Windows verter."
|
||||
|
||||
#: option.c:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr "Aktiver DHCP i det gitte området med leie varighet"
|
||||
|
||||
#: option.c:138
|
||||
#, c-format
|
||||
msgid "Change to this group after startup (defaults to %s)."
|
||||
msgstr "Skift til denne gruppen etter oppstart (standard er %s)."
|
||||
|
||||
#: option.c:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr "Sett adresse eller vertsnavn for en spesifikk maskin."
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr "IKKE last %s filen."
|
||||
|
||||
#: option.c:141
|
||||
#, 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:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr "Spesifiser nettverkskort det skal lyttes på."
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr "Spesifiser nettverkskort det IKKE skal lyttes på."
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr "Map DHCP bruker klasse til opsjon sett."
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr "Ikke utfør DHCP for klienter i opsjon sett."
|
||||
|
||||
#: option.c:146
|
||||
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:147
|
||||
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:148
|
||||
#, c-format
|
||||
msgid "Specify where to store DHCP leases (defaults to %s)."
|
||||
msgstr "Spesifiser hvor DHCP leiene skal lagres (standard er %s)."
|
||||
|
||||
#: option.c:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr "Returner MX records for lokale verter."
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr "Spesifiser en MX post."
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr "Spesifiser BOOTP opsjoner til DHCP tjener."
|
||||
|
||||
#: option.c:152
|
||||
#, 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:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr "IKKE mellomlagre søkeresultater som feiler."
|
||||
|
||||
#: option.c:154
|
||||
#, 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:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr "Sett ekstra opsjoner som skal fordeles til DHCP klientene."
|
||||
|
||||
#: option.c:156
|
||||
msgid "Specify port to listen for DNS requests on (defaults to 53)."
|
||||
msgstr "Spesifiser lytteport for DNS oppslag (standard er 53)."
|
||||
|
||||
#: option.c:157
|
||||
#, 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:158
|
||||
msgid "Log queries."
|
||||
msgstr "Logg oppslag."
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr "Tving bruk av opprinnelig port for oppstrøms oppslag."
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr "IKKE les resolv.conf."
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr "Spesifiser stien til resolv.conf (standard er %s)."
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr "Spesifiser adressen(e) til oppstrøms tjenere med valgfrie domener."
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr "Aldri videresend oppslag til spesifiserte domener."
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr "Spesifiser domenet som skal tildeles i DHCP leien."
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr "Spesifiser default mål i en MX post."
|
||||
|
||||
#: option.c:166
|
||||
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:167
|
||||
#, c-format
|
||||
msgid "Change to this user after startup. (defaults to %s)."
|
||||
msgstr "Skift til denne bruker etter oppstart (standard er %s)."
|
||||
|
||||
#: option.c:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr "Map DHCP produsent klasse til opsjon sett."
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr "Vis dnsmasq versjon og copyright informasjon."
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr "Oversett IPv4 adresser fra oppstrøms tjenere."
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr "Spesifiser en SRV post."
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr "Vis denne meldingen."
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr "Spesifiser stien til PID fil. (standard er %s)."
|
||||
|
||||
#: option.c:174
|
||||
#, c-format
|
||||
msgid "Specify maximum number of DHCP leases (defaults to %s)."
|
||||
msgstr "Spesifiser maksimum antall DHCP leier (standard er %s)"
|
||||
|
||||
#: option.c:175
|
||||
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:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr "Spesifiser TXT DNS post."
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr "Bind kun til nettverkskort som er i bruk."
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr "Les DHCP statisk vert informasjon fra %s."
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr "Aktiver DBus interface for å sette oppstrøms tjenere, osv."
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr "Ikke lever DHCP på dette nettverkskortet, kun lever DNS."
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr "Aktiver dynamisk adresse allokering for bootp."
|
||||
|
||||
#: option.c:182
|
||||
#, fuzzy
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr "Map DHCP produsent klasse til opsjon sett."
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr "mangler \""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr "dårlig opsjon"
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr "kan ikke lese %s: %s"
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Bruk: dnsmasq [opsjoner]\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:452
|
||||
#, c-format
|
||||
msgid "Use short options only on the command line.\n"
|
||||
msgstr "Bruk korte opsjoner kun på kommandolinjen.\n"
|
||||
|
||||
#: option.c:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr "Gyldige opsjoner er :\n"
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr "Dnsmasq versjon %s %s\n"
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Kompileringsopsjoner %s\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr "Denne programvaren kommer med ABSOLUTT INGEN GARANTI.\n"
|
||||
|
||||
#: option.c:482
|
||||
#, 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:483
|
||||
#, 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:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr "overflødig parameter"
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr "mangler parameter"
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr "nøstede inkluderinger er ikke tillatt"
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr "dårlig MX preferanse"
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr "dårlig MX navn"
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr "dårlig MX mål"
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr "dårlig port"
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr "dårlig dhcp-område"
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr "ikke konsistent DHCP område"
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr "dårlig dhcp-vert"
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr "dårlig dhcp-opsjon"
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr "dårlig domene i dhcp-opsjon"
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr "dhcp-opsjon for lang"
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr "dårlig TXT post"
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr "TXT post streng for lang"
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr "dårlig SRV post"
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr "dårlig SRV mål"
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr "ugyldig portnummer"
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr "ugyldig prioritet"
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr "ugyldig vekt"
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr "feil"
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr "dårlige kommandlinje opsjoner: %s."
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr "klarer ikke å få vertsnavn: %s"
|
||||
|
||||
#: option.c:1885
|
||||
msgid "only one resolv.conf file allowed in no-poll mode."
|
||||
msgstr "kun en resolv.conf fil tillat i no-poll modus."
|
||||
|
||||
#: option.c:1892
|
||||
msgid "must have exactly one resolv.conf to read domain from."
|
||||
msgstr "må ha nøyaktig en resolv.conf å lese domene fra."
|
||||
|
||||
#: option.c:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr "feilet å lese %s: %m"
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr "feilet å lage lytte socket: %s"
|
||||
|
||||
#: network.c:321
|
||||
#, c-format
|
||||
msgid "failed to set IPV6 options on listening socket: %s"
|
||||
msgstr "feilet å sette IPv6 opsjoner på lytte socket: %s"
|
||||
|
||||
#: network.c:339
|
||||
#, c-format
|
||||
msgid "failed to bind listening socket for %s: %s"
|
||||
msgstr "feilet å binde lytte socket for %s: %s"
|
||||
|
||||
#: network.c:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr "feilet å lytte på socket: %s"
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr "ignorerer navnetjener %s - lokal tilknytning"
|
||||
|
||||
#: network.c:424
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
|
||||
msgstr "ignorerer navnetjener %s - kan ikke lage/dinde socket: %m"
|
||||
|
||||
#: network.c:438
|
||||
msgid "domain"
|
||||
msgstr "domene"
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr "ikke kvalifisert"
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr "domener"
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr "benytter lokale adresser kun for %s %s"
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr "benytter navnetjener %s#%d for %s %s"
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, 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:192
|
||||
#, fuzzy, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr "kan ikke lese %s: %s"
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr "startet, versjon %s mellomlager størrelse %d"
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr "startet, versjon %s mellomlager deaktivert"
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr "kompilerings opsjoner: %s"
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr "DBus støtte aktivert: koblet til system buss"
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr "DBus støtte aktivert: avventer buss tilkobling"
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr "setter --bind-interfaces opsjon på grunn av OS begrensninger"
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr "advarsel: nettverkskort %s eksisterer ikke for tiden"
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, 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:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr "DHCP, IP område %s -- %s, leie tid %s"
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr "kjører som rot (root)"
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr "avslutter etter mottak av SIGTERM"
|
||||
|
||||
#: dnsmasq.c:587
|
||||
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:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr "feilet å sette opsjoner på DHCP socket: %s"
|
||||
|
||||
#: dhcp.c:48
|
||||
#, c-format
|
||||
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
|
||||
msgstr "feilet å sette SO_REUSEADDR på DHCP socket: %s"
|
||||
|
||||
#: dhcp.c:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr "feilet å binde DHCP tjener socket: %s"
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr "kan ikke lage ICMP raw socket: %s"
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr "dubliserte IP adresser i %s dhcp-config direktiv."
|
||||
|
||||
#: dhcp.c:316
|
||||
#, 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:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr "feilet å lese %s:%m"
|
||||
|
||||
#: dhcp.c:651
|
||||
#, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr "dårlig linje ved %s linje %d"
|
||||
|
||||
#: dhcp.c:755
|
||||
#, 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:791
|
||||
#, 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:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr "kan ikke åpne eller lage leie fil: %s"
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr "for mange lagrede leier"
|
||||
|
||||
#: lease.c:175
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr "feilet å lese %s: %m"
|
||||
|
||||
#: lease.c:436
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr "feilet å få tilgang til %s: %m"
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, 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:247
|
||||
msgid "with subnet selector"
|
||||
msgstr "med subnet velger"
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr "via"
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr "deaktivert"
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr "adresse i bruk"
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr "ingen adresse konfigurert"
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr "ingen adresse tilgjengelig"
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr "ingen leier igjen"
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr "galt nettverk"
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr "deaktiverer DHCP statisk adresse %s"
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr "ukjent leie"
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr "oversett"
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr "gal adresse"
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr "leie ikke funnet"
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr "adresse ikke tilgjengelig"
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr "statisk leie tilgjengelig"
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr "adresse reservert"
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, 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:1237
|
||||
#, 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 netlink socket: %s"
|
||||
msgstr "kan ikke binde netlink socket: %s"
|
||||
|
||||
#: netlink.c:224
|
||||
#, fuzzy, c-format
|
||||
msgid "netlink returns error: %s"
|
||||
msgstr "DBus feil: %s"
|
||||
|
||||
#: 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr "kan ikke lage DHCP BPF socket: %s"
|
||||
|
||||
#: bpf.c:79
|
||||
#, 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"
|
||||
934
po/pl.po
Normal file
934
po/pl.po
Normal file
@@ -0,0 +1,934 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, fuzzy, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr "b³êdna nazwa w %s, linia %d"
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr "b³êdna nazwa w %s, linia %d"
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
msgid "Specify local address(es) to listen on."
|
||||
msgstr "Adres(y) lokalne do nas³uchiwania."
|
||||
|
||||
#: option.c:127
|
||||
msgid "Return ipaddr for all hosts in specified domains."
|
||||
msgstr "Zwracanie adresu IP dla wszystkich hostów w podanych domenach."
|
||||
|
||||
#: option.c:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr "Symulacja reverse lookups dla adresów prywatnych opisanych w RFC1918."
|
||||
|
||||
#: option.c:129
|
||||
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
|
||||
msgstr "Adres IP traktowany jak NXDOMAIN"
|
||||
|
||||
#: option.c:130
|
||||
#, 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:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr "¦cie¿ka do pliku konfiguracyjnego (domy¶lna: %s)"
|
||||
|
||||
#: option.c:132
|
||||
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:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr "Wy³±czenie przekazywania zapytañ bez czê¶ci domenowej."
|
||||
|
||||
#: option.c:134
|
||||
msgid "Return self-pointing MX records for local hosts."
|
||||
msgstr "Zwracanie samowskazuj±cego rekordu MX dla lokalnych hostów."
|
||||
|
||||
#: option.c:135
|
||||
msgid "Expand simple names in /etc/hosts with domain-suffix."
|
||||
msgstr "Rozwijanie prostych nazw z /etc/hosts przyrostkiem domenowym."
|
||||
|
||||
#: option.c:136
|
||||
msgid "Don't forward spurious DNS requests from Windows hosts."
|
||||
msgstr "Wy³±czenie przekazywania pozornych zapytañ DNS z komputerów Windows"
|
||||
|
||||
#: option.c:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr "Enable DHCP w zakresie okre¶lonym czasem dzier¿awy."
|
||||
|
||||
#: option.c:138
|
||||
#, 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:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr "Ustawienie adresu lub nazwy hosta dla okre¶lonej maszyny."
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr "Ignorowanie pliku %s."
|
||||
|
||||
#: option.c:141
|
||||
#, c-format
|
||||
msgid "Specify a hosts file to be read in addition to %s."
|
||||
msgstr "Dodatkowy plik hostów poza %s."
|
||||
|
||||
#: option.c:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr "Interfejs(y) do nas³uchiwania."
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr "Interfejs(y), na których nie nas³uchiwaæ."
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr "W³±czenie mapowania klasy u¿ytkownika DHCP do option set."
|
||||
|
||||
#: option.c:145
|
||||
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:146
|
||||
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:147
|
||||
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:148
|
||||
#, 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:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr "W³±czenie zwracania rekord MX dla hostów lokalnych."
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr "Specyfikacja rekordu MX."
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr "Okre¶lenie opcji BOOTP serwera DHCP."
|
||||
|
||||
#: option.c:152
|
||||
#, 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:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr ""
|
||||
"Wy³±czenie zapisywania w pamiêci podrêcznej nieudanych wyników wyszukiwania."
|
||||
|
||||
#: option.c:154
|
||||
#, 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:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr "Dodatkowe opcje ustawieñ dla klientów DHCP."
|
||||
|
||||
#: option.c:156
|
||||
msgid "Specify port to listen for DNS requests on (defaults to 53)."
|
||||
msgstr "Port nas³uchiwania zapytañ DNS (domy¶lnie: 53)."
|
||||
|
||||
#: option.c:157
|
||||
#, 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:158
|
||||
msgid "Log queries."
|
||||
msgstr "Zapytania zapisywane w pliku log."
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr "Wy³±czenie czytania pliku resolv.conf"
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr "Podaj ¶cie¿kê do pliku resolv.conf (domy¶lnie: %s)."
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr "Wy³±czenie przekazywania zapytañ do okre¶lonych domen."
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr "Nazwa domeny, która bêdzie przypisana w dzier¿awach DHCP."
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr "Okre¶lenie domy¶lnego celu w rekordzie MX."
|
||||
|
||||
#: option.c:166
|
||||
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:167
|
||||
#, 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:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr "Mapowanie nazwy dystrybutora DHCP do ustawieñ opcji."
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr ""
|
||||
"W³±czenie pokazywania wersji dnsmasq i informacji o ochronie praw autorskich."
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr "Okre¶lenie rekordu SRV."
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr "Wy¶wietlenie tych informacji."
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr "Okre¶lenie ¶cie¿ki do pliku PID. (domy¶lnie: %s)."
|
||||
|
||||
#: option.c:174
|
||||
#, c-format
|
||||
msgid "Specify maximum number of DHCP leases (defaults to %s)."
|
||||
msgstr "Maksymalna liczba dzier¿aw DHCP. (domy¶lnie: %s)."
|
||||
|
||||
#: option.c:175
|
||||
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:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr "Rekord TXT DNS."
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr "W³±czenie nas³uchiwania tylko na u¿ywanych interfejsach."
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr "Statycznych informacji DHCP hosta z pliku %s."
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr "Wy³±czenie DHCP na tym interfejsie, w³±czenie tylko DNS."
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr "W³±czenie automatycznej alokacji adresu dla BOOTP."
|
||||
|
||||
#: option.c:182
|
||||
#, fuzzy
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr "Mapowanie nazwy dystrybutora DHCP do ustawieñ opcji."
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr "brakuje \""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr "nieprawid³owa opcja"
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr "b³±d odczytu z %s: %s"
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"U¿ycie: dnsmasq [opcje]\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:452
|
||||
#, c-format
|
||||
msgid "Use short options only on the command line.\n"
|
||||
msgstr "Tylko krótkie opcje w linii komend.\n"
|
||||
|
||||
#: option.c:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr "Obs³ugiwane opcje:\n"
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr "Dnsmasq, wersja %s %s\n"
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Wkompilowane opcje %s\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr "Oprogramowanie to nie zawiera ¿adnych gwarancji.\n"
|
||||
|
||||
#: option.c:482
|
||||
#, 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:483
|
||||
#, 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:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr "dodatkowy parametr"
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr "brak parametru"
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr "zagnie¿d¿one do³±czanie plików jest niedozwolone"
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr "b³êdna nazwa MX"
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr "b³êdny cel MX"
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr "nieprawid³owy port"
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr "nieprawid³owy zakres dhcp-range"
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr "niespójny zakres DHCP"
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr "b³±d w dhcp-host"
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr "b³±d w dhcp-option"
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr "nieprawid³owa nazwa domeny w dhcp-option"
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr "zbyt d³uga nazwa w dhcp-option"
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr "nieprawid³owy rekord TX"
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr "zbyt d³ugi rekord TXT"
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr "b³±d w rekordzie SRV"
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr "nieprawid³owy cel SRV"
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr "nieprawid³owy port"
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr "nieprawid³owy priorytet"
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr "nieprawid³owe znaczenie"
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr "b³±d"
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr "nieprawid³owa opcja linii komend: %s."
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr "nie mo¿na pobraæ nazwy hosta: %s"
|
||||
|
||||
#: option.c:1885
|
||||
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:1892
|
||||
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:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr "b³±d w odczycie %s: %m"
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr "b³±d podczas tworzenia gniazda: %s"
|
||||
|
||||
#: network.c:321
|
||||
#, 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:339
|
||||
#, 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:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr "b³±d w³±czenia nas³uchiwania gniazda: %s"
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr "ignorowanie serwera nazw %s - interfejs lokalny"
|
||||
|
||||
#: network.c:424
|
||||
#, 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:438
|
||||
msgid "domain"
|
||||
msgstr "domena"
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr "niekwalifikowany(a/e)"
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr "domeny"
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr "w³±czenie u¿ywania lokalnych adresów tylko dla %s %s"
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr "u¿ywany serwer nazw: %s#%d dla %s %s"
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, 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:192
|
||||
#, fuzzy, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr "b³±d odczytu z %s: %s"
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr "uruchomiony, wersja %s wielko¶æ cache %d"
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr "uruchomiony, wersja %s cache wy³±czony"
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr "opcje kompilacji: %s"
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr "obs³uga DBus w³±czona: pod³±czono do szyny systemowej"
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr "obs³uga DBus w³±czona: pod³±czanie do szyny systemowej w toku"
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr "ustawiam opcjê --bind-interfaces z powodu limitów systemu operacyjnego"
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr "ostrze¿enie: interfejs %s obecnie nie istnieje"
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, 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:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr "DHCP, zakres IP %s -- %s, czas dzier¿awy %s"
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr "pracuje z uprawnieniami u¿ytkownika root"
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr "wy³±czenie po otrzymaniu sygnalu SIGTERM"
|
||||
|
||||
#: dnsmasq.c:587
|
||||
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:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr "b³±d ustawienia opcji gniazda DHCP: %s"
|
||||
|
||||
#: dhcp.c:48
|
||||
#, c-format
|
||||
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
|
||||
msgstr "b³±d ustawienia SO_REUSEADDR gniazda DHCP: %s"
|
||||
|
||||
#: dhcp.c:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr "b³±d pod³±czenia gniazda serwera DHCP: %s"
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr "b³±d utworzenia surowego gniazda ICMP: %s."
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr "powtórzenie adresu IP %s w opcji dhcp-config"
|
||||
|
||||
#: dhcp.c:316
|
||||
#, 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:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr "b³±d odczytu %s:%m"
|
||||
|
||||
#: dhcp.c:651
|
||||
#, fuzzy, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr "b³êdna nazwa w %s, linia %d"
|
||||
|
||||
#: dhcp.c:755
|
||||
#, 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:791
|
||||
#, 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:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr "b³±d otwarcia lub utworzenia pliku dzier¿aw: %s"
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr "zbyt du¿a ilo¶æ zapisanych dzier¿aw"
|
||||
|
||||
#: lease.c:175
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr "b³±d w odczycie %s: %m"
|
||||
|
||||
#: lease.c:436
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr "b³±d w dostêpie do %s: %m"
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, 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:247
|
||||
msgid "with subnet selector"
|
||||
msgstr "z selekcj± podsieci"
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr "przez"
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr "wy³±czony(a)"
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr "adres w u¿yciu"
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr "brak skonfigurowanego adresu"
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr "brak dostêpnego adresu"
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr "brak wolnych dzier¿aw"
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr "nieprawid³owa sieæ"
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr "wy³±czanie statycznego adresu DHCP %s"
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr "nieznana dzier¿awa"
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr "ignorujê"
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr "b³êdny adres"
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr "dzier¿awa nie znaleziona"
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr "adres niedostêpny"
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr "dostêpna statyczna dzier¿awa"
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr "adres zarezerwowany"
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, c-format
|
||||
msgid "cannot send DHCP option %d: no space left in packet"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:1237
|
||||
#, 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 netlink socket: %s"
|
||||
msgstr "nie mo¿na pod³±czyæ gniazda netlink: %s"
|
||||
|
||||
#: netlink.c:224
|
||||
#, fuzzy, c-format
|
||||
msgid "netlink returns error: %s"
|
||||
msgstr "b³±d DBus: %s"
|
||||
|
||||
#: 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr "b³±d utworzenia gniazda DHCP BPF: %s"
|
||||
|
||||
#: bpf.c:79
|
||||
#, 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?"
|
||||
895
po/pt_BR.po
Normal file
895
po/pt_BR.po
Normal file
@@ -0,0 +1,895 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
msgid "Specify local address(es) to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:127
|
||||
msgid "Return ipaddr for all hosts in specified domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:129
|
||||
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:130
|
||||
#, c-format
|
||||
msgid "Specify the size of the cache in entries (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:132
|
||||
msgid "Do NOT fork into the background: run in debug mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:134
|
||||
msgid "Return self-pointing MX records for local hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:135
|
||||
msgid "Expand simple names in /etc/hosts with domain-suffix."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:136
|
||||
msgid "Don't forward spurious DNS requests from Windows hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:138
|
||||
#, c-format
|
||||
msgid "Change to this group after startup (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:141
|
||||
#, c-format
|
||||
msgid "Specify a hosts file to be read in addition to %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:146
|
||||
msgid "Do NOT fork into the background, do NOT run in debug mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:147
|
||||
msgid "Assume we are the only DHCP server on the local network."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:148
|
||||
#, c-format
|
||||
msgid "Specify where to store DHCP leases (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:152
|
||||
#, c-format
|
||||
msgid "Do NOT poll %s file, reload only on SIGHUP."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:154
|
||||
#, c-format
|
||||
msgid "Use nameservers strictly in the order given in %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:156
|
||||
msgid "Specify port to listen for DNS requests on (defaults to 53)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:157
|
||||
#, c-format
|
||||
msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:158
|
||||
msgid "Log queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:166
|
||||
msgid "Specify time-to-live in seconds for replies from /etc/hosts."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:167
|
||||
#, c-format
|
||||
msgid "Change to this user after startup. (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:168
|
||||
msgid "Map DHCP vendor class to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:174
|
||||
#, c-format
|
||||
msgid "Specify maximum number of DHCP leases (defaults to %s)."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:175
|
||||
msgid "Answer DNS queries based on the interface a query was sent to."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:182
|
||||
msgid "Map MAC address (with wildcards) to option set."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr ""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:452
|
||||
#, c-format
|
||||
msgid "Use short options only on the command line.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:482
|
||||
#, c-format
|
||||
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:483
|
||||
#, c-format
|
||||
msgid "under the terms of the GNU General Public License, version 2.\n"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1885
|
||||
msgid "only one resolv.conf file allowed in no-poll mode."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1892
|
||||
msgid "must have exactly one resolv.conf to read domain from."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:321
|
||||
#, c-format
|
||||
msgid "failed to set IPV6 options on listening socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:339
|
||||
#, c-format
|
||||
msgid "failed to bind listening socket for %s: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:424
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:438
|
||||
msgid "domain"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, c-format
|
||||
msgid "DBus error: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:161
|
||||
msgid "DBus not available: set HAVE_DBUS in src/config.h"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:192
|
||||
#, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, c-format
|
||||
msgid "DHCP, static leases only on %.0s%s, lease time %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:587
|
||||
msgid "connected to system DBus"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:32
|
||||
#, c-format
|
||||
msgid "cannot create DHCP socket : %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:48
|
||||
#, c-format
|
||||
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:316
|
||||
#, c-format
|
||||
msgid "DHCP range %s -- %s is not consistent with netmask %s"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:651
|
||||
#, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:755
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s (%s) in dhcp-config directive"
|
||||
msgstr ""
|
||||
|
||||
#: dhcp.c:791
|
||||
#, c-format
|
||||
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:175
|
||||
#, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr ""
|
||||
|
||||
#: lease.c:436
|
||||
#, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, c-format
|
||||
msgid "no address range available for DHCP request %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "with subnet selector"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, c-format
|
||||
msgid "cannot send DHCP option %d: no space left in packet"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:1237
|
||||
#, c-format
|
||||
msgid "More than one vendor class matches, using %s"
|
||||
msgstr ""
|
||||
|
||||
#: netlink.c:51
|
||||
#, c-format
|
||||
msgid "cannot create netlink socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: netlink.c:224
|
||||
#, c-format
|
||||
msgid "netlink 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr ""
|
||||
|
||||
#: bpf.c:79
|
||||
#, c-format
|
||||
msgid "DHCP request for unsupported hardware type (%d) received on %s"
|
||||
msgstr ""
|
||||
924
po/ro.po
Normal file
924
po/ro.po
Normal file
@@ -0,0 +1,924 @@
|
||||
# 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-05-06 13:18+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:664
|
||||
#, c-format
|
||||
msgid "bad address at %s line %d"
|
||||
msgstr "adresă greşită în %s, linia %d"
|
||||
|
||||
#: cache.c:633 dhcp.c:678
|
||||
#, c-format
|
||||
msgid "bad name at %s line %d"
|
||||
msgstr "nume greşit în %s linia %d"
|
||||
|
||||
#: cache.c:639 dhcp.c:732
|
||||
#, 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:1305
|
||||
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:126
|
||||
msgid "Specify local address(es) to listen on."
|
||||
msgstr "Specificaţi adresele locale deservite."
|
||||
|
||||
#: option.c:127
|
||||
msgid "Return ipaddr for all hosts in specified domains."
|
||||
msgstr "Afişează adresele IP ale maşinilor în domeniul dat."
|
||||
|
||||
#: option.c:128
|
||||
msgid "Fake reverse lookups for RFC1918 private address ranges."
|
||||
msgstr ""
|
||||
"Simulează căutări după adresă pentru domenii de adresă private (RFC1918)."
|
||||
|
||||
#: option.c:129
|
||||
msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
|
||||
msgstr "Interpretează adresa IP ca NXDOMAIN (împotriva manipulărilor Verisign)"
|
||||
|
||||
#: option.c:130
|
||||
#, 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:131
|
||||
#, c-format
|
||||
msgid "Specify configuration file (defaults to %s)."
|
||||
msgstr "Specifică fişier de configurare (implicit e %s)."
|
||||
|
||||
#: option.c:132
|
||||
msgid "Do NOT fork into the background: run in debug mode."
|
||||
msgstr "NU porneşte în fundal: rulează în modul depanare."
|
||||
|
||||
#: option.c:133
|
||||
msgid "Do NOT forward queries with no domain part."
|
||||
msgstr "NU înainta cererile ce nu conţin domeniu DNS."
|
||||
|
||||
#: option.c:134
|
||||
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:135
|
||||
msgid "Expand simple names in /etc/hosts with domain-suffix."
|
||||
msgstr "Adaugă numelor simple din /etc/hosts numele domeniului ca sufix."
|
||||
|
||||
#: option.c:136
|
||||
msgid "Don't forward spurious DNS requests from Windows hosts."
|
||||
msgstr "Nu inainta cereri DNS defecte provenite de la maşini Windows."
|
||||
|
||||
#: option.c:137
|
||||
msgid "Enable DHCP in the range given with lease duration."
|
||||
msgstr "Activează DHCP în domeniul dat cu durată limitată de împrumut."
|
||||
|
||||
#: option.c:138
|
||||
#, c-format
|
||||
msgid "Change to this group after startup (defaults to %s)."
|
||||
msgstr "Rulează sub acest grup după pornire (implicit e %s)."
|
||||
|
||||
#: option.c:139
|
||||
msgid "Set address or hostname for a specified machine."
|
||||
msgstr "Schimbă adresa sau numele maşinii specificate."
|
||||
|
||||
#: option.c:140
|
||||
#, c-format
|
||||
msgid "Do NOT load %s file."
|
||||
msgstr "Nu încarcă fişierul %s."
|
||||
|
||||
#: option.c:141
|
||||
#, 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:142
|
||||
msgid "Specify interface(s) to listen on."
|
||||
msgstr "Specifică interfeţele deservite."
|
||||
|
||||
#: option.c:143
|
||||
msgid "Specify interface(s) NOT to listen on."
|
||||
msgstr "Specifică interfeţele NE-deservite."
|
||||
|
||||
#: option.c:144
|
||||
msgid "Map DHCP user class to option set."
|
||||
msgstr "Leagă clasa de utilizator DHCP cu grup de opţiuni."
|
||||
|
||||
#: option.c:145
|
||||
msgid "Don't do DHCP for hosts in option set."
|
||||
msgstr "Nu furniza DHCP maşinilor din grupul de opţiuni."
|
||||
|
||||
#: option.c:146
|
||||
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:147
|
||||
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:148
|
||||
#, 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:149
|
||||
msgid "Return MX records for local hosts."
|
||||
msgstr "Răspunde cu întregistrări MX pentru maşini locale."
|
||||
|
||||
#: option.c:150
|
||||
msgid "Specify an MX record."
|
||||
msgstr "Specifică o înregistrare MX."
|
||||
|
||||
#: option.c:151
|
||||
msgid "Specify BOOTP options to DHCP server."
|
||||
msgstr "Specifică opţiuni BOOTP serverului DHCP."
|
||||
|
||||
#: option.c:152
|
||||
#, 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:153
|
||||
msgid "Do NOT cache failed search results."
|
||||
msgstr "NU memora rezultatele de căutare DNS eşuatată."
|
||||
|
||||
#: option.c:154
|
||||
#, 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:155
|
||||
msgid "Set extra options to be set to DHCP clients."
|
||||
msgstr "Configurează opţiuni în plusce trebuie trimise clienţilor DHCP."
|
||||
|
||||
#: option.c:156
|
||||
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:157
|
||||
#, 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:158
|
||||
msgid "Log queries."
|
||||
msgstr "Înregistrează tranzacţiile."
|
||||
|
||||
#: option.c:159
|
||||
msgid "Force the originating port for upstream queries."
|
||||
msgstr "Forţează acest port pentru datele ce pleacă."
|
||||
|
||||
#: option.c:160
|
||||
msgid "Do NOT read resolv.conf."
|
||||
msgstr "NU citi fişierul resolv.conf"
|
||||
|
||||
#: option.c:161
|
||||
#, c-format
|
||||
msgid "Specify path to resolv.conf (defaults to %s)."
|
||||
msgstr "Specifică calea către resolv.conf (implicit e %s)."
|
||||
|
||||
#: option.c:162
|
||||
msgid "Specify address(es) of upstream servers with optional domains."
|
||||
msgstr "Specifică adresele server(elor) superioare cu domenii opţionale."
|
||||
|
||||
#: option.c:163
|
||||
msgid "Never forward queries to specified domains."
|
||||
msgstr "Nu înaintează cererile spre domeniile specificate."
|
||||
|
||||
#: option.c:164
|
||||
msgid "Specify the domain to be assigned in DHCP leases."
|
||||
msgstr "Specifică domeniul de transmis prin DHCP."
|
||||
|
||||
#: option.c:165
|
||||
msgid "Specify default target in an MX record."
|
||||
msgstr "Specifică o ţintă într-o înregistrare MX."
|
||||
|
||||
#: option.c:166
|
||||
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:167
|
||||
#, c-format
|
||||
msgid "Change to this user after startup. (defaults to %s)."
|
||||
msgstr "Rulează sub acest utilizator după pornire. (implicit e %s)."
|
||||
|
||||
#: option.c:168
|
||||
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:169
|
||||
msgid "Display dnsmasq version and copyright information."
|
||||
msgstr "Afişează versiunea dnsmasq şi drepturile de autor."
|
||||
|
||||
#: option.c:170
|
||||
msgid "Translate IPv4 addresses from upstream servers."
|
||||
msgstr "Traduce adresele IPv4 de la serverele DNS superioare."
|
||||
|
||||
#: option.c:171
|
||||
msgid "Specify a SRV record."
|
||||
msgstr "Specifică o înregistrare SRV."
|
||||
|
||||
#: option.c:172
|
||||
msgid "Display this message."
|
||||
msgstr "Afişează acest mesaj."
|
||||
|
||||
#: option.c:173
|
||||
#, c-format
|
||||
msgid "Specify path of PID file. (defaults to %s)."
|
||||
msgstr "Specifică o cale pentru fişierul PID. (implicit %s)."
|
||||
|
||||
#: option.c:174
|
||||
#, c-format
|
||||
msgid "Specify maximum number of DHCP leases (defaults to %s)."
|
||||
msgstr "Specifică numărul maxim de împrumuturi DHCP (implicit %s)."
|
||||
|
||||
#: option.c:175
|
||||
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:176
|
||||
msgid "Specify TXT DNS record."
|
||||
msgstr "Specifică o înregistrare TXT."
|
||||
|
||||
#: option.c:177
|
||||
msgid "Bind only to interfaces in use."
|
||||
msgstr "Ascultă doar pe interfeţele active."
|
||||
|
||||
#: option.c:178
|
||||
#, c-format
|
||||
msgid "Read DHCP static host information from %s."
|
||||
msgstr "Citeşte informaţii DHCP statice despre maşină din %s."
|
||||
|
||||
#: option.c:179
|
||||
msgid "Enable the DBus interface for setting upstream servers, etc."
|
||||
msgstr "Activeaza interfaţa DBus pentru configurarea serverelor superioare."
|
||||
|
||||
#: option.c:180
|
||||
msgid "Do not provide DHCP on this interface, only provide DNS."
|
||||
msgstr "Nu activează DHCP ci doar DNS pe această interfaţă."
|
||||
|
||||
#: option.c:181
|
||||
msgid "Enable dynamic address allocation for bootp."
|
||||
msgstr "Activează alocarea dinamică a adreselor pentru BOOTP."
|
||||
|
||||
#: option.c:182
|
||||
#, 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:183
|
||||
msgid "Disable ICMP echo address checking in the DHCP server."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:184
|
||||
msgid "Script to run on DHCP lease creation and destruction."
|
||||
msgstr ""
|
||||
|
||||
#: option.c:398
|
||||
msgid "missing \""
|
||||
msgstr "lipseşte \""
|
||||
|
||||
#: option.c:427
|
||||
msgid "bad option"
|
||||
msgstr "opţiune invalidă"
|
||||
|
||||
#: option.c:444
|
||||
#, c-format
|
||||
msgid "cannot read %s: %s"
|
||||
msgstr "nu pot citi %s: %s"
|
||||
|
||||
#: option.c:450
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: dnsmasq [options]\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Utilizare: dnsmasq [opţiuni]\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:452
|
||||
#, 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:454
|
||||
#, c-format
|
||||
msgid "Valid options are :\n"
|
||||
msgstr "Opţiunile valide sunt:\n"
|
||||
|
||||
#: option.c:479
|
||||
#, c-format
|
||||
msgid "Dnsmasq version %s %s\n"
|
||||
msgstr "dnsmasq versiunea %s %s\n"
|
||||
|
||||
#: option.c:480
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Compile time options %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Opţiuni cu care a fost compilat %s\n"
|
||||
"\n"
|
||||
|
||||
#: option.c:481
|
||||
#, c-format
|
||||
msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
|
||||
msgstr "Acest program vine FĂRĂ NICI O GARANŢIE.\n"
|
||||
|
||||
#: option.c:482
|
||||
#, 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:483
|
||||
#, 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:493
|
||||
msgid "extraneous parameter"
|
||||
msgstr "parametru nerecunoscut"
|
||||
|
||||
#: option.c:501
|
||||
msgid "missing parameter"
|
||||
msgstr "parametru lipsa"
|
||||
|
||||
#: option.c:518
|
||||
msgid "nested includes not allowed"
|
||||
msgstr "incluziunile locale nu sunt permise"
|
||||
|
||||
#: option.c:578
|
||||
msgid "bad MX preference"
|
||||
msgstr "preferinţă MX invalidă"
|
||||
|
||||
#: option.c:587
|
||||
msgid "bad MX name"
|
||||
msgstr "nume MX invalid"
|
||||
|
||||
#: option.c:605
|
||||
msgid "bad MX target"
|
||||
msgstr "ţintă MX invalidă"
|
||||
|
||||
#: option.c:617
|
||||
msgid "cannot run scripts under uClinux"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:813 option.c:824
|
||||
msgid "bad port"
|
||||
msgstr "port invalid"
|
||||
|
||||
#: option.c:966
|
||||
msgid "bad dhcp-range"
|
||||
msgstr "dhcp-range invalid"
|
||||
|
||||
#: option.c:995
|
||||
msgid "only one netid tag allowed"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1040
|
||||
msgid "inconsistent DHCP range"
|
||||
msgstr "domeniu DHCP inconsistent"
|
||||
|
||||
#: option.c:1225
|
||||
msgid "bad dhcp-host"
|
||||
msgstr "dhcp-host invalid"
|
||||
|
||||
#: option.c:1282
|
||||
msgid "bad dhcp-option"
|
||||
msgstr "dhcp-option invalid"
|
||||
|
||||
#: option.c:1300
|
||||
msgid "bad domain in dhcp-option"
|
||||
msgstr "domeniu DNS invalid în declaraţia dhcp-option"
|
||||
|
||||
#: option.c:1470
|
||||
msgid "dhcp-option too long"
|
||||
msgstr "declararea dhcp-option este prea lungă"
|
||||
|
||||
#: option.c:1667
|
||||
msgid "bad TXT record"
|
||||
msgstr "înregistrare TXT invalidă"
|
||||
|
||||
#: option.c:1699
|
||||
msgid "TXT record string too long"
|
||||
msgstr "şirul de caractere pentru înregistrarea TXT este prea lung"
|
||||
|
||||
#: option.c:1738
|
||||
msgid "bad SRV record"
|
||||
msgstr "înregistrare SRV invalidă"
|
||||
|
||||
#: option.c:1751
|
||||
msgid "bad SRV target"
|
||||
msgstr "ţintă SRV invalidă"
|
||||
|
||||
#: option.c:1763
|
||||
msgid "invalid port number"
|
||||
msgstr "număr de port invalid"
|
||||
|
||||
#: option.c:1774
|
||||
msgid "invalid priority"
|
||||
msgstr "prioritate invalidă"
|
||||
|
||||
#: option.c:1785
|
||||
msgid "invalid weight"
|
||||
msgstr "pondere invalidă"
|
||||
|
||||
#: option.c:1810
|
||||
msgid "error"
|
||||
msgstr "eroare"
|
||||
|
||||
#: option.c:1812
|
||||
#, c-format
|
||||
msgid "bad command line options: %s."
|
||||
msgstr "opţiuni în linie de comandă invalide: %s."
|
||||
|
||||
#: option.c:1814
|
||||
msgid "try --help"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1816
|
||||
msgid "try -w"
|
||||
msgstr ""
|
||||
|
||||
#: option.c:1856
|
||||
#, c-format
|
||||
msgid "cannot get host-name: %s"
|
||||
msgstr "nu pot citi numele maşinii: %s"
|
||||
|
||||
#: option.c:1885
|
||||
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:1892
|
||||
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:1895 network.c:485
|
||||
#, c-format
|
||||
msgid "failed to read %s: %m"
|
||||
msgstr "nu pot citi %s: %n"
|
||||
|
||||
#: option.c:1913
|
||||
#, 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:469
|
||||
#, 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:489
|
||||
#, 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:314 dnsmasq.c:129
|
||||
#, c-format
|
||||
msgid "failed to create listening socket: %s"
|
||||
msgstr "creearea socket-ului de ascultare a eşuat: %s"
|
||||
|
||||
#: network.c:321
|
||||
#, 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:339
|
||||
#, 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:347
|
||||
#, c-format
|
||||
msgid "failed to listen on socket: %s"
|
||||
msgstr "ascultarea pe socket a eşuat: %s"
|
||||
|
||||
#: network.c:415
|
||||
#, c-format
|
||||
msgid "ignoring nameserver %s - local interface"
|
||||
msgstr "ignorăm serverul DNS %s - interfaţă locală"
|
||||
|
||||
#: network.c:424
|
||||
#, 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:438
|
||||
msgid "domain"
|
||||
msgstr "domeniu"
|
||||
|
||||
#: network.c:440
|
||||
msgid "unqualified"
|
||||
msgstr "invalid"
|
||||
|
||||
#: network.c:440
|
||||
msgid "domains"
|
||||
msgstr "domenii"
|
||||
|
||||
#: network.c:443
|
||||
#, c-format
|
||||
msgid "using local addresses only for %s %s"
|
||||
msgstr "folosim adresele locale doar pentru %S %s"
|
||||
|
||||
#: network.c:445
|
||||
#, c-format
|
||||
msgid "using nameserver %s#%d for %s %s"
|
||||
msgstr "folosim serverul DNS %s#%d pentru %s %s"
|
||||
|
||||
#: network.c:448
|
||||
#, 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:585
|
||||
#, 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:192
|
||||
#, fuzzy, c-format
|
||||
msgid "cannot create pipe: %s"
|
||||
msgstr "nu pot citi %s: %s"
|
||||
|
||||
#: dnsmasq.c:336
|
||||
#, c-format
|
||||
msgid "started, version %s cachesize %d"
|
||||
msgstr "am ponit, versiunea %s memorie temporară %d"
|
||||
|
||||
#: dnsmasq.c:338
|
||||
#, c-format
|
||||
msgid "started, version %s cache disabled"
|
||||
msgstr "am pornit, versiunea %s memorie temporară dezactivată"
|
||||
|
||||
#: dnsmasq.c:340
|
||||
#, c-format
|
||||
msgid "compile time options: %s"
|
||||
msgstr "compilat cu opţiunile: %s"
|
||||
|
||||
#: dnsmasq.c:346
|
||||
msgid "DBus support enabled: connected to system bus"
|
||||
msgstr "suportul DBus activ: sunt conectat la magistrala sistem"
|
||||
|
||||
#: dnsmasq.c:348
|
||||
msgid "DBus support enabled: bus connection pending"
|
||||
msgstr "suportul DBus activ: aştept conexiunea la magistrală"
|
||||
|
||||
#: dnsmasq.c:353
|
||||
msgid "setting --bind-interfaces option because of OS limitations"
|
||||
msgstr "specific opţiunea --bind-interfaces din cauza limitărilor SO"
|
||||
|
||||
#: dnsmasq.c:358
|
||||
#, c-format
|
||||
msgid "warning: interface %s does not currently exist"
|
||||
msgstr "atenţie: interfaţa %s nu există momentan"
|
||||
|
||||
#: dnsmasq.c:370
|
||||
#, 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:371
|
||||
#, c-format
|
||||
msgid "DHCP, IP range %s -- %s, lease time %s"
|
||||
msgstr "DHCP, domeniu IP %s -- %s, timpul reînoirii %s"
|
||||
|
||||
#: dnsmasq.c:381
|
||||
#, c-format
|
||||
msgid "warning: setting capabilities failed: %m"
|
||||
msgstr ""
|
||||
|
||||
#: dnsmasq.c:383
|
||||
msgid "running as root"
|
||||
msgstr "rulez ca root"
|
||||
|
||||
#: dnsmasq.c:528
|
||||
msgid "exiting on receipt of SIGTERM"
|
||||
msgstr "am primit SIGTERM, am terminat"
|
||||
|
||||
#: dnsmasq.c:587
|
||||
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:41
|
||||
#, c-format
|
||||
msgid "failed to set options on DHCP socket: %s"
|
||||
msgstr "configurarea opţiunilor socketului DHCP a eşuat: %s"
|
||||
|
||||
#: dhcp.c:48
|
||||
#, 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:58
|
||||
#, c-format
|
||||
msgid "failed to bind DHCP server socket: %s"
|
||||
msgstr "activarea socket-ului server-ului DHCP a eşuat: %s"
|
||||
|
||||
#: dhcp.c:71
|
||||
#, c-format
|
||||
msgid "cannot create ICMP raw socket: %s."
|
||||
msgstr "nu pot creea socket ICMP raw: %s."
|
||||
|
||||
#: dhcp.c:83
|
||||
#, c-format
|
||||
msgid "duplicate IP address %s in dhcp-config directive."
|
||||
msgstr "adresă IP duplicat %s în declaraţia dhcp-config."
|
||||
|
||||
#: dhcp.c:316
|
||||
#, 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:632
|
||||
#, c-format
|
||||
msgid "failed to read %s:%m"
|
||||
msgstr "citirea %s:%n a eşuat"
|
||||
|
||||
#: dhcp.c:651
|
||||
#, c-format
|
||||
msgid "bad line at %s line %d"
|
||||
msgstr "linie invalidă în %s rândul %d"
|
||||
|
||||
#: dhcp.c:755
|
||||
#, 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:791
|
||||
#, 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:31
|
||||
#, c-format
|
||||
msgid "cannot open or create leases file: %s"
|
||||
msgstr "nu pot creea sau deschide fişierul cu împrumuturi: %s"
|
||||
|
||||
#: lease.c:59
|
||||
msgid "too many stored leases"
|
||||
msgstr "prea multe împrumuturi stocate"
|
||||
|
||||
#: lease.c:175
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to write %s: %s (retry in %us)"
|
||||
msgstr "nu pot citi %s: %n"
|
||||
|
||||
#: lease.c:436
|
||||
#, fuzzy, c-format
|
||||
msgid "failed to execute %s: %m"
|
||||
msgstr "accesarea serverului %s a eşuat: %n"
|
||||
|
||||
#: rfc2131.c:246
|
||||
#, 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:247
|
||||
msgid "with subnet selector"
|
||||
msgstr "cu selectorul de subreţea"
|
||||
|
||||
#: rfc2131.c:247
|
||||
msgid "via"
|
||||
msgstr "prin"
|
||||
|
||||
#: rfc2131.c:273 rfc2131.c:297
|
||||
msgid "disabled"
|
||||
msgstr "dezactivat"
|
||||
|
||||
#: rfc2131.c:309 rfc2131.c:732
|
||||
msgid "address in use"
|
||||
msgstr "adresa este folosită"
|
||||
|
||||
#: rfc2131.c:312
|
||||
msgid "no address configured"
|
||||
msgstr "adresă lipsă"
|
||||
|
||||
#: rfc2131.c:325 rfc2131.c:606
|
||||
msgid "no address available"
|
||||
msgstr "nici o adresă disponibilă"
|
||||
|
||||
#: rfc2131.c:334 rfc2131.c:739
|
||||
msgid "no leases left"
|
||||
msgstr "nu mai am de unde să împrumut"
|
||||
|
||||
#: rfc2131.c:337 rfc2131.c:708
|
||||
msgid "wrong network"
|
||||
msgstr "reţea greşită"
|
||||
|
||||
#: rfc2131.c:541
|
||||
#, c-format
|
||||
msgid "disabling DHCP static address %s"
|
||||
msgstr "dezactivăm adresele DHCP statice %s"
|
||||
|
||||
#: rfc2131.c:559
|
||||
msgid "unknown lease"
|
||||
msgstr "împrumut necunoscut"
|
||||
|
||||
#: rfc2131.c:568 rfc2131.c:804
|
||||
msgid "ignored"
|
||||
msgstr "ignorat"
|
||||
|
||||
#: rfc2131.c:582
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is leased to %s"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:591
|
||||
#, c-format
|
||||
msgid "not using configured address %s because it is in use by the server"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:671
|
||||
msgid "wrong address"
|
||||
msgstr "adresă greşită"
|
||||
|
||||
#: rfc2131.c:684
|
||||
msgid "lease not found"
|
||||
msgstr "împrumutul nu a fost găsit"
|
||||
|
||||
#: rfc2131.c:716
|
||||
msgid "address not available"
|
||||
msgstr "adresă indisponibilă"
|
||||
|
||||
#: rfc2131.c:725
|
||||
msgid "static lease available"
|
||||
msgstr "împrumut static este disponibil"
|
||||
|
||||
#: rfc2131.c:729
|
||||
msgid "address reserved"
|
||||
msgstr "adresă rezervată"
|
||||
|
||||
#: rfc2131.c:735
|
||||
msgid "no unique-id"
|
||||
msgstr ""
|
||||
|
||||
#: rfc2131.c:936
|
||||
#, 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:1237
|
||||
#, 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 netlink socket: %s"
|
||||
msgstr "nu pot să activez socket-ul netlink: %s"
|
||||
|
||||
#: netlink.c:224
|
||||
#, fuzzy, c-format
|
||||
msgid "netlink returns error: %s"
|
||||
msgstr "eroare DBus: %s"
|
||||
|
||||
#: 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:59
|
||||
#, c-format
|
||||
msgid "cannot create DHCP BPF socket: %s"
|
||||
msgstr "nu pot creea socket DHCP BPF: %s"
|
||||
|
||||
#: bpf.c:79
|
||||
#, 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 ?"
|
||||
23
rpm/dnsmasq-SuSE.patch
Normal file
23
rpm/dnsmasq-SuSE.patch
Normal file
@@ -0,0 +1,23 @@
|
||||
--- 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>
|
||||
Specify the group which dnsmasq will run
|
||||
-as. The defaults to "dip", if available, to facilitate access to
|
||||
+as. The defaults to "dialout", if available, to facilitate access to
|
||||
/etc/ppp/resolv.conf which is not normally world readable.
|
||||
.TP
|
||||
.B \-v, --version
|
||||
--- src/config.h 2004-08-11 11:39:18.000000000 +0200
|
||||
+++ src/config.h 2004-08-12 00:40:01.000000000 +0200
|
||||
@@ -44,7 +44,7 @@
|
||||
#endif
|
||||
#define DEFLEASE 3600 /* default lease time, 1 hour */
|
||||
#define CHUSER "nobody"
|
||||
-#define CHGRP "dip"
|
||||
+#define CHGRP "dialout"
|
||||
#define DHCP_SERVER_PORT 67
|
||||
#define DHCP_CLIENT_PORT 68
|
||||
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Startup script for the DNS caching server
|
||||
#
|
||||
# chkconfig: 2345 99 01
|
||||
# description: This script starts your DNS caching server
|
||||
# processname: dnsmasq
|
||||
# pidfile: /var/run/dnsmasq.pid
|
||||
|
||||
# Source function library.
|
||||
. /etc/rc.d/init.d/functions
|
||||
|
||||
# Source networking configuration.
|
||||
. /etc/sysconfig/network
|
||||
|
||||
# Check that networking is up.
|
||||
[ ${NETWORKING} = "no" ] && exit 0
|
||||
|
||||
dnsmasq=/usr/sbin/dnsmasq
|
||||
[ -f $dnsmasq ] || exit 0
|
||||
|
||||
# change this line if you want dnsmasq to serve an MX record for
|
||||
# the host it is running on.
|
||||
MAILHOSTNAME=""
|
||||
# change this line if you want dns to get its upstream servers from
|
||||
# somewhere other that /etc/resolv.conf
|
||||
RESOLV_CONF=""
|
||||
# change this if you want dnsmasq to cache any "hostname" or "client-hostname" from
|
||||
# a dhcpd's lease file
|
||||
DHCP_LEASE="/var/lib/dhcp/dhcpd.leases"
|
||||
DOMAIN_SUFFIX=`dnsdomainname`
|
||||
|
||||
OPTIONS=""
|
||||
|
||||
if [ ! -z "${MAILHOSTNAME}" ]; then
|
||||
OPTIONS="$OPTIONS -m $MAILHOSTNAME"
|
||||
fi
|
||||
|
||||
if [ ! -z "${RESOLV_CONF}" ]; then
|
||||
OPTIONS="$OPTIONS -r $RESOLV_CONF"
|
||||
fi
|
||||
|
||||
if [ ! -z "${DHCP_LEASE}" ]; then
|
||||
OPTIONS="$OPTIONS -l $DHCP_LEASE"
|
||||
fi
|
||||
|
||||
if [ ! -z "${DOMAIN_SUFFIX}" ]; then
|
||||
OPTIONS="$OPTIONS -s $DOMAIN_SUFFIX"
|
||||
fi
|
||||
|
||||
RETVAL=0
|
||||
|
||||
# See how we were called.
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting dnsmasq: "
|
||||
daemon $dnsmasq $OPTIONS
|
||||
RETVAL=$?
|
||||
echo
|
||||
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/dnsmasq
|
||||
;;
|
||||
stop)
|
||||
if test "x`pidof dnsmasq`" != x; then
|
||||
echo -n "Shutting down dnsmasq: "
|
||||
killproc dnsmasq
|
||||
fi
|
||||
RETVAL=$?
|
||||
echo
|
||||
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/dnsmasq /var/run/dnsmasq.pid
|
||||
;;
|
||||
status)
|
||||
status dnsmasq
|
||||
RETVAL=$?
|
||||
;;
|
||||
restart|reload)
|
||||
$0 stop
|
||||
$0 start
|
||||
RETVAL=$?
|
||||
;;
|
||||
condrestart)
|
||||
if test "x`/sbin/pidof dnsmasq`" != x; then
|
||||
$0 stop
|
||||
$0 start
|
||||
RETVAL=$?
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
exit $RETVAL
|
||||
|
||||
16
src/Makefile
16
src/Makefile
@@ -1,16 +0,0 @@
|
||||
# Uncomment this on Solaris.
|
||||
#LIBS = -lsocket -lnsl
|
||||
|
||||
CFLAGS?= -O2
|
||||
|
||||
OBJS = cache.o rfc1035.o util.o option.o forward.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)
|
||||
|
||||
|
||||
|
||||
240
src/bpf.c
Normal file
240
src/bpf.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/* 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)
|
||||
{
|
||||
int flags = fcntl(daemon->dhcp_raw_fd, F_GETFD);
|
||||
if (flags != -1)
|
||||
fcntl(daemon->dhcp_raw_fd, F_SETFD, flags | FD_CLOEXEC);
|
||||
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
|
||||
388
src/cache.c
388
src/cache.c
@@ -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
|
||||
@@ -17,25 +17,31 @@ static struct crec *dhcp_inuse, *dhcp_spare, *new_chain;
|
||||
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 char *addn_file;
|
||||
static int uid;
|
||||
static char *addrbuff;
|
||||
|
||||
static void cache_free(struct crec *crecp);
|
||||
static void cache_unlink(struct crec *crecp);
|
||||
static void cache_link(struct crec *crecp);
|
||||
static char *record_source(struct hostsfile *add_hosts, int index);
|
||||
|
||||
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;
|
||||
cache_size = size;
|
||||
big_free = NULL;
|
||||
bignames_left = size/10;
|
||||
addn_file = NULL;
|
||||
uid = 0;
|
||||
|
||||
cache_inserted = cache_live_freed = 0;
|
||||
|
||||
@@ -47,6 +53,7 @@ void cache_init(int size, int logq)
|
||||
{
|
||||
cache_link(crecp);
|
||||
crecp->flags = 0;
|
||||
crecp->uid = uid++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,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
|
||||
@@ -83,7 +90,8 @@ static void cache_free(struct crec *crecp)
|
||||
{
|
||||
crecp->flags &= ~F_FORWARD;
|
||||
crecp->flags &= ~F_REVERSE;
|
||||
|
||||
crecp->uid = uid++; /* invalidate CNAMES pointing to this. */
|
||||
|
||||
if (cache_tail)
|
||||
cache_tail->next = crecp;
|
||||
else
|
||||
@@ -137,31 +145,68 @@ char *cache_get_name(struct crec *crecp)
|
||||
return crecp->name.sname;
|
||||
}
|
||||
|
||||
static void cache_scan_free(char *name, struct all_addr *addr, time_t now, unsigned short flags)
|
||||
static int is_outdated_cname_pointer(struct crec *crecp)
|
||||
{
|
||||
struct crec *target = crecp->addr.cname.cache;
|
||||
|
||||
if (!(crecp->flags & F_CNAME))
|
||||
return 0;
|
||||
|
||||
if (!target)
|
||||
return 1;
|
||||
|
||||
if (crecp->addr.cname.uid == target->uid)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int is_expired(time_t now, struct crec *crecp)
|
||||
{
|
||||
if (crecp->flags & F_IMMORTAL)
|
||||
return 0;
|
||||
|
||||
if (difftime(now, crecp->ttd) < 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsigned short flags)
|
||||
{
|
||||
/* Scan and remove old entries.
|
||||
If (flags & F_FORWARD) then remove any forward entries for name and any expired
|
||||
entries but only in the same hash bucket as name.
|
||||
If (flags & F_REVERSE) then remove any reverse entries for addr and any expired
|
||||
entries in the whole cache.
|
||||
If (flags == 0) remove any expired entries in the whole cache. */
|
||||
If (flags == 0) remove any expired entries in the whole cache.
|
||||
|
||||
In the flags & F_FORWARD case, the return code is valid, and returns zero if the
|
||||
name exists in the cache as a HOSTS or DHCP entry (these are never deleted) */
|
||||
|
||||
#define F_CACHESTATUS (F_HOSTS | F_DHCP | F_FORWARD | F_REVERSE | F_IPV4 | F_IPV6)
|
||||
struct crec *crecp, **up;
|
||||
flags &= (F_FORWARD | F_REVERSE | F_IPV6 | F_IPV4);
|
||||
|
||||
if (flags & F_FORWARD)
|
||||
{
|
||||
for (up = hash_bucket(name), crecp = *up; crecp; crecp = crecp->hash_next)
|
||||
if ((!(crecp->flags & F_IMMORTAL) && difftime(now, crecp->ttd) > 0) ||
|
||||
((flags == (crecp->flags & F_CACHESTATUS)) && hostname_isequal(cache_get_name(crecp), name)))
|
||||
{
|
||||
if (is_expired(now, crecp) || is_outdated_cname_pointer(crecp))
|
||||
{
|
||||
*up = crecp->hash_next;
|
||||
if (!(crecp->flags & (F_HOSTS | F_DHCP)))
|
||||
{
|
||||
{
|
||||
cache_unlink(crecp);
|
||||
cache_free(crecp);
|
||||
}
|
||||
}
|
||||
else if ((crecp->flags & F_FORWARD) &&
|
||||
((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))
|
||||
return 0;
|
||||
*up = crecp->hash_next;
|
||||
cache_unlink(crecp);
|
||||
cache_free(crecp);
|
||||
}
|
||||
else
|
||||
up = &crecp->hash_next;
|
||||
@@ -176,8 +221,7 @@ static void cache_scan_free(char *name, struct all_addr *addr, time_t now, unsig
|
||||
#endif
|
||||
for (i = 0; i < hash_size; i++)
|
||||
for (crecp = hash_table[i], up = &hash_table[i]; crecp; crecp = crecp->hash_next)
|
||||
if ((!(crecp->flags & F_IMMORTAL) && difftime(now, crecp->ttd) > 0) ||
|
||||
((flags == (crecp->flags & F_CACHESTATUS)) && memcmp(&crecp->addr, addr, addrlen) == 0))
|
||||
if (is_expired(now, crecp))
|
||||
{
|
||||
*up = crecp->hash_next;
|
||||
if (!(crecp->flags & (F_HOSTS | F_DHCP)))
|
||||
@@ -186,9 +230,20 @@ static void cache_scan_free(char *name, struct all_addr *addr, time_t now, unsig
|
||||
cache_free(crecp);
|
||||
}
|
||||
}
|
||||
else if (!(crecp->flags & (F_HOSTS | F_DHCP)) &&
|
||||
(flags & crecp->flags & F_REVERSE) &&
|
||||
(flags & crecp->flags & (F_IPV4 | F_IPV6)) &&
|
||||
memcmp(&crecp->addr.addr, addr, addrlen) == 0)
|
||||
{
|
||||
*up = crecp->hash_next;
|
||||
cache_unlink(crecp);
|
||||
cache_free(crecp);
|
||||
}
|
||||
else
|
||||
up = &crecp->hash_next;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Note: The normal calling sequence is
|
||||
@@ -214,8 +269,8 @@ void cache_start_insert(void)
|
||||
insert_error = 0;
|
||||
}
|
||||
|
||||
void cache_insert(char *name, struct all_addr *addr,
|
||||
time_t now, unsigned long ttl, unsigned short flags)
|
||||
struct crec *cache_insert(char *name, struct all_addr *addr,
|
||||
time_t now, unsigned long ttl, unsigned short flags)
|
||||
{
|
||||
#ifdef HAVE_IPV6
|
||||
int addrlen = (flags & F_IPV6) ? IN6ADDRSZ : INADDRSZ;
|
||||
@@ -226,7 +281,7 @@ void cache_insert(char *name, struct all_addr *addr,
|
||||
union bigname *big_name = NULL;
|
||||
int freed_all = flags & F_REVERSE;
|
||||
|
||||
log_query(flags | F_UPSTREAM, name, addr);
|
||||
log_query(flags | F_UPSTREAM, name, addr, 0, NULL, 0);
|
||||
|
||||
/* name is needed as workspace by log_query in this case */
|
||||
if ((flags & F_NEG) && (flags & F_REVERSE))
|
||||
@@ -237,18 +292,23 @@ void cache_insert(char *name, struct all_addr *addr,
|
||||
|
||||
/* if previous insertion failed give up now. */
|
||||
if (insert_error)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
/* First remove any expired entries and entries for the name/address we
|
||||
are currently inserting. */
|
||||
cache_scan_free(name, addr, now, flags);
|
||||
are currently inserting. Fail is we attempt to delete a name from
|
||||
/etc/hosts or DHCP. */
|
||||
if (!cache_scan_free(name, addr, now, flags))
|
||||
{
|
||||
insert_error = 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Now get a cache entry from the end of the LRU list */
|
||||
while (1) {
|
||||
if (!(new = cache_tail)) /* no entries left - cache is too small, bail */
|
||||
{
|
||||
insert_error = 1;
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* End of LRU list is still in use: if we didn't scan all the hash
|
||||
@@ -259,7 +319,7 @@ void cache_insert(char *name, struct all_addr *addr,
|
||||
{
|
||||
if (freed_all)
|
||||
{
|
||||
cache_scan_free(cache_get_name(new), &new->addr, now, new->flags);
|
||||
cache_scan_free(cache_get_name(new), &new->addr.addr, now, new->flags);
|
||||
cache_live_freed++;
|
||||
}
|
||||
else
|
||||
@@ -283,7 +343,7 @@ void cache_insert(char *name, struct all_addr *addr,
|
||||
!(big_name = (union bigname *)malloc(sizeof(union bigname))))
|
||||
{
|
||||
insert_error = 1;
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
bignames_left--;
|
||||
@@ -306,10 +366,15 @@ void cache_insert(char *name, struct all_addr *addr,
|
||||
else
|
||||
*cache_get_name(new) = 0;
|
||||
if (addr)
|
||||
memcpy(&new->addr, addr, addrlen);
|
||||
memcpy(&new->addr.addr, addr, addrlen);
|
||||
else
|
||||
new->addr.cname.cache = NULL;
|
||||
|
||||
new->ttd = now + (time_t)ttl;
|
||||
new->next = new_chain;
|
||||
new_chain = new;
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
/* after end of insertion, commit the new entries */
|
||||
@@ -321,10 +386,16 @@ void cache_end_insert(void)
|
||||
while (new_chain)
|
||||
{
|
||||
struct crec *tmp = new_chain->next;
|
||||
cache_hash(new_chain);
|
||||
cache_link(new_chain);
|
||||
/* drop CNAMEs which didn't find a target. */
|
||||
if (is_outdated_cname_pointer(new_chain))
|
||||
cache_free(new_chain);
|
||||
else
|
||||
{
|
||||
cache_hash(new_chain);
|
||||
cache_link(new_chain);
|
||||
cache_inserted++;
|
||||
}
|
||||
new_chain = tmp;
|
||||
cache_inserted++;
|
||||
}
|
||||
new_chain = NULL;
|
||||
}
|
||||
@@ -345,7 +416,7 @@ struct crec *cache_find_by_name(struct crec *crecp, char *name, time_t now, unsi
|
||||
{
|
||||
next = crecp->hash_next;
|
||||
|
||||
if ((crecp->flags & F_IMMORTAL) || difftime(now, crecp->ttd) < 0)
|
||||
if (!is_expired(now, crecp) && !is_outdated_cname_pointer(crecp))
|
||||
{
|
||||
if ((crecp->flags & F_FORWARD) &&
|
||||
(crecp->flags & prot) &&
|
||||
@@ -426,11 +497,11 @@ struct crec *cache_find_by_addr(struct crec *crecp, struct all_addr *addr,
|
||||
|
||||
for(i=0; i<hash_size; i++)
|
||||
for (crecp = hash_table[i], up = &hash_table[i]; crecp; crecp = crecp->hash_next)
|
||||
if ((crecp->flags & F_IMMORTAL) || difftime(now, crecp->ttd) < 0)
|
||||
if (!is_expired(now, crecp))
|
||||
{
|
||||
if ((crecp->flags & F_REVERSE) &&
|
||||
(crecp->flags & prot) &&
|
||||
memcmp(&crecp->addr, addr, addrlen) == 0)
|
||||
memcmp(&crecp->addr.addr, addr, addrlen) == 0)
|
||||
{
|
||||
if (crecp->flags & (F_HOSTS | F_DHCP))
|
||||
{
|
||||
@@ -461,30 +532,34 @@ struct crec *cache_find_by_addr(struct crec *crecp, struct all_addr *addr,
|
||||
if (ans &&
|
||||
(ans->flags & F_REVERSE) &&
|
||||
(ans->flags & prot) &&
|
||||
memcmp(&ans->addr, addr, addrlen) == 0)
|
||||
memcmp(&ans->addr.addr, addr, addrlen) == 0)
|
||||
return ans;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrlen, unsigned short flags)
|
||||
static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrlen,
|
||||
unsigned short flags, int index)
|
||||
{
|
||||
struct crec *lookup = cache_find_by_name(NULL, cache->name.sname, 0, flags & (F_IPV4 | F_IPV6));
|
||||
|
||||
/* Remove duplicates in hosts files. */
|
||||
if (lookup && (lookup->flags & F_HOSTS) &&
|
||||
memcmp(&lookup->addr, addr, addrlen) == 0)
|
||||
if (lookup && (lookup->flags & F_HOSTS) &&
|
||||
memcmp(&lookup->addr.addr, addr, addrlen) == 0)
|
||||
free(cache);
|
||||
else
|
||||
{
|
||||
/* Ensure there is only one address -> name mapping (first one trumps) */
|
||||
if (cache_find_by_addr(NULL, addr, 0, flags & (F_IPV4 | F_IPV6)))
|
||||
flags &= ~F_REVERSE;
|
||||
cache->flags = flags;
|
||||
memcpy(&cache->addr, addr, addrlen);
|
||||
cache->uid = index;
|
||||
memcpy(&cache->addr.addr, addr, addrlen);
|
||||
cache_hash(cache);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void read_hostsfile(char *filename, int opts, char *buff, char *domain_suffix, unsigned short addn_flag)
|
||||
static void read_hostsfile(char *filename, int opts, char *buff, char *domain_suffix, int index)
|
||||
{
|
||||
FILE *f = fopen(filename, "r");
|
||||
char *line;
|
||||
@@ -492,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;
|
||||
}
|
||||
|
||||
@@ -509,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;
|
||||
@@ -527,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 != '#'))
|
||||
{
|
||||
@@ -543,33 +621,31 @@ static void read_hostsfile(char *filename, int opts, char *buff, char *domain_su
|
||||
strcpy(cache->name.sname, token);
|
||||
strcat(cache->name.sname, ".");
|
||||
strcat(cache->name.sname, domain_suffix);
|
||||
add_hosts_entry(cache, &addr, addrlen, flags | addn_flag);
|
||||
/* Only first name is cannonical and used for reverse lookups */
|
||||
flags &= ~F_REVERSE;
|
||||
add_hosts_entry(cache, &addr, addrlen, flags, index);
|
||||
}
|
||||
if ((cache = malloc(sizeof(struct crec) + strlen(token)+1-SMALLDNAME)))
|
||||
{
|
||||
strcpy(cache->name.sname, token);
|
||||
add_hosts_entry(cache, &addr, addrlen, flags | addn_flag);
|
||||
/* Clear this here in case not done above. */
|
||||
flags &= ~F_REVERSE;
|
||||
add_hosts_entry(cache, &addr, addrlen, flags, index);
|
||||
}
|
||||
}
|
||||
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, char *addn_hosts)
|
||||
void cache_reload(int opts, char *buff, char *domain_suffix, struct hostsfile *addn_hosts)
|
||||
{
|
||||
struct crec *cache, **up, *tmp;
|
||||
int i;
|
||||
|
||||
cache_inserted = cache_live_freed = 0;
|
||||
|
||||
for (i=0; i<hash_size; i++)
|
||||
for (cache = hash_table[i], up = &hash_table[i]; cache; cache = tmp)
|
||||
{
|
||||
@@ -596,17 +672,17 @@ void cache_reload(int opts, char *buff, char *domain_suffix, char *addn_hosts)
|
||||
if ((opts & OPT_NO_HOSTS) && !addn_hosts)
|
||||
{
|
||||
if (cache_size > 0)
|
||||
syslog(LOG_INFO, "cleared cache");
|
||||
syslog(LOG_INFO, _("cleared cache"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(opts & OPT_NO_HOSTS))
|
||||
read_hostsfile(HOSTSFILE, opts, buff, domain_suffix, 0);
|
||||
if (addn_hosts)
|
||||
while (addn_hosts)
|
||||
{
|
||||
read_hostsfile(addn_hosts, opts, buff, domain_suffix, F_ADDN);
|
||||
addn_file = addn_hosts;
|
||||
}
|
||||
read_hostsfile(addn_hosts->fname, opts, buff, domain_suffix, addn_hosts->index);
|
||||
addn_hosts = addn_hosts->next;
|
||||
}
|
||||
}
|
||||
|
||||
void cache_unhash_dhcp(void)
|
||||
@@ -632,36 +708,43 @@ void cache_unhash_dhcp(void)
|
||||
dhcp_inuse = NULL;
|
||||
}
|
||||
|
||||
void cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t ttd, unsigned short flags)
|
||||
void cache_add_dhcp_entry(struct daemon *daemon, char *host_name,
|
||||
struct in_addr *host_address, time_t ttd)
|
||||
{
|
||||
struct crec *crec;
|
||||
|
||||
if ((crec = cache_find_by_name(NULL, host_name, 0, F_IPV4)))
|
||||
unsigned short flags = F_DHCP | F_FORWARD | F_IPV4 | F_REVERSE;
|
||||
|
||||
if (!host_name)
|
||||
return;
|
||||
|
||||
if ((crec = cache_find_by_name(NULL, host_name, 0, F_IPV4 | F_CNAME)))
|
||||
{
|
||||
if (crec->flags & F_HOSTS)
|
||||
{
|
||||
if (crec->addr.addr.addr4.s_addr != host_address->s_addr)
|
||||
syslog(LOG_WARNING, "Not naming DHCP lease for %s because it clashes with an /etc/hosts entry.", host_name);
|
||||
if (crec->addr.addr.addr.addr4.s_addr != host_address->s_addr)
|
||||
{
|
||||
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"),
|
||||
host_name, inet_ntoa(*host_address),
|
||||
record_source(daemon->addn_hosts, crec->uid), daemon->namebuff);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (!(crec->flags & F_DHCP))
|
||||
{
|
||||
if (crec->flags & F_NEG)
|
||||
{
|
||||
/* name may have been searched for before being allocated to DHCP and
|
||||
therefore got a negative cache entry. If so delete it and continue. */
|
||||
cache_scan_free(host_name, NULL, 0, F_IPV4 | F_FORWARD);
|
||||
goto newrec;
|
||||
}
|
||||
else
|
||||
syslog(LOG_WARNING, "Not naming DHCP lease for %s because it clashes with a cached name.", cache_get_name(crec));
|
||||
}
|
||||
return;
|
||||
cache_scan_free(host_name, NULL, 0, crec->flags & (F_IPV4 | F_CNAME | F_FORWARD));
|
||||
}
|
||||
|
||||
if ((crec = cache_find_by_addr(NULL, (struct all_addr *)host_address, 0, F_IPV4)) && (crec->flags & F_NEG))
|
||||
cache_scan_free(NULL, (struct all_addr *)host_address, 0, F_IPV4 | F_REVERSE);
|
||||
|
||||
newrec:
|
||||
if ((crec = cache_find_by_addr(NULL, (struct all_addr *)host_address, 0, F_IPV4)))
|
||||
{
|
||||
if (crec->flags & F_NEG)
|
||||
cache_scan_free(NULL, (struct all_addr *)host_address, 0, F_IPV4 | F_REVERSE);
|
||||
else
|
||||
/* avoid multiple reverse mappings */
|
||||
flags &= ~F_REVERSE;
|
||||
}
|
||||
|
||||
if ((crec = dhcp_spare))
|
||||
dhcp_spare = dhcp_spare->prev;
|
||||
else /* need new one */
|
||||
@@ -669,12 +752,12 @@ void cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t
|
||||
|
||||
if (crec) /* malloc may fail */
|
||||
{
|
||||
crec->flags = F_DHCP | F_FORWARD | F_IPV4 | flags;
|
||||
crec->flags = flags;
|
||||
if (ttd == 0)
|
||||
crec->flags |= F_IMMORTAL;
|
||||
else
|
||||
crec->ttd = ttd;
|
||||
crec->addr.addr.addr4 = *host_address;
|
||||
crec->addr.addr.addr.addr4 = *host_address;
|
||||
crec->name.namep = host_name;
|
||||
crec->prev = dhcp_inuse;
|
||||
dhcp_inuse = crec;
|
||||
@@ -684,36 +767,49 @@ void cache_add_dhcp_entry(char *host_name, struct in_addr *host_address, time_t
|
||||
|
||||
|
||||
|
||||
void dump_cache(int debug, int cache_size)
|
||||
void dump_cache(struct daemon *daemon, time_t now)
|
||||
{
|
||||
syslog(LOG_INFO, "Cache size %d, %d/%d cache insertions re-used unexpired cache entries.",
|
||||
cache_size, 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 (debug)
|
||||
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)
|
||||
{
|
||||
if ((cache->flags & F_NEG) && (cache->flags & F_FORWARD))
|
||||
addrbuff[0] = 0;
|
||||
else if (cache->flags & F_CNAME)
|
||||
{
|
||||
addrbuff[0] = 0;
|
||||
addrbuff[ADDRSTRLEN-1] = 0;
|
||||
if (!is_outdated_cname_pointer(cache))
|
||||
strncpy(addrbuff, cache_get_name(cache->addr.cname.cache), ADDRSTRLEN);
|
||||
}
|
||||
#ifdef HAVE_IPV6
|
||||
else if (cache->flags & F_IPV4)
|
||||
inet_ntop(AF_INET, &cache->addr, addrbuff, ADDRSTRLEN);
|
||||
inet_ntop(AF_INET, &cache->addr.addr, addrbuff, ADDRSTRLEN);
|
||||
else if (cache->flags & F_IPV6)
|
||||
inet_ntop(AF_INET6, &cache->addr, addrbuff, ADDRSTRLEN);
|
||||
inet_ntop(AF_INET6, &cache->addr.addr, addrbuff, ADDRSTRLEN);
|
||||
#else
|
||||
else
|
||||
strcpy(addrbuff, inet_ntoa(cache->addr.addr.addr4));
|
||||
strcpy(addrbuff, inet_ntoa(cache->addr.addr.addr.addr4));
|
||||
#endif
|
||||
syslog(LOG_DEBUG,
|
||||
#ifdef HAVE_BROKEN_RTC
|
||||
"%-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
|
||||
syslog(LOG_DEBUG, "%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %s",
|
||||
cache_get_name(cache), addrbuff,
|
||||
cache->flags & F_IPV4 ? "4" : "",
|
||||
cache->flags & F_IPV6 ? "6" : "",
|
||||
cache->flags & F_CNAME ? "C" : "",
|
||||
cache->flags & F_FORWARD ? "F" : " ",
|
||||
cache->flags & F_REVERSE ? "R" : " ",
|
||||
cache->flags & F_IMMORTAL ? "I" : " ",
|
||||
@@ -721,19 +817,38 @@ void dump_cache(int debug, int cache_size)
|
||||
cache->flags & F_NEG ? "N" : " ",
|
||||
cache->flags & F_NXDOMAIN ? "X" : " ",
|
||||
cache->flags & F_HOSTS ? "H" : " ",
|
||||
cache->flags & F_ADDN ? "A" : " ",
|
||||
cache->flags & F_IMMORTAL ? "\n" : ctime(&(cache->ttd))) ;
|
||||
}
|
||||
|
||||
}
|
||||
#ifdef HAVE_BROKEN_RTC
|
||||
cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now)
|
||||
#else
|
||||
cache->flags & F_IMMORTAL ? "\n" : ctime(&(cache->ttd))
|
||||
#endif
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static char *record_source(struct hostsfile *addn_hosts, int index)
|
||||
{
|
||||
char *source = HOSTSFILE;
|
||||
while (addn_hosts)
|
||||
{
|
||||
if (addn_hosts->index == index)
|
||||
{
|
||||
source = addn_hosts->fname;
|
||||
break;
|
||||
}
|
||||
addn_hosts = addn_hosts->next;
|
||||
}
|
||||
|
||||
void log_query(unsigned short flags, char *name, struct all_addr *addr)
|
||||
return source;
|
||||
}
|
||||
|
||||
void log_query(unsigned short flags, char *name, struct all_addr *addr,
|
||||
unsigned short type, struct hostsfile *addn_hosts, int index)
|
||||
{
|
||||
char *source;
|
||||
char *verb = "is";
|
||||
char addrbuff[ADDRSTRLEN];
|
||||
char types[20];
|
||||
|
||||
if (!log_queries)
|
||||
return;
|
||||
@@ -749,14 +864,26 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr)
|
||||
#endif
|
||||
|
||||
if (flags & F_NXDOMAIN)
|
||||
strcpy(addrbuff, "<NXDOMAIN>-");
|
||||
strcpy(addrbuff, "<NXDOMAIN>");
|
||||
else
|
||||
strcpy(addrbuff, "<NODATA>-");
|
||||
strcpy(addrbuff, "<NODATA>");
|
||||
|
||||
if (flags & F_IPV4)
|
||||
strcat(addrbuff, "IPv4");
|
||||
strcat(addrbuff, "-IPv4");
|
||||
else if (flags & F_IPV6)
|
||||
strcat(addrbuff, "-IPv6");
|
||||
}
|
||||
else if (flags & F_CNAME)
|
||||
{
|
||||
/* nasty abuse of IPV4 and IPV6 flags */
|
||||
if (flags & F_IPV4)
|
||||
strcpy(addrbuff, "<MX>");
|
||||
else if (flags & F_IPV6)
|
||||
strcpy(addrbuff, "<SRV>");
|
||||
else if (flags & F_NXDOMAIN)
|
||||
strcpy(addrbuff, "<TXT>");
|
||||
else
|
||||
strcat(addrbuff, "IPv6");
|
||||
strcpy(addrbuff, "<CNAME>");
|
||||
}
|
||||
else
|
||||
#ifdef HAVE_IPV6
|
||||
@@ -765,17 +892,12 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr)
|
||||
#else
|
||||
strcpy(addrbuff, inet_ntoa(addr->addr.addr4));
|
||||
#endif
|
||||
|
||||
|
||||
if (flags & F_DHCP)
|
||||
source = "DHCP";
|
||||
else if (flags & F_HOSTS)
|
||||
{
|
||||
if (flags & F_ADDN)
|
||||
source = addn_file;
|
||||
else
|
||||
source = HOSTSFILE;
|
||||
}
|
||||
else if (flags & F_CONFIG)
|
||||
source = record_source(addn_hosts, index);
|
||||
else if (flags & F_CONFIG)
|
||||
source = "config";
|
||||
else if (flags & F_UPSTREAM)
|
||||
source = "reply";
|
||||
@@ -786,12 +908,56 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr)
|
||||
}
|
||||
else if (flags & F_QUERY)
|
||||
{
|
||||
source = "query";
|
||||
unsigned int i;
|
||||
static const struct {
|
||||
unsigned int type;
|
||||
const char * const name;
|
||||
} typestr[] = {
|
||||
{ 1, "A" },
|
||||
{ 2, "NS" },
|
||||
{ 5, "CNAME" },
|
||||
{ 6, "SOA" },
|
||||
{ 10, "NULL" },
|
||||
{ 11, "WKS" },
|
||||
{ 12, "PTR" },
|
||||
{ 13, "HINFO" },
|
||||
{ 15, "MX" },
|
||||
{ 16, "TXT" },
|
||||
{ 22, "NSAP" },
|
||||
{ 23, "NSAP_PTR" },
|
||||
{ 24, "SIG" },
|
||||
{ 25, "KEY" },
|
||||
{ 28, "AAAA" },
|
||||
{ 33, "SRV" },
|
||||
{ 36, "KX" },
|
||||
{ 37, "CERT" },
|
||||
{ 38, "A6" },
|
||||
{ 39, "DNAME" },
|
||||
{ 41, "OPT" },
|
||||
{ 250, "TSIG" },
|
||||
{ 251, "IXFR" },
|
||||
{ 252, "AXFR" },
|
||||
{ 253, "MAILB" },
|
||||
{ 254, "MAILA" },
|
||||
{ 255, "ANY" }
|
||||
};
|
||||
|
||||
if (type != 0)
|
||||
{
|
||||
sprintf(types, "query[type=%d]", type);
|
||||
for (i = 0; i < (sizeof(typestr)/sizeof(typestr[0])); i++)
|
||||
if (typestr[i].type == type)
|
||||
sprintf(types,"query[%s]", typestr[i].name);
|
||||
}
|
||||
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", source, name, verb, addrbuff);
|
||||
else if (flags & F_REVERSE)
|
||||
|
||||
240
src/config.h
240
src/config.h
@@ -1,4 +1,4 @@
|
||||
/* dnsmasq is Copyright (c) 2000 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,36 +10,49 @@
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/* Author's email: simon@thekelleys.org.uk */
|
||||
|
||||
#define VERSION "2.2"
|
||||
#define VERSION "2.31"
|
||||
|
||||
#define FTABSIZ 150 /* max number of outstanding requests */
|
||||
#define TIMEOUT 40 /* drop queries after TIMEOUT seconds */
|
||||
#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 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"
|
||||
#ifdef __uClinux__
|
||||
# define RESOLVFILE "/etc/config/resolv.conf"
|
||||
#else
|
||||
# define RESOLVFILE "/etc/resolv.conf"
|
||||
#endif
|
||||
#define RUNFILE "/var/run/dnsmasq.pid"
|
||||
#ifdef __FreeBSD__
|
||||
#if defined(__FreeBSD__) || defined (__OpenBSD__)
|
||||
# define LEASEFILE "/var/db/dnsmasq.leases"
|
||||
# define CONFFILE "/usr/local/etc/dnsmasq.conf"
|
||||
#else
|
||||
# define LEASEFILE "/var/lib/misc/dnsmasq.leases"
|
||||
#endif
|
||||
#if defined(__FreeBSD__)
|
||||
# define CONFFILE "/usr/local/etc/dnsmasq.conf"
|
||||
#else
|
||||
# define CONFFILE "/etc/dnsmasq.conf"
|
||||
#endif
|
||||
#define DEFLEASE 3600 /* default lease time, 1 hour */
|
||||
#define CHUSER "nobody"
|
||||
#define CHGRP "dip"
|
||||
#define IP6INTERFACES "/proc/net/if_inet6"
|
||||
#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
|
||||
@@ -54,25 +67,20 @@
|
||||
# define DNSMASQ_LOG_FAC(debug) LOG_DAEMON
|
||||
#endif
|
||||
|
||||
/* A small collection of RR-types which are missing on some platforms */
|
||||
|
||||
/* 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 */
|
||||
#ifndef T_SRV
|
||||
# define T_SRV 33
|
||||
#endif
|
||||
|
||||
#if defined(INET6_ADDRSTRLEN)
|
||||
# define HAVE_IPV6
|
||||
# define ADDRSTRLEN INET6_ADDRSTRLEN
|
||||
#elif defined(INET_ADDRSTRLEN)
|
||||
# undef HAVE_IPV6
|
||||
# define ADDRSTRLEN INET_ADDRSTRLEN
|
||||
#else
|
||||
# undef HAVE_IPV6
|
||||
# define ADDRSTRLEN 16 /* 4*3 + 3 dots + NULL */
|
||||
#ifndef T_OPT
|
||||
# define T_OPT 41
|
||||
#endif
|
||||
|
||||
/* Get linux C library versions. */
|
||||
#if defined(__linux__) && !defined(__UCLIBC__) && !defined(__uClinux__)
|
||||
# include <libio.h>
|
||||
/*# include <libio.h> */
|
||||
# include <features.h>
|
||||
#endif
|
||||
|
||||
|
||||
@@ -80,10 +88,29 @@
|
||||
new system, you may want to edit these.
|
||||
May replace this with Autoconf one day.
|
||||
|
||||
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_LINUX_IPV6_PROC
|
||||
define this to do IPv6 interface discovery using
|
||||
proc/net/if_inet6 ala LINUX.
|
||||
HAVE_BROKEN_RTC
|
||||
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.
|
||||
|
||||
HAVE_ISC_READER
|
||||
define this to include the old ISC dhcpcd integration. Note that you cannot
|
||||
set both HAVE_ISC_READER and HAVE_BROKEN_RTC.
|
||||
|
||||
HAVE_GETOPT_LONG
|
||||
define this if you have GNU libc or GNU getopt.
|
||||
@@ -108,150 +135,153 @@ 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_PF_PACKET
|
||||
If your OS implements packet sockets, 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
|
||||
HAVE_DEV_URANDOM
|
||||
HAVE_PF_PACKET
|
||||
you should NOT define
|
||||
you should NOT define
|
||||
HAVE_ARC4RANDOM
|
||||
HAVE_SOCKADDR_SA_LEN
|
||||
|
||||
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
|
||||
HAVE_DEV_URANDOM - OpenBSD and FreeBSD
|
||||
HAVE_DEV_RANDOM - FreeBSD (OpenBSD with hardware random number generator)
|
||||
HAVE_GETOPT_LONG - only if you link GNU getopt.
|
||||
HAVE_ARC4RANDOM - OpenBSD and FreeBSD and NetBSD version 2.0 or later
|
||||
HAVE_DEV_URANDOM - OpenBSD and FreeBSD and NetBSD
|
||||
HAVE_DEV_RANDOM - FreeBSD and NetBSD
|
||||
(OpenBSD with hardware random number generator)
|
||||
HAVE_GETOPT_LONG - NetBSD, later FreeBSD
|
||||
(FreeBSD and OpenBSD only if you link GNU getopt)
|
||||
|
||||
*/
|
||||
|
||||
/* Must preceed __linux__ since uClinux defines __linux__ too. */
|
||||
#if defined(__uClinux__) || defined(__UCLIBC__)
|
||||
#undef HAVE_LINUX_IPV6_PROC
|
||||
#define HAVE_GETOPT_LONG
|
||||
#undef HAVE_ARC4RANDOM
|
||||
#define HAVE_RANDOM
|
||||
#define HAVE_DEV_URANDOM
|
||||
#define HAVE_DEV_RANDOM
|
||||
#define HAVE_PF_PACKET
|
||||
#undef HAVE_SOCKADDR_SA_LEN
|
||||
#undef HAVE_PSELECT
|
||||
/* Don't fork into background on uClinux */
|
||||
#if defined(__uClinux__)
|
||||
# define NO_FORK
|
||||
/* 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
|
||||
#endif
|
||||
|
||||
/* 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
|
||||
/* platform dependent options. */
|
||||
|
||||
/* Must preceed __linux__ since uClinux defines __linux__ too. */
|
||||
#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_PF_PACKET
|
||||
#undef HAVE_SOCKADDR_SA_LEN
|
||||
#undef HAVE_PSELECT
|
||||
/* Fix various misfeatures of libc5 headers */
|
||||
#define T_SRV 33
|
||||
typedef unsigned long in_addr_t;
|
||||
typedef size_t socklen_t;
|
||||
/* 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
|
||||
|
||||
#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
|
||||
#if !defined(__ARCH_HAS_MMU__) && !defined(__UCLIBC_HAS_MMU__)
|
||||
# define NO_FORK
|
||||
#endif
|
||||
#if defined(__UCLIBC_HAS_IPV6__)
|
||||
# ifndef IPV6_V6ONLY
|
||||
# define IPV6_V6ONLY 26
|
||||
# endif
|
||||
#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
|
||||
#define HAVE_PF_PACKET
|
||||
/* 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_GETOPT_LONG
|
||||
#undef HAVE_LINUX_NETWORK
|
||||
/* Later verions of FreeBSD have getopt_long() */
|
||||
#if defined(optional_argument) && defined(required_argument)
|
||||
# define HAVE_GETOPT_LONG
|
||||
#else
|
||||
# undef HAVE_GETOPT_LONG
|
||||
#endif
|
||||
#define HAVE_ARC4RANDOM
|
||||
#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_
|
||||
/* The two below are not defined in Mac OS X arpa/nameserv.h */
|
||||
/* This is not defined in Mac OS X arpa/nameserv.h */
|
||||
#define IN6ADDRSZ 16
|
||||
#define T_SRV 33
|
||||
|
||||
#elif defined(__NetBSD__)
|
||||
#undef HAVE_LINUX_IPV6_PROC
|
||||
#undef HAVE_GETOPT_LONG
|
||||
#undef HAVE_LINUX_NETWORK
|
||||
#define HAVE_GETOPT_LONG
|
||||
#undef HAVE_ARC4RANDOM
|
||||
#define HAVE_RANDOM
|
||||
#undef HAVE_DEV_URANDOM
|
||||
#undef HAVE_DEV_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
343
src/dbus.c
Normal 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, dnsmasq_time());
|
||||
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
|
||||
952
src/dhcp.c
952
src/dhcp.c
File diff suppressed because it is too large
Load Diff
1074
src/dnsmasq.c
1074
src/dnsmasq.c
File diff suppressed because it is too large
Load Diff
532
src/dnsmasq.h
532
src/dnsmasq.h
@@ -1,4 +1,4 @@
|
||||
/* dnsmasq is Copyright (c) 2000-2003 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
|
||||
@@ -10,35 +10,42 @@
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/* Author's email: simon@thekelleys.org.uk */
|
||||
|
||||
/* for pselect.... */
|
||||
#define _XOPEN_SOURCE 600
|
||||
/* but then DNS headers don't compile without.... */
|
||||
#define _BSD_SOURCE
|
||||
/* and also, on FreeBSD 5.0 ..... */
|
||||
#define __BSD_VISIBLE 1
|
||||
#define COPYRIGHT "Copyright (C) 2000-2006 Simon Kelley"
|
||||
|
||||
/* get these before config.h for IPv6 stuff... */
|
||||
#include <sys/types.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
/* get this before config.h too. */
|
||||
#include <syslog.h>
|
||||
#ifdef __APPLE__
|
||||
/* need this before arpa/nameser.h */
|
||||
# define BIND_8_COMPAT
|
||||
#endif
|
||||
#include <arpa/nameser.h>
|
||||
|
||||
/* and this. */
|
||||
#include <getopt.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <arpa/nameser.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/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/select.h>
|
||||
#if defined(__sun) || defined(__sun__)
|
||||
#include <sys/sockio.h>
|
||||
#endif
|
||||
#include <sys/wait.h>
|
||||
#include <sys/time.h>
|
||||
#include <limits.h>
|
||||
#include <net/if.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
@@ -47,25 +54,39 @@
|
||||
#include <fcntl.h>
|
||||
#include <ctype.h>
|
||||
#include <signal.h>
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
# include <getopt.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <net/ethernet.h>
|
||||
#include <stdarg.h>
|
||||
#if defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
# include <netinet/if_ether.h>
|
||||
#else
|
||||
# include <net/ethernet.h>
|
||||
#endif
|
||||
#include <net/if_arp.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/ip.h>
|
||||
#ifdef HAVE_PF_PACKET
|
||||
#include <netpacket/packet.h>
|
||||
#endif
|
||||
#ifdef HAVE_BPF
|
||||
#include <net/bpf.h>
|
||||
#include <net/if_dl.h>
|
||||
#endif
|
||||
#include <netinet/ip_icmp.h>
|
||||
#include <sys/uio.h>
|
||||
#ifndef HAVE_LINUX_NETWORK
|
||||
# include <net/if_dl.h>
|
||||
#endif
|
||||
|
||||
#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
|
||||
#define OPT_FILTER 2
|
||||
@@ -80,6 +101,15 @@
|
||||
#define OPT_LOCALMX 1024
|
||||
#define OPT_NO_NEG 2048
|
||||
#define OPT_NODOTS_LOCAL 4096
|
||||
#define OPT_NOWILD 8192
|
||||
#define OPT_ETHERS 16384
|
||||
#define OPT_RESOLV_DOMAIN 32768
|
||||
#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 {
|
||||
@@ -95,6 +125,25 @@ struct bogus_addr {
|
||||
struct bogus_addr *next;
|
||||
};
|
||||
|
||||
/* dns doctor param */
|
||||
struct doctor {
|
||||
struct in_addr in, out, mask;
|
||||
struct doctor *next;
|
||||
};
|
||||
|
||||
struct mx_srv_record {
|
||||
char *name, *target;
|
||||
int issrv, srvport, priority, weight;
|
||||
unsigned int offset;
|
||||
struct mx_srv_record *next;
|
||||
};
|
||||
|
||||
struct txt_record {
|
||||
char *name, *txt;
|
||||
unsigned short class, len;
|
||||
struct txt_record *next;
|
||||
};
|
||||
|
||||
union bigname {
|
||||
char name[MAXDNAME];
|
||||
union bigname *next; /* freelist */
|
||||
@@ -103,7 +152,14 @@ union bigname {
|
||||
struct crec {
|
||||
struct crec *next, *prev, *hash_next;
|
||||
time_t ttd; /* time to die */
|
||||
struct all_addr addr;
|
||||
int uid;
|
||||
union {
|
||||
struct all_addr addr;
|
||||
struct {
|
||||
struct crec *cache;
|
||||
int uid;
|
||||
} cname;
|
||||
} addr;
|
||||
unsigned short flags;
|
||||
union {
|
||||
char sname[SMALLDNAME];
|
||||
@@ -126,11 +182,11 @@ struct crec {
|
||||
#define F_SERVER 2048
|
||||
#define F_NXDOMAIN 4096
|
||||
#define F_QUERY 8192
|
||||
#define F_ADDN 16384
|
||||
#define F_CNAME 16384
|
||||
#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;
|
||||
@@ -152,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;
|
||||
@@ -171,108 +231,246 @@ struct server {
|
||||
struct serverfd *sfd; /* non-NULL if this server has its own fd bound to
|
||||
a source port */
|
||||
char *domain; /* set if this server only handles a domain. */
|
||||
int flags;
|
||||
int flags, tcpfd;
|
||||
struct server *next;
|
||||
};
|
||||
|
||||
/* linked list of all the interfaces in the system and
|
||||
the sockets we have bound to each one. */
|
||||
struct irec {
|
||||
union mysockaddr addr;
|
||||
int fd;
|
||||
int valid;
|
||||
struct in_addr netmask; /* only valid for IPv4 */
|
||||
struct irec *next;
|
||||
};
|
||||
|
||||
struct listener {
|
||||
int fd, tcpfd, family;
|
||||
struct irec *iface; /* only valid for non-wildcard */
|
||||
struct listener *next;
|
||||
};
|
||||
|
||||
/* interface and address parms from command line. */
|
||||
struct iname {
|
||||
char *name;
|
||||
union mysockaddr addr;
|
||||
int found;
|
||||
int isloop, used;
|
||||
struct iname *next;
|
||||
};
|
||||
|
||||
/* 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;
|
||||
};
|
||||
|
||||
/* adn-hosts parms from command-line */
|
||||
struct hostsfile {
|
||||
struct hostsfile *next;
|
||||
char *fname;
|
||||
int index; /* matches to cache entries for logging */
|
||||
};
|
||||
|
||||
struct frec {
|
||||
union mysockaddr source;
|
||||
struct all_addr dest;
|
||||
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 */
|
||||
char auth_name; /* hostname came from config, not from client */
|
||||
char new; /* newly created */
|
||||
char old; /* read from leasefile */
|
||||
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;
|
||||
};
|
||||
|
||||
struct dhcp_netid {
|
||||
char *net;
|
||||
struct dhcp_netid *next;
|
||||
};
|
||||
|
||||
struct dhcp_netid_list {
|
||||
struct dhcp_netid *list;
|
||||
struct dhcp_netid_list *next;
|
||||
};
|
||||
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
|
||||
|
||||
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;
|
||||
struct dhcp_netid *netid;
|
||||
struct dhcp_boot *next;
|
||||
};
|
||||
|
||||
struct dhcp_vendor {
|
||||
int len, is_vendor;
|
||||
char *data;
|
||||
struct dhcp_netid netid;
|
||||
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 {
|
||||
int fd, rawfd, ifindex;
|
||||
char *iface;
|
||||
unsigned char hwaddr[ETHER_ADDR_LEN];
|
||||
unsigned int lease_time;
|
||||
struct in_addr serv_addr, netmask, broadcast;
|
||||
struct in_addr start, end, last; /* range of available addresses */
|
||||
struct dhcp_context *next;
|
||||
unsigned int lease_time, addr_epoch;
|
||||
struct in_addr netmask, broadcast;
|
||||
struct in_addr local, router;
|
||||
struct in_addr start, end; /* range of available addresses */
|
||||
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];
|
||||
u32 cookie;
|
||||
u8 options[308];
|
||||
} 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
|
||||
config file arguments. All set (including defaults)
|
||||
in option.c */
|
||||
|
||||
unsigned int options;
|
||||
struct resolvc default_resolv, *resolv_files;
|
||||
struct mx_srv_record *mxnames;
|
||||
struct txt_record *txt;
|
||||
char *mxtarget;
|
||||
char *lease_file;
|
||||
char *username, *groupname;
|
||||
char *domain_suffix;
|
||||
char *runfile;
|
||||
char *lease_change_command;
|
||||
struct iname *if_names, *if_addrs, *if_except, *dhcp_except;
|
||||
struct bogus_addr *bogus_addr;
|
||||
struct server *servers;
|
||||
int cachesize;
|
||||
int port, query_port;
|
||||
unsigned long local_ttl;
|
||||
struct hostsfile *addn_hosts;
|
||||
struct dhcp_context *dhcp;
|
||||
struct dhcp_config *dhcp_conf;
|
||||
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;
|
||||
unsigned int min_leasetime;
|
||||
struct doctor *doctors;
|
||||
unsigned short edns_pktsz;
|
||||
|
||||
/* 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;
|
||||
struct server *srv_save; /* Used for resend on DoD */
|
||||
size_t packet_len; /* " " */
|
||||
pid_t script_pid, tcp_pids[MAX_PROCS];
|
||||
int num_kids;
|
||||
|
||||
/* DHCP state */
|
||||
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 */
|
||||
void cache_init(int cachesize, int log);
|
||||
void log_query(unsigned short flags, char *name, struct all_addr *addr);
|
||||
void log_query(unsigned short flags, char *name, struct all_addr *addr,
|
||||
unsigned short type, struct hostsfile *addn_hosts, int index);
|
||||
struct crec *cache_find_by_addr(struct crec *crecp,
|
||||
struct all_addr *addr, time_t now,
|
||||
unsigned short prot);
|
||||
@@ -280,102 +478,150 @@ struct crec *cache_find_by_name(struct crec *crecp,
|
||||
char *name, time_t now, unsigned short prot);
|
||||
void cache_end_insert(void);
|
||||
void cache_start_insert(void);
|
||||
void cache_insert(char *name, struct all_addr *addr,
|
||||
time_t now, unsigned long ttl, unsigned short flags);
|
||||
void cache_reload(int opts, char *buff, char *domain_suffix, char *addn_hosts);
|
||||
void cache_add_dhcp_entry(char *host_name, struct in_addr *host_address,
|
||||
time_t ttd, unsigned short flags);
|
||||
struct crec *cache_insert(char *name, struct all_addr *addr,
|
||||
time_t now, unsigned long ttl, unsigned short flags);
|
||||
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(int debug, int size);
|
||||
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, char *name);
|
||||
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, time_t now);
|
||||
void extract_neg_addrs(HEADER *header, unsigned int qlen, char *namebuff, time_t now);
|
||||
int answer_request(HEADER *header, char *limit, unsigned int qlen, char *mxname,
|
||||
char *mxtarget, unsigned int options, time_t now, unsigned long local_ttl,
|
||||
char *namebuff);
|
||||
int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name,
|
||||
unsigned short extract_request(HEADER *header, size_t qlen,
|
||||
char *name, unsigned short *typep);
|
||||
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);
|
||||
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, size_t qlen, char *name,
|
||||
struct bogus_addr *addr, time_t now);
|
||||
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, 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);
|
||||
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);
|
||||
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);
|
||||
char *print_mac(struct daemon *daemon, unsigned char *mac, int len);
|
||||
|
||||
/* option.c */
|
||||
unsigned int read_opts(int argc, char **argv, char *buff, struct resolvc **resolv_file,
|
||||
char **mxname, char **mxtarget, char **lease_file,
|
||||
char **username, char **groupname,
|
||||
char **domain_suffix, char **runfile,
|
||||
struct iname **if_names, struct iname **if_addrs, struct iname **if_except,
|
||||
struct bogus_addr **bogus_addr, struct server **serv_addrs, int *cachesize,
|
||||
int *port, int *query_port, unsigned long *local_ttl, char **addn_hosts,
|
||||
struct dhcp_context **dhcp, struct dhcp_config **dhcp_conf, struct dhcp_opt **opts,
|
||||
char **dhcp_file, char **dhcp_sname, struct in_addr *dhcp_next_server);
|
||||
struct daemon *read_opts (int argc, char **argv, char *compile_opts);
|
||||
|
||||
/* forward.c */
|
||||
void forward_init(int first);
|
||||
void reap_forward(int fd);
|
||||
struct server *forward_query(int udpfd, union mysockaddr *udpaddr, HEADER *header,
|
||||
int plen, unsigned int options, char *dnamebuff,
|
||||
struct server *servers, struct server *last_server,
|
||||
time_t now, unsigned long local_ttl);
|
||||
struct server *reply_query(int fd, int options, char *packet, time_t now,
|
||||
char *dnamebuff, struct server *last_server,
|
||||
struct bogus_addr *bogus_nxdomain);
|
||||
void reply_query(struct serverfd *sfd, struct daemon *daemon, time_t now);
|
||||
void receive_query(struct listener *listen, struct daemon *daemon, time_t now);
|
||||
unsigned char *tcp_request(struct daemon *daemon, int confd, time_t now,
|
||||
struct in_addr local_addr, struct in_addr netmask);
|
||||
|
||||
/* network.c */
|
||||
struct server *reload_servers(char *fname, char *buff, struct server *servers, int query_port);
|
||||
struct server *check_servers(struct server *new, struct irec *interfaces, struct serverfd **sfds);
|
||||
char *enumerate_interfaces(struct irec **interfaces,
|
||||
struct iname *names,
|
||||
struct iname *addrs,
|
||||
struct iname *except,
|
||||
struct dhcp_context *dhcp,
|
||||
int port);
|
||||
struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **sfds);
|
||||
void reload_servers(char *fname, struct daemon *daemon);
|
||||
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 daemon *daemon);
|
||||
int iface_check(struct daemon *daemon, int family,
|
||||
struct all_addr *addr, char *name);
|
||||
int fix_fd(int fd);
|
||||
|
||||
/* dhcp.c */
|
||||
void dhcp_packet(struct dhcp_context *context, char *packet,
|
||||
struct dhcp_opt *dhcp_opts,
|
||||
struct dhcp_config *dhcp_configs,
|
||||
time_t now, char *namebuff, char *domain_suffix,
|
||||
char *dhcp_file, char *dhcp_sname, struct in_addr dhcp_next_server);
|
||||
int address_available(struct dhcp_context *context, struct in_addr addr);
|
||||
int address_allocate(struct dhcp_context *context, struct dhcp_config *configs,
|
||||
struct in_addr *addrp);
|
||||
void dhcp_init(struct daemon *daemon);
|
||||
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 negonly);
|
||||
int address_allocate(struct dhcp_context *context, struct daemon *daemon,
|
||||
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);
|
||||
char *strip_hostname(struct daemon *daemon, char *hostname);
|
||||
char *host_from_dns(struct daemon *daemon, struct in_addr addr);
|
||||
|
||||
void set_configs_from_cache(struct dhcp_config *configs);
|
||||
/* lease.c */
|
||||
void lease_update_dns(int force_dns);
|
||||
int lease_init(char *lease_file, char *domain, char *buff,
|
||||
char *buff2, time_t now, struct dhcp_config *dhcp_configs);
|
||||
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);
|
||||
void lease_update_file(struct daemon *daemon, time_t now);
|
||||
void lease_update_dns(struct daemon *daemon);
|
||||
void lease_init(struct daemon *daemon, time_t now);
|
||||
struct dhcp_lease *lease_allocate(struct in_addr addr);
|
||||
void 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 daemon *daemon);
|
||||
void lease_collect(struct daemon *daemon);
|
||||
|
||||
/* rfc2131.c */
|
||||
int dhcp_reply(struct dhcp_context *context, struct dhcp_packet *mess,
|
||||
unsigned int sz, time_t now, char *namebuff,
|
||||
struct dhcp_opt *dhcp_opts, struct dhcp_config *dhcp_configs,
|
||||
char *domain_suffix, char *dhcp_file, char *dhcp_sname,
|
||||
struct in_addr dhcp_next_server);
|
||||
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, time_t now);
|
||||
|
||||
/* 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);
|
||||
#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
|
||||
|
||||
942
src/forward.c
942
src/forward.c
File diff suppressed because it is too large
Load Diff
248
src/isc.c
Normal file
248
src/isc.c
Normal file
@@ -0,0 +1,248 @@
|
||||
/* dnsmasq is Copyright (c) 2000 - 2005 by 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.
|
||||
*/
|
||||
|
||||
|
||||
/* Code in this file is based on contributions by John Volpe. */
|
||||
|
||||
#include "dnsmasq.h"
|
||||
|
||||
#ifdef HAVE_ISC_READER
|
||||
|
||||
#define MAXTOK 50
|
||||
|
||||
struct isc_lease {
|
||||
char *name, *fqdn;
|
||||
time_t expires;
|
||||
struct in_addr addr;
|
||||
struct isc_lease *next;
|
||||
};
|
||||
|
||||
static struct isc_lease *leases = NULL;
|
||||
static off_t lease_file_size = (off_t)0;
|
||||
static ino_t lease_file_inode = (ino_t)0;
|
||||
static int logged_lease = 0;
|
||||
|
||||
static int next_token (char *token, int buffsize, FILE * fp)
|
||||
{
|
||||
int c, count = 0;
|
||||
char *cp = token;
|
||||
|
||||
while((c = getc(fp)) != EOF)
|
||||
{
|
||||
if (c == '#')
|
||||
do { c = getc(fp); } while (c != '\n' && c != EOF);
|
||||
|
||||
if (c == ' ' || c == '\t' || c == '\n' || c == ';')
|
||||
{
|
||||
if (count)
|
||||
break;
|
||||
}
|
||||
else if ((c != '"') && (count<buffsize-1))
|
||||
{
|
||||
*cp++ = c;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
*cp = 0;
|
||||
return count ? 1 : 0;
|
||||
}
|
||||
|
||||
void load_dhcp(struct daemon *daemon, time_t now)
|
||||
{
|
||||
char *hostname = daemon->namebuff;
|
||||
char token[MAXTOK], *dot;
|
||||
struct in_addr host_address;
|
||||
time_t ttd, tts;
|
||||
FILE *fp;
|
||||
struct isc_lease *lease, *tmp, **up;
|
||||
struct stat statbuf;
|
||||
|
||||
if (stat(daemon->lease_file, &statbuf) == -1)
|
||||
{
|
||||
if (!logged_lease)
|
||||
syslog(LOG_WARNING, _("failed to access %s: %m"), daemon->lease_file);
|
||||
logged_lease = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
logged_lease = 0;
|
||||
|
||||
if ((statbuf.st_size <= lease_file_size) &&
|
||||
(statbuf.st_ino == lease_file_inode))
|
||||
return;
|
||||
|
||||
lease_file_size = statbuf.st_size;
|
||||
lease_file_inode = statbuf.st_ino;
|
||||
|
||||
if (!(fp = fopen (daemon->lease_file, "r")))
|
||||
{
|
||||
syslog (LOG_ERR, _("failed to load %s: %m"), daemon->lease_file);
|
||||
return;
|
||||
}
|
||||
|
||||
syslog (LOG_INFO, _("reading %s"), daemon->lease_file);
|
||||
|
||||
while ((next_token(token, MAXTOK, fp)))
|
||||
{
|
||||
if (strcmp(token, "lease") == 0)
|
||||
{
|
||||
hostname[0] = '\0';
|
||||
ttd = tts = (time_t)(-1);
|
||||
if (next_token(token, MAXTOK, fp) &&
|
||||
(host_address.s_addr = inet_addr(token)) != (in_addr_t) -1)
|
||||
{
|
||||
if (next_token(token, MAXTOK, fp) && *token == '{')
|
||||
{
|
||||
while (next_token(token, MAXTOK, fp) && *token != '}')
|
||||
{
|
||||
if ((strcmp(token, "client-hostname") == 0) ||
|
||||
(strcmp(token, "hostname") == 0))
|
||||
{
|
||||
if (next_token(hostname, MAXDNAME, fp))
|
||||
if (!canonicalise(hostname))
|
||||
{
|
||||
*hostname = 0;
|
||||
syslog(LOG_ERR, _("bad name in %s"), daemon->lease_file);
|
||||
}
|
||||
}
|
||||
else if ((strcmp(token, "ends") == 0) ||
|
||||
(strcmp(token, "starts") == 0))
|
||||
{
|
||||
struct tm lease_time;
|
||||
int is_ends = (strcmp(token, "ends") == 0);
|
||||
if (next_token(token, MAXTOK, fp) && /* skip weekday */
|
||||
next_token(token, MAXTOK, fp) && /* Get date from lease file */
|
||||
sscanf (token, "%d/%d/%d",
|
||||
&lease_time.tm_year,
|
||||
&lease_time.tm_mon,
|
||||
&lease_time.tm_mday) == 3 &&
|
||||
next_token(token, MAXTOK, fp) &&
|
||||
sscanf (token, "%d:%d:%d:",
|
||||
&lease_time.tm_hour,
|
||||
&lease_time.tm_min,
|
||||
&lease_time.tm_sec) == 3)
|
||||
{
|
||||
/* There doesn't seem to be a universally available library function
|
||||
which converts broken-down _GMT_ time to seconds-in-epoch.
|
||||
The following was borrowed from ISC dhcpd sources, where
|
||||
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 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 */
|
||||
? months [lease_time.tm_mon - 2]
|
||||
: 0) +
|
||||
(lease_time.tm_mon > 2 && /* Leap day this year */
|
||||
!((lease_time.tm_year - 1972) & 3)) +
|
||||
lease_time.tm_mday - 1) * 24) + /* Day of month */
|
||||
lease_time.tm_hour) * 60) +
|
||||
lease_time.tm_min) * 60) + lease_time.tm_sec;
|
||||
if (is_ends)
|
||||
ttd = time;
|
||||
else
|
||||
tts = time; }
|
||||
}
|
||||
}
|
||||
|
||||
/* missing info? */
|
||||
if (!*hostname)
|
||||
continue;
|
||||
if (ttd == (time_t)(-1))
|
||||
continue;
|
||||
|
||||
/* We use 0 as infinite in ttd */
|
||||
if ((tts != -1) && (ttd == tts - 1))
|
||||
ttd = (time_t)0;
|
||||
else if (difftime(now, ttd) > 0)
|
||||
continue;
|
||||
|
||||
if ((dot = strchr(hostname, '.')))
|
||||
{
|
||||
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"),
|
||||
hostname);
|
||||
continue;
|
||||
}
|
||||
*dot = 0;
|
||||
}
|
||||
|
||||
for (lease = leases; lease; lease = lease->next)
|
||||
if (hostname_isequal(lease->name, hostname))
|
||||
{
|
||||
lease->expires = ttd;
|
||||
lease->addr = host_address;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!lease && (lease = malloc(sizeof(struct isc_lease))))
|
||||
{
|
||||
lease->expires = ttd;
|
||||
lease->addr = host_address;
|
||||
lease->fqdn = NULL;
|
||||
lease->next = leases;
|
||||
if (!(lease->name = malloc(strlen(hostname)+1)))
|
||||
free(lease);
|
||||
else
|
||||
{
|
||||
leases = lease;
|
||||
strcpy(lease->name, hostname);
|
||||
if (daemon->domain_suffix &&
|
||||
(lease->fqdn = malloc(strlen(hostname) + strlen(daemon->domain_suffix) + 2)))
|
||||
{
|
||||
strcpy(lease->fqdn, hostname);
|
||||
strcat(lease->fqdn, ".");
|
||||
strcat(lease->fqdn, daemon->domain_suffix);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
/* prune expired leases */
|
||||
for (lease = leases, up = &leases; lease; lease = tmp)
|
||||
{
|
||||
tmp = lease->next;
|
||||
if (lease->expires != (time_t)0 && difftime(now, lease->expires) > 0)
|
||||
{
|
||||
*up = lease->next; /* unlink */
|
||||
free(lease->name);
|
||||
if (lease->fqdn)
|
||||
free(lease->fqdn);
|
||||
free(lease);
|
||||
}
|
||||
else
|
||||
up = &lease->next;
|
||||
}
|
||||
|
||||
|
||||
/* remove all existing DHCP cache entries */
|
||||
cache_unhash_dhcp();
|
||||
|
||||
for (lease = leases; lease; lease = lease->next)
|
||||
{
|
||||
cache_add_dhcp_entry(daemon, lease->fqdn, &lease->addr, lease->expires);
|
||||
cache_add_dhcp_entry(daemon, lease->name, &lease->addr, lease->expires);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
492
src/lease.c
492
src/lease.c
@@ -1,4 +1,4 @@
|
||||
/* dnsmasq is Copyright (c) 2000-2003 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,141 +10,189 @@
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/* Author's email: simon@thekelleys.org.uk */
|
||||
|
||||
#include "dnsmasq.h"
|
||||
|
||||
static struct dhcp_lease *leases;
|
||||
FILE *lease_file;
|
||||
int dns_dirty, file_dirty;
|
||||
static struct dhcp_lease *leases, *old_leases;
|
||||
static int dns_dirty, file_dirty, leases_left;
|
||||
|
||||
int lease_init(char *filename, char *domain, char *buff,
|
||||
char *buff2, time_t now, struct dhcp_config *dhcp_configs)
|
||||
void lease_init(struct daemon *daemon, time_t now)
|
||||
{
|
||||
unsigned int e0, e1, e2, e3, e4, e5, 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;
|
||||
struct dhcp_config *config;
|
||||
int clid_len = 0;
|
||||
int has_old = 0;
|
||||
int flags, clid_len, hw_len, hw_type;
|
||||
|
||||
leases = old_leases = NULL;
|
||||
leases_left = daemon->dhcp_max;
|
||||
|
||||
leases = NULL;
|
||||
/* NOTE: need a+ mode to create file if it doesn't exist */
|
||||
if (!(daemon->lease_stream = fopen(daemon->lease_file, "a+")))
|
||||
die(_("cannot open or create leases file: %s"), NULL);
|
||||
|
||||
flags = fcntl(fileno(daemon->lease_stream), F_GETFD);
|
||||
if (flags != -1)
|
||||
fcntl(fileno(daemon->lease_stream), F_SETFD, flags | FD_CLOEXEC);
|
||||
|
||||
if (!(lease_file = fopen(filename, "a+")))
|
||||
die("cannot open or create leases file: %s", NULL);
|
||||
|
||||
rewind(lease_file); /* file opened with mode a+ which sets pointer at end. */
|
||||
|
||||
while (fscanf(lease_file, "%lu %x:%x:%x:%x:%x:%x %d.%d.%d.%d %256s %500s",
|
||||
&ei, &e0, &e1, &e2, &e3, &e4, &e5, &a0, &a1, &a2, &a3, buff, buff2) == 13)
|
||||
/* a+ mode lease pointer at end. */
|
||||
rewind(daemon->lease_stream);
|
||||
|
||||
/* 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 %16s %255s %764s",
|
||||
&ei, daemon->dhcp_buff2, daemon->namebuff,
|
||||
daemon->dhcp_buff, daemon->packet) == 5)
|
||||
{
|
||||
/* strictly time_t is opaque, but this hack should work on all sane systems,
|
||||
even when sizeof(time_t) == 8 */
|
||||
expires = (time_t)ei;
|
||||
|
||||
if (ei != 0 && difftime(now, expires) > 0)
|
||||
{
|
||||
has_old = 1;
|
||||
continue; /* expired */
|
||||
}
|
||||
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;
|
||||
|
||||
hwaddr[0] = e0;
|
||||
hwaddr[1] = e1;
|
||||
hwaddr[2] = e2;
|
||||
hwaddr[3] = e3;
|
||||
hwaddr[4] = e4;
|
||||
hwaddr[5] = e5;
|
||||
|
||||
addr.s_addr = htonl((a0<<24) + (a1<<16) + (a2<<8) + a3);
|
||||
addr.s_addr = inet_addr(daemon->namebuff);
|
||||
|
||||
/* decode hex in place */
|
||||
if (strcmp(buff2, "*") == 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 = 0;
|
||||
if (strcmp(daemon->packet, "*") != 0)
|
||||
clid_len = parse_hex(daemon->packet, (unsigned char *)daemon->packet, 255, NULL, NULL);
|
||||
|
||||
if (!(lease = lease_allocate(buff2, clid_len, addr)))
|
||||
die ("cannot get memory", NULL);
|
||||
|
||||
lease->expires = expires;
|
||||
memcpy(lease->hwaddr, hwaddr, ETHER_ADDR_LEN);
|
||||
if (!(lease = lease_allocate(addr)))
|
||||
die (_("too many stored leases"), NULL);
|
||||
/* not actually new */
|
||||
lease->new = 0;
|
||||
|
||||
if (strcmp(buff, "*") != 0)
|
||||
lease_set_hostname(lease, buff, domain);
|
||||
#ifdef HAVE_BROKEN_RTC
|
||||
if (ei != 0)
|
||||
lease->expires = (time_t)ei + now;
|
||||
else
|
||||
lease->expires = (time_t)0;
|
||||
lease->length = ei;
|
||||
#else
|
||||
/* strictly time_t is opaque, but this hack should work on all sane systems,
|
||||
even when sizeof(time_t) == 8 */
|
||||
lease->expires = (time_t)ei;
|
||||
#endif
|
||||
|
||||
lease_set_hwaddr(lease, hwaddr, (unsigned char *)daemon->packet, hw_len, hw_type, clid_len);
|
||||
|
||||
if (strcmp(daemon->dhcp_buff, "*") != 0)
|
||||
lease_set_hostname(lease, daemon->dhcp_buff, daemon->domain_suffix, 0);
|
||||
}
|
||||
|
||||
|
||||
/* Some leases may have expired */
|
||||
file_dirty = 0;
|
||||
lease_prune(NULL, now);
|
||||
dns_dirty = 1;
|
||||
file_dirty = has_old;
|
||||
|
||||
/* Deal with edits to the config file which may have changed the hostname
|
||||
associated with a hardware address. Do this after the main loop so that
|
||||
changes get written back out */
|
||||
for (lease = leases; lease; lease = lease->next)
|
||||
if ((config = find_config(dhcp_configs, NULL, lease->clid, lease->clid_len, lease->hwaddr, NULL)) &&
|
||||
(config->hostname))
|
||||
lease_set_hostname(lease, config->hostname, domain);
|
||||
|
||||
return fileno(lease_file);
|
||||
}
|
||||
|
||||
void lease_update_dns(int force_dns)
|
||||
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(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 */
|
||||
}
|
||||
|
||||
static void ourprintf(struct daemon *daemon, int *errp, char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
if (!(*errp) && vfprintf(daemon->lease_stream, format, ap) < 0)
|
||||
*errp = errno;
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void lease_update_file(struct daemon *daemon, time_t now)
|
||||
{
|
||||
struct dhcp_lease *lease;
|
||||
int i;
|
||||
time_t next_event;
|
||||
int i, err = 0;
|
||||
|
||||
if (file_dirty)
|
||||
if (file_dirty != 0)
|
||||
{
|
||||
rewind(lease_file);
|
||||
ftruncate(fileno(lease_file), 0);
|
||||
errno = 0;
|
||||
rewind(daemon->lease_stream);
|
||||
if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0)
|
||||
err = errno;
|
||||
|
||||
for (lease = leases; lease; lease = lease->next)
|
||||
{
|
||||
fprintf(lease_file, "%lu %.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %s ",
|
||||
(unsigned long)lease->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 ? lease->hostname : "*");
|
||||
#ifdef HAVE_BROKEN_RTC
|
||||
ourprintf(daemon, &err, "%u ", lease->length);
|
||||
#else
|
||||
ourprintf(daemon, &err, "%lu ", (unsigned long)lease->expires);
|
||||
#endif
|
||||
if (lease->hwaddr_type != ARPHRD_ETHER || lease->hwaddr_len == 0)
|
||||
ourprintf(daemon, &err, "%.2x-", lease->hwaddr_type);
|
||||
for (i = 0; i < lease->hwaddr_len; i++)
|
||||
{
|
||||
ourprintf(daemon, &err, "%.2x", lease->hwaddr[i]);
|
||||
if (i != lease->hwaddr_len - 1)
|
||||
ourprintf(daemon, &err, ":");
|
||||
}
|
||||
ourprintf(daemon, &err, " %s %s ", inet_ntoa(lease->addr),
|
||||
lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : "*");
|
||||
|
||||
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]);
|
||||
ourprintf(daemon, &err, "%.2x:", lease->clid[i]);
|
||||
ourprintf(daemon, &err, "%.2x\n", lease->clid[i]);
|
||||
}
|
||||
else
|
||||
fprintf(lease_file, "*\n");
|
||||
|
||||
ourprintf(daemon, &err, "*\n");
|
||||
}
|
||||
|
||||
fflush(lease_file);
|
||||
fsync(fileno(lease_file));
|
||||
file_dirty = 0;
|
||||
|
||||
if (fflush(daemon->lease_stream) != 0 ||
|
||||
fsync(fileno(daemon->lease_stream)) < 0)
|
||||
err = errno;
|
||||
|
||||
if (!err)
|
||||
file_dirty = 0;
|
||||
}
|
||||
|
||||
/* Set alarm for when the first lease expires + slop. */
|
||||
for (next_event = 0, lease = leases; lease; lease = lease->next)
|
||||
if (lease->expires != 0 &&
|
||||
(next_event == 0 || difftime(next_event, lease->expires + 10) > 0.0))
|
||||
next_event = lease->expires + 10;
|
||||
|
||||
if (err)
|
||||
{
|
||||
if (next_event == 0 || difftime(next_event, LEASE_RETRY + now) > 0.0)
|
||||
next_event = LEASE_RETRY + now;
|
||||
|
||||
syslog(LOG_ERR, _("failed to write %s: %s (retry in %us)"),
|
||||
daemon->lease_file, strerror(err),
|
||||
(unsigned int)difftime(next_event, now));
|
||||
}
|
||||
|
||||
if (dns_dirty || force_dns)
|
||||
if (next_event != 0)
|
||||
alarm((unsigned)difftime(next_event, now));
|
||||
}
|
||||
|
||||
void lease_update_dns(struct daemon *daemon)
|
||||
{
|
||||
struct dhcp_lease *lease;
|
||||
|
||||
if (dns_dirty)
|
||||
{
|
||||
cache_unhash_dhcp();
|
||||
|
||||
|
||||
for (lease = leases; lease; lease = lease->next)
|
||||
{
|
||||
if (lease->fqdn)
|
||||
{
|
||||
cache_add_dhcp_entry(lease->fqdn, &lease->addr, lease->expires, F_REVERSE);
|
||||
cache_add_dhcp_entry(lease->hostname, &lease->addr, lease->expires, 0);
|
||||
}
|
||||
else if (lease->hostname)
|
||||
cache_add_dhcp_entry(lease->hostname, &lease->addr, lease->expires, F_REVERSE);
|
||||
cache_add_dhcp_entry(daemon, lease->fqdn, &lease->addr, lease->expires);
|
||||
cache_add_dhcp_entry(daemon, lease->hostname, &lease->addr, lease->expires);
|
||||
}
|
||||
|
||||
dns_dirty = 0;
|
||||
@@ -161,18 +209,17 @@ void lease_prune(struct dhcp_lease *target, time_t now)
|
||||
if ((lease->expires != 0 && difftime(now, lease->expires) > 0) || lease == target)
|
||||
{
|
||||
file_dirty = 1;
|
||||
|
||||
*up = lease->next; /* unlink */
|
||||
if (lease->hostname)
|
||||
{
|
||||
free(lease->hostname);
|
||||
dns_dirty = 1;
|
||||
}
|
||||
if (lease->fqdn)
|
||||
free(lease->fqdn);
|
||||
if (lease->clid)
|
||||
free(lease->clid);
|
||||
free(lease);
|
||||
dns_dirty = 1;
|
||||
|
||||
*up = lease->next; /* unlink */
|
||||
|
||||
/* Put on old_leases list 'till we
|
||||
can run the script */
|
||||
lease->next = old_leases;
|
||||
old_leases = lease;
|
||||
|
||||
leases_left++;
|
||||
}
|
||||
else
|
||||
up = &lease->next;
|
||||
@@ -180,27 +227,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)
|
||||
{
|
||||
/* zero length means clid from hwaddr: never match am option clid to
|
||||
a hardware-address derived clid */
|
||||
|
||||
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 (!lease->clid &&
|
||||
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;
|
||||
}
|
||||
@@ -217,75 +261,122 @@ 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(struct in_addr addr)
|
||||
{
|
||||
struct dhcp_lease *lease;
|
||||
if (!(lease = malloc(sizeof(struct dhcp_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;
|
||||
memset(lease, 0, sizeof(struct dhcp_lease));
|
||||
lease->new = 1;
|
||||
lease->addr = addr;
|
||||
memset(lease->hwaddr, 0, ETHER_ADDR_LEN);
|
||||
lease->hwaddr_len = 225; /* illegal value */
|
||||
lease->expires = 1;
|
||||
|
||||
#ifdef HAVE_BROKEN_RTC
|
||||
lease->length = 0xffffffff; /* illegal value */
|
||||
#endif
|
||||
lease->next = leases;
|
||||
leases = lease;
|
||||
|
||||
file_dirty = 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)
|
||||
void 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)
|
||||
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;
|
||||
lease->old = 1; /* run script on change */
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
else if (memcmp(lease->clid, clid, clid_len) != 0)
|
||||
file_dirty = 1;
|
||||
|
||||
lease->clid_len = clid_len;
|
||||
memcpy(lease->clid, clid, clid_len);
|
||||
}
|
||||
}
|
||||
|
||||
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 && strcmp(lease->hostname, name) == 0)
|
||||
return;
|
||||
|
||||
if (lease->hostname && name && hostname_isequal(lease->hostname, name))
|
||||
{
|
||||
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;
|
||||
lease_tmp->old = 1; /* call script on change */
|
||||
new_name = lease_tmp->hostname;
|
||||
lease_tmp->hostname = NULL;
|
||||
if (lease_tmp->fqdn)
|
||||
@@ -293,15 +384,14 @@ 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)
|
||||
|
||||
if (!new_name && (new_name = malloc(strlen(name) + 1)))
|
||||
strcpy(new_name, name);
|
||||
|
||||
if (suffix && !new_fqdn && (new_fqdn = malloc(strlen(name) + strlen(suffix) + 2)))
|
||||
{
|
||||
new_name = malloc(strlen(name) + 1);
|
||||
strcpy(new_name, name);
|
||||
}
|
||||
if (suffix && !new_fqdn)
|
||||
{
|
||||
new_fqdn = malloc(strlen(name) + strlen(suffix) + 2);
|
||||
strcpy(new_fqdn, name);
|
||||
strcat(new_fqdn, ".");
|
||||
strcat(new_fqdn, suffix);
|
||||
@@ -315,9 +405,85 @@ 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;
|
||||
lease->old = 1; /* run script on change */
|
||||
}
|
||||
|
||||
|
||||
#ifndef NO_FORK
|
||||
static pid_t run_script(struct daemon *daemon, char *action, struct dhcp_lease *lease)
|
||||
{
|
||||
if (daemon->lease_change_command)
|
||||
{
|
||||
char *mac = print_mac(daemon, lease->hwaddr, lease->hwaddr_len);
|
||||
char *addr = inet_ntoa(lease->addr);
|
||||
char *com = strrchr(daemon->lease_change_command, '/');
|
||||
pid_t pid = fork();
|
||||
|
||||
if (pid == -1)
|
||||
return 0; /* fork error */
|
||||
else if (pid != 0)
|
||||
return pid;
|
||||
|
||||
execl(daemon->lease_change_command,
|
||||
com ? com+1 : daemon->lease_change_command,
|
||||
action, mac, addr, lease->hostname, (char*)NULL);
|
||||
|
||||
/* log socket should still be open, right? */
|
||||
syslog(LOG_ERR, _("failed to execute %s: %m"),
|
||||
daemon->lease_change_command);
|
||||
_exit(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* deleted leases get transferred to the old_leases list.
|
||||
remove them here, after calling the lease change
|
||||
script. Also run the lease change script on new leases */
|
||||
void lease_collect(struct daemon *daemon)
|
||||
{
|
||||
struct dhcp_lease *lease;
|
||||
|
||||
while (old_leases)
|
||||
{
|
||||
if (daemon->script_pid != 0)
|
||||
return; /* busy */
|
||||
|
||||
lease = old_leases;
|
||||
old_leases = lease->next;
|
||||
|
||||
#ifndef NO_FORK
|
||||
daemon->script_pid = run_script(daemon, "del", lease);
|
||||
#endif
|
||||
|
||||
if (lease->hostname)
|
||||
free(lease->hostname);
|
||||
if (lease->fqdn)
|
||||
free(lease->fqdn);
|
||||
if (lease->clid)
|
||||
free(lease->clid);
|
||||
free(lease);
|
||||
}
|
||||
|
||||
for (lease = leases; lease; lease = lease->next)
|
||||
if (lease->new || lease->old)
|
||||
{
|
||||
if (daemon->script_pid != 0)
|
||||
return; /* busy */
|
||||
|
||||
#ifndef NO_FORK
|
||||
daemon->script_pid = run_script(daemon, lease->new ? "add" : "old", lease);
|
||||
#endif
|
||||
|
||||
lease->new = lease->old = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
245
src/netlink.c
Normal file
245
src/netlink.c
Normal file
@@ -0,0 +1,245 @@
|
||||
/* 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 netlink socket: %s"), NULL);
|
||||
else
|
||||
{
|
||||
int flags = fcntl(daemon->netlinkfd, F_GETFD);
|
||||
if (flags != -1)
|
||||
fcntl(daemon->netlinkfd, F_SETFD, flags | FD_CLOEXEC);
|
||||
}
|
||||
|
||||
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 | NLM_F_ACK;
|
||||
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, _("netlink 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());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
773
src/network.c
773
src/network.c
@@ -1,4 +1,4 @@
|
||||
/* dnsmasq is Copyright (c) 2000 - 2003 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,427 +10,351 @@
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/* Author's email: simon@thekelleys.org.uk */
|
||||
|
||||
#include "dnsmasq.h"
|
||||
|
||||
static char *add_iface(struct irec **list, unsigned int flags,
|
||||
char *name, union mysockaddr *addr,
|
||||
struct iname *names, struct iname *addrs,
|
||||
struct iname *except)
|
||||
int iface_check(struct daemon *daemon, int family, struct all_addr *addr, char *name)
|
||||
{
|
||||
struct irec *iface;
|
||||
int fd, opt;
|
||||
struct iname *tmp;
|
||||
|
||||
/* we may need to check the whitelist */
|
||||
if (names)
|
||||
{
|
||||
for (tmp = names; tmp; tmp = tmp->next)
|
||||
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)
|
||||
{
|
||||
tmp->found = 1;
|
||||
break;
|
||||
}
|
||||
if (!(flags & IFF_LOOPBACK) && !tmp)
|
||||
/* not on whitelist and not loopback */
|
||||
return NULL;
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
if (addrs)
|
||||
{
|
||||
for (tmp = addrs; tmp; tmp = tmp->next)
|
||||
if (sockaddr_isequal(&tmp->addr, addr))
|
||||
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 && (ifr.ifr_flags & IFF_LOOPBACK))
|
||||
{
|
||||
struct iname *lo;
|
||||
for (lo = daemon->if_names; lo; lo = lo->next)
|
||||
if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0)
|
||||
{
|
||||
tmp->found = 1;
|
||||
lo->isloop = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!tmp)
|
||||
/* not on whitelist */
|
||||
return NULL;
|
||||
if (!lo && (lo = malloc(sizeof(struct iname))))
|
||||
{
|
||||
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 (except)
|
||||
for (tmp = except; tmp; tmp = tmp->next)
|
||||
if (tmp->name && strcmp(tmp->name, name) == 0)
|
||||
return NULL;
|
||||
if (addr->sa.sa_family == AF_INET &&
|
||||
!iface_check(daemon, AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name))
|
||||
return 1;
|
||||
|
||||
/* check whether the interface IP has been added already
|
||||
it is possible to have multiple interfaces with the same address
|
||||
and we may be re-scanning. */
|
||||
for (iface = *list; iface; iface = iface->next)
|
||||
if (sockaddr_isequal(&iface->addr, addr))
|
||||
break;
|
||||
if (iface)
|
||||
#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->valid = 1;
|
||||
return NULL;
|
||||
iface->addr = *addr;
|
||||
iface->netmask = netmask;
|
||||
iface->next = *irecp;
|
||||
*irecp = iface;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((fd = socket(addr->sa.sa_family, SOCK_DGRAM, 0)) == -1)
|
||||
return "failed to create socket: %s";
|
||||
|
||||
/* Set SO_REUSEADDR on the socket, this allows is to bind
|
||||
specific addresses even if BIND is running and has bound *:53 */
|
||||
opt = 1;
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
|
||||
bind(fd, &addr->sa, sa_len(addr)) == -1)
|
||||
{
|
||||
int errsave = errno;
|
||||
close(fd);
|
||||
errno = errsave;
|
||||
/* IPv6 interfaces sometimes return ENODEV to bind() for unknown
|
||||
(to me) reasons. Don't treat that as fatal. */
|
||||
return errno == ENODEV ? NULL : "failed to bind socket: %s";
|
||||
}
|
||||
|
||||
/* If OK, add it to the head of the list */
|
||||
if (!(iface = malloc(sizeof(struct irec))))
|
||||
{
|
||||
close(fd);
|
||||
return "cannot allocate interface";
|
||||
}
|
||||
|
||||
iface->fd = fd;
|
||||
iface->addr = *addr;
|
||||
iface->next = *list;
|
||||
iface->valid = 1;
|
||||
*list = iface;
|
||||
|
||||
return NULL;
|
||||
|
||||
errno = ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get all interfaces in system and for each one allowed add it to the chain
|
||||
at interfacep. May be called more that once: interfaces which still exist
|
||||
are left on the chain, those which have gone have sockets close()ed an are
|
||||
unlinked. Return value is NULL if OK, an error string and the value of errno
|
||||
on error. */
|
||||
char *enumerate_interfaces(struct irec **interfacep,
|
||||
struct iname *names,
|
||||
struct iname *addrs,
|
||||
struct iname *except,
|
||||
struct dhcp_context *dhcp,
|
||||
int port)
|
||||
#ifdef HAVE_IPV6
|
||||
static int iface_allowed_v6(struct daemon *daemon, struct in6_addr *local,
|
||||
int scope, int if_index, void *vparam)
|
||||
{
|
||||
/* this code is adapted from Stevens, page 434. It finally
|
||||
destroyed my faith in the C/unix API */
|
||||
int len = 100 * sizeof(struct ifreq);
|
||||
int errsave, lastlen = 0;
|
||||
struct irec *iface, *prev;
|
||||
char *buf, *ptr, *err = NULL;
|
||||
struct ifconf ifc;
|
||||
struct ifreq *ifr = NULL;
|
||||
int fd = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
int rawfd = -1;
|
||||
union mysockaddr addr;
|
||||
struct in_addr netmask; /* dummy */
|
||||
|
||||
if (fd == -1)
|
||||
return "cannot create socket to enumerate interfaces: %s";
|
||||
netmask.s_addr = 0;
|
||||
|
||||
/* make all interfaces as old. Any left that way after the scan are reaped. */
|
||||
for (iface = *interfacep; iface; iface = iface->next)
|
||||
iface->valid = 0;
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
addr.in6.sin6_len = sizeof(addr.in6);
|
||||
#endif
|
||||
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;
|
||||
|
||||
while (1)
|
||||
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
|
||||
}
|
||||
|
||||
/* set NONBLOCK and CLOEXEC bits on fd: See Stevens 16.6 */
|
||||
int fix_fd(int fd)
|
||||
{
|
||||
int flags;
|
||||
|
||||
if ((flags = fcntl(fd, F_GETFL)) == -1 ||
|
||||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
|
||||
(flags = fcntl(fd, F_GETFD)) == -1 ||
|
||||
fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if defined(HAVE_IPV6)
|
||||
static int create_ipv6_listener(struct listener **link, int port)
|
||||
{
|
||||
union mysockaddr addr;
|
||||
int tcpfd, fd;
|
||||
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 = 0;
|
||||
addr.in6.sin6_scope_id = 0;
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
addr.in6.sin6_len = sizeof(addr.in6);
|
||||
#endif
|
||||
|
||||
/* No error of the kernel doesn't support IPv6 */
|
||||
if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) == -1)
|
||||
return (errno == EPROTONOSUPPORT ||
|
||||
errno == EAFNOSUPPORT ||
|
||||
errno == EINVAL);
|
||||
|
||||
if ((tcpfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
|
||||
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 ||
|
||||
setsockopt(tcpfd, IPV6_LEVEL, IPV6_V6ONLY, &opt, sizeof(opt)) == -1 ||
|
||||
!fix_fd(fd) ||
|
||||
!fix_fd(tcpfd) ||
|
||||
#ifdef IPV6_RECVPKTINFO
|
||||
setsockopt(fd, IPV6_LEVEL, IPV6_RECVPKTINFO, &opt, sizeof(opt)) == -1 ||
|
||||
#else
|
||||
setsockopt(fd, IPV6_LEVEL, IPV6_PKTINFO, &opt, sizeof(opt)) == -1 ||
|
||||
#endif
|
||||
bind(tcpfd, (struct sockaddr *)&addr, sa_len(&addr)) == -1 ||
|
||||
listen(tcpfd, 5) == -1 ||
|
||||
bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1)
|
||||
return 0;
|
||||
|
||||
l = safe_malloc(sizeof(struct listener));
|
||||
l->fd = fd;
|
||||
l->tcpfd = tcpfd;
|
||||
l->family = AF_INET6;
|
||||
l->next = NULL;
|
||||
*link = l;
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct listener *create_wildcard_listeners(int port)
|
||||
{
|
||||
union mysockaddr addr;
|
||||
int opt = 1;
|
||||
struct listener *l, *l6 = NULL;
|
||||
int tcpfd, fd;
|
||||
|
||||
addr.in.sin_family = AF_INET;
|
||||
addr.in.sin_addr.s_addr = INADDR_ANY;
|
||||
addr.in.sin_port = htons(port);
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
addr.in.sin_len = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ||
|
||||
(tcpfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
|
||||
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 ||
|
||||
!fix_fd(tcpfd) ||
|
||||
#ifdef HAVE_IPV6
|
||||
!create_ipv6_listener(&l6, port) ||
|
||||
#endif
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
|
||||
!fix_fd(fd) ||
|
||||
#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)
|
||||
return NULL;
|
||||
|
||||
l = safe_malloc(sizeof(struct listener));
|
||||
l->family = AF_INET;
|
||||
l->fd = fd;
|
||||
l->tcpfd = tcpfd;
|
||||
l->next = l6;
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
struct listener *create_bound_listeners(struct daemon *daemon)
|
||||
{
|
||||
|
||||
struct listener *listeners = NULL;
|
||||
struct irec *iface;
|
||||
int opt = 1;
|
||||
|
||||
for (iface = daemon->interfaces; iface; iface = iface->next)
|
||||
{
|
||||
if (!(buf = malloc(len)))
|
||||
struct listener *new = safe_malloc(sizeof(struct listener));
|
||||
new->family = iface->addr.sa.sa_family;
|
||||
new->iface = iface;
|
||||
new->next = listeners;
|
||||
if ((new->tcpfd = socket(iface->addr.sa.sa_family, SOCK_STREAM, 0)) == -1 ||
|
||||
(new->fd = socket(iface->addr.sa.sa_family, SOCK_DGRAM, 0)) == -1 ||
|
||||
setsockopt(new->fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
|
||||
setsockopt(new->tcpfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
|
||||
!fix_fd(new->tcpfd) ||
|
||||
!fix_fd(new->fd))
|
||||
die(_("failed to create listening socket: %s"), NULL);
|
||||
|
||||
#ifdef HAVE_IPV6
|
||||
if (iface->addr.sa.sa_family == AF_INET6)
|
||||
{
|
||||
err = "cannot allocate buffer";
|
||||
goto end;
|
||||
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);
|
||||
}
|
||||
ifc.ifc_len = len;
|
||||
ifc.ifc_buf = buf;
|
||||
if (ioctl(fd, SIOCGIFCONF, &ifc) < 0)
|
||||
#endif
|
||||
|
||||
if (bind(new->tcpfd, &iface->addr.sa, sa_len(&iface->addr)) == -1 ||
|
||||
bind(new->fd, &iface->addr.sa, sa_len(&iface->addr)) == -1)
|
||||
{
|
||||
if (errno != EINVAL || lastlen != 0)
|
||||
#ifdef HAVE_IPV6
|
||||
if (iface->addr.sa.sa_family == AF_INET6 && errno == ENODEV)
|
||||
{
|
||||
err = "ioctl error while enumerating interfaces: %s";
|
||||
goto end;
|
||||
close(new->tcpfd);
|
||||
close(new->fd);
|
||||
free(new);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
prettyprint_addr(&iface->addr, daemon->namebuff);
|
||||
die(_("failed to bind listening socket for %s: %s"),
|
||||
daemon->namebuff);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ifc.ifc_len == lastlen)
|
||||
break; /* got a big enough buffer now */
|
||||
lastlen = ifc.ifc_len;
|
||||
}
|
||||
len += 10*sizeof(struct ifreq);
|
||||
free(buf);
|
||||
{
|
||||
listeners = new;
|
||||
if (listen(new->tcpfd, 5) == -1)
|
||||
die(_("failed to listen on socket: %s"), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
for (ptr = buf; ptr < buf + ifc.ifc_len; )
|
||||
{
|
||||
union mysockaddr addr;
|
||||
#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)))
|
||||
{
|
||||
err = "cannot allocate buffer";
|
||||
goto end;
|
||||
}
|
||||
|
||||
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(port);
|
||||
}
|
||||
#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(port);
|
||||
addr.in6.sin6_flowinfo = htonl(0);
|
||||
}
|
||||
#endif
|
||||
else
|
||||
continue; /* unknown address family */
|
||||
|
||||
if (ioctl(fd, SIOCGIFFLAGS, ifr) < 0)
|
||||
{
|
||||
err = "ioctl error getting interface flags: %m";
|
||||
goto end;
|
||||
}
|
||||
|
||||
if ((err = add_iface(interfacep, ifr->ifr_flags, ifr->ifr_name,
|
||||
&addr, names, addrs, except)))
|
||||
goto end;
|
||||
|
||||
#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. */
|
||||
{
|
||||
FILE *f = fopen(IP6INTERFACES, "r");
|
||||
int found = 0;
|
||||
union mysockaddr addr6;
|
||||
|
||||
if (f)
|
||||
{
|
||||
unsigned int plen, scope, flags, if_idx;
|
||||
char devname[20], addrstring[32];
|
||||
|
||||
while (fscanf(f, "%32s %02x %02x %02x %02x %20s\n",
|
||||
addrstring, &if_idx, &plen, &scope, &flags, devname) != EOF)
|
||||
{
|
||||
if (strcmp(devname, ifr->ifr_name) == 0)
|
||||
{
|
||||
int i;
|
||||
unsigned char *addr6p = (unsigned char *) &addr6.in6.sin6_addr;
|
||||
memset(&addr6, 0, sizeof(addr6));
|
||||
addr6.sa.sa_family = AF_INET6;
|
||||
for (i=0; i<16; i++)
|
||||
{
|
||||
unsigned int byte;
|
||||
sscanf(addrstring+i+i, "%02x", &byte);
|
||||
addr6p[i] = byte;
|
||||
}
|
||||
addr6.in6.sin6_port = htons(port);
|
||||
addr6.in6.sin6_flowinfo = htonl(0);
|
||||
addr6.in6.sin6_scope_id = htonl(scope);
|
||||
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
if (found &&
|
||||
(err = add_iface(interfacep, ifr->ifr_flags, ifr->ifr_name,
|
||||
&addr6, names, addrs, except)))
|
||||
goto end;
|
||||
}
|
||||
|
||||
#endif /* LINUX */
|
||||
|
||||
/* dhcp is non-null only on the first call: set up the relevant
|
||||
interface-related DHCP stuff here. DHCP is IPv4 only.
|
||||
Because errors here are ultimately fatal we can return directly and not bother
|
||||
closing the descriptor.
|
||||
*/
|
||||
if (dhcp && addr.sa.sa_family == AF_INET &&
|
||||
!(ifr->ifr_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)))
|
||||
{
|
||||
struct in_addr netmask, broadcast;
|
||||
struct dhcp_context *context;
|
||||
int opt = 1;
|
||||
|
||||
if (ioctl(fd, SIOCGIFNETMASK, ifr) < 0)
|
||||
return "ioctl error getting interface netmask: %s";
|
||||
|
||||
netmask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
|
||||
|
||||
if (ioctl(fd, SIOCGIFBRDADDR, ifr) < 0)
|
||||
return "ioctl error getting interface broadcast address: %s";
|
||||
|
||||
broadcast = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
|
||||
|
||||
for (context = dhcp; context; context = context->next)
|
||||
if (!context->iface && /* may be more than one iface with same addr */
|
||||
((addr.in.sin_addr.s_addr & netmask.s_addr) == (context->start.s_addr & netmask.s_addr)) &&
|
||||
((addr.in.sin_addr.s_addr & netmask.s_addr) == (context->end.s_addr & netmask.s_addr)))
|
||||
{
|
||||
struct sockaddr_in saddr;
|
||||
#ifdef HAVE_BPF
|
||||
char filename[50];
|
||||
int b = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
sprintf(filename, "/dev/bpf%d", b);
|
||||
if ((rawfd = open(filename, O_RDWR, 0)) == -1)
|
||||
{
|
||||
if (errno != EBUSY)
|
||||
return"Cannot create DHCP BPF socket: %s";
|
||||
b++;
|
||||
}
|
||||
else if (ioctl(rawfd, BIOCSETIF, ifr) < 0)
|
||||
return "Can't attach interface to BPF device: %s";
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (context->next)
|
||||
return "no support for DHCP on multiple networks under this OS";
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PF_PACKET
|
||||
if (rawfd == -1 && /* same packet socket for all interfaces */
|
||||
(rawfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETHERTYPE_IP))) == -1)
|
||||
return "Cannot create DHCP packet socket: %s";
|
||||
|
||||
/* do this last so that the index is still in ifr for the
|
||||
call to setsockopt(SO_BINDTODEVICE) */
|
||||
if (ioctl(fd, SIOCGIFINDEX, ifr) < 0)
|
||||
return "ioctl error getting interface index: %m";
|
||||
context->ifindex = ifr->ifr_ifindex;
|
||||
#endif
|
||||
|
||||
context->rawfd = rawfd;
|
||||
context->serv_addr = addr.in.sin_addr;
|
||||
context->netmask = netmask;
|
||||
context->broadcast = broadcast;
|
||||
if (!(context->iface = malloc(strlen(ifr->ifr_name) + 1)))
|
||||
return "cannot allocate interface name";
|
||||
|
||||
strcpy(context->iface, ifr->ifr_name);
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_port = htons(DHCP_SERVER_PORT);
|
||||
saddr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
if ((context->fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
|
||||
return "cannot create DHCP server socket: %s";
|
||||
|
||||
if (setsockopt(context->fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
|
||||
#ifdef HAVE_PF_PACKET
|
||||
setsockopt(context->fd, SOL_SOCKET, SO_BINDTODEVICE, ifr, sizeof(*ifr)) == -1 ||
|
||||
#endif
|
||||
setsockopt(context->fd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) == -1)
|
||||
return "failed to set options on DHCP socket: %s";
|
||||
|
||||
if (bind(context->fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)))
|
||||
return "failed to bind DHCP server socket: %s";
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_BPF
|
||||
/* now go through the interfaces again, looking for AF_LINK records
|
||||
to get hardware addresses from */
|
||||
for (ptr = buf; ptr < buf + ifc.ifc_len; )
|
||||
{
|
||||
struct dhcp_context *context;
|
||||
|
||||
#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)))
|
||||
{
|
||||
err = "cannot allocate buffer";
|
||||
goto end;
|
||||
}
|
||||
|
||||
memcpy(ifr, ptr, ifr_len);
|
||||
ptr += ifr_len;
|
||||
#else
|
||||
ifr = (struct ifreq *)ptr;
|
||||
ptr += sizeof(struct ifreq);
|
||||
#endif
|
||||
|
||||
if (ifr->ifr_addr.sa_family == AF_LINK)
|
||||
for (context = dhcp; context; context = context->next)
|
||||
if (context->iface && strcmp(context->iface, ifr->ifr_name) == 0)
|
||||
memcpy(context->hwaddr, LLADDR((struct sockaddr_dl *)&ifr->ifr_addr), ETHER_ADDR_LEN);
|
||||
}
|
||||
#endif
|
||||
|
||||
end:
|
||||
errsave = errno; /* since errno gets overwritten by close */
|
||||
if (buf)
|
||||
free(buf);
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
if (ifr)
|
||||
free(ifr);
|
||||
#endif
|
||||
close(fd);
|
||||
if (err)
|
||||
{
|
||||
errno = errsave;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* now remove interfaces which were not found on this scan */
|
||||
for(prev = NULL, iface = *interfacep; iface; )
|
||||
{
|
||||
if (iface->valid)
|
||||
{
|
||||
prev = iface;
|
||||
iface = iface->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct irec *tmp = iface;
|
||||
close(iface->fd);
|
||||
/* remove pending queries from this interface */
|
||||
reap_forward(iface->fd);
|
||||
/* unlink */
|
||||
if (prev)
|
||||
prev->next = iface->next;
|
||||
else
|
||||
*interfacep = iface->next;
|
||||
iface = iface->next;
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL; /* no error */
|
||||
return listeners;
|
||||
}
|
||||
|
||||
static struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **sfds)
|
||||
struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **sfds)
|
||||
{
|
||||
struct serverfd *sfd;
|
||||
|
||||
|
||||
/* may have a suitable one already */
|
||||
for (sfd = *sfds; sfd; sfd = sfd->next )
|
||||
if (sockaddr_isequal(&sfd->source_addr, addr))
|
||||
@@ -447,7 +371,8 @@ static struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **s
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (bind(sfd->fd, (struct sockaddr *)addr, sa_len(addr)) == -1)
|
||||
if (bind(sfd->fd, (struct sockaddr *)addr, sa_len(addr)) == -1 ||
|
||||
!fix_fd(sfd->fd))
|
||||
{
|
||||
int errsave = errno; /* save error from bind. */
|
||||
close(sfd->fd);
|
||||
@@ -463,52 +388,40 @@ static struct serverfd *allocate_sfd(union mysockaddr *addr, struct serverfd **s
|
||||
return sfd;
|
||||
}
|
||||
|
||||
struct server *check_servers(struct server *new, struct irec *interfaces, struct serverfd **sfds)
|
||||
void check_servers(struct daemon *daemon)
|
||||
{
|
||||
char addrbuff[ADDRSTRLEN];
|
||||
struct irec *iface;
|
||||
struct server *tmp, *ret = NULL;
|
||||
struct server *new, *tmp, *ret = NULL;
|
||||
int port = 0;
|
||||
|
||||
/* forward table rules reference servers, so have to blow them away */
|
||||
forward_init(0);
|
||||
|
||||
for (;new; new = tmp)
|
||||
daemon->last_server = daemon->srv_save = NULL;
|
||||
|
||||
for (new = daemon->servers; new; new = tmp)
|
||||
{
|
||||
tmp = new->next;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* Do we need a socket set? */
|
||||
if (!new->sfd && !(new->sfd = allocate_sfd(&new->source_addr, sfds)))
|
||||
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;
|
||||
}
|
||||
@@ -522,28 +435,29 @@ struct server *check_servers(struct server *new, struct irec *interfaces, struct
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
return ret;
|
||||
daemon->servers = ret;
|
||||
}
|
||||
|
||||
struct server *reload_servers(char *fname, char *buff, struct server *serv, int query_port)
|
||||
void reload_servers(char *fname, struct daemon *daemon)
|
||||
{
|
||||
FILE *f;
|
||||
char *line;
|
||||
struct server *old_servers = NULL;
|
||||
struct server *new_servers = NULL;
|
||||
struct server *serv = daemon->servers;
|
||||
|
||||
/* move old servers to free list - we can reuse the memory
|
||||
and not risk malloc if there are the same or fewer new servers.
|
||||
@@ -568,12 +482,12 @@ struct server *reload_servers(char *fname, char *buff, struct server *serv, int
|
||||
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);
|
||||
while ((line = fgets(buff, MAXDNAME, f)))
|
||||
syslog(LOG_INFO, _("reading %s"), fname);
|
||||
while ((line = fgets(daemon->namebuff, MAXDNAME, f)))
|
||||
{
|
||||
union mysockaddr addr, source_addr;
|
||||
char *token = strtok(line, " \t\n\r");
|
||||
@@ -581,34 +495,35 @@ struct server *reload_servers(char *fname, char *buff, struct server *serv, int
|
||||
|
||||
if (!token || strcmp(token, "nameserver") != 0)
|
||||
continue;
|
||||
if (!(token = strtok(NULL, " \t\n")))
|
||||
if (!(token = strtok(NULL, " \t\n\r")))
|
||||
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);
|
||||
source_addr.in.sin_addr.s_addr = INADDR_ANY;
|
||||
source_addr.in.sin_port = htons(query_port);
|
||||
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_addr= in6addr_any;
|
||||
source_addr.in6.sin6_port = htons(query_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);
|
||||
}
|
||||
#endif /* IPV6 */
|
||||
else
|
||||
@@ -644,7 +559,7 @@ struct server *reload_servers(char *fname, char *buff, struct server *serv, int
|
||||
old_servers = tmp;
|
||||
}
|
||||
|
||||
return new_servers;
|
||||
daemon->servers = new_servers;
|
||||
}
|
||||
|
||||
|
||||
|
||||
1792
src/option.c
1792
src/option.c
File diff suppressed because it is too large
Load Diff
1362
src/rfc1035.c
1362
src/rfc1035.c
File diff suppressed because it is too large
Load Diff
1386
src/rfc2131.c
1386
src/rfc2131.c
File diff suppressed because it is too large
Load Diff
273
src/util.c
273
src/util.c
@@ -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
|
||||
@@ -11,10 +11,14 @@
|
||||
*/
|
||||
|
||||
|
||||
/* Code in this file contributed by Rob Funk. */
|
||||
/* Some code in this file contributed by Rob Funk. */
|
||||
|
||||
#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
|
||||
@@ -61,17 +65,15 @@ unsigned short rand16(void)
|
||||
else
|
||||
{
|
||||
s = (char *) &seed;
|
||||
while ( (c < sizeof(seed)) &&
|
||||
((n = read(fd, sbuf, sizeof(seed)) > 0)) )
|
||||
while ((c < sizeof(seed)) &&
|
||||
((n = read(fd, sbuf, sizeof(seed)) > 0)))
|
||||
{
|
||||
memcpy(s, sbuf, n);
|
||||
s += n;
|
||||
c += n;
|
||||
}
|
||||
if (n < 0)
|
||||
{
|
||||
seed = badseed;
|
||||
}
|
||||
seed = badseed;
|
||||
close(fd);
|
||||
}
|
||||
|
||||
@@ -102,45 +104,58 @@ int legal_char(char c)
|
||||
|
||||
int canonicalise(char *s)
|
||||
{
|
||||
/* check for legal chars ans remove trailing . */
|
||||
int l = strlen(s);
|
||||
/* check for legal chars and remove trailing .
|
||||
also fail empty string and label > 63 chars */
|
||||
size_t dotgap = 0, l = strlen(s);
|
||||
char c;
|
||||
|
||||
if (l>0 && s[l-1] == '.')
|
||||
s[l-1] = 0;
|
||||
if (l == 0 || l > MAXDNAME) return 0;
|
||||
|
||||
while ((c = *s++))
|
||||
if (c != '.' && !legal_char(c))
|
||||
return 0;
|
||||
if (s[l-1] == '.')
|
||||
{
|
||||
if (l == 1) return 0;
|
||||
s[l-1] = 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);
|
||||
|
||||
@@ -154,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);
|
||||
}
|
||||
|
||||
@@ -167,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
|
||||
}
|
||||
@@ -195,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';
|
||||
@@ -215,3 +237,176 @@ int hostname_isequal(unsigned char *a, unsigned char *b)
|
||||
return 1;
|
||||
}
|
||||
|
||||
time_t dnsmasq_time(void)
|
||||
{
|
||||
#ifdef HAVE_BROKEN_RTC
|
||||
struct tms dummy;
|
||||
static long tps = 0;
|
||||
|
||||
if (tps == 0)
|
||||
tps = sysconf(_SC_CLK_TCK);
|
||||
|
||||
return (time_t)(times(&dummy)/tps);
|
||||
#else
|
||||
return time(NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask)
|
||||
{
|
||||
return (a.s_addr & mask.s_addr) == (b.s_addr & mask.s_addr);
|
||||
}
|
||||
|
||||
int retry_send(void)
|
||||
{
|
||||
struct timespec waiter;
|
||||
if (errno == EAGAIN)
|
||||
{
|
||||
waiter.tv_sec = 0;
|
||||
waiter.tv_nsec = 10000;
|
||||
nanosleep(&waiter, NULL);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (errno == EINTR)
|
||||
return 1;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
char *print_mac(struct daemon *daemon, unsigned char *mac, int len)
|
||||
{
|
||||
char *p = daemon->namebuff;
|
||||
int i;
|
||||
|
||||
if (len == 0)
|
||||
sprintf(p, "<null>");
|
||||
else
|
||||
for (i = 0; i < len; i++)
|
||||
p += sprintf(p, "%.2x%s", mac[i], (i == len - 1) ? "" : ":");
|
||||
|
||||
return daemon->namebuff;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user