Use IOLIB/ in package names
[iolib.git] / src / sockets / dns / nameservers.lisp
blob4a6d8b6b426910e15f234747a3704812febd436c
1 ;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
2 ;;;
3 ;;; --- Nameservers management.
4 ;;;
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)
31 nameservers)))
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)))
36 file)
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*))