diff options
Diffstat (limited to 'pseudo_util.c')
-rw-r--r-- | pseudo_util.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/pseudo_util.c b/pseudo_util.c index 8af3020..2cf6585 100644 --- a/pseudo_util.c +++ b/pseudo_util.c @@ -588,29 +588,35 @@ pseudo_sys_path_max(void) { int pseudo_access_fopen(const char *mode) { int access = 0; - switch (*mode) { - case 'a': - access |= (PSA_APPEND | PSA_WRITE); - if (mode[1] == '+' || (mode[1] == 'b' && mode[2] == '+')) + for (; *mode; ++mode) { + switch (*mode) { + case 'a': + access |= (PSA_APPEND | PSA_WRITE); + break; + case 'r': access |= PSA_READ; - break; - case 'r': - access |= PSA_READ; - if (mode[1] == '+' || (mode[1] == 'b' && mode[2] == '+')) + break; + case 'w': access |= PSA_WRITE; - break; - case 'w': - access |= PSA_WRITE; - if (mode[1] == '+' || (mode[1] == 'b' && mode[2] == '+')) - access |= PSA_READ; - break; - /* special case */ - case 'x': - access |= PSA_EXEC; - break; - default: - access = -1; - break; + break; + case 'x': + /* special case -- note that this conflicts with a + * rarely-used glibc extension + */ + access |= PSA_EXEC; + break; + case 'b': /* binary mode */ + break; + case 'c': case 'e': case 'm': /* glibc extensions */ + break; + case '+': + /* one of these will already be set, presumably */ + access |= (PSA_READ | PSA_WRITE); + break; + default: + access = -1; + break; + } } return access; } |