1/* vi: set sw=4 ts=4: */ 2/* 3 * mountpoint implementation for busybox 4 * 5 * Copyright (C) 2005 Bernhard Fischer 6 * 7 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. 8 * 9 * Based on sysvinit's mountpoint 10 */ 11 12#include "libbb.h" 13 14int mountpoint_main(int argc, char **argv); 15int mountpoint_main(int argc, char **argv) 16{ 17 struct stat st; 18 char *arg; 19 int opt = getopt32(argv, "qdx"); 20#define OPT_q (1) 21#define OPT_d (2) 22#define OPT_x (4) 23 24 if (optind != argc - 1) 25 bb_show_usage(); 26 27 arg = argv[optind]; 28 29 if ( (opt & OPT_x && stat(arg, &st) == 0) || (lstat(arg, &st) == 0) ) { 30 if (opt & OPT_x) { 31 if (S_ISBLK(st.st_mode)) { 32 printf("%u:%u\n", major(st.st_rdev), 33 minor(st.st_rdev)); 34 return EXIT_SUCCESS; 35 } else { 36 if (opt & OPT_q) 37 putchar('\n'); 38 else 39 bb_error_msg("%s: not a block device", arg); 40 } 41 return EXIT_FAILURE; 42 } else 43 if (S_ISDIR(st.st_mode)) { 44 dev_t st_dev = st.st_dev; 45 ino_t st_ino = st.st_ino; 46 char *p = xasprintf("%s/..", arg); 47 48 if (stat(p, &st) == 0) { 49 int ret = (st_dev != st.st_dev) || 50 (st_dev == st.st_dev && st_ino == st.st_ino); 51 if (opt & OPT_d) 52 printf("%u:%u\n", major(st_dev), minor(st_dev)); 53 else if (!(opt & OPT_q)) 54 printf("%s is %sa mountpoint\n", arg, ret?"":"not "); 55 return !ret; 56 } 57 } else { 58 if (!(opt & OPT_q)) 59 bb_error_msg("%s: not a directory", arg); 60 return EXIT_FAILURE; 61 } 62 } 63 if (!(opt & OPT_q)) 64 bb_perror_msg("%s", arg); 65 return EXIT_FAILURE; 66} 67