X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-posix%2Finterface.lisp;h=cef0c715553e1fc026f95a7c80aef3c17043e365;hb=02d7495253b9075e4d86275590c3e827c814b596;hp=155d84d8c6cf03daf1124a7d7f778b3e5f69cb66;hpb=cbf779440ed494726e43620c8d48500dc43da950;p=sbcl.git diff --git a/contrib/sb-posix/interface.lisp b/contrib/sb-posix/interface.lisp index 155d84d..cef0c71 100644 --- a/contrib/sb-posix/interface.lisp +++ b/contrib/sb-posix/interface.lisp @@ -397,13 +397,37 @@ (declaim (inline ,lisp-name)) (defun ,lisp-name (,arg) (let ((r (alien-funcall (extern-alien ,name ,type) ,arg))) - (if (null r) - r + (if (null-alien r) + nil (alien-to-passwd r))))))) (define-pw-call "getpwnam" login-name (function (* alien-passwd) c-string)) (define-pw-call "getpwuid" uid (function (* alien-passwd) uid-t)) +;;; group database +#-win32 +(define-protocol-class group alien-group () + ((name :initarg :name :accessor group-name) + (passwd :initarg :passwd :accessor group-passwd) + (gid :initarg :gid :accessor group-gid))) + +(defmacro define-gr-call (name arg type) + #-win32 + ;; FIXME: this isn't the documented way of doing this, surely? + (let ((lisp-name (intern (string-upcase name) :sb-posix))) + `(progn + (export ',lisp-name :sb-posix) + (declaim (inline ,lisp-name)) + (defun ,lisp-name (,arg) + (let ((r (alien-funcall (extern-alien ,name ,type) ,arg))) + (if (null-alien r) + nil + (alien-to-group r))))))) + +(define-gr-call "getgrnam" login-name (function (* alien-group) c-string)) +(define-gr-call "getgrgid" gid (function (* alien-group) gid-t)) + + #-win32 (define-protocol-class timeval alien-timeval () ((sec :initarg :tv-sec :accessor timeval-sec