import of dnsmasq-2.27.tar.gz
diff --git a/CHANGELOG b/CHANGELOG
index 7df5074..e1dc40e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1639,3 +1639,58 @@
 	    network. Thanks to Lutz Pressler for the bug report and
 	    patch.
 
+version 2.27
+	    Tweaked DHCP behaviour when a client attempts to renew a lease
+            which dnsmasq doesn't know about. Previously that would always
+            result in a DHCPNAK. Now, in dhcp-authoritative mode, the
+            lease will be created, if it's legal. This makes dnsmasq work
+            better if the lease database is lost, for example on an OpenWRT
+	    system which reboots. Thanks to Stephen Rose for work on
+	    this.
+
+	    Added the ability to support RFC-3442 style destination
+	    descriptors in dhcp-options. This makes classless static
+	    routes easy to do, eg dhcp-option=121,192.168.1.0/24,1.2.3.4
+
+	    Added error-checking to the code which writes the lease
+	    file. If this fails for any reason, an error is logged,
+	    and a retry occurs after one minute. This should improve
+	    things eg when a filesystem is full. Thanks to Jens Holze
+	    for the bug report.
+
+	    Fixed breakage of the "/#/ matches any domain" facility
+	    which happened in 2.24. Thanks to Peter Surda for the bug
+	    report.
+
+	    Use "size_t" and "ssize_t" types where appropriate in the
+	    code.
+
+	    Fix buggy CNAME handling in mixed IPv4 and IPv6
+	    queries. Thanks to Andreas Pelme for help finding that.
+
+	    Added some code to attempt to re-transmit DNS queries when 
+	    a network interface comes up.  This helps on DoD links, 
+	    where frequently the packet which triggers dialling is
+            a DNS query, which then gets lost. By re-sending, we can 
+	    avoid the lookup failing. This function is only active
+	    when netlink support is compiled in, and therefore only
+	    under Linux. Thanks to Jean Wolter for help with this.
+
+	    Tweaked the DHCP tag-matching code to work correctly with
+	    NOT-tag conditions. Thanks to Lutz Pressler for finding
+	    the bug.
+
+	    Generalised netid-tag matching in dhcp-range statements to
+	    allow more than one tag.
+
+	    Added --dhcp-mac to do MAC address matching in the same
+	    way as vendorclass and userclass matching. A good
+	    suggestion from Lutz Pressler.
+
+	    Add workaround for buggy early Microsoft DHCP clients
+	    which need zero-termination in string options.
+	    Thanks to Fabiano Pires for help with this.
+
+	    Generalised the DHCP code to cope with any hardware
+	    address type, at least on Linux. *BSD is still limited to
+	    ethernet only.
diff --git a/dnsmasq-rh.spec b/dnsmasq-rh.spec
index 4e48b4d..f3bb664 100644
--- a/dnsmasq-rh.spec
+++ b/dnsmasq-rh.spec
@@ -5,7 +5,7 @@
 ###############################################################################
 
 Name: dnsmasq
-Version: 2.26
+Version: 2.27
 Release: 1
 License: GPL
 Group: System Environment/Daemons
@@ -127,7 +127,7 @@
 %attr(0755,root,root) /etc/rc.d/init.d/dnsmasq
 %attr(0664,root,root) /etc/dnsmasq.conf
 %attr(0755,root,root) /usr/sbin/dnsmasq
