~ 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