You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.8 KiB
67 lines
1.8 KiB
/* mountpoint.c - Check if a directory is a mountpoint.
|
|
*
|
|
* Copyright 2012 Elie De Brauwer <eliedebrauwer@gmail.com>
|
|
|
|
USE_MOUNTPOINT(NEWTOY(mountpoint, "<1qdx[-dx]", TOYFLAG_BIN))
|
|
|
|
config MOUNTPOINT
|
|
bool "mountpoint"
|
|
default y
|
|
help
|
|
usage: mountpoint [-qd] DIR
|
|
mountpoint [-qx] DEVICE
|
|
|
|
Check whether the directory or device is a mountpoint.
|
|
|
|
-q Be quiet, return zero if directory is a mountpoint
|
|
-d Print major/minor device number of the directory
|
|
-x Print major/minor device number of the block device
|
|
*/
|
|
|
|
#define FOR_mountpoint
|
|
#include "toys.h"
|
|
|
|
static void die(char *gripe)
|
|
{
|
|
if (!(toys.optflags & FLAG_q)) printf("%s: not a %s\n", *toys.optargs, gripe);
|
|
|
|
toys.exitval++;
|
|
xexit();
|
|
}
|
|
|
|
void mountpoint_main(void)
|
|
{
|
|
struct stat st1, st2;
|
|
char *arg = *toys.optargs;
|
|
int quiet = toys.optflags & FLAG_q;
|
|
|
|
if (lstat(arg, &st1)) perror_exit_raw(arg);
|
|
|
|
if (toys.optflags & FLAG_x) {
|
|
if (S_ISBLK(st1.st_mode)) {
|
|
if (!quiet)
|
|
printf("%u:%u\n", dev_major(st1.st_rdev), dev_minor(st1.st_rdev));
|
|
|
|
return;
|
|
}
|
|
die("block device");
|
|
}
|
|
|
|
// TODO: Ignore the fact a file can be a mountpoint for --bind mounts.
|
|
if (!S_ISDIR(st1.st_mode)) die("directory");
|
|
|
|
arg = xmprintf("%s/..", arg);
|
|
xstat(arg, &st2);
|
|
if (CFG_TOYBOX_FREE) free(arg);
|
|
|
|
// If the device is different, it's a mount point. If the device _and_
|
|
// inode are the same, it's probably "/". This misses --bind mounts from
|
|
// elsewhere in the same filesystem, but so does the other one and in the
|
|
// absence of a spec I guess that's the expected behavior?
|
|
toys.exitval = !(st1.st_dev != st2.st_dev || st1.st_ino == st2.st_ino);
|
|
if (toys.optflags & FLAG_d)
|
|
printf("%u:%u\n", dev_major(st1.st_dev), dev_minor(st1.st_dev));
|
|
else if (!quiet)
|
|
printf("%s is %sa mountpoint\n", *toys.optargs, toys.exitval ? "not " : "");
|
|
}
|