-%attr(0644,root,root) /usr/share/man/*/man8/dnsmasq*
+#%attr(0644,root,root) /usr/share/man/*/man8/dnsmasq*
 %attr(0644,root,root) /usr/share/man/man8/dnsmasq*
 %attr(0644,root,root) /usr/share/locale/*/LC_MESSAGES/*
 
diff --git a/dnsmasq-suse.spec b/dnsmasq-suse.spec
index b7a43e8..bb349ec 100644
--- a/dnsmasq-suse.spec
+++ b/dnsmasq-suse.spec
@@ -5,7 +5,7 @@
 ###############################################################################
 
 Name: dnsmasq
-Version: 2.26
+Version: 2.27
 Release: 1
 Copyright: GPL
 Group: Productivity/Networking/DNS/Servers
diff --git a/dnsmasq.conf.example b/dnsmasq.conf.example
index 3d33705..e83f77e 100644
--- a/dnsmasq.conf.example
+++ b/dnsmasq.conf.example
@@ -184,6 +184,10 @@
 # of whose DHCP userclass strings includes the substring "accounts"
 #dhcp-userclass=red,accounts
 
+# Send extra options which are tagged as "red" to any machine whose
+# MAC address matches the pattern.
+#dhcp-mac=red,00:60:8C:*:*:*
+
 # If this line is uncommented, dnsmasq will read /etc/ethers and act
 # on the ethernet-address/IP pairs found there just as if they had
 # been given as --dhcp-host options. Useful if you keep
@@ -204,6 +208,10 @@
 # DNS server - 6
 # broadcast address - 28
 
+# Override the default route supplied by dnsmasq, which assumes the
+# router is the same machine as the one running dnsmasq.
+#dhcp-option=3,1.2.3.4
+
 # Set the NTP time server addresses to 192.168.0.4 and 10.10.0.5
 #dhcp-option=42,192.168.0.4,10.10.0.5
 
@@ -244,6 +252,9 @@
 # probably doesn't support this......
 #dhcp-option=119,eng.apple.com,marketing.apple.com
 
+# Send RFC-3442 classless static routes (note the netmask encoding)
+#dhcp-option=121,192.168.1.0/24,1.2.3.4,10.0.0.0/8,5.6.7.8
+
 # Send encapsulated vendor-class specific options. The vendor-class
 # is sent as DHCP option 60, and all the options marked with the
 # vendor class are send encapsulated in DHCP option 43. The meaning of
diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
index 9a826a5..e461b60 100644
--- a/man/dnsmasq.8
+++ b/man/dnsmasq.8
@@ -349,7 +349,7 @@
 network-id is a alphanumeric label which marks this network so that
 dhcp options may be specified on a per-network basis. 
 When it is prefixed with 'net:' then its meaning changes from setting
-a tag to matching it.
+a tag to matching it. Only one tag may be set, but more than one tag may be matched.
 The end address may be replaced by the keyword 
 .B static
 which tells dnsmasq to enable DHCP for the network specified, but not
@@ -368,7 +368,7 @@
 claiming that name. For example 
 .B --dhcp-host=00:20:e0:3b:13:af,wap,infinite 
 tells dnsmasq to give
-the machine with ethernet address 00:20:e0:3b:13:af the name wap, and
+the machine with hardware address 00:20:e0:3b:13:af the name wap, and
 an infinite DHCP lease. 
 .B --dhcp-host=lap,192.168.0.199 
 tells
@@ -401,9 +401,15 @@
 Ethernet addresses (but not client-ids) may have
 wildcard bytes, so for example 
 .B --dhcp-host=00:20:e0:3b:13:*,ignore 
-will cause dnsmasq to ignore a range of ethernet addresses. Note that
+will cause dnsmasq to ignore a range of hardware addresses. Note that
 the "*" will need to be escaped or quoted on a command line, but not
-in the configuration file.
+in the configuration file. Hardware addresses normally match any
+network (ARP) type, but it is possible to restrict them to a single
+ARP type by preceding them with the ARP-type (in HEX) and "-". so 
+.B --dhcp-host=06-00:20:e0:3b:13:af,1.2.3.4 
+will only match a
+Token-Ring hardware address, since the ARP-address type for token ring
+is 6.
 .TP 
 .B \-Z, --read-ethers
 Read /etc/ethers for information about hosts for the DHCP server. The
@@ -432,6 +438,11 @@
 and a text string. If the optional network-ids are given then
 this option is only sent when all the network-ids are matched.
 
+Special processing is done on a text argument for option 119, to
+conform with RFC 3397, and dotted-quad IP addresses which are followed
+by a slash and then a netmask size are encoded as described in RFC
+3442.
+
 Be careful: no checking is done that the correct type of data for the
 option number is sent, it is quite possible to
 persuade dnsmasq to generate illegal DHCP packets with injudicious use
@@ -476,7 +487,13 @@
 this to set a different printer server for hosts in the class
 "accounts" than for hosts in the class "engineering".
 .TP
-.B \ -J, --dhcp-ignore=<network-id>[,<network-id>]
+.B \-4, --dhcp-mac=<network-id>,<MAC address>
+Map from a MAC address to a network-id. The MAC address may include
+wildcards. For example
+.B --dhcp-mac=3com,01:34:23:*:*:*
+will set the tag "3com" for any host whose MAC address matches the pattern.
+.TP
+.B \-J, --dhcp-ignore=<network-id>[,<network-id>]
 When all the given network-ids match the set of network-ids derived
 from the net, host, vendor and user classes, ignore the host and do
 not allocate it a DHCP lease.
@@ -498,7 +515,9 @@
 Should be set when dnsmasq is definately the only DHCP server on a network.
 It changes the behaviour from strict RFC compliance so that DHCP requests on
 unknown leases from unknown hosts are not ignored. This allows new hosts
-to get a lease without a tedious timeout under all circumstances.
+to get a lease without a tedious timeout under all circumstances. It also 
+allows dnsmasq to rebuild its lease database without each client needing to 
+reaquire a lease, if the database is lost.
 .TP
 .B \-3, --bootp-dynamic
 Enable dynamic allocation of IP addresses to BOOTP clients. Use this
diff --git a/po/de.po b/po/de.po
index efbb70c..8f7ef0e 100644
--- a/po/de.po
+++ b/po/de.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -20,19 +20,19 @@
 msgid "failed to load names from %s: %m"
 msgstr ""
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, c-format
 msgid "bad address at %s line %d"
 msgstr ""
 
 # @Simon: Here I need an example to understand it :)
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr ""
 
 # @Simon: Here I need an example to understand it :)
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "lese %s - %d Adressen"
@@ -68,7 +68,7 @@
 # @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:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "Speicher nicht verfügbar"
 
@@ -95,26 +95,26 @@
 msgid "infinite"
 msgstr "unendlich"
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr "Lokale abzuhörende Adresse(n) angeben."
 
 # @Simon: Quite literal translation, sounds not too polite in german.
 # @Simon: How about: "Bitte die lokalen abzuhörende Adresse(n) angeben."
 # @Simon: = "Please specify the local address(es) to listen on."
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr "Rückkehr-IP-Adresse für alle Geräte in angebenen Domänen"
 
 # @Simon: I hope "Return ipaddr" is similar to "Return-ipaddr" and not "Return the ipaddr ... !"
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr ""
 "'Gefälschte' Rückwärts-Ergebnisse für private Adressbereiche nach RFC1918"
 
 # @Simon: I'm a bit unsure about the meaning of "Fake" here, and the best word for "lookup" is "Nachsehen" 
 # @Simon: (that is "looking-for") but I think that cannot be used. "Ergebnisse" = "results", is that near enough?
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr "Behandle IP-Adr als NXDOMAIN (wehrt Verisign-Platzhalter ab)."
 
@@ -125,17 +125,17 @@
 # @Simon:   "Behandle IP-Adr als NXDOMAIN (gegen Verisigns Platzhalter-Gebrauch)."
 # @Simon: = "Treat ipaddr as NXDOMAIN (defeats Verisigns wildcard usage)." ?
 # @Simon: But the explanatory(?) effect is only a very tiny bit better, I believe - what do U think? 
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr "Angabe der Größe des Caches in Einträgen (Voreinstellung: %s)."
 
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "Angabe der Konfigurationsdatei (Voreinstellung: %s)."
 
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "NICHT in den Hintergrund gehen: Betrieb im Debug-Modus"
 
@@ -143,398 +143,406 @@
 # @Simon: I know it sounds a bit clumsy in english, but "fork" would be hard to understand
 # @Simon: and then I get a problem between "go" and "run" - so...
 # @Simon: "Debug-mode" = "Fehlersuch-Modus", literally, but I think "Debug-Modus" is better :)
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "Anfragen ohne Domänen-Teil NICHT weiterschicken"
 
 # @Simon: "weiterschicken" is rather "pass on" (I hope) but that's the best I found.
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Rückgabe auf sich selbst zeigender MX-Einträge für lokale Geräte"
 
 # @Simon: "self-pointing" is a bit difficult, the meaning is clear but takes 3-4 words to express it in german.
 # @Simon: "Geräte" is about "hard-devices". There is a word for "host" (it is "Wirt") but it would be misleading.
 # @Simon: My online dict suggest "Rechner" (= Computer), but I think "hard-devices" is better because it's more general.
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr "Erweitere einfache Namen in /etc/hosts mit der Domänen-Endung"
 
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr "'unechte' DNS-Anfragen von Windows-Rechnern nicht weiterleiten"
 
 # @Simon: I'm a bit unsure about "spurious"
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr ""
 
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr ""
 
-#: option.c:137
-msgid "Set address or hostname for a specified machine."
-msgstr ""
-
 #: option.c:138
-#, c-format
-msgid "Do NOT load %s file."
+msgid "Set address or hostname for a specified machine."
 msgstr ""
 
 #: option.c:139
 #, c-format
-msgid "Specify a hosts file to be read in addition to %s."
+msgid "Do NOT load %s file."
 msgstr ""
 
 #: option.c:140
-msgid "Specify interface(s) to listen on."
+#, c-format
+msgid "Specify a hosts file to be read in addition to %s."
 msgstr ""
 
 #: option.c:141
-msgid "Specify interface(s) NOT to listen on."
+msgid "Specify interface(s) to listen on."
 msgstr ""
 
 #: option.c:142
-msgid "Map DHCP user class to option set."
+msgid "Specify interface(s) NOT to listen on."
 msgstr ""
 
 #: option.c:143
-msgid "Don't do DHCP for hosts in option set."
+msgid "Map DHCP user class to option set."
 msgstr ""
 
 #: option.c:144
-msgid "Do NOT fork into the background, do NOT run in debug mode."
+msgid "Don't do DHCP for hosts in option set."
 msgstr ""
 
 #: option.c:145
-msgid "Assume we are the only DHCP server on the local network."
+msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr ""
 
 #: option.c:146
+msgid "Assume we are the only DHCP server on the local network."
+msgstr ""
+
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr ""
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr ""
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr ""
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr ""
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr ""
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr ""
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr ""
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr ""
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr ""
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr ""
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr ""
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr ""
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr ""
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr ""
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr ""
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr ""
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr ""
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr ""
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr ""
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr ""
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr ""
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr ""
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr ""
 
-#: option.c:170
-msgid "Display this message."
-msgstr ""
-
 #: option.c:171
-#, c-format
-msgid "Specify path of PID file. (defaults to %s)."
+msgid "Display this message."
 msgstr ""
 
 #: option.c:172
 #, c-format
-msgid "Specify maximum number of DHCP leases (defaults to %s)."
+msgid "Specify path of PID file. (defaults to %s)."
 msgstr ""
 
 #: option.c:173
-msgid "Answer DNS queries based on the interface a query was sent to."
+#, c-format
+msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr ""
 
 #: option.c:174
-msgid "Specify TXT DNS record."
+msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 
 #: option.c:175
-msgid "Bind only to interfaces in use."
+msgid "Specify TXT DNS record."
 msgstr ""
 
 #: option.c:176
+msgid "Bind only to interfaces in use."
+msgstr ""
+
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr ""
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr ""
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr ""
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr ""
 
-#: option.c:394
+#: option.c:181
+msgid "Map MAC address (with wildcards) to option set."
+msgstr ""
+
+#: option.c:396
 msgid "missing \""
 msgstr ""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr ""
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
 "\n"
 msgstr ""
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr ""
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr ""
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr ""
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
 "\n"
 msgstr ""
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr ""
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr ""
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr ""
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr ""
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr ""
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr ""
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr ""
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr ""
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr ""
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr ""
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr ""
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr ""
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr ""
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr ""
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr ""
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr ""
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr ""
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr ""
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr ""
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr ""
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr ""
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr ""
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr ""
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr ""
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr ""
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr ""
 
-#: option.c:1823
+#: option.c:1882
 msgid "only one resolv.conf file allowed in no-poll mode."
 msgstr ""
 
-#: option.c:1830
+#: option.c:1889
 msgid "must have exactly one resolv.conf to read domain from."
 msgstr ""
 
-#: option.c:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr ""
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr ""
 
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr ""
 
-#: forward.c:899
+#: forward.c:914
 msgid "forwarding table overflow: check for server loops."
 msgstr ""
 
-#: isc.c:71 dnsmasq.c:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr ""
@@ -645,71 +653,71 @@
 msgid "must set exactly one interface on broken systems without IP_RECVIF"
 msgstr ""
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr ""
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 msgid "DBus not available: set HAVE_DBUS in src/config.h"
 msgstr ""
 
-#: dnsmasq.c:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr ""
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr ""
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr ""
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr ""
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr ""
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr ""
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr ""
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, c-format
 msgid "DHCP, static leases only on %.0s%s, lease time %s"
 msgstr ""
 
-#: dnsmasq.c:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr ""
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr ""
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr ""
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr ""
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr ""
 
@@ -755,67 +763,71 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr ""
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
-#, c-format
-msgid "DHCP range %s -- %s is not consistent with netmask %s"
-msgstr ""
-
-#: dhcp.c:705
-#, c-format
-msgid "failed to read %s:%m"
-msgstr ""
-
-#: dhcp.c:724
-#, c-format
-msgid "bad line at %s line %d"
-msgstr ""
-
-#: dhcp.c:825
-#, c-format
-msgid "duplicate IP address %s (%s) in dhcp-config directive"
-msgstr ""
-
-#: dhcp.c:861
-#, c-format
-msgid "Ignoring DHCP host name %s because it has an illegal domain part"
-msgstr ""
-
-#: lease.c:39
-#, c-format
-msgid "cannot open or create leases file: %s"
-msgstr ""
-
-#: lease.c:77
-msgid "too many stored leases"
-msgstr ""
-
-#: rfc2131.c:171
+#: dhcp.c:345
 #, c-format
 msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
 msgstr ""
 
-#: rfc2131.c:220
+#: dhcp.c:413
+#, c-format
+msgid "DHCP range %s -- %s is not consistent with netmask %s"
+msgstr ""
+
+#: dhcp.c:722
+#, c-format
+msgid "failed to read %s:%m"
+msgstr ""
+
+#: dhcp.c:741
+#, c-format
+msgid "bad line at %s line %d"
+msgstr ""
+
+#: dhcp.c:845
+#, c-format
+msgid "duplicate IP address %s (%s) in dhcp-config directive"
+msgstr ""
+
+#: dhcp.c:881
+#, c-format
+msgid "Ignoring DHCP host name %s because it has an illegal domain part"
+msgstr ""
+
+#: lease.c:38
+#, c-format
+msgid "cannot open or create leases file: %s"
+msgstr ""
+
+#: lease.c:80
+msgid "too many stored leases"
+msgstr ""
+
+#: lease.c:179
+msgid "failed to write"
+msgstr ""
+
+#: rfc2131.c:218
 #, c-format
 msgid "no address range available for DHCP request %s %s"
 msgstr ""
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr ""
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr ""
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr ""
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr ""
 
@@ -823,62 +835,62 @@
 msgid "no address configured"
 msgstr ""
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr ""
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr ""
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr ""
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr ""
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr ""
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr ""
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr ""
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr ""
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr ""
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr ""
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr ""
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr ""
 
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr ""
 
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr ""
diff --git a/po/es.po b/po/es.po
index 601cbe1..6cab5c3 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -20,17 +20,17 @@
 msgid "failed to load names from %s: %m"
 msgstr "no se pudo cargar nombres desde %s: %m"
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, fuzzy, c-format
 msgid "bad address at %s line %d"
 msgstr "nombre erróneo en %s línea %d"
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr "nombre erróneo en %s línea %d"
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "direcciónes %s - %d leídas"
@@ -55,7 +55,7 @@
 "tamaño de caché %d, %d/%d inserciónes de caché reutilizaron entradas no "
 "vencidas."
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "no se pudo conseguir memoria"
 
@@ -73,268 +73,273 @@
 msgid "infinite"
 msgstr "infinito"
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr "Especificar dirección(es) locales dónde escuchar."
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr ""
 "Retornar ipaddr (dirección IP) para todos los hosts en los dominios "
 "especificados."
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr ""
 "Falsificar búsquedas reversas para rangos de dirección privados RFC1918."
 
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr "Tratar ipaddr (dirección IP) como NXDOMAIN (derrota comodín Verisign)."
 
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr ""
 "Especificar tamaño de caché en cuanto a entradas (%s por predeterminado)."
 
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "Especificar archivo de configuración (%s por predeterminado)."
 
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "NO hacer un fork hacia el fondo: correr en modo debug."
 
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "NO reenviar búsquedas sin parte de dominio."
 
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Retornar records MX auto-señaladores para hosts locales."
 
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr ""
 "Expandir nombres simples en /etc/hosts con domain-suffix (sufijo de dominio)."
 
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr "No reenviar pedidos DNS falsos desde máquinas Windows."
 
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr "Habilitar DHCP dentro del rango brindado con duración del arriendo."
 
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr "Cambiar a este grupo después del inicio (%s por predeterminado)."
 
-#: option.c:137
+#: option.c:138
 msgid "Set address or hostname for a specified machine."
 msgstr "Fijar dirección o nombre de host para una máquina específica."
 
-#: option.c:138
+#: option.c:139
 #, c-format
 msgid "Do NOT load %s file."
 msgstr "NO cargar archivo %s."
 
-#: option.c:139
+#: option.c:140
 #, c-format
 msgid "Specify a hosts file to be read in addition to %s."
 msgstr "Especificar un archivo de hosts para leer adicionalmente a %s."
 
-#: option.c:140
+#: option.c:141
 msgid "Specify interface(s) to listen on."
 msgstr "Especificar interface(s) donde escuchar."
 
-#: option.c:141
+#: option.c:142
 msgid "Specify interface(s) NOT to listen on."
 msgstr "Especificar interface(s) donde NO escuchar."
 
-#: option.c:142
+#: option.c:143
 msgid "Map DHCP user class to option set."
 msgstr "Trazar clase de usuario DHCP a la opción fijada."
 
-#: option.c:143
+#: option.c:144
 msgid "Don't do DHCP for hosts in option set."
 msgstr "No hacer DHCP para hosts en la opción fijada."
 
-#: option.c:144
+#: option.c:145
 msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr "NO hacer un fork hacia el fondo, NO correr en modo debug."
 
-#: option.c:145
+#: option.c:146
 msgid "Assume we are the only DHCP server on the local network."
 msgstr "Asumir que somos el único servidor DHCP en la red local."
 
-#: option.c:146
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr "Especificar donde guardar arriendos DHCP (%s por predeterminado)."
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr "Retornar récords MX para hosts locales."
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr "Especificar un récord MX."
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr "Especificar opciónes BOOTP a servidor DHCP."
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr "NO revisar archivo %s periodicamente, recargar solo con SIGHUP."
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr "NO cachear resultados de búsquedas fallidas."
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr "Usar servidores DNS estrictamente en el órden dado en %s."
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr "Fijar opciones extra para ser enviadas a clientes DHCP."
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr ""
 "Especificar puerto donde escuchar por búsquedas DNS (53 por predeterminado)."
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr ""
 "Máximo tamaño soportado de paquetes UDP para EDNS.0 (%s por predeterminado)."
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr "Bitacorear búsquedas."
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr "Enforzar el puerto original para búsquedas upstream."
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr "NO leer resolv.conf."
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr "Especificar el destino hacia resolv.conf (%s por predeterminado)."
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 "Especificar dirección(es) de servidor upstream con dominios opcionales."
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr "Nunca reenviar búsquedas a dominios especificados."
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr "Especificar dominio para asignar en arriendos DHCP."
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr "Especificar destino predeterminado en un récord MX."
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr ""
 "Especificar tiempo de vida en segundos para respuestas desde /etc/hosts."
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr "Cambiar a este usuario despues de iniciar (%s por predeterminado)."
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr "Trazar clase de vendedor DHCP a opción fijada."
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr "Mostrar información sobre la versión y copyright de dnsmasq."
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr "Traducir direcciones IPv4 desde servidores upstream."
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr "Especificar un récord SRV."
 
-#: option.c:170
+#: option.c:171
 msgid "Display this message."
 msgstr "Mostrar este mensaje."
 
-#: option.c:171
+#: option.c:172
 #, c-format
 msgid "Specify path of PID file. (defaults to %s)."
 msgstr "Especificar path de archivo PID (%s por predeterminado)."
 
-#: option.c:172
+#: option.c:173
 #, c-format
 msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr "Especificar número máximo de arriendos DHCP (%s por predeterminado)."
 
-#: option.c:173
+#: option.c:174
 msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 "Responder a búsquedas DNS en base a la interface donde fueron enviadas."
 
-#: option.c:174
+#: option.c:175
 msgid "Specify TXT DNS record."
 msgstr "Especificar récord DNS TXT."
 
-#: option.c:175
+#: option.c:176
 msgid "Bind only to interfaces in use."
 msgstr "Acoplar solo a interfaces en uso."
 
-#: option.c:176
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr "Leer información sobre hosts DHCP estáticos desde %s."
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr "Habilitar la interface DBus para fijar servidores upstream, etc."
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr "No proveer DHCP en esta interface, solo proveer DNS."
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr "Habilitar alocación dinámica de direcciónes para BOOTP."
 
-#: option.c:394
+#: option.c:181
+#, fuzzy
+msgid "Map MAC address (with wildcards) to option set."
+msgstr "Trazar clase de vendedor DHCP a opción fijada."
+
+#: option.c:396
 msgid "missing \""
 msgstr "falta \""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr "opción errónea"
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "no se puede leer %s: %s"
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
@@ -343,22 +348,22 @@
 "Modo de uso: dnsmasq [opciones]\n"
 "\n"
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr "Usar opciones cortas solo en la línea de comandos.\n"
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr "Opciones válidas son :\n"
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr "Dnsmasq versión %s  %s\n"
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
@@ -367,144 +372,148 @@
 "Opciones de compilación %s\n"
 "\n"
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr "Este software viene SIN NINGUNA GARANTIA.\n"
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr "Dnsmasq es software libre, y usted está bienvenido a redistribuirlo\n"
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr "bajo los términos de la GNU General Public License, versión 2.\n"
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr "parámetro extraño"
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr "parámetro ausente"
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr "inclusiones jerarquizadas no permitidas"
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr "preferencia MX errónea"
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr "nombre MX erróneo"
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr "destino MX erróneo"
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr "puerto erróneo"
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr "dhcp-range (rango DHCP) erróneo"
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr "rango DHCP inconsistente"
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr "dhcp-host erróneo"
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr "dhcp-option erróneo"
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr "dominio erróneo en dhcp-option"
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr "opción dhcp-option demasiado larga"
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr "récord TXT erróneo"
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr "récord TXT demasiado largo"
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr "récord SRV erróneo"
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr "destino SRV erróneo"
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr "número de puerto inválido"
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr "prioridad inválida"
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr "peso inválido"
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr "error"
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr "opciones de línea de comandos erróneas: %s."
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr "no se puede obtener host-name (nombre de host): %s"
 
-#: option.c:1823
+#: option.c:1882
 msgid "only one resolv.conf file allowed in no-poll mode."
 msgstr "solo un archivo resolv.conf permitido en modo no-poll."
 
-#: option.c:1830
+#: option.c:1889
 msgid "must have exactly one resolv.conf to read domain from."
 msgstr "debe haber exactamente un resolv.conf desde donde leer dominio."
 
-#: option.c:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr "no se pudo leer %s: %m"
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr "ninguna directiva de búsqueda encontrada en %s"
 
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr "servidor DNS %s se reuso a hacer una búsqueda recursiva"
 
-#: forward.c:899
+#: forward.c:914
 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:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr "no se pudo accesar %s: %m"
@@ -617,72 +626,72 @@
 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:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr "error DBus: %s"
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 msgid "DBus not available: set HAVE_DBUS in src/config.h"
 msgstr "DBus no disponible: fijar HAVE_DBUS en src/config.h"
 
-#: dnsmasq.c:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr "versión %s iniciada, tamaño de caché %d"
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr "versión %s iniciada, caché deshabilitado"
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr "opciones de compilación: %s"
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr "soporte DBus habilitado: conectado a bus de sistema"
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr "soporte DBus habilitado: conección a bus pendiente"
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr ""
 "fijando opción --bind-interfaces debido a limitaciones de sistema operativo"
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr "advertencia: interface %s no existe actualmente"
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, c-format
 msgid "DHCP, static leases only on %.0s%s, lease time %s"
 msgstr "DHCP, arriendos estáticos solo en %.0s%s, tiempo de arriendo %s"
 
-#: dnsmasq.c:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr "DHCP, rango de IP %s -- %s, tiempo de arriendo %s"
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr "DHCP, %s será escrito cada %s"
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr "corriendo como root"
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr "conectado a DBus de sistema"
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr "haciendo exit al haber recibido SIGTERM"
 
@@ -730,68 +739,73 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr "dirección IP duplicada en directiva dhcp-config."
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
+#: 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
 #, c-format
 msgid "DHCP range %s -- %s is not consistent with netmask %s"
 msgstr "rango DHCP %s -- %s no coincide con máscara de red %s"
 
-#: dhcp.c:705
+#: dhcp.c:722
 #, c-format
 msgid "failed to read %s:%m"
 msgstr "no se pudo leer %s:%m"
 
-#: dhcp.c:724
+#: dhcp.c:741
 #, fuzzy, c-format
 msgid "bad line at %s line %d"
 msgstr "nombre erróneo en %s línea %d"
 
-#: dhcp.c:825
+#: dhcp.c:845
 #, c-format
 msgid "duplicate IP address %s (%s) in dhcp-config directive"
 msgstr "dirección IP %s (%s) duplicada en directiva dhcp-config"
 
-#: dhcp.c:861
+#: dhcp.c:881
 #, 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:39
+#: lease.c:38
 #, c-format
 msgid "cannot open or create leases file: %s"
 msgstr "no se puede abrir o crear archivo de arriendos: %s"
 
-#: lease.c:77
+#: lease.c:80
 msgid "too many stored leases"
 msgstr "demasiados arriendos almacenados"
 
-#: rfc2131.c:171
-#, 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"
+#: lease.c:179
+#, fuzzy
+msgid "failed to write"
+msgstr "no se pudo leer %s:%m"
 
-#: rfc2131.c:220
+#: rfc2131.c:218
 #, c-format
 msgid "no address range available for DHCP request %s %s"
 msgstr "ningún rango de direcciónes disponible para pedido DHCP %s %s"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr "con selector de subred"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr "vía"
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr "deshabilitado"
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr "dirección en uso"
 
@@ -799,62 +813,62 @@
 msgid "no address configured"
 msgstr "ninguna dirección configurada"
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr "ninguna dirección disponible"
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr "no queda ningún arriendo"
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr "red equivocada"
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr "deshabilitando dirección DHCP estática %s"
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr "arriendo desconocido"
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr "ignorado"
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr "dirección equivocada"
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr "arriendo no encontrado"
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr "dirección no disponible"
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr "arriendo estático disponible"
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr "dirección reservada"
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr "no se puede enviar opción DHCP %d: no queda espacio en el paquete"
 
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr "Más de una clase de vendedor coincide, usando %s"
 
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr "no se puede acoplar socket netlink: %s"
diff --git a/po/fi.po b/po/fi.po
index 651fab7..3a5d9f5 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -20,17 +20,17 @@
 msgid "failed to load names from %s: %m"
 msgstr ""
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, c-format
 msgid "bad address at %s line %d"
 msgstr ""
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr ""
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr ""
@@ -51,7 +51,7 @@
 msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
 msgstr ""
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr ""
 
@@ -69,423 +69,431 @@
 msgid "infinite"
 msgstr ""
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr ""
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr ""
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr ""
 
-#: option.c:127
-msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
-msgstr ""
-
 #: option.c:128
-#, c-format
-msgid "Specify the size of the cache in entries (defaults to %s)."
+msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr ""
 
 #: option.c:129
 #, c-format
-msgid "Specify configuration file (defaults to %s)."
+msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr ""
 
 #: option.c:130
-msgid "Do NOT fork into the background: run in debug mode."
+#, c-format
+msgid "Specify configuration file (defaults to %s)."
 msgstr ""
 
 #: option.c:131
-msgid "Do NOT forward queries with no domain part."
+msgid "Do NOT fork into the background: run in debug mode."
 msgstr ""
 
 #: option.c:132
-msgid "Return self-pointing MX records for local hosts."
+msgid "Do NOT forward queries with no domain part."
 msgstr ""
 
 #: option.c:133
-msgid "Expand simple names in /etc/hosts with domain-suffix."
+msgid "Return self-pointing MX records for local hosts."
 msgstr ""
 
 #: option.c:134
-msgid "Don't forward spurious DNS requests from Windows hosts."
+msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr ""
 
 #: option.c:135
-msgid "Enable DHCP in the range given with lease duration."
+msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr ""
 
 #: option.c:136
+msgid "Enable DHCP in the range given with lease duration."
+msgstr ""
+
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr ""
 
-#: option.c:137
-msgid "Set address or hostname for a specified machine."
-msgstr ""
-
 #: option.c:138
-#, c-format
-msgid "Do NOT load %s file."
+msgid "Set address or hostname for a specified machine."
 msgstr ""
 
 #: option.c:139
 #, c-format
-msgid "Specify a hosts file to be read in addition to %s."
+msgid "Do NOT load %s file."
 msgstr ""
 
 #: option.c:140
-msgid "Specify interface(s) to listen on."
+#, c-format
+msgid "Specify a hosts file to be read in addition to %s."
 msgstr ""
 
 #: option.c:141
-msgid "Specify interface(s) NOT to listen on."
+msgid "Specify interface(s) to listen on."
 msgstr ""
 
 #: option.c:142
-msgid "Map DHCP user class to option set."
+msgid "Specify interface(s) NOT to listen on."
 msgstr ""
 
 #: option.c:143
-msgid "Don't do DHCP for hosts in option set."
+msgid "Map DHCP user class to option set."
 msgstr ""
 
 #: option.c:144
-msgid "Do NOT fork into the background, do NOT run in debug mode."
+msgid "Don't do DHCP for hosts in option set."
 msgstr ""
 
 #: option.c:145
-msgid "Assume we are the only DHCP server on the local network."
+msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr ""
 
 #: option.c:146
+msgid "Assume we are the only DHCP server on the local network."
+msgstr ""
+
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr ""
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr ""
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr ""
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr ""
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr ""
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr ""
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr ""
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr ""
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr ""
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr ""
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr ""
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr ""
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr ""
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr ""
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr ""
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr ""
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr ""
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr ""
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr ""
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr ""
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr ""
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr ""
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr ""
 
-#: option.c:170
-msgid "Display this message."
-msgstr ""
-
 #: option.c:171
-#, c-format
-msgid "Specify path of PID file. (defaults to %s)."
+msgid "Display this message."
 msgstr ""
 
 #: option.c:172
 #, c-format
-msgid "Specify maximum number of DHCP leases (defaults to %s)."
+msgid "Specify path of PID file. (defaults to %s)."
 msgstr ""
 
 #: option.c:173
-msgid "Answer DNS queries based on the interface a query was sent to."
+#, c-format
+msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr ""
 
 #: option.c:174
-msgid "Specify TXT DNS record."
+msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 
 #: option.c:175
-msgid "Bind only to interfaces in use."
+msgid "Specify TXT DNS record."
 msgstr ""
 
 #: option.c:176
+msgid "Bind only to interfaces in use."
+msgstr ""
+
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr ""
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr ""
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr ""
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr ""
 
-#: option.c:394
+#: option.c:181
+msgid "Map MAC address (with wildcards) to option set."
+msgstr ""
+
+#: option.c:396
 msgid "missing \""
 msgstr ""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr ""
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
 "\n"
 msgstr ""
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr ""
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr ""
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr ""
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
 "\n"
 msgstr ""
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr ""
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr ""
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr ""
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr ""
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr ""
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr ""
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr ""
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr ""
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr ""
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr ""
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr ""
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr ""
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr ""
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr ""
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr ""
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr ""
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr ""
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr ""
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr ""
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr ""
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr ""
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr ""
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr ""
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr ""
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr ""
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr ""
 
-#: option.c:1823
+#: option.c:1882
 msgid "only one resolv.conf file allowed in no-poll mode."
 msgstr ""
 
-#: option.c:1830
+#: option.c:1889
 msgid "must have exactly one resolv.conf to read domain from."
 msgstr ""
 
-#: option.c:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr ""
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr ""
 
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr ""
 
-#: forward.c:899
+#: forward.c:914
 msgid "forwarding table overflow: check for server loops."
 msgstr ""
 
-#: isc.c:71 dnsmasq.c:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr ""
@@ -596,71 +604,71 @@
 msgid "must set exactly one interface on broken systems without IP_RECVIF"
 msgstr ""
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr ""
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 msgid "DBus not available: set HAVE_DBUS in src/config.h"
 msgstr ""
 
-#: dnsmasq.c:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr ""
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr ""
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr ""
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr ""
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr ""
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr ""
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr ""
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, c-format
 msgid "DHCP, static leases only on %.0s%s, lease time %s"
 msgstr ""
 
-#: dnsmasq.c:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr ""
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr ""
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr ""
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr ""
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr ""
 
@@ -706,67 +714,71 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr ""
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
-#, c-format
-msgid "DHCP range %s -- %s is not consistent with netmask %s"
-msgstr ""
-
-#: dhcp.c:705
-#, c-format
-msgid "failed to read %s:%m"
-msgstr ""
-
-#: dhcp.c:724
-#, c-format
-msgid "bad line at %s line %d"
-msgstr ""
-
-#: dhcp.c:825
-#, c-format
-msgid "duplicate IP address %s (%s) in dhcp-config directive"
-msgstr ""
-
-#: dhcp.c:861
-#, c-format
-msgid "Ignoring DHCP host name %s because it has an illegal domain part"
-msgstr ""
-
-#: lease.c:39
-#, c-format
-msgid "cannot open or create leases file: %s"
-msgstr ""
-
-#: lease.c:77
-msgid "too many stored leases"
-msgstr ""
-
-#: rfc2131.c:171
+#: dhcp.c:345
 #, c-format
 msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
 msgstr ""
 
-#: rfc2131.c:220
+#: dhcp.c:413
+#, c-format
+msgid "DHCP range %s -- %s is not consistent with netmask %s"
+msgstr ""
+
+#: dhcp.c:722
+#, c-format
+msgid "failed to read %s:%m"
+msgstr ""
+
+#: dhcp.c:741
+#, c-format
+msgid "bad line at %s line %d"
+msgstr ""
+
+#: dhcp.c:845
+#, c-format
+msgid "duplicate IP address %s (%s) in dhcp-config directive"
+msgstr ""
+
+#: dhcp.c:881
+#, c-format
+msgid "Ignoring DHCP host name %s because it has an illegal domain part"
+msgstr ""
+
+#: lease.c:38
+#, c-format
+msgid "cannot open or create leases file: %s"
+msgstr ""
+
+#: lease.c:80
+msgid "too many stored leases"
+msgstr ""
+
+#: lease.c:179
+msgid "failed to write"
+msgstr ""
+
+#: rfc2131.c:218
 #, c-format
 msgid "no address range available for DHCP request %s %s"
 msgstr ""
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr ""
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr ""
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr ""
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr ""
 
@@ -774,62 +786,62 @@
 msgid "no address configured"
 msgstr ""
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr ""
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr ""
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr ""
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr ""
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr ""
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr ""
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr ""
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr ""
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr ""
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr ""
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr ""
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr ""
 
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr ""
 
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr ""
diff --git a/po/fr.po b/po/fr.po
index 6adc3d3..c6a0882 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -20,17 +20,17 @@
 msgid "failed to load names from %s: %m"
 msgstr "Impossible de charger les noms a partir de %s: %m"
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, fuzzy, c-format
 msgid "bad address at %s line %d"
 msgstr "mauvais nom dans %s ligne %d"
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr "mauvais nom dans %s ligne %d"
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "lecture %s - %d adresses"
@@ -55,7 +55,7 @@
 "taille de cache %d, %d/%d insertions dans le cache ont reutilisees des "
 "entrees qui n'ont pas expirees"
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "impossible d'allouer de la memoire"
 
@@ -73,277 +73,282 @@
 msgid "infinite"
 msgstr "illimite"
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr ""
 "Specifie la ou les adresse(s) locales ou le demon doit se mettre a l'ecoute."
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr ""
 "Retourne les adresses IP pour toutes les machines presentent dans les "
 "domaines specifies"
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr "Traduction inverse truquee pour la plage d'adresse privee RFC1918"
 
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr ""
 "Traite l'adresse IP comme un domaine inexistant NXDOMAIN (contourne le "
 "systemede redirection de Verisign)"
 
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr "Specifie la taille du cache en entree (par defaut a %s)."
 
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "Specifie le nom du fichier de configuration (par defaut %s)"
 
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "Ne passe pas en tache de fond: demarre en mode debug"
 
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "Ne retransmet pas les requetes qui n'ont pas de domaine."
 
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Retourne les champs MX pour les machines locales."
 
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr ""
 "Etend les noms uniques des machines dans /etc/hosts avec le suffixe du "
 "domaine."
 
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr ""
 "Ne retransmet pas les fausses requetes DNS en provenance des machines "
 "Windows."
 
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr ""
 "Autorise DHCP dans la plage d'adresses donnee sur la duree de validite du "
 "bail."
 
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr "On change pour ce groupe apres le demarrage (par defaut a %s)."
 
-#: option.c:137
+#: option.c:138
 msgid "Set address or hostname for a specified machine."
 msgstr "On assigne une adresse ou un nom pour une machine specifiee."
 
-#: option.c:138
+#: option.c:139
 #, c-format
 msgid "Do NOT load %s file."
 msgstr "Ne charge PAS le fichier %s."
 
-#: option.c:139
+#: option.c:140
 #, c-format
 msgid "Specify a hosts file to be read in addition to %s."
 msgstr "Specifie un nom de fichier hosts a lire en complement de %s"
 
-#: option.c:140
+#: option.c:141
 msgid "Specify interface(s) to listen on."
 msgstr "Specifie la ou les interface(s) ou le demon doit se mettre a l'ecoute."
 
-#: option.c:141
+#: option.c:142
 msgid "Specify interface(s) NOT to listen on."
 msgstr "Specifie la ou les interface(s) que le demon ne doit PAS traiter."
 
-#: option.c:142
+#: option.c:143
 msgid "Map DHCP user class to option set."
 msgstr "Associe les 'user class' DHCP aux options."
 
-#: option.c:143
+#: option.c:144
 msgid "Don't do DHCP for hosts in option set."
 msgstr "Ne pas autoriser DHCP pour les machines enumerees dans les options."
 
-#: option.c:144
+#: option.c:145
 msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr "Ne passe pas en tache de fond, ne s'execute pas en mode debug."
 
-#: option.c:145
+#: option.c:146
 msgid "Assume we are the only DHCP server on the local network."
 msgstr "On considere que l'on est le seul serveur DHCP sur le reseau local."
 
-#: option.c:146
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr "Specifie ou il faut sauvegarder les baux DHCP (par defaut a %s)."
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr "Retourne les champs MX pour les machines locales."
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr "Specifie un champ MX."
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr "Specifie les options BOOTP pour le serveur DHCP."
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr ""
 "Ne pas scruter le fichier %s, recharger les modifications seulement sur "
 "reception du signal SIGHUP."
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr "Ne place pas en cache le resultat des requetes qui ont echouees."
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr "Utilise les serveurs de noms dans l'ordre donne dans %s."
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr "Options supplementaires a associer aux clients DHCP."
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr ""
 "Specifie le port ou il faut ecouter les requetes DNS (par defaut a 53)."
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr ""
 "Taille maximale des paquets UDP supportee pour EDNS.0 (par defaut a %s)."
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr "Logue les requetes."
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr "Force le port d'origine des requetes vers les serveurs amonts."
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr "Ne pas lire le fichier resolv.conf."
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr "Specifie le chemin pour le fichier resolv.conf (par defaut a %s)."
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 "Specifie la ou les adresses des serveurs amonts avec des domaines optionels."
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr "Ne jamais retransmettre les requetes pour les domaines specifies."
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr "Specifie le domaine qui doit etre assigne aux baux DHCP."
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr "Speficie la cible par defaut dans un champ MX."
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr ""
 "Specifie le TTL en secondes pour les reponses qui utilisent /etc/hosts."
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr "Change pour cet utilisateur apres le demarrage (par defaut a %s)."
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr "Associe les 'vendor class' DHCP aux options."
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr "Affiche la version de Dnsmasq et les informations liees au copyright."
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr "Traduit les adresses IPV4 des serveurs amonts."
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr " Specifie un champ SRV."
 
-#: option.c:170
+#: option.c:171
 msgid "Display this message."
 msgstr "Affiche ce message."
 
-#: option.c:171
+#: option.c:172
 #, c-format
 msgid "Specify path of PID file. (defaults to %s)."
 msgstr "Specifie un chemin pour le fichier PID (par defaut a %s)."
 
-#: option.c:172
+#: option.c:173
 #, c-format
 msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr "Specifie le nombre maximum de baux DHCP (par defaut a %s)."
 
-#: option.c:173
+#: option.c:174
 msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 "Repond aux requetes DNS en se basant sur l'interface ou a ete envoyee la "
 "requete."
 
-#: option.c:174
+#: option.c:175
 msgid "Specify TXT DNS record."
 msgstr "Specifie un champ DNS TXT"
 
-#: option.c:175
+#: option.c:176
 msgid "Bind only to interfaces in use."
 msgstr "Associe seulement aux interfaces en utilisation."
 
-#: option.c:176
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr "Lecture des informations de DHCP statique a partir de %s."
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr "Autorise l'interface DBus a configurer les serveurs amonts, etc."
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr "Ne fourni pas DHCP pour cette interface, mais seulement DNS."
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr "Autorise l'allocation dynamique d'adresse pour bootp."
 
-#: option.c:394
+#: option.c:181
+#, fuzzy
+msgid "Map MAC address (with wildcards) to option set."
+msgstr "Associe les 'vendor class' DHCP aux options."
+
+#: option.c:396
 msgid "missing \""
 msgstr "il manque \""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr "mauvaise option"
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "Ne peut pas lire %s: %s"
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
@@ -352,22 +357,22 @@
 "Usage: dnsmasq [options]\n"
 "\n"
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr "Utilisez les options courtes uniquement sur la ligne de commande.\n"
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr "Les options valides sont :\n"
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr "Version de Dnsmasq %s  %s\n"
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
@@ -376,148 +381,152 @@
 "Options a la compilation %s\n"
 "\n"
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr "Ce logiciel est fourni sans GARANTIE aucune.\n"
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr "Dnsmasq est un logiciel libre, et vous etes invite a le redistribuer\n"
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr ""
 "sous les termes de la licence GPL (GNU General Public License), version 2.\n"
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr "parametre supplementaire"
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr "parametre manquant"
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr "Inclusions d'inclusions non autorisees"
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr "Mauvaise preference MX"
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr "mauvais nom MX"
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr "mauvaise cible MX"
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr "mauvais port"
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr "mauvaise plage d'adresses DHCP (dhcp-range)"
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr "plage d'adresses DHCP incoherente"
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr "mauvais dhcp-host"
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr "mauvais dhcp-option"
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr "mauvais domaine dans dhcp-option"
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr "dhcp-option trop long"
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr "mauvais champ TXT"
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr "chaîne du champ TXT trop longue"
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr "mauvais champ SRV"
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr "mauvaise cible SRV"
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr "numero de port invalide"
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr "priorite invalide"
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr "poids invalide"
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr "erreur"
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr "mauvaises options en ligne de commande: %s."
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr "ne peut pas obtenir le nom de la machine: %s"
 
-#: option.c:1823
+#: option.c:1882
 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:1830
+#: option.c:1889
 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:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr "impossible de lire %s: %m"
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr "pas de directive de recherche trouvee dans %s"
 
-#: forward.c:378
+#: forward.c:383
 #, 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:899
+#: forward.c:914
 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:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr "impossible d'acceder a %s: %m"
@@ -632,72 +641,72 @@
 msgstr ""
 "on doit declarer exactement une interface sur les systemes sans IP_RECVIF"
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr "Erreur DBus: %s"
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 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:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr "demarre, version %s taille de cache %d"
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr "demarre, version %s cache desactive"
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr "options a la compilation: %s"
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr "Support DBus autorise: connecte au bus systeme"
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr "Support DBus autorise: connexion au bus en suspend"
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr "Active l'option --bind-interfaces a cause des limitations de l'OS"
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr "Attention: l'interface %s n'existe pas actuellement"
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, 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:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr "DHCP, plage d'adresse %s -- %s, duree de bail %s"
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr "DHCP, %s sera ecrit chaque %s"
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr "execute sous root"
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr "connecte au systeme DBus"
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr "sortie sur reception du signal SIGTERM"
 
@@ -745,71 +754,76 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr "adresse IP %s dupliquee dans la directive dhcp-config."
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
+#: 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
 #, 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:705
+#: dhcp.c:722
 #, c-format
 msgid "failed to read %s:%m"
 msgstr "impossible de lire %s:%m"
 
-#: dhcp.c:724
+#: dhcp.c:741
 #, fuzzy, c-format
 msgid "bad line at %s line %d"
 msgstr "mauvais nom dans %s ligne %d"
 
-#: dhcp.c:825
+#: dhcp.c:845
 #, 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:861
+#: dhcp.c:881
 #, 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:39
+#: lease.c:38
 #, c-format
 msgid "cannot open or create leases file: %s"
 msgstr "ne peut ouvrir ou creer des fichiers de baux: %s"
 
-#: lease.c:77
+#: lease.c:80
 msgid "too many stored leases"
 msgstr "beaucoup trop de baux enregistres"
 
-#: rfc2131.c:171
-#, 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"
+#: lease.c:179
+#, fuzzy
+msgid "failed to write"
+msgstr "impossible de lire %s:%m"
 
-#: rfc2131.c:220
+#: rfc2131.c:218
 #, 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:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr "avec selecteur de sous-reseau"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr "par l'intermediaire de"
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr "desactive"
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr "adresse deja utilisee"
 
@@ -817,62 +831,62 @@
 msgid "no address configured"
 msgstr "pas d'adresse configuree"
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr "pas d'adresse disponible"
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr "aucun baux laisses"
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr "mauvais reseau"
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr "desactive l'adresse statique DHCP %s"
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr "bail inconnu"
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr "ignore"
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr "mauvaise adresse"
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr "bail non trouve"
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr "adresse non disponible"
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr "bail statique disponible"
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr "adresse reservee"
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr ""
 
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, 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:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr "ne peux lier une socket netlink: %s"
diff --git a/po/id.po b/po/id.po
index 56d4f28..d814d96 100644
--- a/po/id.po
+++ b/po/id.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -21,19 +21,19 @@
 msgstr "gagal memuat nama-nama dari %s: %m"
 
 # OK
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, fuzzy, c-format
 msgid "bad address at %s line %d"
 msgstr "kesalahan nama pada %s baris %d"
 
 # OK
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr "kesalahan nama pada %s baris %d"
 
 # OK
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "membaca %s - %d alamat"
@@ -61,7 +61,7 @@
 "ukuran cache %d, %d/%d penyisipan cache menimpa cache yang belum kadaluwarsa"
 
 # OK
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "tidak bisa mendapatkan memory"
 
@@ -83,320 +83,326 @@
 msgstr "tak terbatas"
 
 # OK
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr "Tentukan alamat lokal untuk mendengarkan."
 
 # OK
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr "Menghasilkan ipaddr untuk semua host dalam domain yang dipilih."
 
 # OK
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr "Fake pencarian balik untuk alamat private sesuai dengan RFC1918."
 
 # OK
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr "Perlakukan ipaddr sebagai NXDOMAIN (mengalahkan wildcard Verisign)."
 
 # OK
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr "Tentukan ukuran cache, dalam jumlah isian (default %s)."
 
 # OK
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "Tentukan file konfigurasi (default %s)."
 
 # OK
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "JANGAN berjalan di background: berjalan dalam modus debug."
 
 # OK
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "JANGAN teruskan permintaan tanpa bagian domain."
 
 # OK
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Mengembalikan record MX untuk diri sendiri host-host lokal."
 
 # OK
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr "Melengkapi nama-nama di /etc/hosts dengan akhiran domain."
 
 # OK
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr "Jangan meneruskan permintaan DNS spurious dari host-host Windows."
 
 # OK
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr "Bolehkan DHCP dalam jangkauan yang diberikan dengan durasi lease."
 
 # OK
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr "Ubah ke group ini setelah mulai (default %s)."
 
 # OK
-#: option.c:137
+#: option.c:138
 msgid "Set address or hostname for a specified machine."
 msgstr "Setel alamat atau nama host untuk mesin yang disebutkan."
 
 # OK
-#: option.c:138
+#: option.c:139
 #, c-format
 msgid "Do NOT load %s file."
 msgstr "JANGAN muat file %s."
 
 # OK
-#: option.c:139
+#: option.c:140
 #, c-format
 msgid "Specify a hosts file to be read in addition to %s."
 msgstr ""
 "Sebutkan sebuah file hosts yang harus dibaca sebagai tambahan untuk %s."
 
 # OK
-#: option.c:140
+#: option.c:141
 msgid "Specify interface(s) to listen on."
 msgstr "Sebutkan antarmuka untuk mendengarkan."
 
 # OK
-#: option.c:141
+#: option.c:142
 msgid "Specify interface(s) NOT to listen on."
 msgstr "Sebutkan antarmuka untuk TIDAK mendengarkan."
 
 # OK
-#: option.c:142
+#: option.c:143
 msgid "Map DHCP user class to option set."
 msgstr "Petakan kelas user DHCP ke setelan yang dipilih."
 
 # OK
-#: option.c:143
+#: option.c:144
 msgid "Don't do DHCP for hosts in option set."
 msgstr "Jangan menggunakan DHCP untuk host-host yang dipilih."
 
 # OK
-#: option.c:144
+#: option.c:145
 msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr "JANGAN berjalan di background, jangan berjalan dalam modus debug."
 
 # OK
-#: option.c:145
+#: option.c:146
 msgid "Assume we are the only DHCP server on the local network."
 msgstr "Berpikir bahwa kita satu-satunya DHCP server dalam jaringan."
 
 # OK
-#: option.c:146
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr "Sebutkan lokasi untuk menyimpan lease DHCP (default %s)."
 
 # OK
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr "Kembalikan rekord MX untuk host-host lokal."
 
 # OK
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr "Sebutkan sebuah rekord MX."
 
 # OK
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr "Sebutkan pilihan-pilihan BOOTP untuk DHCP server."
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr "Jangan kumpulkan file %s, muat kembali saat SIGHUP."
 
 # OK
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr "JANGAN menyimpan hasil pencarian yang gagal."
 
 # OK
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr "Gunakan secara ketat namaserver yang disebutkan sesuai urutan di %s."
 
 # OK
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr ""
 "Setel pilihan-pilihan tambahan yang akan disetel untuk klien-klien DHCP."
 
 # OK
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr "Sebutkan port untuk mendengarkan permintaan DNS (default port 53)."
 
 # OK
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr "Ukuran maksimum paket UDP yang didukung untuk EDNS.0 (default %s)."
 
 # OK
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr "Permintaan log."
 
 # OK
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr "Paksa port asal untuk permintaan ke atas."
 
 # OK
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr "JANGAN baca resolv.conf."
 
 # OK
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr "Sebutkan path ke resolv.conf (default %s)."
 
 # OK
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 "Sebutkan alamat-alamat server di atas, boleh dilengkapi dengan nama domain."
 
 # OK
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr "JANGAN pernah meneruskan permintaan ke domain yang disebutkan."
 
 # OK
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr "Sebutkan domain yang digunakan dalam lease DHCP."
 
 # OK
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr "Sebutkan tujuan default dalam rekord MX."
 
 # OK
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr "Sebutkan time-to-live dalam detik untuk jawaban dari /etc/hosts."
 
 # OK
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr "Ubah ke user ini setelah mulai. (default %s)."
 
 # OK
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr "Memetakan kelas vendor DHCP ke daftar pilihan."
 
 # OK
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr "Menampilkan versi dan informasi hak cipta dnsmasq."
 
 # OK
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr "Terjemahkan alamat-alamat IPv4 dari server-server di atas."
 
 # OK
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr "Sebutkan rekord SRV."
 
 # OK
-#: option.c:170
+#: option.c:171
 msgid "Display this message."
 msgstr "Menampilkan pesan ini."
 
 # OK
-#: option.c:171
+#: option.c:172
 #, c-format
 msgid "Specify path of PID file. (defaults to %s)."
 msgstr "Sebutkan path file PID. (default %s)."
 
 # OK
-#: option.c:172
+#: option.c:173
 #, c-format
 msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr "Sebutkan jumlah maksimum lease DHCP (default %s)."
 
 # OK
-#: option.c:173
+#: option.c:174
 msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 "Jawab permintaan DNS berdasarkan antarmuka dimana permintaan dikirimkan."
 
 # OK
-#: option.c:174
+#: option.c:175
 msgid "Specify TXT DNS record."
 msgstr "Sebutkan rekord TXT DNS."
 
 # OK
-#: option.c:175
+#: option.c:176
 msgid "Bind only to interfaces in use."
 msgstr "Hanya kaitkan ke antarmuka yang sedang digunakan saja."
 
 # OK
-#: option.c:176
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr "Baca informasi statik host DHCP dari %s."
 
 # OK
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr "Mungkinkan antar muka DBus untuk menyetel server-server di atas, dsb."
 
 # OK
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr "JANGAN menyediakan DHCP pada antarmuka ini, hanya menyediakan DNS."
 
 # OK
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr "Mungkinkan alokasi alamat dinamis untuk bootp."
 
 # OK
-#: option.c:394
+#: option.c:181
+#, fuzzy
+msgid "Map MAC address (with wildcards) to option set."
+msgstr "Memetakan kelas vendor DHCP ke daftar pilihan."
+
+# OK
+#: option.c:396
 msgid "missing \""
 msgstr "kurang \""
 
 # OK
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr "pilihan salah"
 
 # OK
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "tidak bisa membaca %s: %s"
 
 # OK
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
@@ -406,25 +412,25 @@
 "\n"
 
 # OK
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr "Gunakan pilihan pendek saja pada perintah baris.\n"
 
 # OK
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr "Pilihan yang boleh adalah:\n"
 
 # OK
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr "Dnsmasq versi %s  %s\n"
 
 # OK
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
@@ -434,13 +440,13 @@
 "\n"
 
 # OK
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr "Perangkat lunak ini tersedia TANPA JAMINAN SEDIKITPUN.\n"
 
 # OK
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr ""
@@ -448,163 +454,167 @@
 "membagikannya\n"
 
 # OK
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr "dengan aturan GNU General Public License, versi 2.\n"
 
 # OK
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr "parameter berlebihan"
 
 # OK
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr "parameter kurang"
 
 # OK
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr "includes bersarang tidak diijinkan"
 
 # OK
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr "kesukaan MX salah"
 
 # OK
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr "nama MX salah"
 
 # OK
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr "target MX salah"
 
 # OK
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr "port salah"
 
 # OK
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr "dhcp-range salah"
 
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
 # OK
-#: option.c:1014
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr "jangkauan DHCP tidak konsisten"
 
 # OK
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr "dhcp-host salah"
 
 # OK
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr "dhcp-option salah"
 
 # OK
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr "domain dalam dhcp-option salah"
 
 # OK
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr "dhcp-option terlalu panjang"
 
 # OK
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr "rekord TXT salah"
 
 # OK
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr "string rekord TXT terlalu panjang"
 
 # OK
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr "rekord SRV salah"
 
 # OK
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr "target SRV salah"
 
 # OK
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr "nomor port tidak benar"
 
 # OK
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr "prioritas tidak benar"
 
 # OK
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr "weight tidak benar"
 
 # OK
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr "kesalahan"
 
 # OK
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr "pilihan baris perintah salah: %s."
 
 # OK
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr "tidak bisa mendapatkan host-name: %s"
 
 # OK
-#: option.c:1823
+#: option.c:1882
 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:1830
+#: option.c:1889
 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:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr "gagal membaca %s: %m"
 
 # OK
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr "tidak ditemukan direktif search di %s"
 
 # OK
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr "nameserver %s menolak melakukan resolusi rekursif"
 
 # OK
-#: forward.c:899
+#: forward.c:914
 msgid "forwarding table overflow: check for server loops."
 msgstr "meneruskan tabel overflow: memeriksa apakah terjadi loop server."
 
 # OK
-#: isc.c:71 dnsmasq.c:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr "gagal mengakses %s: %m"
@@ -742,84 +752,84 @@
 "IP_RECVIF"
 
 # OK
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr "DBus error: %s"
 
 # OK
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 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:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr "dimulai, versi %s ukuran cache %d"
 
 # OK
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr "dimulai, cache versi %s di disable"
 
 # OK
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr "pilihan-pilihan saat kompilasi: %s"
 
 # OK
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr "dukungan DBus dimungkinkan: terkoneksi pada bus sistem"
 
 # OK
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr "dukungan DBus dimungkinkan: koneksi bus ditunda"
 
 # OK
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr "setelan opsi --bind-interfaces disebabkan keterbatasan OS"
 
 # OK
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr "peringatan: antarmuka %s tidak ada"
 
 # OK
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, 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:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr "DHCP, jangkaun IP %s -- %s, waktu lease %s"
 
 # OK
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr "DHCP, %s akan ditulis setiap %s"
 
 # OK
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr "berjalan menggunakan root"
 
 # OK
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr "terhubung ke sistem DBus"
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr "keluar karena menerima SIGTERM"
 
@@ -875,82 +885,88 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr "alamat IP kembar %s dalam direktif dhcp-config"
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
 # OK
-#: dhcp.c:394
-#, 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:705
-#, c-format
-msgid "failed to read %s:%m"
-msgstr "gagal membaca %s:%m"
-
-# OK
-#: dhcp.c:724
-#, fuzzy, c-format
-msgid "bad line at %s line %d"
-msgstr "kesalahan nama pada %s baris %d"
-
-# OK
-#: dhcp.c:825
-#, 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:861
-#, 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:39
-#, c-format
-msgid "cannot open or create leases file: %s"
-msgstr "tidak dapat membuka atau membuat file lease: %s"
-
-# OK
-#: lease.c:77
-msgid "too many stored leases"
-msgstr "terlalu banyak lease yang disimpan"
-
-# OK
-#: rfc2131.c:171
+#: 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
-#: rfc2131.c:220
+#: dhcp.c:413
+#, 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
+#, c-format
+msgid "failed to read %s:%m"
+msgstr "gagal membaca %s:%m"
+
+# OK
+#: dhcp.c:741
+#, fuzzy, c-format
+msgid "bad line at %s line %d"
+msgstr "kesalahan nama pada %s baris %d"
+
+# OK
+#: dhcp.c:845
+#, 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
+#, 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
+#, c-format
+msgid "cannot open or create leases file: %s"
+msgstr "tidak dapat membuka atau membuat file lease: %s"
+
+# OK
+#: lease.c:80
+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"
+
+# OK
+#: rfc2131.c:218
 #, 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:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr "dengan pemilih subnet"
 
 # OK
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr "lewat"
 
 # OK
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr "di disable"
 
 # OK
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr "alamat telah digunakan"
 
@@ -960,74 +976,74 @@
 msgstr "tak ada alamat yang disetel"
 
 # OK
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr "tak ada alamat yang tersedia"
 
 # OK
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr "tak ada lease yang tersisa"
 
 # OK
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr "jaringan yang salah"
 
 # OK
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr "men-disable alamat statik DHCP %s"
 
 # OK
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr "lease tidak diketahui"
 
 # OK
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr "diabaikan"
 
 # OK
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr "alamat salah"
 
 # OK
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr "lease tak ditemukan"
 
 # OK
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr "alamat tak tersedia"
 
 # OK
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr "lease statik tak tersedia"
 
 # OK
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr "alamat telah dipesan"
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr ""
 
 # OK
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr "Lebih dari satu kelas vendor yang sesuai, menggunakan %s"
 
 # OK
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr "tidak bisa mem-bind netlink socket: %s"
diff --git a/po/no.po b/po/no.po
index 0f80a48..a79a396 100644
--- a/po/no.po
+++ b/po/no.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.25\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -22,17 +22,17 @@
 msgid "failed to load names from %s: %m"
 msgstr "feilet å laste navn fra %s: %m"
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, c-format
 msgid "bad address at %s line %d"
 msgstr "dårlig adresse ved %s linje %d"
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr "dårlig navn ved %s linje %d"
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "les %s - %d adresser"
@@ -57,7 +57,7 @@
 "mellomlager størrelse %d, %d/%d mellomlager innsettinger re-bruker "
 "mellomlager plasser som ikke er utløpt"
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "kunne ikke få minne"
 
@@ -75,258 +75,263 @@
 msgid "infinite"
 msgstr "uendelig"
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr "Spesifiser lokal(e) adresse(r) å lytte på."
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr "Returner ipaddr for alle verter i det spesifiserte domenet."
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr "Forfalsk revers oppslag for RFC1918 private adresse områder."
 
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr "Behandle ipaddr som NXDOMAIN (omgår Verisign wildcard)."
 
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr "Spesifiser størrelsen på mellomlager plassene (standard er %s)."
 
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "Spesifiser konfigurasjonsfil (standard er %s)."
 
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "IKKE legg (fork) som bakgrunnsprosess: kjør i debug modus."
 
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "IKKE videresend oppslag som mangler domene del."
 
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Returner selv-pekende MX post for lokale verter."
 
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr "Utvid enkle navn i /etc/hosts med domene-suffiks."
 
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr "Ikke videresend falske/uekte DNS forespørsler fra Windows verter."
 
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr "Aktiver DHCP i det gitte området med leie varighet"
 
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr "Skift til denne gruppen etter oppstart (standard er %s)."
 
-#: option.c:137
+#: option.c:138
 msgid "Set address or hostname for a specified machine."
 msgstr "Sett adresse eller vertsnavn for en spesifikk maskin."
 
-#: option.c:138
+#: option.c:139
 #, c-format
 msgid "Do NOT load %s file."
 msgstr "IKKE last %s filen."
 
-#: option.c:139
+#: option.c:140
 #, c-format
 msgid "Specify a hosts file to be read in addition to %s."
 msgstr "Spesifiser en verts (hosts) fil som skal leses i tilleg til %s."
 
-#: option.c:140
+#: option.c:141
 msgid "Specify interface(s) to listen on."
 msgstr "Spesifiser nettverkskort det skal lyttes på."
 
-#: option.c:141
+#: option.c:142
 msgid "Specify interface(s) NOT to listen on."
 msgstr "Spesifiser nettverkskort det IKKE skal lyttes på."
 
-#: option.c:142
+#: option.c:143
 msgid "Map DHCP user class to option set."
 msgstr "Map DHCP bruker klasse til opsjon sett."
 
-#: option.c:143
+#: option.c:144
 msgid "Don't do DHCP for hosts in option set."
 msgstr "Ikke utfør DHCP for klienter i opsjon sett."
 
-#: option.c:144
+#: option.c:145
 msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr "IKKE last (fork) som bakgrunnsprosess, IKKE kjør i debug modus."
 
-#: option.c:145
+#: option.c:146
 msgid "Assume we are the only DHCP server on the local network."
 msgstr "Anta at vi er den eneste DHCP tjeneren på det lokale nettverket."
 
-#: option.c:146
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr "Spesifiser hvor DHCP leiene skal lagres (standard er %s)."
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr "Returner MX records for lokale verter."
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr "Spesifiser en MX post."
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr "Spesifiser BOOTP opsjoner til DHCP tjener."
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr "IKKE spør (poll) %s fil, les på nytt kun ved SIGHUP"
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr "IKKE mellomlagre søkeresultater som feiler."
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr "Bruk navnetjenere kun som bestemt i rekkefølgen gitt i %s."
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr "Sett ekstra opsjoner som skal fordeles til DHCP klientene."
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr "Spesifiser lytteport for DNS oppslag (standard er 53)."
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr "Maksimal støttet UDP pakkestørrelse for EDNS.0 (standard er %s)."
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr "Logg oppslag."
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr "Tving bruk av opprinnelig port for oppstrøms oppslag."
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr "IKKE les resolv.conf."
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr "Spesifiser stien til resolv.conf (standard er %s)."
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr "Spesifiser adressen(e) til oppstrøms tjenere med valgfrie domener."
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr "Aldri videresend oppslag til spesifiserte domener."
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr "Spesifiser domenet som skal tildeles i DHCP leien."
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr "Spesifiser default mål i en MX post."
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr "Spesifiser time-to-live i sekunder for svar fra /etc/hosts."
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr "Skift til denne bruker etter oppstart (standard er %s)."
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr "Map DHCP produsent klasse til opsjon sett."
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr "Vis dnsmasq versjon og copyright informasjon."
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr "Oversett IPv4 adresser fra oppstrøms tjenere."
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr "Spesifiser en SRV post."
 
-#: option.c:170
+#: option.c:171
 msgid "Display this message."
 msgstr "Vis denne meldingen."
 
-#: option.c:171
+#: option.c:172
 #, c-format
 msgid "Specify path of PID file. (defaults to %s)."
 msgstr "Spesifiser stien til PID fil. (standard er %s)."
 
-#: option.c:172
+#: option.c:173
 #, c-format
 msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr "Spesifiser maksimum antall DHCP leier (standard er %s)"
 
-#: option.c:173
+#: option.c:174
 msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr "Svar DNS oppslag basert på nettverkskortet oppslaget ble sendt til."
 
-#: option.c:174
+#: option.c:175
 msgid "Specify TXT DNS record."
 msgstr "Spesifiser TXT DNS post."
 
-#: option.c:175
+#: option.c:176
 msgid "Bind only to interfaces in use."
 msgstr "Bind kun til nettverkskort som er i bruk."
 
-#: option.c:176
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr "Les DHCP statisk vert informasjon fra %s."
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr "Aktiver DBus interface for å sette oppstrøms tjenere, osv."
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr "Ikke lever DHCP på dette nettverkskortet, kun lever DNS."
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr "Aktiver dynamisk adresse allokering for bootp."
 
-#: option.c:394
+#: option.c:181
+#, fuzzy
+msgid "Map MAC address (with wildcards) to option set."
+msgstr "Map DHCP produsent klasse til opsjon sett."
+
+#: option.c:396
 msgid "missing \""
 msgstr "mangler \""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr "dårlig opsjon"
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "kan ikke lese %s: %s"
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
@@ -335,22 +340,22 @@
 "Bruk: dnsmasq [opsjoner]\n"
 "\n"
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr "Bruk korte opsjoner kun på kommandolinjen.\n"
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr "Gyldige opsjoner er :\n"
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr "Dnsmasq versjon %s %s\n"
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
@@ -359,143 +364,147 @@
 "Kompileringsopsjoner %s\n"
 "\n"
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr "Denne programvaren kommer med ABSOLUTT INGEN GARANTI.\n"
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr "DNsmasq er fri programvare, du er velkommen til å redistribuere den\n"
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr "under vilkårene gitt i GNU General Public License, versjon 2.\n"
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr "overflødig parameter"
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr "mangler parameter"
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr "nøstede inkluderinger er ikke tillatt"
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr "dårlig MX preferanse"
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr "dårlig MX navn"
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr "dårlig MX mål"
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr "dårlig port"
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr "dårlig dhcp-område"
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr "ikke konsistent DHCP område"
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr "dårlig dhcp-vert"
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr "dårlig dhcp-opsjon"
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr "dårlig domene i dhcp-opsjon"
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr "dhcp-opsjon for lang"
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr "dårlig TXT post"
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr "TXT post streng for lang"
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr "dårlig SRV post"
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr "dårlig SRV mål"
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr "ugyldig portnummer"
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr "ugyldig prioritet"
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr "ugyldig vekt"
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr "feil"
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr "dårlige kommandlinje opsjoner: %s."
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr "klarer ikke å få vertsnavn: %s"
 
-#: option.c:1823
+#: option.c:1882
 msgid "only one resolv.conf file allowed in no-poll mode."
 msgstr "kun en resolv.conf fil tillat i no-poll modus."
 
-#: option.c:1830
+#: option.c:1889
 msgid "must have exactly one resolv.conf to read domain from."
 msgstr "må ha nøyaktig en resolv.conf å lese domene fra."
 
-#: option.c:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr "feilet å lese %s: %m"
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr "intet søke direktiv funnet i %s"
 
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr "navnetjener %s nektet å gjøre et rekursivt oppslag"
 
-#: forward.c:899
+#: forward.c:914
 msgid "forwarding table overflow: check for server loops."
 msgstr "fremsendelse (forwarding) tabell overflyt: sjekk etter tjener løkker."
 
-#: isc.c:71 dnsmasq.c:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr "feilet å få tilgang til %s: %m"
@@ -607,71 +616,71 @@
 msgid "must set exactly one interface on broken systems without IP_RECVIF"
 msgstr "må sette nøyaktig et interface på ødelagte systemer uten IP_RECVIF"
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr "DBus feil: %s"
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 msgid "DBus not available: set HAVE_DBUS in src/config.h"
 msgstr "DBus ikke tilgjengelig: sett HAVE_DBUS i src/config.h"
 
-#: dnsmasq.c:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr "startet, versjon %s mellomlager størrelse %d"
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr "startet, versjon %s mellomlager deaktivert"
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr "kompilerings opsjoner: %s"
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr "DBus støtte aktivert: koblet til system buss"
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr "DBus støtte aktivert: avventer buss tilkobling"
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr "setter --bind-interfaces opsjon på grunn av OS begrensninger"
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr "advarsel: nettverkskort %s eksisterer ikke for tiden"
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, 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:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr "DHCP, IP område %s -- %s, leie tid %s"
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr "DHCP, %s vil bli skrevet hver %s"
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr "kjører som rot (root)"
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr "tilkoblet til system DBus"
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr "avslutter etter mottak av SIGTERM"
 
@@ -718,67 +727,72 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr "dubliserte IP adresser i %s dhcp-config direktiv."
 
-#: dhcp.c:233
+#: 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:394
-#, c-format
-msgid "DHCP range %s -- %s is not consistent with netmask %s"
-msgstr "DHCP område %s -- %s er ikke konsistent med nettmaske %s"
-
-#: dhcp.c:705
-#, c-format
-msgid "failed to read %s:%m"
-msgstr "feilet å lese %s:%m"
-
-#: dhcp.c:724
-#, c-format
-msgid "bad line at %s line %d"
-msgstr "dårlig linje ved %s linje %d"
-
-#: dhcp.c:825
-#, 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:861
-#, 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:39
-#, c-format
-msgid "cannot open or create leases file: %s"
-msgstr "kan ikke åpne eller lage leie fil: %s"
-
-#: lease.c:77
-msgid "too many stored leases"
-msgstr "for mange lagrede leier"
-
-#: rfc2131.c:171
+#: dhcp.c:345
 #, c-format
 msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
 msgstr "DHCP krav for ikke støttet maskinvare type (%d) mottatt på %s"
 
-#: rfc2131.c:220
+#: dhcp.c:413
+#, c-format
+msgid "DHCP range %s -- %s is not consistent with netmask %s"
+msgstr "DHCP område %s -- %s er ikke konsistent med nettmaske %s"
+
+#: dhcp.c:722
+#, c-format
+msgid "failed to read %s:%m"
+msgstr "feilet å lese %s:%m"
+
+#: dhcp.c:741
+#, c-format
+msgid "bad line at %s line %d"
+msgstr "dårlig linje ved %s linje %d"
+
+#: dhcp.c:845
+#, 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
+#, 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
+#, c-format
+msgid "cannot open or create leases file: %s"
+msgstr "kan ikke åpne eller lage leie fil: %s"
+
+#: lease.c:80
+msgid "too many stored leases"
+msgstr "for mange lagrede leier"
+
+#: lease.c:179
+#, fuzzy
+msgid "failed to write"
+msgstr "feilet å lese %s:%m"
+
+#: rfc2131.c:218
 #, c-format
 msgid "no address range available for DHCP request %s %s"
 msgstr "ingen adresse område tilgjengelig for DHCP krav %s %s"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr "med subnet velger"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr "via"
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr "deaktivert"
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr "adresse i bruk"
 
@@ -786,62 +800,62 @@
 msgid "no address configured"
 msgstr "ingen adresse konfigurert"
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr "ingen adresse tilgjengelig"
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr "ingen leier igjen"
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr "galt nettverk"
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr "deaktiverer DHCP statisk adresse %s"
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr "ukjent leie"
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr "oversett"
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr "gal adresse"
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr "leie ikke funnet"
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr "adresse ikke tilgjengelig"
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr "statisk leie tilgjengelig"
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr "adresse reservert"
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, 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:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr "Mer enn en produsent klasse som passer, bruker %s"
 
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr "kan ikke binde netlink socket: %s"
diff --git a/po/pl.po b/po/pl.po
index 9f6ee08..e1326c8 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\n"
 "PO-Revision-Date: 2005-10-04 19:17+0100\n"
 "Last-Translator: Tomasz Sochañski <nerdhero@gmail.com>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -21,17 +21,17 @@
 msgid "failed to load names from %s: %m"
 msgstr "b³±d ³adowania nazw z %s: %m"
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, fuzzy, c-format
 msgid "bad address at %s line %d"
 msgstr "b³êdna nazwa w %s, linia %d"
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr "b³êdna nazwa w %s, linia %d"
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "przeczytano %s - %d adresów"
@@ -55,7 +55,7 @@
 msgstr ""
 "wielko¶æ cache %d, %d/%d wpisów cache u¿yto ponownie z niewygas³ych wpisów"
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "nie mo¿na pobraæ pamiêci"
 
@@ -73,269 +73,274 @@
 msgid "infinite"
 msgstr "nieskoñczona"
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr "Adres(y) lokalne do nas³uchiwania."
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr "Zwracanie adresu IP dla wszystkich hostów w podanych domenach."
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr "Symulacja reverse lookups dla adresów prywatnych opisanych w RFC1918."
 
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr "Adres IP traktowany jak NXDOMAIN"
 
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr "Wielko¶æ pamiêci cache we wpisach (domy¶lna: %s)"
 
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "¦cie¿ka do pliku konfiguracyjnego (domy¶lna: %s)"
 
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "NIE twórz procesu potomnego w tle: dzia³anie w trybie debugowania."
 
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "Wy³±czenie przekazywania zapytañ bez czê¶ci domenowej."
 
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Zwracanie samowskazuj±cego rekordu MX dla lokalnych hostów."
 
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr "Rozwijanie prostych nazw z /etc/hosts przyrostkiem domenowym."
 
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr "Wy³±czenie przekazywania pozornych zapytañ DNS z komputerów Windows"
 
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr "Enable DHCP w zakresie okre¶lonym czasem dzier¿awy."
 
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr "Po starcie zmiana grupy procesu na podan± (domy¶lnie: %s)."
 
-#: option.c:137
+#: option.c:138
 msgid "Set address or hostname for a specified machine."
 msgstr "Ustawienie adresu lub nazwy hosta dla okre¶lonej maszyny."
 
-#: option.c:138
+#: option.c:139
 #, c-format
 msgid "Do NOT load %s file."
 msgstr "Ignorowanie pliku %s."
 
-#: option.c:139
+#: option.c:140
 #, c-format
 msgid "Specify a hosts file to be read in addition to %s."
 msgstr "Dodatkowy plik hostów poza %s."
 
-#: option.c:140
+#: option.c:141
 msgid "Specify interface(s) to listen on."
 msgstr "Interfejs(y) do nas³uchiwania."
 
-#: option.c:141
+#: option.c:142
 msgid "Specify interface(s) NOT to listen on."
 msgstr "Interfejs(y), na których nie nas³uchiwaæ."
 
-#: option.c:142
+#: option.c:143
 msgid "Map DHCP user class to option set."
 msgstr "W³±czenie mapowania klasy u¿ytkownika DHCP do option set."
 
-#: option.c:143
+#: option.c:144
 msgid "Don't do DHCP for hosts in option set."
 msgstr ""
 "Wy³±czenie odpowiadania na ¿adania DHCP hostów okre¶lonych w option set"
 
-#: option.c:144
+#: option.c:145
 msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr ""
 "Wy³±czenie tworzenia procesu potomnego w tle, wy³±czenie dzia³ania w trybie "
 "debug."
 
-#: option.c:145
+#: option.c:146
 msgid "Assume we are the only DHCP server on the local network."
 msgstr "Za³o¿enie, ¿e jeste¶my jedynym serwerem DHCP w sieci lokalnej."
 
-#: option.c:146
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr "¦cie¿ka przechowywania pliku dzier¿aw DHCP (domy¶lna: %s)"
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr "W³±czenie zwracania rekord MX dla hostów lokalnych."
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr "Specyfikacja rekordu MX."
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr "Okre¶lenie opcji BOOTP serwera DHCP."
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr ""
 "Wy³aczenie analizy pliku %s, ponownie ³adowanie tylko po otrzymaniu sygna³u "
 "HUP"
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr ""
 "Wy³±czenie zapisywania w pamiêci podrêcznej nieudanych wyników wyszukiwania."
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr "W³±czenie u¿ywania serwerów nazw w kolejno¶ci podanej w %s."
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr "Dodatkowe opcje ustawieñ dla klientów DHCP."
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr "Port nas³uchiwania zapytañ DNS (domy¶lnie: 53)."
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr "Maksymalna obs³ugiwana wielko¶æ pakietu EDNS.0 (domy¶lnie: %s)."
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr "Zapytania zapisywane w pliku log."
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr ""
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr "Wy³±czenie czytania pliku resolv.conf"
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr "Podaj ¶cie¿kê do pliku resolv.conf (domy¶lnie: %s)."
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr "Wy³±czenie przekazywania zapytañ do okre¶lonych domen."
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr "Nazwa domeny, która bêdzie przypisana w dzier¿awach DHCP."
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr "Okre¶lenie domy¶lnego celu w rekordzie MX."
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr ""
 "Okre¶lenie czasu wa¿no¶ci (time-to-live) w sekundach odpowiedzi branych z /"
 "etc/hosts."
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr "Po starcie zmiana u¿ytkownika procesu na podanego. (domy¶lnie: %s)."
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr "Mapowanie nazwy dystrybutora DHCP do ustawieñ opcji."
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr ""
 "W³±czenie pokazywania wersji dnsmasq i informacji o ochronie praw autorskich."
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr ""
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr "Okre¶lenie rekordu SRV."
 
-#: option.c:170
+#: option.c:171
 msgid "Display this message."
 msgstr "Wy¶wietlenie tych informacji."
 
-#: option.c:171
+#: option.c:172
 #, c-format
 msgid "Specify path of PID file. (defaults to %s)."
 msgstr "Okre¶lenie ¶cie¿ki do pliku PID. (domy¶lnie: %s)."
 
-#: option.c:172
+#: option.c:173
 #, c-format
 msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr "Maksymalna liczba dzier¿aw DHCP. (domy¶lnie: %s)."
 
-#: option.c:173
+#: option.c:174
 msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 "Odpowiedzi na zapytania DNS uzale¿nione od interfejsu, który odebra³ "
 "zapytanie."
 
-#: option.c:174
+#: option.c:175
 msgid "Specify TXT DNS record."
 msgstr "Rekord TXT DNS."
 
-#: option.c:175
+#: option.c:176
 msgid "Bind only to interfaces in use."
 msgstr "W³±czenie nas³uchiwania tylko na u¿ywanych interfejsach."
 
-#: option.c:176
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr "Statycznych informacji DHCP hosta z pliku %s."
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr ""
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr "Wy³±czenie DHCP na tym interfejsie, w³±czenie tylko DNS."
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr "W³±czenie automatycznej alokacji adresu dla BOOTP."
 
-#: option.c:394
+#: option.c:181
+#, fuzzy
+msgid "Map MAC address (with wildcards) to option set."
+msgstr "Mapowanie nazwy dystrybutora DHCP do ustawieñ opcji."
+
+#: option.c:396
 msgid "missing \""
 msgstr "brakuje \""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr "nieprawid³owa opcja"
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "b³±d odczytu z %s: %s"
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
@@ -344,22 +349,22 @@
 "U¿ycie: dnsmasq [opcje]\n"
 "\n"
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr "Tylko krótkie opcje w linii komend.\n"
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr "Obs³ugiwane opcje:\n"
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr "Dnsmasq, wersja %s %s\n"
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
@@ -368,144 +373,148 @@
 "Wkompilowane opcje %s\n"
 "\n"
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr "Oprogramowanie to nie zawiera ¿adnych gwarancji.\n"
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr "Dnsmasq jest wolnym oprogramowaniem, mo¿esz je rozprowadzaæ\n"
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr "na warunkach okre¶lonych w GNU General Public Licence, wersja 2.\n"
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr "dodatkowy parametr"
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr "brak parametru"
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr "zagnie¿d¿one do³±czanie plików jest niedozwolone"
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr ""
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr "b³êdna nazwa MX"
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr "b³êdny cel MX"
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr "nieprawid³owy port"
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr "nieprawid³owy zakres dhcp-range"
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr "niespójny zakres DHCP"
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr "b³±d w dhcp-host"
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr "b³±d w dhcp-option"
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr "nieprawid³owa nazwa domeny w dhcp-option"
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr "zbyt d³uga nazwa w dhcp-option"
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr "nieprawid³owy rekord TX"
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr "zbyt d³ugi rekord TXT"
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr "b³±d w rekordzie SRV"
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr "nieprawid³owy cel SRV"
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr "nieprawid³owy port"
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr "nieprawid³owy priorytet"
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr "nieprawid³owe znaczenie"
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr "b³±d"
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr "nieprawid³owa opcja linii komend: %s."
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr "nie mo¿na pobraæ nazwy hosta: %s"
 
-#: option.c:1823
+#: option.c:1882
 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:1830
+#: option.c:1889
 msgid "must have exactly one resolv.conf to read domain from."
 msgstr "musisz mieæ dok³adnie jeden plik resolv.conf do odczytu domen."
 
-#: option.c:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr "b³±d w odczycie %s: %m"
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr "brak wytycznych wyszukiwania w %s"
 
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr "serwer nazw %s odmawia wykonania zapytania rekursywnego"
 
-#: forward.c:899
+#: forward.c:914
 msgid "forwarding table overflow: check for server loops."
 msgstr ""
 "przekroczenie zakresu tablicy przekazywania: sprawd¼ zapêtlenie serwera."
 
-#: isc.c:71 dnsmasq.c:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr "b³±d w dostêpie do %s: %m"
@@ -620,71 +629,71 @@
 msgid "must set exactly one interface on broken systems without IP_RECVIF"
 msgstr "musisz ustawiæ dok³adnie jeden interfejs w systemach bez IP_RECVIF"
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr "b³±d DBus: %s"
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 msgid "DBus not available: set HAVE_DBUS in src/config.h"
 msgstr "DBus jest niedostêpny: ustaw HAVE_DBUS w src/config.h"
 
-#: dnsmasq.c:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr "uruchomiony, wersja %s wielko¶æ cache %d"
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr "uruchomiony, wersja %s cache wy³±czony"
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr "opcje kompilacji: %s"
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr "obs³uga DBus w³±czona: pod³±czono do szyny systemowej"
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr "obs³uga DBus w³±czona: pod³±czanie do szyny systemowej w toku"
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr "ustawiam opcjê --bind-interfaces z powodu limitów systemu operacyjnego"
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr "ostrze¿enie: interfejs %s obecnie nie istnieje"
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, c-format
 msgid "DHCP, static leases only on %.0s%s, lease time %s"
 msgstr "DHCP, statyczne dzier¿awy tylko na %.0s%s, czas dzier¿awy %s"
 
-#: dnsmasq.c:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr "DHCP, zakres IP %s -- %s, czas dzier¿awy %s"
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr "DHCP, %s bêdzie zapisywane co %s"
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr "pracuje z uprawnieniami u¿ytkownika root"
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr "po³±czono do systemowego DBus"
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr "wy³±czenie po otrzymaniu sygnalu SIGTERM"
 
@@ -732,68 +741,73 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr "powtórzenie adresu IP %s w opcji dhcp-config"
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
+#: dhcp.c:345
+#, c-format
+msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
+msgstr "¿±danie DHCP nieobs³ugiwanego typu sprzêtowego (%d) otrzymane na %s"
+
+#: dhcp.c:413
 #, c-format
 msgid "DHCP range %s -- %s is not consistent with netmask %s"
 msgstr "zakres DHCP %s -- %s jest niespójny z mask± sieciow± %s"
 
-#: dhcp.c:705
+#: dhcp.c:722
 #, c-format
 msgid "failed to read %s:%m"
 msgstr "b³±d odczytu %s:%m"
 
-#: dhcp.c:724
+#: dhcp.c:741
 #, fuzzy, c-format
 msgid "bad line at %s line %d"
 msgstr "b³êdna nazwa w %s, linia %d"
 
-#: dhcp.c:825
+#: dhcp.c:845
 #, c-format
 msgid "duplicate IP address %s (%s) in dhcp-config directive"
 msgstr "powtórzenie adresu IP %s (%s) w opcji dhcp-config"
 
-#: dhcp.c:861
+#: dhcp.c:881
 #, c-format
 msgid "Ignoring DHCP host name %s because it has an illegal domain part"
 msgstr ""
 "Ignorujê nazwê hosta DHCP %s, poniewa¿ posiada nieprawid³ow± czê¶æ domenow±"
 
-#: lease.c:39
+#: lease.c:38
 #, c-format
 msgid "cannot open or create leases file: %s"
 msgstr "b³±d otwarcia lub utworzenia pliku dzier¿aw: %s"
 
-#: lease.c:77
+#: lease.c:80
 msgid "too many stored leases"
 msgstr "zbyt du¿a ilo¶æ zapisanych dzier¿aw"
 
-#: rfc2131.c:171
-#, c-format
-msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
-msgstr "¿±danie DHCP nieobs³ugiwanego typu sprzêtowego (%d) otrzymane na %s"
+#: lease.c:179
+#, fuzzy
+msgid "failed to write"
+msgstr "b³±d odczytu %s:%m"
 
-#: rfc2131.c:220
+#: rfc2131.c:218
 #, c-format
 msgid "no address range available for DHCP request %s %s"
 msgstr "¿aden zakres adresowy nie jest dostêpny dla ¿adania DHCP %s %s"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr "z selekcj± podsieci"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr "przez"
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr "wy³±czony(a)"
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr "adres w u¿yciu"
 
@@ -801,62 +815,62 @@
 msgid "no address configured"
 msgstr "brak skonfigurowanego adresu"
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr "brak dostêpnego adresu"
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr "brak wolnych dzier¿aw"
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr "nieprawid³owa sieæ"
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr "wy³±czanie statycznego adresu DHCP %s"
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr "nieznana dzier¿awa"
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr "ignorujê"
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr "b³êdny adres"
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr "dzier¿awa nie znaleziona"
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr "adres niedostêpny"
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr "dostêpna statyczna dzier¿awa"
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr "adres zarezerwowany"
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr ""
 
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr "Wiêcej ni¿ jeden dystrybutor pasuj±cy, u¿ywam %s"
 
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr "nie mo¿na pod³±czyæ gniazda netlink: %s"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 4547c4a..5aa8a7e 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.26\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -20,17 +20,17 @@
 msgid "failed to load names from %s: %m"
 msgstr ""
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, c-format
 msgid "bad address at %s line %d"
 msgstr ""
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr ""
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr ""
@@ -51,7 +51,7 @@
 msgid "cache size %d, %d/%d cache insertions re-used unexpired cache entries."
 msgstr ""
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr ""
 
@@ -69,423 +69,431 @@
 msgid "infinite"
 msgstr ""
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr ""
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr ""
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr ""
 
-#: option.c:127
-msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
-msgstr ""
-
 #: option.c:128
-#, c-format
-msgid "Specify the size of the cache in entries (defaults to %s)."
+msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr ""
 
 #: option.c:129
 #, c-format
-msgid "Specify configuration file (defaults to %s)."
+msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr ""
 
 #: option.c:130
-msgid "Do NOT fork into the background: run in debug mode."
+#, c-format
+msgid "Specify configuration file (defaults to %s)."
 msgstr ""
 
 #: option.c:131
-msgid "Do NOT forward queries with no domain part."
+msgid "Do NOT fork into the background: run in debug mode."
 msgstr ""
 
 #: option.c:132
-msgid "Return self-pointing MX records for local hosts."
+msgid "Do NOT forward queries with no domain part."
 msgstr ""
 
 #: option.c:133
-msgid "Expand simple names in /etc/hosts with domain-suffix."
+msgid "Return self-pointing MX records for local hosts."
 msgstr ""
 
 #: option.c:134
-msgid "Don't forward spurious DNS requests from Windows hosts."
+msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr ""
 
 #: option.c:135
-msgid "Enable DHCP in the range given with lease duration."
+msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr ""
 
 #: option.c:136
+msgid "Enable DHCP in the range given with lease duration."
+msgstr ""
+
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr ""
 
-#: option.c:137
-msgid "Set address or hostname for a specified machine."
-msgstr ""
-
 #: option.c:138
-#, c-format
-msgid "Do NOT load %s file."
+msgid "Set address or hostname for a specified machine."
 msgstr ""
 
 #: option.c:139
 #, c-format
-msgid "Specify a hosts file to be read in addition to %s."
+msgid "Do NOT load %s file."
 msgstr ""
 
 #: option.c:140
-msgid "Specify interface(s) to listen on."
+#, c-format
+msgid "Specify a hosts file to be read in addition to %s."
 msgstr ""
 
 #: option.c:141
-msgid "Specify interface(s) NOT to listen on."
+msgid "Specify interface(s) to listen on."
 msgstr ""
 
 #: option.c:142
-msgid "Map DHCP user class to option set."
+msgid "Specify interface(s) NOT to listen on."
 msgstr ""
 
 #: option.c:143
-msgid "Don't do DHCP for hosts in option set."
+msgid "Map DHCP user class to option set."
 msgstr ""
 
 #: option.c:144
-msgid "Do NOT fork into the background, do NOT run in debug mode."
+msgid "Don't do DHCP for hosts in option set."
 msgstr ""
 
 #: option.c:145
-msgid "Assume we are the only DHCP server on the local network."
+msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr ""
 
 #: option.c:146
+msgid "Assume we are the only DHCP server on the local network."
+msgstr ""
+
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr ""
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr ""
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr ""
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr ""
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr ""
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr ""
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr ""
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr ""
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr ""
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr ""
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr ""
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr ""
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr ""
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr ""
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr ""
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr ""
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr ""
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr ""
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr ""
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr ""
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr ""
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr ""
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr ""
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr ""
 
-#: option.c:170
-msgid "Display this message."
-msgstr ""
-
 #: option.c:171
-#, c-format
-msgid "Specify path of PID file. (defaults to %s)."
+msgid "Display this message."
 msgstr ""
 
 #: option.c:172
 #, c-format
-msgid "Specify maximum number of DHCP leases (defaults to %s)."
+msgid "Specify path of PID file. (defaults to %s)."
 msgstr ""
 
 #: option.c:173
-msgid "Answer DNS queries based on the interface a query was sent to."
+#, c-format
+msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr ""
 
 #: option.c:174
-msgid "Specify TXT DNS record."
+msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 
 #: option.c:175
-msgid "Bind only to interfaces in use."
+msgid "Specify TXT DNS record."
 msgstr ""
 
 #: option.c:176
+msgid "Bind only to interfaces in use."
+msgstr ""
+
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr ""
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr ""
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr ""
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr ""
 
-#: option.c:394
+#: option.c:181
+msgid "Map MAC address (with wildcards) to option set."
+msgstr ""
+
+#: option.c:396
 msgid "missing \""
 msgstr ""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr ""
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
 "\n"
 msgstr ""
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr ""
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr ""
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr ""
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
 "\n"
 msgstr ""
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr ""
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr ""
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr ""
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr ""
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr ""
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr ""
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr ""
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr ""
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr ""
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr ""
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr ""
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr ""
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr ""
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr ""
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr ""
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr ""
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr ""
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr ""
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr ""
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr ""
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr ""
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr ""
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr ""
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr ""
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr ""
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr ""
 
-#: option.c:1823
+#: option.c:1882
 msgid "only one resolv.conf file allowed in no-poll mode."
 msgstr ""
 
-#: option.c:1830
+#: option.c:1889
 msgid "must have exactly one resolv.conf to read domain from."
 msgstr ""
 
-#: option.c:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr ""
 
-#: option.c:1851
+#: option.c:1910
 #, c-format
 msgid "no search directive found in %s"
 msgstr ""
 
-#: forward.c:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr ""
 
-#: forward.c:899
+#: forward.c:914
 msgid "forwarding table overflow: check for server loops."
 msgstr ""
 
-#: isc.c:71 dnsmasq.c:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr ""
@@ -596,71 +604,71 @@
 msgid "must set exactly one interface on broken systems without IP_RECVIF"
 msgstr ""
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr ""
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 msgid "DBus not available: set HAVE_DBUS in src/config.h"
 msgstr ""
 
-#: dnsmasq.c:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr ""
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr ""
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr ""
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr ""
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr ""
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr ""
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr ""
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, c-format
 msgid "DHCP, static leases only on %.0s%s, lease time %s"
 msgstr ""
 
-#: dnsmasq.c:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr ""
 
-#: dnsmasq.c:344
+#: dnsmasq.c:343
 #, c-format
 msgid "DHCP, %s will be written every %s"
 msgstr ""
 
-#: dnsmasq.c:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr ""
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr ""
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr ""
 
@@ -706,67 +714,71 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr ""
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
-#, c-format
-msgid "DHCP range %s -- %s is not consistent with netmask %s"
-msgstr ""
-
-#: dhcp.c:705
-#, c-format
-msgid "failed to read %s:%m"
-msgstr ""
-
-#: dhcp.c:724
-#, c-format
-msgid "bad line at %s line %d"
-msgstr ""
-
-#: dhcp.c:825
-#, c-format
-msgid "duplicate IP address %s (%s) in dhcp-config directive"
-msgstr ""
-
-#: dhcp.c:861
-#, c-format
-msgid "Ignoring DHCP host name %s because it has an illegal domain part"
-msgstr ""
-
-#: lease.c:39
-#, c-format
-msgid "cannot open or create leases file: %s"
-msgstr ""
-
-#: lease.c:77
-msgid "too many stored leases"
-msgstr ""
-
-#: rfc2131.c:171
+#: dhcp.c:345
 #, c-format
 msgid "DHCP request for unsupported hardware type (%d) recieved on %s"
 msgstr ""
 
-#: rfc2131.c:220
+#: dhcp.c:413
+#, c-format
+msgid "DHCP range %s -- %s is not consistent with netmask %s"
+msgstr ""
+
+#: dhcp.c:722
+#, c-format
+msgid "failed to read %s:%m"
+msgstr ""
+
+#: dhcp.c:741
+#, c-format
+msgid "bad line at %s line %d"
+msgstr ""
+
+#: dhcp.c:845
+#, c-format
+msgid "duplicate IP address %s (%s) in dhcp-config directive"
+msgstr ""
+
+#: dhcp.c:881
+#, c-format
+msgid "Ignoring DHCP host name %s because it has an illegal domain part"
+msgstr ""
+
+#: lease.c:38
+#, c-format
+msgid "cannot open or create leases file: %s"
+msgstr ""
+
+#: lease.c:80
+msgid "too many stored leases"
+msgstr ""
+
+#: lease.c:179
+msgid "failed to write"
+msgstr ""
+
+#: rfc2131.c:218
 #, c-format
 msgid "no address range available for DHCP request %s %s"
 msgstr ""
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr ""
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr ""
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr ""
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr ""
 
@@ -774,62 +786,62 @@
 msgid "no address configured"
 msgstr ""
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr ""
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr ""
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr ""
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr ""
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr ""
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr ""
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr ""
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr ""
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr ""
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr ""
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr ""
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, c-format
 msgid "cannot send DHCP option %d: no space left in packet"
 msgstr ""
 
-#: rfc2131.c:1150
+#: rfc2131.c:1174
 #, c-format
 msgid "More than one vendor class matches, using %s"
 msgstr ""
 
-#: netlink.c:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr ""
diff --git a/po/ro.po b/po/ro.po
index 7c77ab4..04446a9 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: dnsmasq 2.24\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-01-22 13:12+0000\n"
+"POT-Creation-Date: 2006-03-16 20:04+0000\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"
@@ -20,17 +20,17 @@
 msgid "failed to load names from %s: %m"
 msgstr "încărcarea numelor din %s: %m a eÅŸuat"
 
-#: cache.c:601 dhcp.c:737
+#: cache.c:601 dhcp.c:754
 #, c-format
 msgid "bad address at %s line %d"
 msgstr "adresă greÅŸită în %s, linia %d"
 
-#: cache.c:628 dhcp.c:751
+#: cache.c:628 dhcp.c:768
 #, c-format
 msgid "bad name at %s line %d"
 msgstr "nume greÅŸit în %s linia %d"
 
-#: cache.c:634 dhcp.c:802
+#: cache.c:634 dhcp.c:822
 #, c-format
 msgid "read %s - %d addresses"
 msgstr "citesc %s - %d adrese"
@@ -55,7 +55,7 @@
 "cantitate de memorie temporară %d, %d/%d stocări temporare aureutilizat "
 "locaţii neexpirate."
 
-#: util.c:149 option.c:1284
+#: util.c:149 option.c:1302
 msgid "could not get memory"
 msgstr "nu am putut aloca memorie"
 
@@ -73,260 +73,265 @@
 msgid "infinite"
 msgstr "infinit"
 
-#: option.c:124
+#: option.c:125
 msgid "Specify local address(es) to listen on."
 msgstr "Specificaţi adresele locale deservite."
 
-#: option.c:125
+#: option.c:126
 msgid "Return ipaddr for all hosts in specified domains."
 msgstr "AfiÅŸează adresele IP ale maÅŸinilor în domeniul dat."
 
-#: option.c:126
+#: option.c:127
 msgid "Fake reverse lookups for RFC1918 private address ranges."
 msgstr ""
 "Simulează căutări după adresă pentru domenii de adresă private (RFC1918)."
 
-#: option.c:127
+#: option.c:128
 msgid "Treat ipaddr as NXDOMAIN (defeats Verisign wildcard)."
 msgstr "Interpretează adresa IP ca NXDOMAIN (împotriva manipulărilor Verisign)"
 
-#: option.c:128
+#: option.c:129
 #, c-format
 msgid "Specify the size of the cache in entries (defaults to %s)."
 msgstr "Specifică mărimea înregistrărilor temporare (implicit e %s)."
 
-#: option.c:129
+#: option.c:130
 #, c-format
 msgid "Specify configuration file (defaults to %s)."
 msgstr "Specifică fişier de configurare (implicit e %s)."
 
-#: option.c:130
+#: option.c:131
 msgid "Do NOT fork into the background: run in debug mode."
 msgstr "NU porneÅŸte în fundal: rulează în modul depanare."
 
-#: option.c:131
+#: option.c:132
 msgid "Do NOT forward queries with no domain part."
 msgstr "NU înainta cererile ce nu conÅ£in domeniu DNS."
 
-#: option.c:132
+#: option.c:133
 msgid "Return self-pointing MX records for local hosts."
 msgstr "Răspunde cu înregistrări MX spre el însuÅŸi pentru maÅŸini locale."
 
-#: option.c:133
+#: option.c:134
 msgid "Expand simple names in /etc/hosts with domain-suffix."
 msgstr "Adaugă numelor simple din /etc/hosts numele domeniului ca sufix."
 
-#: option.c:134
+#: option.c:135
 msgid "Don't forward spurious DNS requests from Windows hosts."
 msgstr "Nu inainta cereri DNS defecte provenite de la maÅŸini Windows."
 
-#: option.c:135
+#: option.c:136
 msgid "Enable DHCP in the range given with lease duration."
 msgstr "Activează DHCP în domeniul dat cu durată limitată de împrumut."
 
-#: option.c:136
+#: option.c:137
 #, c-format
 msgid "Change to this group after startup (defaults to %s)."
 msgstr "Rulează sub acest grup după pornire (implicit e %s)."
 
-#: option.c:137
+#: option.c:138
 msgid "Set address or hostname for a specified machine."
 msgstr "Schimbă adresa sau numele maşinii specificate."
 
-#: option.c:138
+#: option.c:139
 #, c-format
 msgid "Do NOT load %s file."
 msgstr "Nu încarcă fiÅŸierul %s."
 
-#: option.c:139
+#: option.c:140
 #, c-format
 msgid "Specify a hosts file to be read in addition to %s."
 msgstr "Specifică spre citire un fişier hosts adiţional la %s."
 
-#: option.c:140
+#: option.c:141
 msgid "Specify interface(s) to listen on."
 msgstr "Specifică interfeţele deservite."
 
-#: option.c:141
+#: option.c:142
 msgid "Specify interface(s) NOT to listen on."
 msgstr "Specifică interfeţele NE-deservite."
 
-#: option.c:142
+#: option.c:143
 msgid "Map DHCP user class to option set."
 msgstr "Leagă clasa de utilizator DHCP cu grup de opţiuni."
 
-#: option.c:143
+#: option.c:144
 msgid "Don't do DHCP for hosts in option set."
 msgstr "Nu furniza DHCP maşinilor din grupul de opţiuni."
 
-#: option.c:144
+#: option.c:145
 msgid "Do NOT fork into the background, do NOT run in debug mode."
 msgstr "NU porneÅŸte în fundal, NU rulează în modul depanare."
 
-#: option.c:145
+#: option.c:146
 msgid "Assume we are the only DHCP server on the local network."
 msgstr "Presupune că suntem singurul server DHCP din reţeaua locală."
 
-#: option.c:146
+#: option.c:147
 #, c-format
 msgid "Specify where to store DHCP leases (defaults to %s)."
 msgstr "Specifică fiÅŸierul de stocare a împrumuturilor DHCP (implicit e %s)."
 
-#: option.c:147
+#: option.c:148
 msgid "Return MX records for local hosts."
 msgstr "Răspunde cu întregistrări MX pentru maÅŸini locale."
 
-#: option.c:148
+#: option.c:149
 msgid "Specify an MX record."
 msgstr "Specifică o înregistrare MX."
 
-#: option.c:149
+#: option.c:150
 msgid "Specify BOOTP options to DHCP server."
 msgstr "Specifică opţiuni BOOTP serverului DHCP."
 
-#: option.c:150
+#: option.c:151
 #, c-format
 msgid "Do NOT poll %s file, reload only on SIGHUP."
 msgstr "Nu încărca fiÅŸierul %s, citeÅŸte-l doar la SIGHUP."
 
-#: option.c:151
+#: option.c:152
 msgid "Do NOT cache failed search results."
 msgstr "NU memora rezultatele de căutare DNS eşuatată."
 
-#: option.c:152
+#: option.c:153
 #, c-format
 msgid "Use nameservers strictly in the order given in %s."
 msgstr "FoloseÅŸte servere DNS strict în ordinea dată în %s."
 
-#: option.c:153
+#: option.c:154
 msgid "Set extra options to be set to DHCP clients."
 msgstr "Configurează opÅ£iuni în plusce trebuie trimise clienÅ£ilor DHCP."
 
-#: option.c:154
+#: option.c:155
 msgid "Specify port to listen for DNS requests on (defaults to 53)."
 msgstr "Specifică numărul portului pentru cereri DNS (implicit e 53)."
 
-#: option.c:155
+#: option.c:156
 #, c-format
 msgid "Maximum supported UDP packet size for EDNS.0 (defaults to %s)."
 msgstr "Marimea maximă a pachetului UDP pentru EDNS.0 (implicit e %s)."
 
-#: option.c:156
+#: option.c:157
 msgid "Log queries."
 msgstr "Înregistrează tranzacÅ£iile."
 
-#: option.c:157
+#: option.c:158
 msgid "Force the originating port for upstream queries."
 msgstr "Forţează acest port pentru datele ce pleacă."
 
-#: option.c:158
+#: option.c:159
 msgid "Do NOT read resolv.conf."
 msgstr "NU citi fiÅŸierul resolv.conf"
 
-#: option.c:159
+#: option.c:160
 #, c-format
 msgid "Specify path to resolv.conf (defaults to %s)."
 msgstr "Specifică calea către resolv.conf (implicit e %s)."
 
-#: option.c:160
+#: option.c:161
 msgid "Specify address(es) of upstream servers with optional domains."
 msgstr "Specifică adresele server(elor) superioare cu domenii opţionale."
 
-#: option.c:161
+#: option.c:162
 msgid "Never forward queries to specified domains."
 msgstr "Nu înaintează cererile spre domeniile specificate."
 
-#: option.c:162
+#: option.c:163
 msgid "Specify the domain to be assigned in DHCP leases."
 msgstr "Specifică domeniul de transmis prin DHCP."
 
-#: option.c:163
+#: option.c:164
 msgid "Specify default target in an MX record."
 msgstr "Specifică o Å£intă într-o înregistrare MX."
 
-#: option.c:164
+#: option.c:165
 msgid "Specify time-to-live in seconds for replies from /etc/hosts."
 msgstr "Specifică TTL în secunde pentru răspunsurile din /etc/hosts."
 
-#: option.c:165
+#: option.c:166
 #, c-format
 msgid "Change to this user after startup. (defaults to %s)."
 msgstr "Rulează sub acest utilizator după pornire. (implicit e %s)."
 
-#: option.c:166
+#: option.c:167
 msgid "Map DHCP vendor class to option set."
 msgstr "Trimite opÅ£iuni DHCP în funcÅ£ie de marca plăcii de reÅ£ea."
 
-#: option.c:167
+#: option.c:168
 msgid "Display dnsmasq version and copyright information."
 msgstr "Afişează versiunea dnsmasq şi drepturile de autor."
 
-#: option.c:168
+#: option.c:169
 msgid "Translate IPv4 addresses from upstream servers."
 msgstr "Traduce adresele IPv4 de la serverele DNS superioare."
 
-#: option.c:169
+#: option.c:170
 msgid "Specify a SRV record."
 msgstr "Specifică o înregistrare SRV."
 
-#: option.c:170
+#: option.c:171
 msgid "Display this message."
 msgstr "Afişează acest mesaj."
 
-#: option.c:171
+#: option.c:172
 #, c-format
 msgid "Specify path of PID file. (defaults to %s)."
 msgstr "Specifică o cale pentru fişierul PID. (implicit %s)."
 
-#: option.c:172
+#: option.c:173
 #, c-format
 msgid "Specify maximum number of DHCP leases (defaults to %s)."
 msgstr "Specifică numărul maxim de împrumuturi DHCP (implicit %s)."
 
-#: option.c:173
+#: option.c:174
 msgid "Answer DNS queries based on the interface a query was sent to."
 msgstr ""
 "Răspunde cererilor DNS în funcÅ£ie de interfaÅ£a pe care a venit cererea."
 
-#: option.c:174
+#: option.c:175
 msgid "Specify TXT DNS record."
 msgstr "Specifică o înregistrare TXT."
 
-#: option.c:175
+#: option.c:176
 msgid "Bind only to interfaces in use."
 msgstr "Ascultă doar pe interfeţele active."
 
-#: option.c:176
+#: option.c:177
 #, c-format
 msgid "Read DHCP static host information from %s."
 msgstr "Citeşte informaţii DHCP statice despre maşină din %s."
 
-#: option.c:177
+#: option.c:178
 msgid "Enable the DBus interface for setting upstream servers, etc."
 msgstr "Activeaza interfaţa DBus pentru configurarea serverelor superioare."
 
-#: option.c:178
+#: option.c:179
 msgid "Do not provide DHCP on this interface, only provide DNS."
 msgstr "Nu activează DHCP ci doar DNS pe această interfaţă."
 
-#: option.c:179
+#: option.c:180
 msgid "Enable dynamic address allocation for bootp."
 msgstr "Activează alocarea dinamică a adreselor pentru BOOTP."
 
-#: option.c:394
+#: option.c:181
+#, fuzzy
+msgid "Map MAC address (with wildcards) to option set."
+msgstr "Trimite opÅ£iuni DHCP în funcÅ£ie de marca plăcii de reÅ£ea."
+
+#: option.c:396
 msgid "missing \""
 msgstr "lipseÅŸte \""
 
-#: option.c:423
+#: option.c:425
 msgid "bad option"
 msgstr "opţiune invalidă"
 
-#: option.c:440
+#: option.c:442
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "nu pot citi %s: %s"
 
-#: option.c:446
+#: option.c:448
 #, c-format
 msgid ""
 "Usage: dnsmasq [options]\n"
@@ -335,22 +340,22 @@
 "Utilizare: dnsmasq [opţiuni]\n"
 "\n"
 
-#: option.c:448
+#: option.c:450
 #, c-format
 msgid "Use short options only on the command line.\n"
 msgstr "FolosiÅ£i opÅ£iunile prescurtate doar în linie de comandă.\n"
 
-#: option.c:450
+#: option.c:452
 #, c-format
 msgid "Valid options are :\n"
 msgstr "Opţiunile valide sunt:\n"
 
-#: option.c:475
+#: option.c:477
 #, c-format
 msgid "Dnsmasq version %s  %s\n"
 msgstr "dnsmasq versiunea %s  %s\n"
 
-#: option.c:476
+#: option.c:478
 #, c-format
 msgid ""
 "Compile time options %s\n"
@@ -359,144 +364,148 @@
 "Opţiuni cu care a fost compilat %s\n"
 "\n"
 
-#: option.c:477
+#: option.c:479
 #, c-format
 msgid "This software comes with ABSOLUTELY NO WARRANTY.\n"
 msgstr "Acest program vine FÄ‚RÄ‚ NICI O GARANÅ¢IE.\n"
 
-#: option.c:478
+#: option.c:480
 #, c-format
 msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
 msgstr "Dnsmasq este un program gratuit, sunteţi invitaţi să-l redistribuiţi\n"
 
-#: option.c:479
+#: option.c:481
 #, c-format
 msgid "under the terms of the GNU General Public License, version 2.\n"
 msgstr "în termenii LicenÅ£ei publice generale GNU, versiunea 2.\n"
 
-#: option.c:489
+#: option.c:491
 msgid "extraneous parameter"
 msgstr "parametru nerecunoscut"
 
-#: option.c:497
+#: option.c:499
 msgid "missing parameter"
 msgstr "parametru lipsa"
 
-#: option.c:514
+#: option.c:516
 msgid "nested includes not allowed"
 msgstr "incluziunile locale nu sunt permise"
 
-#: option.c:574
+#: option.c:576
 msgid "bad MX preference"
 msgstr "preferinţă MX invalidă"
 
-#: option.c:583
+#: option.c:585
 msgid "bad MX name"
 msgstr "nume MX invalid"
 
-#: option.c:601
+#: option.c:603
 msgid "bad MX target"
 msgstr "ţintă MX invalidă"
 
-#: option.c:803 option.c:814
+#: option.c:805 option.c:816
 msgid "bad port"
 msgstr "port invalid"
 
-#: option.c:954
+#: option.c:957
 msgid "bad dhcp-range"
 msgstr "dhcp-range invalid"
 
-#: option.c:1014
+#: option.c:986
+msgid "only one netid tag allowed"
+msgstr ""
+
+#: option.c:1031
 msgid "inconsistent DHCP range"
 msgstr "domeniu DHCP inconsistent"
 
-#: option.c:1201
+#: option.c:1219
 msgid "bad dhcp-host"
 msgstr "dhcp-host invalid"
 
-#: option.c:1261
+#: option.c:1279
 msgid "bad dhcp-option"
 msgstr "dhcp-option invalid"
 
-#: option.c:1279
+#: option.c:1297
 msgid "bad domain in dhcp-option"
 msgstr "domeniu DNS invalid în declaraÅ£ia dhcp-option"
 
-#: option.c:1425
+#: option.c:1467
 msgid "dhcp-option too long"
 msgstr "declararea dhcp-option este prea lungă"
 
-#: option.c:1605
+#: option.c:1664
 msgid "bad TXT record"
 msgstr "înregistrare TXT invalidă"
 
-#: option.c:1637
+#: option.c:1696
 msgid "TXT record string too long"
 msgstr "ÅŸirul de caractere pentru înregistrarea TXT este prea lung"
 
-#: option.c:1676
+#: option.c:1735
 msgid "bad SRV record"
 msgstr "înregistrare SRV invalidă"
 
-#: option.c:1689
+#: option.c:1748
 msgid "bad SRV target"
 msgstr "ţintă SRV invalidă"
 
-#: option.c:1701
+#: option.c:1760
 msgid "invalid port number"
 msgstr "număr de port invalid"
 
-#: option.c:1712
+#: option.c:1771
 msgid "invalid priority"
 msgstr "prioritate invalidă"
 
-#: option.c:1723
+#: option.c:1782
 msgid "invalid weight"
 msgstr "pondere invalidă"
 
-#: option.c:1748
+#: option.c:1807
 msgid "error"
 msgstr "eroare"
 
-#: option.c:1750
+#: option.c:1809
 #, c-format
 msgid "bad command line options: %s."
 msgstr "opÅ£iuni în linie de comandă invalide: %s."
 
-#: option.c:1794
+#: option.c:1853
 #, c-format
 msgid "cannot get host-name: %s"
 msgstr "nu pot citi numele maÅŸinii: %s"
 
-#: option.c:1823
+#: option.c:1882
 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:1830
+#: option.c:1889
 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:1833 network.c:591
+#: option.c:1892 network.c:591
 #, c-format
 msgid "failed to read %s: %m"
 msgstr "nu pot citi %s: %n"
 
-#: option.c:1851
+#: option.c:1910
 #, 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:378
+#: forward.c:383
 #, c-format
 msgid "nameserver %s refused to do a recursive query"
 msgstr "serverul DNS %s refuză interogările recursive"
 
-#: forward.c:899
+#: forward.c:914
 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:474
+#: isc.c:71 dnsmasq.c:482
 #, c-format
 msgid "failed to access %s: %m"
 msgstr "accesarea serverului %s a eÅŸuat: %n"
@@ -611,71 +620,71 @@
 "trebuie specificată exact o singură interfaţă pe sistemele defectece nu au "
 "IP_RECVIF"
 
-#: dnsmasq.c:176 dnsmasq.c:507
+#: dnsmasq.c:176 dnsmasq.c:520
 #, c-format
 msgid "DBus error: %s"
 msgstr "eroare DBus: %s"
 
-#: dnsmasq.c:180
+#: dnsmasq.c:179
 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:293
+#: dnsmasq.c:292
 #, c-format
 msgid "started, version %s cachesize %d"
 msgstr "am ponit, versiunea %s memorie temporară %d"
 
-#: dnsmasq.c:295
+#: dnsmasq.c:294
 #, c-format
 msgid "started, version %s cache disabled"
 msgstr "am pornit, versiunea %s memorie temporară dezactivată"
 
-#: dnsmasq.c:297
+#: dnsmasq.c:296
 #, c-format
 msgid "compile time options: %s"
 msgstr "compilat cu opţiunile: %s"
 
-#: dnsmasq.c:303
+#: dnsmasq.c:302
 msgid "DBus support enabled: connected to system bus"
 msgstr "suportul DBus activ: sunt conectat la magistrala sistem"
 
-#: dnsmasq.c:305
+#: dnsmasq.c:304
 msgid "DBus support enabled: bus connection pending"
 msgstr "suportul DBus activ: aştept conexiunea la magistrală"
 
-#: dnsmasq.c:310
+#: dnsmasq.c:309
 msgid "setting --bind-interfaces option because of OS limitations"
 msgstr "specific opţiunea --bind-interfaces din cauza limitărilor SO"
 
-#: dnsmasq.c:315
+#: dnsmasq.c:314
 #, c-format
 msgid "warning: interface %s does not currently exist"
 msgstr "atenţie: interfaţa %s nu există momentan"
 
-#: dnsmasq.c:332
+#: dnsmasq.c:331
 #, 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:333
+#: dnsmasq.c:332
 #, c-format
 msgid "DHCP, IP range %s -- %s, lease time %s"
 msgstr "DHCP, domeniu IP %s -- %s, timpul reînoirii %s"
 
-#: dnsmasq.c:344
+#: 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:349
+#: dnsmasq.c:348
 msgid "running as root"
 msgstr "rulez ca root"
 
-#: dnsmasq.c:509
+#: dnsmasq.c:522
 msgid "connected to system DBus"
 msgstr "magistrala sistem Dbus conectată"
 
-#: dnsmasq.c:520
+#: dnsmasq.c:533
 msgid "exiting on receipt of SIGTERM"
 msgstr "am primit SIGTERM, am terminat"
 
@@ -723,67 +732,72 @@
 msgid "duplicate IP address %s in dhcp-config directive."
 msgstr "adresă IP duplicat %s în declaraÅ£ia dhcp-config."
 
-#: dhcp.c:233
+#: dhcp.c:234
 msgid "Cannot use RTnetlink socket, falling back to ioctl API"
 msgstr ""
 
-#: dhcp.c:394
-#, 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:705
-#, c-format
-msgid "failed to read %s:%m"
-msgstr "citirea %s:%n a eÅŸuat"
-
-#: dhcp.c:724
-#, c-format
-msgid "bad line at %s line %d"
-msgstr "linie invalidă în %s rândul %d"
-
-#: dhcp.c:825
-#, 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:861
-#, 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:39
-#, c-format
-msgid "cannot open or create leases file: %s"
-msgstr "nu pot creea sau deschide fiÅŸierul cu împrumuturi: %s"
-
-#: lease.c:77
-msgid "too many stored leases"
-msgstr "prea multe împrumuturi stocate"
-
-#: rfc2131.c:171
+#: 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"
 
-#: rfc2131.c:220
+#: dhcp.c:413
+#, 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
+#, c-format
+msgid "failed to read %s:%m"
+msgstr "citirea %s:%n a eÅŸuat"
+
+#: dhcp.c:741
+#, c-format
+msgid "bad line at %s line %d"
+msgstr "linie invalidă în %s rândul %d"
+
+#: dhcp.c:845
+#, 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
+#, 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
+#, c-format
+msgid "cannot open or create leases file: %s"
+msgstr "nu pot creea sau deschide fiÅŸierul cu împrumuturi: %s"
+
+#: lease.c:80
+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"
+
+#: rfc2131.c:218
 #, 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:221
+#: rfc2131.c:219
 msgid "with subnet selector"
 msgstr "cu selectorul de subreţea"
 
-#: rfc2131.c:221
+#: rfc2131.c:219
 msgid "via"
 msgstr "prin"
 
-#: rfc2131.c:241 rfc2131.c:265
+#: rfc2131.c:240 rfc2131.c:264
 msgid "disabled"
 msgstr "dezactivat"
 
-#: rfc2131.c:275 rfc2131.c:661
+#: rfc2131.c:275 rfc2131.c:674
 msgid "address in use"
 msgstr "adresa este folosită"
 
@@ -791,62 +805,62 @@
 msgid "no address configured"
 msgstr "adresă lipsă"
 
-#: rfc2131.c:291 rfc2131.c:537
+#: rfc2131.c:291 rfc2131.c:546
 msgid "no address available"
 msgstr "nici o adresă disponibilă"
 
-#: rfc2131.c:298 rfc2131.c:664
+#: rfc2131.c:298 rfc2131.c:677
 msgid "no leases left"
 msgstr "nu mai am de unde să împrumut"
 
-#: rfc2131.c:301 rfc2131.c:637
+#: rfc2131.c:301 rfc2131.c:650
 msgid "wrong network"
 msgstr "reţea greşită"
 
-#: rfc2131.c:496
+#: rfc2131.c:505
 #, c-format
 msgid "disabling DHCP static address %s"
 msgstr "dezactivăm adresele DHCP statice %s"
 
-#: rfc2131.c:514
+#: rfc2131.c:523
 msgid "unknown lease"
 msgstr "împrumut necunoscut"
 
-#: rfc2131.c:527 rfc2131.c:736
+#: rfc2131.c:536 rfc2131.c:749
 msgid "ignored"
 msgstr "ignorat"
 
-#: rfc2131.c:610
+#: rfc2131.c:619
 msgid "wrong address"
 msgstr "adresă greşită"
 
-#: rfc2131.c:619
+#: rfc2131.c:632
 msgid "lease not found"
 msgstr "împrumutul nu a fost găsit"
 
-#: rfc2131.c:645
+#: rfc2131.c:658
 msgid "address not available"
 msgstr "adresă indisponibilă"
 
-#: rfc2131.c:654
+#: rfc2131.c:667
 msgid "static lease available"
 msgstr "împrumut static este disponibil"
 
-#: rfc2131.c:658
+#: rfc2131.c:671
 msgid "address reserved"
 msgstr "adresă rezervată"
 
-#: rfc2131.c:855
+#: rfc2131.c:871
 #, 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:1150
+#: rfc2131.c:1174
 #, 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:37
+#: netlink.c:41
 #, c-format
 msgid "cannot bind netlink socket: %s"
 msgstr "nu pot să activez socket-ul netlink: %s"
diff --git a/src/cache.c b/src/cache.c
index 16f8810..8221f41 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -194,7 +194,7 @@
 	      }
 	  } 
 	else if ((crecp->flags & F_FORWARD) && 
-		 ((flags & crecp->flags & (F_IPV4 | F_IPV6)) || (crecp->flags & F_CNAME)) &&
+		 ((flags & crecp->flags & (F_IPV4 | F_IPV6)) || ((crecp->flags | flags) & F_CNAME)) &&
 		 hostname_isequal(cache_get_name(crecp), name))
 	  {
 	    if (crecp->flags & (F_HOSTS | F_DHCP))
diff --git a/src/config.h b/src/config.h
index 1f2c556..d1b5c49 100644
--- a/src/config.h
+++ b/src/config.h
@@ -12,13 +12,14 @@
 
 /* Author's email: simon@thekelleys.org.uk */
 
