aboutsummaryrefslogtreecommitdiffstats
path: root/pseudo_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'pseudo_client.c')
-rw-r--r--pseudo_client.c83
1 files changed, 79 insertions, 4 deletions
diff --git a/pseudo_client.c b/pseudo_client.c
index bd4ab10..6418dea 100644
--- a/pseudo_client.c
+++ b/pseudo_client.c
@@ -42,13 +42,18 @@ static char *base_path(int dirfd, const char *path, int leave_last);
static int connect_fd = -1;
static int server_pid = 0;
int pseudo_dir_fd = -1;
-char *pseudo_cwd = 0;
+int pseudo_pwd_fd = -1;
+FILE *pseudo_pwd = NULL;
+int pseudo_grp_fd = -1;
+FILE *pseudo_grp = NULL;
+char *pseudo_cwd = NULL;
size_t pseudo_cwd_len;
-char *pseudo_chroot = 0;
+char *pseudo_chroot = NULL;
+char *pseudo_passwd = NULL;
size_t pseudo_chroot_len = 0;
-char *pseudo_cwd_rel = 0;
+char *pseudo_cwd_rel = NULL;
-static char **fd_paths = 0;
+static char **fd_paths = NULL;
static int nfds = 0;
static int messages = 0;
static struct timeval message_time = { .tv_sec = 0 };
@@ -64,6 +69,67 @@ gid_t pseudo_egid;
gid_t pseudo_sgid;
gid_t pseudo_fgid;
+static void
+pseudo_file_close(int *fd, FILE **fp) {
+ if (!fp || !fd) {
+ pseudo_diag("pseudo_file_close: needs valid pointers.\n");
+ return;
+ }
+ pseudo_antimagic();
+ if (*fp) {
+ fclose(*fp);
+ *fd = -1;
+ *fp = 0;
+ }
+ /* this should be impossible */
+ if (*fd >= 0) {
+ close(*fd);
+ *fd = -1;
+ }
+ pseudo_magic();
+}
+
+static FILE *
+pseudo_file_open(char *name, int *fd, FILE **fp) {
+ if (!fp || !fd || !name) {
+ pseudo_diag("pseudo_file_open: needs valid pointers.\n");
+ return NULL;
+ }
+ pseudo_file_close(fd, fp);
+ pseudo_antimagic();
+ *fd = PSEUDO_ETC_FILE(name);
+ if (*fd >= 0) {
+ *fd = pseudo_fd(*fd, MOVE_FD);
+ *fp = fdopen(*fd, "r");
+ if (!*fp) {
+ close(*fd);
+ *fd = -1;
+ }
+ }
+ pseudo_magic();
+ return *fp;
+}
+
+FILE *
+pseudo_pwd_open() {
+ return pseudo_file_open("passwd", &pseudo_pwd_fd, &pseudo_pwd);
+}
+
+void
+pseudo_pwd_close() {
+ pseudo_file_close(&pseudo_pwd_fd, &pseudo_pwd);
+}
+
+FILE *
+pseudo_grp_open() {
+ return pseudo_file_open("group", &pseudo_grp_fd, &pseudo_grp);
+}
+
+void
+pseudo_grp_close() {
+ pseudo_file_close(&pseudo_grp_fd, &pseudo_grp);
+}
+
void
pseudo_client_touchuid(void) {
static char uidbuf[256];
@@ -238,6 +304,11 @@ pseudo_client_reset() {
}
}
+ env = getenv("PSEUDO_PASSWD");
+ if (env) {
+ pseudo_passwd = strdup(env);
+ }
+
pseudo_inited = 1;
}
pseudo_client_getcwd();
@@ -808,6 +879,10 @@ pseudo_client_op(op_id_t op, int access, int fd, int dirfd, const char *path, co
pseudo_util_debug_fd = pseudo_fd(fd, COPY_FD);
} else if (fd == pseudo_dir_fd) {
pseudo_dir_fd = pseudo_fd(fd, COPY_FD);
+ } else if (fd == pseudo_pwd_fd) {
+ pseudo_pwd_fd = pseudo_fd(fd, COPY_FD);
+ } else if (fd == pseudo_grp_fd) {
+ pseudo_grp_fd = pseudo_fd(fd, COPY_FD);
}
}
pseudo_client_close(fd);