~ chicken-core (chicken-5) 17c40571f6763b045e797c83cfacb34431fb953f


commit 17c40571f6763b045e797c83cfacb34431fb953f
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat May 13 20:51:14 2017 +0200
Commit:     Kooda <kooda@upyum.com>
CommitDate: Mon Jun 5 23:08:30 2017 +0200

    Move common change-file-mode and file-*-access? code to posix-common
    
    The only difference is that in Windows, we don't have [RWX]_OK, but
    that we can easily define them in an #ifdef check.
    
    Signed-off-by: Kooda <kooda@upyum.com>

diff --git a/posix-common.scm b/posix-common.scm
index 3475dda3..b4ee2c1a 100644
--- a/posix-common.scm
+++ b/posix-common.scm
@@ -47,6 +47,17 @@ static C_TLS struct stat C_statbuf;
 # define S_IFSOCK           0140000
 #endif
 
+/* For Windows */
+#ifndef R_OK
+#define R_OK			2
+#endif
+#ifndef W_OK
+#define W_OK			4
+#endif
+#ifndef X_OK
+#define X_OK			2
+#endif
+
 #define cpy_tmvec_to_tmstc08(ptm, v) \
     ((ptm)->tm_sec = C_unfix(C_block_item((v), 0)), \
     (ptm)->tm_min = C_unfix(C_block_item((v), 1)), \
@@ -311,6 +322,32 @@ EOF
   (eq? 'directory (file-type file #f #f)))
 
 
+(define change-file-mode
+  (lambda (fname m)
+    (##sys#check-string fname 'change-file-mode)
+    (##sys#check-fixnum m 'change-file-mode)
+    (when (fx< (##core#inline "C_chmod" (##sys#make-c-string fname 'change-file-mode) m) 0)
+      (posix-error #:file-error 'change-file-mode "cannot change file mode" fname m) ) ) )
+
+(define file-read-access?)
+(define file-write-access?)
+(define file-execute-access?)
+
+(define-foreign-variable _r_ok int "R_OK")
+(define-foreign-variable _w_ok int "W_OK")
+(define-foreign-variable _x_ok int "X_OK")
+
+(let ()
+  (define (check filename acc loc)
+    (##sys#check-string filename loc)
+    (let ((r (fx= 0 (##core#inline "C_test_access" (##sys#make-c-string filename loc) acc))))
+      (unless r (##sys#update-errno))
+      r) )
+  (set! file-read-access? (lambda (filename) (check filename _r_ok 'file-read-access?)))
+  (set! file-write-access? (lambda (filename) (check filename _w_ok 'file-write-access?)))
+  (set! file-execute-access? (lambda (filename) (check filename _x_ok 'file-execute-access?))) )
+
+
 ;;; File position access:
 
 (define-foreign-variable _seek_set int "SEEK_SET")
diff --git a/posixunix.scm b/posixunix.scm
index d4541a44..6e6a5569 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -927,13 +927,6 @@ EOF
 
 ;;; Permissions and owners:
 
-(define change-file-mode
-  (lambda (fname m)
-    (##sys#check-string fname 'change-file-mode)
-    (##sys#check-fixnum m 'change-file-mode)
-    (when (fx< (##core#inline "C_chmod" (##sys#make-c-string fname 'change-file-mode) m) 0)
-      (posix-error #:file-error 'change-file-mode "cannot change file mode" fname m) ) ) )
-
 (define change-file-owner
   (lambda (fn uid gid)
     (##sys#check-string fn 'change-file-owner)
@@ -942,24 +935,6 @@ EOF
     (when (fx< (##core#inline "C_chown" (##sys#make-c-string fn 'change-file-owner) uid gid) 0)
       (posix-error #:file-error 'change-file-owner "cannot change file owner" fn uid gid) ) ) )
 
-(define-foreign-variable _r_ok int "R_OK")
-(define-foreign-variable _w_ok int "W_OK")
-(define-foreign-variable _x_ok int "X_OK")
-
-(define file-read-access?)
-(define file-write-access?)
-(define file-execute-access?)
-
-(let ()
-  (define (check filename acc loc)
-    (##sys#check-string filename loc)
-    (let ([r (fx= 0 (##core#inline "C_test_access" (##sys#make-c-string filename loc) acc))])
-      (unless r (##sys#update-errno))
-      r) )
-  (set! file-read-access? (lambda (filename) (check filename _r_ok 'file-read-access?)))
-  (set! file-write-access? (lambda (filename) (check filename _w_ok 'file-write-access?)))
-  (set! file-execute-access? (lambda (filename) (check filename _x_ok 'file-execute-access?))) )
-
 (define (create-session)
   (let ([a (##core#inline "C_setsid" #f)])
     (when (fx< a 0)
diff --git a/posixwin.scm b/posixwin.scm
index 9685b635..df26705d 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -1002,36 +1002,6 @@ EOF
     signal/segv signal/abrt signal/break))
 
 
-;;; Permissions and owners:
-
-(define change-file-mode
-  (lambda (fname m)
-    (##sys#check-string fname 'change-file-mode)
-    (##sys#check-fixnum m 'change-file-mode)
-    (when (fx< (##core#inline "C_chmod" (##sys#make-c-string fname 'change-file-mode) m) 0)
-      (##sys#update-errno)
-      (##sys#signal-hook #:file-error 'change-file-mode "cannot change file mode" fname m) ) ) )
-
-(define-foreign-variable _r_ok int "2")
-(define-foreign-variable _w_ok int "4")
-(define-foreign-variable _x_ok int "2")
-
-(define file-read-access?)
-(define file-write-access?)
-(define file-execute-access?)
-
-(let ()
-  (define (check filename acc loc)
-    (##sys#check-string filename loc)
-    (let ([r (fx= 0 (##core#inline "C_test_access" (##sys#make-c-string filename loc) acc))])
-      (unless r (##sys#update-errno))
-      r) )
-  (set! file-read-access? (lambda (filename) (check filename _r_ok 'file-read-access?)))
-  (set! file-write-access? (lambda (filename) (check filename _w_ok 'file-write-access?)))
-  (set! file-execute-access? (lambda (filename) (check filename _x_ok 'file-execute-access?))) )
-
-(define-foreign-variable _filename_max int "FILENAME_MAX")
-
 ;;; Using file-descriptors:
 
 (define-foreign-variable _stdin_fileno int "0")
Trap