-#define VERSION "2.26"
+#define VERSION "2.27"
 
 #define FTABSIZ 150 /* max number of outstanding requests */
 #define MAX_PROCS 20 /* max no children for TCP requests */
 #define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
 #define EDNS_PKTSZ 1280 /* default max EDNS.0 UDP packet from RFC2671 */
 #define TIMEOUT 20 /* drop UDP queries after TIMEOUT seconds */
+#define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
 #define LOGRATE 120 /* log table overflows every LOGRATE seconds */
 #define CACHESIZ 150 /* default cache size */
 #define MAXTOK 50 /* token in DHCP leases */
diff --git a/src/dhcp.c b/src/dhcp.c
index a50d8d0..1c00f18 100644
--- a/src/dhcp.c
+++ b/src/dhcp.c
@@ -1,4 +1,4 @@
-/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
+/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -115,8 +115,9 @@
   struct msghdr msg;
   struct iovec iov[2];
   struct cmsghdr *cmptr;
-  int sz, newlen, iface_index = 0;
-  int unicast_dest = 0;
+  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];
@@ -144,7 +145,7 @@
   
   sz = recvmsg(daemon->dhcpfd, &msg, 0);
   
-  if (sz < (int)(sizeof(*mess) - sizeof(mess->options)))
+  if (sz < (ssize_t)(sizeof(*mess) - sizeof(mess->options)))
     return;
   
 #if defined (IP_PKTINFO)
