Commit 5e9e0efb authored by Simon Kelley's avatar Simon Kelley

import of dnsmasq-2.28.tar.gz

parent cdeda28f
......@@ -1694,3 +1694,94 @@ version 2.27
Generalised the DHCP code to cope with any hardware
address type, at least on Linux. *BSD is still limited to
ethernet only.
version 2.28
Eliminated all raw network access when running on
Linux. All DHCP network activity now goes through the IP
stack. Packet sockets are no longer required. Apart from
being a neat hack, this should also allow DHCP over IPsec
to work better. On *BSD and OS X, the old method of raw net
access through BPF is retained.
Simplified build options. Networking is now slimmed down
to a choice of "linux" or "other". Netlink is always used
under Linux. Since netlink has been available since 2.2
and non-optional in an IPv4-configured kernel since 2.4,
and the dnsmasq netlink code is now well tested, this
should work out fine.
Removed decayed build support for libc5 and Solaris.
Removed pselect code: use a pipe for race-free signal
handling instead, as this works everywhere.
No longer enable the ISC leasefile reading code in the
distributed sources. I doubt there are many people left
using this 1.x compatibility code. Those that are will
have to explicitly enable it in src/config.h.
Don't send the "DHCP maximum message size" option, even if
requested. RFC2131 says this is a "MUST NOT".
Support larger-than-minimum DHCP message. Dnsmasq is now
happy to get larger than 576-byte DHCP messages, and will
return large messages, if permitted by the "maximum
message size" option of the message to which it is
replying. There's now an arbitrary sanity limit of 16384
bytes.
Added --no-ping option. This fixes an RFC2131 "SHOULD".
Building on the 2.27 MAC-address changes, allow clients to
provide no MAC address at all, relying on the client-id as
a unique identifier. This should make things like DHCP for
USB come easier.
Fixed regression in netlink code under 2.2.x kernels which
occurred in 2.27. Erik Jan Tromp is the vintage kernel fan
who found this. P.S. It looks like this "netlink bind:
permission denied" problem occured in kernels at least as
late a 2.4.18. Good information from Alain Richoux.
Added a warning when it's impossible to give a host its
configured address because the address is leased
elsewhere. A sensible suggestion from Mircea Bardac.
Added minimal support for RFC 3046 DHCP relay agent-id
options. The DHCP server now echoes these back to the
relay, as required by the RFC. Also, RFC 3527 link selection
sub-options are honoured.
Set the process "dumpable" flag when running in debug
mode: this makes getting core dumps from root processes
much easier.
Fixed one-byte buffer overflow which seems to only cause
problems when dnsmasq is linked with uclibc. Thanks to
Eric House and Eric Spakman for help in chasing this down.
Tolerate configuration screwups which lead to the DHCP
server attemping to allocate its own address to a
client; eg setting the whole subnet range as a DHCP
range. Addresses in use by the server are now excluded
from use by clients.
Did some thinking about HAVE_BROKEN_RTC mode, and made it
much simpler and better. The key is to just keep lease
lengths in the lease file. Since these normally never
change, even as the lease is renewed, the lease file never
needs to change except when machines arrive on the network
or leave. This eliminates the code for timed writes, and
reduces the amount of wear on a flash filesystem to the
absolute minimum. Also re-did the basic time function in
this mode to use the portable times(), rather than parsing
/proc/uptime.
Believe the source port number when replying to unicast
DHCP requests and DHCP requests via a relay, instead of always
using the standard ports. This will allow relays on
non-standard ports and DHCPINFORM from unprivileged ports
to work. The source port sent by unconfigured clients is still
ignored, since this may be unreliable. This means that a DHCP
client must use the standard port to do full configuration.
......@@ -369,6 +369,12 @@ A: Yes, dynmaically allocated IP addresses are checked by sending an
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
......
# Uncomment this on Solaris.
#LIBS = -lsocket -lnsl
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
dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o
.c.o:
$(CC) $(CFLAGS) $(I18N) `../bld/pkg-wrapper $(PKG_CONFIG) --cflags dbus-1` $(RPM_OPT_FLAGS) -Wall -W -c $<
......
......@@ -5,7 +5,7 @@
###############################################################################
Name: dnsmasq
Version: 2.27
Version: 2.28
Release: 1
License: GPL
Group: System Environment/Daemons
......
......@@ -5,7 +5,7 @@
###############################################################################
Name: dnsmasq
Version: 2.27
Version: 2.28
Release: 1
Copyright: GPL
Group: Productivity/Networking/DNS/Servers
......
......@@ -525,6 +525,13 @@ 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
......
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -15,37 +15,37 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr ""
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, c-format
msgid "bad address at %s line %d"
msgstr ""
# @Simon: Here I need an example to understand it :)
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr ""
# @Simon: Here I need an example to understand it :)
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, 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:670
#: 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:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -56,9 +56,11 @@ msgstr ""
# @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:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: 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."
......@@ -68,7 +70,7 @@ msgstr ""
# @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:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "Speicher nicht verfügbar"
......@@ -77,7 +79,7 @@ msgstr "Speicher nicht verfügbar"
# @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:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s in Zeile %d von %%s"
......@@ -85,12 +87,12 @@ 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:179
#: util.c:183
msgid "FAILED to start up"
msgstr "Start gescheitert"
# @Simon: not perfect but I cannot get nearer right now.
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "unendlich"
......@@ -360,6 +362,10 @@ msgstr ""
msgid "Map MAC address (with wildcards) to option set."
msgstr ""
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr ""
......@@ -441,468 +447,481 @@ msgstr ""
msgid "bad MX target"
msgstr ""
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr ""
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr ""
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr ""
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr ""
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr ""
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr ""
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr ""
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr ""
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr ""
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr ""
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr ""
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr ""
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr ""
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr ""
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr ""
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr ""
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr ""
#: option.c:1882
#: option.c:1878
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr ""
#: option.c:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr ""
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr ""
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr ""
#: forward.c:914
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
#: isc.c:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr ""
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr ""
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr ""
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr ""
#: isc.c:175
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
#: network.c:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr ""
#: network.c:425
#: network.c:347
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr ""
#: network.c:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr ""
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr ""
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr ""
#: network.c:530
#: network.c:452
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr ""
#: network.c:544
#: network.c:466
msgid "domain"
msgstr ""
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr ""
#: network.c:546
#: network.c:468
msgid "domains"
msgstr ""
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
#: dnsmasq.c:115
#: dnsmasq.c:93
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
#: dnsmasq.c:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr ""
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr ""
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr ""
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr ""
#: dnsmasq.c:163
#: dnsmasq.c:141
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
#: dnsmasq.c:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr ""
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr ""
#: dnsmasq.c:292
#: dnsmasq.c:192
#, c-format
msgid "cannot create pipe: %s"
msgstr ""
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr ""
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr ""
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr ""
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr ""
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr ""
#: dnsmasq.c:331
#: dnsmasq.c:358
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
#: dnsmasq.c:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr ""
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr ""
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr ""
#: dnsmasq.c:522
msgid "connected to system DBus"
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr ""
#: dnsmasq.c:533
msgid "exiting on receipt of SIGTERM"
#: dnsmasq.c:524
msgid "connected to system DBus"
msgstr ""
#: dhcp.c:25
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr ""
#: dhcp.c:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr ""
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr ""
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr ""
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr ""
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: dhcp.c:86
#, c-format
msgid ""
"cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
"kernel?"
msgstr ""
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr ""
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr ""
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr ""
#: dhcp.c:741
#: dhcp.c:641
#, c-format
msgid "bad line at %s line %d"
msgstr ""
#: dhcp.c:845
#: dhcp.c:745
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr ""
#: dhcp.c:881
#: dhcp.c:781
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
#: lease.c:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr ""
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr ""
#: lease.c:179
msgid "failed to write"
#: lease.c:118
#, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr ""
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr ""
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr ""
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr ""
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr ""
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr ""
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr ""
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr ""
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr ""
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr ""
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr ""
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr ""
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr ""
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr ""
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr ""
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr ""
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr ""
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr ""
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr ""
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
msgid "cannot create RTnetlink socket: %s"
msgstr ""
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr ""
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: bpf.c:74
#, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -15,31 +15,31 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "no se pudo cargar nombres desde %s: %m"
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "nombre errneo en %s lnea %d"
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr "nombre errneo en %s lnea %d"
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr "direccines %s - %d ledas"
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr "el cach fue limpiado"
#: cache.c:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -48,27 +48,29 @@ msgstr ""
"no otorgando nombre %s al arriendo DHCP de %s porque el nombre existe en %s "
"con direccin %s"
#: cache.c:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"tamao de cach %d, %d/%d insercines de cach reutilizaron entradas no "
"vencidas."
#: util.c:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "no se pudo conseguir memoria"
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s en lnea %d de %%s"
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr "el intento de inicio ha FALLADO"
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "infinito"
......@@ -326,6 +328,10 @@ msgstr "Habilitar alocaci
msgid "Map MAC address (with wildcards) to option set."
msgstr "Trazar clase de vendedor DHCP a opcin fijada."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "falta \""
......@@ -411,477 +417,500 @@ msgstr "nombre MX err
msgid "bad MX target"
msgstr "destino MX errneo"
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr "puerto errneo"
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr "dhcp-range (rango DHCP) errneo"
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr "rango DHCP inconsistente"
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr "dhcp-host errneo"
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr "dhcp-option errneo"
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr "dominio errneo en dhcp-option"
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr "opcin dhcp-option demasiado larga"
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr "rcord TXT errneo"
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr "rcord TXT demasiado largo"
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr "rcord SRV errneo"
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr "destino SRV errneo"
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr "nmero de puerto invlido"
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr "prioridad invlida"
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr "peso invlido"
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr "error"
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr "opciones de lnea de comandos errneas: %s."
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr "no se puede obtener host-name (nombre de host): %s"
#: option.c:1882
#: option.c:1878
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "solo un archivo resolv.conf permitido en modo no-poll."
#: option.c:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr "debe haber exactamente un resolv.conf desde donde leer dominio."
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr "no se pudo leer %s: %m"
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr "ninguna directiva de bsqueda encontrada en %s"
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "servidor DNS %s se reuso a hacer una bsqueda recursiva"
#: forward.c:914
#: 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:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr "no se pudo accesar %s: %m"
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "no se pudo cargar %s: %m"
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr "leyendo %s"
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "nombre errneo en %s"
#: isc.c:175
#: 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:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr "no se pudo crear un socket escuchador: %s"
#: network.c:425
#: network.c:347
#, 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:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "no se pudo acoplar socket escuchador para %s: %s"
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr "no se pudo escuchar en el socket: %s"
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorando servidor DNS %s - interface local"
#: network.c:530
#: network.c:452
#, 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:544
#: network.c:466
msgid "domain"
msgstr "dominio"
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr "no calificado"
#: network.c:546
#: network.c:468
msgid "domains"
msgstr "dominios"
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr "usando direcciones locales solo para %s %s"
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "usando servidor DNS %s#%d para %s %s"
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr "usando servidor DNS %s#%d"
#: dnsmasq.c:115
#: dnsmasq.c:93
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"Integracin dhcpd ISC no disponible: fijar HAVE_ISC_READER en src/config.h"
#: dnsmasq.c:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "no se pudo encontrar lista de interfaces: %s"
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr "interface desconocida %s"
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr "ninguna interface con direccin %s"
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr "no se puede abrir %s:%s"
#: dnsmasq.c:163
#: dnsmasq.c:141
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:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr "error DBus: %s"
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus no disponible: fijar HAVE_DBUS en src/config.h"
#: dnsmasq.c:292
#: dnsmasq.c:192
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "no se puede leer %s: %s"
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr "versin %s iniciada, tamao de cach %d"
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr "versin %s iniciada, cach deshabilitado"
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr "opciones de compilacin: %s"
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr "soporte DBus habilitado: conectado a bus de sistema"
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr "soporte DBus habilitado: coneccin a bus pendiente"
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
"fijando opcin --bind-interfaces debido a limitaciones de sistema operativo"
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "advertencia: interface %s no existe actualmente"
#: dnsmasq.c:331
#: dnsmasq.c:358
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, arriendos estticos solo en %.0s%s, tiempo de arriendo %s"
#: dnsmasq.c:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, rango de IP %s -- %s, tiempo de arriendo %s"
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr "DHCP, %s ser escrito cada %s"
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr "corriendo como root"
#: dnsmasq.c:522
msgid "connected to system DBus"
msgstr "conectado a DBus de sistema"
#: dnsmasq.c:533
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr "haciendo exit al haber recibido SIGTERM"
#: dhcp.c:25
#: dnsmasq.c:524
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:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "no se pudo fijar opciones en socket DHCP: %s"
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "no se pudo fijar SO_REUSEADDR en socket DHCP: %s"
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "no se pudo acoplar socket de servidor DHCP: %s"
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "no se puede crear socket crudo ICMP: %s."
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "no se puede crear socket BPF DHCP: %s"
#: dhcp.c:86
#, c-format
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?"
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "direccin IP duplicada en directiva dhcp-config."
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr "pedido DHCP por hardware no soportado tipo (%d) recibido en %s"
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "rango DHCP %s -- %s no coincide con mscara de red %s"
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr "no se pudo leer %s:%m"
#: dhcp.c:741
#: dhcp.c:641
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "nombre errneo en %s lnea %d"
#: dhcp.c:845
#: dhcp.c:745
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "direccin IP %s (%s) duplicada en directiva dhcp-config"
#: dhcp.c:881
#: dhcp.c:781
#, 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:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "no se puede abrir o crear archivo de arriendos: %s"
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr "demasiados arriendos almacenados"
#: lease.c:179
#, fuzzy
msgid "failed to write"
msgstr "no se pudo leer %s:%m"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "no se pudo leer %s: %m"
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "ningn rango de direccines disponible para pedido DHCP %s %s"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "con selector de subred"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr "va"
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "deshabilitado"
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "direccin en uso"
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr "ninguna direccin configurada"
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "ninguna direccin disponible"
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "no queda ningn arriendo"
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "red equivocada"
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "deshabilitando direccin DHCP esttica %s"
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr "arriendo desconocido"
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignorado"
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "direccin equivocada"
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr "arriendo no encontrado"
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr "direccin no disponible"
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr "arriendo esttico disponible"
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr "direccin reservada"
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr "no se puede enviar opcin DHCP %d: no queda espacio en el paquete"
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Ms de una clase de vendedor coincide, usando %s"
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "no se puede acoplar socket netlink: %s"
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
"intento de fijar direccin IPv6 a servidor va DBus - no hay soporte IPv6"
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "fijando servidores upstream desde DBus"
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "no se pudo registrar un manejador de mensajes DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "no se puede crear socket BPF DHCP: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "pedido DHCP por hardware no soportado tipo (%d) recibido en %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "no se puede abrir %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s ser escrito cada %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "no se puede crear socket para paquetes DHCP: %s. Est CONFIG_PACKET "
#~ "habilitado en el kernel?"
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -15,56 +15,58 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr ""
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, c-format
msgid "bad address at %s line %d"
msgstr ""
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr ""
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr ""
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr ""
#: cache.c:723
#: 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:767
#: cache.c:772
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
#: util.c:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr ""
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr ""
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr ""
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr ""
......@@ -311,6 +313,10 @@ msgstr ""
msgid "Map MAC address (with wildcards) to option set."
msgstr ""
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr ""
......@@ -392,468 +398,481 @@ msgstr ""
msgid "bad MX target"
msgstr ""
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr ""
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr ""
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr ""
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr ""
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr ""
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr ""
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr ""
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr ""
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr ""
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr ""
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr ""
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr ""
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr ""
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr ""
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr ""
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr ""
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr ""
#: option.c:1882
#: option.c:1878
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr ""
#: option.c:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr ""
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr ""
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr ""
#: forward.c:914
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
#: isc.c:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr ""
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr ""
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr ""
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr ""
#: isc.c:175
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
#: network.c:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr ""
#: network.c:425
#: network.c:347
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr ""
#: network.c:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr ""
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr ""
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr ""
#: network.c:530
#: network.c:452
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr ""
#: network.c:544
#: network.c:466
msgid "domain"
msgstr ""
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr ""
#: network.c:546
#: network.c:468
msgid "domains"
msgstr ""
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
#: dnsmasq.c:115
#: dnsmasq.c:93
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
#: dnsmasq.c:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr ""
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr ""
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr ""
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr ""
#: dnsmasq.c:163
#: dnsmasq.c:141
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
#: dnsmasq.c:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr ""
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr ""
#: dnsmasq.c:292
#: dnsmasq.c:192
#, c-format
msgid "cannot create pipe: %s"
msgstr ""
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr ""
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr ""
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr ""
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr ""
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr ""
#: dnsmasq.c:331
#: dnsmasq.c:358
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
#: dnsmasq.c:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr ""
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr ""
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr ""
#: dnsmasq.c:522
msgid "connected to system DBus"
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr ""
#: dnsmasq.c:533
msgid "exiting on receipt of SIGTERM"
#: dnsmasq.c:524
msgid "connected to system DBus"
msgstr ""
#: dhcp.c:25
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr ""
#: dhcp.c:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr ""
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr ""
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr ""
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr ""
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: dhcp.c:86
#, c-format
msgid ""
"cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
"kernel?"
msgstr ""
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr ""
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr ""
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr ""
#: dhcp.c:741
#: dhcp.c:641
#, c-format
msgid "bad line at %s line %d"
msgstr ""
#: dhcp.c:845
#: dhcp.c:745
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr ""
#: dhcp.c:881
#: dhcp.c:781
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
#: lease.c:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr ""
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr ""
#: lease.c:179
msgid "failed to write"
#: lease.c:118
#, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr ""
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr ""
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr ""
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr ""
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr ""
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr ""
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr ""
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr ""
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr ""
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr ""
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr ""
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr ""
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr ""
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr ""
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr ""
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr ""
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr ""
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr ""
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr ""
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
msgid "cannot create RTnetlink socket: %s"
msgstr ""
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr ""
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: bpf.c:74
#, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -15,31 +15,31 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: cache.c:565
#: 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:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "mauvais nom dans %s ligne %d"
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr "mauvais nom dans %s ligne %d"
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr "lecture %s - %d adresses"
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr "cache nettoye"
#: cache.c:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -48,27 +48,29 @@ 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:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: 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:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "impossible d'allouer de la memoire"
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s a la ligne %d de %%s"
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr "IMPOSSIBLE de demarrer"
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "illimite"
......@@ -335,6 +337,10 @@ msgstr "Autorise l'allocation dynamique d'adresse pour bootp."
msgid "Map MAC address (with wildcards) to option set."
msgstr "Associe les 'vendor class' DHCP aux options."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "il manque \""
......@@ -421,485 +427,508 @@ msgstr "mauvais nom MX"
msgid "bad MX target"
msgstr "mauvaise cible MX"
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr "mauvais port"
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr "mauvaise plage d'adresses DHCP (dhcp-range)"
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr "plage d'adresses DHCP incoherente"
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr "mauvais dhcp-host"
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr "mauvais dhcp-option"
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr "mauvais domaine dans dhcp-option"
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr "dhcp-option trop long"
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr "mauvais champ TXT"
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr "chaîne du champ TXT trop longue"
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr "mauvais champ SRV"
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr "mauvaise cible SRV"
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr "numero de port invalide"
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr "priorite invalide"
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr "poids invalide"
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr "erreur"
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr "mauvaises options en ligne de commande: %s."
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr "ne peut pas obtenir le nom de la machine: %s"
#: option.c:1882
#: option.c:1878
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:1889
#: option.c:1885
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:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr "impossible de lire %s: %m"
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr "pas de directive de recherche trouvee dans %s"
#: forward.c:383
#: 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:914
#: 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:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr "impossible d'acceder a %s: %m"
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "impossible de charger %s: %m"
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr "Lecture %s"
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "mauvais nom dans %s"
#: isc.c:175
#: 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:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr "impossible de creer une socket de lecture: %s"
#: network.c:425
#: network.c:347
#, 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:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "impossible de lier la socket de lecture pour %s: %s"
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr "impossible de lire sur la socket: %s"
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "on ignore le serveur de nom %s - interface locale"
#: network.c:530
#: network.c:452
#, 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:544
#: network.c:466
msgid "domain"
msgstr "domaine"
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr "non-qualifie"
#: network.c:546
#: network.c:468
msgid "domains"
msgstr "domaines"
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr "on utilise les adresses locales seulement pour %s %s"
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "on utilise le serveur de nom %s#%d pour %s %s"
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr "on utilise le serveur de nom %s#%d"
#: dnsmasq.c:115
#: dnsmasq.c:93
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:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "impossible de trouver la liste des interfaces: %s"
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr "interface %s inconnue"
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr "pas d'interface avec l'adresse %s"
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr "ne peut pas ouvrir %s:%s"
#: dnsmasq.c:163
#: dnsmasq.c:141
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:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr "Erreur DBus: %s"
#: dnsmasq.c:179
#: dnsmasq.c:157
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:292
#: dnsmasq.c:192
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "Ne peut pas lire %s: %s"
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr "demarre, version %s taille de cache %d"
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr "demarre, version %s cache desactive"
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr "options a la compilation: %s"
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr "Support DBus autorise: connecte au bus systeme"
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr "Support DBus autorise: connexion au bus en suspend"
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "Active l'option --bind-interfaces a cause des limitations de l'OS"
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "Attention: l'interface %s n'existe pas actuellement"
#: dnsmasq.c:331
#: dnsmasq.c:358
#, 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:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, plage d'adresse %s -- %s, duree de bail %s"
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr "DHCP, %s sera ecrit chaque %s"
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr "execute sous root"
#: dnsmasq.c:522
msgid "connected to system DBus"
msgstr "connecte au systeme DBus"
#: dnsmasq.c:533
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr "sortie sur reception du signal SIGTERM"
#: dhcp.c:25
#: dnsmasq.c:524
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:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "impossible d'appliquer les options sur la socket DHCP: %s"
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "impossible de declarer SO_REUSEADDR sur la socket DHCP: %s"
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "impossible de lier la socket serveur DHCP: %s"
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "ne peut creer de socket en mode raw pour ICMP: %s."
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "impossible de creer une socket BPF pour DHCP: %s"
#: dhcp.c:86
#, c-format
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?"
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "adresse IP %s dupliquee dans la directive dhcp-config."
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr "requete DHCP pour un type de materiel non supporte (%d) recue sur %s"
#: dhcp.c:413
#: dhcp.c:306
#, 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:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr "impossible de lire %s:%m"
#: dhcp.c:741
#: dhcp.c:641
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "mauvais nom dans %s ligne %d"
#: dhcp.c:845
#: dhcp.c:745
#, 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:881
#: dhcp.c:781
#, 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:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "ne peut ouvrir ou creer des fichiers de baux: %s"
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr "beaucoup trop de baux enregistres"
#: lease.c:179
#, fuzzy
msgid "failed to write"
msgstr "impossible de lire %s:%m"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "impossible de lire %s: %m"
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "pas de plage d'adresse disponible pour la requete DHCP %s %s"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "avec selecteur de sous-reseau"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr "par l'intermediaire de"
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "desactive"
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adresse deja utilisee"
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr "pas d'adresse configuree"
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "pas d'adresse disponible"
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "aucun baux laisses"
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "mauvais reseau"
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "desactive l'adresse statique DHCP %s"
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr "bail inconnu"
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignore"
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "mauvaise adresse"
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr "bail non trouve"
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr "adresse non disponible"
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr "bail statique disponible"
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr "adresse reservee"
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Plus d'une seule classe de fournisseur correspond, on utilise %s"
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "ne peux lier une socket netlink: %s"
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
"tentative de lier une adresse serveur IPV6 via DBus - pas de support IPV6"
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "configuration des serveurs amonts a partir de DBus"
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "ne peut enregistrer une routine de traitement des messages DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "impossible de creer une socket BPF pour DHCP: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "requete DHCP pour un type de materiel non supporte (%d) recue sur %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "ne peut pas ouvrir %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s sera ecrit chaque %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "impossible de creer une socket DHCP en mode paquet: %s. Est-ce que "
#~ "CONFIG_PACKET est active dans votre noyau?"
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+0100\n"
"PO-Revision-Date: 2005-10-07 11:45+0100\n"
"Last-Translator: Salman AS <sas@salman.or.id>\n"
"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
......@@ -15,36 +15,36 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
# OK
#: cache.c:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "gagal memuat nama-nama dari %s: %m"
# OK
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "kesalahan nama pada %s baris %d"
# OK
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr "kesalahan nama pada %s baris %d"
# OK
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr "membaca %s - %d alamat"
# OK
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr "cache telah dihapus"
# OK
#: cache.c:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -54,30 +54,32 @@ msgstr ""
"sdengan alamat %s"
# OK
#: cache.c:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"ukuran cache %d, %d/%d penyisipan cache menimpa cache yang belum kadaluwarsa"
# OK
#: util.c:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "tidak bisa mendapatkan memory"
# OK
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s pada baris %d dari %%s"
# OK
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr "GAGAL untuk memulai"
# OK
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "tak terbatas"
......@@ -385,6 +387,10 @@ msgstr "Mungkinkan alokasi alamat dinamis untuk bootp."
msgid "Map MAC address (with wildcards) to option set."
msgstr "Memetakan kelas vendor DHCP ke daftar pilihan."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
# OK
#: option.c:396
msgid "missing \""
......@@ -490,230 +496,238 @@ msgid "bad MX target"
msgstr "target MX salah"
# OK
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr "port salah"
# OK
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr "dhcp-range salah"
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
# OK
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr "jangkauan DHCP tidak konsisten"
# OK
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr "dhcp-host salah"
# OK
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr "dhcp-option salah"
# OK
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr "domain dalam dhcp-option salah"
# OK
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr "dhcp-option terlalu panjang"
# OK
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr "rekord TXT salah"
# OK
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr "string rekord TXT terlalu panjang"
# OK
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr "rekord SRV salah"
# OK
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr "target SRV salah"
# OK
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr "nomor port tidak benar"
# OK
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr "prioritas tidak benar"
# OK
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr "weight tidak benar"
# OK
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr "kesalahan"
# OK
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr "pilihan baris perintah salah: %s."
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
# OK
#: option.c:1853
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr "tidak bisa mendapatkan host-name: %s"
# OK
#: option.c:1882
#: option.c:1878
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "hanya satu file resolv.conf yang diperbolehkan dalam modus no-poll."
# OK
#: option.c:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr "harus mempunyai tepat satu resolv.conf untuk mendapatkan nama domain."
# OK
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr "gagal membaca %s: %m"
# OK
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr "tidak ditemukan direktif search di %s"
# OK
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "nameserver %s menolak melakukan resolusi rekursif"
# OK
#: forward.c:914
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr "meneruskan tabel overflow: memeriksa apakah terjadi loop server."
# OK
#: isc.c:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr "gagal mengakses %s: %m"
# OK
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "gagal memuat %S: %m"
# OK
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr "membaca %s"
# OK
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "kesalahan nama di %s"
# OK
#: isc.c:175
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
"Mengabaikan lease DHCP untuk %s sebab terdapat bagian domain yang tidak sah"
# OK
#: network.c:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr "gagal membuat socket: %s "
# OK
#: network.c:425
#: network.c:347
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "gagal menyetel IPV6 pada socket: %s"
#: network.c:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "gagal mem-bind socket untuk mendengarkan %s: %s"
# OK
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr "gagal mendengarkan di socket: %s"
# OK
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "mengabaikan nameserver %s - antarmuka lokal"
# OK
#: network.c:530
#: network.c:452
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "mengabaikan nameserver %s - tak dapat membuat/mem-bind socket: %m"
# OK
#: network.c:544
#: network.c:466
msgid "domain"
msgstr "domain"
# OK
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr "tidak memenuhi syarat"
# OK
#: network.c:546
#: network.c:468
msgid "domains"
msgstr "domain-domain"
# OK
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr "menggunakan alamat lokal saja untuk %s %s"
# OK
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "menggunakan nameserver %s#%d untuk %s %s"
# OK
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr "menggunakan nameserver %s#%d"
# OK
#: dnsmasq.c:115
#: dnsmasq.c:93
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
......@@ -721,333 +735,320 @@ msgstr ""
"config.h"
# OK
#: dnsmasq.c:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "gagal mendapatkan daftar antarmuka: %s"
# OK
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr "antarmuka tidak dikenal %s"
# OK
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr "tidak ada antarmuka dengan alamat %s"
# OK
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr "tidak bisa membuka %s:%s"
# OK
#: dnsmasq.c:163
#: dnsmasq.c:141
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
"harus menyetel satu antarmuka saja pada sistem yang tidak benar dengan "
"IP_RECVIF"
# OK
#: dnsmasq.c:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr "DBus error: %s"
# OK
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus tidak tersedia: setel HAVE_DBUS dalam src/config.h"
# OK
#: dnsmasq.c:292
#: dnsmasq.c:192
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "tidak bisa membaca %s: %s"
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
# OK
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr "dimulai, versi %s ukuran cache %d"
# OK
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr "dimulai, cache versi %s di disable"
# OK
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr "pilihan-pilihan saat kompilasi: %s"
# OK
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr "dukungan DBus dimungkinkan: terkoneksi pada bus sistem"
# OK
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr "dukungan DBus dimungkinkan: koneksi bus ditunda"
# OK
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "setelan opsi --bind-interfaces disebabkan keterbatasan OS"
# OK
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "peringatan: antarmuka %s tidak ada"
# OK
#: dnsmasq.c:331
#: dnsmasq.c:358
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, lease static pada %.0s%s, waktu lease %s"
# OK
#: dnsmasq.c:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, jangkaun IP %s -- %s, waktu lease %s"
# OK
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr "DHCP, %s akan ditulis setiap %s"
# OK
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr "berjalan menggunakan root"
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr "keluar karena menerima SIGTERM"
# OK
#: dnsmasq.c:522
#: dnsmasq.c:524
msgid "connected to system DBus"
msgstr "terhubung ke sistem DBus"
#: dnsmasq.c:533
msgid "exiting on receipt of SIGTERM"
msgstr "keluar karena menerima SIGTERM"
# OK
#: dhcp.c:25
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "tidak bisa membuat socket DHCP: %s"
# OK
#: dhcp.c:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "gagal menyetel opsi pada socket DHCP: %s"
# OK
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "gagal menyetel SO_REUSEADDR pada socket DHCP: %s"
# OK
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "gagal mem-bind socket server DHCP: %s"
# OK
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "tidak dapat membuat socket ICMP raw: %s"
# OK
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "tidak dapat membuat socket DHCP BPF: %s"
# OK
#: dhcp.c:86
#, c-format
msgid ""
"cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
"kernel?"
msgstr ""
"tidak dapat membuat socket packet DHCP: %s. Apakah CONFIG_PACKET "
"dimungkinkan pada kernel?"
# OK
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "alamat IP kembar %s dalam direktif dhcp-config"
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
# OK
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr ""
"permintaan DHCP untuk tipe hardware yang tidak didukung (%d) diterima pada %s"
# OK
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "jangkauan DHCP %s -- %s tidak konsisten dengan netmask %s"
# OK
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr "gagal membaca %s:%m"
# OK
#: dhcp.c:741
#: dhcp.c:641
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "kesalahan nama pada %s baris %d"
# OK
#: dhcp.c:845
#: dhcp.c:745
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "alamat IP kembar %s (%s) dalam direktif dhcp-config"
# OK
#: dhcp.c:881
#: dhcp.c:781
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
"Mengabaikan nama host DHCP %s sebab memiliki bagian domain yang tidak sah"
# OK
#: lease.c:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "tidak dapat membuka atau membuat file lease: %s"
# OK
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr "terlalu banyak lease yang disimpan"
# OK
#: lease.c:179
#, fuzzy
msgid "failed to write"
msgstr "gagal membaca %s:%m"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "gagal membaca %s: %m"
# OK
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "tidak ada alamat yang bisa dipakai untuk permintaan DHCP %s %s"
# OK
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "dengan pemilih subnet"
# OK
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr "lewat"
# OK
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "di disable"
# OK
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "alamat telah digunakan"
# OK
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr "tak ada alamat yang disetel"
# OK
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "tak ada alamat yang tersedia"
# OK
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "tak ada lease yang tersisa"
# OK
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "jaringan yang salah"
# OK
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "men-disable alamat statik DHCP %s"
# OK
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr "lease tidak diketahui"
# OK
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "diabaikan"
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
# OK
#: rfc2131.c:619
#: rfc2131.c:670
msgid "wrong address"
msgstr "alamat salah"
# OK
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr "lease tak ditemukan"
# OK
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr "alamat tak tersedia"
# OK
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr "lease statik tak tersedia"
# OK
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr "alamat telah dipesan"
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
# OK
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Lebih dari satu kelas vendor yang sesuai, menggunakan %s"
# OK
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "tidak bisa mem-bind netlink socket: %s"
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
# OK
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
......@@ -1056,11 +1057,40 @@ msgstr ""
"untuk IPv6"
# OK
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "menyetel server-server di atas dengan DBus"
# OK
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "tidak bisa mendaftar sebuah DBus message handler"
# OK
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "tidak dapat membuat socket DHCP BPF: %s"
# OK
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""
"permintaan DHCP untuk tipe hardware yang tidak didukung (%d) diterima pada %s"
# OK
#~ msgid "cannot open %s:%s"
#~ msgstr "tidak bisa membuka %s:%s"
# OK
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s akan ditulis setiap %s"
# OK
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "tidak dapat membuat socket packet DHCP: %s. Apakah CONFIG_PACKET "
#~ "dimungkinkan pada kernel?"
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.25\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -17,31 +17,31 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: cache.c:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "feilet laste navn fra %s: %m"
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, c-format
msgid "bad address at %s line %d"
msgstr "drlig adresse ved %s linje %d"
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr "drlig navn ved %s linje %d"
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr "les %s - %d adresser"
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr "mellomlager tmt"
#: cache.c:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -50,27 +50,29 @@ msgstr ""
"gir ikke navnet %s til DHCP leien for %s fordi navnet eksisterer i %s med "
"adressen %s"
#: cache.c:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: cache.c:772
#, fuzzy, c-format
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
"mellomlager strrelse %d, %d/%d mellomlager innsettinger re-bruker "
"mellomlager plasser som ikke er utlpt"
#: util.c:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "kunne ikke f minne"
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s p linje %d av %%s"
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr "FEILET starte opp"
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "uendelig"
......@@ -318,6 +320,10 @@ msgstr "Aktiver dynamisk adresse allokering for bootp."
msgid "Map MAC address (with wildcards) to option set."
msgstr "Map DHCP produsent klasse til opsjon sett."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "mangler \""
......@@ -403,471 +409,498 @@ msgstr "d
msgid "bad MX target"
msgstr "drlig MX ml"
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr "drlig port"
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr "drlig dhcp-omrde"
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr "ikke konsistent DHCP omrde"
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr "drlig dhcp-vert"
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr "drlig dhcp-opsjon"
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr "drlig domene i dhcp-opsjon"
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr "dhcp-opsjon for lang"
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr "drlig TXT post"
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr "TXT post streng for lang"
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr "drlig SRV post"
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr "drlig SRV ml"
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr "ugyldig portnummer"
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr "ugyldig prioritet"
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr "ugyldig vekt"
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr "feil"
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr "drlige kommandlinje opsjoner: %s."
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr "klarer ikke f vertsnavn: %s"
#: option.c:1882
#: option.c:1878
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr "kun en resolv.conf fil tillat i no-poll modus."
#: option.c:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr "m ha nyaktig en resolv.conf lese domene fra."
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr "feilet lese %s: %m"
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr "intet ske direktiv funnet i %s"
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "navnetjener %s nektet gjre et rekursivt oppslag"
#: forward.c:914
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr "fremsendelse (forwarding) tabell overflyt: sjekk etter tjener lkker."
#: isc.c:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr "feilet f tilgang til %s: %m"
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "feilet laste %s: %m"
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr "leser %s"
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "drlig navn i %s"
#: isc.c:175
#: 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:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr "feilet lage lytte socket: %s"
#: network.c:425
#: network.c:347
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "feilet sette IPv6 opsjoner p lytte socket: %s"
#: network.c:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "feilet binde lytte socket for %s: %s"
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr "feilet lytte p socket: %s"
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorerer navnetjener %s - lokal tilknytning"
#: network.c:530
#: network.c:452
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "ignorerer navnetjener %s - kan ikke lage/dinde socket: %m"
#: network.c:544
#: network.c:466
msgid "domain"
msgstr "domene"
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr "ikke kvalifisert"
#: network.c:546
#: network.c:468
msgid "domains"
msgstr "domener"
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr "benytter lokale adresser kun for %s %s"
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "benytter navnetjener %s#%d for %s %s"
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr "benytter navnetjener %s#%d"
#: dnsmasq.c:115
#: dnsmasq.c:93
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:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "feilet finne liste av tilknytninger (interfaces): %s"
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr "ukjent tilknytning (interface) %s"
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr "ingen tilknytning (interface) med adresse %s"
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr "kan ikke pne %s:%s"
#: dnsmasq.c:163
#: dnsmasq.c:141
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr "m sette nyaktig et interface p delagte systemer uten IP_RECVIF"
#: dnsmasq.c:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr "DBus feil: %s"
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus ikke tilgjengelig: sett HAVE_DBUS i src/config.h"
#: dnsmasq.c:292
#: dnsmasq.c:192
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "kan ikke lese %s: %s"
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr "startet, versjon %s mellomlager strrelse %d"
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr "startet, versjon %s mellomlager deaktivert"
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr "kompilerings opsjoner: %s"
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr "DBus sttte aktivert: koblet til system buss"
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr "DBus sttte aktivert: avventer buss tilkobling"
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "setter --bind-interfaces opsjon p grunn av OS begrensninger"
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "advarsel: nettverkskort %s eksisterer ikke for tiden"
#: dnsmasq.c:331
#: dnsmasq.c:358
#, 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:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, IP omrde %s -- %s, leie tid %s"
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr "DHCP, %s vil bli skrevet hver %s"
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr "kjrer som rot (root)"
#: dnsmasq.c:522
msgid "connected to system DBus"
msgstr "tilkoblet til system DBus"
#: dnsmasq.c:533
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr "avslutter etter mottak av SIGTERM"
#: dhcp.c:25
#: dnsmasq.c:524
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:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "feilet sette opsjoner p DHCP socket: %s"
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "feilet sette SO_REUSEADDR p DHCP socket: %s"
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "feilet binde DHCP tjener socket: %s"
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "kan ikke lage ICMP raw socket: %s"
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "kan ikke lage DHCP BPF socket: %s"
#: dhcp.c:86
#, c-format
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?"
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "dubliserte IP adresser i %s dhcp-config direktiv."
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr "Kan ikke benytte RTnetlink socket, faller tilbake til ioctl API"
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr "DHCP krav for ikke stttet maskinvare type (%d) mottatt p %s"
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "DHCP omrde %s -- %s er ikke konsistent med nettmaske %s"
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr "feilet lese %s:%m"
#: dhcp.c:741
#: dhcp.c:641
#, c-format
msgid "bad line at %s line %d"
msgstr "drlig linje ved %s linje %d"
#: dhcp.c:845
#: dhcp.c:745
#, 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:881
#: dhcp.c:781
#, 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:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "kan ikke pne eller lage leie fil: %s"
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr "for mange lagrede leier"
#: lease.c:179
#, fuzzy
msgid "failed to write"
msgstr "feilet lese %s:%m"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "feilet lese %s: %m"
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "ingen adresse omrde tilgjengelig for DHCP krav %s %s"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "med subnet velger"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr "via"
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "deaktivert"
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adresse i bruk"
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr "ingen adresse konfigurert"
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "ingen adresse tilgjengelig"
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "ingen leier igjen"
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "galt nettverk"
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "deaktiverer DHCP statisk adresse %s"
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr "ukjent leie"
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "oversett"
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "gal adresse"
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr "leie ikke funnet"
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr "adresse ikke tilgjengelig"
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr "statisk leie tilgjengelig"
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr "adresse reservert"
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr "kan ikke sende DHCP opsjon %d: ikke mer plass i pakken"
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Mer enn en produsent klasse som passer, bruker %s"
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "kan ikke binde netlink socket: %s"
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr "forsk p sette en IPv6 tjener adresse via DBus - ingen IPv6 sttte"
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "setter oppstrms tjener fra DBus"
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "kunne ikke registrere en DBus meldingshndterer"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "kan ikke lage DHCP BPF socket: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "DHCP krav for ikke stttet 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"
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+0100\n"
"PO-Revision-Date: 2005-10-04 19:17+0100\n"
"Last-Translator: Tomasz Sochaski <nerdhero@gmail.com>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
......@@ -16,31 +16,31 @@ msgstr ""
"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:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr "bd adowania nazw z %s: %m"
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, fuzzy, c-format
msgid "bad address at %s line %d"
msgstr "bdna nazwa w %s, linia %d"
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr "bdna nazwa w %s, linia %d"
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr "przeczytano %s - %d adresw"
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr "wyczyszczono cache"
#: cache.c:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -49,26 +49,28 @@ msgstr ""
"nazwa %s nie zostaa nadana dzierawie DHCP %s, poniewa nazwa istnieje w %s "
"i ma adres %s"
#: cache.c:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: 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 wpisw cache uyto ponownie z niewygasych wpisw"
#: util.c:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "nie mona pobra pamici"
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s w linii %d z %%s"
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr "BD uruchomienia"
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "nieskoczona"
......@@ -327,6 +329,10 @@ msgstr "W
msgid "Map MAC address (with wildcards) to option set."
msgstr "Mapowanie nazwy dystrybutora DHCP do ustawie opcji."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "brakuje \""
......@@ -412,477 +418,500 @@ msgstr "b
msgid "bad MX target"
msgstr "bdny cel MX"
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr "nieprawidowy port"
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr "nieprawidowy zakres dhcp-range"
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr "niespjny zakres DHCP"
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr "bd w dhcp-host"
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr "bd w dhcp-option"
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr "nieprawidowa nazwa domeny w dhcp-option"
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr "zbyt duga nazwa w dhcp-option"
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr "nieprawidowy rekord TX"
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr "zbyt dugi rekord TXT"
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr "bd w rekordzie SRV"
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr "nieprawidowy cel SRV"
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr "nieprawidowy port"
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr "nieprawidowy priorytet"
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr "nieprawidowe znaczenie"
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr "bd"
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr "nieprawidowa opcja linii komend: %s."
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr "nie mona pobra nazwy hosta: %s"
#: option.c:1882
#: option.c:1878
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:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr "musisz mie dokadnie jeden plik resolv.conf do odczytu domen."
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr "bd w odczycie %s: %m"
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr "brak wytycznych wyszukiwania w %s"
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "serwer nazw %s odmawia wykonania zapytania rekursywnego"
#: forward.c:914
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
"przekroczenie zakresu tablicy przekazywania: sprawd zaptlenie serwera."
#: isc.c:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr "bd w dostpie do %s: %m"
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "bd adowania %s: %m"
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr "czytanie %s"
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "nieprawidowa nazwa w %s"
#: isc.c:175
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
"Ignoruj dzierawy DHCP dla %s poniewa zawieraj nieprawidow cz "
"domenow"
#: network.c:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr "bd podczas tworzenia gniazda: %s"
#: network.c:425
#: network.c:347
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr "bd ustawienia opcji IPV6 na nasuchujcym gniedzie: %s"
#: network.c:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr "bd podczenia nasuchujcego gniazda dla %s: %s"
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr "bd wczenia nasuchiwania gniazda: %s"
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorowanie serwera nazw %s - interfejs lokalny"
#: network.c:530
#: network.c:452
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr "ignorowanie serwera nazw %s - nie mona utworzy/dowiza gniazda: %m"
#: network.c:544
#: network.c:466
msgid "domain"
msgstr "domena"
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr "niekwalifikowany(a/e)"
#: network.c:546
#: network.c:468
msgid "domains"
msgstr "domeny"
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr "wczenie uywania lokalnych adresw tylko dla %s %s"
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "uywany serwer nazw: %s#%d dla %s %s"
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr "uywany serwer nazw %s#%d"
#: dnsmasq.c:115
#: dnsmasq.c:93
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
"Intergracja z ISC dhcpd nie jest dostpna: ustaw HAVE_ISC_READER w src/"
"config.h"
#: dnsmasq.c:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "bd w znalezieniu listy interfejsw sieciowych: %s"
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr "nieznany interfejs %s"
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr "brak interfejsu z adresem %s"
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr "nie mona otworzy %s:%s"
#: dnsmasq.c:163
#: dnsmasq.c:141
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr "musisz ustawi dokadnie jeden interfejs w systemach bez IP_RECVIF"
#: dnsmasq.c:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr "bd DBus: %s"
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr "DBus jest niedostpny: ustaw HAVE_DBUS w src/config.h"
#: dnsmasq.c:292
#: dnsmasq.c:192
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "bd odczytu z %s: %s"
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr "uruchomiony, wersja %s wielko cache %d"
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr "uruchomiony, wersja %s cache wyczony"
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr "opcje kompilacji: %s"
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr "obsuga DBus wczona: podczono do szyny systemowej"
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr "obsuga DBus wczona: podczanie do szyny systemowej w toku"
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "ustawiam opcj --bind-interfaces z powodu limitw systemu operacyjnego"
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "ostrzeenie: interfejs %s obecnie nie istnieje"
#: dnsmasq.c:331
#: dnsmasq.c:358
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, statyczne dzierawy tylko na %.0s%s, czas dzierawy %s"
#: dnsmasq.c:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, zakres IP %s -- %s, czas dzierawy %s"
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr "DHCP, %s bdzie zapisywane co %s"
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr "pracuje z uprawnieniami uytkownika root"
#: dnsmasq.c:522
msgid "connected to system DBus"
msgstr "poczono do systemowego DBus"
#: dnsmasq.c:533
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr "wyczenie po otrzymaniu sygnalu SIGTERM"
#: dhcp.c:25
#: dnsmasq.c:524
msgid "connected to system DBus"
msgstr "poczono do systemowego DBus"
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr "nie mona utworzy gniazda DHCP : %s"
#: dhcp.c:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "bd ustawienia opcji gniazda DHCP: %s"
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "bd ustawienia SO_REUSEADDR gniazda DHCP: %s"
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "bd podczenia gniazda serwera DHCP: %s"
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "bd utworzenia surowego gniazda ICMP: %s."
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "bd utworzenia gniazda DHCP BPF: %s"
#: dhcp.c:86
#, c-format
msgid ""
"cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
"kernel?"
msgstr ""
"bd utworzenia gniazda pakietw DHCP: %s. Czy w Twoim kernelu uaktywnie "
"opcj CONFIG_PACKET?"
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "powtrzenie adresu IP %s w opcji dhcp-config"
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr "danie DHCP nieobsugiwanego typu sprztowego (%d) otrzymane na %s"
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr "zakres DHCP %s -- %s jest niespjny z mask sieciow %s"
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr "bd odczytu %s:%m"
#: dhcp.c:741
#: dhcp.c:641
#, fuzzy, c-format
msgid "bad line at %s line %d"
msgstr "bdna nazwa w %s, linia %d"
#: dhcp.c:845
#: dhcp.c:745
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "powtrzenie adresu IP %s (%s) w opcji dhcp-config"
#: dhcp.c:881
#: dhcp.c:781
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
"Ignoruj nazw hosta DHCP %s, poniewa posiada nieprawidow cz domenow"
#: lease.c:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "bd otwarcia lub utworzenia pliku dzieraw: %s"
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr "zbyt dua ilo zapisanych dzieraw"
#: lease.c:179
#, fuzzy
msgid "failed to write"
msgstr "bd odczytu %s:%m"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "bd w odczycie %s: %m"
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "aden zakres adresowy nie jest dostpny dla adania DHCP %s %s"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "z selekcj podsieci"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr "przez"
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "wyczony(a)"
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adres w uyciu"
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr "brak skonfigurowanego adresu"
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "brak dostpnego adresu"
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "brak wolnych dzieraw"
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "nieprawidowa sie"
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "wyczanie statycznego adresu DHCP %s"
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr "nieznana dzierawa"
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignoruj"
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "bdny adres"
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr "dzierawa nie znaleziona"
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr "adres niedostpny"
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr "dostpna statyczna dzierawa"
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr "adres zarezerwowany"
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Wicej ni jeden dystrybutor pasujcy, uywam %s"
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "nie mona podczy gniazda netlink: %s"
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr "prba ustawienia adresu IPv6 serwera przez DBus - brak obsugi IPv6"
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "nie mona zarejestrowa uchwytu wiadomoci DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "bd utworzenia gniazda DHCP BPF: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "danie DHCP nieobsugiwanego typu sprztowego (%d) otrzymane na %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "nie mona otworzy %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s bdzie zapisywane co %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "bd utworzenia gniazda pakietw DHCP: %s. Czy w Twoim kernelu "
#~ "uaktywnie opcj CONFIG_PACKET?"
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.26\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -15,56 +15,58 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: cache.c:565
#: cache.c:570
#, c-format
msgid "failed to load names from %s: %m"
msgstr ""
#: cache.c:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, c-format
msgid "bad address at %s line %d"
msgstr ""
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr ""
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr ""
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr ""
#: cache.c:723
#: 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:767
#: cache.c:772
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
msgid ""
"time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache "
"entries."
msgstr ""
#: util.c:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr ""
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr ""
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr ""
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr ""
......@@ -311,6 +313,10 @@ msgstr ""
msgid "Map MAC address (with wildcards) to option set."
msgstr ""
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr ""
......@@ -392,468 +398,481 @@ msgstr ""
msgid "bad MX target"
msgstr ""
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr ""
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr ""
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr ""
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr ""
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr ""
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr ""
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr ""
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr ""
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr ""
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr ""
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr ""
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr ""
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr ""
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr ""
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr ""
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr ""
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr ""
#: option.c:1882
#: option.c:1878
msgid "only one resolv.conf file allowed in no-poll mode."
msgstr ""
#: option.c:1889
#: option.c:1885
msgid "must have exactly one resolv.conf to read domain from."
msgstr ""
#: option.c:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr ""
#: option.c:1910
#: option.c:1906
#, c-format
msgid "no search directive found in %s"
msgstr ""
#: forward.c:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr ""
#: forward.c:914
#: forward.c:888
msgid "forwarding table overflow: check for server loops."
msgstr ""
#: isc.c:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr ""
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr ""
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr ""
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr ""
#: isc.c:175
#: isc.c:177
#, c-format
msgid "Ignoring DHCP lease for %s because it has an illegal domain part"
msgstr ""
#: network.c:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr ""
#: network.c:425
#: network.c:347
#, c-format
msgid "failed to set IPV6 options on listening socket: %s"
msgstr ""
#: network.c:444
#: network.c:365
#, c-format
msgid "failed to bind listening socket for %s: %s"
msgstr ""
#: network.c:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr ""
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr ""
#: network.c:530
#: network.c:452
#, c-format
msgid "ignoring nameserver %s - cannot make/bind socket: %m"
msgstr ""
#: network.c:544
#: network.c:466
msgid "domain"
msgstr ""
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr ""
#: network.c:546
#: network.c:468
msgid "domains"
msgstr ""
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
#: dnsmasq.c:115
#: dnsmasq.c:93
msgid ""
"ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"
msgstr ""
#: dnsmasq.c:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr ""
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr ""
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr ""
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr ""
#: dnsmasq.c:163
#: dnsmasq.c:141
msgid "must set exactly one interface on broken systems without IP_RECVIF"
msgstr ""
#: dnsmasq.c:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr ""
#: dnsmasq.c:179
#: dnsmasq.c:157
msgid "DBus not available: set HAVE_DBUS in src/config.h"
msgstr ""
#: dnsmasq.c:292
#: dnsmasq.c:192
#, c-format
msgid "cannot create pipe: %s"
msgstr ""
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr ""
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr ""
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr ""
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr ""
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr ""
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr ""
#: dnsmasq.c:331
#: dnsmasq.c:358
#, c-format
msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr ""
#: dnsmasq.c:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr ""
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr ""
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr ""
#: dnsmasq.c:522
msgid "connected to system DBus"
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr ""
#: dnsmasq.c:533
msgid "exiting on receipt of SIGTERM"
#: dnsmasq.c:524
msgid "connected to system DBus"
msgstr ""
#: dhcp.c:25
#: dhcp.c:32
#, c-format
msgid "cannot create DHCP socket : %s"
msgstr ""
#: dhcp.c:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr ""
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr ""
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr ""
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr ""
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: dhcp.c:86
#, c-format
msgid ""
"cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
"kernel?"
msgstr ""
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr ""
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr ""
#: dhcp.c:413
#: dhcp.c:306
#, c-format
msgid "DHCP range %s -- %s is not consistent with netmask %s"
msgstr ""
#: dhcp.c:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr ""
#: dhcp.c:741
#: dhcp.c:641
#, c-format
msgid "bad line at %s line %d"
msgstr ""
#: dhcp.c:845
#: dhcp.c:745
#, c-format
msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr ""
#: dhcp.c:881
#: dhcp.c:781
#, c-format
msgid "Ignoring DHCP host name %s because it has an illegal domain part"
msgstr ""
#: lease.c:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr ""
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr ""
#: lease.c:179
msgid "failed to write"
#: lease.c:118
#, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr ""
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr ""
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr ""
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr ""
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr ""
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr ""
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr ""
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr ""
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr ""
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr ""
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr ""
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr ""
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr ""
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr ""
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr ""
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr ""
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr ""
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr ""
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr ""
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr ""
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
msgid "cannot create RTnetlink socket: %s"
msgstr ""
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr ""
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr ""
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr ""
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr ""
#: bpf.c:74
#, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr ""
......@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dnsmasq 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-16 20:04+0000\n"
"POT-Creation-Date: 2006-04-17 11:36+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"
......@@ -15,31 +15,31 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
# for compatibility purposes the letters â, ă, ş, ţ and î can be written as their look-alike correspondent.
#: cache.c:565
#: 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:601 dhcp.c:754
#: cache.c:606 dhcp.c:654
#, c-format
msgid "bad address at %s line %d"
msgstr "adresă greşită în %s, linia %d"
#: cache.c:628 dhcp.c:768
#: cache.c:633 dhcp.c:668
#, c-format
msgid "bad name at %s line %d"
msgstr "nume greşit în %s linia %d"
#: cache.c:634 dhcp.c:822
#: cache.c:639 dhcp.c:722
#, c-format
msgid "read %s - %d addresses"
msgstr "citesc %s - %d adrese"
#: cache.c:670
#: cache.c:675
msgid "cleared cache"
msgstr "memoria temporară a fost ştearsă"
#: cache.c:723
#: cache.c:728
#, c-format
msgid ""
"not giving name %s to the DHCP lease of %s because the name exists in %s "
......@@ -48,27 +48,29 @@ msgstr ""
"nu pot da numele %s împrumutului de adresă DHCP a lui %s deoarece "
"numeleexistă în %s cu adresa %s"
#: cache.c:767
#, c-format
msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
#: 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:149 option.c:1302
#: util.c:153 option.c:1298
msgid "could not get memory"
msgstr "nu am putut aloca memorie"
#: util.c:172
#: util.c:176
#, c-format
msgid "%s at line %d of %%s"
msgstr "%s la linia %d din %%s"
#: util.c:179
#: util.c:183
msgid "FAILED to start up"
msgstr "pornirea A EŞUAT"
#: util.c:305
#: util.c:304
#, c-format
msgid "infinite"
msgstr "infinit"
......@@ -318,6 +320,10 @@ msgstr "Activează alocarea dinamică a adreselor pentru BOOTP."
msgid "Map MAC address (with wildcards) to option set."
msgstr "Trimite opţiuni DHCP în funcţie de marca plăcii de reţea."
#: option.c:182
msgid "Disable ICMP echo address checking in the DHCP server."
msgstr ""
#: option.c:396
msgid "missing \""
msgstr "lipseşte \""
......@@ -403,476 +409,499 @@ msgstr "nume MX invalid"
msgid "bad MX target"
msgstr "ţintă MX invalidă"
#: option.c:805 option.c:816
#: option.c:806 option.c:817
msgid "bad port"
msgstr "port invalid"
#: option.c:957
#: option.c:959
msgid "bad dhcp-range"
msgstr "dhcp-range invalid"
#: option.c:986
#: option.c:988
msgid "only one netid tag allowed"
msgstr ""
#: option.c:1031
#: option.c:1033
msgid "inconsistent DHCP range"
msgstr "domeniu DHCP inconsistent"
#: option.c:1219
#: option.c:1218
msgid "bad dhcp-host"
msgstr "dhcp-host invalid"
#: option.c:1279
#: option.c:1275
msgid "bad dhcp-option"
msgstr "dhcp-option invalid"
#: option.c:1297
#: option.c:1293
msgid "bad domain in dhcp-option"
msgstr "domeniu DNS invalid în declaraţia dhcp-option"
#: option.c:1467
#: option.c:1463
msgid "dhcp-option too long"
msgstr "declararea dhcp-option este prea lungă"
#: option.c:1664
#: option.c:1660
msgid "bad TXT record"
msgstr "înregistrare TXT invalidă"
#: option.c:1696
#: option.c:1692
msgid "TXT record string too long"
msgstr "şirul de caractere pentru înregistrarea TXT este prea lung"
#: option.c:1735
#: option.c:1731
msgid "bad SRV record"
msgstr "înregistrare SRV invalidă"
#: option.c:1748
#: option.c:1744
msgid "bad SRV target"
msgstr "ţintă SRV invalidă"
#: option.c:1760
#: option.c:1756
msgid "invalid port number"
msgstr "număr de port invalid"
#: option.c:1771
#: option.c:1767
msgid "invalid priority"
msgstr "prioritate invalidă"
#: option.c:1782
#: option.c:1778
msgid "invalid weight"
msgstr "pondere invalidă"
#: option.c:1807
#: option.c:1803
msgid "error"
msgstr "eroare"
#: option.c:1809
#: option.c:1805
#, c-format
msgid "bad command line options: %s."
msgstr "opţiuni în linie de comandă invalide: %s."
#: option.c:1853
#: option.c:1807
msgid "try --help"
msgstr ""
#: option.c:1809
msgid "try -w"
msgstr ""
#: option.c:1849
#, c-format
msgid "cannot get host-name: %s"
msgstr "nu pot citi numele maşinii: %s"
#: option.c:1882
#: option.c:1878
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:1889
#: option.c:1885
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:1892 network.c:591
#: option.c:1888 network.c:513
#, c-format
msgid "failed to read %s: %m"
msgstr "nu pot citi %s: %n"
#: option.c:1910
#: option.c:1906
#, 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:383
#: forward.c:381
#, c-format
msgid "nameserver %s refused to do a recursive query"
msgstr "serverul DNS %s refuză interogările recursive"
#: forward.c:914
#: 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:71 dnsmasq.c:482
#: isc.c:73 dnsmasq.c:446
#, c-format
msgid "failed to access %s: %m"
msgstr "accesarea serverului %s a eşuat: %n"
#: isc.c:87
#: isc.c:89
#, c-format
msgid "failed to load %s: %m"
msgstr "nu pot încărca %s: %n"
#: isc.c:91 network.c:595
#: isc.c:93 network.c:517
#, c-format
msgid "reading %s"
msgstr "citesc %s"
#: isc.c:113
#: isc.c:115
#, c-format
msgid "bad name in %s"
msgstr "nume invalid în %s"
#: isc.c:175
#: 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:418
#: network.c:340
#, c-format
msgid "failed to create listening socket: %s"
msgstr "creearea socket-ului de ascultare a eşuat: %s"
#: network.c:425
#: network.c:347
#, 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:444
#: network.c:365
#, 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:451
#: network.c:373
#, c-format
msgid "failed to listen on socket: %s"
msgstr "ascultarea pe socket a eşuat: %s"
#: network.c:521
#: network.c:443
#, c-format
msgid "ignoring nameserver %s - local interface"
msgstr "ignorăm serverul DNS %s - interfaţă locală"
#: network.c:530
#: network.c:452
#, 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:544
#: network.c:466
msgid "domain"
msgstr "domeniu"
#: network.c:546
#: network.c:468
msgid "unqualified"
msgstr "invalid"
#: network.c:546
#: network.c:468
msgid "domains"
msgstr "domenii"
#: network.c:549
#: network.c:471
#, c-format
msgid "using local addresses only for %s %s"
msgstr "folosim adresele locale doar pentru %S %s"
#: network.c:551
#: network.c:473
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr "folosim serverul DNS %s#%d pentru %s %s"
#: network.c:554
#: network.c:476
#, c-format
msgid "using nameserver %s#%d"
msgstr "folosim serverul DNS %s#%d"
#: dnsmasq.c:115
#: dnsmasq.c:93
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:119
#: dnsmasq.c:102
#, c-format
msgid "failed to find list of interfaces: %s"
msgstr "enumerarea interfeţelor a eşuat: %s"
#: dnsmasq.c:134
#: dnsmasq.c:117
#, c-format
msgid "unknown interface %s"
msgstr "interfaţă necunoscută %s"
#: dnsmasq.c:140
#: dnsmasq.c:123
#, c-format
msgid "no interface with address %s"
msgstr "nu exista interfaţă pentru adresa %s"
#: dnsmasq.c:149
#, c-format
msgid "cannot open %s:%s"
msgstr "nu pot deschide %s:%s"
#: dnsmasq.c:163
#: dnsmasq.c:141
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:176 dnsmasq.c:520
#: dnsmasq.c:154 dnsmasq.c:522
#, c-format
msgid "DBus error: %s"
msgstr "eroare DBus: %s"
#: dnsmasq.c:179
#: dnsmasq.c:157
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:292
#: dnsmasq.c:192
#, fuzzy, c-format
msgid "cannot create pipe: %s"
msgstr "nu pot citi %s: %s"
#: dnsmasq.c:225
#, c-format
msgid "Cannot set capabilities: %s"
msgstr ""
#: dnsmasq.c:324
#, c-format
msgid "started, version %s cachesize %d"
msgstr "am ponit, versiunea %s memorie temporară %d"
#: dnsmasq.c:294
#: dnsmasq.c:326
#, c-format
msgid "started, version %s cache disabled"
msgstr "am pornit, versiunea %s memorie temporară dezactivată"
#: dnsmasq.c:296
#: dnsmasq.c:328
#, c-format
msgid "compile time options: %s"
msgstr "compilat cu opţiunile: %s"
#: dnsmasq.c:302
#: dnsmasq.c:334
msgid "DBus support enabled: connected to system bus"
msgstr "suportul DBus activ: sunt conectat la magistrala sistem"
#: dnsmasq.c:304
#: dnsmasq.c:336
msgid "DBus support enabled: bus connection pending"
msgstr "suportul DBus activ: aştept conexiunea la magistrală"
#: dnsmasq.c:309
#: dnsmasq.c:341
msgid "setting --bind-interfaces option because of OS limitations"
msgstr "specific opţiunea --bind-interfaces din cauza limitărilor SO"
#: dnsmasq.c:314
#: dnsmasq.c:346
#, c-format
msgid "warning: interface %s does not currently exist"
msgstr "atenţie: interfaţa %s nu există momentan"
#: dnsmasq.c:331
#: dnsmasq.c:358
#, 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:332
#: dnsmasq.c:359
#, c-format
msgid "DHCP, IP range %s -- %s, lease time %s"
msgstr "DHCP, domeniu IP %s -- %s, timpul reînoirii %s"
#: dnsmasq.c:343
#, c-format
msgid "DHCP, %s will be written every %s"
msgstr "DHCP, %s va fi rescris odată la fiecare %s"
#: dnsmasq.c:348
#: dnsmasq.c:365
msgid "running as root"
msgstr "rulez ca root"
#: dnsmasq.c:522
msgid "connected to system DBus"
msgstr "magistrala sistem Dbus conectată"
#: dnsmasq.c:533
#: dnsmasq.c:497
msgid "exiting on receipt of SIGTERM"
msgstr "am primit SIGTERM, am terminat"
#: dhcp.c:25
#: dnsmasq.c:524
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:35
#: dhcp.c:42
#, c-format
msgid "failed to set options on DHCP socket: %s"
msgstr "configurarea opţiunilor socketului DHCP a eşuat: %s"
#: dhcp.c:42
#: dhcp.c:49
#, c-format
msgid "failed to set SO_REUSEADDR on DHCP socket: %s"
msgstr "configurarea SO_REUSEADDR pe socket-ul DHCP a eşuat: %s"
#: dhcp.c:52
#: dhcp.c:59
#, c-format
msgid "failed to bind DHCP server socket: %s"
msgstr "activarea socket-ului server-ului DHCP a eşuat: %s"
#: dhcp.c:61
#: dhcp.c:72
#, c-format
msgid "cannot create ICMP raw socket: %s."
msgstr "nu pot creea socket ICMP raw: %s."
#: dhcp.c:75
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "nu pot creea socket DHCP BPF: %s"
#: dhcp.c:86
#, c-format
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 ?"
#: dhcp.c:98
#: dhcp.c:84
#, c-format
msgid "duplicate IP address %s in dhcp-config directive."
msgstr "adresă IP duplicat %s în declaraţia dhcp-config."
#: dhcp.c:234
msgid "Cannot use RTnetlink socket, falling back to ioctl API"
msgstr ""
#: dhcp.c:345
#, c-format
msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
msgstr "cerere DHCP pentru dispozitiv nesuportat (%d) recepţionată prin %s"
#: dhcp.c:413
#: dhcp.c:306
#, 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:722
#: dhcp.c:622
#, c-format
msgid "failed to read %s:%m"
msgstr "citirea %s:%n a eşuat"
#: dhcp.c:741
#: dhcp.c:641
#, c-format
msgid "bad line at %s line %d"
msgstr "linie invalidă în %s rândul %d"
#: dhcp.c:845
#: dhcp.c:745
#, 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:881
#: dhcp.c:781
#, 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:38
#: lease.c:34
#, c-format
msgid "cannot open or create leases file: %s"
msgstr "nu pot creea sau deschide fişierul cu împrumuturi: %s"
#: lease.c:80
#: lease.c:71
msgid "too many stored leases"
msgstr "prea multe împrumuturi stocate"
#: lease.c:179
#, fuzzy
msgid "failed to write"
msgstr "citirea %s:%n a eşuat"
#: lease.c:118
#, fuzzy, c-format
msgid "failed to write %s: %m (retry in %ds)"
msgstr "nu pot citi %s: %n"
#: rfc2131.c:218
#: rfc2131.c:247
#, c-format
msgid "no address range available for DHCP request %s %s"
msgstr "nici un domeniu de adrese disponibil pentru cererea DHCP %s %s"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "with subnet selector"
msgstr "cu selectorul de subreţea"
#: rfc2131.c:219
#: rfc2131.c:248
msgid "via"
msgstr "prin"
#: rfc2131.c:240 rfc2131.c:264
#: rfc2131.c:274 rfc2131.c:298
msgid "disabled"
msgstr "dezactivat"
#: rfc2131.c:275 rfc2131.c:674
#: rfc2131.c:310 rfc2131.c:731
msgid "address in use"
msgstr "adresa este folosită"
#: rfc2131.c:278
#: rfc2131.c:313
msgid "no address configured"
msgstr "adresă lipsă"
#: rfc2131.c:291 rfc2131.c:546
#: rfc2131.c:326 rfc2131.c:605
msgid "no address available"
msgstr "nici o adresă disponibilă"
#: rfc2131.c:298 rfc2131.c:677
#: rfc2131.c:333 rfc2131.c:734
msgid "no leases left"
msgstr "nu mai am de unde să împrumut"
#: rfc2131.c:301 rfc2131.c:650
#: rfc2131.c:336 rfc2131.c:707
msgid "wrong network"
msgstr "reţea greşită"
#: rfc2131.c:505
#: rfc2131.c:540
#, c-format
msgid "disabling DHCP static address %s"
msgstr "dezactivăm adresele DHCP statice %s"
#: rfc2131.c:523
#: rfc2131.c:558
msgid "unknown lease"
msgstr "împrumut necunoscut"
#: rfc2131.c:536 rfc2131.c:749
#: rfc2131.c:567 rfc2131.c:799
msgid "ignored"
msgstr "ignorat"
#: rfc2131.c:619
#: rfc2131.c:581
#, c-format
msgid "not using configured address %s because it is leased to %s"
msgstr ""
#: rfc2131.c:590
#, c-format
msgid "not using configured address %s because it is in use by the server"
msgstr ""
#: rfc2131.c:670
msgid "wrong address"
msgstr "adresă greşită"
#: rfc2131.c:632
#: rfc2131.c:683
msgid "lease not found"
msgstr "împrumutul nu a fost găsit"
#: rfc2131.c:658
#: rfc2131.c:715
msgid "address not available"
msgstr "adresă indisponibilă"
#: rfc2131.c:667
#: rfc2131.c:724
msgid "static lease available"
msgstr "împrumut static este disponibil"
#: rfc2131.c:671
#: rfc2131.c:728
msgid "address reserved"
msgstr "adresă rezervată"
#: rfc2131.c:871
#: rfc2131.c:946
#, c-format
msgid "cannot send DHCP option %d: no space left in packet"
msgstr "nu pot trimite opţiunea DHCP %d: nu mai este loc în pachet"
#: rfc2131.c:1174
#: rfc2131.c:1247
#, c-format
msgid "More than one vendor class matches, using %s"
msgstr "Se potrivesc mai multe clase de mărci de interfeţe, folosim %s"
#: netlink.c:41
#, c-format
msgid "cannot bind netlink socket: %s"
#, fuzzy, c-format
msgid "cannot create RTnetlink socket: %s"
msgstr "nu pot să activez socket-ul netlink: %s"
#: netlink.c:208
#, c-format
msgid "RTnetlink returns error: %s"
msgstr ""
#: dbus.c:112
msgid "attempt to set an IPv6 server address via DBus - no IPv6 support"
msgstr "incerc să configurez un server IPv6 prin Dbus - nu este suport IPv6"
#: dbus.c:237
#: dbus.c:238
msgid "setting upstream servers from DBus"
msgstr "configurăm serverele superioare prin Dbus"
#: dbus.c:273
#: dbus.c:274
msgid "could not register a DBus message handler"
msgstr "nu pot activa o interfaţă de mesaje DBus"
#: bpf.c:54
#, c-format
msgid "cannot create DHCP BPF socket: %s"
msgstr "nu pot creea socket DHCP BPF: %s"
#: bpf.c:74
#, fuzzy, c-format
msgid "DHCP request for unsupported hardware type (%d) received on %s"
msgstr "cerere DHCP pentru dispozitiv nesuportat (%d) recepţionată prin %s"
#~ msgid "cannot open %s:%s"
#~ msgstr "nu pot deschide %s:%s"
#~ msgid "DHCP, %s will be written every %s"
#~ msgstr "DHCP, %s va fi rescris odată la fiecare %s"
#~ msgid ""
#~ "cannot create DHCP packet socket: %s. Is CONFIG_PACKET enabled in your "
#~ "kernel?"
#~ msgstr ""
#~ "nu pot creea socket DHCP packet: %s. Aveţi activată în nucleulsistemului "
#~ "opţiunea CONFIG_PACKET ?"
......@@ -20,13 +20,4 @@
#define IP6INTERFACES "/proc/net/if_inet6"
#define UPTIME "/proc/uptime"
#define DHCP_SERVER_PORT 67
@@ -195,8 +195,8 @@
/* platform independent options. */
#undef HAVE_BROKEN_RTC
-#define HAVE_ISC_READER
+#undef HAVE_ISC_READER
#undef HAVE_DBUS
#if defined(HAVE_BROKEN_RTC) && defined(HAVE_ISC_READER)
# error HAVE_ISC_READER is not compatible with HAVE_BROKEN_RTC
/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 dated June, 1991.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "dnsmasq.h"
#ifndef HAVE_LINUX_NETWORK
#include <net/bpf.h>
static struct iovec ifconf = {
.iov_base = NULL,
.iov_len = 0
};
static struct iovec ifreq = {
.iov_base = NULL,
.iov_len = 0
};
struct header {
struct ether_header ether;
struct ip ip;
struct udphdr {
u16 uh_sport; /* source port */
u16 uh_dport; /* destination port */
u16 uh_ulen; /* udp length */
u16 uh_sum; /* udp checksum */
} udp;
};
void init_bpf(struct daemon *daemon)
{
int i = 0;
while (1)
{
/* useful size which happens to be sufficient */
if (expand_buf(&ifreq, sizeof(struct ifreq)))
{
sprintf(ifreq.iov_base, "/dev/bpf%d", i++);
if ((daemon->dhcp_raw_fd = open(ifreq.iov_base, O_RDWR, 0)) != -1)
return;
}
if (errno != EBUSY)
die(_("cannot create DHCP BPF socket: %s"), NULL);
}
}
void send_via_bpf(struct daemon *daemon, struct dhcp_packet *mess, size_t len,
struct in_addr iface_addr, struct ifreq *ifr)
{
/* Hairy stuff, packet either has to go to the
net broadcast or the destination can't reply to ARP yet,
but we do know the physical address.
Build the packet by steam, and send directly, bypassing
the kernel IP stack */
struct header header;
u32 i, sum;
struct iovec iov[2];
/* Only know how to do ethernet on *BSD */
if (mess->htype != ARPHRD_ETHER || mess->hlen != ETHER_ADDR_LEN)
{
syslog(LOG_WARNING, _("DHCP request for unsupported hardware type (%d) received on %s"),
mess->htype, ifr->ifr_name);
return;
}
ifr->ifr_addr.sa_family = AF_LINK;
if (ioctl(daemon->dhcpfd, SIOCGIFADDR, ifr) < 0)
return;
memcpy(header.ether.ether_shost, LLADDR((struct sockaddr_dl *)&ifr->ifr_addr), ETHER_ADDR_LEN);
header.ether.ether_type = htons(ETHERTYPE_IP);
if (ntohs(mess->flags) & 0x8000)
{
memset(header.ether.ether_dhost, 255, ETHER_ADDR_LEN);
header.ip.ip_dst.s_addr = INADDR_BROADCAST;
}
else
{
memcpy(header.ether.ether_dhost, mess->chaddr, ETHER_ADDR_LEN);
header.ip.ip_dst.s_addr = mess->yiaddr.s_addr;
}
header.ip.ip_p = IPPROTO_UDP;
header.ip.ip_src.s_addr = iface_addr.s_addr;
header.ip.ip_len = htons(sizeof(struct ip) +
sizeof(struct udphdr) +
len) ;
header.ip.ip_hl = sizeof(struct ip) / 4;
header.ip.ip_v = IPVERSION;
header.ip.ip_tos = 0;
header.ip.ip_id = htons(0);
header.ip.ip_off = htons(0x4000); /* don't fragment */
header.ip.ip_ttl = IPDEFTTL;
header.ip.ip_sum = 0;
for (sum = 0, i = 0; i < sizeof(struct ip) / 2; i++)
sum += ((u16 *)&header.ip)[i];
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
header.ip.ip_sum = (sum == 0xffff) ? sum : ~sum;
header.udp.uh_sport = htons(DHCP_SERVER_PORT);
header.udp.uh_dport = htons(DHCP_CLIENT_PORT);
if (len & 1)
((char *)mess)[len] = 0; /* for checksum, in case length is odd. */
header.udp.uh_sum = 0;
header.udp.uh_ulen = sum = htons(sizeof(struct udphdr) + len);
sum += htons(IPPROTO_UDP);
for (i = 0; i < 4; i++)
sum += ((u16 *)&header.ip.ip_src)[i];
for (i = 0; i < sizeof(struct udphdr)/2; i++)
sum += ((u16 *)&header.udp)[i];
for (i = 0; i < (len + 1) / 2; i++)
sum += ((u16 *)mess)[i];
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
header.udp.uh_sum = (sum == 0xffff) ? sum : ~sum;
ioctl(daemon->dhcp_raw_fd, BIOCSETIF, ifr);
iov[0].iov_base = &header;
iov[0].iov_len = sizeof(struct header);
iov[1].iov_base = mess;
iov[1].iov_len = len;
while (writev(daemon->dhcp_raw_fd, iov, 2) == -1 && retry_send());
}
int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), int (*ipv6_callback)())
{
char *ptr;
struct ifreq *ifr, ifaux;
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);
strncpy(ifaux.ifr_name, ifr->ifr_name, IF_NAMESIZE);
if (ifr->ifr_addr.sa_family == AF_INET && ipv4_callback)
{
struct in_addr addr, netmask, broadcast;
if (ioctl(fd, SIOCGIFINDEX, &ifaux) == -1)
continue;
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)ifaux.ifr_index, 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 (ioctl(fd, SIOCGIFINDEX, &ifaux) == -1)
continue;
if (!((*ipv6_callback)(daemon, addr,
(int)((struct sockaddr_in6 *)&ifr->ifr_addr)->sin6_scope_id,
(int)ifaux.ifr_index,
parm)))
goto err;
}
#endif
}
ret = 1;
err:
errsav = errno;
close(fd);
errno = errsav;
return ret;
}
#endif
......@@ -18,6 +18,7 @@ static int cache_inserted, cache_live_freed, insert_error;
static union bigname *big_free;
static int bignames_left, log_queries, cache_size, hash_size;
static int uid;
static char *addrbuff;
static void cache_free(struct crec *crecp);
static void cache_unlink(struct crec *crecp);
......@@ -29,7 +30,11 @@ void cache_init(int size, int logq)
struct crec *crecp;
int i;
log_queries = logq;
if ((log_queries = logq))
addrbuff = safe_malloc(ADDRSTRLEN);
else
addrbuff = NULL;
cache_head = cache_tail = NULL;
dhcp_inuse = dhcp_spare = NULL;
new_chain = NULL;
......@@ -762,17 +767,17 @@ void cache_add_dhcp_entry(struct daemon *daemon, char *host_name,
void dump_cache(struct daemon *daemon)
void dump_cache(struct daemon *daemon, time_t now)
{
syslog(LOG_INFO, _("cache size %d, %d/%d cache insertions re-used unexpired cache entries."),
daemon->cachesize, cache_live_freed, cache_inserted);
syslog(LOG_INFO, _("time %lu, cache size %d, %d/%d cache insertions re-used unexpired cache entries."),
(unsigned long)now, daemon->cachesize, cache_live_freed, cache_inserted);
if (daemon->options & (OPT_DEBUG | OPT_LOG))
if ((daemon->options & (OPT_DEBUG | OPT_LOG)) &&
(addrbuff || (addrbuff = malloc(ADDRSTRLEN))))
{
struct crec *cache ;
char addrbuff[ADDRSTRLEN];
int i;
syslog(LOG_DEBUG, "Host Address Flags Expires\n");
syslog(LOG_DEBUG, "Host Address Flags Expires");
for (i=0; i<hash_size; i++)
for (cache = hash_table[i]; cache; cache = cache->hash_next)
......@@ -797,7 +802,7 @@ void dump_cache(struct daemon *daemon)
#endif
syslog(LOG_DEBUG,
#ifdef HAVE_BROKEN_RTC
"%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %ld\n",
"%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %lu",
#else
"%-40.40s %-30.30s %s%s%s%s%s%s%s%s%s%s %s",
#endif
......@@ -813,7 +818,7 @@ void dump_cache(struct daemon *daemon)
cache->flags & F_NXDOMAIN ? "X" : " ",
cache->flags & F_HOSTS ? "H" : " ",
#ifdef HAVE_BROKEN_RTC
cache->flags & F_IMMORTAL ? 0: (unsigned long)cache->ttd
cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now)
#else
cache->flags & F_IMMORTAL ? "\n" : ctime(&(cache->ttd))
#endif
......@@ -844,7 +849,6 @@ void log_query(unsigned short flags, char *name, struct all_addr *addr,
char *source;
char *verb = "is";
char types[20];
char addrbuff[ADDRSTRLEN];
if (!log_queries)
return;
......
......@@ -10,9 +10,7 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#define VERSION "2.27"
#define VERSION "2.28"
#define FTABSIZ 150 /* max number of outstanding requests */
#define MAX_PROCS 20 /* max no children for TCP requests */
......@@ -22,8 +20,10 @@
#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
#define LOGRATE 120 /* log table overflows every LOGRATE seconds */
#define CACHESIZ 150 /* default cache size */
#define MAXTOK 50 /* token in DHCP leases */
#define MAXLEASES 150 /* maximum number of DHCP leases */
#define PING_WAIT 3 /* wait for ping address-in-use test */
#define PING_CACHE_TIME 30 /* Ping test assumed to be valid this long. */
#define DHCP_PACKET_MAX 16384 /* hard limit on DHCP packet size */
#define SMALLDNAME 40 /* most domain names are smaller than this */
#define HOSTSFILE "/etc/hosts"
#define ETHERSFILE "/etc/ethers"
......@@ -46,8 +46,6 @@
#define DEFLEASE 3600 /* default lease time, 1 hour */
#define CHUSER "nobody"
#define CHGRP "dip"
#define IP6INTERFACES "/proc/net/if_inet6"
#define UPTIME "/proc/uptime"
#define DHCP_SERVER_PORT 67
#define DHCP_CLIENT_PORT 68
......@@ -89,26 +87,25 @@
new system, you may want to edit these.
May replace this with Autoconf one day.
HAVE_LINUX_IPV6_PROC
define this to do IPv6 interface discovery using
proc/net/if_inet6 ala LINUX.
HAVE_LINUX_NETWORK
define this to do networking the Linux way. When it's defined, the code will
use IP_PKTINFO, Linux capabilities and the RTnetlink system. If it's not defined,
a few facilities will be lost, namely support for multiple addresses on an interface,
DNS query retransmission, and (on some systems) wildcard interface binding.
HAVE_BROKEN_RTC
define this on embeded systems which don't have an RTC
which keeps time over reboots. Causes dnsmasq to use uptime()
for timing, and keep relative time values in its leases file.
Also enables "Flash disk mode". Normally, dnsmasq tries very hard to
keep the on-disk leases file up-to-date: rewriting it after every change.
When HAVE_BROKEN_RTC is in effect, a different regime is used:
The leases file is written when dnsmasq terminates, when it receives
SIGALRM, when a brand new lease is allocated, or every n seconds,
where n is one third of the smallest time configured for leases
in a --dhcp-range or --dhcp-host option.
define this on embedded systems which don't have an RTC
which keeps time over reboots. Causes dnsmasq to use uptime
for timing, and keep lease lengths rather than expiry times
in its leases file. This also make dnsmasq "flash disk friendly".
Normally, dnsmasq tries very hard to keep the on-disk leases file
up-to-date: rewriting it after every renewal. When HAVE_BROKEN_RTC
is in effect, the lease file is only written when a new lease is
created, or an old one destroyed. (Because those are the only times
it changes.) This vastly reduces the number of file writes, and makes
it viable to keep the lease file on a flash filesystem.
NOTE: when enabling or disabling this, be sure to delete any old
leases file, otherwise dnsmasq may get very confused.
This configuration currently only works on Linux, but could be made to
work on other systems by teaching dnsmasq_time() in utils.c how to
read the system uptime.
HAVE_ISC_READER
define this to include the old ISC dhcpcd integration. Note that you cannot
......@@ -137,18 +134,6 @@ HAVE_DEV_URANDOM
HAVE_SOCKADDR_SA_LEN
define this if struct sockaddr has sa_len field (*BSD)
HAVE_PSELECT
If your C library implements pselect, define this.
HAVE_BPF
If your OS implements Berkeley Packet filter, define this.
HAVE_RTNETLINK
If your OS has the Linux Routing netlink socket API and suitable
C library headers, define this. Note that the code will fall
back to the Berkley API at runtime if netlink support is not
configured into the kernel.
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
......@@ -156,12 +141,11 @@ HAVE_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_RTNETLINK
you should NOT define
HAVE_ARC4RANDOM
HAVE_SOCKADDR_SA_LEN
......@@ -169,10 +153,8 @@ NOTES:
For *BSD systems you should define
HAVE_SOCKADDR_SA_LEN
HAVE_RANDOM
HAVE_BPF
you should NOT define
HAVE_LINUX_IPV6_PROC
HAVE_RTNETLINK
HAVE_LINUX_NETWORK
and you MAY define
HAVE_ARC4RANDOM - OpenBSD and FreeBSD and NetBSD version 2.0 or later
HAVE_DEV_URANDOM - OpenBSD and FreeBSD and NetBSD
......@@ -185,7 +167,7 @@ NOTES:
/* platform independent options. */
#undef HAVE_BROKEN_RTC
#define HAVE_ISC_READER
#undef HAVE_ISC_READER
#undef HAVE_DBUS
#if defined(HAVE_BROKEN_RTC) && defined(HAVE_ISC_READER)
......@@ -196,76 +178,47 @@ NOTES:
/* Must preceed __linux__ since uClinux defines __linux__ too. */
#if defined(__uClinux__)
#define HAVE_LINUX_IPV6_PROC
#define HAVE_LINUX_NETWORK
#define HAVE_GETOPT_LONG
#define HAVE_RTNETLINK
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
/* 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_IPV6_PROC
#define HAVE_LINUX_NETWORK
#if defined(__UCLIBC_HAS_GNU_GETOPT__) || \
((__UCLIBC_MAJOR__==0) && (__UCLIBC_MINOR__==9) && (__UCLIBC_SUBLEVEL__<21))
# define HAVE_GETOPT_LONG
# else
#else
# undef HAVE_GETOPT_LONG
# endif
#define HAVE_RTNETLINK
#endif
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#if !defined(__ARCH_HAS_MMU__)
#if !defined(__UCLIBC_HAS_MMU__)
# define NO_FORK
#endif
#if !defined(__UCLIBC_HAS_IPV6__)
# define NO_IPV6
#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
#undef HAVE_RTNETLINK
#define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
/* Fix various misfeatures of libc5 headers */
typedef unsigned long in_addr_t;
typedef size_t socklen_t;
/* This is for glibc 2.x */
#elif defined(__linux__)
#define HAVE_LINUX_IPV6_PROC
#define HAVE_RTNETLINK
#define HAVE_LINUX_NETWORK
#define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#undef HAVE_SOCKADDR_SA_LEN
#define HAVE_PSELECT
/* glibc < 2.2 has broken Sockaddr_in6 so we have to use our own. */
/* glibc < 2.2 doesn't define in_addr_t */
#if defined(__GLIBC__) && (__GLIBC__ == 2) && \
......@@ -275,8 +228,7 @@ typedef unsigned long in_addr_t;
#endif
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_RTNETLINK
#undef HAVE_LINUX_NETWORK
/* Later verions of FreeBSD have getopt_long() */
#if defined(optional_argument) && defined(required_argument)
# define HAVE_GETOPT_LONG
......@@ -287,51 +239,29 @@ typedef unsigned long in_addr_t;
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
#elif defined(__APPLE__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_RTNETLINK
#undef HAVE_LINUX_NETWORK
#undef HAVE_GETOPT_LONG
#define HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
/* Define before sys/socket.h is included so we get socklen_t */
#define _BSD_SOCKLEN_T_
/* This is not defined in Mac OS X arpa/nameserv.h */
#define IN6ADDRSZ 16
#elif defined(__NetBSD__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_RTNETLINK
#undef HAVE_LINUX_NETWORK
#define HAVE_GETOPT_LONG
#undef HAVE_ARC4RANDOM
#define HAVE_RANDOM
#define HAVE_DEV_URANDOM
#define HAVE_DEV_RANDOM
#define HAVE_SOCKADDR_SA_LEN
#undef HAVE_PSELECT
#define HAVE_BPF
/* env "LIBS=-lsocket -lnsl" make */
#elif defined(__sun) || defined(__sun__)
#undef HAVE_LINUX_IPV6_PROC
#undef HAVE_RTNETLINK
#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 */
......@@ -353,4 +283,3 @@ typedef unsigned long in_addr_t;
#endif
......@@ -113,13 +113,14 @@ static void dbus_read_servers(struct daemon *daemon, DBusMessage *message)
#else
if (i == sizeof(struct in6_addr)-1)
{
memcpy(&addr.in6.sin6_addr, p, sizeof(struct in6_addr));
memcpy(&addr.in6.sin6_addr, p, sizeof(addr.in6));
#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(addr.in6);
#endif
source_addr.in6.sin6_family = addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_port = htons(NAMESERVER_PORT);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = htonl(0);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = 0;
source_addr.in6.sin6_scope_id = addr.in6.sin6_scope_id = 0;
source_addr.in6.sin6_addr = in6addr_any;
source_addr.in6.sin6_port = htons(daemon->query_port);
skip = 0;
......@@ -216,7 +217,7 @@ static void dbus_read_servers(struct daemon *daemon, DBusMessage *message)
}
DBusHandlerResult message_handler (DBusConnection *connection,
DBusHandlerResult message_handler(DBusConnection *connection,
DBusMessage *message,
void *user_data)
{
......@@ -239,7 +240,7 @@ DBusHandlerResult message_handler (DBusConnection *connection,
check_servers(daemon);
}
else if (strcmp(method, "ClearCache") == 0)
clear_cache_and_reload(daemon, dnsmasq_time(daemon->uptime_fd));
clear_cache_and_reload(daemon);
else
return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
......
......@@ -10,15 +10,22 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
struct iface_param {
struct in_addr relay, primary;
struct dhcp_context *current;
int ind;
};
static int complete_context(struct daemon *daemon, struct in_addr local, int if_index,
struct in_addr netmask, struct in_addr broadcast, void *vparam);
void dhcp_init(struct daemon *daemon)
{
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in saddr;
int flags, oneopt = 1, zeroopt = 0;
int flags, oneopt = 1;
struct dhcp_config *configs, *cp;
if (fd == -1)
......@@ -26,7 +33,7 @@ void dhcp_init(struct daemon *daemon)
if ((flags = fcntl(fd, F_GETFL, 0)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
setsockopt(fd, SOL_IP, IP_PKTINFO, &oneopt, sizeof(oneopt)) == -1 ||
#elif defined(IP_RECVIF)
setsockopt(fd, IPPROTO_IP, IP_RECVIF, &oneopt, sizeof(oneopt)) == -1 ||
......@@ -53,42 +60,21 @@ void dhcp_init(struct daemon *daemon)
daemon->dhcpfd = fd;
if ((fd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1 ||
(flags = fcntl(fd, F_GETFL, 0)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &oneopt, sizeof(oneopt)) == -1 ||
setsockopt(fd, SOL_SOCKET, SO_DONTROUTE, &zeroopt, sizeof(zeroopt)) == -1)
die(_("cannot create ICMP raw socket: %s."), NULL);
#ifndef HAVE_LINUX_NETWORK
/* When we're not using capabilities, we need to do this here before
we drop root. Also, set buffer size small, to avoid wasting
kernel buffers */
daemon->dhcp_icmp_fd = fd;
if (daemon->options & OPT_NO_PING)
daemon->dhcp_icmp_fd = -1;
else if ((daemon->dhcp_icmp_fd = make_icmp_sock()) == -1 ||
setsockopt(daemon->dhcp_icmp_fd, SOL_SOCKET, SO_RCVBUF, &oneopt, sizeof(oneopt)) == -1 )
die(_("cannot create ICMP raw socket: %s."), NULL);
#ifdef HAVE_BPF
{
int i = 0;
while (1)
{
char filename[50];
sprintf(filename, "/dev/bpf%d", i++);
if ((fd = open(filename, O_RDWR, 0)) != -1)
break;
if (errno != EBUSY)
die(_("cannot create DHCP BPF socket: %s"), NULL);
}
}
#else
/* since we don't ever use the packet socket for reception,
and it receives copies of _all_ IP packets, then that data
will build up in kernel buffers, wasting memory. Set the
socket receive buffer size to one to avoid that. (zero is
rejected as non-sensical by some BSD kernels) */
if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETHERTYPE_IP))) == -1 ||
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &oneopt, sizeof(oneopt)) == -1)
die(_("cannot create DHCP packet socket: %s. "
"Is CONFIG_PACKET enabled in your kernel?"), NULL);
/* Make BPF raw send socket */
init_bpf(daemon);
#endif
daemon->dhcp_raw_fd = fd;
/* If the same IP appears in more than one host config, then DISCOVER
for one of the hosts will get the address, but REQUEST will be NAKed,
since the address is reserved by the other one -> protocol loop. */
......@@ -97,7 +83,8 @@ void dhcp_init(struct daemon *daemon)
if ((configs->flags & cp->flags & CONFIG_ADDR) && configs->addr.s_addr == cp->addr.s_addr)
die(_("duplicate IP address %s in dhcp-config directive."), inet_ntoa(cp->addr));
daemon->dhcp_packet = safe_malloc(sizeof(struct udp_dhcp_packet));
daemon->dhcp_packet.iov_len = sizeof(struct dhcp_packet);
daemon->dhcp_packet.iov_base = safe_malloc(daemon->dhcp_packet.iov_len);
/* These two each hold a DHCP option max size 255
and get a terminating zero added */
daemon->dhcp_buff = safe_malloc(256);
......@@ -107,48 +94,57 @@ void dhcp_init(struct daemon *daemon)
void dhcp_packet(struct daemon *daemon, time_t now)
{
struct udp_dhcp_packet *rawpacket = daemon->dhcp_packet;
struct dhcp_packet *mess = &rawpacket->data;
struct dhcp_packet *mess;
struct dhcp_context *context;
struct iname *tmp;
struct ifreq ifr;
struct msghdr msg;
struct iovec iov[2];
struct sockaddr_in dest;
struct cmsghdr *cmptr;
struct iovec iov;
ssize_t sz;
size_t newlen;
int iface_index = 0, unicast_dest = 0;
struct in_addr iface_addr;
#ifdef HAVE_BPF
unsigned char iface_hwaddr[ETHER_ADDR_LEN];
#endif
struct iface_param parm;
union {
struct cmsghdr align; /* this ensures alignment */
#ifdef IP_PKTINFO
#ifdef HAVE_LINUX_NETWORK
char control[CMSG_SPACE(sizeof(struct in_pktinfo))];
#else
char control[CMSG_SPACE(sizeof(struct sockaddr_dl))];
#endif
} control_u;
iov[0].iov_base = (char *)mess;
iov[0].iov_len = sizeof(struct dhcp_packet);
msg.msg_control = control_u.control;
msg.msg_controllen = sizeof(control_u);
msg.msg_flags = 0;
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = iov;
msg.msg_iov = &daemon->dhcp_packet;
msg.msg_iovlen = 1;
sz = recvmsg(daemon->dhcpfd, &msg, 0);
do
{
msg.msg_flags = 0;
while ((sz = recvmsg(daemon->dhcpfd, &msg, MSG_PEEK)) == -1 && errno == EINTR);
}
while (sz != -1 && (msg.msg_flags & MSG_TRUNC) &&
expand_buf(&daemon->dhcp_packet, daemon->dhcp_packet.iov_len + 100));
if (sz < (ssize_t)(sizeof(*mess) - sizeof(mess->options)))
/* expand_buf may have moved buffer */
mess = daemon->dhcp_packet.iov_base;
msg.msg_controllen = sizeof(control_u);
msg.msg_flags = 0;
msg.msg_name = &dest;
msg.msg_namelen = sizeof(dest);
while ((sz = recvmsg(daemon->dhcpfd, &msg, 0)) && errno == EINTR);
if ((msg.msg_flags & MSG_TRUNC) ||
sz < (ssize_t)(sizeof(*mess) - sizeof(mess->options)))
return;
#if defined (IP_PKTINFO)
#if defined (HAVE_LINUX_NETWORK)
if (msg.msg_controllen < sizeof(struct cmsghdr))
return;
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
......@@ -178,225 +174,122 @@ void dhcp_packet(struct daemon *daemon, time_t now)
struct iname *name;
for (name = daemon->if_names; name->isloop; name = name->next);
strcpy(ifr.ifr_name, name->name);
iface_index = if_nametoindex(name->name);
}
#endif
#ifdef HAVE_BPF
ifr.ifr_addr.sa_family = AF_LINK;
if (ioctl(daemon->dhcpfd, SIOCGIFADDR, &ifr) < 0)
return;
memcpy(iface_hwaddr, LLADDR((struct sockaddr_dl *)&ifr.ifr_addr), ETHER_ADDR_LEN);
#endif
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl(daemon->dhcpfd, SIOCGIFADDR, &ifr) < 0 )
return;
iface_addr = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
/* enforce available interface configuration */
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
return;
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
return;
if (daemon->if_names || daemon->if_addrs)
{
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
break;
if (!tmp)
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (tmp->addr.sa.sa_family == AF_INET &&
tmp->addr.in.sin_addr.s_addr == iface_addr.s_addr)
break;
if (!tmp)
if (!iface_check(daemon, AF_INET, (struct all_addr *)&iface_addr, ifr.ifr_name))
return;
}
/* unlinked contexts are marked by context->current == context */
for (context = daemon->dhcp; context; context = context->next)
context->current = context;
#ifdef HAVE_RTNETLINK
if (!netlink_process(daemon, iface_index, mess->giaddr, iface_addr, &context))
#endif
{
struct in_addr iface_netmask, iface_broadcast;
#ifdef HAVE_RTNETLINK
static int warned = 0;
parm.relay = mess->giaddr;
parm.primary = iface_addr;
parm.current = NULL;
parm.ind = iface_index;
if (!warned)
{
syslog(LOG_WARNING, _("Cannot use RTnetlink socket, falling back to ioctl API"));
warned = 1;
}
#endif
if (ioctl(daemon->dhcpfd, SIOCGIFNETMASK, &ifr) < 0)
if (!iface_enumerate(daemon, &parm, complete_context, NULL))
return;
iface_netmask = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
if (ioctl(daemon->dhcpfd, SIOCGIFBRDADDR, &ifr) < 0)
return;
iface_broadcast = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
context = complete_context(daemon, iface_addr, NULL, iface_netmask,
iface_broadcast, mess->giaddr, iface_addr);
}
lease_prune(NULL, now); /* lose any expired leases */
newlen = dhcp_reply(daemon, context, ifr.ifr_name, (size_t)sz, now, unicast_dest);
lease_update_file(daemon, 0, now);
iov.iov_len = dhcp_reply(daemon, parm.current, ifr.ifr_name, (size_t)sz, now, unicast_dest);
lease_update_file(daemon);
lease_update_dns(daemon);
if (newlen == 0)
if (iov.iov_len == 0)
return;
if (mess->giaddr.s_addr || mess->ciaddr.s_addr)
{
/* To send to BOOTP relay or configured client, use the IP packet */
msg.msg_name = &dest;
msg.msg_namelen = sizeof(dest);
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_iov = &iov;
iov.iov_base = daemon->dhcp_packet.iov_base;
/* packet buffer may have moved */
mess = daemon->dhcp_packet.iov_base;
struct sockaddr_in dest;
dest.sin_family = AF_INET;
#ifdef HAVE_SOCKADDR_SA_LEN
dest.sin_len = sizeof(struct sockaddr_in);
#endif
if (mess->giaddr.s_addr)
{
/* Send to BOOTP relay */
if (!dest.sin_port)
dest.sin_port = htons(DHCP_SERVER_PORT);
dest.sin_addr = mess->giaddr;
}
else
else if (mess->ciaddr.s_addr)
{
dest.sin_port = htons(DHCP_CLIENT_PORT);
dest.sin_addr = mess->ciaddr;
if (!dest.sin_port)
dest.sin_port = htons(DHCP_CLIENT_PORT);
}
while(sendto(daemon->dhcpfd, mess, newlen, 0,
(struct sockaddr *)&dest, sizeof(dest)) == -1 &&
retry_send());
}
else
#ifdef HAVE_LINUX_NETWORK
else if (ntohs(mess->flags) & 0x8000)
{
/* 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 */
u32 i, sum;
unsigned char hwdest[DHCP_CHADDR_MAX];
if (ntohs(mess->flags) & 0x8000)
{
memset(hwdest, 255, mess->hlen);
rawpacket->ip.ip_dst.s_addr = INADDR_BROADCAST;
/* broadcast to 255.255.255.255 */
struct in_pktinfo *pkt;
msg.msg_controllen = sizeof(control_u);
cmptr = CMSG_FIRSTHDR(&msg);
dest.sin_addr.s_addr = INADDR_BROADCAST;
dest.sin_port = htons(DHCP_CLIENT_PORT);
pkt = (struct in_pktinfo *)CMSG_DATA(cmptr);
pkt->ipi_ifindex = iface_index;
pkt->ipi_spec_dst.s_addr = 0;
msg.msg_controllen = cmptr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
cmptr->cmsg_level = SOL_IP;
cmptr->cmsg_type = IP_PKTINFO;
}
else
{
memcpy(hwdest, mess->chaddr, mess->hlen);
rawpacket->ip.ip_dst.s_addr = mess->yiaddr.s_addr;
}
rawpacket->ip.ip_p = IPPROTO_UDP;
rawpacket->ip.ip_src.s_addr = iface_addr.s_addr;
rawpacket->ip.ip_len = htons(sizeof(struct ip) +
sizeof(struct udphdr) +
newlen) ;
rawpacket->ip.ip_hl = sizeof(struct ip) / 4;
rawpacket->ip.ip_v = IPVERSION;
rawpacket->ip.ip_tos = 0;
rawpacket->ip.ip_id = htons(0);
rawpacket->ip.ip_off = htons(0x4000); /* don't fragment */
rawpacket->ip.ip_ttl = IPDEFTTL;
rawpacket->ip.ip_sum = 0;
for (sum = 0, i = 0; i < sizeof(struct ip) / 2; i++)
sum += ((u16 *)&rawpacket->ip)[i];
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
rawpacket->ip.ip_sum = (sum == 0xffff) ? sum : ~sum;
rawpacket->udp.uh_sport = htons(DHCP_SERVER_PORT);
rawpacket->udp.uh_dport = htons(DHCP_CLIENT_PORT);
if (newlen & 1)
((u8 *)&rawpacket->data)[newlen] = 0; /* for checksum, in case length is odd. */
rawpacket->udp.uh_sum = 0;
rawpacket->udp.uh_ulen = sum = htons(sizeof(struct udphdr) + newlen);
sum += htons(IPPROTO_UDP);
for (i = 0; i < 4; i++)
sum += ((u16 *)&rawpacket->ip.ip_src)[i];
for (i = 0; i < (sizeof(struct udphdr) + newlen + 1) / 2; i++)
sum += ((u16 *)&rawpacket->udp)[i];
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
rawpacket->udp.uh_sum = (sum == 0xffff) ? sum : ~sum;
{
#ifdef HAVE_BPF
struct ether_header header;
/* 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) recieved on %s"),
mess->htype, ifr.ifr_name);
/* unicast to unconfigured client */
dest.sin_addr = mess->yiaddr;
dest.sin_port = htons(DHCP_CLIENT_PORT);
if (mess->hlen != 0 && mess->htype != 0)
arp_inject(daemon->netlinkfd, mess->yiaddr, iface_index,
mess->chaddr, mess->hlen);
}
#else
else
{
header.ether_type = htons(ETHERTYPE_IP);
memcpy(header.ether_shost, iface_hwaddr, ETHER_ADDR_LEN);
memcpy(header.ether_dhost, hwdest, ETHER_ADDR_LEN);
ioctl(daemon->dhcp_raw_fd, BIOCSETIF, &ifr);
iov[0].iov_base = (char *)&header;
iov[0].iov_len = sizeof(struct ether_header);
iov[1].iov_base = (char *)rawpacket;
iov[1].iov_len = ntohs(rawpacket->ip.ip_len);
while (writev(daemon->dhcp_raw_fd, iov, 2) == -1 && retry_send());
send_via_bpf(daemon, mess, iov.iov_len, iface_addr, &ifr);
return;
}
#else
/* Most definitions of this only include 8 bytes of address,
so we roll our own, since later kernels allow more. */
struct {
unsigned short int sll_family;
unsigned short int sll_protocol;
int sll_ifindex;
unsigned short int sll_hatype;
unsigned char sll_pkttype;
unsigned char sll_halen;
unsigned char sll_addr[DHCP_CHADDR_MAX];
} dest;
memset(&dest, 0, sizeof(dest));
dest.sll_family = AF_PACKET;
dest.sll_halen = mess->hlen;
dest.sll_ifindex = iface_index;
dest.sll_protocol = htons(ETHERTYPE_IP);
memcpy(dest.sll_addr, hwdest, mess->hlen);
while (sendto(daemon->dhcp_raw_fd, rawpacket, ntohs(rawpacket->ip.ip_len),
0, (struct sockaddr *)&dest, sizeof(dest)) == -1 &&
retry_send());
#endif
}
}
while(sendmsg(daemon->dhcpfd, &msg, 0) == -1 && retry_send());
}
/* This is a complex routine: it gets called with each (address,netmask,broadcast) triple
of the interface on which a DHCP packet arrives (and any relay address) and does the
following things:
1) Fills in any netmask and broadcast addresses which have not been explicitly configured.
2) Fills in local (this host) and router (this host or relay) addresses.
3) Links contexts which are valid for hosts directly connected to the arrival interface on ->current.
of each interface (and any relay address) and does the following things:
1) Discards stuff for interfaces other than the one on which a DHCP packet just arrived.
2) Fills in any netmask and broadcast addresses which have not been explicitly configured.
3) Fills in local (this host) and router (this host or relay) addresses.
4) Links contexts which are valid for hosts directly connected to the arrival interface on ->current.
Note that the current chain may be superceded later for configured hosts or those coming via gateways. */
struct dhcp_context *complete_context(struct daemon *daemon, struct in_addr local, struct dhcp_context *current,
struct in_addr netmask, struct in_addr broadcast, struct in_addr relay,
struct in_addr primary)
static int complete_context(struct daemon *daemon, struct in_addr local, int if_index,
struct in_addr netmask, struct in_addr broadcast, void *vparam)
{
struct dhcp_context *context;
struct iface_param *param = vparam;
if (if_index != param->ind)
return 1; /* no for us. */
for (context = daemon->dhcp; context; context = context->next)
{
......@@ -426,8 +319,8 @@ struct dhcp_context *complete_context(struct daemon *daemon, struct in_addr loca
{
context->router = local;
context->local = local;
context->current = current;
current = context;
context->current = param->current;
param->current = context;
}
if (!(context->flags & CONTEXT_BRDCAST))
......@@ -438,10 +331,10 @@ struct dhcp_context *complete_context(struct daemon *daemon, struct in_addr loca
context->broadcast.s_addr = context->start.s_addr | ~context->netmask.s_addr;
}
}
else if (relay.s_addr && is_same_net(relay, context->start, context->netmask))
else if (param->relay.s_addr && is_same_net(param->relay, context->start, context->netmask))
{
context->router = relay;
context->local = primary;
context->router = param->relay;
context->local = param->primary;
/* fill in missing broadcast addresses for relayed ranges */
if (!(context->flags & CONTEXT_BRDCAST))
context->broadcast.s_addr = context->start.s_addr | ~context->netmask.s_addr;
......@@ -450,25 +343,31 @@ struct dhcp_context *complete_context(struct daemon *daemon, struct in_addr loca
}
}
return current;
return 1;
}
struct dhcp_context *address_available(struct dhcp_context *context, struct in_addr taddr)
{
/* Check is an address is OK for this network, check all
possible ranges. */
possible ranges. Make sure that the address isn't in use
by the server itself. */
unsigned int start, end, addr = ntohl(taddr.s_addr);
struct dhcp_context *tmp;
for (; context; context = context->current)
for (tmp = context; tmp; tmp = tmp->current)
if (taddr.s_addr == context->local.s_addr)
return NULL;
for (tmp = context; tmp; tmp = tmp->current)
{
start = ntohl(context->start.s_addr);
end = ntohl(context->end.s_addr);
start = ntohl(tmp->start.s_addr);
end = ntohl(tmp->end.s_addr);
if (!(context->flags & CONTEXT_STATIC) &&
if (!(tmp->flags & CONTEXT_STATIC) &&
addr >= start &&
addr <= end)
return context;
return tmp;
}
return NULL;
......@@ -547,11 +446,15 @@ int address_allocate(struct dhcp_context *context, struct daemon *daemon,
a particular hwaddr/clientid/hostname in our configuration.
Try to return from contexts which match netids first. */
struct in_addr start, addr ;
struct dhcp_context *c;
struct in_addr start, addr;
struct dhcp_context *c, *d;
int i, pass;
unsigned int j;
/* hash hwaddr */
for (j = 0, i = 0; i < hw_len; i++)
j += hwaddr[i] + (hwaddr[i] << 8) + (hwaddr[i] << 16);
for (pass = 0; pass <= 1; pass++)
for (c = context; c; c = c->current)
if (c->flags & CONTEXT_STATIC)
......@@ -561,34 +464,40 @@ int address_allocate(struct dhcp_context *context, struct daemon *daemon,
else
{
/* pick a seed based on hwaddr then iterate until we find a free address. */
for (j = c->addr_epoch, i = 0; i < hw_len; i++)
j += hwaddr[i] + (hwaddr[i] << 8) + (hwaddr[i] << 16);
start.s_addr = addr.s_addr =
htonl(ntohl(c->start.s_addr) +
(j % (1 + ntohl(c->end.s_addr) - ntohl(c->start.s_addr))));
((j + c->addr_epoch) % (1 + ntohl(c->end.s_addr) - ntohl(c->start.s_addr))));
do {
if (!lease_find_by_addr(addr) &&
/* eliminate addresses in use by the server. */
for (d = context; d; d = d->current)
if (addr.s_addr == d->local.s_addr)
break;
if (!d &&
!lease_find_by_addr(addr) &&
!config_find_by_address(daemon->dhcp_conf, addr))
{
struct ping_result *r, *victim = NULL;
int count;
int count, max = (int)(0.6 * (((float)PING_CACHE_TIME)/
((float)PING_WAIT)));
*addrp = addr;
if (daemon->options & OPT_NO_PING)
return 1;
/* check if we failed to ping addr sometime in the last
30s. If so, assume the same situation still exists.
PING_CACHE_TIME seconds. If so, assume the same situation still exists.
This avoids problems when a stupid client bangs
on us repeatedly. As a final check, is we did more
than six ping checks in the last 30s, we are in
high-load mode, so don't do any more. */
on us repeatedly. As a final check, if we did more
than 60% of the possible ping checks in the last
PING_CACHE_TIME, we are in high-load mode, so don't do any more. */
for (count = 0, r = daemon->ping_results; r; r = r->next)
if (difftime(now, r->time) > 30.0)
if (difftime(now, r->time) > (float)PING_CACHE_TIME)
victim = r; /* old record */
else if (++count == 6 || r->addr.s_addr == addr.s_addr)
{
*addrp = addr;
else if (++count == max || r->addr.s_addr == addr.s_addr)
return 1;
}
if (icmp_ping(daemon, addr))
/* address in use: perturb address selection so that we are
......@@ -613,7 +522,6 @@ int address_allocate(struct dhcp_context *context, struct daemon *daemon,
victim->addr = addr;
victim->time = now;
}
*addrp = addr;
return 1;
}
}
......@@ -677,7 +585,6 @@ struct dhcp_config *find_config(struct dhcp_config *configs,
is_addr_in_context(context, config))
return config;
if (hostname && context)
for (config = configs; config; config = config->next)
if ((config->flags & CONFIG_NAME) &&
......@@ -690,16 +597,9 @@ struct dhcp_config *find_config(struct dhcp_config *configs,
config->wildcard_mask != 0 &&
config->hwaddr_len == hw_len &&
(config->hwaddr_type == hw_type || config->hwaddr_type == 0) &&
is_addr_in_context(context, config))
{
int i;
unsigned int mask = config->wildcard_mask;
for (i = hw_len - 1; i >= 0; i--, mask = mask >> 1)
if (mask & 1)
config->hwaddr[i] = hwaddr[i];
if (memcmp(config->hwaddr, hwaddr, hw_len) == 0)
is_addr_in_context(context, config) &&
memcmp_masked(config->hwaddr, hwaddr, hw_len, config->wildcard_mask))
return config;
}
return NULL;
}
......@@ -863,8 +763,8 @@ char *host_from_dns(struct daemon *daemon, struct in_addr addr)
if (lookup && (lookup->flags & F_HOSTS))
{
hostname = daemon->dhcp_buff;
hostname[256] = 0;
strncpy(hostname, cache_get_name(lookup), 256);
hostname[255] = 0;
hostname = strip_hostname(daemon, hostname);
}
......
......@@ -10,8 +10,6 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static char *compile_opts =
......@@ -26,9 +24,6 @@ static char *compile_opts =
#ifdef HAVE_BROKEN_RTC
"no-RTC "
#endif
#ifdef HAVE_RTNETLINK
"RTNetlink "
#endif
#ifndef HAVE_ISC_READER
"no-"
#endif
......@@ -42,7 +37,8 @@ static char *compile_opts =
#endif
"I18N ";
static volatile int sigterm, sighup, sigusr1, sigalarm, num_kids, in_child;
static pid_t pid;
static int pipewrite;
static int set_dns_listeners(struct daemon *daemon, fd_set *set, int maxfd);
static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now);
......@@ -51,12 +47,12 @@ static void sig_handler(int sig);
int main (int argc, char **argv)
{
struct daemon *daemon;
int first_loop = 1;
int bind_fallback = 0;
time_t now, last = 0;
struct sigaction sigact;
sigset_t sigmask;
struct iname *if_tmp;
int flags, piperead, pipefd[2];
unsigned char sig;
#ifndef NO_GETTEXT
setlocale(LC_ALL, "");
......@@ -64,16 +60,7 @@ int main (int argc, char **argv)
textdomain("dnsmasq");
#endif
sighup = 1; /* init cache the first time through */
sigusr1 = 0; /* but don't dump */
sigterm = 0; /* or die */
#ifdef HAVE_BROKEN_RTC
sigalarm = 1; /* need regular lease dumps */
#else
sigalarm = 0; /* or not */
#endif
num_kids = 0;
in_child = 0;
pid = 0;
sigact.sa_handler = sig_handler;
sigact.sa_flags = 0;
......@@ -88,15 +75,6 @@ int main (int argc, char **argv)
sigact.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sigact, NULL);
/* now block all the signals, they stay that way except
during the call to pselect */
sigaddset(&sigact.sa_mask, SIGUSR1);
sigaddset(&sigact.sa_mask, SIGTERM);
sigaddset(&sigact.sa_mask, SIGHUP);
sigaddset(&sigact.sa_mask, SIGALRM);
sigaddset(&sigact.sa_mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigact.sa_mask, &sigmask);
daemon = read_opts(argc, argv, compile_opts);
if (daemon->edns_pktsz < PACKETSZ)
......@@ -115,7 +93,12 @@ int main (int argc, char **argv)
die(_("ISC dhcpd integration not available: set HAVE_ISC_READER in src/config.h"), NULL);
#endif
if (!enumerate_interfaces(daemon, &daemon->interfaces, NULL, NULL))
#ifdef HAVE_LINUX_NETWORK
netlink_init(daemon);
#endif
daemon->interfaces = NULL;
if (!enumerate_interfaces(daemon))
die(_("failed to find list of interfaces: %s"), NULL);
if (!(daemon->options & OPT_NOWILD) &&
......@@ -127,7 +110,7 @@ int main (int argc, char **argv)
if (daemon->options & OPT_NOWILD)
{
daemon->listeners = create_bound_listeners(daemon->interfaces, daemon->port);
daemon->listeners = create_bound_listeners(daemon);
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
if (if_tmp->name && !if_tmp->used)
......@@ -144,16 +127,11 @@ int main (int argc, char **argv)
forward_init(1);
cache_init(daemon->cachesize, daemon->options & OPT_LOG);
#ifdef HAVE_BROKEN_RTC
if ((daemon->uptime_fd = open(UPTIME, O_RDONLY)) == -1)
die(_("cannot open %s:%s"), UPTIME);
#endif
now = dnsmasq_time(daemon->uptime_fd);
now = dnsmasq_time();
if (daemon->dhcp)
{
#if !defined(IP_PKTINFO) && !defined(IP_RECVIF)
#if !defined(HAVE_LINUX_NETWORK) && !defined(IP_RECVIF)
int c;
struct iname *tmp;
for (c = 0, tmp = daemon->if_names; tmp; tmp = tmp->next)
......@@ -196,7 +174,8 @@ int main (int argc, char **argv)
addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = in6addr_any;
addr.in6.sin6_port = htons(daemon->query_port);
addr.in6.sin6_flowinfo = htonl(0);
addr.in6.sin6_flowinfo = 0;
addr.in6.sin6_scope_id = 0;
#ifdef HAVE_SOCKADDR_SA_LEN
addr.in6.sin6_len = sizeof(struct sockaddr_in6);
#endif
......@@ -204,15 +183,49 @@ int main (int argc, char **argv)
#endif
}
setbuf(stdout, NULL);
/* Use a pipe to carry signals back to the event loop in a race-free manner */
if (pipe(pipefd) == -1 ||
(flags = fcntl(pipefd[0], F_GETFL)) == -1 ||
fcntl(pipefd[0], F_SETFL, flags | O_NONBLOCK) == -1 ||
(flags = fcntl(pipefd[1], F_GETFL)) == -1 ||
fcntl(pipefd[1], F_SETFL, flags | O_NONBLOCK) == -1)
die(_("cannot create pipe: %s"), NULL);
piperead = pipefd[0];
pipewrite = pipefd[1];
/* prime the pipe to load stuff first time. */
sig = SIGHUP;
write(pipewrite, &sig, 1);
if (!(daemon->options & OPT_DEBUG))
{
FILE *pidfile;
struct passwd *ent_pw;
struct passwd *ent_pw = daemon->username ? getpwnam(daemon->username) : NULL;
fd_set test_set;
int maxfd, i;
#ifdef HAVE_LINUX_NETWORK
cap_user_header_t hdr = NULL;
cap_user_data_t data = NULL;
/* On linux, we keep CAP_NETADMIN (for ARP-injection) and
CAP_NET_RAW (for icmp) if we're doing dhcp */
if (ent_pw)
{
hdr = safe_malloc(sizeof(*hdr));
data = safe_malloc(sizeof(*data));
hdr->version = _LINUX_CAPABILITY_VERSION;
hdr->pid = 0; /* this process */
data->effective = data->permitted = data->inheritable =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) |
(1 << CAP_SETGID) | (1 << CAP_SETUID);
/* Tell kernel to not clear capabilities when dropping root */
if (capset(hdr, data) == -1 || prctl(PR_SET_KEEPCAPS, 1) == -1)
die(_("Cannot set capabilities: %s"), NULL);
}
#endif
FD_ZERO(&test_set);
maxfd = set_dns_listeners(daemon, &test_set, -1);
#ifdef HAVE_DBUS
......@@ -249,16 +262,21 @@ int main (int argc, char **argv)
for (i=0; i<64; i++)
{
#ifdef HAVE_BROKEN_RTC
if (i == daemon->uptime_fd)
if (i == piperead || i == pipewrite)
continue;
#ifdef HAVE_LINUX_NETWORK
if (i == daemon->netlinkfd)
continue;
#endif
if (daemon->dhcp &&
(i == fileno(daemon->lease_stream) ||
i == daemon->dhcpfd ||
#ifndef HAVE_LINUX_NETWORK
i == daemon->dhcp_raw_fd ||
i == daemon->dhcp_icmp_fd))
i == daemon->dhcp_icmp_fd ||
#endif
i == daemon->dhcpfd))
continue;
if (i <= maxfd && FD_ISSET(i, &test_set))
......@@ -268,10 +286,11 @@ int main (int argc, char **argv)
}
/* Change uid and gid for security */
if (daemon->username && (ent_pw = getpwnam(daemon->username)))
if (ent_pw)
{
gid_t dummy;
struct group *gp;
/* remove all supplimentary groups */
setgroups(0, &dummy);
/* change group for /etc/ppp/resolv.conf
......@@ -281,8 +300,21 @@ int main (int argc, char **argv)
setgid(gp->gr_gid);
/* finally drop root */
setuid(ent_pw->pw_uid);
#ifdef HAVE_LINUX_NETWORK
data->effective = data->permitted =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
data->inheritable = 0;
/* lose the setuid and setgid capbilities */
capset(hdr, data);
#endif
}
}
#ifdef HAVE_LINUX_NETWORK
else
prctl(PR_SET_DUMPABLE, 1);
#endif
openlog("dnsmasq",
DNSMASQ_LOG_OPT(daemon->options & OPT_DEBUG),
......@@ -313,11 +345,6 @@ int main (int argc, char **argv)
if (if_tmp->name && !if_tmp->used)
syslog(LOG_WARNING, _("warning: interface %s does not currently exist"), if_tmp->name);
#ifdef HAVE_RTNETLINK
/* Must do this after daemonizing so that the pid is right */
netlink_init(daemon);
#endif
if (daemon->dhcp)
{
struct dhcp_context *dhcp_tmp;
......@@ -332,16 +359,6 @@ int main (int argc, char **argv)
_("DHCP, IP range %s -- %s, lease time %s"),
daemon->dhcp_buff, inet_ntoa(dhcp_tmp->end), daemon->dhcp_buff2);
}
#ifdef HAVE_BROKEN_RTC
daemon->min_leasetime = daemon->min_leasetime/3;
if (daemon->min_leasetime > (60 * 60 * 24))
daemon->min_leasetime = 60 * 60 * 24;
if (daemon->min_leasetime < 60)
daemon->min_leasetime = 60;
prettyprint_time(daemon->dhcp_buff2, daemon->min_leasetime);
syslog(LOG_INFO, _("DHCP, %s will be written every %s"), daemon->lease_file, daemon->dhcp_buff2);
#endif
}
if (!(daemon->options & OPT_DEBUG) && (getuid() == 0 || geteuid() == 0))
......@@ -349,49 +366,34 @@ int main (int argc, char **argv)
check_servers(daemon);
while (sigterm == 0)
{
fd_set rset, wset, eset;
pid = getpid();
if (sighup)
{
clear_cache_and_reload(daemon, now);
if (daemon->resolv_files && (daemon->options & OPT_NO_POLL))
while (1)
{
reload_servers(daemon->resolv_files->name, daemon);
check_servers(daemon);
}
sighup = 0;
}
if (sigusr1)
{
dump_cache(daemon);
sigusr1 = 0;
}
int maxfd;
struct timeval t, *tp = NULL;
fd_set rset, wset, eset;
if (sigalarm)
{
if (daemon->dhcp)
{
lease_update_file(daemon, 1, now);
#ifdef HAVE_BROKEN_RTC
alarm(daemon->min_leasetime);
#endif
}
sigalarm = 0;
}
t.tv_sec = 0; /* no warning */
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_ZERO(&eset);
if (!first_loop)
{
int maxfd = set_dns_listeners(daemon, &rset, -1);
maxfd = set_dns_listeners(daemon, &rset, -1);
#ifdef HAVE_DBUS
/* Whilst polling for the dbus, wake every quarter second */
if ((daemon->options & OPT_DBUS) && !daemon->dbus)
{
tp = &t;
tp->tv_sec = 0;
tp->tv_usec = 250000;
}
maxfd = set_dbus_listeners(daemon, maxfd, &rset, &wset, &eset);
#endif
if (daemon->dhcp)
{
FD_SET(daemon->dhcpfd, &rset);
......@@ -399,61 +401,23 @@ int main (int argc, char **argv)
maxfd = daemon->dhcpfd;
}
#ifdef HAVE_RTNETLINK
if (daemon->netlinkfd != -1)
{
#ifdef HAVE_LINUX_NETWORK
FD_SET(daemon->netlinkfd, &rset);
if (daemon->netlinkfd > maxfd)
maxfd = daemon->netlinkfd;
}
#endif
/* Whilst polling for the dbus, wake every quarter second */
#ifdef HAVE_PSELECT
{
struct timespec *tp = NULL;
#ifdef HAVE_DBUS
struct timespec t;
if ((daemon->options & OPT_DBUS) && !daemon->dbus)
{
tp = &t;
tp->tv_sec = 0;
tp->tv_nsec = 250000000;
}
#endif
if (pselect(maxfd+1, &rset, &wset, &eset, tp, &sigmask) < 0)
{
/* otherwise undefined after error */
FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset);
}
}
#else
{
sigset_t save_mask;
struct timeval *tp = NULL;
#ifdef HAVE_DBUS
struct timeval t;
if ((daemon->options & OPT_DBUS) && !daemon->dbus)
{
tp = &t;
tp->tv_sec = 0;
tp->tv_usec = 250000;
}
#endif
sigprocmask(SIG_SETMASK, &sigmask, &save_mask);
FD_SET(piperead, &rset);
if (piperead > maxfd)
maxfd = piperead;
if (select(maxfd+1, &rset, &wset, &eset, tp) < 0)
{
/* otherwise undefined after error */
FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset);
}
sigprocmask(SIG_SETMASK, &save_mask, NULL);
}
#endif
}
first_loop = 0;
now = dnsmasq_time(daemon->uptime_fd);
now = dnsmasq_time();
/* Check for changes to resolv files once per second max. */
/* Don't go silent for long periods if the clock goes backwards. */
......@@ -506,8 +470,46 @@ int main (int argc, char **argv)
}
}
#ifdef HAVE_RTNETLINK
if (daemon->netlinkfd != -1 && FD_ISSET(daemon->netlinkfd, &rset))
if (FD_ISSET(piperead, &rset))
{
if (read(piperead, &sig, 1) == 1)
switch (sig)
{
case SIGHUP:
clear_cache_and_reload(daemon);
if (daemon->resolv_files && (daemon->options & OPT_NO_POLL))
{
reload_servers(daemon->resolv_files->name, daemon);
check_servers(daemon);
}
break;
case SIGUSR1:
dump_cache(daemon, now);
break;
case SIGALRM:
if (daemon->dhcp)
lease_update_file(daemon);
break;
case SIGTERM:
syslog(LOG_INFO, _("exiting on receipt of SIGTERM"));
if (daemon->dhcp)
fclose(daemon->lease_stream);
exit(0);
case SIGCHLD:
/* See Stevens 5.10 */
while (waitpid(-1, NULL, WNOHANG) > 0)
daemon->num_kids--;
break;
}
}
#ifdef HAVE_LINUX_NETWORK
if (FD_ISSET(daemon->netlinkfd, &rset))
netlink_multicast(daemon);
#endif
......@@ -529,47 +531,34 @@ int main (int argc, char **argv)
if (daemon->dhcp && FD_ISSET(daemon->dhcpfd, &rset))
dhcp_packet(daemon, now);
}
syslog(LOG_INFO, _("exiting on receipt of SIGTERM"));
if (daemon->dhcp)
{
#ifdef HAVE_BROKEN_RTC
lease_update_file(daemon, 1, now);
#endif
fclose(daemon->lease_stream);
}
return 0;
}
static void sig_handler(int sig)
{
if (sig == SIGTERM)
sigterm = 1;
else if (sig == SIGHUP)
sighup = 1;
else if (sig == SIGUSR1)
sigusr1 = 1;
else if (sig == SIGALRM)
if (pid == 0)
{
/* alarm is used to kill children after a fixed time. */
if (in_child)
/* ignore anything other than TERM during startup */
if (sig == SIGTERM)
exit(0);
else
sigalarm = 1;
}
else if (sig == SIGCHLD)
else if (pid == getpid())
{
/* See Stevens 5.10 */
while (waitpid(-1, NULL, WNOHANG) > 0)
num_kids--;
/* master process */
unsigned char sigchr = sig;
int errsave = errno;
write(pipewrite, &sigchr, 1);
errno = errsave;
}
else
{
/* alarm is used to kill children after a fixed time. */
if (sig == SIGALRM)
exit(0);
}
}
void clear_cache_and_reload(struct daemon *daemon, time_t now)
void clear_cache_and_reload(struct daemon *daemon)
{
cache_reload(daemon->options, daemon->namebuff, daemon->domain_suffix, daemon->addn_hosts);
if (daemon->dhcp)
......@@ -578,7 +567,7 @@ void clear_cache_and_reload(struct daemon *daemon, time_t now)
dhcp_read_ethers(daemon);
dhcp_update_configs(daemon->dhcp_conf);
lease_update_from_configs(daemon);
lease_update_file(daemon, 0, now);
lease_update_file(daemon);
lease_update_dns(daemon);
}
}
......@@ -625,30 +614,39 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
if (FD_ISSET(listener->tcpfd, set))
{
int confd;
struct in_addr netmask, dst_addr_4;
while((confd = accept(listener->tcpfd, NULL, NULL)) == -1 && errno == EINTR);
if (confd != -1)
{
struct irec *iface = NULL;
if (daemon->options & OPT_NOWILD)
iface = listener->iface;
else
{
union mysockaddr tcp_addr;
socklen_t tcp_len = sizeof(union mysockaddr);
/* Check for allowed interfaces when binding the wildcard address:
we do this by looking for an interface with the same address as
the local address of the TCP connection, then looking to see if that's
an allowed interface. As a side effect, we get the netmask of the
interface too, for localisation. */
if ((num_kids >= MAX_PROCS) ||
(!(daemon->options & OPT_NOWILD) &&
(getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1 ||
!enumerate_interfaces(daemon, NULL, &tcp_addr, &netmask))))
/* interface may be new since startup */
if (enumerate_interfaces(daemon) &&
getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) != -1)
for (iface = daemon->interfaces; iface; iface = iface->next)
if (sockaddr_isequal(&iface->addr, &tcp_addr))
break;
}
if ((daemon->num_kids >= MAX_PROCS) || !iface)
close(confd);
#ifndef NO_FORK
else if (!(daemon->options & OPT_DEBUG) && fork())
{
num_kids++;
daemon->num_kids++;
close(confd);
}
#endif
......@@ -657,18 +655,14 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
unsigned char *buff;
struct server *s;
int flags;
struct in_addr dst_addr_4;
dst_addr_4.s_addr = 0;
/* Arrange for SIGALARM after CHILD_LIFETIME seconds to
terminate the process. */
if (!(daemon->options & OPT_DEBUG))
{
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGALRM);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
alarm(CHILD_LIFETIME);
in_child = 1;
}
/* start with no upstream connections. */
for (s = daemon->servers; s; s = s->next)
......@@ -681,20 +675,9 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
fcntl(confd, F_SETFL, flags & ~O_NONBLOCK);
if (listener->family == AF_INET)
{
if (daemon->options & OPT_NOWILD)
{
netmask = listener->iface->netmask;
dst_addr_4 = listener->iface->addr.in.sin_addr;
}
else
/* netmask already set by enumerate_interfaces */
dst_addr_4 = tcp_addr.in.sin_addr;
}
else
dst_addr_4.s_addr = 0;
dst_addr_4 = iface->addr.in.sin_addr;
buff = tcp_request(daemon, confd, now, dst_addr_4, netmask);
buff = tcp_request(daemon, confd, now, dst_addr_4, iface->netmask);
if (!(daemon->options & OPT_DEBUG))
exit(0);
......@@ -711,21 +694,35 @@ static void check_dns_listeners(struct daemon *daemon, fd_set *set, time_t now)
}
}
int make_icmp_sock(void)
{
int fd, flags;
int zeroopt = 0;
if ((fd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP)) != -1)
{
if ((flags = fcntl(fd, F_GETFL, 0)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
setsockopt(fd, SOL_SOCKET, SO_DONTROUTE, &zeroopt, sizeof(zeroopt)) == -1)
{
close(fd);
fd = -1;
}
}
return fd;
}
int icmp_ping(struct daemon *daemon, struct in_addr addr)
{
/* Try and get an ICMP echo from a machine.
Note that we can't create the raw socket each time
we do this, since that needs root. Therefore the socket has to hang
around all the time. Since most of the time we won't read the
socket, it will accumulate buffers full of ICMP messages,
wasting memory. To avoid that we set the receive buffer
length to zero except when we're actively pinging. */
/* Try and get an ICMP echo from a machine. */
/* Note that whilst in the three second wait, we check for
(and service) events on the DNS sockets, (so doing that
better not use any resources our caller has in use...)
but we remain deaf to signals or further DHCP packets. */
int fd;
struct sockaddr_in saddr;
struct {
struct ip ip;
......@@ -733,9 +730,18 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
} packet;
unsigned short id = rand16();
unsigned int i, j;
int opt = 2000, gotreply = 0;
int gotreply = 0;
time_t start, now;
#ifdef HAVE_LINUX_NETWORK
if ((fd = make_icmp_sock()) == -1)
return 0;
#else
int opt = 2000;
fd = daemon->dhcp_icmp_fd;
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
#endif
saddr.sin_family = AF_INET;
saddr.sin_port = 0;
saddr.sin_addr = addr;
......@@ -752,13 +758,12 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
j = (j & 0xffff) + (j >> 16);
packet.icmp.icmp_cksum = (j == 0xffff) ? j : ~j;
setsockopt(daemon->dhcp_icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
while (sendto(daemon->dhcp_icmp_fd, (char *)&packet.icmp, sizeof(struct icmp), 0,
while (sendto(fd, (char *)&packet.icmp, sizeof(struct icmp), 0,
(struct sockaddr *)&saddr, sizeof(saddr)) == -1 &&
retry_send());
for (now = start = dnsmasq_time(daemon->uptime_fd); difftime(now, start) < 3.0;)
for (now = start = dnsmasq_time();
difftime(now, start) < (float)PING_WAIT;)
{
struct timeval tv;
fd_set rset;
......@@ -770,17 +775,17 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
tv.tv_sec = 0;
FD_ZERO(&rset);
FD_SET(daemon->dhcp_icmp_fd, &rset);
maxfd = set_dns_listeners(daemon, &rset, daemon->dhcp_icmp_fd);
FD_SET(fd, &rset);
maxfd = set_dns_listeners(daemon, &rset, fd);
if (select(maxfd+1, &rset, NULL, NULL, &tv) < 0)
FD_ZERO(&rset);
now = dnsmasq_time(daemon->uptime_fd);
now = dnsmasq_time();
check_dns_listeners(daemon, &rset, now);
if (FD_ISSET(daemon->dhcp_icmp_fd, &rset) &&
recvfrom(daemon->dhcp_icmp_fd, &packet, sizeof(packet), 0,
if (FD_ISSET(fd, &rset) &&
recvfrom(fd, &packet, sizeof(packet), 0,
(struct sockaddr *)&faddr, &len) == sizeof(packet) &&
saddr.sin_addr.s_addr == faddr.sin_addr.s_addr &&
packet.icmp.icmp_type == ICMP_ECHOREPLY &&
......@@ -792,8 +797,12 @@ int icmp_ping(struct daemon *daemon, struct in_addr addr)
}
}
#ifdef HAVE_LINUX_NETWORK
close(fd);
#else
opt = 1;
setsockopt(daemon->dhcp_icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
#endif
return gotreply;
}
......
......@@ -10,17 +10,8 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#define COPYRIGHT "Copyright (C) 2000-2006 Simon Kelley"
#ifdef __linux__
/* for pselect.... */
# define _XOPEN_SOURCE 600
/* but then DNS headers don't compile without.... */
#define _BSD_SOURCE
#endif
/* get these before config.h for IPv6 stuff... */
#include <sys/types.h>
#include <netinet/in.h>
......@@ -53,9 +44,6 @@
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/wait.h>
#if defined(__sun) || defined(__sun__)
# include <sys/sockio.h>
#endif
#include <sys/time.h>
#include <limits.h>
#include <net/if.h>
......@@ -80,13 +68,18 @@
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#ifdef HAVE_BPF
# include <net/bpf.h>
#include <sys/uio.h>
#ifndef HAVE_LINUX_NETWORK
# include <net/if_dl.h>
#else
# include <netpacket/packet.h>
#endif
#include <sys/uio.h>
#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
......@@ -116,6 +109,7 @@
#define OPT_LOCALISE 262144
#define OPT_DBUS 524288
#define OPT_BOOTP_DYNAMIC 1048576
#define OPT_NO_PING 2097152
struct all_addr {
union {
......@@ -296,6 +290,9 @@ struct dhcp_lease {
char *hostname, *fqdn; /* name from client-hostname option or config */
int auth_name; /* hostname came from config, not from client */
time_t expires; /* lease expiry */
#ifdef HAVE_BROKEN_RTC
unsigned int length;
#endif
int hwaddr_len, hwaddr_type;
unsigned char hwaddr[DHCP_CHADDR_MAX];
struct in_addr addr;
......@@ -385,22 +382,13 @@ 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 {
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];
} data;
};
struct ping_result {
......@@ -452,14 +440,16 @@ struct daemon {
struct server *last_server;
struct server *srv_save; /* Used for resend on DoD */
size_t packet_len; /* " " */
int uptime_fd;
int num_kids;
/* DHCP state */
int dhcpfd, dhcp_raw_fd, dhcp_icmp_fd;
#ifdef HAVE_RTNETLINK
int dhcpfd;
#ifdef HAVE_LINUX_NETWORK
int netlinkfd;
#else
int dhcp_raw_fd, dhcp_icmp_fd;
#endif
struct udp_dhcp_packet *dhcp_packet;
struct iovec dhcp_packet;
char *dhcp_buff, *dhcp_buff2;
struct ping_result *ping_results;
FILE *lease_stream;
......@@ -489,7 +479,7 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
void cache_reload(int opts, char *buff, char *domain_suffix, struct hostsfile *addn_hosts);
void cache_add_dhcp_entry(struct daemon *daemon, char *host_name, struct in_addr *host_address, time_t ttd);
void cache_unhash_dhcp(void);
void dump_cache(struct daemon *daemon);
void dump_cache(struct daemon *daemon, time_t now);
char *cache_get_name(struct crec *crecp);
/* rfc1035.c */
......@@ -522,14 +512,16 @@ void *safe_malloc(size_t size);
int sa_len(union mysockaddr *addr);
int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2);
int hostname_isequal(char *a, char *b);
time_t dnsmasq_time(int fd);
time_t dnsmasq_time(void);
int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask);
int retry_send(void);
void prettyprint_time(char *buf, unsigned int t);
int prettyprint_addr(union mysockaddr *addr, char *buf);
int parse_hex(char *in, unsigned char *out, int maxlen,
unsigned int *wildcard_mask, int *mac_type);
int memcmp_masked(unsigned char *a, unsigned char *b, int len,
unsigned int mask);
int expand_buf(struct iovec *iov, size_t size);
/* option.c */
struct daemon *read_opts (int argc, char **argv, char *compile_opts);
......@@ -544,10 +536,11 @@ unsigned char *tcp_request(struct daemon *daemon, int confd, time_t now,
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 irec **chainp,
union mysockaddr *test_addrp, struct in_addr *netmaskp);
int enumerate_interfaces(struct daemon *daemon);
struct listener *create_wildcard_listeners(int port);
struct listener *create_bound_listeners(struct irec *interfaces, int port);
struct listener *create_bound_listeners(struct daemon *daemon);
int iface_check(struct daemon *daemon, int family,
struct all_addr *addr, char *name);
/* dhcp.c */
void dhcp_init(struct daemon *daemon);
......@@ -569,13 +562,9 @@ 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);
struct dhcp_context *complete_context(struct daemon *daemon, struct in_addr local,
struct dhcp_context *current, struct in_addr netmask,
struct in_addr broadcast, struct in_addr relay,
struct in_addr primary);
/* lease.c */
void lease_update_file(struct daemon *daemon, int force, time_t now);
void lease_update_file(struct daemon *daemon);
void lease_update_dns(struct daemon *daemon);
void lease_init(struct daemon *daemon, time_t now);
struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid,
......@@ -584,7 +573,7 @@ int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
unsigned char *clid, int hw_len, int hw_type, int clid_len);
void lease_set_hostname(struct dhcp_lease *lease, char *name,
char *suffix, int auth);
void lease_set_expires(struct dhcp_lease *lease, time_t exp);
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);
......@@ -595,8 +584,9 @@ void lease_update_from_configs(struct daemon *daemon);
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);
void clear_cache_and_reload(struct daemon *daemon);
/* isc.c */
#ifdef HAVE_ISC_READER
......@@ -604,12 +594,22 @@ void load_dhcp(struct daemon *daemon, time_t now);
#endif
/* netlink.c */
#ifdef HAVE_RTNETLINK
#ifdef HAVE_LINUX_NETWORK
void netlink_init(struct daemon *daemon);
int netlink_process(struct daemon *daemon, int index,
struct in_addr relay, struct in_addr primary,
struct dhcp_context **retp);
int iface_enumerate(struct daemon *daemon, void *parm,
int (*ipv4_callback)(), int (*ipv6_callback)());
void netlink_multicast(struct daemon *daemon);
void arp_inject(int fd, struct in_addr addr,
int iface, unsigned char *mac, unsigned int mac_len);
#endif
/* bpf.c */
#ifndef HAVE_LINUX_NETWORK
void init_bpf(struct daemon *daemon);
void send_via_bpf(struct daemon *daemon, struct dhcp_packet *mess, size_t len,
struct in_addr iface_addr, struct ifreq *ifr);
int iface_enumerate(struct daemon *daemon, void *parm,
int (*ipv4_callback)(), int (*ipv6_callback)());
#endif
/* dbus.c */
......
......@@ -10,8 +10,6 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static struct frec *frec_list;
......@@ -44,7 +42,7 @@ static void send_from(int fd, int nowild, char *packet, size_t len,
struct iovec iov[1];
union {
struct cmsghdr align; /* this ensures alignment */
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
char control[CMSG_SPACE(sizeof(struct in_pktinfo))];
#elif defined(IP_SENDSRCADDR)
char control[CMSG_SPACE(sizeof(struct in_addr))];
......@@ -74,7 +72,7 @@ static void send_from(int fd, int nowild, char *packet, size_t len,
if (to->sa.sa_family == AF_INET)
{
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
struct in_pktinfo *pkt = (struct in_pktinfo *)CMSG_DATA(cmptr);
pkt->ipi_ifindex = 0;
pkt->ipi_spec_dst = source->addr.addr4;
......@@ -448,7 +446,7 @@ void reply_query(struct serverfd *sfd, struct daemon *daemon, time_t now)
serveraddr.sa.sa_family = sfd->source_addr.sa.sa_family;
#ifdef HAVE_IPV6
if (serveraddr.sa.sa_family == AF_INET6)
serveraddr.in6.sin6_flowinfo = htonl(0);
serveraddr.in6.sin6_flowinfo = 0;
#endif
header = (HEADER *)daemon->packet;
......@@ -522,7 +520,6 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
HEADER *header = (HEADER *)daemon->packet;
union mysockaddr source_addr;
unsigned short type;
struct iname *tmp;
struct all_addr dst_addr;
struct in_addr netmask, dst_addr_4;
size_t m;
......@@ -536,7 +533,7 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
#ifdef HAVE_IPV6
char control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
#endif
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
char control[CMSG_SPACE(sizeof(struct in_pktinfo))];
#elif defined(IP_RECVDSTADDR)
char control[CMSG_SPACE(sizeof(struct in_addr)) +
......@@ -572,13 +569,15 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
if ((n = recvmsg(listen->fd, &msg, 0)) == -1)
return;
if (n < (int)sizeof(HEADER) || header->qr)
if (n < (int)sizeof(HEADER) ||
(msg.msg_flags & MSG_TRUNC) ||
header->qr)
return;
source_addr.sa.sa_family = listen->family;
#ifdef HAVE_IPV6
if (listen->family == AF_INET6)
source_addr.in6.sin6_flowinfo = htonl(0);
source_addr.in6.sin6_flowinfo = 0;
#endif
if (!(daemon->options & OPT_NOWILD))
......@@ -588,7 +587,7 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
if (msg.msg_controllen < sizeof(struct cmsghdr))
return;
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
if (listen->family == AF_INET)
for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
if (cmptr->cmsg_level == SOL_IP && cmptr->cmsg_type == IP_PKTINFO)
......@@ -643,34 +642,9 @@ void receive_query(struct listener *listen, struct daemon *daemon, time_t now)
netmask = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
}
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
return;
if (daemon->if_names || daemon->if_addrs)
{
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
break;
if (!tmp)
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (tmp->addr.sa.sa_family == listen->family)
{
if (tmp->addr.sa.sa_family == AF_INET &&
tmp->addr.in.sin_addr.s_addr == dst_addr.addr.addr4.s_addr)
break;
#ifdef HAVE_IPV6
else if (tmp->addr.sa.sa_family == AF_INET6 &&
memcmp(&tmp->addr.in6.sin6_addr,
&dst_addr.addr.addr6,
sizeof(struct in6_addr)) == 0)
break;
#endif
}
if (!tmp)
if (!iface_check(daemon, listen->family, &dst_addr, ifr.ifr_name))
return;
}
}
if (extract_request(header, (size_t)n, daemon->namebuff, &type))
{
......@@ -709,7 +683,7 @@ static int read_write(int fd, unsigned char *packet, int size, int rw)
return 0;
else if (n == -1)
{
if (retry_send())
if (errno == EINTR)
goto retry;
else
return 0;
......@@ -920,6 +894,7 @@ static struct frec *get_new_frec(time_t now)
{
f->next = frec_list;
f->time = now;
f->new_id = 0;
frec_list = f;
}
return f; /* OK if malloc fails and this is NULL */
......
......@@ -17,6 +17,8 @@
#ifdef HAVE_ISC_READER
#define MAXTOK 50
struct isc_lease {
char *name, *fqdn;
time_t expires;
......
......@@ -10,26 +10,22 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static struct dhcp_lease *leases;
static int dns_dirty;
static enum { no, yes, force } file_dirty;
static int leases_left;
static int dns_dirty, file_dirty, leases_left;
void lease_init(struct daemon *daemon, time_t now)
{
unsigned int a0, a1, a2, a3;
unsigned long ei;
time_t expires;
unsigned char hwaddr[DHCP_CHADDR_MAX];
struct in_addr addr;
struct dhcp_lease *lease;
int clid_len = 0, hw_len, hw_type;
int has_old = 0;
dns_dirty = 1;
file_dirty = 0;
leases = NULL;
leases_left = daemon->dhcp_max;
......@@ -46,26 +42,21 @@ void lease_init(struct daemon *daemon, time_t now)
&ei, daemon->dhcp_buff2, &a0, &a1, &a2, &a3,
daemon->dhcp_buff, daemon->packet) == 8)
{
#ifdef HAVE_BROKEN_RTC
if (ei)
expires = (time_t)ei + now;
else
expires = (time_t)0;
#else
#ifndef HAVE_BROKEN_RTC
/* strictly time_t is opaque, but this hack should work on all sane systems,
even when sizeof(time_t) == 8 */
expires = (time_t)ei;
time_t expires = (time_t)ei;
if (ei != 0 && difftime(now, expires) > 0)
{
has_old = 1;
file_dirty = 1;
continue; /* expired */
}
#endif
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)
if (hw_type == 0 && hw_len != 0)
hw_type = ARPHRD_ETHER;
addr.s_addr = htonl((a0<<24) + (a1<<16) + (a2<<8) + a3);
......@@ -79,14 +70,19 @@ void lease_init(struct daemon *daemon, time_t now)
if (!(lease = lease_allocate(hwaddr, (unsigned char *)daemon->packet, hw_len, hw_type, clid_len, addr)))
die (_("too many stored leases"), NULL);
#ifdef HAVE_BROKEN_RTC
if (ei != 0)
lease->expires = (time_t)ei + now;
else
lease->expires = (time_t)0;
lease->length = ei;
#else
lease->expires = expires;
#endif
if (strcmp(daemon->dhcp_buff, "*") != 0)
lease_set_hostname(lease, daemon->dhcp_buff, daemon->domain_suffix, 0);
}
dns_dirty = 1;
file_dirty = has_old ? yes: no;
}
void lease_update_from_configs(struct daemon *daemon)
......@@ -107,47 +103,43 @@ void lease_update_from_configs(struct daemon *daemon)
lease_set_hostname(lease, name, daemon->domain_suffix, 1); /* updates auth flag only */
}
void lease_update_file(struct daemon *daemon, int always, time_t now)
void lease_update_file(struct daemon *daemon)
{
struct dhcp_lease *lease;
int i = always; /* avoid warning */
unsigned long expires;
char *mess;
int i;
#ifdef HAVE_BROKEN_RTC
if (always || file_dirty == force)
{
lease_prune(NULL, now);
#else
if (file_dirty != no)
if (file_dirty != 0)
{
#endif
errno = 0;
rewind(daemon->lease_stream);
if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0)
goto write_err;
{
write_err:
syslog(LOG_ERR, _("failed to write %s: %m (retry in %ds)"), daemon->lease_file, LEASE_RETRY);
alarm(LEASE_RETRY);
return;
}
for (lease = leases; lease; lease = lease->next)
{
#ifdef HAVE_BROKEN_RTC
if (lease->expires)
expires = (unsigned long) difftime(lease->expires, now);
else
expires = 0;
if (fprintf(daemon->lease_stream, "%u ", lease->length) < 0)
goto write_err;
#else
expires = now; /* eliminate warning */
expires = (unsigned long)lease->expires;
#endif
if (fprintf(daemon->lease_stream, "%lu ", expires) < 0)
if (fprintf(daemon->lease_stream, "%lu ", (unsigned long)lease->expires) < 0)
goto write_err;
if (lease->hwaddr_type != ARPHRD_ETHER &&
#endif
if ((lease->hwaddr_type != ARPHRD_ETHER || lease->hwaddr_len == 0) &&
fprintf(daemon->lease_stream, "%.2x-", lease->hwaddr_type) < 0)
goto write_err;
for (i = 0; i < lease->hwaddr_len - 1; i++)
if (fprintf(daemon->lease_stream, "%.2x:", lease->hwaddr[i]) < 0)
goto write_err;
for (i = 0; i < lease->hwaddr_len; i++)
{
if (fprintf(daemon->lease_stream, "%.2x", lease->hwaddr[i]) < 0)
goto write_err;
if (i != lease->hwaddr_len - 1 &&
fprintf(daemon->lease_stream, ":") < 0)
goto write_err;
}
if (fprintf(daemon->lease_stream, " %s %s ", inet_ntoa(lease->addr),
lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : "*") < 0)
goto write_err;
......@@ -170,19 +162,8 @@ void lease_update_file(struct daemon *daemon, int always, time_t now)
goto write_err;
if (fsync(fileno(daemon->lease_stream)) < 0)
goto write_err;
file_dirty = no;
file_dirty = 0;
}
return;
write_err:
mess = _("failed to write");
#ifdef HAVE_BROKEN_RTC
syslog(LOG_ERR, "%s %s: %m", mess, daemon->lease_file);
#else
syslog(LOG_ERR, "%s %s: %m (retry in %ds)", mess, daemon->lease_file, LEASE_RETRY);
alarm(LEASE_RETRY);
#endif
}
void lease_update_dns(struct daemon *daemon)
......@@ -212,7 +193,7 @@ void lease_prune(struct dhcp_lease *target, time_t now)
tmp = lease->next;
if ((lease->expires != 0 && difftime(now, lease->expires) > 0) || lease == target)
{
file_dirty = yes;
file_dirty = 1;
*up = lease->next; /* unlink */
if (lease->hostname)
......@@ -246,6 +227,7 @@ struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int h
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)
......@@ -277,7 +259,12 @@ struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid,
lease->hostname = lease->fqdn = NULL;
lease->addr = addr;
memset(lease->hwaddr, 0, DHCP_CHADDR_MAX);
lease->hwaddr_len = 0;
lease->hwaddr_type = 0;
lease->expires = 1;
#ifdef HAVE_BROKEN_RTC
lease->length = 0xffffffff; /* illegal value */
#endif
if (!lease_set_hwaddr(lease, hwaddr, clid, hw_len, hw_type, clid_len))
{
......@@ -288,30 +275,53 @@ struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid,
lease->next = leases;
leases = lease;
file_dirty = force;
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 = yes;
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
}
int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
unsigned char *clid, int hw_len, int hw_type, int clid_len)
{
/* must have some sort of unique-id */
if (hw_len == 0 && (clid_len == 0 || !clid))
return 0;
if (hw_len != lease->hwaddr_len ||
hw_type != lease->hwaddr_type ||
hw_len == 0 ||
memcmp(lease->hwaddr, hwaddr, hw_len) != 0)
{
file_dirty = force;
file_dirty = 1;
memcpy(lease->hwaddr, hwaddr, hw_len);
lease->hwaddr_len = hw_len;
lease->hwaddr_type = hw_type;
......@@ -327,14 +337,14 @@ int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
if (lease->clid_len != clid_len)
{
file_dirty = force;
file_dirty = 1;
if (lease->clid)
free(lease->clid);
if (!(lease->clid = malloc(clid_len)))
return 0;
}
else if (memcmp(lease->clid, clid, clid_len) != 0)
file_dirty = force;
file_dirty = 1;
lease->clid_len = clid_len;
memcpy(lease->clid, clid, clid_len);
......@@ -399,7 +409,7 @@ void lease_set_hostname(struct dhcp_lease *lease, char *name, char *suffix, int
lease->fqdn = new_fqdn;
lease->auth_name = auth;
file_dirty = force;
file_dirty = 1;
dns_dirty = 1;
}
......
/* dnsmasq is Copyright (c) 2000-2006 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
......@@ -12,36 +12,36 @@
#include "dnsmasq.h"
#ifdef HAVE_RTNETLINK
#ifdef HAVE_LINUX_NETWORK
#include <linux/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
static struct iovec iov[1];
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;
daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (daemon->netlinkfd < 0)
return; /* no kernel support */
addr.nl_family = AF_NETLINK;
addr.nl_pad = 0;
addr.nl_pid = getpid();
addr.nl_pid = 0; /* autobind */
#ifdef HAVE_IPV6
addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR | RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
addr.nl_groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
#else
addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
addr.nl_groups = RTMGRP_IPV4_ROUTE;
#endif
if (bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
die(_("cannot bind netlink socket: %s"), NULL);
if ((daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1 ||
bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
die(_("cannot create RTnetlink socket: %s"), NULL);
iov[0].iov_len = 200;
iov[0].iov_base = safe_malloc(iov[0].iov_len);
iov.iov_len = 200;
iov.iov_base = safe_malloc(iov.iov_len);
}
static ssize_t netlink_recv(struct daemon *daemon)
......@@ -51,101 +51,100 @@ static ssize_t netlink_recv(struct daemon *daemon)
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_flags = 0;
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = iov;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
retry:
while ((rc = recvmsg(daemon->netlinkfd, &msg, MSG_PEEK)) == -1 && retry_send());
while (1)
{
msg.msg_flags = 0;
while ((rc = recvmsg(daemon->netlinkfd, &msg, MSG_PEEK)) == -1 && errno == EINTR);
if (rc == -1)
/* 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 (msg.msg_flags & MSG_TRUNC)
{
size_t newsz = iov[0].iov_len + 100;
void *new = realloc(iov[0].iov_base, newsz);
if (!new)
if (rc == -1 || !(msg.msg_flags & MSG_TRUNC))
break;
if (!expand_buf(&iov, iov.iov_len + 100))
return -1;
iov[0].iov_len = newsz;
iov[0].iov_base = new;
goto retry;
}
while ((rc = recvmsg(daemon->netlinkfd, &msg, 0)) == -1 && retry_send());
/* finally, read it for real */
while ((rc = recvmsg(daemon->netlinkfd, &msg, 0)) == -1 && errno == EINTR);
return rc;
}
int netlink_process(struct daemon *daemon, int index, struct in_addr relay,
struct in_addr primary, struct dhcp_context **retp)
int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), int (*ipv6_callback)())
{
struct sockaddr_nl addr;
struct nlmsghdr *h;
int found_primary = 0;
ssize_t len;
struct dhcp_context *ret = NULL;
static unsigned int seq = 0;
int family = AF_INET;
struct {
struct nlmsghdr nlh;
struct rtgenmsg g;
} req;
if (daemon->netlinkfd == -1)
return 0;
addr.nl_family = AF_NETLINK;
addr.nl_pad = 0;
addr.nl_groups = 0;
addr.nl_pid = 0; /* address to kernel */
again:
req.nlh.nlmsg_len = sizeof(req);
req.nlh.nlmsg_type = RTM_GETADDR;
req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
req.nlh.nlmsg_pid = 0;
req.nlh.nlmsg_seq = ++seq;
req.g.rtgen_family = AF_INET;
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)
{
/* if RTnetlink not configured in the kernel, don't keep trying. */
if (errno == ECONNREFUSED)
{
close(daemon->netlinkfd);
daemon->netlinkfd = -1;
}
return 0;
}
get_next:
while (1)
{
if ((len = netlink_recv(daemon)) == -1)
return 0;
for (h = (struct nlmsghdr *)iov[0].iov_base; NLMSG_OK(h, (unsigned int)len); h = NLMSG_NEXT(h, len))
{
if (h->nlmsg_seq != seq)
goto get_next;
if (h->nlmsg_type == NLMSG_DONE)
break;
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (h->nlmsg_type == NLMSG_ERROR)
return 0;
if (h->nlmsg_type == RTM_NEWADDR)
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)
{
struct ifaddrmsg *ifa = NLMSG_DATA(h);
if (ifa->ifa_index == index && ifa->ifa_family == AF_INET)
#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));
......@@ -162,51 +161,108 @@ int netlink_process(struct daemon *daemon, int index, struct in_addr relay,
rta = RTA_NEXT(rta, len1);
}
if (addr.s_addr)
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)
{
ret = complete_context(daemon, addr, ret, netmask, broadcast, relay, primary);
if (addr.s_addr == primary.s_addr)
found_primary = 1;
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
}
}
*retp = ret;
return found_primary;
}
/* We arrange to receive netlink multicast messages whenever the network config changes.
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. */
void netlink_multicast(struct daemon *daemon)
{
ssize_t len;
struct nlmsghdr *h;
if ((len = netlink_recv(daemon)) == -1)
return;
if (!daemon->srv_save)
return;
for (h = (struct nlmsghdr *)iov[0].iov_base; NLMSG_OK(h, (unsigned int)len); h = NLMSG_NEXT(h, len))
if ((len = netlink_recv(daemon)) != -1)
{
if (h->nlmsg_type == NLMSG_DONE || h->nlmsg_type == NLMSG_ERROR)
break;
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (h->nlmsg_type == NLMSG_ERROR)
nl_err(h);
else
nl_routechange(daemon, h);
}
}
static void nl_err(struct nlmsghdr *h)
{
struct nlmsgerr *err = NLMSG_DATA(h);
if (err->error != 0)
syslog(LOG_ERR, _("RTnetlink returns error: %s"), strerror(-(err->error)));
}
if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_NEWROUTE)
/* 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());
break;
}
}
}
void arp_inject(int fd, struct in_addr ip_addr, int iface,
unsigned char *mac, unsigned int mac_len)
{
struct sockaddr_nl addr;
struct {
struct nlmsghdr nlh;
struct ndmsg m;
struct rtattr addr_attr;
struct in_addr addr;
struct rtattr ll_attr;
char mac[DHCP_CHADDR_MAX];
} req;
memset(&req, 0, sizeof(req));
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
req.nlh.nlmsg_len = sizeof(req);
req.nlh.nlmsg_type = RTM_NEWNEIGH;
req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_REPLACE | NLM_F_CREATE;
req.m.ndm_family = AF_INET;
req.m.ndm_ifindex = iface;
req.m.ndm_state = NUD_REACHABLE;
req.addr_attr.rta_type = NDA_DST;
req.addr_attr.rta_len = RTA_LENGTH(sizeof(struct in_addr));
req.addr = ip_addr;
req.ll_attr.rta_type = NDA_LLADDR;
req.ll_attr.rta_len = RTA_LENGTH(mac_len);
memcpy(req.mac, mac, mac_len);
while(sendto(fd, (void *)&req, sizeof(req), 0, (struct sockaddr *)&addr, sizeof(addr)) == -1 &&
retry_send());
}
#endif
/* dnsmasq is Copyright (c) 2000 - 2005 Simon Kelley
/* dnsmasq is Copyright (c) 2000 - 2006 Simon Kelley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -10,262 +10,183 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
static int iface_allowed(struct daemon *daemon, struct irec *iface,
char *name, int is_loopback, union mysockaddr *addr)
int iface_check(struct daemon *daemon, int family, struct all_addr *addr, char *name)
{
struct iname *tmp;
/* If we are restricting the set of interfaces to use, make
sure that loopback interfaces are in that set. */
if (daemon->if_names && is_loopback)
{
struct iname *lo;
for (lo = daemon->if_names; lo; lo = lo->next)
if (lo->name && strcmp(lo->name, name) == 0)
{
lo->isloop = 1;
break;
}
if (!lo)
{
lo = safe_malloc(sizeof(struct iname));
lo->name = safe_malloc(strlen(name)+1);
strcpy(lo->name, name);
lo->isloop = lo->used = 1;
lo->next = daemon->if_names;
daemon->if_names = lo;
}
}
/* check blacklist */
if (daemon->if_except)
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && strcmp(tmp->name, name) == 0)
if (tmp->name && (strcmp(tmp->name, name) == 0))
return 0;
/* we may need to check the whitelist */
if (daemon->if_names || daemon->if_addrs)
{
int found = 0;
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
found = tmp->used = 1;
{
tmp->used = 1;
return 1;
}
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (sockaddr_isequal(&tmp->addr, addr))
found = tmp->used = 1;
if (!found)
return 0;
if (tmp->addr.sa.sa_family == family)
{
if (family == AF_INET &&
tmp->addr.in.sin_addr.s_addr == addr->addr.addr4.s_addr)
{
tmp->used = 1;
return 1;
}
#ifdef HAVE_IPV6
else if (family == AF_INET6 &&
IN6_ARE_ADDR_EQUAL(&tmp->addr.in6.sin6_addr,
&addr->addr.addr6))
{
tmp->used = 1;
return 1;
}
#endif
}
/* check whether the interface IP has been added already
it is possible to have multiple interfaces with the same address */
for (; iface; iface = iface->next)
if (sockaddr_isequal(&iface->addr, addr))
break;
if (iface)
return 0;
}
return 1;
}
/* This does two different jobs: if chainp is non-NULL, it puts
a list of all the interfaces allowed by config into *chainp.
If chainp is NULL, it returns 1 if addr is an address of an interface
allowed by config and if that address is IPv4, it fills in the
netmask of the interface.
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;
If chainp is non-NULL, a zero return indicates a fatal error.
/* 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;
If chainp is NULL, errors result in a match failure and zero return.
*/
int enumerate_interfaces(struct daemon *daemon, struct irec **chainp,
union mysockaddr *test_addrp, struct in_addr *netmaskp)
{
#if defined(HAVE_LINUX_IPV6_PROC) && defined(HAVE_IPV6)
FILE *f;
#ifdef HAVE_LINUX_NETWORK
ifr.ifr_ifindex = if_index;
#endif
union mysockaddr addr;
struct irec *iface = NULL;
char *buf, *ptr;
struct ifreq *ifr = NULL;
struct ifconf ifc;
int lastlen = 0;
int len = 20 * sizeof(struct ifreq);
int fd = socket(PF_INET, SOCK_DGRAM, 0);
struct in_addr netmask;
int ret = 0;
netmask.s_addr = 0; /* eliminate warning */
if (fd == -1)
return 0;
#ifdef HAVE_IPV6
if (test_addrp && test_addrp->sa.sa_family == AF_INET6)
test_addrp->in6.sin6_flowinfo = htonl(0);
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
while (1)
{
buf = safe_malloc(len);
ifc.ifc_len = len;
ifc.ifc_buf = buf;
if (ioctl(fd, SIOCGIFCONF, &ifc) < 0)
ioctl(fd, SIOCGIFFLAGS, &ifr) == -1)
{
if (errno != EINVAL || lastlen != 0)
goto exit;
}
else
if (fd != -1)
{
if (ifc.ifc_len == lastlen)
break; /* got a big enough buffer now */
lastlen = ifc.ifc_len;
int errsave = errno;
close(fd);
errno = errsave;
}
len += 10*sizeof(struct ifreq);
free(buf);
return 0;
}
for (ptr = buf; ptr < buf + ifc.ifc_len; )
{
#ifdef HAVE_SOCKADDR_SA_LEN
/* subsequent entries may not be aligned, so copy into
an aligned buffer to avoid nasty complaints about
unaligned accesses. */
int ifr_len = ((struct ifreq *)ptr)->ifr_addr.sa_len + IF_NAMESIZE;
if (!(ifr = realloc(ifr, ifr_len)))
goto exit;
memcpy(ifr, ptr, ifr_len);
ptr += ifr_len;
#else
ifr = (struct ifreq *)ptr;
ptr += sizeof(struct ifreq);
#endif
close(fd);
/* copy address since getting flags overwrites */
if (ifr->ifr_addr.sa_family == AF_INET)
/* 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))
{
addr.in = *((struct sockaddr_in *) &ifr->ifr_addr);
addr.in.sin_port = htons(daemon->port);
if (ioctl(fd, SIOCGIFNETMASK, ifr) == -1)
goto exit;
netmask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
}
#ifdef HAVE_IPV6
else if (ifr->ifr_addr.sa_family == AF_INET6)
struct iname *lo;
for (lo = daemon->if_names; lo; lo = lo->next)
if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0)
{
#ifdef HAVE_BROKEN_SOCKADDR_IN6
addr.in6 = *((struct my_sockaddr_in6 *) &ifr->ifr_addr);
#else
addr.in6 = *((struct sockaddr_in6 *) &ifr->ifr_addr);
#endif
addr.in6.sin6_port = htons(daemon->port);
addr.in6.sin6_flowinfo = htonl(0);
lo->isloop = 1;
break;
}
#endif
else
continue; /* unknown address family */
if (ioctl(fd, SIOCGIFFLAGS, ifr) < 0)
goto exit;
if (iface_allowed(daemon, iface, ifr->ifr_name, ifr->ifr_flags & IFF_LOOPBACK, &addr))
{
if (chainp)
if (!lo && (lo = malloc(sizeof(struct iname))))
{
struct irec *new = safe_malloc(sizeof(struct irec));
new->addr = addr;
new->netmask = netmask;
new->next = iface;
iface = new;
}
else if (sockaddr_isequal(&addr, test_addrp))
{
*netmaskp = netmask;
ret = 1;
goto exit;
}
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;
}
}
#if defined(HAVE_LINUX_IPV6_PROC) && defined(HAVE_IPV6)
/* IPv6 addresses don't seem to work with SIOCGIFCONF. Barf */
/* This code snarfed from net-tools 1.60 and certainly linux specific, though
it shouldn't break on other Unices, and their SIOGIFCONF might work. */
if ((f = fopen(IP6INTERFACES, "r")))
{
unsigned int plen, scope, flags, if_idx;
char devname[21], addrstring[33];
if (addr->sa.sa_family == AF_INET &&
!iface_check(daemon, AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name))
return 1;
while (fscanf(f, "%32s %x %x %x %x %20s\n",
addrstring, &if_idx, &plen, &scope, &flags, devname) != EOF)
{
int i;
struct ifreq sifr;
unsigned char *addr6p = (unsigned char *) &addr.in6.sin6_addr;
memset(&addr, 0, sizeof(addr));
addr.sa.sa_family = AF_INET6;
for (i=0; i<16; i++)
#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))))
{
unsigned int byte;
sscanf(addrstring+i+i, "%02x", &byte);
addr6p[i] = byte;
iface->addr = *addr;
iface->netmask = netmask;
iface->next = *irecp;
*irecp = iface;
return 1;
}
addr.in6.sin6_port = htons(daemon->port);
addr.in6.sin6_flowinfo = htonl(0);
addr.in6.sin6_scope_id = htonl(scope);
strncpy(sifr.ifr_name, devname, IF_NAMESIZE);
if (ioctl(fd, SIOCGIFFLAGS, &sifr) < 0)
goto exit;
errno = ENOMEM;
return 0;
}
if (iface_allowed(daemon, iface, sifr.ifr_name, sifr.ifr_flags & IFF_LOOPBACK, &addr))
{
if (chainp)
{
struct irec *new = safe_malloc(sizeof(struct irec));
new->addr = addr;
new->next = iface;
iface = new;
}
else if (sockaddr_isequal(&addr, test_addrp))
{
ret = 1;
goto exit;
}
}
}
fclose(f);
}
#endif /* LINUX */
#ifdef HAVE_IPV6
static int iface_allowed_v6(struct daemon *daemon, struct in6_addr *local,
int scope, int if_index, void *vparam)
{
union mysockaddr addr;
struct in_addr netmask; /* dummy */
if (chainp)
{
*chainp = iface;
ret = 1;
}
netmask.s_addr = 0;
exit:
if (buf)
free(buf);
#ifdef HAVE_SOCKADDR_SA_LEN
if (ifr)
free(ifr);
addr.in6.sin6_len = sizeof(addr.in6);
#endif
close(fd);
addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = *local;
addr.in6.sin6_port = htons(daemon->port);
addr.in6.sin6_scope_id = scope;
addr.in6.sin6_flowinfo = 0;
return ret;
return iface_allowed(daemon, (struct irec **)vparam, if_index, &addr, netmask);
}
#endif
#if defined(HAVE_IPV6) && (defined(IP_PKTINFO) || (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
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
}
#if defined(HAVE_IPV6) && \
(defined(HAVE_LINUX_NETWORK) || \
(defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
static int create_ipv6_listener(struct listener **link, int port)
{
union mysockaddr addr;
......@@ -276,9 +197,10 @@ static int create_ipv6_listener(struct listener **link, int port)
addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = in6addr_any;
addr.in6.sin6_port = htons(port);
addr.in6.sin6_flowinfo = htonl(0);
addr.in6.sin6_flowinfo = 0;
addr.in6.sin6_scope_id = 0;
#ifdef HAVE_SOCKADDR_SA_LEN
addr.in6.sin6_len = sizeof(struct sockaddr_in6);
addr.in6.sin6_len = sizeof(addr.in6);
#endif
/* No error of the kernel doesn't support IPv6 */
......@@ -332,7 +254,7 @@ static int create_ipv6_listener(struct listener **link, int port)
struct listener *create_wildcard_listeners(int port)
{
#if !(defined(IP_PKTINFO) || (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
#if !(defined(HAVE_LINUX_NETWORK) || (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
port = 0; /* eliminate warning */
return NULL;
#else
......@@ -369,7 +291,7 @@ struct listener *create_wildcard_listeners(int port)
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1 ||
(flags = fcntl(fd, F_GETFL, 0)) == -1 ||
fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1 ||
#if defined(IP_PKTINFO)
#if defined(HAVE_LINUX_NETWORK)
setsockopt(fd, SOL_IP, IP_PKTINFO, &opt, sizeof(opt)) == -1 ||
#elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt)) == -1 ||
......@@ -393,14 +315,14 @@ struct listener *create_wildcard_listeners(int port)
#endif
}
struct listener *create_bound_listeners(struct irec *interfaces, int port)
struct listener *create_bound_listeners(struct daemon *daemon)
{
struct listener *listeners = NULL;
struct irec *iface;
int flags = port, opt = 1;
int flags, opt = 1;
for (iface = interfaces ;iface; iface = iface->next)
for (iface = daemon->interfaces; iface; iface = iface->next)
{
struct listener *new = safe_malloc(sizeof(struct listener));
new->family = iface->addr.sa.sa_family;
......@@ -439,9 +361,9 @@ struct listener *create_bound_listeners(struct irec *interfaces, int port)
else
#endif
{
char addrbuff[ADDRSTRLEN];
prettyprint_addr(&iface->addr, addrbuff);
die(_("failed to bind listening socket for %s: %s"), addrbuff);
prettyprint_addr(&iface->addr, daemon->namebuff);
die(_("failed to bind listening socket for %s: %s"),
daemon->namebuff);
}
}
else
......@@ -611,7 +533,7 @@ void reload_servers(char *fname, struct daemon *daemon)
#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);
......@@ -622,11 +544,12 @@ void reload_servers(char *fname, struct daemon *daemon)
else if (inet_pton(AF_INET6, token, &addr.in6.sin6_addr) > 0)
{
#ifdef HAVE_SOCKADDR_SA_LEN
source_addr.in6.sin6_len = addr.in6.sin6_len = sizeof(struct sockaddr_in6);
source_addr.in6.sin6_len = addr.in6.sin6_len = sizeof(source_addr.in6);
#endif
source_addr.in6.sin6_family = addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_port = htons(NAMESERVER_PORT);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = htonl(0);
source_addr.in6.sin6_flowinfo = addr.in6.sin6_flowinfo = 0;
source_addr.in6.sin6_scope_id = addr.in6.sin6_scope_id = 0;
source_addr.in6.sin6_addr = in6addr_any;
source_addr.in6.sin6_port = htons(daemon->query_port);
}
......
......@@ -10,8 +10,6 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
struct myoption {
......@@ -21,7 +19,7 @@ struct myoption {
int val;
};
#define OPTSTRING "31yZDNLERKzowefnbvhdkqr:m:p:c:l:s:i:t:u:g:a:x:S:C:A:T:H:Q:I:B:F:G:O:M:X:V:U:j:P:J:W:Y:2:4:"
#define OPTSTRING "531yZDNLERKzowefnbvhdkqr:m:p:c:l:s:i:t:u:g:a:x:S:C:A:T:H:Q:I:B:F:G:O:M:X:V:U:j:P:J:W:Y:2:4:"
static const struct myoption opts[] = {
{"version", 0, 0, 'v'},
......@@ -83,6 +81,7 @@ static const struct myoption opts[] = {
{"enable-dbus", 0, 0, '1'},
{"bootp-dynamic", 0, 0, '3'},
{"dhcp-mac", 1, 0, '4'},
{"no-ping", 0, 0, '5'},
{0, 0, 0, 0}
};
......@@ -112,6 +111,7 @@ static const struct optflags optmap[] = {
{ 'y', OPT_LOCALISE },
{ '1', OPT_DBUS },
{ '3', OPT_BOOTP_DYNAMIC },
{ '5', OPT_NO_PING },
{ 'v', 0},
{ 'w', 0},
{ 0, 0 }
......@@ -179,6 +179,7 @@ static const struct {
{ "-2, --no-dhcp-interface=interface", gettext_noop("Do not provide DHCP on this interface, only provide DNS."), NULL },
{ "-3, --bootp-dynamic", gettext_noop("Enable dynamic address allocation for bootp."), NULL },
{ "-4, --dhcp-mac=<id>,<mac address>", gettext_noop("Map MAC address (with wildcards) to option set."), NULL },
{ "-5, --no-ping", gettext_noop("Disable ICMP echo address checking in the DHCP server."), NULL },
{ NULL, NULL, NULL }
};
......@@ -300,7 +301,6 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
daemon->namebuff = buff;
/* Set defaults - everything else is zero or NULL */
daemon->min_leasetime = UINT_MAX;
daemon->cachesize = CACHESIZ;
daemon->port = NAMESERVER_PORT;
daemon->default_resolv.is_default = 1;
......@@ -704,16 +704,17 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
{
new->addr.sa.sa_family = AF_INET;
#ifdef HAVE_SOCKADDR_SA_LEN
new->addr.in.sin_len = sizeof(struct sockaddr_in);
new->addr.in.sin_len = sizeof(new->addr.in);
#endif
}
#ifdef HAVE_IPV6
else if (arg && inet_pton(AF_INET6, arg, &new->addr.in6.sin6_addr) > 0)
{
new->addr.sa.sa_family = AF_INET6;
new->addr.in6.sin6_flowinfo = htonl(0);
new->addr.in6.sin6_flowinfo = 0;
new->addr.in6.sin6_scope_id = 0;
#ifdef HAVE_SOCKADDR_SA_LEN
new->addr.in6.sin6_len = sizeof(struct sockaddr_in6);
new->addr.in6.sin6_len = sizeof(new->addr.in6);
#endif
}
#endif
......@@ -841,9 +842,10 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
newlist->addr.in6.sin6_port = htons(serv_port);
newlist->source_addr.in6.sin6_port = htons(source_port);
newlist->addr.sa.sa_family = newlist->source_addr.sa.sa_family = AF_INET6;
newlist->addr.in6.sin6_flowinfo = newlist->source_addr.in6.sin6_flowinfo = htonl(0);
newlist->addr.in6.sin6_flowinfo = newlist->source_addr.in6.sin6_flowinfo = 0;
newlist->addr.in6.sin6_scope_id = newlist->source_addr.in6.sin6_scope_id = 0;
#ifdef HAVE_SOCKADDR_SA_LEN
newlist->addr.in6.sin6_len = newlist->source_addr.in6.sin6_len = sizeof(struct sockaddr_in6);
newlist->addr.in6.sin6_len = newlist->source_addr.in6.sin6_len = sizeof(newlist->addr.in6);
#endif
if (source)
{
......@@ -1084,9 +1086,6 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
}
}
}
if (new->lease_time < daemon->min_leasetime)
daemon->min_leasetime = new->lease_time;
break;
}
......@@ -1226,11 +1225,8 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
free(new);
}
else
{
if ((new->flags & CONFIG_TIME) && new->lease_time < daemon->min_leasetime)
daemon->min_leasetime = new->lease_time;
daemon->dhcp_conf = new;
}
break;
}
......@@ -1808,9 +1804,9 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
else
die(_("bad command line options: %s."),
#ifdef HAVE_GETOPT_LONG
problem ? problem : "try --help"
problem ? problem : _("try --help")
#else
problem ? problem : "try -w"
problem ? problem : _("try -w")
#endif
);
}
......
......@@ -10,8 +10,6 @@
GNU General Public License for more details.
*/
/* Author's email: simon@thekelleys.org.uk */
#include "dnsmasq.h"
#define BOOTREQUEST 1
......@@ -44,9 +42,12 @@
#define OPTION_CLIENT_ID 61
#define OPTION_USER_CLASS 77
#define OPTION_CLIENT_FQDN 81
#define OPTION_AGENT_ID 82
#define OPTION_SUBNET_SELECT 118
#define OPTION_END 255
#define SUBOPT_SUBNET_SELECT 5 /* RFC 3527 */
#define DHCPDISCOVER 1
#define DHCPOFFER 2
#define DHCPREQUEST 3
......@@ -57,19 +58,25 @@
#define DHCPINFORM 8
#define have_config(config, mask) ((config) && ((config)->flags & (mask)))
#define option_len(opt) ((int)(((unsigned char *)(opt))[1]))
#define option_ptr(opt) ((void *)&(((unsigned char *)(opt))[2]))
static unsigned int calc_time(struct dhcp_context *context, struct dhcp_config *config,
struct dhcp_lease *lease, unsigned char *opt, time_t now);
static unsigned char *option_put(unsigned char *p, unsigned char *end, int opt, int len, unsigned int val);
static unsigned char *option_end(unsigned char *p, unsigned char *end, struct dhcp_packet *start);
static unsigned char *option_end(unsigned char *p, unsigned char *end,
unsigned char *agent_id, struct dhcp_packet *start);
static unsigned char *option_put_string(unsigned char *p, unsigned char *end,
int opt, char *string, int null_term);
static void bootp_option_put(struct dhcp_packet *mess,
struct dhcp_boot *boot_opts, struct dhcp_netid *netids);
static int option_len(unsigned char *opt);
static void *option_ptr(unsigned char *opt);
static struct in_addr option_addr(unsigned char *opt);
static unsigned int option_uint(unsigned char *opt, int size);
static void log_packet(char *type, struct in_addr *addr, unsigned char *hwaddr, int hw_len, char *interface, char *string);
static char *print_mac(struct daemon *daemon, unsigned char *mac, int len);
static void log_packet(struct daemon *daemon, char *type, struct in_addr *addr,
struct dhcp_packet *mess, char *interface, char *string);
static unsigned char *option_find(struct dhcp_packet *mess, size_t size, int opt_type, int minsize);
static unsigned char *option_find1(unsigned char *p, unsigned char *end, int opt, int minsize);
static unsigned char *do_req_options(struct dhcp_context *context,
unsigned char *p, unsigned char *end,
unsigned char *req_options,
......@@ -80,6 +87,7 @@ static unsigned char *do_req_options(struct dhcp_context *context,
unsigned char fqdn_flags,
int null_term);
size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *iface_name,
size_t sz, time_t now, int unicast_dest)
{
......@@ -89,9 +97,8 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
struct dhcp_mac *mac;
struct dhcp_netid_list *id_list;
int clid_len = 0, ignore = 0;
struct dhcp_packet *mess = &daemon->dhcp_packet->data;
unsigned char *p = mess->options + sizeof(u32); /* skip cookie */
unsigned char *end = (unsigned char *)(daemon->dhcp_packet + 1);
struct dhcp_packet *mess = daemon->dhcp_packet.iov_base;
unsigned char *p, *end = (unsigned char *)(mess + 1);
char *hostname = NULL, *offer_hostname = NULL, *client_hostname = NULL;
int hostname_auth = 0, borken_opt = 0;
unsigned char *req_options = NULL;
......@@ -104,11 +111,12 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
unsigned int mess_type = 0;
unsigned char fqdn_flags = 0;
subnet_addr.s_addr = 0;
unsigned char *agent_id = NULL;
if (mess->op != BOOTREQUEST)
if (mess->op != BOOTREQUEST || mess->hlen > DHCP_CHADDR_MAX)
return 0;
if (mess->hlen > DHCP_CHADDR_MAX)
if (mess->htype == 0 && mess->hlen != 0)
return 0;
/* check for DHCP rather than BOOTP */
......@@ -120,13 +128,52 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
if (*((u32 *)&mess->options) != htonl(DHCP_COOKIE))
return 0;
/* two things to note here: expand_buf may move the packet,
so reassign mess from daemon->packet. Also, the size
sent includes the IP and UDP headers, hence the magic "-28" */
if ((opt = option_find(mess, sz, OPTION_MAXMESSAGE, 2)))
{
size_t size = (size_t)option_uint(opt, 2) - 28;
if (size > DHCP_PACKET_MAX)
size = DHCP_PACKET_MAX;
else if (size < sizeof(struct dhcp_packet))
size = sizeof(struct dhcp_packet);
if (expand_buf(&daemon->dhcp_packet, size))
{
mess = daemon->dhcp_packet.iov_base;
end = ((unsigned char *)mess) + size;
}
}
/* Some buggy clients set ciaddr when they shouldn't, so clear that here since
it can affect the context-determination code. */
if ((option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ) || mess_type == DHCPDISCOVER))
mess->ciaddr.s_addr = 0;
/* Check for RFC3011 subnet selector */
if ((opt = option_find(mess, sz, OPTION_SUBNET_SELECT, INADDRSZ)))
if ((opt = option_find(mess, sz, OPTION_AGENT_ID, 1)))
{
/* Any agent-id needs to be copied back out, verbatim, as the last option
in the packet. Here, we shift it to the very end of the buffer, if it doesn't
get overwritten, then it will be shuffled back at the end of processing.
Note that the incoming options must not be overwritten here, so there has to
be enough free space at the end of the packet to copy the option. */
unsigned int total = option_len(opt) + 2;
unsigned char *last_opt = option_find(mess, sz, OPTION_END, 0);
if (last_opt && last_opt < end - total)
{
agent_id = end - total;
memcpy(agent_id, opt, total);
}
/* look for RFC3527 Link selection sub-option */
if ((opt = option_find1(option_ptr(opt), option_ptr(opt) + option_len(opt), SUBOPT_SUBNET_SELECT, INADDRSZ)))
subnet_addr = option_addr(opt);
}
/* Check for RFC3011 subnet selector - only if RFC3527 one not present */
if (subnet_addr.s_addr == 0 && (opt = option_find(mess, sz, OPTION_SUBNET_SELECT, INADDRSZ)))
subnet_addr = option_addr(opt);
/* If there is no client identifier option, use the hardware address */
......@@ -137,7 +184,6 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
}
/* do we have a lease in store? */
if (mess->htype != 0 && mess->hlen != 0)
lease = lease_find_by_client(mess->chaddr, mess->hlen, mess->htype, clid, clid_len);
/* If this request is missing a clid, but we've seen one before,
......@@ -149,31 +195,14 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
}
}
/* htype == 0 is only allowed in DHCPINFORM,
this seems to be a microsoftism. */
if (mess->htype == 0)
{
if (mess_type != DHCPINFORM || mess->hlen != 0)
return 0;
}
else if (mess->hlen == 0)
return 0;
for (mac = daemon->dhcp_macs; mac; mac = mac->next)
if (mac->hwaddr_len == mess->hlen &&
(mac->hwaddr_type == mess->htype || mac->hwaddr_type == 0))
{
int i;
unsigned int mask = mac->mask;
for (i = mac->hwaddr_len - 1; i >= 0; i--, mask = mask >> 1)
if (mask & 1)
mac->hwaddr[i] = mess->chaddr[i];
if (memcmp(mac->hwaddr, mess->chaddr, mac->hwaddr_len) == 0)
(mac->hwaddr_type == mess->htype || mac->hwaddr_type == 0) &&
memcmp_masked(mac->hwaddr, mess->chaddr, mess->hlen, mac->mask))
{
mac->netid.next = netid;
netid = &mac->netid;
}
}
/* Determine network for this packet. Our caller will have already linked all the
contexts which match the addresses of the receiving interface but if the
......@@ -225,6 +254,7 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
fallback = context->local;
mess->op = BOOTREPLY;
p = mess->options + sizeof(u32); /* skip cookie */
config = find_config(daemon->dhcp_conf, context, clid, clid_len,
mess->chaddr, mess->hlen, mess->htype, NULL);
......@@ -236,6 +266,10 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
char save = mess->file[128];
struct in_addr *logaddr = NULL;
/* must have a MAC addr for bootp */
if (mess->htype == 0 || mess->hlen == 0)
return 0;
if (have_config(config, CONFIG_DISABLE))
message = _("disabled");
......@@ -271,6 +305,7 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
mess->yiaddr = config->addr;
if ((lease = lease_find_by_addr(config->addr)) &&
(lease->hwaddr_len != mess->hlen ||
lease->hwaddr_type != mess->htype ||
memcmp(lease->hwaddr, mess->chaddr, lease->hwaddr_len) != 0))
message = _("address in use");
}
......@@ -313,18 +348,18 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
lease_set_hwaddr(lease, mess->chaddr, NULL, mess->hlen, mess->htype, 0);
if (hostname)
lease_set_hostname(lease, hostname, daemon->domain_suffix, 1);
lease_set_expires(lease, 0); /* infinite lease */
lease_set_expires(lease, 0xffffffff, now); /* infinite lease */
p = do_req_options(context, p, end, NULL, daemon,
hostname, netid, subnet_addr, fqdn_flags, 0);
/* must do this after do_req_options since it overwrites filename field. */
mess->siaddr = context->local;
bootp_option_put(mess, daemon->boot_config, netid);
p = option_end(p, end, mess);
p = option_end(p, end, NULL, mess);
}
}
log_packet(NULL, logaddr, mess->chaddr, mess->hlen, iface_name, message);
log_packet(daemon, NULL, logaddr, mess, iface_name, message);
mess->file[128] = save;
if (message)
......@@ -494,7 +529,7 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
if (!(opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))
return 0;
log_packet("DECLINE", option_ptr(opt), mess->chaddr, mess->hlen, iface_name, message);
log_packet(daemon, "DECLINE", option_ptr(opt), mess, iface_name, message);
if (lease && lease->addr.s_addr == option_addr(opt).s_addr)
lease_prune(lease, now);
......@@ -522,21 +557,45 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
else
message = _("unknown lease");
log_packet("RELEASE", &mess->ciaddr, mess->chaddr, mess->hlen, iface_name, message);
log_packet(daemon, "RELEASE", &mess->ciaddr, mess, iface_name, message);
return 0;
case DHCPDISCOVER:
if (ignore || have_config(config, CONFIG_DISABLE))
{
struct in_addr addr;
message = _("ignored");
opt = NULL;
}
else
{
struct in_addr addr, conf;
if ((opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))
addr = option_addr(opt);
if (ignore || have_config(config, CONFIG_DISABLE))
message = _("ignored");
else if (have_config(config, CONFIG_ADDR) &&
(!(ltmp = lease_find_by_addr(config->addr)) || ltmp == lease))
mess->yiaddr = config->addr;
conf.s_addr = 0;
if (have_config(config, CONFIG_ADDR))
{
if ((ltmp = lease_find_by_addr(config->addr)) && ltmp != lease)
syslog(LOG_WARNING, _("not using configured address %s because it is leased to %s"),
inet_ntoa(config->addr), print_mac(daemon, ltmp->hwaddr, ltmp->hwaddr_len));
else
{
struct dhcp_context *tmp;
for (tmp = context; tmp; tmp = tmp->current)
if (context->local.s_addr == config->addr.s_addr)
break;
if (tmp)
syslog(LOG_WARNING, _("not using configured address %s because it is in use by the server"),
inet_ntoa(config->addr));
else
conf = config->addr;
}
}
if (conf.s_addr)
mess->yiaddr = conf;
else if (lease && address_available(context, lease->addr))
mess->yiaddr = lease->addr;
else if (opt && address_available(context, addr) && !lease_find_by_addr(addr) &&
......@@ -544,9 +603,10 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
mess->yiaddr = addr;
else if (!address_allocate(context, daemon, &mess->yiaddr, mess->chaddr, mess->hlen, netid, now))
message = _("no address available");
log_packet("DISCOVER", opt ? &addr : NULL, mess->chaddr, mess->hlen, iface_name, message);
}
log_packet(daemon, "DISCOVER", opt ? (struct in_addr *)option_ptr(opt) : NULL, mess, iface_name, message);
if (message || !(context = narrow_context(context, mess->yiaddr)))
return 0;
......@@ -556,16 +616,7 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
netid = &context->netid;
}
time = have_config(config, CONFIG_TIME) ? config->lease_time : context->lease_time;
if ((opt = option_find(mess, sz, OPTION_LEASE_TIME, 4)))
{
unsigned int req_time = option_uint(opt, 4);
if (time == 0xffffffff || (req_time != 0xffffffff && req_time < time))
time = req_time;
}
else if (lease && lease->expires != 0)
time = (unsigned int)difftime(lease->expires, now);
time = calc_time(context, config, lease, option_find(mess, sz, OPTION_LEASE_TIME, 4), now);
mess->siaddr = context->local;
bootp_option_put(mess, daemon->boot_config, netid);
p = option_put(p, end, OPTION_MESSAGE_TYPE, 1, DHCPOFFER);
......@@ -579,9 +630,9 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
}
p = do_req_options(context, p, end, req_options, daemon,
offer_hostname, netid, subnet_addr, fqdn_flags, borken_opt);
p = option_end(p, end, mess);
p = option_end(p, end, agent_id, mess);
log_packet("OFFER" , &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, NULL);
log_packet(daemon, "OFFER" , &mess->yiaddr, mess, iface_name, NULL);
return p - (unsigned char *)mess;
case DHCPREQUEST:
......@@ -638,11 +689,17 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
mess->yiaddr = mess->ciaddr;
}
log_packet("REQUEST", &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, NULL);
log_packet(daemon, "REQUEST", &mess->yiaddr, mess, iface_name, NULL);
if (!message)
{
struct dhcp_config *addr_config;
struct dhcp_context *tmp = NULL;
if (have_config(config, CONFIG_ADDR))
for (tmp = context; tmp; tmp = tmp->current)
if (context->local.s_addr == config->addr.s_addr)
break;
if (!(context = narrow_context(context, mess->yiaddr)))
{
......@@ -660,8 +717,8 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
/* Check if a new static address has been configured. Be very sure that
when the client does DISCOVER, it will get the static address, otherwise
an endless protocol loop will ensue. */
else if (have_config(config, CONFIG_ADDR) &&
else if (!tmp &&
have_config(config, CONFIG_ADDR) &&
config->addr.s_addr != mess->yiaddr.s_addr &&
(!(ltmp = lease_find_by_addr(config->addr)) || ltmp == lease))
message = _("static lease available");
......@@ -679,7 +736,7 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
if (message)
{
log_packet("NAK", &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, message);
log_packet(daemon, "NAK", &mess->yiaddr, mess, iface_name, message);
mess->siaddr.s_addr = mess->yiaddr.s_addr = 0;
bootp_option_put(mess, NULL, NULL);
......@@ -704,7 +761,7 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
hostname_auth = 1;
}
log_packet("ACK", &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, hostname);
log_packet(daemon, "ACK", &mess->yiaddr, mess, iface_name, hostname);
if (context->netid.net)
{
......@@ -712,18 +769,11 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
netid = &context->netid;
}
time = have_config(config, CONFIG_TIME) ? config->lease_time : context->lease_time;
if ((opt = option_find(mess, sz, OPTION_LEASE_TIME, 4)))
{
unsigned int req_time = option_uint(opt, 4);
if (time == 0xffffffff || (req_time != 0xffffffff && req_time < time))
time = req_time;
}
time = calc_time(context, config, NULL, option_find(mess, sz, OPTION_LEASE_TIME, 4), now);
lease_set_hwaddr(lease, mess->chaddr, clid, mess->hlen, mess->htype, clid_len);
if (hostname)
lease_set_hostname(lease, hostname, daemon->domain_suffix, hostname_auth);
lease_set_expires(lease, time == 0xffffffff ? 0 : now + (time_t)time);
lease_set_expires(lease, time, now);
mess->siaddr = context->local;
bootp_option_put(mess, daemon->boot_config, netid);
......@@ -735,20 +785,20 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
while (fuzz > (time/16))
fuzz = fuzz/2;
p = option_put(p, end, OPTION_T1, 4, (time/2) - fuzz);
p = option_put(p, end, OPTION_T2, 4, ((time * 7)/8) - fuzz);
p = option_put(p, end, OPTION_T2, 4, ((time/8)*7) - fuzz);
}
p = do_req_options(context, p, end, req_options, daemon,
hostname, netid, subnet_addr, fqdn_flags, borken_opt);
}
p = option_end(p, end, mess);
p = option_end(p, end, agent_id, mess);
return p - (unsigned char *)mess;
case DHCPINFORM:
if (ignore || have_config(config, CONFIG_DISABLE))
message = _("ignored");
log_packet("INFORM", &mess->ciaddr, mess->chaddr, mess->hlen, iface_name, message);
log_packet(daemon, "INFORM", &mess->ciaddr, mess, iface_name, message);
if (message || mess->ciaddr.s_addr == 0 ||
!(context = narrow_context(context, mess->ciaddr)))
......@@ -768,46 +818,71 @@ size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *ifa
hostname = host_from_dns(daemon, mess->yiaddr);
p = do_req_options(context, p, end, req_options, daemon,
hostname, netid, subnet_addr, fqdn_flags, borken_opt);
p = option_end(p, end, mess);
p = option_end(p, end, agent_id, mess);
log_packet("ACK", &mess->ciaddr, mess->chaddr, mess->hlen, iface_name, hostname);
log_packet(daemon, "ACK", &mess->ciaddr, mess, iface_name, hostname);
return p - (unsigned char *)mess;
}
return 0;
}
static void log_packet(char *type, struct in_addr *addr, unsigned char *hwaddr, int hw_len, char *interface, char *string)
static unsigned int calc_time(struct dhcp_context *context, struct dhcp_config *config,
struct dhcp_lease *lease, unsigned char *opt, time_t now)
{
char buff[(DHCP_CHADDR_MAX * 3) + 1];
char *p = buff;
unsigned int time = have_config(config, CONFIG_TIME) ? config->lease_time : context->lease_time;
if (opt)
{
unsigned int req_time = option_uint(opt, 4);
if (req_time < 120 )
req_time = 120; /* sanity */
if (time == 0xffffffff || (req_time != 0xffffffff && req_time < time))
time = req_time;
}
else if (lease && lease->expires != 0 && difftime(lease->expires, now) > 0.0)
{
unsigned int lease_time = (unsigned int)difftime(lease->expires, now);
/* put a floor on lease-remaining time. */
if (lease_time < 360 )
lease_time = 360;
if (time > lease_time)
time = lease_time;
}
return time;
}
static char *print_mac(struct daemon *daemon, unsigned char *mac, int len)
{
char *p = daemon->namebuff;
int i;
*buff = 0;
for (i = 0; i < hw_len - 1; i++)
p += sprintf(p, "%.2x:", hwaddr[i]);
p += sprintf(p, "%.2x ", hwaddr[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;
}
static void log_packet(struct daemon *daemon, char *type, struct in_addr *addr,
struct dhcp_packet *mess, char *interface, char *string)
{
syslog(LOG_INFO, "%s%s(%s) %s%s%s%s",
type ? "DHCP" : "BOOTP",
type ? type : "",
interface,
addr ? inet_ntoa(*addr) : "",
addr ? " " : "",
buff,
print_mac(daemon, mess->chaddr, mess->hlen),
string ? string : "");
}
static int option_len(unsigned char *opt)
{
return opt[1];
}
static void *option_ptr(unsigned char *opt)
{
return &opt[2];
}
static struct in_addr option_addr(unsigned char *opt)
{
/* this worries about unaligned data in the option. */
......@@ -891,8 +966,16 @@ static unsigned char *option_put(unsigned char *p, unsigned char *end, int opt,
return p;
}
static unsigned char *option_end(unsigned char *p, unsigned char *end, struct dhcp_packet *start)
static unsigned char *option_end(unsigned char *p, unsigned char *end,
unsigned char *agent_id, struct dhcp_packet *start)
{
/* shuffle agent-id back down if we have room for it */
if (agent_id && p < agent_id)
{
memmove(p, agent_id, end - agent_id);
p += end - agent_id;
}
*(p++) = OPTION_END;
while ((p < end) && (p - ((unsigned char *)start) < MIN_PACKETSZ))
*p++ = 0;
......@@ -919,61 +1002,54 @@ static unsigned char *option_put_string(unsigned char *p, unsigned char *end, in
return p;
}
static unsigned char *option_find1(unsigned char *p, unsigned char *end, int opt, int *overload)
static unsigned char *option_find1(unsigned char *p, unsigned char *end, int opt, int minsize)
{
if (!p)
return NULL;
while (*p != OPTION_END)
{
if (p >= end)
return 0; /* malformed packet */
return NULL; /* malformed packet */
else if (*p == OPTION_PAD)
p++;
else if (*p == OPTION_OVERLOAD)
{
if (p >= end - 3)
return 0; /* malformed packet */
if (overload)
*overload = *(p+2);
p += 3;
}
else
{
int opt_len;;
int opt_len;
if (p >= end - 2)
return 0; /* malformed packet */
return NULL; /* malformed packet */
opt_len = option_len(p);
if (p >= end - (2 + opt_len))
return 0; /* malformed packet */
if (*p == opt)
return NULL; /* malformed packet */
if (*p == opt && opt_len >= minsize)
return p;
p += opt_len + 2;
}
}
return NULL;
return opt == OPTION_END ? p : NULL;
}
static unsigned char *option_find(struct dhcp_packet *mess, size_t size, int opt_type, int minsize)
{
int overload = 0;
unsigned char *ret;
unsigned char *ret, *opt;
/* skip over DHCP cookie; */
ret = option_find1(&mess->options[0] + sizeof(u32), ((unsigned char *)mess) + size, opt_type, &overload);
if (!ret && (overload & 1))
ret = option_find1(&mess->file[0], &mess->file[128], opt_type, &overload);
if ((ret = option_find1(&mess->options[0] + sizeof(u32), ((unsigned char *)mess) + size, opt_type, minsize)))
return ret;
if (!ret && (overload & 2))
ret = option_find1(&mess->sname[0], &mess->file[64], opt_type, &overload);
/* look for overload option. */
if (!(opt = option_find1(&mess->options[0] + sizeof(u32), ((unsigned char *)mess) + size, OPTION_OVERLOAD, 1)))
return NULL;
/* Check the option field is big enough */
if (ret && (option_len(ret) < minsize))
ret = NULL;
/* Can we look in filename area ? */
if ((option_uint(opt, 1) & 1) &&
(ret = option_find1(&mess->file[0], &mess->file[128], opt_type, minsize)))
return ret;
/* finally try sname area */
if ((option_uint(opt, 1) & 2) &&
(ret = option_find1(&mess->sname[0], &mess->sname[64], opt_type, minsize)))
return ret;
return NULL;
}
static int in_list(unsigned char *list, int opt)
......@@ -1055,9 +1131,6 @@ static unsigned char *do_req_options(struct dhcp_context *context,
struct dhcp_opt *opt, *config_opts = daemon->dhcp_opts;
char *vendor_class = NULL;
if (in_list(req_options, OPTION_MAXMESSAGE))
p = option_put(p, end, OPTION_MAXMESSAGE, 2, end - (unsigned char *)daemon->dhcp_packet);
/* rfc3011 says this doesn't need to be in the requested options list. */
if (subnet_addr.s_addr)
p = option_put(p, end, OPTION_SUBNET_SELECT, INADDRSZ, ntohl(subnet_addr.s_addr));
......
......@@ -15,6 +15,10 @@
#include "dnsmasq.h"
#ifdef HAVE_BROKEN_RTC
#include <sys/times.h>
#endif
/* Prefer arc4random(3) over random(3) over rand(3) */
/* Also prefer /dev/urandom over /dev/random, to preserve the entropy pool */
#ifdef HAVE_ARC4RANDOM
......@@ -186,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
}
......@@ -234,21 +237,17 @@ int hostname_isequal(char *a, char *b)
return 1;
}
time_t dnsmasq_time(int fd)
time_t dnsmasq_time(void)
{
#ifdef HAVE_BROKEN_RTC
/* we use uptime as a time-base, rather than epoch time
because epoch time can break when a machine contacts
a nameserver and updates it. */
char buf[30];
lseek(fd, 0, SEEK_SET);
read(fd, buf, 30);
/* ensure the time is terminated even if /proc/uptime sends something unexpected */
buf[29] = 0;
read(fd, buf, 30);
return (time_t)atol(buf);
struct tms dummy;
static long tps = 0;
if (tps == 0)
tps = sysconf(_SC_CLK_TCK);
return (time_t)(times(&dummy)/tps);
#else
fd = 0; /* stop warning */
return time(NULL);
#endif
}
......@@ -361,3 +360,39 @@ int parse_hex(char *in, unsigned char *out, int maxlen,
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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment