diff options
author | Ron Yorston <rmy@pobox.com> | 2019-01-07 07:54:40 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2019-01-07 07:54:40 +0000 |
commit | a85653040477ec4e8a722de3af5afd04ee66bd59 (patch) | |
tree | 22c36324fd4cf68764f0df846321bc5a12a611fb | |
parent | 1fec4ebbdb930f6b8989be2e10c0f673803ac830 (diff) | |
download | busybox-w32-a85653040477ec4e8a722de3af5afd04ee66bd59.tar.gz busybox-w32-a85653040477ec4e8a722de3af5afd04ee66bd59.tar.bz2 busybox-w32-a85653040477ec4e8a722de3af5afd04ee66bd59.zip |
win32: implement umask(2)
umask() in the Microsoft C runtime takes different arguments to
umask(2). Implement a fake umask(2) that remembers the mask and
calls the Microsoft umask() with an appropriate value.
Since the mask won't be inherited by children use an environment
variable to pass any value set by the shell built-in umask.
-rw-r--r-- | include/mingw.h | 5 | ||||
-rw-r--r-- | libbb/appletlib.c | 9 | ||||
-rw-r--r-- | shell/ash.c | 3 | ||||
-rw-r--r-- | win32/mingw.c | 14 |
4 files changed, 31 insertions, 0 deletions
diff --git a/include/mingw.h b/include/mingw.h index b712e4ec0..2dc3ddfd7 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -243,6 +243,11 @@ NOIMPL(mingw_sendto,SOCKET s UNUSED_PARAM, const char *buf UNUSED_PARAM, int len | |||
243 | #define S_IWOTH (S_IWGRP >> 3) | 243 | #define S_IWOTH (S_IWGRP >> 3) |
244 | #define S_IXOTH (S_IXGRP >> 3) | 244 | #define S_IXOTH (S_IXGRP >> 3) |
245 | 245 | ||
246 | mode_t mingw_umask(mode_t mode); | ||
247 | #define umask mingw_umask | ||
248 | |||
249 | #define DEFAULT_UMASK 0002 | ||
250 | |||
246 | IMPL(fchmod,int,0,int fildes UNUSED_PARAM, mode_t mode UNUSED_PARAM); | 251 | IMPL(fchmod,int,0,int fildes UNUSED_PARAM, mode_t mode UNUSED_PARAM); |
247 | NOIMPL(fchown,int fd UNUSED_PARAM, uid_t uid UNUSED_PARAM, gid_t gid UNUSED_PARAM); | 252 | NOIMPL(fchown,int fd UNUSED_PARAM, uid_t uid UNUSED_PARAM, gid_t gid UNUSED_PARAM); |
248 | int mingw_mkdir(const char *path, int mode); | 253 | int mingw_mkdir(const char *path, int mode); |
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index 8a66b3303..ba52ef581 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
@@ -1081,6 +1081,15 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar | |||
1081 | applet_name = name; | 1081 | applet_name = name; |
1082 | #if ENABLE_PLATFORM_MINGW32 | 1082 | #if ENABLE_PLATFORM_MINGW32 |
1083 | strcpy(bb_applet_name, applet_name); | 1083 | strcpy(bb_applet_name, applet_name); |
1084 | |||
1085 | { | ||
1086 | const char *vmask; | ||
1087 | unsigned int mask; | ||
1088 | |||
1089 | vmask = getenv("BB_UMASK"); | ||
1090 | if (vmask && sscanf(vmask, "%o", &mask) == 1) | ||
1091 | umask((mode_t)(mask&0777)); | ||
1092 | } | ||
1084 | #endif | 1093 | #endif |
1085 | 1094 | ||
1086 | /* Special case. POSIX says "test --help" | 1095 | /* Special case. POSIX says "test --help" |
diff --git a/shell/ash.c b/shell/ash.c index 5195a8557..d9a4a8cfa 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -14489,6 +14489,9 @@ umaskcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
14489 | if (!isdigit(modestr[0])) | 14489 | if (!isdigit(modestr[0])) |
14490 | mask ^= 0777; | 14490 | mask ^= 0777; |
14491 | umask(mask); | 14491 | umask(mask); |
14492 | #if ENABLE_PLATFORM_MINGW32 | ||
14493 | setvareq(xasprintf("BB_UMASK=0%o", mask), VEXPORT|VNOSAVE); | ||
14494 | #endif | ||
14492 | } | 14495 | } |
14493 | return 0; | 14496 | return 0; |
14494 | } | 14497 | } |
diff --git a/win32/mingw.c b/win32/mingw.c index 8d1da5199..c72a306ac 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
@@ -318,6 +318,20 @@ static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fd | |||
318 | } | 318 | } |
319 | } | 319 | } |
320 | 320 | ||
321 | #undef umask | ||
322 | mode_t mingw_umask(mode_t new_mode) | ||
323 | { | ||
324 | static mode_t old_mode = DEFAULT_UMASK; | ||
325 | mode_t tmp_mode; | ||
326 | |||
327 | tmp_mode = old_mode; | ||
328 | old_mode = new_mode; | ||
329 | |||
330 | umask((new_mode & S_IWUSR) ? _S_IWRITE : 0); | ||
331 | |||
332 | return tmp_mode; | ||
333 | } | ||
334 | |||
321 | /* | 335 | /* |
322 | * Examine a file's contents to determine if it can be executed. This | 336 | * Examine a file's contents to determine if it can be executed. This |
323 | * should be a last resort: in most cases it's much more efficient to | 337 | * should be a last resort: in most cases it's much more efficient to |