This involves some unpleasant CFFI hacking for ECL.
(defun resolve-hostname (name)
"Resolve a hostname to an IP address using the DNS, or return nil."
#+cmu (let ((he (ext:lookup-host-entry name)))
(defun resolve-hostname (name)
"Resolve a hostname to an IP address using the DNS, or return nil."
#+cmu (let ((he (ext:lookup-host-entry name)))
- (and he
- (ext:host-entry-addr he)))
- #-cmu nil
-)
+ (and he (ext:host-entry-addr he)))
+ #+clisp (let ((he (ext:resolve-host-ipaddr name)))
+ (and he (string-ipaddr (car (ext:hostent-addr-list he)))))
+ #+ecl (nth-value 2 (ext:lookup-host-entry name))
+ #-(or cmu clisp ecl) nil)
(defun canonify-hostname (name)
"Resolve a hostname to canonical form using the DNS, or return nil."
#+cmu (let ((he (ext:lookup-host-entry name)))
(defun canonify-hostname (name)
"Resolve a hostname to canonical form using the DNS, or return nil."
#+cmu (let ((he (ext:lookup-host-entry name)))
- (and he
- (ext:host-entry-name he)))
- #-cmu nil)
+ (and he (ext:host-entry-name he)))
+ #+clisp (let ((he (ext:resolve-host-ipaddr name)))
+ (and he (ext:hostent-name he)))
+ #+ecl (nth-value 0 (ext:lookup-host-entry name))
+ #-(or cmu clisp ecl) name)
;;;--------------------------------------------------------------------------
;;; Host names and specifiers.
;;;--------------------------------------------------------------------------
;;; Host names and specifiers.
:description "Generation of DNS zone files"
:version "1.0.0"
:author "Mark Wooding <mdw@distorted.org.uk>"
:description "Generation of DNS zone files"
:version "1.0.0"
:author "Mark Wooding <mdw@distorted.org.uk>"
+ :depends-on ("mdw" #+ecl "cffi")
:components ((:file "net")
(:file "zone")
(:file "frontend"))
:components ((:file "net")
(:file "zone")
(:file "frontend"))
;;;--------------------------------------------------------------------------
;;; Zone defaults. It is intended that scripts override these.
;;;--------------------------------------------------------------------------
;;; Zone defaults. It is intended that scripts override these.
+#+ecl
+(cffi:defcfun gethostname :int
+ (name :pointer)
+ (len :uint))
+
(defvar *default-zone-source*
(let ((hn #+cmu (unix:unix-gethostname)
(defvar *default-zone-source*
(let ((hn #+cmu (unix:unix-gethostname)
- #+clisp (unix:get-host-name)))
+ #+clisp (unix:get-host-name)
+ #+ecl (cffi:with-foreign-pointer-as-string (buffer 256 len)
+ (let ((rc (gethostname buffer len)))
+ (unless (zerop rc)
+ (error "gethostname(2) failed (rc = ~A)." rc))))))
(and hn (concatenate 'string (canonify-hostname hn) ".")))
"The default zone source: the current host's name.")
(and hn (concatenate 'string (canonify-hostname hn) ".")))
"The default zone source: the current host's name.")