From: Cyrus H. <ch...@bo...> - 2007-10-05 07:04:35
|
The following patch adds support for the C struct group found in grp.h. I've submitted this here rather than committing this because I'm doing something a bit hinky, which is ignoring the gr_mem struct member as I don't remember the proper way to deal with char **'s. I've ignored it for the moment and it seems to work as is, but if there's a good, clean, easy solution for adding gr_mem, that would probably be a good thing to do. The motivation for this is that hunchentoot wants to use getgrnam, but this wasn't previously supported by sb-posix. Thanks, Cyrus cvs diff: Diffing contrib/sb-posix Index: contrib/sb-posix/constants.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-posix/constants.lisp,v retrieving revision 1.38 diff -u -r1.38 constants.lisp --- contrib/sb-posix/constants.lisp 2 Oct 2007 07:17:26 -0000 1.38 +++ contrib/sb-posix/constants.lisp 5 Oct 2007 06:56:04 -0000 @@ -21,6 +21,7 @@ "errno.h" "dirent.h" "signal.h" #-win32 "pwd.h" + #-win32 "grp.h" "unistd.h" #-win32 "termios.h" #-win32 "syslog.h") @@ -290,6 +291,14 @@ #+nil (:integer fields "int" "pw_fields"))) + ;; group database + #-win32 + (:structure alien-group + ("struct group" + (c-string-pointer name "char *" "gr_name") + (c-string-pointer passwd "char *" "gr_passwd") + (gid-t gid "gid_t" "gr_gid"))) + (:structure alien-stat ("struct stat" (mode-t mode "mode_t" "st_mode") Index: contrib/sb-posix/defpackage.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-posix/defpackage.lisp,v retrieving revision 1.9 diff -u -r1.9 defpackage.lisp --- contrib/sb-posix/defpackage.lisp 12 Nov 2006 09:20:22 -0000 1.9 +++ contrib/sb-posix/defpackage.lisp 5 Oct 2007 06:56:04 -0000 @@ -10,6 +10,7 @@ #:passwd-name #:passwd-passwd #:passwd-uid #:passwd-gid #:passwd-gecos #:passwd-dir #:passwd-shell + #:group-name #:group-gid #:group-passwd #:stat-mode #:stat-ino #:stat-dev #:stat-nlink #:stat-uid #:stat-gid #:stat-size #:stat-atime #:stat-mtime #:stat- ctime #:termios-iflag #:termios-oflag #:termios-cflag Index: contrib/sb-posix/interface.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-posix/interface.lisp,v retrieving revision 1.45 diff -u -r1.45 interface.lisp --- contrib/sb-posix/interface.lisp 19 Jul 2007 12:58:59 -0000 1.45 +++ contrib/sb-posix/interface.lisp 5 Oct 2007 06:56:04 -0000 @@ -388,6 +388,30 @@ (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 r) + r + (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) Index: contrib/sb-posix/posix-tests.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-posix/posix-tests.lisp,v retrieving revision 1.29 diff -u -r1.29 posix-tests.lisp --- contrib/sb-posix/posix-tests.lisp 2 Jun 2007 13:26:34 -0000 1.29 +++ contrib/sb-posix/posix-tests.lisp 5 Oct 2007 06:56:05 -0000 @@ -453,6 +453,18 @@ (not (sb-posix:getpwnam "root")) nil) +#-win32 +(deftest grent.1 + ;; make sure that we found something + (not (sb-posix:getgrgid 0)) + nil) + +#-win32 +(deftest grent.2 + ;; make sure that we found something + (not (sb-posix:getgrnam "wheel")) + nil) + #+nil ;; Requires root or special group + plus a sensible thing on the port (deftest cfget/setispeed.1 |