summaryrefslogtreecommitdiff
path: root/findmount.c
diff options
context:
space:
mode:
authorEric Andersen1999-10-05 16:24:54 +0000
committerEric Andersen1999-10-05 16:24:54 +0000
commitcc8ed39b240180b58810784f844e253263594ac3 (patch)
tree15feebbb4be9a9168209609f48f0b100f9364420 /findmount.c
downloadbusybox-cc8ed39b240180b58810784f844e253263594ac3.zip
busybox-cc8ed39b240180b58810784f844e253263594ac3.tar.gz
Initial revision0_29alpha2
Diffstat (limited to 'findmount.c')
-rw-r--r--findmount.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/findmount.c b/findmount.c
new file mode 100644
index 0000000..26e28fc
--- /dev/null
+++ b/findmount.c
@@ -0,0 +1,46 @@
+#include "internal.h"
+#include <stdio.h>
+#include <mntent.h>
+#include <sys/stat.h>
+
+/*
+ * Given a block device, find the mount table entry if that block device
+ * is mounted.
+ *
+ * Given any other file (or directory), find the mount table entry for its
+ * filesystem.
+ */
+extern struct mntent *
+findMountPoint(const char * name, const char * table)
+{
+ struct stat s;
+ dev_t mountDevice;
+ FILE * mountTable;
+ struct mntent * mountEntry;
+
+ if ( stat(name, &s) != 0 )
+ return 0;
+
+ if ( (s.st_mode & S_IFMT) == S_IFBLK )
+ mountDevice = s.st_rdev;
+ else
+ mountDevice = s.st_dev;
+
+
+ if ( (mountTable = setmntent(table, "r")) == 0 )
+ return 0;
+
+ while ( (mountEntry = getmntent(mountTable)) != 0 ) {
+ if ( strcmp(name, mountEntry->mnt_dir) == 0
+ || strcmp(name, mountEntry->mnt_fsname) == 0 ) /* String match. */
+ break;
+ if ( stat(mountEntry->mnt_fsname, &s) == 0
+ && s.st_rdev == mountDevice ) /* Match the device. */
+ break;
+ if ( stat(mountEntry->mnt_dir, &s) == 0
+ && s.st_dev == mountDevice ) /* Match the directory's mount point. */
+ break;
+ }
+ endmntent(mountTable);
+ return mountEntry;
+}