commit 57dc8cb4acc4599aee757e8f81999a0fa83c7111
Author: Alexander Artemenko <svetlyak.40wt@gmail.com>
Date:   Tue Dec 13 22:48:47 2016 +0300

    Fixed compilation on SBCL < 1.2.5.
    
    A new package cl-postgres.features was added.
    It probes features and adds them to *features*.
    
    Right now it only tests if SBCL's sb-bsd-sockets are available
    and if IPv6 is available in it. First feature is needed because
    event 1.3.x version could be compiled without support
    for bsd-sockets.

diff --git a/cl-postgres.asd b/cl-postgres.asd
index a00fd57..683edf0 100644
--- a/cl-postgres.asd
+++ b/cl-postgres.asd
@@ -18,7 +18,8 @@
   ((:module :cl-postgres
             :components ((:file "trivial-utf-8")
                          (:file "ieee-floats")
-                         (:file "package")
+                         (:file "features")
+                         (:file "package" :depends-on ("features"))
                          (:file "errors" :depends-on ("package"))
                          (:file "sql-string" :depends-on ("package"))
                          (:file #.*string-file* :depends-on ("package" "trivial-utf-8"))
diff --git a/cl-postgres/features.lisp b/cl-postgres/features.lisp
new file mode 100644
index 0000000..3cdc94f
--- /dev/null
+++ b/cl-postgres/features.lisp
@@ -0,0 +1,13 @@
+(defpackage :cl-postgres.features
+  (:use :common-lisp)
+  (:export #:sbcl-available
+           #:sbcl-ipv6-available))
+(in-package :cl-postgres.features)
+
+
+(eval-when (:compile-toplevel :load-toplevel)
+  (when (find-package 'sb-bsd-sockets)
+    (pushnew 'sbcl-available *features*)
+
+    (when (find-symbol "INET6-SOCKET" 'sb-bsd-sockets)
+      (pushnew 'sbcl-ipv6-available *features*))))
diff --git a/cl-postgres/public.lisp b/cl-postgres/public.lisp
index 7a65601..3b9e14f 100644
--- a/cl-postgres/public.lisp
+++ b/cl-postgres/public.lisp
@@ -46,7 +46,7 @@ currently connected."
     (initiate-connection conn)
     conn))
 
-#+(and (or sbcl ccl allegro) unix)
+#+(and (or cl-postgres.features:sbcl-available ccl allegro) unix)
 (progn
   (defparameter *unix-socket-dir*
     #-(or freebsd darwin) "/var/run/postgresql/"
@@ -58,7 +58,7 @@ currently connected."
       (setf base-dir (concatenate 'string base-dir "/")))
     (format nil "~a.s.PGSQL.~a" base-dir port))
 
-  #+sbcl
+  #+cl-postgres.features:sbcl-available
   (defun unix-socket-connect (path)
     (let ((sock (make-instance 'sb-bsd-sockets:local-socket :type :stream)))
       (sb-bsd-sockets:socket-connect sock path)
@@ -79,7 +79,7 @@ currently connected."
                         :format :binary
                         :remote-filename path)))
 
-#+sbcl
+#+cl-postgres.features:sbcl-available
 (defun get-host-address (host)
   "Returns valid IPv4 or IPv6 address for the host."
   ;; get all IPv4 and IPv6 addresses as a list
@@ -93,13 +93,19 @@ currently connected."
     (first addresses)))
 
 
-#+sbcl
+#+cl-postgres.features:sbcl-available
 (defun inet-socket-connect (host port)
   (let* ((host-ent (get-host-address host))
-        (sock (make-instance (ecase (sb-bsd-sockets:host-ent-address-type host-ent)
-                               (2  'sb-bsd-sockets:inet-socket)
-                               (10 'sb-bsd-sockets:inet6-socket))
-                             :type :stream :protocol :tcp))
+         (sock (make-instance
+                #+cl-postgres.features:sbcl-ipv6-available
+                (ecase (sb-bsd-sockets:host-ent-address-type host-ent)
+                  (2  'sb-bsd-sockets:inet-socket)
+                  (10 'sb-bsd-sockets:inet6-socket))
+                
+                #-cl-postgres.features:sbcl-ipv6-available
+                'sb-bsd-sockets:inet-socket
+                
+                :type :stream :protocol :tcp))
          (address (sb-bsd-sockets:host-ent-address host-ent)))
     (sb-bsd-sockets:socket-connect sock address port)
     (sb-bsd-sockets:socket-make-stream
@@ -128,12 +134,12 @@ if it isn't."
            #+unix t
            #-unix (error "Unix sockets only available on Unix (really)")))
     (handler-case
-        (let ((socket #-(or allegro sbcl ccl)
+        (let ((socket #-(or allegro cl-postgres.features:sbcl-available ccl)
                       (usocket:socket-stream
                        (usocket:socket-connect (connection-host conn)
                                                (connection-port conn)
                                                :element-type '(unsigned-byte 8)))
-                      #+(or allegro sbcl ccl)
+                      #+(or allegro cl-postgres.features:sbcl-available ccl)
                       (cond
                         ((equal (connection-host conn) :unix)
                          (assert-unix)
@@ -163,10 +169,10 @@ if it isn't."
                      finished t)
             (unless finished
               (ensure-socket-is-closed socket))))
-      #-(or allegro sbcl ccl)(usocket:socket-error (e) (add-restart e))
+      #-(or allegro cl-postgres.features:sbcl-available ccl)(usocket:socket-error (e) (add-restart e))
       #+ccl (ccl:socket-error (e) (add-restart e))
       #+allegro(excl:socket-error (e) (add-restart e))
-      #+sbcl(sb-bsd-sockets:socket-error (e) (add-restart e))
+      #+cl-postgres.features:sbcl-available(sb-bsd-sockets:socket-error (e) (add-restart e))
       (stream-error (e) (add-restart e))))
     (values))
 