@@ -248,8 +249,8 @@
     }
 
   lease_prune(NULL, now); /* lose any expired leases */
-  newlen = dhcp_reply(daemon, context, ifr.ifr_name, sz, now, unicast_dest);
-  lease_update_file(0, now);
+  newlen = dhcp_reply(daemon, context, ifr.ifr_name, (size_t)sz, now, unicast_dest);
+  lease_update_file(daemon, 0, now);
   lease_update_dns(daemon);
   
   if (newlen == 0)
@@ -289,16 +290,16 @@
 	 the kernel IP stack */
       
       u32 i, sum;
-      unsigned char hwdest[ETHER_ADDR_LEN];
+      unsigned char hwdest[DHCP_CHADDR_MAX];
       
       if (ntohs(mess->flags) & 0x8000)
 	{
-	  memset(hwdest, 255,  ETHER_ADDR_LEN);
+	  memset(hwdest, 255,  mess->hlen);
 	  rawpacket->ip.ip_dst.s_addr = INADDR_BROADCAST;
 	}
       else
 	{
-	  memcpy(hwdest, mess->chaddr, ETHER_ADDR_LEN); 
+	  memcpy(hwdest, mess->chaddr, mess->hlen); 
 	  rawpacket->ip.ip_dst.s_addr = mess->yiaddr.s_addr;
 	}
       
