Home | History | Annotate | Download | only in bin
      1 //
      2 //this code was developed my Miklos Szeredi <miklos (at) szeredi.hu>
      3 //and modified by Ram Pai <linuxram (at) 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 
     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