From 64ecffb31e22c1513c6bbfae7551452efbe4a868 Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Sat, 13 May 2017 20:51:14 +0200 Subject: [PATCH 1/3] 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. --- posix-common.scm | 37 +++++++++++++++++++++++++++++++++++++ posixunix.scm | 25 ------------------------- posixwin.scm | 30 ------------------------------ 3 files changed, 37 insertions(+), 55 deletions(-) diff --git a/posix-common.scm b/posix-common.scm index e3e6739..89eeec2 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 40b5b75..6b01857 100644 --- a/posixunix.scm +++ b/posixunix.scm @@ -911,13 +911,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) @@ -926,24 +919,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 02fc62f..bd38fb7 100644 --- a/posixwin.scm +++ b/posixwin.scm @@ -987,36 +987,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") -- 2.1.4