@@ -322,7 +323,8 @@
       
       rawpacket->udp.uh_sport = htons(DHCP_SERVER_PORT);
       rawpacket->udp.uh_dport = htons(DHCP_CLIENT_PORT);
-      ((u8 *)&rawpacket->data)[newlen] = 0; /* for checksum, in case length is odd. */
+      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);
@@ -338,26 +340,43 @@
 #ifdef HAVE_BPF
 	struct ether_header header;
 	
-	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());
+	/* 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);
+	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());
+	  }
 #else
-	struct sockaddr_ll dest;
+	/* 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 =  ETHER_ADDR_LEN;
+	dest.sll_halen =  mess->hlen;
 	dest.sll_ifindex = iface_index;
 	dest.sll_protocol = htons(ETHERTYPE_IP);
-	memcpy(dest.sll_addr, hwdest, ETHER_ADDR_LEN); 
+	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());
@@ -493,12 +512,13 @@
   return NULL;
 }
 
-/* Is every member of check matched by a member of pool? */
-int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool)
+/* Is every member of check matched by a member of pool? 
+   If negonly, match unless there's a negative tag which matches. */
+int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int negonly)
 {
   struct dhcp_netid *tmp1;
   
-  if (!check)
+  if (!check && !negonly)
     return 0;
 
   for (; check; check = check->next)
@@ -508,7 +528,7 @@
 	  for (tmp1 = pool; tmp1; tmp1 = tmp1->next)
 	    if (strcmp(check->net, tmp1->net) == 0)
 	      break;
-	  if (!tmp1)
+	  if (!tmp1 || negonly)
 	    return 0;
 	}
       else
@@ -520,97 +540,91 @@
 }
 
 int address_allocate(struct dhcp_context *context, struct daemon *daemon,
-		     struct in_addr *addrp, unsigned char *hwaddr, 
+		     struct in_addr *addrp, unsigned char *hwaddr, int hw_len, 
 		     struct dhcp_netid *netids, time_t now)   
 {
   /* Find a free address: exclude anything in use and anything allocated to
      a particular hwaddr/clientid/hostname in our configuration.
-     Try to return from contexts which mathc netis first. */
+     Try to return from contexts which match netids first. */
 
   struct in_addr start, addr ;
   struct dhcp_context *c;
-  unsigned int i, j;
-  
-  for (c = context; c; c = c->current)
-    if (c->flags & CONTEXT_STATIC)
-      continue;
-    else if (netids && !(c->flags & CONTEXT_FILTER))
-      continue;
-    else if (!netids && (c->flags & CONTEXT_FILTER))
-      continue;
-    else if (netids && (c->flags & CONTEXT_FILTER) && !match_netid(&c->netid, netids))
-      continue;
-    else
-      {
-	/* pick a seed based on hwaddr then iterate until we find a free address. */
-	for (j = c->addr_epoch, i = 0; i < ETHER_ADDR_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))));
-	
-	do {
-	  if (!lease_find_by_addr(addr) && 
-	      !config_find_by_address(daemon->dhcp_conf, addr))
-	    {
-	      struct ping_result *r, *victim = NULL;
-	      int count;
+  int i, pass;
+  unsigned int j; 
 
-	      /* check if we failed to ping addr sometime in the last
-		 30s. 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. */
-	      for (count = 0, r = daemon->ping_results; r; r = r->next)
-		if (difftime(now, r->time) > 30.0)
-		  victim = r; /* old record */
-		else if (++count == 6 || r->addr.s_addr == addr.s_addr)
+  for (pass = 0; pass <= 1; pass++)
+    for (c = context; c; c = c->current)
+      if (c->flags & CONTEXT_STATIC)
+	continue;
+      else if (!match_netid(c->filter, netids, pass))
+	continue;
+      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))));
+	  
+	  do {
+	    if (!lease_find_by_addr(addr) && 
+		!config_find_by_address(daemon->dhcp_conf, addr))
+	      {
+		struct ping_result *r, *victim = NULL;
+		int count;
+		
+		/* check if we failed to ping addr sometime in the last
+		   30s. 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. */
+		for (count = 0, r = daemon->ping_results; r; r = r->next)
+		  if (difftime(now, r->time) > 30.0)
+		    victim = r; /* old record */
+		  else if (++count == 6 || r->addr.s_addr == addr.s_addr)
+		    {
+		      *addrp = addr;
+		      return 1;
+		    }
+		
+		if (icmp_ping(daemon, addr))
+		  /* address in use: perturb address selection so that we are
+		     less likely to try this address again. */
+		  c->addr_epoch++;
+		else
 		  {
+		    /* at this point victim may hold an expired record */
+		    if (!victim)
+		      {
+			if ((victim = malloc(sizeof(struct ping_result))))
+			  {
+			    victim->next = daemon->ping_results;
+			    daemon->ping_results = victim;
+			  }
+		      }
+		    
+		    /* record that this address is OK for 30s 
+		       without more ping checks */
+		    if (victim)
+		      {
+			victim->addr = addr;
+			victim->time = now;
+		      }
 		    *addrp = addr;
 		    return 1;
 		  }
-	      
-	      if (icmp_ping(daemon, addr))
-		/* address in use: perturb address selection so that we are
-		   less likely to try this address again. */
-		c->addr_epoch++;
-	      else
-		{
-		  /* at this point victim may hold an expired record */
-		  if (!victim)
-		    {
-		      if ((victim = malloc(sizeof(struct ping_result))))
-			{
-			  victim->next = daemon->ping_results;
-			  daemon->ping_results = victim;
-			}
-		    }
-		  
-		  /* record that this address is OK for 30s 
-		     without more ping checks */
-		  if (victim)
-		    {
-		      victim->addr = addr;
-		      victim->time = now;
-		    }
-		  *addrp = addr;
-		  return 1;
-		}
-	    }
+	      }
 
