X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-bsd-sockets%2Fdefpackage.lisp;h=d0d23b811d571362b2356ab046a05e1633d438c8;hb=27763fafd1b170518ac2e85b9344fdddddcfd7c5;hp=5b4b72fbdffa78b658ee79d328c5b54994c3e102;hpb=2e274c84832d4b9a18adc66b5f15b29e217d012b;p=sbcl.git diff --git a/contrib/sb-bsd-sockets/defpackage.lisp b/contrib/sb-bsd-sockets/defpackage.lisp index 5b4b72f..d0d23b8 100644 --- a/contrib/sb-bsd-sockets/defpackage.lisp +++ b/contrib/sb-bsd-sockets/defpackage.lisp @@ -1,33 +1,14 @@ +#+(and sbcl win32) +(defpackage "SB-WIN32-SOCKETS-INTERNAL" + (:nicknames "WIN32SOCKINT") + (:shadow close listen) + (:use "COMMON-LISP" "SB-ALIEN" "SB-EXT" "SB-C-CALL")) + (defpackage "SB-BSD-SOCKETS-INTERNAL" (:nicknames "SOCKINT") (:shadow close listen) - #+cmu (:shadowing-import-from "CL" with-array-data) - #+sbcl (:shadowing-import-from "SB-KERNEL" with-array-data) - - #+cmu (:use "COMMON-LISP" "ALIEN" "SYSTEM" "EXT" "C-CALL") - #+sbcl (:use "COMMON-LISP" "SB-ALIEN" #+nil "SB-SYSTEM" "SB-EXT" "SB-C-CALL")) - -;;; SBCL changes a lot of package prefixes. To avoid littering the -;;; code with conditionals, we use the SBCL package prefixes -;;; throughout. This means that we need to create said packages -;;; first, if we're using CMUCL - -;;; One thing that this exercise really has made clear is just how much -;;; of the alien stuff is scattered around the cmucl package space -;;; seemingly at random. Hmm. - -#+cmu -(eval-when (:compile-toplevel :load-toplevel) - (defun add-package-nickname (name nickname) - (let ((p (find-package name))) - (rename-package p (package-name p) - (cons nickname (package-nicknames name))))) - (add-package-nickname "EXT" "SB-EXT") - (add-package-nickname "ALIEN" "SB-ALIEN") - (add-package-nickname "UNIX" "SB-UNIX") - (add-package-nickname "C-CALL" "SB-C-CALL") - (add-package-nickname "KERNEL" "SB-KERNEL") - (add-package-nickname "SYSTEM" "SB-SYS")) + (:shadowing-import-from "SB-KERNEL" with-array-data) + (:use "COMMON-LISP" "SB-ALIEN" "SB-EXT" "SB-C-CALL")) (defpackage "SB-BSD-SOCKETS" (:export socket local-socket inet-socket @@ -35,40 +16,39 @@ socket-bind socket-accept socket-connect socket-send socket-receive socket-recv socket-name socket-peername socket-listen - socket-close socket-file-descriptor socket-make-stream - get-protocol-by-name + socket-close socket-file-descriptor + socket-family socket-protocol socket-open-p + socket-type socket-make-stream get-protocol-by-name get-host-by-name get-host-by-address host-ent host-ent-addresses host-ent-address - host-ent aliases host-ent-name + host-ent-aliases host-ent-name name-service-error + getaddrinfo ;; not sure if these are really good names or not netdb-internal-error netdb-success-error host-not-found-error try-again-error no-recovery-error - - ;; all socket options are also exported, by code in - ;; sockopt.lisp - bad-file-descriptor-error - address-in-use-error - interrupted-error - invalid-argument-error - out-of-memory-error - operation-not-supported-error - operation-not-permitted-error - protocol-not-supported-error - socket-type-not-supported-error - network-unreachable-error - + unknown-protocol + + ;; all socket options are also exported, by code in + ;; sockopt.lisp + + socket-error + + ;; other errno-based socket errors are exported by code in + ;; sockets.lisp + make-inet-address non-blocking-mode ) (:use "COMMON-LISP" "SB-BSD-SOCKETS-INTERNAL") + (:import-from "SB-INT" "UNSUPPORTED-OPERATOR" "FEATUREP") (:documentation " @@ -81,55 +61,13 @@ arguments to fit Lisp style more closely. " )) -#|| - -

Contents

- -
    -
  1. General concepts -
  2. Methods applicable to all sockets -
  3. Socket Options -
  4. Methods applicable to a particular subclass -
      -
    1. INET-SOCKET - Internet Protocol (TCP, UDP, raw) sockets -
    2. Methods on LOCAL-SOCKET - Local-domain sockets -
    -
  5. Name resolution (DNS, /etc/hosts, &c) -
- -

General concepts

- -

Most of the functions are modelled on the BSD socket API. BSD sockets -are widely supported, portably ("portable" by Unix standards, at least) -available on a variety of systems, and documented. There are some -differences in approach where we have taken advantage of some of the more useful features of Common Lisp - briefly - -

- - -|# - -(in-package :sb-bsd-sockets) - -(defmethod asdf:hyperdocumentation - ((package (eql #.*package*)) symbol kind) - (declare (ignore kind)) - (format nil "file://~A#~A" - #.(namestring - (merge-pathnames "index.html" - (or *load-pathname* *compile-file-pathname*))) - symbol)) \ No newline at end of file +;;; gethostbyname/gethostbyaddr are generally not thread safe. POSIX +;;; 1003.1-2003 defines an alternative API, which is specified in the +;;; RFC to be thread-safe. If it seems to be available, use it. +;;; +;;; Unfortunately the manual page claims that these functions are not +;;; thread-safe on OS X, but they probably can't be any worse than +;;; gethostbyname and gethostbyaddr. +(let ((addr (sb-alien::find-dynamic-foreign-symbol-address "getaddrinfo"))) + (when addr + (pushnew :sb-bsd-sockets-addrinfo *features*)))