558
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
1 /* vi: set sw=4 ts=4:
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
2 *
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
3 * mountpoint.c - Check if a directory is a mountpoint.
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
4 *
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
5 * Copyright 2012 Elie De Brauwer <eliedebrauwer@gmail.com>
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
6 *
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
7 * Not in SUSv4.
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
8
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
9 USE_MOUNTPOINT(NEWTOY(mountpoint, "<1qdx", TOYFLAG_BIN))
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
10
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
11 config MOUNTPOINT
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
12 bool "mountpoint"
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
13 default y
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
14 help
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
15 usage: mountpoint [-q] [-d] directory
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
16 mountpoint [-q] [-x] device
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
17 -q Be quiet, return zero if directory is a mountpoint
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
18 -d Print major/minor device number of the directory
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
19 -x Print major/minor device number of the block device
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
20 */
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
21
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
22 #include "toys.h"
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
23
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
24 void mountpoint_main(void)
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
25 {
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
26 struct stat st1, st2;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
27 int res = 0;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
28 int quiet = toys.optflags & 0x4;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
29 toys.exitval = 1; // be pessimistic
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
30 strncpy(toybuf, toys.optargs[0], sizeof(toybuf));
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
31 if (((toys.optflags & 0x1) && lstat(toybuf, &st1)) || stat(toybuf, &st1))
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
32 perror_exit("%s", toybuf);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
33
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
34 if (toys.optflags & 0x1){
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
35 if (S_ISBLK(st1.st_mode)) {
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
36 if (!quiet) printf("%u:%u\n", major(st1.st_rdev), minor(st1.st_rdev));
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
37 toys.exitval = 0;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
38 return;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
39 }
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
40 if (!quiet) printf("%s: not a block device\n", toybuf);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
41 return;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
42 }
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
43
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
44 if(!S_ISDIR(st1.st_mode)){
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
45 if (!quiet) printf("%s: not a directory\n", toybuf);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
46 return;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
47 }
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
48 strncat(toybuf, "/..", sizeof(toybuf));
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
49 stat(toybuf, &st2);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
50 res = (st1.st_dev != st2.st_dev) ||
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
51 (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino);
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
52 if (!quiet) printf("%s is %sa mountpoint\n", toys.optargs[0], res ? "" : "not ");
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
53 if (toys.optflags & 0x2)
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
54 printf("%u:%u\n", major(st1.st_dev), minor(st1.st_dev));
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
55 toys.exitval = res ? 0 : 1;
|
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
56 }
|