-	  addr.s_addr = htonl(ntohl(addr.s_addr) + 1);
-	  
-	  if (addr.s_addr == htonl(ntohl(c->end.s_addr) + 1))
-	    addr = c->start;
-	  
-	} while (addr.s_addr != start.s_addr);
-      }
-
-  if (netids)
-    return address_allocate(context, daemon, addrp, hwaddr, NULL, now);
-
+	    addr.s_addr = htonl(ntohl(addr.s_addr) + 1);
+	    
+	    if (addr.s_addr == htonl(ntohl(c->end.s_addr) + 1))
+	      addr = c->start;
+	    
+	  } while (addr.s_addr != start.s_addr);
+	}
   return 0;
 }
 
@@ -631,7 +645,8 @@
 struct dhcp_config *find_config(struct dhcp_config *configs,
 				struct dhcp_context *context,
 				unsigned char *clid, int clid_len,
-				unsigned char *hwaddr, char *hostname)
+				unsigned char *hwaddr, int hw_len, 
+				int hw_type, char *hostname)
 {
   struct dhcp_config *config; 
   
@@ -653,15 +668,16 @@
 	}
   
 
-  if (hwaddr)
-    for (config = configs; config; config = config->next)
-      if ((config->flags & CONFIG_HWADDR) &&
-	  config->wildcard_mask == 0 &&
-	  memcmp(config->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0 &&
-	  is_addr_in_context(context, config))
-	return config;
+  for (config = configs; config; config = config->next)
+    if ((config->flags & CONFIG_HWADDR) &&
+	config->wildcard_mask == 0 &&
+	config->hwaddr_len == hw_len &&
+	(config->hwaddr_type == hw_type || config->hwaddr_type == 0) &&
+	memcmp(config->hwaddr, hwaddr, hw_len) == 0 &&
+	is_addr_in_context(context, config))
+      return config;
   
-  
+
   if (hostname && context)
     for (config = configs; config; config = config->next)
       if ((config->flags & CONFIG_NAME) && 
@@ -669,20 +685,21 @@
 	  is_addr_in_context(context, config))
 	return config;
   
-  if (hwaddr)
-    for (config = configs; config; config = config->next)
-      if ((config->flags & CONFIG_HWADDR) &&
-	  config->wildcard_mask != 0 &&
-	  is_addr_in_context(context, config))
-	{
-	  int i;
-	  unsigned int mask = config->wildcard_mask;
-	  for (i = ETHER_ADDR_LEN - 1; i >= 0; i--, mask = mask >> 1)
-	    if (mask & 1)
-	      config->hwaddr[i] = hwaddr[i];
-	  if (memcmp(config->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0)
-	    return config;
-	}
+  for (config = configs; config; config = config->next)
+    if ((config->flags & CONFIG_HWADDR) &&
+	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)
+	  return config;
+      }
   
   return NULL;
 }
@@ -719,7 +736,7 @@
       for (ip = buff; *ip && !isspace(*ip); ip++);
       for(; *ip && isspace(*ip); ip++)
 	*ip = 0;
-      if (!*ip || parse_hex(buff, hwaddr, 6, NULL) != 6)
+      if (!*ip || parse_hex(buff, hwaddr, ETHER_ADDR_LEN, NULL, NULL) != ETHER_ADDR_LEN)
 	{
 	  syslog(LOG_ERR, _("bad line at %s line %d"), ETHERSFILE, lineno); 
 	  continue;
@@ -764,6 +781,8 @@
 	  for (config = configs; config; config = config->next)
 	    if ((config->flags & CONFIG_HWADDR) && 
 		config->wildcard_mask == 0 &&
+		config->hwaddr_len == ETHER_ADDR_LEN &&
+		(config->hwaddr_type == ARPHRD_ETHER || config->hwaddr_type == 0) &&
 		memcmp(config->hwaddr, hwaddr, ETHER_ADDR_LEN) == 0)
 	      break;
 	  
@@ -793,7 +812,8 @@
       
       config->flags |= CONFIG_HWADDR | CONFIG_NOCLID;
       memcpy(config->hwaddr, hwaddr, ETHER_ADDR_LEN);
-
+      config->hwaddr_len = ETHER_ADDR_LEN;
+      config->hwaddr_type = ARPHRD_ETHER;
       count++;
     }
   
diff --git a/src/dnsmasq.c b/src/dnsmasq.c
index 0133fb3..ee94d19 100644
--- a/src/dnsmasq.c
+++ b/src/dnsmasq.c
@@ -1,4 +1,4 @@
-/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
+/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -176,8 +176,7 @@
 	die(_("DBus error: %s"), err);
     }
 #else
-  if (daemon->options & OPT_DBUS)
-    die(_("DBus not available: set HAVE_DBUS in src/config.h"), NULL);
+  die(_("DBus not available: set HAVE_DBUS in src/config.h"), NULL);
 #endif
   
   /* If query_port is set then create a socket now, before dumping root
@@ -256,7 +255,7 @@
 #endif
 	  
 	  if (daemon->dhcp && 
-	      (i == daemon->lease_fd || 
+	      (i == fileno(daemon->lease_stream) || 
 	       i == daemon->dhcpfd || 
 	       i == daemon->dhcp_raw_fd ||
 	       i == daemon->dhcp_icmp_fd))
@@ -314,14 +313,14 @@
       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;
-
-#ifdef HAVE_RTNETLINK
-      /* Must do this after daemonizing so that the pid is right */
-      daemon->netlinkfd =  netlink_init();
-#endif
       
       for (dhcp_tmp = daemon->dhcp; dhcp_tmp; dhcp_tmp = dhcp_tmp->next)
 	{
@@ -375,7 +374,7 @@
 	{
 	  if (daemon->dhcp)
 	    {
-	      lease_update_file(1, now);
+	      lease_update_file(daemon, 1, now);
 #ifdef HAVE_BROKEN_RTC
 	      alarm(daemon->min_leasetime);
 #endif
@@ -400,6 +399,15 @@
 		maxfd = daemon->dhcpfd;
 	    }
 
+#ifdef HAVE_RTNETLINK
+	  if (daemon->netlinkfd != -1)
+	    {
+	      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
 	  {
@@ -497,6 +505,11 @@
 		}
 	    }
 	}
+
+#ifdef HAVE_RTNETLINK
+      if (daemon->netlinkfd != -1 && FD_ISSET(daemon->netlinkfd, &rset))
+	netlink_multicast(daemon);
+#endif
       
 #ifdef HAVE_DBUS
       /* if we didn't create a DBus connection, retry now. */ 
@@ -522,9 +535,9 @@
   if (daemon->dhcp)
     { 
 #ifdef HAVE_BROKEN_RTC
-      lease_update_file(1, now);
+      lease_update_file(daemon, 1, now);
 #endif
-      close(daemon->lease_fd);
+      fclose(daemon->lease_stream);
     }
   
   return 0;
@@ -565,7 +578,7 @@
 	dhcp_read_ethers(daemon);
       dhcp_update_configs(daemon->dhcp_conf);
       lease_update_from_configs(daemon); 
-      lease_update_file(0, now); 
+      lease_update_file(daemon, 0, now); 
       lease_update_dns(daemon);
     }
 }
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index 49522c1..8f3b59e 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -92,13 +92,8 @@
    memory for the largest packet, and the largest record so the
    min for DNS is PACKETSZ+MAXDNAME+RRFIXEDSZ which is < 1000.
    This might be increased is EDNS packet size if greater than the minimum.
-   The buffer is also used for NETLINK, which needs to be about 2000
-   on systems with many interfaces/addresses. */
-#ifdef HAVE_RTNETLINK
-# define DNSMASQ_PACKETSZ PACKETSZ+MAXDNAME+RRFIXEDSZ
-#else
-# define DNSMASQ_PACKETSZ 2000
-#endif
+*/
+#define DNSMASQ_PACKETSZ PACKETSZ+MAXDNAME+RRFIXEDSZ
 
 #define OPT_BOGUSPRIV      1
 #define OPT_FILTER         2
@@ -197,7 +192,7 @@
 #define F_NOERR     32768
 
 /* struct sockaddr is not large enough to hold any address,
-   and specifically not big enough to hold and IPv6 address.
+   and specifically not big enough to hold an IPv6 address.
    Blech. Roll our own. */
 union mysockaddr {
   struct sockaddr sa;
@@ -278,7 +273,7 @@
 struct hostsfile {
   struct hostsfile *next;
   char *fname;
-  int index; /* matches to cache entries fro logging */
+  int index; /* matches to cache entries for logging */
 };
 
 struct frec {
@@ -293,13 +288,16 @@
   struct frec *next;
 };
 
+#define DHCP_CHADDR_MAX 16
+
 struct dhcp_lease {
   int clid_len;          /* length of client identifier */
   unsigned char *clid;   /* clientid */
   char *hostname, *fqdn; /* name from client-hostname option or config */
   int auth_name;         /* hostname came from config, not from client */
   time_t expires;        /* lease expiry */
-  unsigned char hwaddr[ETHER_ADDR_LEN]; 
+  int hwaddr_len, hwaddr_type;
+  unsigned char hwaddr[DHCP_CHADDR_MAX]; 
   struct in_addr addr;
   struct dhcp_lease *next;
 };
@@ -317,7 +315,8 @@
   unsigned int flags;
   int clid_len;          /* length of client identifier */
   unsigned char *clid;   /* clientid */
-  unsigned char hwaddr[ETHER_ADDR_LEN]; 
+  int hwaddr_len, hwaddr_type;
+  unsigned char hwaddr[DHCP_CHADDR_MAX]; 
   char *hostname;
   struct dhcp_netid netid;
   struct in_addr addr;
@@ -335,12 +334,15 @@
 #define CONFIG_NOCLID          128
 
 struct dhcp_opt {
-  int opt, len, is_addr;
+  int opt, len, flags;
   unsigned char *val, *vendor_class;
   struct dhcp_netid *netid;
   struct dhcp_opt *next;
 };
 
+#define DHOPT_ADDR               1
+#define DHOPT_STRING             2
+
 struct dhcp_boot {
   char *file, *sname;
   struct in_addr next_server;
@@ -355,20 +357,27 @@
   struct dhcp_vendor *next;
 };
 
+struct dhcp_mac {
+  unsigned int mask;
+  int hwaddr_len, hwaddr_type;
+  unsigned char hwaddr[DHCP_CHADDR_MAX];
+  struct dhcp_netid netid;
+  struct dhcp_mac *next;
+};
+
 struct dhcp_context {
   unsigned int lease_time, addr_epoch;
   struct in_addr netmask, broadcast;
   struct in_addr local, router;
   struct in_addr start, end; /* range of available addresses */
   int flags;
-  struct dhcp_netid netid;
+  struct dhcp_netid netid, *filter;
   struct dhcp_context *next, *current;
 };
 
 #define CONTEXT_STATIC    1
-#define CONTEXT_FILTER    2
-#define CONTEXT_NETMASK   4
-#define CONTEXT_BRDCAST   8
+#define CONTEXT_NETMASK   2
+#define CONTEXT_BRDCAST   4
 
 
 typedef unsigned char u8;
@@ -389,7 +398,7 @@
 	  u32 xid;
 	  u16 secs, flags;
 	  struct in_addr ciaddr, yiaddr, siaddr, giaddr;
-	  u8 chaddr[16], sname[64], file[128];
+	  u8 chaddr[DHCP_CHADDR_MAX], sname[64], file[128];
 	  u8 options[312];
 	} data;
 };
@@ -425,6 +434,7 @@
   struct dhcp_config *dhcp_conf;
   struct dhcp_opt *dhcp_opts, *vendor_opts;
   struct dhcp_vendor *dhcp_vendors;
+  struct dhcp_mac *dhcp_macs;
   struct dhcp_boot *boot_config;
   struct dhcp_netid_list *dhcp_ignore;
   int dhcp_max; 
@@ -440,16 +450,19 @@
   struct irec *interfaces;
   struct listener *listeners;
   struct server *last_server;
+  struct server *srv_save; /* Used for resend on DoD */
+  size_t packet_len;       /*      "        "        */
   int uptime_fd;
   
   /* DHCP state */
-  int dhcpfd, dhcp_raw_fd, dhcp_icmp_fd, lease_fd;
+  int dhcpfd, dhcp_raw_fd, dhcp_icmp_fd;
 #ifdef HAVE_RTNETLINK
   int netlinkfd;
 #endif
   struct udp_dhcp_packet *dhcp_packet;
   char *dhcp_buff, *dhcp_buff2;
   struct ping_result *ping_results;
+  FILE *lease_stream;
 
   /* DBus stuff */
 #ifdef HAVE_DBUS
@@ -480,23 +493,23 @@
 char *cache_get_name(struct crec *crecp);
 
 /* rfc1035.c */
-unsigned short extract_request(HEADER *header, unsigned int qlen, 
+unsigned short extract_request(HEADER *header, size_t qlen, 
 			       char *name, unsigned short *typep);
-int setup_reply(HEADER *header, unsigned int qlen,
-		struct all_addr *addrp, unsigned short flags,
-		unsigned long local_ttl);
-void extract_addresses(HEADER *header, unsigned int qlen, char *namebuff, 
+size_t setup_reply(HEADER *header, size_t  qlen,
+		   struct all_addr *addrp, unsigned short flags,
+		   unsigned long local_ttl);
+void extract_addresses(HEADER *header, size_t qlen, char *namebuff, 
 		       time_t now, struct daemon *daemon);
-int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon *daemon, 
+size_t answer_request(HEADER *header, char *limit, size_t qlen, struct daemon *daemon, 
 		   struct in_addr local_addr, struct in_addr local_netmask, time_t now);
-int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name, 
+int check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name, 
 			     struct bogus_addr *addr, time_t now);
-unsigned char *find_pseudoheader(HEADER *header, unsigned int plen,
-				 unsigned int *len, unsigned char **p);
+unsigned char *find_pseudoheader(HEADER *header, size_t plen,
+				 size_t *len, unsigned char **p);
 int check_for_local_domain(char *name, time_t now, struct daemon *daemon);
-unsigned int questions_crc(HEADER *header, unsigned int plen, char *buff);
-int resize_packet(HEADER *header, unsigned int plen, 
-		  unsigned char *pheader, unsigned int hlen);
+unsigned int questions_crc(HEADER *header, size_t plen, char *buff);
+size_t resize_packet(HEADER *header, size_t plen, 
+		  unsigned char *pheader, size_t hlen);
 
 /* util.c */
 unsigned short rand16(void);
@@ -515,7 +528,7 @@
 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);
+	      unsigned int *wildcard_mask, int *mac_type);
 
 /* option.c */
 struct daemon *read_opts (int argc, char **argv, char *compile_opts);
@@ -542,14 +555,15 @@
 
 struct dhcp_context *address_available(struct dhcp_context *context, struct in_addr addr);
 struct dhcp_context *narrow_context(struct dhcp_context *context, struct in_addr taddr);
-int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool);
+int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int negonly);
 int address_allocate(struct dhcp_context *context, struct daemon *daemon,
-		     struct in_addr *addrp, unsigned char *hwaddr,
+		     struct in_addr *addrp, unsigned char *hwaddr, int hw_len,
 		     struct dhcp_netid *netids, time_t now);
 struct dhcp_config *find_config(struct dhcp_config *configs,
 				struct dhcp_context *context,
 				unsigned char *clid, int clid_len,
-				unsigned char *hwaddr, char *hostname);
+				unsigned char *hwaddr, int hw_len, 
+				int hw_type, char *hostname);
 void dhcp_update_configs(struct dhcp_config *configs);
 void dhcp_read_ethers(struct daemon *daemon);
 struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr);
@@ -561,24 +575,24 @@
 				      struct in_addr primary);
 
 /* lease.c */
-void lease_update_file(int force, time_t now);
+void lease_update_file(struct daemon *daemon, int force, time_t now);
 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,
-				  int clid_len, struct in_addr addr);
+				  int hw_len, int hw_type, int clid_len, struct in_addr addr);
 int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
-		      unsigned char *clid, int clid_len);
+		      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);
-struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr,
+struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,  
 					unsigned char *clid, int clid_len);
 struct dhcp_lease *lease_find_by_addr(struct in_addr addr);
 void lease_prune(struct dhcp_lease *target, time_t now);
 void lease_update_from_configs(struct daemon *daemon);
 
 /* rfc2131.c */
-int dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *iface_name, unsigned int sz, time_t now, int unicast_dest);
+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 icmp_ping(struct daemon *daemon, struct in_addr addr);
@@ -591,10 +605,11 @@
 
 /* netlink.c */
 #ifdef HAVE_RTNETLINK
-int netlink_init(void);
+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);
+void netlink_multicast(struct daemon *daemon);
 #endif
 
 /* dbus.c */
diff --git a/src/forward.c b/src/forward.c
index 064f5f9..1e569f9 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -36,7 +36,7 @@
 
 /* Send a UDP packet with it's source address set as "source" 
    unless nowild is true, when we just send it with the kernel default */
