~ 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