aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pseudo_client.c8
-rw-r--r--pseudo_util.c48
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;
}