-static void send_from(int fd, int nowild, char *packet, int len, 
+static void send_from(int fd, int nowild, char *packet, size_t len, 
 		      union mysockaddr *to, struct all_addr *source,
 		      unsigned int iface)
 {
@@ -164,7 +164,7 @@
 	if (namelen >= domainlen &&
 	    hostname_isequal(matchstart, serv->domain) &&
 	    domainlen >= matchlen &&
-	    (namelen == domainlen || *(serv->domain) == '.' || *(matchstart-1) == '.' ))
+	    (domainlen == 0 || namelen == domainlen || *(serv->domain) == '.' || *(matchstart-1) == '.' ))
 	  {
 	    unsigned short sflag = serv->addr.sa.sa_family == AF_INET ? F_IPV4 : F_IPV6;
 	    *type = SERV_HAS_DOMAIN;
@@ -212,14 +212,14 @@
 /* returns new last_server */	
 static void forward_query(struct daemon *daemon, int udpfd, union mysockaddr *udpaddr,
 			  struct all_addr *dst_addr, unsigned int dst_iface,
-			  HEADER *header, int plen, time_t now, struct frec *forward)
+			  HEADER *header, size_t plen, time_t now, struct frec *forward)
 {
   char *domain = NULL;
   int type = 0;
   struct all_addr *addrp = NULL;
-  unsigned int crc = questions_crc(header, (unsigned int)plen, daemon->namebuff);
+  unsigned int crc = questions_crc(header, plen, daemon->namebuff);
   unsigned short flags = 0;
-  unsigned short gotname = extract_request(header, (unsigned int)plen, daemon->namebuff, NULL);
+  unsigned short gotname = extract_request(header, plen, daemon->namebuff, NULL);
   struct server *start = NULL;
     
   /* may be no servers available. */
@@ -302,6 +302,10 @@
 		}
 	      else
 		{
+		  /* Keep info in case we want to re-send this packet */
+		  daemon->srv_save = start;
+		  daemon->packet_len = plen;
+		  
 		  if (!gotname)
 		    strcpy(daemon->namebuff, "query");
 		  if (start->addr.sa.sa_family == AF_INET)
@@ -340,19 +344,20 @@
   /* could not send on, return empty answer or address if known for whole domain */
   if (udpfd != -1)
     {
-      plen = setup_reply(header, (unsigned int)plen, addrp, flags, daemon->local_ttl);
+      plen = setup_reply(header, plen, addrp, flags, daemon->local_ttl);
       send_from(udpfd, daemon->options & OPT_NOWILD, (char *)header, plen, udpaddr, dst_addr, dst_iface);
     }
 
   return;
 }
 
-static int process_reply(struct daemon *daemon, HEADER *header, time_t now, 
-			 unsigned int query_crc, struct server *server, unsigned int n)
+static size_t process_reply(struct daemon *daemon, HEADER *header, time_t now, 
+			 unsigned int query_crc, struct server *server, size_t n)
 {
   unsigned char *pheader, *sizep;
-  unsigned int plen, munged = 0;
-   
+  int munged = 0;
+  size_t plen; 
+
   /* If upstream is advertising a larger UDP packet size
 	 than we allow, trim it so that we don't get overlarge
 	 requests for the client. */
@@ -433,8 +438,12 @@
   HEADER *header;
   union mysockaddr serveraddr;
   socklen_t addrlen = sizeof(serveraddr);
-  int n = recvfrom(sfd->fd, daemon->packet, daemon->edns_pktsz, 0, &serveraddr.sa, &addrlen);
-  
+  ssize_t n = recvfrom(sfd->fd, daemon->packet, daemon->edns_pktsz, 0, &serveraddr.sa, &addrlen);
+  size_t nn;
+
+  /* packet buffer overwritten */
+  daemon->srv_save = NULL;
+
   /* Determine the address of the server replying  so that we can mark that as good */
   serveraddr.sa.sa_family = sfd->source_addr.sa.sa_family;
 #ifdef HAVE_IPV6
@@ -453,14 +462,14 @@
 	 /* for broken servers, attempt to send to another one. */
 	 {
 	   unsigned char *pheader;
-	   unsigned int plen;
-	   int nn;
+	   size_t plen;
+	   
 	   /* recreate query from reply */
-	   pheader = find_pseudoheader(header, n, &plen, NULL);
+	   pheader = find_pseudoheader(header, (size_t)n, &plen, NULL);
 	   header->ancount = htons(0);
 	   header->nscount = htons(0);
 	   header->arcount = htons(0);
-	   if ((nn = resize_packet(header, n, pheader, plen)))
+	   if ((nn = resize_packet(header, (size_t)n, pheader, plen)))
 	     {
 	       forward->forwardall = 1;
 	       header->qr = 0;
@@ -496,11 +505,11 @@
       if (forward->forwardall == 0 || --forward->forwardall == 1 || 
 	  (header->rcode != REFUSED && header->rcode != SERVFAIL))
 	{
-	  if ((n = process_reply(daemon, header, now, forward->crc, server, (unsigned int)n)))
+	  if ((nn = process_reply(daemon, header, now, forward->crc, server, (size_t)n)))
 	    {
 	      header->id = htons(forward->orig_id);
 	      header->ra = 1; /* recursion if available */
-	      send_from(forward->fd, daemon->options & OPT_NOWILD, daemon->packet, n, 
+	      send_from(forward->fd, daemon->options & OPT_NOWILD, daemon->packet, nn, 
 			&forward->source, &forward->dest, forward->iface);
 	    }
 	  forward->new_id = 0; /* cancel */
@@ -516,7 +525,9 @@
   struct iname *tmp;
   struct all_addr dst_addr;
   struct in_addr netmask, dst_addr_4;
-  int m, n, if_index = 0;
+  size_t m;
+  ssize_t n;
+  int if_index = 0;
   struct iovec iov[1];
   struct msghdr msg;
   struct cmsghdr *cmptr;
@@ -533,6 +544,9 @@
 #endif
   } control_u;
   
+  /* packet buffer overwritten */
+  daemon->srv_save = NULL;
+  
   if (listen->family == AF_INET && (daemon->options & OPT_NOWILD))
     {
       dst_addr_4 = listen->iface->addr.in.sin_addr;
@@ -658,7 +672,7 @@
 	}
     }
   
-  if (extract_request(header, (unsigned int)n, daemon->namebuff, &type))
+  if (extract_request(header, (size_t)n, daemon->namebuff, &type))
     {
       if (listen->family == AF_INET) 
 	log_query(F_QUERY | F_IPV4 | F_FORWARD, daemon->namebuff, 
@@ -670,18 +684,18 @@
 #endif
     }
 
-  m = answer_request (header, ((char *) header) + PACKETSZ, (unsigned int)n, daemon, 
+  m = answer_request (header, ((char *) header) + PACKETSZ, (size_t)n, daemon, 
 		      dst_addr_4, netmask, now);
   if (m >= 1)
     send_from(listen->fd, daemon->options & OPT_NOWILD, (char *)header, m, &source_addr, &dst_addr, if_index);
   else
     forward_query(daemon, listen->fd, &source_addr, &dst_addr, if_index,
-		  header, n, now, NULL);
+		  header, (size_t)n, now, NULL);
 }
 
 static int read_write(int fd, unsigned char *packet, int size, int rw)
 {
-  int n, done;
+  ssize_t n, done;
   
   for (done = 0; done < size; done += n)
     {
@@ -711,7 +725,8 @@
 unsigned char *tcp_request(struct daemon *daemon, int confd, time_t now,
 			   struct in_addr local_addr, struct in_addr netmask)
 {
-  int size = 0, m;
+  int size = 0;
+  size_t m;
   unsigned short qtype, gotname;
   unsigned char c1, c2;
   /* Max TCP packet + slop */
diff --git a/src/lease.c b/src/lease.c
index 577ad72..dafce86 100644
--- a/src/lease.c
+++ b/src/lease.c
@@ -1,4 +1,4 @@
-/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
+/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -15,9 +15,8 @@
 #include "dnsmasq.h"
 
 static struct dhcp_lease *leases;
-static FILE *lease_file;
 static int dns_dirty;
-enum { no, yes, force } file_dirty;
+static enum { no, yes, force } file_dirty;
 static int leases_left;
 
 void lease_init(struct daemon *daemon, time_t now)
@@ -25,25 +24,25 @@
   unsigned int a0, a1, a2, a3;
   unsigned long ei;
   time_t expires;
-  unsigned char hwaddr[ETHER_ADDR_LEN];
+  unsigned char hwaddr[DHCP_CHADDR_MAX];
   struct in_addr addr;
   struct dhcp_lease *lease;
-  int clid_len = 0;
+  int clid_len = 0, hw_len, hw_type;
   int has_old = 0;
 
   leases = NULL;
   leases_left = daemon->dhcp_max;
 
   /* NOTE: need a+ mode to create file if it doesn't exist */
-  if (!(lease_file = fopen(daemon->lease_file, "a+")))
+  if (!(daemon->lease_stream = fopen(daemon->lease_file, "a+")))
     die(_("cannot open or create leases file: %s"), NULL);
     
   /* a+ mode lease pointer at end. */
-  rewind(lease_file);
+  rewind(daemon->lease_stream);
 
   /* client-id max length is 255 which is 255*2 digits + 254 colons 
      borrow DNS packet buffer which is always larger than 1000 bytes */
-  while (fscanf(lease_file, "%lu %40s %d.%d.%d.%d %255s %764s",
+  while (fscanf(daemon->lease_stream, "%lu %255s %d.%d.%d.%d %255s %764s",
 		&ei, daemon->dhcp_buff2, &a0, &a1, &a2, &a3, 
 		daemon->dhcp_buff, daemon->packet) == 8)
     {
@@ -64,16 +63,20 @@
 	}
 #endif
 
-      parse_hex(daemon->dhcp_buff2, hwaddr, ETHER_ADDR_LEN, NULL);
+      hw_len = parse_hex(daemon->dhcp_buff2, hwaddr, DHCP_CHADDR_MAX, NULL, &hw_type);
+      /* For backwards compatibility, no explict MAC address type means ether. */
+      if (hw_type == 0)
+	hw_type = ARPHRD_ETHER;
+
       addr.s_addr = htonl((a0<<24) + (a1<<16) + (a2<<8) + a3);
 
       /* decode hex in place */
       if (strcmp(daemon->packet, "*") == 0)
 	clid_len = 0;
       else
-	clid_len = parse_hex(daemon->packet, (unsigned char *)daemon->packet, 255, NULL);
+	clid_len = parse_hex(daemon->packet, (unsigned char *)daemon->packet, 255, NULL, NULL);
       
-      if (!(lease = lease_allocate(hwaddr, (unsigned char *)daemon->packet, clid_len, addr)))
+      if (!(lease = lease_allocate(hwaddr, (unsigned char *)daemon->packet, hw_len, hw_type, clid_len, addr)))
 	die (_("too many stored leases"), NULL);
       
       lease->expires = expires;
@@ -84,8 +87,6 @@
   
   dns_dirty = 1;
   file_dirty = has_old ? yes: no;
-
-  daemon->lease_fd = fileno(lease_file);
 }
 
 void lease_update_from_configs(struct daemon *daemon)
@@ -97,7 +98,8 @@
   char *name;
 
   for (lease = leases; lease; lease = lease->next)
-    if ((config = find_config(daemon->dhcp_conf, NULL, lease->clid, lease->clid_len, lease->hwaddr, NULL)) && 
+    if ((config = find_config(daemon->dhcp_conf, NULL, lease->clid, lease->clid_len, 
+			      lease->hwaddr, lease->hwaddr_len, lease->hwaddr_type, NULL)) && 
 	(config->flags & CONFIG_NAME) &&
 	(!(config->flags & CONFIG_ADDR) || config->addr.s_addr == lease->addr.s_addr))
       lease_set_hostname(lease, config->hostname, daemon->domain_suffix, 1);
@@ -105,11 +107,12 @@
       lease_set_hostname(lease, name, daemon->domain_suffix, 1); /* updates auth flag only */
 }
 
-void lease_update_file(int always, time_t now)
+void lease_update_file(struct daemon *daemon, int always, time_t now)
 {
   struct dhcp_lease *lease;
   int i = always; /* avoid warning */
   unsigned long expires;
+  char *mess;
 
 #ifdef HAVE_BROKEN_RTC
   if (always || file_dirty == force)
@@ -119,8 +122,10 @@
   if (file_dirty != no)
     {
 #endif
-      rewind(lease_file);
-      ftruncate(fileno(lease_file), 0);
+      errno = 0;
+      rewind(daemon->lease_stream);
+      if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0)
+	goto write_err;
       
       for (lease = leases; lease; lease = lease->next)
 	{
@@ -133,27 +138,51 @@
 	  expires = now; /* eliminate warning */
 	  expires = (unsigned long)lease->expires;
 #endif
-	  fprintf(lease_file, "%lu %.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %s ", 
-		  expires, lease->hwaddr[0], lease->hwaddr[1],
-		  lease->hwaddr[2], lease->hwaddr[3], lease->hwaddr[4],
-		  lease->hwaddr[5], inet_ntoa(lease->addr),
-		  lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : "*");
+	  if (fprintf(daemon->lease_stream, "%lu ", expires) < 0)
+	    goto write_err;
+	  if (lease->hwaddr_type != ARPHRD_ETHER && 
+	      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;
+	  if (fprintf(daemon->lease_stream, "%.2x", lease->hwaddr[i]) < 0)
+	    goto write_err;
+	  if (fprintf(daemon->lease_stream, " %s %s ", inet_ntoa(lease->addr),
+		      lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : "*") < 0)
+	    goto write_err;
 	  
 	  if (lease->clid && lease->clid_len != 0)
 	    {
 	      for (i = 0; i < lease->clid_len - 1; i++)
-		fprintf(lease_file, "%.2x:", lease->clid[i]);
-	      fprintf(lease_file, "%.2x\n", lease->clid[i]);
+		if (fprintf(daemon->lease_stream, "%.2x:", lease->clid[i]) < 0)
+		  goto write_err;
+	      if (fprintf(daemon->lease_stream, "%.2x\n", lease->clid[i]) < 0)
+		goto write_err;
 	    }
 	  else
-	    fprintf(lease_file, "*\n");
+	    if (fprintf(daemon->lease_stream, "*\n") < 0)
+	      goto write_err;
 	  
 	}
 
-      fflush(lease_file);
-      fsync(fileno(lease_file));
+      if (fflush(daemon->lease_stream) != 0)
+	goto write_err;
+      if (fsync(fileno(daemon->lease_stream)) < 0)
+	goto write_err;
       file_dirty = no;
     }
+  
+  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)
@@ -204,7 +233,7 @@
 } 
 	
   
-struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr,
+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;
@@ -217,7 +246,9 @@
   
   for (lease = leases; lease; lease = lease->next)	
     if ((!lease->clid || !clid) && 
-	memcmp(hwaddr, lease->hwaddr, ETHER_ADDR_LEN) == 0)
+	lease->hwaddr_len == hw_len &&
+	lease->hwaddr_type == hw_type &&
+	memcmp(hwaddr, lease->hwaddr, hw_len) == 0)
       return lease;
   
   return NULL;
@@ -236,7 +267,7 @@
 
 
 struct dhcp_lease *lease_allocate(unsigned char *hwaddr, unsigned char *clid, 
-				  int clid_len, struct in_addr addr)
+				  int hw_len, int hw_type, int clid_len, struct in_addr addr)
 {
   struct dhcp_lease *lease;
   if (!leases_left || !(lease = malloc(sizeof(struct dhcp_lease))))
@@ -245,10 +276,10 @@
   lease->clid = NULL;
   lease->hostname = lease->fqdn = NULL;  
   lease->addr = addr;
-  memset(lease->hwaddr, 0, ETHER_ADDR_LEN);
+  memset(lease->hwaddr, 0, DHCP_CHADDR_MAX);
   lease->expires = 1;
   
-  if (!lease_set_hwaddr(lease, hwaddr, clid, clid_len))
+  if (!lease_set_hwaddr(lease, hwaddr, clid, hw_len, hw_type, clid_len))
     {
       free(lease);
       return NULL;
@@ -274,12 +305,16 @@
 }
 
 int lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
-		      unsigned char *clid, int clid_len)
+		      unsigned char *clid, int hw_len, int hw_type, int clid_len)
 {
-  if (memcmp(lease->hwaddr, hwaddr, ETHER_ADDR_LEN) != 0)
+  if (hw_len != lease->hwaddr_len ||
+      hw_type != lease->hwaddr_type || 
+      memcmp(lease->hwaddr, hwaddr, hw_len) != 0)
     {
       file_dirty = force;
-      memcpy(lease->hwaddr, hwaddr, ETHER_ADDR_LEN);
+      memcpy(lease->hwaddr, hwaddr, hw_len);
+      lease->hwaddr_len = hw_len;
+      lease->hwaddr_type = hw_type;
     }
 
   /* only update clid when one is available, stops packets
diff --git a/src/netlink.c b/src/netlink.c
index 768a062..f3b7ca2 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -1,4 +1,4 @@
-/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
+/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -10,8 +10,6 @@
    GNU General Public License for more details.
 */
 
-/* Author's email: simon@thekelleys.org.uk */
-
 #include "dnsmasq.h"
 
 #ifdef HAVE_RTNETLINK
@@ -20,35 +18,74 @@
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 
-int netlink_init(void)
+static struct iovec iov[1];
+
+void netlink_init(struct daemon *daemon)
 {
   struct sockaddr_nl addr;
-  int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+  daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
   
-  if (sock < 0)
-    return -1; /* no kernel support */
+  if (daemon->netlinkfd < 0)
+    return; /* no kernel support */
 
   addr.nl_family = AF_NETLINK;
   addr.nl_pad = 0;
   addr.nl_pid = getpid();
-  addr.nl_groups = 0;
+#ifdef HAVE_IPV6
+  addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR | RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
+#else
+  addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
+#endif
   
-  if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
+  if (bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
     die(_("cannot bind netlink socket: %s"), NULL);
-  
-  return sock;
+
+  iov[0].iov_len = 200;
+  iov[0].iov_base = safe_malloc(iov[0].iov_len);
 }
 
+static ssize_t netlink_recv(struct daemon *daemon)
+{
+  struct msghdr msg;
+  ssize_t rc;
 
-/* We borrow the DNS packet buffer here. (The DHCP one already has a packet in it)
-   Since it's used only within this routine, that's fine, just remember 
-   that calling icmp_echo() will trash it */
+  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_iovlen = 1;
+    
+ retry:
+  while ((rc = recvmsg(daemon->netlinkfd, &msg, MSG_PEEK)) == -1 && retry_send());
+  
+  if (rc == -1)
+    return -1;
+
+  if (msg.msg_flags & MSG_TRUNC)
+    {
+      size_t newsz = iov[0].iov_len + 100;
+      void *new = realloc(iov[0].iov_base, newsz);
+      if (!new)
+	return -1;
+      iov[0].iov_len = newsz;
+      iov[0].iov_base = new;
+      goto retry;
+    }
+  
+  while ((rc = recvmsg(daemon->netlinkfd, &msg, 0)) == -1 && retry_send());
+  
+  return rc;
+}
+  
 int netlink_process(struct daemon *daemon, int index, struct in_addr relay, 
 		    struct in_addr primary, struct dhcp_context **retp)
 {
   struct sockaddr_nl addr;
   struct nlmsghdr *h;
-  int len, found_primary = 0;
+  int found_primary = 0;
+  ssize_t len;
   struct dhcp_context *ret = NULL;
   static unsigned int seq = 0;
 
@@ -88,17 +125,11 @@
     }
 
  get_next:
-  while((len = recvfrom(daemon->netlinkfd, daemon->packet, daemon->packet_buff_sz, 
-			MSG_WAITALL, NULL, 0)) == -1 && retry_send());
- 
-  if (len == -1)
+  if ((len = netlink_recv(daemon)) == -1)
     return 0;
   
-  h = (struct nlmsghdr *)daemon->packet;
-
-  while (NLMSG_OK(h, (unsigned int)len))
+  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;
 	
@@ -110,8 +141,7 @@
       
       if (h->nlmsg_type == RTM_NEWADDR)
 	{
-	  struct ifaddrmsg *ifa = NLMSG_DATA(h);
-	  
+	  struct ifaddrmsg *ifa = NLMSG_DATA(h);  
 	  if (ifa->ifa_index == index && ifa->ifa_family == AF_INET)
 	    {
 	      struct rtattr *rta = IFA_RTA(ifa);
@@ -140,15 +170,43 @@
 		}
 	    }
 	}
-
-      h = NLMSG_NEXT(h, len);
     }
 
   *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 (h->nlmsg_type == NLMSG_DONE || h->nlmsg_type == NLMSG_ERROR)
+	break;
+      
+      if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_NEWROUTE) 
+	{
+	  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;
+	}
+    }
+}
+
 #endif
 
       
diff --git a/src/network.c b/src/network.c
index 98e9721..1667a4c 100644
--- a/src/network.c
+++ b/src/network.c
@@ -503,7 +503,7 @@
   /* forward table rules reference servers, so have to blow them away */
   forward_init(0);
   
-  daemon->last_server = NULL;
+  daemon->last_server = daemon->srv_save = NULL;
   
   for (new = daemon->servers; new; new = tmp)
     {
diff --git a/src/option.c b/src/option.c
index cfc568f..f8f0cbe 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1,4 +1,4 @@
-/* dnsmasq is Copyright (c) 2000 - 2005 Simon Kelley
+/* dnsmasq is Copyright (c) 2000 - 2006 Simon Kelley
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
   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:"
+#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:"
 
 static const struct myoption opts[] = { 
   {"version", 0, 0, 'v'},
@@ -82,6 +82,7 @@
   {"txt-record", 1, 0, 'Y'},
   {"enable-dbus", 0, 0, '1'},
   {"bootp-dynamic", 0, 0, '3'},
+  {"dhcp-mac", 1, 0, '4'},
   {0, 0, 0, 0}
 };
 
@@ -177,6 +178,7 @@
   { "-1, --enable-dbus", gettext_noop("Enable the DBus interface for setting upstream servers, etc."), NULL },
   { "-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 },
   { NULL, NULL, NULL }
 }; 
 
@@ -949,6 +951,7 @@
 		new->broadcast.s_addr = 0;
 		new->router.s_addr = 0;
 		new->netid.net = NULL;
+		new->filter = NULL;
 		new->flags = 0;
 		
 		problem = _("bad dhcp-range");
@@ -959,26 +962,40 @@
 		    break;
 		  }
 		
-		for (cp = arg; *cp; cp++)
-		  if (!(*cp == ' ' || *cp == '.' ||  (*cp >='0' && *cp <= '9')))
-		    break;
-
-		if (*cp != ',' && (comma = strchr(arg, ',')))
+		while(1)
 		  {
-		    *comma = 0;
-		    if (strstr(arg, "net:") == arg)
+		    for (cp = arg; *cp; cp++)
+		      if (!(*cp == ' ' || *cp == '.' ||  (*cp >='0' && *cp <= '9')))
+			break;
+		    
+		    if (*cp != ',' && (comma = strchr(arg, ',')))
 		      {
-			new->netid.net = safe_string_alloc(arg+4);
-			new->netid.next = NULL;
-			new->flags |= CONTEXT_FILTER;
+			*comma = 0;
+			if (strstr(arg, "net:") == arg)
+			  {
+			    struct dhcp_netid *tt = safe_malloc(sizeof (struct dhcp_netid));
+			    tt->net = safe_string_alloc(arg+4);
+			    tt->next = new->filter;
+			    new->filter = tt;
+			  }
+			else
+			  {
+			    if (new->netid.net)
+			      {
+				option = '?';
+				problem = _("only one netid tag allowed");
+			      }
+			    else
+			      new->netid.net = safe_string_alloc(arg);
+			  }
+			arg = comma + 1;
 		      }
 		    else
-		      new->netid.net = safe_string_alloc(arg);
-		    a[0] = comma + 1;
+		      {
+			a[0] = arg;
+			break;
+		      }
 		  }
-		else
-		  a[0] = arg;
-
 		
 		for (k = 1; k < 5; k++)
 		  {
@@ -987,7 +1004,7 @@
 		    *(a[k]++) = 0;
 		  }
 		  
-		if ((k < 2) || ((new->start.s_addr = inet_addr(a[0])) == (in_addr_t)-1))
+		if (option == '?' || (k < 2) || ((new->start.s_addr = inet_addr(a[0])) == (in_addr_t)-1))
 		  option = '?';
 		else if (strcmp(a[1], "static") == 0)
 		  {
@@ -1110,7 +1127,7 @@
 			      int len;
 			      arg += 3; /* dump id: */
 			      if (strchr(arg, ':'))
-				len = parse_hex(arg, (unsigned char *)arg, -1, NULL);
+				len = parse_hex(arg, (unsigned char *)arg, -1, NULL, NULL);
 			      else
 				len = (int) strlen(arg);
 			      
@@ -1125,10 +1142,11 @@
 			  new->flags |= CONFIG_NETID;
 			  new->netid.net = safe_string_alloc(arg+4);
 			}
-		      else if (parse_hex(a[j],  new->hwaddr, 6, &new->wildcard_mask) == 6)
+		      else 
+			{
+			  new->hwaddr_len = parse_hex(a[j],  new->hwaddr, DHCP_CHADDR_MAX, &new->wildcard_mask, &new->hwaddr_type);
 			  new->flags |= CONFIG_HWADDR;
-		      else
-			option = '?';
+			}
 		    }
 		  else if (strchr(a[j], '.') && (in.s_addr = inet_addr(a[j])) != (in_addr_t)-1)
 		    {
@@ -1223,7 +1241,7 @@
 		int addrs, digs, is_addr, is_hex, is_dec;
 		
 		new->len = 0;
-		new->is_addr = 0;
+		new->flags = 0;
 		new->netid = NULL;
 		new->val = NULL;
 		new->vendor_class = NULL;
@@ -1335,7 +1353,7 @@
 			  digs++;
 			  is_dec = is_addr = 0;
 			}
-		      else if (*cp == '.')
+		      else if (*cp == '.' || *cp == '/')
 			is_dec = is_hex = 0;
 		      else if (!((*cp >='0' && *cp <= '9') || *cp == '-'))
 			{
@@ -1357,7 +1375,7 @@
 		      {
 			new->len = digs;
 			new->val = safe_malloc(new->len);
-			parse_hex(comma, new->val, digs, NULL);
+			parse_hex(comma, new->val, digs, NULL, NULL);
 		      }
 		    else if (is_dec)
 		      {
@@ -1396,19 +1414,42 @@
 		    else if (is_addr)	
 		      {
 			struct in_addr in;
-			unsigned char *op;
-			new->len = INADDRSZ * addrs;
-			new->val = op = safe_malloc(new->len);
-			new->is_addr = 1;
+       			unsigned char *op;
+			char *slash;
+			/* max length of address/subnet descriptor is five bytes */
+			new->val = op = safe_malloc(5 * addrs);
+			if (!new->vendor_class)
+			  new->flags |= DHOPT_ADDR;
 			while (addrs--) 
 			  {
 			    cp = comma;
 			    if ((comma = strchr(cp, ',')))
 			      *comma++ = 0;
+			    if ((slash = strchr(cp, '/')))
+			      *slash++ = 0;
 			    in.s_addr = inet_addr(cp);
-			    memcpy(op, &in, INADDRSZ);
-			    op += INADDRSZ;
+			    if (!slash)
+			      {
+				memcpy(op, &in, INADDRSZ);
+				op += INADDRSZ;
+			      }
+			    else
+			      {
+				unsigned char *p = (unsigned char *)&in;
+				int netsize = atoi(slash);
+				*op++ = netsize;
+				if (netsize > 0)
+				  *op++ = *p++;
+				if (netsize > 8)
+				  *op++ = *p++;
+				if (netsize > 16)
+				  *op++ = *p++;
+				if (netsize > 24)
+				 *op++ = *p++;
+				new->flags &= ~DHOPT_ADDR; /* cannot re-write descriptor format */
+			      } 
 			  }
+			new->len = op - new->val;
 		      }
 		    else
 		      {
@@ -1416,6 +1457,7 @@
 			new->len = strlen(comma);
 			/* keep terminating zero on string */
 			new->val = (unsigned char *)safe_string_alloc(comma);
+			new->flags |= DHOPT_STRING;
 		      }
 		  }
 
@@ -1508,7 +1550,24 @@
 		  }
 		break;
 	      }
-
+	      
+	    case '4':
+	      {
+		if (!(comma = safe_strchr(arg, ',')))
+		  option = '?';
+		else
+		  {
+		    struct dhcp_mac *new = safe_malloc(sizeof(struct dhcp_mac));
+		    *comma = 0;
+		    new->netid.net = safe_string_alloc(arg);
+		    unhide_metas(comma+1);
+		    new->hwaddr_len = parse_hex(comma+1, new->hwaddr, DHCP_CHADDR_MAX, &new->mask, &new->hwaddr_type);
+		    new->next = daemon->dhcp_macs;
+		    daemon->dhcp_macs = new;
+		  }
+	      }
+	      break;
+	      
 	    case 'U':
 	    case 'j':
 	      {
diff --git a/src/rfc1035.c b/src/rfc1035.c
index 724d83e..5703b6a 100644
--- a/src/rfc1035.c
+++ b/src/rfc1035.c
@@ -17,7 +17,7 @@
 			       unsigned long ttl, unsigned int *offset, unsigned short type, 
 			       unsigned short class, char *format, ...);
 
-static int extract_name(HEADER *header, unsigned int plen, unsigned char **pp, 
+static int extract_name(HEADER *header, size_t plen, unsigned char **pp, 
 			char *name, int isExtract)
 {
   unsigned char *cp = (unsigned char *)name, *p = *pp, *p1 = NULL;
@@ -38,7 +38,7 @@
 	  /* get offset */
 	  l = (l&0x3f) << 8;
 	  l |= *p++;
-	  if (l >= (unsigned int)plen) 
+	  if (l >= plen) 
 	    return 0;
 	  
 	  if (!p1) /* first jump, save location to go back to */
@@ -253,7 +253,7 @@
   return 0;
 }
 
-static unsigned char *skip_name(unsigned char *ansp, HEADER *header, unsigned int plen)
+static unsigned char *skip_name(unsigned char *ansp, HEADER *header, size_t plen)
 {
   while(1)
     {
@@ -298,7 +298,7 @@
   return ansp;
 }
 
-static unsigned char *skip_questions(HEADER *header, unsigned int plen)
+static unsigned char *skip_questions(HEADER *header, size_t plen)
 {
   int q, qdcount = ntohs(header->qdcount);
   unsigned char *ansp = (unsigned char *)(header+1);
@@ -315,7 +315,7 @@
   return ansp;
 }
 
-static unsigned char *skip_section(unsigned char *ansp, int count, HEADER *header, unsigned int plen)
+static unsigned char *skip_section(unsigned char *ansp, int count, HEADER *header, size_t plen)
 {
   int i, rdlen;
   
@@ -338,7 +338,7 @@
    might be poisoning attacks. Note that we decode the name rather 
    than CRC the raw bytes, since replies might be compressed differently. 
    We ignore case in the names for the same reason. */
-unsigned int questions_crc(HEADER *header, unsigned int plen, char *name)
+unsigned int questions_crc(HEADER *header, size_t plen, char *name)
 {
   int q;
   unsigned int crc = 0xffffffff;
@@ -380,7 +380,7 @@
 }
 
 
-int resize_packet(HEADER *header, unsigned int plen, unsigned char *pheader, unsigned int hlen)
+size_t resize_packet(HEADER *header, size_t plen, unsigned char *pheader, size_t hlen)
 {
   unsigned char *ansp = skip_questions(header, plen);
     
@@ -403,7 +403,7 @@
   return ansp - (unsigned char *)header;
 }
 
-unsigned char *find_pseudoheader(HEADER *header, unsigned int plen, unsigned int *len, unsigned char **p)
+unsigned char *find_pseudoheader(HEADER *header, size_t plen, size_t  *len, unsigned char **p)
 {
   /* See if packet has an RFC2671 pseudoheader, and if so return a pointer to it. 
      also return length of pseudoheader in *len and pointer to the UDP size in *p */
@@ -428,7 +428,7 @@
       save = ansp;
       ansp += 6; /* class, TTL */
       GETSHORT(rdlen, ansp);
-      if ((unsigned int)(ansp + rdlen - (unsigned char *)header) > plen) 
+      if ((size_t)(ansp + rdlen - (unsigned char *)header) > plen) 
 	return NULL;
        ansp += rdlen;
        if (type == T_OPT)
@@ -470,7 +470,7 @@
       }
 }
 
-static int find_soa(HEADER *header, struct doctor *doctor, unsigned int qlen)
+static int find_soa(HEADER *header, struct doctor *doctor, size_t qlen)
 {
   unsigned char *p;
   int qtype, qclass, rdlen;
@@ -513,7 +513,7 @@
       else
 	p += rdlen;
       
-      if ((unsigned int)(p - (unsigned char *)header) > qlen)
+      if ((size_t)(p - (unsigned char *)header) > qlen)
 	return 0; /* bad packet */
     }
  
@@ -533,7 +533,7 @@
 	
 	p += rdlen;
 	
-	if ((unsigned int)(p - (unsigned char *)header) > qlen)
+	if ((size_t)(p - (unsigned char *)header) > qlen)
 	  return 0; /* bad packet */
       }
  
@@ -543,7 +543,7 @@
 /* Note that the following code can create CNAME chains that don't point to a real record,
    either because of lack of memory, or lack of SOA records.  These are treated by the cache code as 
    expired and cleaned out that way. */
-void extract_addresses(HEADER *header, unsigned int qlen, char *name, time_t now, struct daemon *daemon)
+void extract_addresses(HEADER *header, size_t qlen, char *name, time_t now, struct daemon *daemon)
 {
   unsigned char *p, *p1, *endrr;
   int i, j, qtype, qclass, aqtype, aqclass, ardlen, res, searched_soa = 0;
@@ -625,7 +625,7 @@
 		    }
 		  
 		  p1 = endrr;
-		  if ((unsigned int)(p1 - (unsigned char *)header) > qlen)
+		  if ((size_t)(p1 - (unsigned char *)header) > qlen)
 		    return; /* bad packet */
 		}
 	    }
@@ -709,7 +709,7 @@
 		    }
 		  
 		  p1 = endrr;
-		  if ((unsigned int)(p1 - (unsigned char *)header) > qlen)
+		  if ((size_t)(p1 - (unsigned char *)header) > qlen)
 		    return; /* bad packet */
 		}
 	    }
@@ -742,7 +742,7 @@
 /* If the packet holds exactly one query
    return 1 and leave the name from the query in name. */
 
-unsigned short extract_request(HEADER *header,unsigned int qlen, char *name, unsigned short *typep)
+unsigned short extract_request(HEADER *header, size_t qlen, char *name, unsigned short *typep)
 {
   unsigned char *p = (unsigned char *)(header+1);
   int qtype, qclass;
@@ -776,7 +776,7 @@
 }
 
 
