• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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