Merge branch 'issue832' of https://github.com/kerolasa/util-linux
* 'issue832' of https://github.com/kerolasa/util-linux: mountpoint: add --nofollow option
This commit is contained in:
commit
cd38987bf4
|
@ -11,7 +11,7 @@ _mountpoint_module()
|
||||||
esac
|
esac
|
||||||
case $cur in
|
case $cur in
|
||||||
-*)
|
-*)
|
||||||
OPTS="--quiet --fs-devno --devno --help --version"
|
OPTS="--quiet --nofollow --fs-devno --devno --help --version"
|
||||||
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
|
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH MOUNTPOINT 1 "July 2014" "util-linux" "User Commands"
|
.TH MOUNTPOINT 1 "August 2019" "util-linux" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
mountpoint \- see if a directory or file is a mountpoint
|
mountpoint \- see if a directory or file is a mountpoint
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -28,6 +28,11 @@ directory.
|
||||||
.BR \-q , " \-\-quiet"
|
.BR \-q , " \-\-quiet"
|
||||||
Be quiet - don't print anything.
|
Be quiet - don't print anything.
|
||||||
.TP
|
.TP
|
||||||
|
.B "\-\-nofollow"
|
||||||
|
Do not follow symbolic link if it the last elemnt of the
|
||||||
|
.I directory
|
||||||
|
path.
|
||||||
|
.TP
|
||||||
.BR \-x , " \-\-devno"
|
.BR \-x , " \-\-devno"
|
||||||
Show the major/minor numbers of the given blockdevice on standard output.
|
Show the major/minor numbers of the given blockdevice on standard output.
|
||||||
.TP
|
.TP
|
||||||
|
|
|
@ -47,6 +47,7 @@ struct mountpoint_control {
|
||||||
unsigned int
|
unsigned int
|
||||||
dev_devno:1,
|
dev_devno:1,
|
||||||
fs_devno:1,
|
fs_devno:1,
|
||||||
|
nofollow:1,
|
||||||
quiet:1;
|
quiet:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -123,6 +124,7 @@ static void __attribute__((__noreturn__)) usage(void)
|
||||||
|
|
||||||
fputs(USAGE_OPTIONS, out);
|
fputs(USAGE_OPTIONS, out);
|
||||||
fputs(_(" -q, --quiet quiet mode - don't print anything\n"
|
fputs(_(" -q, --quiet quiet mode - don't print anything\n"
|
||||||
|
" --nofollow do not follow symlink\n"
|
||||||
" -d, --fs-devno print maj:min device number of the filesystem\n"
|
" -d, --fs-devno print maj:min device number of the filesystem\n"
|
||||||
" -x, --devno print maj:min device number of the block device\n"), out);
|
" -x, --devno print maj:min device number of the block device\n"), out);
|
||||||
fputs(USAGE_SEPARATOR, out);
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
@ -137,8 +139,13 @@ int main(int argc, char **argv)
|
||||||
int c;
|
int c;
|
||||||
struct mountpoint_control ctl = { NULL };
|
struct mountpoint_control ctl = { NULL };
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OPT_NOFOLLOW = CHAR_MAX + 1
|
||||||
|
};
|
||||||
|
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "quiet", no_argument, NULL, 'q' },
|
{ "quiet", no_argument, NULL, 'q' },
|
||||||
|
{ "nofollow", no_argument, NULL, OPT_NOFOLLOW },
|
||||||
{ "fs-devno", no_argument, NULL, 'd' },
|
{ "fs-devno", no_argument, NULL, 'd' },
|
||||||
{ "devno", no_argument, NULL, 'x' },
|
{ "devno", no_argument, NULL, 'x' },
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
|
@ -159,6 +166,9 @@ int main(int argc, char **argv)
|
||||||
case 'q':
|
case 'q':
|
||||||
ctl.quiet = 1;
|
ctl.quiet = 1;
|
||||||
break;
|
break;
|
||||||
|
case OPT_NOFOLLOW:
|
||||||
|
ctl.nofollow = 1;
|
||||||
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
ctl.fs_devno = 1;
|
ctl.fs_devno = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -179,17 +189,20 @@ int main(int argc, char **argv)
|
||||||
warnx(_("bad usage"));
|
warnx(_("bad usage"));
|
||||||
errtryhelp(EXIT_FAILURE);
|
errtryhelp(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
if (ctl.nofollow && ctl.dev_devno)
|
||||||
|
errx(EXIT_FAILURE, _("%s and %s are mutually exclusive"),
|
||||||
|
"--devno", "--nofollow");
|
||||||
|
|
||||||
ctl.path = argv[optind];
|
ctl.path = argv[optind];
|
||||||
|
c = ctl.nofollow ? lstat(ctl.path, &ctl.st) : stat(ctl.path, &ctl.st);
|
||||||
if (stat(ctl.path, &ctl.st)) {
|
if (c) {
|
||||||
if (!ctl.quiet)
|
if (!ctl.quiet)
|
||||||
err(EXIT_FAILURE, "%s", ctl.path);
|
err(EXIT_FAILURE, "%s", ctl.path);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (ctl.dev_devno)
|
if (ctl.dev_devno)
|
||||||
return print_devno(&ctl) ? EXIT_FAILURE : EXIT_SUCCESS;
|
return print_devno(&ctl) ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
if (dir_to_device(&ctl)) {
|
if ((ctl.nofollow && S_ISLNK(ctl.st.st_mode)) || dir_to_device(&ctl)) {
|
||||||
if (!ctl.quiet)
|
if (!ctl.quiet)
|
||||||
printf(_("%s is not a mountpoint\n"), ctl.path);
|
printf(_("%s is not a mountpoint\n"), ctl.path);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
default
|
||||||
|
./symlink-to-root is a mountpoint
|
||||||
|
0
|
||||||
|
try --nofollow
|
||||||
|
./symlink-to-root is not a mountpoint
|
||||||
|
1
|
||||||
|
mutually exclusive
|
||||||
|
mountpoint: --devno and --nofollow are mutually exclusive
|
||||||
|
1
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
TS_TOPDIR="${0%/*}/../.."
|
||||||
|
TS_DESC="mountpoint"
|
||||||
|
|
||||||
|
. $TS_TOPDIR/functions.sh
|
||||||
|
ts_init "$*"
|
||||||
|
|
||||||
|
ts_check_test_command "$TS_CMD_MOUNTPOINT"
|
||||||
|
|
||||||
|
ln -s / ./symlink-to-root
|
||||||
|
|
||||||
|
echo "default" >> $TS_OUTPUT 2>&1
|
||||||
|
$TS_CMD_MOUNTPOINT ./symlink-to-root >> $TS_OUTPUT 2>&1
|
||||||
|
echo $? >> $TS_OUTPUT 2>&1
|
||||||
|
|
||||||
|
echo "try --nofollow" >> $TS_OUTPUT 2>&1
|
||||||
|
$TS_CMD_MOUNTPOINT --nofollow ./symlink-to-root >> $TS_OUTPUT 2>&1
|
||||||
|
echo $? >> $TS_OUTPUT 2>&1
|
||||||
|
|
||||||
|
echo "mutually exclusive" >> $TS_OUTPUT 2>&1
|
||||||
|
$TS_CMD_MOUNTPOINT --devno --nofollow / >> $TS_OUTPUT 2>&1
|
||||||
|
echo $? >> $TS_OUTPUT 2>&1
|
||||||
|
|
||||||
|
rm -f ./symlink-to-root
|
||||||
|
|
||||||
|
ts_finalize
|
Loading…
Reference in New Issue