blob: b1bcab6989916ceef572170e004f11e5ba877e11 [file] [log] [blame]
Rob Landleyd00b3a52005-08-20 05:07:08 +00001/* vi: set sw=4 ts=4: */
2/*
3 * mountpoint implementation for busybox
4 *
5 * Copyright (C) 2005 Bernhard Fischer
6 *
Mike Frysingerf284c762006-04-16 20:38:26 +00007 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
Rob Landleyd00b3a52005-08-20 05:07:08 +00008 *
9 * Based on sysvinit's mountpoint
10 */
11
Bernhard Reutner-Fischerc89982d2006-06-03 19:49:21 +000012#include "busybox.h"
Rob Landleyd00b3a52005-08-20 05:07:08 +000013
14int mountpoint_main(int argc, char **argv)
15{
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000016 struct stat st;
17 char *arg;
Denis Vlasenko67b23e62006-10-03 21:00:06 +000018 int opt = getopt32(argc, argv, "qdx");
Rob Landleyd00b3a52005-08-20 05:07:08 +000019#define OPT_q (1)
20#define OPT_d (2)
21#define OPT_x (4)
22
23 if (optind != argc - 1)
24 bb_show_usage();
Rob Landleyd00b3a52005-08-20 05:07:08 +000025
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000026 arg = argv[optind];
Tim Rikerc1ef7bd2006-01-25 00:08:53 +000027
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000028 if ( (opt & OPT_x && stat(arg, &st) == 0) || (lstat(arg, &st) == 0) ) {
29 if (opt & OPT_x) {
30 if (S_ISBLK(st.st_mode)) {
31 printf("%u:%u\n", major(st.st_rdev),
32 minor(st.st_rdev));
33 return EXIT_SUCCESS;
Rob Landleyd00b3a52005-08-20 05:07:08 +000034 } else {
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000035 if (opt & OPT_q)
36 putchar('\n');
37 else
38 bb_error_msg("%s: not a block device", arg);
Rob Landleyd00b3a52005-08-20 05:07:08 +000039 }
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000040 return EXIT_FAILURE;
41 } else
42 if (S_ISDIR(st.st_mode)) {
43 dev_t st_dev = st.st_dev;
44 ino_t st_ino = st.st_ino;
45 char *p = xasprintf("%s/..", arg);
46
47 if (stat(p, &st) == 0) {
48 int ret = (st_dev != st.st_dev) ||
49 (st_dev == st.st_dev && st_ino == st.st_ino);
50 if (opt & OPT_d)
51 printf("%u:%u\n", major(st_dev), minor(st_dev));
52 else if (!(opt & OPT_q))
53 printf("%s is %sa mountpoint\n", arg, ret?"":"not ");
54 return !ret;
55 }
56 } else {
57 if (!(opt & OPT_q))
58 bb_error_msg("%s: not a directory", arg);
59 return EXIT_FAILURE;
Rob Landleyd00b3a52005-08-20 05:07:08 +000060 }
Rob Landleyd00b3a52005-08-20 05:07:08 +000061 }
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000062 if (!(opt & OPT_q))
63 bb_perror_msg("%s", arg);
64 return EXIT_FAILURE;
Rob Landleyd00b3a52005-08-20 05:07:08 +000065}