74 lines
1.6 KiB
C
74 lines
1.6 KiB
C
//
|
|
//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;
|
|
}
|