From 7c66c86724f4c758fd468627ac7f22a207f64c7d Mon Sep 17 00:00:00 2001
From: Evan Hanson <evhan@foldling.org>
Date: Wed, 13 May 2020 17:50:39 +1200
Subject: [PATCH] Use 0666 as default file-open mode
There doesn't seem to be a default mode for open(2) specified anywhere,
so let's make `file-open' match fopen(3) so the permissions of files
created using the posix unit match files created with the normal
`open-output-file' procedure, rather than making them executable by
default. This closes #1698.
---
posixunix.scm | 2 +-
posixwin.scm | 2 +-
tests/posix-tests.scm | 40 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/posixunix.scm b/posixunix.scm
index 23ff157e..1bddc429 100644
|
a
|
b
|
static int set_file_mtime(char *filename, C_word atime, C_word mtime) |
| 335 | 335 | res ) ) ) ) ) |
| 336 | 336 | |
| 337 | 337 | (set! chicken.file.posix#file-open |
| 338 | | (let ((defmode (bitwise-ior _s_irwxu (bitwise-ior _s_irgrp _s_iroth))) ) |
| | 338 | (let ((defmode (bitwise-ior _s_irusr _s_iwusr _s_irgrp _s_iwgrp _s_iroth _s_iwoth))) |
| 339 | 339 | (lambda (filename flags . mode) |
| 340 | 340 | (let ([mode (if (pair? mode) (car mode) defmode)]) |
| 341 | 341 | (##sys#check-string filename 'file-open) |
diff --git a/posixwin.scm b/posixwin.scm
index c279c58e..cb31a07b 100644
|
a
|
b
|
static int set_file_mtime(char *filename, C_word atime, C_word mtime) |
| 517 | 517 | (set! chicken.file.posix#open/noinherit _o_noinherit) |
| 518 | 518 | |
| 519 | 519 | (set! chicken.file.posix#file-open |
| 520 | | (let ((defmode (bitwise-ior _s_irwxu (fxior _s_irgrp _s_iroth)))) |
| | 520 | (let ((defmode (bitwise-ior _s_irusr _s_iwusr _s_irgrp _s_iwgrp _s_iroth _s_iwoth))) |
| 521 | 521 | (lambda (filename flags . mode) |
| 522 | 522 | (let ([mode (if (pair? mode) (car mode) defmode)]) |
| 523 | 523 | (##sys#check-string filename 'file-open) |
diff --git a/tests/posix-tests.scm b/tests/posix-tests.scm
index 807730e6..361f55c1 100644
|
a
|
b
|
|
| 87 | 87 | (assert (equal? (get-environment-variable "FOO") "bar")) |
| 88 | 88 | (unset-environment-variable! "FOO") |
| 89 | 89 | (assert (not (get-environment-variable "FOO"))) |
| | 90 | |
| | 91 | ;; file creation and umask interaction |
| | 92 | (letrec-syntax ((test (syntax-rules () |
| | 93 | ((test umask expected) |
| | 94 | (test umask "expected" expected "given")) |
| | 95 | ((test umask given expected) |
| | 96 | (test umask "expected" expected "given" given)) |
| | 97 | ((test umask "expected" expected "given" given ...) |
| | 98 | (let ((mode (file-creation-mode))) |
| | 99 | (set! (file-creation-mode) umask) |
| | 100 | (delete-file* "posix-tests.out") |
| | 101 | (file-open "posix-tests.out" open/creat given ...) |
| | 102 | (assert (equal? (file-permissions "posix-tests.out") expected)) |
| | 103 | (set! (file-creation-mode) mode)))))) |
| | 104 | ;; default file mode |
| | 105 | (test #o000 #o666) |
| | 106 | (test #o002 #o664) |
| | 107 | (test #o020 #o646) |
| | 108 | (test #o022 #o644) |
| | 109 | (test #o027 #o640) |
| | 110 | (test #o072 #o604) |
| | 111 | (test #o077 #o600) |
| | 112 | (test #o777 #o000) |
| | 113 | ;; explicit file mode argument |
| | 114 | (test #o000 #o644 #o644) |
| | 115 | (test #o002 #o644 #o644) |
| | 116 | (test #o020 #o644 #o644) |
| | 117 | (test #o022 #o644 #o644) |
| | 118 | (test #o027 #o644 #o640) |
| | 119 | (test #o072 #o644 #o604) |
| | 120 | (test #o077 #o644 #o600) |
| | 121 | (test #o777 #o644 #o000) |
| | 122 | (test #o000 #o777 #o777) |
| | 123 | (test #o002 #o777 #o775) |
| | 124 | (test #o020 #o777 #o757) |
| | 125 | (test #o022 #o777 #o755) |
| | 126 | (test #o027 #o777 #o750) |
| | 127 | (test #o072 #o777 #o705) |
| | 128 | (test #o077 #o777 #o700) |
| | 129 | (test #o777 #o777 #o000)) |