X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-posix%2Finterface.lisp;h=5806754e81f14b6774c45c1de5d3a31c5dbb2f55;hb=4d8b3b1da4d960a6ff768c9e6ee8f99bf270b631;hp=779759a9cff1769ad74d194ee91516735c38701a;hpb=a7c186163e12d2c6348f8c579f74ca43872d10a9;p=sbcl.git diff --git a/contrib/sb-posix/interface.lisp b/contrib/sb-posix/interface.lisp index 779759a..5806754 100644 --- a/contrib/sb-posix/interface.lisp +++ b/contrib/sb-posix/interface.lisp @@ -76,7 +76,7 @@ ;;; variable. (eval-when (:compile-toplevel :load-toplevel) (setf *c-functions-in-runtime* - '`(#+netbsd ,@("stat" "lstat" "fstat" "readdir" "opendir")))) + '`(#+netbsd ,@("stat" "lstat" "fstat" "readdir" "opendir")))) ;;; filesystem access @@ -246,7 +246,30 @@ (define-call "setpgid" int minusp (pid pid-t) (pgid pid-t)) (define-call "setpgrp" int minusp)) -;;(define-call "readlink" int minusp (path filename) (buf (* t)) (len int)) +#-win32 +(progn + (export 'readlink :sb-posix) + (defun readlink (pathspec) + (flet ((%readlink (path buf length) + (alien-funcall + (extern-alien "readlink" (function int c-string (* t) int)) + path buf length))) + (loop for size = 128 then (* 2 size) + for buf = (make-alien c-string size) + do (unwind-protect + (let ((count (%readlink (filename pathspec) buf size))) + (cond ((minusp count) + (syscall-error)) + ((< 0 count size) + (setf (sb-sys:sap-ref-8 (sb-alien:alien-sap buf) + count) + 0) + (return + (sb-alien::c-string-to-string + (sb-alien:alien-sap buf) + (sb-impl::default-external-format) + 'character))))) + (free-alien buf)))))) #-win32 (progn @@ -581,4 +604,3 @@ than C's printf) with format string FORMAT and arguments ARGS." priority "%s" message))) (syslog1 priority (apply #'format nil format args)))) (define-call "closelog" void never-fails)) -