1 ;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
3 ;;; --- Nameservers management.
6 (in-package :iolib
/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
)
32 ("domain" (setf domain value
))
33 ("search" (setf search-domain
(cons value more-values
)))))))
34 (map-etc-file (lambda (tokens)
35 (ignore-errors (parse-one-line tokens
)))
37 (values (nreverse nameservers
) domain search-domain
))))
39 (defun update-dns-parameters (file)
40 (multiple-value-bind (ns domain search
)
41 (parse-/etc
/resolv.conf file
)
42 (setf *dns-nameservers
* (or ns
+ipv4-loopback
+)
43 ;; everything after the first dot
44 *dns-domain
* (cdr (split-sequence #\. domain
:count
2))
45 *dns-search-domain
* search
)))
47 (defvar *resolv.conf-monitor
*
48 (make-instance 'file-monitor
49 :file
*resolv.conf-file
*
50 :update-fn
'update-dns-parameters
51 :lock
*resolvconf-lock
*))