From: Eric Andersen Date: Sun, 1 Apr 2001 16:01:11 +0000 (-0000) Subject: Move the mtab support stuff into libbb X-Git-Tag: 0_51~59 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=c4cef5ab063d7abb604d48610424566202dcade0;p=oweals%2Fbusybox.git Move the mtab support stuff into libbb -Erik --- diff --git a/Config.h b/Config.h index 8c7684876..bd6366558 100644 --- a/Config.h +++ b/Config.h @@ -210,7 +210,7 @@ #define BB_FEATURE_MOUNT_LOOP // // Enable support for a real /etc/mtab file instead of /proc/mounts -//#define BB_FEATURE_MOUNT_MTAB_SUPPORT +//#define BB_FEATURE_MTAB_SUPPORT // // Enable support for mounting remote NFS volumes. // You may need to mount with "-o nolock" if you are @@ -345,14 +345,6 @@ // Nothing beyond this point should ever be touched by // mere mortals so leave this stuff alone. // -#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF - #ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT - #define BB_MTAB - #endif -#else - #undef BB_MTAB -#endif -// #if defined BB_SH #if defined BB_FEATURE_COMMAND_EDITING #define BB_CMDEDIT diff --git a/Makefile b/Makefile index ba2b2c3cb..231073a96 100644 --- a/Makefile +++ b/Makefile @@ -202,7 +202,7 @@ endif # And option 4: -include applet_source_list -OBJECTS = $(APPLET_SOURCES:.c=.o) busybox.o messages.o usage.o applets.o mtab_file.o +OBJECTS = $(APPLET_SOURCES:.c=.o) busybox.o messages.o usage.o applets.o CFLAGS += $(CROSS_CFLAGS) CFLAGS += -DBB_VER='"$(VERSION)"' CFLAGS += -DBB_BT='"$(BUILDTIME)"' @@ -236,7 +236,7 @@ my_getgrgid.c my_getpwnamegid.c my_getpwuid.c my_getgrnam.c my_getpwnam.c \ recursive_action.c safe_read.c safe_strncpy.c syscalls.c \ syslog_msg_with_name.c time_string.c trim.c vdprintf.c wfopen.c xfuncs.c \ xregcomp.c error_msg_and_die.c perror_msg.c perror_msg_and_die.c \ -verror_msg.c vperror_msg.c +verror_msg.c vperror_msg.c mtab.c mtab_file.c LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC)) LIBBB_CFLAGS = -I$(LIBBB_DIR) diff --git a/applets/usage.h b/applets/usage.h index 32b34e45f..1ee2ab328 100644 --- a/applets/usage.h +++ b/applets/usage.h @@ -1067,7 +1067,7 @@ #else #define USAGE_MOUNT_LOOP(a) #endif -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT #define USAGE_MTAB(a) a #else #define USAGE_MTAB(a) diff --git a/debian/Config.h-deb b/debian/Config.h-deb index 075e23557..606204bfe 100644 --- a/debian/Config.h-deb +++ b/debian/Config.h-deb @@ -208,7 +208,7 @@ #define BB_FEATURE_MOUNT_LOOP // // Enable support for a real /etc/mtab file instead of /proc/mounts -//#define BB_FEATURE_MOUNT_MTAB_SUPPORT +//#define BB_FEATURE_MTAB_SUPPORT // // Enable support for mounting remote NFS volumes. // You may need to mount with "-o nolock" if you are @@ -343,14 +343,6 @@ // Nothing beyond this point should ever be touched by // mere mortals so leave this stuff alone. // -#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF - #ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT - #define BB_MTAB - #endif -#else - #undef BB_MTAB -#endif -// #if defined BB_SH #if defined BB_FEATURE_COMMAND_EDITING #define BB_CMDEDIT diff --git a/debian/Config.h-static b/debian/Config.h-static index fc89e329d..4cde55fda 100644 --- a/debian/Config.h-static +++ b/debian/Config.h-static @@ -208,7 +208,7 @@ #define BB_FEATURE_MOUNT_LOOP // // Enable support for a real /etc/mtab file instead of /proc/mounts -//#define BB_FEATURE_MOUNT_MTAB_SUPPORT +//#define BB_FEATURE_MTAB_SUPPORT // // Enable support for mounting remote NFS volumes. // You may need to mount with "-o nolock" if you are @@ -343,14 +343,6 @@ // Nothing beyond this point should ever be touched by // mere mortals so leave this stuff alone. // -#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF - #ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT - #define BB_MTAB - #endif -#else - #undef BB_MTAB -#endif -// #if defined BB_SH #if defined BB_FEATURE_COMMAND_EDITING #define BB_CMDEDIT diff --git a/debian/Config.h-udeb b/debian/Config.h-udeb index 4028a71da..7aeba2873 100644 --- a/debian/Config.h-udeb +++ b/debian/Config.h-udeb @@ -208,7 +208,7 @@ #define BB_FEATURE_MOUNT_LOOP // // Enable support for a real /etc/mtab file instead of /proc/mounts -//#define BB_FEATURE_MOUNT_MTAB_SUPPORT +//#define BB_FEATURE_MTAB_SUPPORT // // Enable support for mounting remote NFS volumes. // You may need to mount with "-o nolock" if you are @@ -343,14 +343,6 @@ // Nothing beyond this point should ever be touched by // mere mortals so leave this stuff alone. // -#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF - #ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT - #define BB_MTAB - #endif -#else - #undef BB_MTAB -#endif -// #if defined BB_SH #if defined BB_FEATURE_COMMAND_EDITING #define BB_CMDEDIT diff --git a/include/usage.h b/include/usage.h index 32b34e45f..1ee2ab328 100644 --- a/include/usage.h +++ b/include/usage.h @@ -1067,7 +1067,7 @@ #else #define USAGE_MOUNT_LOOP(a) #endif -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT #define USAGE_MTAB(a) a #else #define USAGE_MTAB(a) diff --git a/libbb/mtab.c b/libbb/mtab.c new file mode 100644 index 000000000..28c9978ef --- /dev/null +++ b/libbb/mtab.c @@ -0,0 +1,95 @@ +/* vi: set sw=4 ts=4: */ +#include +#include +#include +#include +#include +#include +#include "libbb.h" + +extern const char mtab_file[]; /* Defined in utility.c */ +static const int MS_RDONLY = 1; /* Mount read-only. */ + +void erase_mtab(const char *name) +{ + struct mntent entries[20]; + int count = 0; + FILE *mountTable = setmntent(mtab_file, "r"); + struct mntent *m; + + /* Check if reading the mtab file failed */ + if (mountTable == 0 + /* Bummer. fall back on trying the /proc filesystem */ + && (mountTable = setmntent("/proc/mounts", "r")) == 0) { + perror_msg("%s", mtab_file); + return; + } + + while ((m = getmntent(mountTable)) != 0) { + entries[count].mnt_fsname = strdup(m->mnt_fsname); + entries[count].mnt_dir = strdup(m->mnt_dir); + entries[count].mnt_type = strdup(m->mnt_type); + entries[count].mnt_opts = strdup(m->mnt_opts); + entries[count].mnt_freq = m->mnt_freq; + entries[count].mnt_passno = m->mnt_passno; + count++; + } + endmntent(mountTable); + if ((mountTable = setmntent(mtab_file, "w"))) { + int i; + + for (i = 0; i < count; i++) { + int result = (strcmp(entries[i].mnt_fsname, name) == 0 + || strcmp(entries[i].mnt_dir, name) == 0); + + if (result) + continue; + else + addmntent(mountTable, &entries[i]); + } + endmntent(mountTable); + } else if (errno != EROFS) + perror_msg("%s", mtab_file); +} + +void write_mtab(char *blockDevice, char *directory, + char *filesystemType, long flags, char *string_flags) +{ + FILE *mountTable = setmntent(mtab_file, "a+"); + struct mntent m; + + if (mountTable == 0) { + perror_msg("%s", mtab_file); + return; + } + if (mountTable) { + int length = strlen(directory); + + if (length > 1 && directory[length - 1] == '/') + directory[length - 1] = '\0'; + + if (filesystemType == 0) { + struct mntent *p = find_mount_point(blockDevice, "/proc/mounts"); + + if (p && p->mnt_type) + filesystemType = p->mnt_type; + } + m.mnt_fsname = blockDevice; + m.mnt_dir = directory; + m.mnt_type = filesystemType ? filesystemType : "default"; + + if (*string_flags) { + m.mnt_opts = string_flags; + } else { + if ((flags | MS_RDONLY) == flags) + m.mnt_opts = "ro"; + else + m.mnt_opts = "rw"; + } + + m.mnt_freq = 0; + m.mnt_passno = 0; + addmntent(mountTable, &m); + endmntent(mountTable); + } +} diff --git a/libbb/mtab_file.c b/libbb/mtab_file.c new file mode 100644 index 000000000..d9c3de3c3 --- /dev/null +++ b/libbb/mtab_file.c @@ -0,0 +1,52 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) tons of folks. Tracking down who wrote what + * isn't something I'm going to worry about... If you wrote something + * here, please feel free to acknowledge your work. + * + * This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Based in part on code from sash, Copyright (c) 1999 by David I. Bell + * Permission has been granted to redistribute this code under the GPL. + * + */ + +#include +#include "libbb.h" + + +/* Busybox mount uses either /proc/mounts or /dev/mtab to + * get the list of currently mounted filesystems */ +#if defined BB_MTAB +const char mtab_file[] = "/etc/mtab"; +#else +# if defined BB_FEATURE_USE_DEVPS_PATCH + const char mtab_file[] = "/dev/mtab"; +# else + const char mtab_file[] = "/proc/mounts"; +# endif +#endif + + +/* END CODE */ +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/ diff --git a/mount.c b/mount.c index 9f7ac43c1..57dc73e55 100644 --- a/mount.c +++ b/mount.c @@ -160,7 +160,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, /* If the mount was sucessful, do anything needed, then return TRUE */ if (status == 0 || fakeIt==TRUE) { -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT if (useMtab == TRUE) { erase_mtab(specialfile); // Clean any stale entries write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts); @@ -385,7 +385,7 @@ extern int mount_main(int argc, char **argv) case 'f': fakeIt = TRUE; break; -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT case 'n': useMtab = FALSE; break; diff --git a/mtab.c b/mtab.c deleted file mode 100644 index 049765775..000000000 --- a/mtab.c +++ /dev/null @@ -1,95 +0,0 @@ -/* vi: set sw=4 ts=4: */ -#include -#include -#include -#include -#include -#include -#include "busybox.h" - -extern const char mtab_file[]; /* Defined in utility.c */ -static const int MS_RDONLY = 1; /* Mount read-only. */ - -void erase_mtab(const char *name) -{ - struct mntent entries[20]; - int count = 0; - FILE *mountTable = setmntent(mtab_file, "r"); - struct mntent *m; - - /* Check if reading the mtab file failed */ - if (mountTable == 0 - /* Bummer. fall back on trying the /proc filesystem */ - && (mountTable = setmntent("/proc/mounts", "r")) == 0) { - perror_msg("%s", mtab_file); - return; - } - - while ((m = getmntent(mountTable)) != 0) { - entries[count].mnt_fsname = strdup(m->mnt_fsname); - entries[count].mnt_dir = strdup(m->mnt_dir); - entries[count].mnt_type = strdup(m->mnt_type); - entries[count].mnt_opts = strdup(m->mnt_opts); - entries[count].mnt_freq = m->mnt_freq; - entries[count].mnt_passno = m->mnt_passno; - count++; - } - endmntent(mountTable); - if ((mountTable = setmntent(mtab_file, "w"))) { - int i; - - for (i = 0; i < count; i++) { - int result = (strcmp(entries[i].mnt_fsname, name) == 0 - || strcmp(entries[i].mnt_dir, name) == 0); - - if (result) - continue; - else - addmntent(mountTable, &entries[i]); - } - endmntent(mountTable); - } else if (errno != EROFS) - perror_msg("%s", mtab_file); -} - -void write_mtab(char *blockDevice, char *directory, - char *filesystemType, long flags, char *string_flags) -{ - FILE *mountTable = setmntent(mtab_file, "a+"); - struct mntent m; - - if (mountTable == 0) { - perror_msg("%s", mtab_file); - return; - } - if (mountTable) { - int length = strlen(directory); - - if (length > 1 && directory[length - 1] == '/') - directory[length - 1] = '\0'; - - if (filesystemType == 0) { - struct mntent *p = find_mount_point(blockDevice, "/proc/mounts"); - - if (p && p->mnt_type) - filesystemType = p->mnt_type; - } - m.mnt_fsname = blockDevice; - m.mnt_dir = directory; - m.mnt_type = filesystemType ? filesystemType : "default"; - - if (*string_flags) { - m.mnt_opts = string_flags; - } else { - if ((flags | MS_RDONLY) == flags) - m.mnt_opts = "ro"; - else - m.mnt_opts = "rw"; - } - - m.mnt_freq = 0; - m.mnt_passno = 0; - addmntent(mountTable, &m); - endmntent(mountTable); - } -} diff --git a/mtab_file.c b/mtab_file.c deleted file mode 100644 index 3235e35d6..000000000 --- a/mtab_file.c +++ /dev/null @@ -1,52 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Utility routines. - * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. - * - * This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * - */ - -#include -#include "busybox.h" - - -/* Busybox mount uses either /proc/mounts or /dev/mtab to - * get the list of currently mounted filesystems */ -#if defined BB_MTAB -const char mtab_file[] = "/etc/mtab"; -#else -# if defined BB_FEATURE_USE_DEVPS_PATCH - const char mtab_file[] = "/dev/mtab"; -# else - const char mtab_file[] = "/proc/mounts"; -# endif -#endif - - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ diff --git a/umount.c b/umount.c index cc7d38d7c..3e23b9705 100644 --- a/umount.c +++ b/umount.c @@ -57,7 +57,7 @@ static int doForce = FALSE; #if defined BB_FEATURE_MOUNT_LOOP static int freeLoop = TRUE; #endif -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT static int useMtab = TRUE; #endif static int umountAll = FALSE; @@ -106,7 +106,7 @@ char *mtab_getinfo(const char *match, const char which) if (which == MTAB_GETMOUNTPT) { return cur->mountpt; } else { -#if !defined BB_MTAB +#if !defined BB_FEATURE_MTAB_SUPPORT if (strcmp(cur->device, "/dev/root") == 0) { /* Adjusts device to be the real root device, * or leaves device alone if it can't find it */ @@ -197,7 +197,7 @@ static int do_umount(const char *name) } } if (status == 0) { -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT if (useMtab == TRUE) erase_mtab(name); #endif @@ -255,7 +255,7 @@ extern int umount_main(int argc, char **argv) freeLoop = FALSE; break; #endif -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT case 'n': useMtab = FALSE; break; diff --git a/usage.h b/usage.h index 32b34e45f..1ee2ab328 100644 --- a/usage.h +++ b/usage.h @@ -1067,7 +1067,7 @@ #else #define USAGE_MOUNT_LOOP(a) #endif -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT #define USAGE_MTAB(a) a #else #define USAGE_MTAB(a) diff --git a/util-linux/mount.c b/util-linux/mount.c index 9f7ac43c1..57dc73e55 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -160,7 +160,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, /* If the mount was sucessful, do anything needed, then return TRUE */ if (status == 0 || fakeIt==TRUE) { -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT if (useMtab == TRUE) { erase_mtab(specialfile); // Clean any stale entries write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts); @@ -385,7 +385,7 @@ extern int mount_main(int argc, char **argv) case 'f': fakeIt = TRUE; break; -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT case 'n': useMtab = FALSE; break; diff --git a/util-linux/umount.c b/util-linux/umount.c index cc7d38d7c..3e23b9705 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -57,7 +57,7 @@ static int doForce = FALSE; #if defined BB_FEATURE_MOUNT_LOOP static int freeLoop = TRUE; #endif -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT static int useMtab = TRUE; #endif static int umountAll = FALSE; @@ -106,7 +106,7 @@ char *mtab_getinfo(const char *match, const char which) if (which == MTAB_GETMOUNTPT) { return cur->mountpt; } else { -#if !defined BB_MTAB +#if !defined BB_FEATURE_MTAB_SUPPORT if (strcmp(cur->device, "/dev/root") == 0) { /* Adjusts device to be the real root device, * or leaves device alone if it can't find it */ @@ -197,7 +197,7 @@ static int do_umount(const char *name) } } if (status == 0) { -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT if (useMtab == TRUE) erase_mtab(name); #endif @@ -255,7 +255,7 @@ extern int umount_main(int argc, char **argv) freeLoop = FALSE; break; #endif -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT case 'n': useMtab = FALSE; break;