diff options
Diffstat (limited to 'package/aufs2-util/src/mtab.c')
-rw-r--r-- | package/aufs2-util/src/mtab.c | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/package/aufs2-util/src/mtab.c b/package/aufs2-util/src/mtab.c deleted file mode 100644 index 713e9e267..000000000 --- a/package/aufs2-util/src/mtab.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (C) 2005-2009 Junjiro Okajima - * - * This program, aufs is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* cf. fstab.c or the locking for /etc/mtab in util-linux */ -/* - * we need to extract a part of util-linux and create a simple and generic - * library for locking /etc/mtab. - */ - -/* #include <linux/proc_fs.h> */ -#define PROC_SUPER_MAGIC 0x9fa0 -#include <sys/stat.h> -#include <sys/statfs.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <fcntl.h> -#include <mntent.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "au_util.h" - -void au_print_ent(struct mntent *ent) -{ - printf("%s on %s type %s (%s)\n", - ent->mnt_fsname, ent->mnt_dir, ent->mnt_type, ent->mnt_opts); -} - -/* ---------------------------------------------------------------------- */ - -static void lock_mtab(char *pid_file) -{ - int err, i; - - for (i = 0; i < 5; i++) { - err = link(pid_file, MTab "~"); - if (!err) - break; - sleep(1); - } - if (err) - AuFin(MTab "~"); -} - -static void unlock_mtab(void) -{ - int err; - - err = rename(MTab "~", MTab); - if (err) - AuFin(MTab); -} - -static void append_mtab(FILE *fp, FILE *ofp, struct mntent *ent) -{ - int err; - struct mntent *p; - - while ((p = getmntent(ofp))) { - err = addmntent(fp, p); - if (err) - AuFin("addmntent"); - } - - err = addmntent(fp, ent); - if (err) - AuFin("addmntent"); -} - -/* todo: there are some cases which options are not changed */ -static void update_mtab(FILE *fp, char *mntpnt, int do_remount, int do_verbose) -{ - int err; - long pos; - FILE *ofp; - struct mntent ent, *p; - - /* prohibit updating mount options for this mntpnt */ - au_plink_maint(mntpnt); - err = au_proc_getmntent(mntpnt, &ent); - if (err) - AuFin("no such mount point"); - - ofp = setmntent(MTab, "r"); - if (!ofp) - AuFin(MTab); - - if (do_remount) { - /* find the last one */ - pos = -1; - while ((p = getmntent(ofp))) { - if (!strcmp(p->mnt_dir, mntpnt)) - pos = ftell(ofp); - } - rewind(ofp); - - if (pos > 0) { - while ((p = getmntent(ofp))) { - if (ftell(ofp) == pos) { - /* replace the line */ - p = &ent; - pos = -1; - } - err = addmntent(fp, p); - if (err) - AuFin("addmntent"); - } - if (pos > 0) - AuFin("internal error"); - } else - append_mtab(fp, ofp, &ent); - } else - append_mtab(fp, ofp, &ent); - - endmntent(ofp); /* ignore */ - au_plink_maint(NULL); - if (do_verbose) - au_print_ent(&ent); -} - -/* ---------------------------------------------------------------------- */ - -int au_update_mtab(char *mntpnt, int do_remount, int do_verbose) -{ - int err, fd, status, e2; - pid_t pid; - ino_t ino; - struct stat st; - struct statfs stfs; - struct flock flock = { - .l_type = F_WRLCK, - .l_whence = SEEK_SET, - .l_start = 0, - .l_len = 0 - }; - char pid_file[sizeof(MTab "~.") + 20]; - FILE *fp; - - err = statfs(MTab, &stfs); - if (stfs.f_type == PROC_SUPER_MAGIC) - return 0; - - snprintf(pid_file, sizeof(pid_file), MTab "~.%d", getpid()); - fd = open(pid_file, O_RDWR | O_CREAT | O_EXCL, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if (fd < 0) - AuFin("%s", pid_file); - err = fcntl(fd, F_SETLK, &flock); - if (err) - AuFin("%s", pid_file); - fp = fdopen(fd, "r+"); - if (!fp) - AuFin("%s", pid_file); - - pid = fork(); - if (!pid) { - lock_mtab(pid_file); - update_mtab(fp, mntpnt, do_remount, do_verbose); - unlock_mtab(); - return 0; - } else if (pid < 0) - AuFin("fork"); - - err = fstat(fd, &st); - if (err) - perror(pid_file); - ino = st.st_ino; - - err = waitpid(pid, &status, 0); - if (err < 0) { - perror(pid_file); - goto out; - } - err = !WIFEXITED(status); - if (!err) - err = WEXITSTATUS(status); - - e2 = unlink(pid_file); - if (e2 && errno != ENOENT) - perror(pid_file); - e2 = stat(MTab "~", &st); - if (!e2) { - if (st.st_ino == ino) { - /* - * The inode number is same, - * it means it is we who made the file. - * If someone else removed our file between stat(2) and - * unlink(2), it is a breakage of the rule. - */ - e2 = unlink(MTab "~"); - if (e2) - perror(MTab); - } - } else if (errno != ENOENT) - perror(MTab "~"); - fclose(fp); - - out: - return err; -} |