~ chicken-core (chicken-5) 9235b64dab35843478e76a349875110648e2243d


commit 9235b64dab35843478e76a349875110648e2243d
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Aug 31 11:45:18 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Aug 31 11:45:18 2011 +0200

    added change-directory* (contributed by Alan Post)

diff --git a/manual/Unit posix b/manual/Unit posix
index cdbfddbb..0f6d0a2d 100644
--- a/manual/Unit posix	
+++ b/manual/Unit posix	
@@ -84,6 +84,14 @@ Permission bits used with, for example, {{file-open}}.
 
 Changes the current working directory to {{NAME}}.
 
+==== change-directory*
+
+<procedure>(change-directory* FD)</procedure>
+
+Changes the current working directory to the one represented by the
+file-descriptor {{FD}}, which should be an exact integer.
+
+
 ==== current-directory
 
 <procedure>(current-directory [DIR])</procedure>
@@ -1249,6 +1257,7 @@ not be obtained. On Windows, this procedure always returns {{0}},
 === How Scheme procedures relate to UNIX C functions
 
 ; {{change-directory}} : {{chdir}}
+; {{change-directory*}} : {{fchdir}}
 ; {{change-file-mode}} : {{chmod}}
 ; {{change-file-owner}} : {{chown}}
 ; {{create-directory}} : {{mkdir}}
@@ -1368,6 +1377,7 @@ Microsoft tools or with MinGW):
  set-signal-mask!  signal-mask  signal-masked?  signal-mask!  signal-unmask!
  user-information  group-information  get-groups  set-groups!  initialize-groups
  errno/wouldblock
+ change-directory*
  change-file-owner
  current-user-id  current-group-id  current-effective-user-id  current-effective-groupd-id
  set-user-id!  set-group-id!
diff --git a/posixunix.scm b/posixunix.scm
index 3e578d92..e76122c9 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -142,6 +142,7 @@ static C_TLS char C_hostbuf[ 256 ];
 static C_TLS struct stat C_statbuf;
 
 #define C_mkdir(str)        C_fix(mkdir(C_c_string(str), S_IRWXU | S_IRWXG | S_IRWXO))
+#define C_fchdir(fd)        C_fix(fchdir(C_unfix(fd)))
 #define C_chdir(str)        C_fix(chdir(C_c_string(str)))
 #define C_rmdir(str)        C_fix(rmdir(C_c_string(str)))
 
@@ -768,6 +769,12 @@ EOF
 	(posix-error #:file-error 'change-directory "cannot change current directory" name) )
       name)))
 
+(define (change-directory* fd)
+  (##sys#check-exact fd 'change-directory*) 
+  (unless (fx= 0 (##core#inline "C_fchdir" fd)) 
+    (posix-error #:file-error 'change-directory* "cannot change current directory" fd) ) 
+  fd)) 
+
 
 ;;; Pipes:
 
diff --git a/posixwin.scm b/posixwin.scm
index 45ca60af..1cd6b340 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -34,6 +34,7 @@
 ; set-signal-mask!  signal-mask	 signal-masked?	 signal-mask!  signal-unmask!
 ; user-information group-information  get-groups  set-groups!  initialize-groups
 ; errno/wouldblock
+; change-directory*
 ; change-file-owner
 ; current-user-id  current-group-id  current-effective-user-id	current-effective-group-id
 ; current-effective-user-name
@@ -1731,6 +1732,7 @@ EOF
      (define (?name . _)
        (error '?name (##core#immutable '"this function is not available on this platform")) ) ] ) )
 
+(define-unimplemented change-directory*)
 (define-unimplemented change-file-owner)
 (define-unimplemented create-fifo)
 (define-unimplemented create-session)
diff --git a/types.db b/types.db
index 91b46ea2..769b8d5b 100644
--- a/types.db
+++ b/types.db
@@ -1465,6 +1465,7 @@
 (call-with-input-pipe (#(procedure #:enforce) call-with-input-pipe (string (procedure (port) . *) #!optional symbol) . *))
 (call-with-output-pipe (#(procedure #:enforce) call-with-output-pipe (string (procedure (port) . *) #!optional symbol) . *))
 (change-directory (#(procedure #:clean #:enforce) change-directory (string) string))
+(change-directory* (#(procedure #:clean #:enforce) change-directory* (fixnum) fixnum))
 (change-file-mode (#(procedure #:clean #:enforce) change-file-mode (string fixnum) undefined))
 (change-file-owner (#(procedure #:clean #:enforce) change-file-owner (string fixnum fixnum) undefined))
 (close-input-pipe (#(procedure #:clean #:enforce) close-input-pipe (port) fixnum))
Trap