From 8d35ffaa9eda2b203e2f3492d3432cdc6b15dc3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Mon, 26 Jan 1998 19:27:40 +0100 Subject: [PATCH] Now handles resolving DNS-server hostnames from /etc/hosts. Rev: lib/modules/Protocols.pmod/DNS.pmod:1.9 --- lib/modules/Protocols.pmod/DNS.pmod | 58 +++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod index e41c511cfd..1a29643032 100644 --- a/lib/modules/Protocols.pmod/DNS.pmod +++ b/lib/modules/Protocols.pmod/DNS.pmod @@ -211,6 +211,45 @@ class protocol class client { inherit protocol; + static private int is_ip(string ip) + { + return(replace(rest, + ({ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "." }), + ({ "", "", "", "", "", "", "", "", ""; "", "" })) == ""); + } + + static private mapping etc_hosts; + + static private string match_etc_hosts(string host) + { + if (!etc_hosts) { + string raw = Stdio.read_file("/etc/hosts"); + + etc_hosts = ([ "localhost", "127.0.0.1" ]); + + if (raw) { + foreach(raw/"\n", string line) { + // Handle comments, and split the line on white-space + line = replace((line/"#")[0], "\t", " "); + array arr = (line/" ") - ({ "" }); + + if (sizeof(arr) > 1) { + if (is_ip(arr[0])) { + foreach(arr[1..], name) { + etc_hosts[name] = arr[0]; + } + } else { + // Bad /etc/hosts entry ignored. + } + } + } + } else { + // Couldn't read /etc/hosts. + } + } + return(etc_hosts[host]); + } + array(string) nameservers = ({}); array domains = ({}); void create(void|string server) @@ -236,18 +275,29 @@ class client { sscanf(line,"%s%*[ \t]%s",line,rest); switch(line) { - case "domain": + case "domain": // Save domain for later. domain = rest; break; - case "search": + case "search": rest = replace(rest, "\t", " "); foreach(rest / " " - ({""}), string dom) domains += ({dom}); break; - case "nameserver": - nameservers += ({ rest }); + case "nameserver": + if (!is_ip(rest)) { + // Not an IP-number! + string host = rest; + if (!(rest = match_etc_hosts(host))) { + werror(sprintf("Protocols.DNS.client(): " + "Can't resolv nameserver \"%s\"\n", host)); + break; + } + } + if (sizeof(rest)) { + nameservers += ({ rest }); + } break; } } -- GitLab