0.7.1.2:
[sbcl.git] / src / code / unix.lisp
index fbae021..0978918 100644 (file)
           (type unix-file-mode mode))
   (void-syscall ("mkdir" c-string int) name mode))
 
+;;; Given a C char* pointer allocated by malloc(), free it and return a
+;;; corresponding Lisp string (or return NIL if the pointer is a C NULL).
+(defun newcharstar-string (newcharstar)
+  (declare (type (alien (* char)) newcharstar))
+  (if (null-alien newcharstar)
+      nil
+      (prog1
+         (cast newcharstar c-string)
+       (free-alien newcharstar))))
+
 ;;; Return the Unix current directory as a SIMPLE-STRING, in the
 ;;; style returned by getcwd() (no trailing slash character). 
 (defun posix-getcwd ()
   ;; pointer is used. On a system which doesn't support that
   ;; extension, it'll have to be rewritten somehow.
   #!-(or linux openbsd freebsd) (,stub,)
-  (let* ((raw-char-ptr (alien-funcall (extern-alien "getcwd"
-                                                   (function (* char)
-                                                             (* char) size-t))
-                                     nil 0)))
-    (if (null-alien raw-char-ptr)
-       (simple-perror "getcwd")
-       (prog1
-           (cast raw-char-ptr c-string)
-         (free-alien raw-char-ptr)))))
+  (or (newcharstar-string (alien-funcall (extern-alien "getcwd"
+                                                      (function (* char)
+                                                                (* char)
+                                                                size-t))
+                                        nil 0))
+      (simple-perror "getcwd")))
 
 ;;; Return the Unix current directory as a SIMPLE-STRING terminated
 ;;; by a slash character.
 ;;; Return the process id of the current process.
 (define-alien-routine ("getpid" unix-getpid) int)
 
-;;; Return the real user-id associated with the current process.
+;;; Return the real user id associated with the current process.
 (define-alien-routine ("getuid" unix-getuid) int)
 
+;;; Translate a user id into a login name.
+(defun uid-username (uid)
+  (or (newcharstar-string (alien-funcall (extern-alien "uid_username"
+                                                      (function (* char) int))
+                                        uid))
+      (error "found no match for Unix uid=~S" uid)))
+
 ;;; Invoke readlink(2) on the file name specified by PATH. Return
 ;;; (VALUES LINKSTRING NIL) on success, or (VALUES NIL ERRNO) on
 ;;; failure.
 
 ;;; FIXME: All we seem to need is the RUSAGE_SELF version of this.
 ;;;
-;;; Like getrusage(2), but return only the system and user time,
-;;; and return the seconds and microseconds as separate values.
+;;; This is like getrusage(2), except it returns only the system and
+;;; user time, and returns the seconds and microseconds as separate
+;;; values.
 #!-sb-fluid (declaim (inline unix-fast-getrusage))
 (defun unix-fast-getrusage (who)
   (declare (values (member t)
            (tm-gmtoff long) ;  Seconds east of UTC.
            (tm-zone c-string))) ; Timezone abbreviation.
 
-(define-alien-routine get-timezone sb!c-call:void
-  (when sb!c-call:long :in)
-  (minutes-west sb!c-call:int :out)
+(define-alien-routine get-timezone sb!alien:void
+  (when sb!alien:long :in)
+  (minutes-west sb!alien:int :out)
   (daylight-savings-p sb!alien:boolean :out))
 
 (defun unix-get-minutes-west (secs)