Switch to the MIT licence.
[iolib.git] / net.sockets / dns / nameservers.lisp
blob83cc0434064fd264776d4278a43a5886c5c2a385
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
2 ;;;
3 ;;; --- Nameservers management.
4 ;;;
6 (in-package :net.sockets)
8 (defvar *resolv.conf-file* "/etc/resolv.conf")
10 (defvar *dns-nameservers* nil
11 "List of the DNS nameservers to use.")
13 (defvar *dns-domain* nil
14 "The current machine's domain.")
16 (defvar *dns-search-domain* nil
17 "A domain name to be appended to the name to be searched when
18 the latter does not contain dots.")
20 (defvar *resolvconf-lock* (bt:make-lock "/etc/resolv.conf lock"))
22 ;;; Only parses NAMESERVER, DOMAIN and SEARCH directives, for now.
23 (defun parse-/etc/resolv.conf (file)
24 (let (nameservers domain search-domain)
25 (flet ((parse-one-line (tokens)
26 (when (< (length tokens) 2) (error 'parse-error))
27 (destructuring-bind (option value &rest more-values) tokens
28 (switch (option :test #'string-equal)
29 ("nameserver" (ignore-parse-errors
30 (push (ensure-address value)
31 nameservers)))
32 ("domain" (setf domain value))
33 ("search" (setf search-domain (cons value more-values)))))))
34 (iterate ((tokens (serialize-etc-file file)))
35 (ignore-errors (parse-one-line tokens)))
36 (values (nreverse nameservers) domain search-domain))))
38 (defun update-dns-parameters (file)
39 (multiple-value-bind (ns domain search)
40 (parse-/etc/resolv.conf file)
41 (setf *dns-nameservers* (or ns +ipv4-loopback+)
42 ;; everything after the first dot
43 *dns-domain* (cdr (split-sequence #\. domain :count 2))
44 *dns-search-domain* search)))
46 (defvar *resolv.conf-monitor*
47 (make-instance 'file-monitor
48 :file *resolv.conf-file*
49 :update-fn 'update-dns-parameters
50 :lock *resolvconf-lock*))