// //this code was developed my Miklos Szeredi <miklos@szeredi.hu> //and modified by Ram Pai <linuxram@us.ibm.com> // sample usage: // newmount /tmp shared // #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/mount.h> #include <sys/fsuid.h> #ifndef MS_REC #define MS_REC 0x4000 /* 16384: Recursive loopback */ #endif #ifndef MS_SHARED #define MS_SHARED 1<<20 /* Shared */ #endif #ifndef MS_PRIVATE #define MS_PRIVATE 1<<18 /* Private */ #endif #ifndef MS_SLAVE #define MS_SLAVE 1<<19 /* Slave */ #endif #ifndef MS_UNCLONE #define MS_UNCLONE 1<<17 /* UNCLONE */ #endif int main(int argc, char *argv[]) { int type; if (argc != 3) { fprintf(stderr, "usage: %s DIR " "[rshared|rslave|rprivate|runclone|shared|slave|private|unclone]\n", argv[0]); return 1; } fprintf(stdout, "%s %s %s\n", argv[0], argv[1], argv[2]); if (strcmp(argv[2], "rshared") == 0) type = (MS_SHARED | MS_REC); else if (strcmp(argv[2], "rslave") == 0) type = (MS_SLAVE | MS_REC); else if (strcmp(argv[2], "rprivate") == 0) type = (MS_PRIVATE | MS_REC); else if (strcmp(argv[2], "runclone") == 0) type = (MS_UNCLONE | MS_REC); else if (strcmp(argv[2], "shared") == 0) type = MS_SHARED; else if (strcmp(argv[2], "slave") == 0) type = MS_SLAVE; else if (strcmp(argv[2], "private") == 0) type = MS_PRIVATE; else if (strcmp(argv[2], "unclone") == 0) type = MS_UNCLONE; else { fprintf(stderr, "invalid operation: %s\n", argv[2]); return 1; } setfsuid(getuid()); if (mount("", argv[1], "ext2", type, "") == -1) { perror("mount"); return 1; } return 0; }