Package: cmucl
Version: 19a-release-20040728-9
Severity: wishlist
Tags: patch

This is a simple request to add packaging of certain POSIX socket
operations to CMUCL.  The packaging is perfectly straightforward,
and has been tested extensively in the application for which I
developed them.

I post them to the Debian BTS because

1) I thought other people might profit from using these extensions

2) CMUCL itself does not seem to have a good place for
   posting such requests

I have tried to match the style of the existing implementation for
stream-based networking as far as possible.

This code must be added to a suitable place in cmucl/code/unix-glibc2.lisp:
======================================================================
(export '(unix-recv-from unix-send-to unix-shutdown))

(def-alien-routine ("recvfrom" unix-recv-from) int
  (fd int)
  (buffer c-string)
  (length int)
  (flags int)
  (sockaddr (* t))
  (len int :in-out))

(def-alien-routine ("sendto" unix-send-to) int
  (fd int)
  (buffer c-string)
  (length int)
  (flags int)
  (sockaddr (* t))
  (len int))

(def-alien-routine ("shutdown" unix-shutdown) int
  (socket int)
  (level int))
======================================================================

This code must be added to a suitable place in cmucl/code/internet.lisp:
======================================================================
(export '(recvfrom sendto shutdown shut-rd shut-wr shut-rdwr))

(defun recvfrom (fd buffer size &key (flags 0))
  "A packaging of the unix recvfrom call.  Returns three values:
bytecount, source address as integer, and source port.  bytecount
can of course be negative, to indicate faults."
  (mp:process-wait-until-fd-usable fd :input)
  (with-alien ((sockaddr inet-sockaddr))
    (let* ((bytecount (unix:unix-recv-from fd buffer size flags
                                          (alien-sap sockaddr)
                                          (alien-size inet-sockaddr :bytes))))
      (values bytecount (ntohl (slot sockaddr 'addr)) (ntohs (slot sockaddr 
'port))))))

(defun sendto (fd buffer size addr port &key (flags 0))
  "A packaging of the unix sendto call.  Return value like sendto"
    (with-alien ((sockaddr inet-sockaddr))
      (setf (slot sockaddr 'family) af-inet)
      (setf (slot sockaddr 'port) (htons port))
      (setf (slot sockaddr 'addr) (htonl addr))
      (unix:unix-send-to fd
                         buffer
                         size
                         flags
                         (alien-sap sockaddr)
                         (alien-size inet-sockaddr :bytes))))
(defconstant shut-rd 0)
(defconstant shut-wr 1)
(defconstant shut-rdwr 2)

(defun shutdown (fd level)
  (when (minusp (unix:unix-shutdown fd level))
    (error "Error on shutdown of socket: ~A" (unix:get-unix-error-msg))))
======================================================================

A natural question is: is it not necessary to modify ext:create-inet-listener
and ext:create-inet-socket to use these extensions?  The answer is, that they
work already; current version of "internet.lisp" has support to open a
datagram socket, but not to use it!



-- System Information:
Debian Release: 3.1
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.5-7.97-smp
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages cmucl depends on:
ii  common-lisp-controller        4.12       This is a Common Lisp source and c
ii  debconf                       1.4.41     Debian configuration management sy

-- debconf information:
  cmucl/upgradeproblems:


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to