#include <stdio.h>
#define MOUNTABLE_FILE "/Acess/Conf/Mountable"
-#define MOUNTED_FILE "/Devices/System/VFS/Mounts"
+#define MOUNTED_FILE "/Devices/system/VFS/Mounts"
// === PROTOTYPES ===
-void ShowUsage();
+void ShowUsage(char *ProgName);
int GetMountDefs(char *Ident, char **spDevice, char **spDir, char **spType, char **spOptions);
// === CODE ===
int fd;
int i;
char *arg;
+
char *sType = NULL;
char *sDevice = NULL;
char *sDir = NULL;
char *sOptions = NULL;
+ int bUnmount = 0;
+
+ // List mounted filesystems
+ // - This is cheating, isn't it?
+ if(argc == 1) {
+ // Dump the contents of /Devices/system/VFS/Mounts
+ FILE *fp = fopen(MOUNTED_FILE, "r");
+ char buf[1024];
+ int len;
+ while( (len = fread(buf, 1024, 1, fp)) )
+ fwrite(buf, len, 1, stdout);
+ printf("\n");
+ return 0;
+ }
if(argc < 3) {
- ShowUsage();
+ ShowUsage(argv[0]);
return EXIT_FAILURE;
}
{
// -t <driver> :: Filesystem driver to use
case 't': sType = argv[++i]; break;
+ // -o option_list :: Options to pass the driver
+ case 'o': sOptions = argv[++i]; break;
+ // -u :: Unmount
+ case 'u': bUnmount = 1; break;
case '-':
//TODO: Long Arguments
default:
return EXIT_FAILURE;
}
+ if( bUnmount )
+ {
+ // TODO: Check for a match in the fstab
+
+ if( sDir ) {
+ fprintf(stderr, "`mount -u` takes one argument\n");
+ }
+
+ sDir = sDevice;
+ if( _SysMount(NULL, sDir, NULL, NULL) ) // Unmount (Dev=NULL means unmount)
+ {
+ fprintf(stderr, "Unmount failed\n");
+ }
+ return EXIT_SUCCESS;
+ }
+
// Check if we even got a device/mountpoint
if(sDevice == NULL) {
ShowUsage(argv[0]);
// If no directory was passed (we want to use the mount list)
// or we are not root (we need to use the mount list)
// Check the mount list
- if(sDir == NULL || getuid() != 0)
+ if(sDir == NULL || _SysGetUID() != 0)
{
// Check if it is defined in the mounts file
// - At this point sDevice could be a device name or a mount point
else
{
// Check that we were passed a filesystem type
- if(sType == NULL) {
- fprintf(stderr, "Please pass a filesystem type\n");
- return EXIT_FAILURE;
- }
+// if(sType == NULL) {
+// fprintf(stderr, "Please pass a filesystem type\n");
+// return EXIT_FAILURE;
+// }
}
// Check Device
- fd = open(sDevice, OPENFLAG_READ);
+ fd = _SysOpen(sDevice, OPENFLAG_READ);
if(fd == -1) {
printf("Device '%s' cannot be opened for reading\n", sDevice);
return EXIT_FAILURE;
}
- close(fd);
+ _SysClose(fd);
// Check Mount Point
- fd = open(sDir, OPENFLAG_EXEC);
+ fd = _SysOpen(sDir, OPENFLAG_EXEC);
if(fd == -1) {
printf("Directory '%s' does not exist\n", sDir);
return EXIT_FAILURE;
}
- close(fd);
+ _SysClose(fd);
// Replace sOptions with an empty string if it is still NULL
if(sOptions == NULL) sOptions = "";
// Let's Mount!
- _SysMount(sDevice, sDir, sType, sOptions);
+ if( _SysMount(sDevice, sDir, sType, sOptions) ) {
+// perror("_SysMount");
+ if( !sType )
+ fprintf(stderr, "Filesystem autodetection failed, please pass a type\n");
+ else {
+ fprintf(stderr, "Mount %s:'%s'=>'%s' failed\n", sType, sDevice, sDir);
+ }
+ }
return 0;
}
void ShowUsage(char *ProgName)
{
- fprintf(stderr, "Usage:\n", ProgName);
- fprintf(stderr, " %s [-t <type>] <device> <directory>\n");
- fprintf(stderr, "or %s <device>\n");
- fprintf(stderr, "or %s <directory>\n");
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, " %s [-t <type>] <device> <directory> [-o <options>]\n", ProgName);
+ fprintf(stderr, "or %s <device>\n", ProgName);
+ fprintf(stderr, "or %s <directory>\n", ProgName);
+ fprintf(stderr, "or %s\n", ProgName);
}
/**