Index: contrib/sockets/sockets.lisp =================================================================== RCS file: /cvsroot/ecls/ecl/contrib/sockets/sockets.lisp,v retrieving revision 1.55 diff -u -r1.55 sockets.lisp --- contrib/sockets/sockets.lisp 17 Oct 2009 19:42:13 -0000 1.55 +++ contrib/sockets/sockets.lisp 18 Oct 2009 12:14:59 -0000 @@ -1389,7 +1389,6 @@ ret (error "Sockopt error: ~A" (c-inline () () :cstring "strerror(errno)" :one-liner t))))) - (defun get-sockopt-bool (fd level const) (let ((ret (c-inline (fd level const) (:int :int :int) t "{ @@ -1429,6 +1428,23 @@ ret (error "Sockopt error: ~A" (c-inline () () :cstring "strerror(errno)" :one-liner t))))) +(defun get-sockopt-linger (fd level const) + (let ((ret (c-inline (fd level const) (:int :int :int) t +"{ + struct linger sockopt; + socklen_t socklen = sizeof(struct linger); + int ret; + + ecl_disable_interrupts(); + ret = getsockopt(#0,#1,#2,&sockopt,&socklen); + ecl_enable_interrupts(); + + @(return) = (ret == 0) ? ecl_make_integer((sockopt.l_onoff != 0) ? sockopt.l_linger : 0) : Cnil; +}"))) + (if ret + ret + (error "Sockopt error: ~A" (c-inline () () :cstring "strerror(errno)" :one-liner t))))) + (defun set-sockopt-int (fd level const value) (let ((ret (c-inline (fd level const value) (:int :int :int :int) t "{ @@ -1485,6 +1501,28 @@ (defun set-sockopt-timeval (fd const value) (set-sockopt-int fd const (* 1000 value))) +(defun set-sockopt-linger (fd level const value) + (let ((ret (c-inline (fd level const value) (:int :int :int :int) t +"{ + struct linger sockopt = {0, 0}; + int value = #3; + int ret; + + if (value > 0) { + sockopt.l_onoff = 1; + sockopt.l_linger = value; + } + + ecl_disable_interrupts(); + ret = setsockopt(#0,#1,#2,&sockopt,sizeof(struct linger)); + ecl_enable_interrupts(); + + @(return) = (ret == 0) ? Ct : Cnil; +}"))) + (if ret + value + (error "Sockopt error: ~A" (c-inline () () :cstring "strerror(errno)" :one-liner t))))) + (eval-when (:compile-toplevel :load-toplevel) (defmacro define-sockopt (name c-level c-const type &optional (read-only nil)) `(progn @@ -1508,8 +1546,8 @@ (define-sockopt sockopt-send-timeout "SOL_SOCKET" "SO_SNDTIMEO" timeval) (define-sockopt sockopt-reuse-address "SOL_SOCKET" "SO_REUSEADDR" bool) (define-sockopt sockopt-keep-alive "SOL_SOCKET" "SO_KEEPALIVE" bool) -(define-sockopt socket-dont-route "SOL_SOCKET" "SO_DONTROUTE" bool) -(define-sockopt socket-linger "SOL_SOCKET" "SO_LINGER" bool) +(define-sockopt sockopt-dont-route "SOL_SOCKET" "SO_DONTROUTE" bool) +(define-sockopt sockopt-linger "SOL_SOCKET" "SO_LINGER" linger) #-(or :sun4sol2 :linux :wsock :cygwin) (define-sockopt sockopt-reuse-port "SOL_SOCKET" "SO_REUSEPORT" bool)