bool mount_all;
RootFsOption rootfs;
+ char cur_dir_path[PATH_MAX];
int cur_dir_fd;
int cur_rootdir_fd;
};
}
static bool
-mountSingle(struct MountInfo const *mnt, struct Options const *opt)
+mountSingle(struct MountInfo const *mnt, struct Options *opt)
{
assert(mnt->dst!=0);
perror("secure-mount: mount()");
return false;
}
+ if (strcmp(mnt->dst, "/") == 0) {
+ /* XXX: Hack */
+ if (chdir(opt->cur_dir_path) == -1) {
+ perror("secure-mount: chdir(.)");
+ return false;
+ }
+ close(opt->cur_dir_fd);
+ opt->cur_dir_fd = Eopen(".", O_RDONLY|O_DIRECTORY, 0);
+ Efcntl(opt->cur_dir_fd, F_SETFD, FD_CLOEXEC);
+ }
if ((mnt->flag & MS_BIND) &&
(mnt->mask & ~(MS_BIND|MS_REC))) {
/* This is needed to put us in the new mountpoint */
}
static bool
-mountFstab(struct Options const *opt)
+mountFstab(struct Options *opt)
{
bool res = false;
int fd;
Efcntl(opt->cur_dir_fd, F_SETFD, FD_CLOEXEC);
Efcntl(opt->cur_rootdir_fd, F_SETFD, FD_CLOEXEC);
+
+ if (getcwd(opt->cur_dir_path, sizeof(opt->cur_dir_path)) == NULL) {
+ perror("secure-mount: getcwd()");
+ exit(wrapper_exit_code);
+ }
}
static RootFsOption