X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-posix%2Finterface.lisp;h=eff9ce7978c4e870a6624a7bcafb6488b5682f15;hb=2db542f484283726e64dd4606e7a0f74b9b228ee;hp=d40fd7dd13bf855cf80eb7dd79087177e7f0c349;hpb=15ea576825e88e331bf03f5634a2a2dd1a0cdc10;p=sbcl.git diff --git a/contrib/sb-posix/interface.lisp b/contrib/sb-posix/interface.lisp index d40fd7d..eff9ce7 100644 --- a/contrib/sb-posix/interface.lisp +++ b/contrib/sb-posix/interface.lisp @@ -514,7 +514,9 @@ (defmacro define-stat-call (name arg designator-fun type) ;; FIXME: this isn't the documented way of doing this, surely? - (let ((lisp-name (lisp-for-c-symbol name))) + (let ((lisp-name (lisp-for-c-symbol name)) + (real-name #+inode64 (format nil "~A$INODE64" name) + #-inode64 name)) `(progn (export ',lisp-name :sb-posix) (declaim (inline ,lisp-name)) @@ -522,7 +524,7 @@ (declare (type (or null stat) stat)) (with-alien-stat a-stat () (let ((r (alien-funcall - (extern-alien ,(real-c-name (list name :options :largefile)) ,type) + (extern-alien ,(real-c-name (list real-name :options :largefile)) ,type) (,designator-fun ,arg) a-stat))) (when (minusp r) @@ -621,6 +623,11 @@ (syscall-error)) (setf termios (alien-to-termios a-termios termios)))) termios) + (define-call "tcdrain" int minusp (fd file-descriptor)) + (define-call "tcflow" int minusp (fd file-descriptor) (action int)) + (define-call "tcflush" int minusp (fd file-descriptor) (queue-selector int)) + (define-call "tcgetsid" pid-t minusp (fd file-descriptor)) + (define-call "tcsendbreak" int minusp (fd file-descriptor) (duration int)) (export 'cfsetispeed :sb-posix) (declaim (inline cfsetispeed)) (defun cfsetispeed (speed &optional termios) @@ -723,7 +730,10 @@ ;;; environment -(export 'getenv :sb-posix) +(eval-when (:compile-toplevel :load-toplevel) + ;; Do this at compile-time as Win32 code below refers to it as + ;; sb-posix:getenv. + (export 'getenv :sb-posix)) (defun getenv (name) (let ((r (alien-funcall (extern-alien "getenv" (function (* char) c-string)) @@ -731,7 +741,40 @@ (declare (type (alien (* char)) r)) (unless (null-alien r) (cast r c-string)))) -(define-call "putenv" int minusp (string c-string)) +#-win32 +(progn + (define-call "setenv" int minusp (name c-string) (value c-string) (overwrite int)) + (define-call "unsetenv" int minusp (name c-string)) + (export 'putenv :sb-posix) + (defun putenv (string) + (declare (string string)) + ;; We don't want to call actual putenv: the string passed to putenv ends + ;; up in environ, and we any string we allocate GC might move. + ;; + ;; This makes our wrapper nonconformant if you squit hard enough, but + ;; users who care about that should really be calling putenv() directly in + ;; order to be able to manage memory sanely. + (let ((p (position #\= string)) + (n (length string))) + (if p + (if (= p n) + (unsetenv (subseq string 0 p)) + (setenv (subseq string 0 p) (subseq string (1+ p)) 1)) + (error "Invalid argument to putenv: ~S" string))))) +#+win32 +(progn + ;; Windows doesn't define a POSIX setenv, but happily their _putenv is sane. + (define-call* "putenv" int minusp (string c-string)) + (export 'setenv :sb-posix) + (defun setenv (name value overwrite) + (declare (string name value)) + (if (and (zerop overwrite) (sb-posix:getenv name)) + 0 + (putenv (concatenate 'string name "=" value)))) + (export 'unsetenv :sb-posix) + (defun unsetenv (name) + (declare (string name)) + (putenv (concatenate 'string name "=")))) ;;; syslog #-win32