blob: 3e5fb4b460ba1874cd0e674230e9e79a8aad636a [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{
16 int opt = bb_getopt_ulflags(argc, argv, "qdx");
17#define OPT_q (1)
18#define OPT_d (2)
19#define OPT_x (4)
20
21 if (optind != argc - 1)
22 bb_show_usage();
23 {
24 char *arg = argv[optind];
25 struct stat st;
26
27 if ( (opt & OPT_x && stat(arg, &st) == 0) || (lstat(arg, &st) == 0) ) {
28 if (opt & OPT_x) {
29 if (S_ISBLK(st.st_mode))
30 {
31 bb_printf("%u:%u\n", major(st.st_rdev),
32 minor(st.st_rdev));
33 return EXIT_SUCCESS;
34 } else {
35 if (opt & OPT_q)
36 putchar('\n');
37 else
38 bb_error_msg("%s: not a block device", arg);
39 }
40 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;
Rob Landleyd921b2e2006-08-03 15:41:12 +000045 char *p = xasprintf("%s/..", arg);
Tim Rikerc1ef7bd2006-01-25 00:08:53 +000046
Rob Landleyd00b3a52005-08-20 05:07:08 +000047 if (stat(p, &st) == 0) {
48 short ret = (st_dev != st.st_dev) ||
49 (st_dev == st.st_dev && st_ino == st.st_ino);
50 if (opt & OPT_d)
51 bb_printf("%u:%u\n", major(st_dev), minor(st_dev));
52 else if (!(opt & OPT_q))
53 bb_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;
60 }
61 }
62 if (!(opt & OPT_q))
Mike Frysinger948a09d2006-03-23 02:07:20 +000063 bb_perror_msg("%s", arg);
Rob Landleyd00b3a52005-08-20 05:07:08 +000064 return EXIT_FAILURE;
65 }
66}