static int fdochroot(int fcwd) { if (fchroot(fcwd) != 0) { syswarn(1, errno, "Can't fchroot to \".\""); return -1; } return updatepath(); }
inline static void restoreRoot(struct Options const *opt) { if (opt->do_chroot!=0 && fchroot(opt->cur_rootdir_fd)==-1) { perror("secure-mount: fchdir(\"/\")"); WRITE_MSG(2, "Failed to restore root-directory; aborting\n"); exit(1); } }
static int updateMtab(struct MountInfo const *mnt, struct Options const *opt) { int res = -1; int fd; assert(opt->mtab!=0); if (opt->do_chroot && fchroot(opt->cur_dir_fd)==-1) { perror("secure-mount: fchroot(\".\")"); return -1; } fd=open(opt->mtab, O_CREAT|O_APPEND|O_WRONLY, 0644); if (fd==-1) { perror("secure-mount: open(<mtab>)"); goto err0; } if (lockf(fd, F_LOCK, 0)==-1) { perror("secure-mount: lockf()"); goto err1; } if (writeStrX(fd, mnt->src)==-1 || writeStrX(fd, " ")==-1 || writeStrX(fd, mnt->dst)==-1 || writeStrX(fd, mnt->xflag & XFLAG_FILE ? "/" : "")==-1 || writeStrX(fd, mnt->xflag & XFLAG_FILE ? mnt->name : "")==-1 || writeStrX(fd, " ")==-1 || writeStrX(fd, getType(mnt))==-1 || writeStrX(fd, " ")==-1 || writeStrX(fd, mnt->data ? mnt->data : "defaults")==-1 || writeStrX(fd, " 0 0\n")==-1) { perror("secure-mount: write()"); goto err1; } res = 0; err1: close(fd); err0: restoreRoot(opt); return res; }