From: Scott B. <se...@gm...> - 2006-02-18 20:42:22
|
Hello all, I've encountered some memory weirdness yesterday afternoon, and either there's a ghost living at my sap address, or I'm doing something very wrong. The first two calls are successful, but the third (and thereafter) has the first four bytes of my structure hosed. Thanks, - Scott Bell * (recvfrom *mysocket* *mybuffer* 10) 4 #<SOCKADDR FAMILY: 2 DATA: #(128 5 127 0 0 1 0 0 0 0 0 0 0 0)> * (recvfrom *mysocket* *mybuffer* 10) 4 #<SOCKADDR FAMILY: 2 DATA: #(128 5 127 0 0 1 0 0 0 0 0 0 0 0)> * (recvfrom *mysocket* *mybuffer* 10) 4 #<SOCKADDR FAMILY: 49904 DATA: #(23 8 127 0 0 1 0 0 0 0 0 0 0 0)> (defun recvfrom (socket buffer length &optional (flags 0)) (let ((buf (make-alien (array (unsigned 8) 1) length)) (len (make-alien socklen-t)) (addr (make-alien (struct sockaddr))) (address)) (unwind-protect (let ((r (alien-funcall (extern-alien "recvfrom" (function ssize-t int (* (array (unsigned 8) 1)) size-t int (* sockaddr) (* socklen-t))) socket buf length flags addr len))) (when (minusp r) (syscall-error)) (copy-alien-bytes (deref buf) buffer r) (unless (or (null-alien addr) (zerop (deref len))) (setf address (extract-sockaddr addr (deref len)))) =09 (if (not (null address)) (values r address) r)) (free-alien buf) (free-alien len) (free-alien addr)))) (defun extract-sockaddr (addr len) (setf len (- len (/ (alien-size sa-family-t) 8)) (let ((address (make-array len :element-type '(unsigned-byte 8))) =09(sockaddr (make-instance 'sockaddr))) (setf (family sockaddr) (sockaddr-family addr)) (dotimes (i len) (setf (aref address i) (deref (sockaddr-data addr) i))) (setf (data sockaddr) address) sockaddr)) |