~ chicken-core (chicken-5) 517d98bc03d13925d8ea4bc6be477689616a13b2
commit 517d98bc03d13925d8ea4bc6be477689616a13b2
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Dec 16 18:59:10 2010 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Thu Dec 16 18:59:10 2010 +0100
added implementation for CR 424 - seems to do something, but needs verification
diff --git a/manual/Unit posix b/manual/Unit posix
index 59861bef..a9c586dc 100644
--- a/manual/Unit posix
+++ b/manual/Unit posix
@@ -529,6 +529,19 @@ the user- and group-ids {{UID}} and {{GID}} (which should be
exact integers) using the {{chown()}} system call.
+==== file-creation-mode
+
+<procedure>(file-creation-mode MODE)</procedure>
+
+Returns the initial file permissions used for newly created files
+(as with {{umask(2)}}. You can set the mode by executing
+
+ (set! (file-creation-mode) MODE)
+
+where {{MODE}} is a bitwise combination of one or more of
+the {{perm/...}} flags.
+
+
=== Processes
==== current-process-id
@@ -1212,6 +1225,7 @@ always returns {{0}}, {{0}}.
; {{file-close}} : {{close}}
; {{file-access-time}} : {{stat}}
; {{file-change-time}} : {{stat}}
+; {{file-creation-mode}} : {{umask}}
; {{file-modification-time}} : {{stat}}
; {{file-execute-access?}} : {{access}}
; {{file-open}} : {{open}}
diff --git a/posix-common.scm b/posix-common.scm
index 89617683..4b755a43 100644
--- a/posix-common.scm
+++ b/posix-common.scm
@@ -361,3 +361,16 @@ EOF
(follow-symlinks #t))
(##sys#find-files dir test action seed limit follow-symlinks dotfiles 'find-files))
args))))
+
+
+;;; umask
+
+(define file-creation-mode
+ (getter-with-setter
+ (lambda ()
+ (let ((um (##core#inline "C_umask" 0)))
+ (##core#inline "C_umask" um)
+ um))
+ (lambda (um)
+ (##core#inline "C_umask" um))
+ "(file-creation-mode mode)"))
diff --git a/posix.import.scm b/posix.import.scm
index 2118ccb9..3414b79e 100644
--- a/posix.import.scm
+++ b/posix.import.scm
@@ -99,6 +99,7 @@
fifo?
file-access-time
file-change-time
+ file-creation-mode
file-close
file-control
file-execute-access?
diff --git a/posixunix.scm b/posixunix.scm
index 847394fa..a9fa2f8a 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -199,6 +199,7 @@ static C_TLS struct stat C_statbuf;
#define C_test_access(fn, m) C_fix(access((char *)C_data_pointer(fn), C_unfix(m)))
#define C_close(fd) C_fix(close(C_unfix(fd)))
#define C_sleep sleep
+#define C_umask(m) C_fix(umask(C_unfix(m)))
#define C_lstat(fn) C_fix(lstat((char *)C_data_pointer(fn), &C_statbuf))
diff --git a/posixwin.scm b/posixwin.scm
index 0d012da2..f4de4ad7 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -304,6 +304,8 @@ C_free_arg_string(char **where) {
#define C_flushall() C_fix(_flushall())
+#define C_umask(m) C_fix(_umask(C_unfix(m)))
+
#define C_ctime(n) (C_secs = (n), ctime(&C_secs))
#define C_tm_set_08(v) \
diff --git a/types.db b/types.db
index 0bbf362d..94488841 100644
--- a/types.db
+++ b/types.db
@@ -776,6 +776,7 @@
(file-change-time (procedure file-change-time ((or string fixnum)) number))
(file-close (procedure file-close (fixnum) undefined))
(file-control (procedure file-control (fixnum fixnum #!optional fixnum) fixnum))
+(file-creation-mode (procedure file-creation-mode () fixnum))
(file-execute-access? (procedure file-execute-access? (string) boolean))
(file-link (procedure file-link (string string) undefined))
(file-lock (procedure file-lock (port #!optional fixnum *) (struct lock)))
Trap