-(define-protocol-class sb-posix::stat sb-posix::alien-stat ()
- ((sb-posix::mode :initarg :mode :accessor sb-posix:stat-mode)
- (sb-posix::ino :initarg :ino :accessor sb-posix:stat-ino)
- (sb-posix::dev :initarg :dev :accessor sb-posix:stat-dev)
- (sb-posix::nlink :initarg :nlink :accessor sb-posix:stat-nlink)
- (sb-posix::uid :initarg :uid :accessor sb-posix:stat-uid)
- (sb-posix::gid :initarg :gid :accessor sb-posix:stat-gid)
- (sb-posix::size :initarg :size :accessor sb-posix:stat-size)
- (sb-posix::atime :initarg :atime :accessor sb-posix:stat-atime)
- (sb-posix::mtime :initarg :mtime :accessor sb-posix:stat-mtime)
- (sb-posix::ctime :initarg :ctime :accessor sb-posix:stat-ctime)))
+;;; passwd database
+(define-protocol-class passwd alien-passwd ()
+ ((name :initarg :name :accessor passwd-name)
+ (passwd :initarg :passwd :accessor passwd-passwd)
+ (uid :initarg :uid :accessor passwd-uid)
+ (gid :initarg :gid :accessor passwd-gid)
+ (gecos :initarg :gecos :accessor passwd-gecos)
+ (dir :initarg :dir :accessor passwd-dir)
+ (shell :initarg :shell :accessor passwd-shell)))
+
+(defmacro define-pw-call (name arg type)
+ ;; 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-passwd r)))))))
+
+(define-pw-call "getpwnam" login-name
+ (function (* alien-passwd) c-string))
+(define-pw-call "getpwuid" uid
+ (function (* alien-passwd) uid-t))
+
+(define-protocol-class stat alien-stat ()
+ ((mode :initarg :mode :accessor stat-mode)
+ (ino :initarg :ino :accessor stat-ino)
+ (dev :initarg :dev :accessor stat-dev)
+ (nlink :initarg :nlink :accessor stat-nlink)
+ (uid :initarg :uid :accessor stat-uid)
+ (gid :initarg :gid :accessor stat-gid)
+ (size :initarg :size :accessor stat-size)
+ (atime :initarg :atime :accessor stat-atime)
+ (mtime :initarg :mtime :accessor stat-mtime)
+ (ctime :initarg :ctime :accessor stat-ctime)))