diff options
-rw-r--r-- | pseudo_client.c | 8 | ||||
-rw-r--r-- | pseudo_util.c | 48 |
2 files changed, 35 insertions, 21 deletions
diff --git a/pseudo_client.c b/pseudo_client.c index 6418dea..ffa6092 100644 --- a/pseudo_client.c +++ b/pseudo_client.c @@ -881,8 +881,16 @@ pseudo_client_op(op_id_t op, int access, int fd, int dirfd, const char *path, co pseudo_dir_fd = pseudo_fd(fd, COPY_FD); } else if (fd == pseudo_pwd_fd) { pseudo_pwd_fd = pseudo_fd(fd, COPY_FD); + /* since we have a FILE * on it, we close that... */ + fclose(pseudo_pwd); + /* and open a new one on the copy */ + pseudo_pwd = fdopen(pseudo_pwd_fd, "r"); } else if (fd == pseudo_grp_fd) { pseudo_grp_fd = pseudo_fd(fd, COPY_FD); + /* since we have a FILE * on it, we close that... */ + fclose(pseudo_grp); + /* and open a new one on the copy */ + pseudo_grp = fdopen(pseudo_grp, "r"); } } pseudo_client_close(fd); 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; } |