-int setup_reply(HEADER *header, unsigned int qlen,
+size_t setup_reply(HEADER *header, size_t qlen,
 		struct all_addr *addrp, unsigned short flags, unsigned long ttl)
 {
   unsigned char *p = skip_questions(header, qlen);
@@ -841,7 +841,7 @@
 /* Is the packet a reply with the answer address equal to addr?
    If so mung is into an NXDOMAIN reply and also put that information
    in the cache. */
-int check_for_bogus_wildcard(HEADER *header, unsigned int qlen, char *name, 
+int check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name, 
 			     struct bogus_addr *baddr, time_t now)
 {
   unsigned char *p;
@@ -966,8 +966,8 @@
 }
 
 /* return zero if we can't answer from cache, or packet size if we can */
-int answer_request(HEADER *header, char *limit, unsigned int qlen, struct daemon *daemon, 
-		   struct in_addr local_addr, struct in_addr local_netmask, time_t now) 
+size_t answer_request(HEADER *header, char *limit, size_t qlen, struct daemon *daemon, 
+		      struct in_addr local_addr, struct in_addr local_netmask, time_t now) 
 {
   char *name = daemon->namebuff;
   unsigned char *p, *ansp, *pheader;
diff --git a/src/rfc2131.c b/src/rfc2131.c
index 308b35f..99cc377 100644
--- a/src/rfc2131.c
+++ b/src/rfc2131.c
@@ -1,4 +1,4 @@
-/* dnsmasq is Copyright (c) 2000-2005 Simon Kelley
+/* dnsmasq is Copyright (c) 2000-2006 Simon Kelley
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -60,15 +60,16 @@
 
 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_put_string(unsigned char *p, unsigned char *end, int opt, char *string);
+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, char *interface, char *string);
-static unsigned char *option_find(struct dhcp_packet *mess, int size, int opt_type, int minsize);
+static void log_packet(char *type, struct in_addr *addr, unsigned char *hwaddr, int hw_len, char *interface, char *string);
+static unsigned char *option_find(struct dhcp_packet *mess, size_t size, int opt_type, int minsize);
 static unsigned char *do_req_options(struct dhcp_context *context,
 				     unsigned char *p, unsigned char *end, 
 				     unsigned char *req_options, 
@@ -76,21 +77,23 @@
 				     char *hostname,
 				     struct dhcp_netid *netid,
 				     struct in_addr subnet_addr,
-				     unsigned char fqdn_flags);
+				     unsigned char fqdn_flags,
+				     int null_term);
 
-int dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *iface_name, 
-	       unsigned int sz, time_t now, int unicast_dest)
+size_t dhcp_reply(struct daemon *daemon, struct dhcp_context *context, char *iface_name, 
+	       size_t sz, time_t now, int unicast_dest)
 {
   unsigned char *opt, *clid = NULL;
   struct dhcp_lease *ltmp, *lease = NULL;
   struct dhcp_vendor *vendor;
+  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);
   char *hostname = NULL, *offer_hostname = NULL, *client_hostname = NULL;
-  int hostname_auth = 0;
+  int hostname_auth = 0, borken_opt = 0;
   unsigned char *req_options = NULL;
   char *message = NULL;
   unsigned int time;
@@ -99,12 +102,14 @@
   struct in_addr subnet_addr, fallback;
   unsigned short fuzz = 0;
   unsigned int mess_type = 0;
-  u8 *chaddr;
   unsigned char fqdn_flags = 0;
   subnet_addr.s_addr = 0;
 
   if (mess->op != BOOTREQUEST)
     return 0;
+   
+  if (mess->hlen > DHCP_CHADDR_MAX)
+    return 0;
   
   /* check for DHCP rather than BOOTP */
   if ((opt = option_find(mess, sz, OPTION_MESSAGE_TYPE, 1)))
@@ -132,8 +137,8 @@
 	}
       
       /* do we have a lease in store? */
-      if (mess->htype != 0)
-	lease = lease_find_by_client(mess->chaddr, clid, clid_len);
+      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, 
 	 use it again for option matching etc. */
@@ -144,38 +149,31 @@
 	}
     }
   
-  /* htype == 0 is only allowed in DHCPINFORM, this seems to be a
-     microsoftism. chaddr == NULL in that case */
-
-  if (mess->htype == 0 && mess_type == DHCPINFORM)
+  /* htype == 0 is only allowed in DHCPINFORM, 
+     this seems to be a microsoftism. */
+  if (mess->htype == 0)
     {
-      chaddr = NULL;
-      if (mess->hlen != 0)
+      if (mess_type != DHCPINFORM || mess->hlen != 0)
 	return 0;
     }
-  else
-    {
-      chaddr = mess->chaddr;
-
-      /* Token ring is supported when we have packet sockets
-	 to make the HW headers for us. We don't have the code to build
-	 token ring headers when using BPF. We rely on the fact that
-	 token ring hwaddrs are the same size as ethernet hwaddrs. */
-      
-#ifdef HAVE_BPF
-      if (mess->htype != ARPHRD_ETHER)	
-#else
-      if (mess->htype != ARPHRD_ETHER && mess->htype != ARPHRD_IEEE802)
-#endif
-	{
-	  syslog(LOG_WARNING, _("DHCP request for unsupported hardware type (%d) recieved on %s"), 
-		 mess->htype, iface_name);
-	  return 0;
-	}	
-      
-      if (mess->hlen != ETHER_ADDR_LEN)
-	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->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 
@@ -228,7 +226,8 @@
   
   mess->op = BOOTREPLY;
     
-  config = find_config(daemon->dhcp_conf, context, clid, clid_len, chaddr, NULL);
+  config = find_config(daemon->dhcp_conf, context, clid, clid_len, 
+		       mess->chaddr, mess->hlen, mess->htype, NULL);
   
   if (mess_type == 0)
     {
@@ -261,7 +260,7 @@
 	}
       
       for (id_list = daemon->dhcp_ignore; id_list; id_list = id_list->next)
-	if (match_netid(id_list->list, netid))
+	if (match_netid(id_list->list, netid, 0))
 	  message = _("disabled");
       
       if (!message)
@@ -271,14 +270,15 @@
 	      logaddr = &config->addr;
 	      mess->yiaddr = config->addr;
 	      if ((lease = lease_find_by_addr(config->addr)) &&
-		  memcmp(lease->hwaddr, chaddr, ETHER_ADDR_LEN) != 0)
+		  (lease->hwaddr_len != mess->hlen ||
+		   memcmp(lease->hwaddr, mess->chaddr, lease->hwaddr_len) != 0))
 		message = _("address in use");
 	    }
 	  else if (!(daemon->options & OPT_BOOTP_DYNAMIC))
 	    message = _("no address configured");
 	  else
 	    {
-	      if (!(lease = lease_find_by_client(mess->chaddr, NULL, 0)) ||
+	      if (!(lease = lease_find_by_client(mess->chaddr, mess->hlen, mess->htype, NULL, 0)) ||
 		  !address_available(context, lease->addr))
 		{
 		   if (lease)
@@ -287,14 +287,14 @@
 		       lease_prune(lease, now);
 		       lease = NULL;
 		     }
-		   if (!address_allocate(context, daemon, &mess->yiaddr, chaddr, netid, now))
+		   if (!address_allocate(context, daemon, &mess->yiaddr, mess->chaddr, mess->hlen, netid, now))
 		     message = _("no address available");
 		}
 	      else
 		mess->yiaddr = lease->addr;
 	    }
 	  
-	  if (!message && !lease && (!(lease = lease_allocate(chaddr, NULL, 0, mess->yiaddr))))
+	  if (!message && !lease && (!(lease = lease_allocate(mess->chaddr, NULL, mess->hlen, mess->htype, 0, mess->yiaddr))))
 	    message = _("no leases left");
 	  
 	  if (!message && !(context = narrow_context(context, mess->yiaddr)))
@@ -304,19 +304,19 @@
 	    {
 	      logaddr = &mess->yiaddr;
 		
-	      if (context->netid.net && !(context->flags & CONTEXT_FILTER))
+	      if (context->netid.net)
 		{
 		  context->netid.next = netid;
 		  netid = &context->netid;
 		}	 
 	      
-	      lease_set_hwaddr(lease, chaddr, NULL, 0);
+	      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 */
 	      
 	      p = do_req_options(context, p, end, NULL, daemon, 
-				 hostname, netid, subnet_addr, fqdn_flags);
+				 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);
@@ -324,7 +324,7 @@
 	    }
 	}
       
-      log_packet(NULL, logaddr, chaddr, iface_name, message);
+      log_packet(NULL, logaddr, mess->chaddr, mess->hlen, iface_name, message);
       mess->file[128] = save;
 
       if (message)
@@ -346,7 +346,7 @@
       pp = op;
       
       /* Always force update, since the client has no way to do it itself. */
-      if (fqdn_flags & 0x01)
+      if (!(fqdn_flags & 0x01))
 	fqdn_flags |= 0x02;
       
       fqdn_flags &= ~0x08;
@@ -363,6 +363,8 @@
       else
 	{
 	  memcpy(pq, op, len);
+	  if (len > 0 && op[len-1] == 0)
+	    borken_opt = 1;
 	  pq += len + 1;
 	}
       
@@ -378,8 +380,13 @@
     {
       int len = option_len(opt);
       memcpy(daemon->dhcp_buff, option_ptr(opt), len);
-      /* May not be zero terminated */
-      daemon->dhcp_buff[len] = 0;
+      /* Microsoft clients are broken, and need zero-terminated strings
+	 in options. We detect this state here, and do the same in
+	 any options we send */
+      if (len > 0 && daemon->dhcp_buff[len-1] == 0)
+	borken_opt = 1;
+      else
+	daemon->dhcp_buff[len] = 0;
       if (canonicalise(daemon->dhcp_buff))
 	client_hostname = daemon->dhcp_buff;
     }
@@ -398,7 +405,9 @@
       /* Search again now we have a hostname. 
 	 Only accept configs without CLID and HWADDR here, (they won't match)
 	 to avoid impersonation by name. */
-      struct dhcp_config *new = find_config(daemon->dhcp_conf, context, NULL, 0, chaddr, hostname);
+      struct dhcp_config *new = find_config(daemon->dhcp_conf, context, NULL, 0,
+					    mess->chaddr, mess->hlen, 
+					    mess->htype, hostname);
       if (!have_config(new, CONFIG_CLID) && !have_config(new, CONFIG_HWADDR))
 	config = new;
     }
@@ -442,10 +451,10 @@
 	      break;
 	    }
       }
-
+  
   /* if all the netids in the ignore list are present, ignore this client */
   for (id_list = daemon->dhcp_ignore; id_list; id_list = id_list->next)
-    if (match_netid(id_list->list, netid))
+    if (match_netid(id_list->list, netid, 0))
       ignore = 1;
   
   /* Can have setting to ignore the client ID for a particular MAC address or hostname */
@@ -485,7 +494,7 @@
       if (!(opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))
 	return 0;
       
-      log_packet("DECLINE", option_ptr(opt), chaddr, iface_name, message);
+      log_packet("DECLINE", option_ptr(opt), mess->chaddr, mess->hlen, iface_name, message);
       
       if (lease && lease->addr.s_addr == option_addr(opt).s_addr)
 	lease_prune(lease, now);
@@ -513,7 +522,7 @@
       else
 	message = _("unknown lease");
 
-      log_packet("RELEASE", &mess->ciaddr, chaddr, iface_name, message);
+      log_packet("RELEASE", &mess->ciaddr, mess->chaddr, mess->hlen, iface_name, message);
 	
       return 0;
       
@@ -533,15 +542,15 @@
 	else if (opt && address_available(context, addr) && !lease_find_by_addr(addr) && 
 		 !config_find_by_address(daemon->dhcp_conf, addr))
 	  mess->yiaddr = addr;
-	else if (!address_allocate(context, daemon, &mess->yiaddr, chaddr, netid, now))
+	else if (!address_allocate(context, daemon, &mess->yiaddr, mess->chaddr, mess->hlen, netid, now))
 	  message = _("no address available");      
-	log_packet("DISCOVER", opt ? &addr : NULL, chaddr, iface_name, message);          
+	log_packet("DISCOVER", opt ? &addr : NULL, mess->chaddr, mess->hlen, iface_name, message);          
       }
 
       if (message || !(context = narrow_context(context, mess->yiaddr)))
 	return 0;
 
-      if (context->netid.net && !(context->flags & CONTEXT_FILTER))
+      if (context->netid.net)
 	{
 	  context->netid.next = netid;
 	  netid = &context->netid;
@@ -569,10 +578,10 @@
 	  p = option_put(p, end, OPTION_T2, 4, (time*7)/8);
 	}
       p = do_req_options(context, p, end, req_options, daemon, 
-			 offer_hostname, netid, subnet_addr, fqdn_flags);
+			 offer_hostname, netid, subnet_addr, fqdn_flags, borken_opt);
       p = option_end(p, end, mess);
       
-      log_packet("OFFER" , &mess->yiaddr, chaddr, iface_name, NULL);
+      log_packet("OFFER" , &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, NULL);
       return p - (unsigned char *)mess;
       
     case DHCPREQUEST:
@@ -613,8 +622,12 @@
       else
 	{
 	  /* RENEWING or REBINDING */ 
-	  /* Must exist a lease for this address */
-	  if (!lease || mess->ciaddr.s_addr != lease->addr.s_addr)
+	  /* Check existing lease for this address.
+	     We allow it to be missing if dhcp-authoritative mode
+	     as long as we can allocate the lease now - checked below.
+	     This makes for a smooth recovery from a lost lease DB */
+	  if ((lease && mess->ciaddr.s_addr != lease->addr.s_addr) ||
+	      (!lease && !(daemon->options & OPT_AUTHORITATIVE)))
 	    {
 	      message = _("lease not found");
 	      /* ensure we broadcast NAK */
@@ -625,7 +638,7 @@
 	  mess->yiaddr = mess->ciaddr;
 	}
       
-      log_packet("REQUEST", &mess->yiaddr, chaddr, iface_name, NULL);
+      log_packet("REQUEST", &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, NULL);
  
       if (!message)
 	{
@@ -660,20 +673,20 @@
 	  else if ((ltmp = lease_find_by_addr(mess->yiaddr)) && ltmp != lease)
 	    message = _("address in use");
 	  
-	  else if (!lease && !(lease = lease_allocate(chaddr, clid, clid_len, mess->yiaddr)))
+	  else if (!lease && !(lease = lease_allocate(mess->chaddr, clid, mess->hlen, mess->htype, clid_len, mess->yiaddr)))
 	    message = _("no leases left");
 	}
       
       if (message)
 	{
-	  log_packet("NAK", &mess->yiaddr, chaddr, iface_name, message);
+	  log_packet("NAK", &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, message);
 	  
 	  mess->siaddr.s_addr = mess->yiaddr.s_addr = 0;
 	  bootp_option_put(mess, NULL, NULL);
 	  p = option_put(p, end, OPTION_MESSAGE_TYPE, 1, DHCPNAK);
 	  p = option_put(p, end, OPTION_SERVER_IDENTIFIER, INADDRSZ, 
 			 ntohl(context ? context->local.s_addr : fallback.s_addr));
-	  p = option_put_string(p, end, OPTION_MESSAGE, message);
+	  p = option_put_string(p, end, OPTION_MESSAGE, message, borken_opt);
 	  /* This fixes a problem with the DHCP spec, broadcasting a NAK to a host on 
 	     a distant subnet which unicast a REQ to us won't work. */
 	  if (!unicast_dest || mess->giaddr.s_addr != 0 || 
@@ -691,9 +704,9 @@
 	      hostname_auth = 1;
 	    }
 
-	  log_packet("ACK", &mess->yiaddr, chaddr, iface_name, hostname);
+	  log_packet("ACK", &mess->yiaddr, mess->chaddr, mess->hlen, iface_name, hostname);
       
-	  if (context->netid.net && !(context->flags & CONTEXT_FILTER))
+	  if (context->netid.net)
 	    {
 	      context->netid.next = netid;
 	      netid = &context->netid;
@@ -707,7 +720,7 @@
 		time = req_time;
 	    }
 	  
-	  lease_set_hwaddr(lease, chaddr, clid, clid_len);
+	  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);
@@ -725,7 +738,7 @@
 	      p = option_put(p, end, OPTION_T2, 4, ((time * 7)/8) - fuzz);
 	    }
 	  p = do_req_options(context, p, end, req_options, daemon, 
-			     hostname, netid, subnet_addr, fqdn_flags);
+			     hostname, netid, subnet_addr, fqdn_flags, borken_opt);
 	}
 
       p = option_end(p, end, mess);
@@ -735,7 +748,7 @@
       if (ignore || have_config(config, CONFIG_DISABLE))
 	message = _("ignored");
       
-      log_packet("INFORM", &mess->ciaddr, chaddr, iface_name, message);
+      log_packet("INFORM", &mess->ciaddr, mess->chaddr, mess->hlen, iface_name, message);
      
       if (message || mess->ciaddr.s_addr == 0 || 
 	  !(context = narrow_context(context, mess->ciaddr)))
@@ -754,31 +767,34 @@
       if (!hostname)
 	hostname = host_from_dns(daemon, mess->yiaddr);
       p = do_req_options(context, p, end, req_options, daemon, 
-			 hostname, netid, subnet_addr, fqdn_flags);
+			 hostname, netid, subnet_addr, fqdn_flags, borken_opt);
       p = option_end(p, end, mess);
       
-      log_packet("ACK", &mess->ciaddr, chaddr, iface_name, hostname);
+      log_packet("ACK", &mess->ciaddr, mess->chaddr, mess->hlen, iface_name, hostname);
       return p - (unsigned char *)mess; 
     }
   
   return 0;
 }
 
-static void log_packet(char *type, struct in_addr *addr, unsigned char *hwaddr, char *interface, char *string)
+static void log_packet(char *type, struct in_addr *addr, unsigned char *hwaddr, int hw_len, char *interface, char *string)
 {
-  u8 empty[] = { 0, 0, 0, 0, 0, 0};
+  char buff[(DHCP_CHADDR_MAX * 3) + 1];
+  char *p = buff;
+  int i;
 
-  if (!hwaddr)
-    hwaddr = empty;
-
-  syslog(LOG_INFO, "%s%s(%s)%s%s %.2x:%.2x:%.2x:%.2x:%.2x:%.2x%s%s",
+  *buff = 0;
+  for (i = 0; i < hw_len - 1; i++)
+    p += sprintf(p, "%.2x:", hwaddr[i]);
+  p += sprintf(p, "%.2x ", hwaddr[i]);
+  
+  syslog(LOG_INFO, "%s%s(%s) %s%s%s%s",
 	 type ? "DHCP" : "BOOTP",
 	 type ? type : "",
 	 interface, 
-	 addr ? " " : "",
 	 addr ? inet_ntoa(*addr) : "",
-	 hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5],
-	 string ? " " : "",
+	 addr ? " " : "",
+	 buff,
 	 string ? string : "");
 }
 
@@ -822,12 +838,12 @@
   struct dhcp_boot *tmp;
   
   for (tmp = boot_opts; tmp; tmp = tmp->next)
-    if (match_netid(tmp->netid, netids))
+    if (match_netid(tmp->netid, netids, 0))
       break;
   if (!tmp)
     /* No match, look for one without a netid */
     for (tmp = boot_opts; tmp; tmp = tmp->next)
-      if (!tmp->netid)
+      if (match_netid(tmp->netid, netids, 1))
 	break;
 
   /* Do this _after_ the matching above, since in 
@@ -884,10 +900,14 @@
   return p;
 }
 
-static unsigned char *option_put_string(unsigned char *p, unsigned char *end, int opt, char *string)
+static unsigned char *option_put_string(unsigned char *p, unsigned char *end, int opt, 
+					char *string, int null_term)
 {
   size_t len = strlen(string);
 
+  if (null_term && len != 255)
+    len++;
+
   if (check_space(p, end, len, opt))
     {
       *(p++) = opt;
@@ -935,7 +955,7 @@
   return NULL;
 }
  
-static unsigned char *option_find(struct dhcp_packet *mess, int size, int opt_type, int minsize)
+static unsigned char *option_find(struct dhcp_packet *mess, size_t size, int opt_type, int minsize)
 {
   int overload = 0; 
   unsigned char *ret;
@@ -976,31 +996,30 @@
   struct dhcp_opt *tmp;  
   for (tmp = opts; tmp; tmp = tmp->next)
     if (tmp->opt == opt)
-      {
-	if (netid)
-	  {
-	    if (match_netid(tmp->netid, netid))
-	      return tmp;
-	  }
-	else if (!tmp->netid)
-	  return tmp;
-      }
+      if (match_netid(tmp->netid, netid, 1) || match_netid(tmp->netid, netid, 0))
+	return tmp;
 	      
   return netid ? option_find2(NULL, opts, opt) : NULL;
 }
 
-static unsigned char *do_opt(struct dhcp_opt *opt, unsigned char *p, unsigned char *end,  struct in_addr local)
+static unsigned char *do_opt(struct dhcp_opt *opt, unsigned char *p, unsigned char *end,  
+			     struct in_addr local, int null_term)
 {
-  if (!check_space(p, end, opt->len, opt->opt))
+  int len = opt->len;
+
+  if ((opt->flags & DHOPT_STRING) && null_term && len != 255)
+    len++;
+
+  if (!check_space(p, end, len, opt->opt))
     return p;
     
   *(p++) = opt->opt;
-  *(p++) = opt->len;
+  *(p++) = len;
   
-  if (opt->len == 0)
+  if (len == 0)
     return p;
       
-  if (opt->is_addr && !opt->vendor_class)
+  if (opt->flags & DHOPT_ADDR)
     {
       int j;
       struct in_addr *a = (struct in_addr *)opt->val;
@@ -1016,8 +1035,8 @@
     }
   else
     {
-      memcpy(p, opt->val, opt->len);
-      p += opt->len;
+      memcpy(p, opt->val, len);
+      p += len;
     }
 
   return p;
@@ -1030,7 +1049,8 @@
 				     char *hostname,
 				     struct dhcp_netid *netid,
 				     struct in_addr subnet_addr,
-				     unsigned char fqdn_flags)
+				     unsigned char fqdn_flags,
+				     int null_term)
 {
   struct dhcp_opt *opt, *config_opts = daemon->dhcp_opts;
   char *vendor_class = NULL;
@@ -1066,7 +1086,7 @@
   
   if (daemon->domain_suffix && in_list(req_options, OPTION_DOMAINNAME) && 
       !option_find2(netid, config_opts, OPTION_DOMAINNAME))
-    p = option_put_string(p, end, OPTION_DOMAINNAME, daemon->domain_suffix);
+    p = option_put_string(p, end, OPTION_DOMAINNAME, daemon->domain_suffix, null_term);
  
   /* Note that we ignore attempts to set the hostname using 
      --dhcp-option=12,<name> and the fqdn using
@@ -1074,14 +1094,16 @@
   if (hostname)
     {
       if (in_list(req_options, OPTION_HOSTNAME))
-	p = option_put_string(p, end, OPTION_HOSTNAME, hostname);
+	p = option_put_string(p, end, OPTION_HOSTNAME, hostname, null_term);
       
       if (fqdn_flags != 0)
 	{
 	  int len = strlen(hostname) + 3;
 	  if (fqdn_flags & 0x04)
 	    len += 2;
-	  
+	  else if (null_term)
+	    len++;
+
 	  if (daemon->domain_suffix)
 	    len += strlen(daemon->domain_suffix) + 1;
 	  
@@ -1109,7 +1131,9 @@
 		      *(p++) = '.';
 		      memcpy(p, daemon->domain_suffix, strlen(daemon->domain_suffix));
 		      p += strlen(daemon->domain_suffix);
-		    } 
+		    }
+		  if (null_term)
+		    *(p++) = 0;
 		}
 	    }
 	}
@@ -1138,13 +1162,13 @@
       if (opt->opt == OPTION_VENDOR_ID)
 	vendor_class = (char *)opt->val; 
       else
-	p = do_opt(opt, p, end, context->local);
+	p = do_opt(opt, p, end, context->local, null_term);
     }  
 
   if (in_list(req_options, OPTION_VENDOR_ID))
     {      
       for (opt = daemon->vendor_opts; opt; opt = opt->next)
-	if (!opt->netid || match_netid(opt->netid, netid))
+	if (match_netid(opt->netid, netid, 1) || match_netid(opt->netid, netid, 0))
 	  {
 	    if (vendor_class && strcmp(vendor_class, (char *)opt->vendor_class) != 0)
 	      syslog(LOG_WARNING, _("More than one vendor class matches, using %s"), vendor_class);
@@ -1154,7 +1178,7 @@
 
       if (vendor_class)
 	{
-	  p = option_put_string(p, end, OPTION_VENDOR_ID, vendor_class);
+	  p = option_put_string(p, end, OPTION_VENDOR_ID, vendor_class, 0);
 	  
 	  if (in_list(req_options, OPTION_VENDOR_CLASS_OPT))
 	    {
@@ -1172,9 +1196,9 @@
 	      plen = p++; /* fill in later */
 	      
 	      for (opt = daemon->vendor_opts; opt; opt = opt->next)
-		if ((!opt->netid || match_netid(opt->netid, netid)) && 
+		if ((match_netid(opt->netid, netid, 1) || match_netid(opt->netid, netid, 0)) && 
 		    strcmp(vendor_class, (char *)opt->vendor_class) == 0)
-		  p = do_opt(opt, p, oend, context->local);
+		  p = do_opt(opt, p, oend, context->local, null_term);
 	      
 	      *plen = p - plen - 1;
 	    }
diff --git a/src/util.c b/src/util.c
index 730075d..747387d 100644
--- a/src/util.c
+++ b/src/util.c
@@ -319,25 +319,39 @@
 
 
 /* in may equal out, when maxlen may be -1 (No max len). */
-int parse_hex(char *in, unsigned char *out, int maxlen, unsigned int *wildcard_mask)
+int parse_hex(char *in, unsigned char *out, int maxlen, 
+	      unsigned int *wildcard_mask, int *mac_type)
 {
   int mask = 0, i = 0;
   char *r;
-
+    
+  if (mac_type)
+    *mac_type = 0;
+  
   while (maxlen == -1 || i < maxlen)
     {
       for (r = in; *r != 0 && *r != ':' && *r != '-'; r++);
       if (*r == 0)
 	maxlen = i;
+      
       if (r != in )
 	{
-	  *r = 0;
-	  mask = mask << 1;
-	  if (strcmp(in, "*") == 0)
-	    mask |= 1;
+	  if (*r == '-' && i == 0 && mac_type)
+	   {
+	      *r = 0;
+	      *mac_type = strtol(in, NULL, 16);
+	      mac_type = NULL;
+	   }
 	  else
-	    out[i] = strtol(in, NULL, 16);
-	  i++;
+	    {
+	      *r = 0;
+	      mask = mask << 1;
+	      if (strcmp(in, "*") == 0)
+		mask |= 1;
+	      else
+		out[i] = strtol(in, NULL, 16);
+	      i++;
+	    }
 	}
       in = r+1;
     }