1 //
2 //this code was developed my Miklos Szeredi <miklos@szeredi.hu>
3 //and modified by Ram Pai <linuxram@us.ibm.com>
4 // sample usage:
5 // newmount /tmp shared
6 //
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 #include <unistd.h>
12 #include <sys/mount.h>
13 #include <sys/fsuid.h>
14
15 #ifndef MS_REC
16 #define MS_REC 0x4000 /* 16384: Recursive loopback */
17 #endif
18
19 #ifndef MS_SHARED
20 #define MS_SHARED 1<<20 /* Shared */
21 #endif
22
23 #ifndef MS_PRIVATE
24 #define MS_PRIVATE 1<<18 /* Private */
25 #endif
26
27 #ifndef MS_SLAVE
28 #define MS_SLAVE 1<<19 /* Slave */
29 #endif
30
31 #ifndef MS_UNCLONE
32 #define MS_UNCLONE 1<<17 /* UNCLONE */
33 #endif
34
main(int argc,char * argv[])35 int main(int argc, char *argv[])
36 {
37 int type;
38 if (argc != 3) {
39 fprintf(stderr, "usage: %s DIR "
40 "[rshared|rslave|rprivate|runclone|shared|slave|private|unclone]\n",
41 argv[0]);
42 return 1;
43 }
44
45 fprintf(stdout, "%s %s %s\n", argv[0], argv[1], argv[2]);
46
47 if (strcmp(argv[2], "rshared") == 0)
48 type = (MS_SHARED | MS_REC);
49 else if (strcmp(argv[2], "rslave") == 0)
50 type = (MS_SLAVE | MS_REC);
51 else if (strcmp(argv[2], "rprivate") == 0)
52 type = (MS_PRIVATE | MS_REC);
53 else if (strcmp(argv[2], "runclone") == 0)
54 type = (MS_UNCLONE | MS_REC);
55 else if (strcmp(argv[2], "shared") == 0)
56 type = MS_SHARED;
57 else if (strcmp(argv[2], "slave") == 0)
58 type = MS_SLAVE;
59 else if (strcmp(argv[2], "private") == 0)
60 type = MS_PRIVATE;
61 else if (strcmp(argv[2], "unclone") == 0)
62 type = MS_UNCLONE;
63 else {
64 fprintf(stderr, "invalid operation: %s\n", argv[2]);
65 return 1;
66 }
67 setfsuid(getuid());
68 if (mount("", argv[1], "ext2", type, "") == -1) {
69 perror("mount");
70 return 1;
71 }
72 return 0;
73 }
74