// === IMPORTS ===
extern int NativeFS_Install(char **Arguments);
+extern int LVM_Cleanup(void);
// === PROTOTYPES ===
void DiskTool_Initialise(void) __attribute__((constructor(101)));
+void DiskTool_Cleanup(void);
int DiskTool_int_TranslateOpen(const char *File, int Mode);
- int DiskTook_LVM_Read(void *Handle, Uint64 Block, size_t BlockCount, void *Dest);
- int DiskTook_LVM_Write(void *Handle, Uint64 Block, size_t BlockCount, const void *Dest);
+ int DiskTool_LVM_Read(void *Handle, Uint64 Block, size_t BlockCount, void *Dest);
+ int DiskTool_LVM_Write(void *Handle, Uint64 Block, size_t BlockCount, const void *Dest);
+void DiskTool_LVM_Cleanup(void *Handle);
// === GLOBALS ===
tLVM_VolType gDiskTool_VolumeType = {
.Name = "DiskTool",
- .Read = DiskTook_LVM_Read,
- .Write = DiskTook_LVM_Write
+ .Read = DiskTool_LVM_Read,
+ .Write = DiskTool_LVM_Write,
+ .Cleanup = DiskTool_LVM_Cleanup
};
// === CODE ===
VFS_Mount("/", "/Native", "nativefs", "");
}
+void DiskTool_Cleanup(void)
+{
+ int vfs_rv, lvm_rv;
+ int nNochangeLoop = 0;
+ // Unmount all
+ do {
+ lvm_rv = LVM_Cleanup();
+ vfs_rv = VFS_UnmountAll();
+ Log_Debug("DiskTool", "Unmounted %i volumes", vfs_rv);
+ if( vfs_rv == 0 && lvm_rv == 0 ) {
+ nNochangeLoop ++;
+ if(nNochangeLoop == 2) {
+ Log_Error("DiskTool", "Possible handle leak");
+ break;
+ }
+ }
+ else {
+ nNochangeLoop = 0;
+ }
+ }
+ while( vfs_rv >= 0 || lvm_rv != 0 );
+}
+
int DiskTool_RegisterLVM(const char *Identifier, const char *Path)
{
int fd = DiskTool_int_TranslateOpen(Path, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE);
DiskTool_int_TranslatePath(tpath, Path);
// Call mount
+ VFS_MkDir(mountpoint);
// TODO: Detect filesystem?
return VFS_Mount(tpath, mountpoint, "fat", "");
}
return 0;
}
-int DiskTook_LVM_Read(void *Handle, Uint64 Block, size_t BlockCount, void *Dest)
+int DiskTool_LVM_Read(void *Handle, Uint64 Block, size_t BlockCount, void *Dest)
{
VFS_ReadAt( (int)(tVAddr)Handle, Block*512, BlockCount*512, Dest);
return 0;
}
-int DiskTook_LVM_Write(void *Handle, Uint64 Block, size_t BlockCount, const void *Dest)
+int DiskTool_LVM_Write(void *Handle, Uint64 Block, size_t BlockCount, const void *Dest)
{
VFS_WriteAt( (int)(tVAddr)Handle, Block*512, BlockCount*512, Dest);
return 0;
}
+void DiskTool_LVM_Cleanup(void *Handle)
+{
+ VFS_Close( (int)(tVAddr)Handle );
+}
// --- Internal helpers ---
int DiskTool_int_TranslateOpen(const char *File, int Flags)
// Parse arguments
for( int i = 1; i < argc; i ++ )
{
- if( strcmp("--image", argv[i]) == 0 || strcmp("-i", argv[i]) == 0 ) {
+ if( strcmp("mount", argv[i]) == 0 || strcmp("-i", argv[i]) == 0 ) {
// Mount an image
if( argc - i < 3 ) {
fprintf(stderr, "--image/-i takes 2 arguments (ident and path)\n");
if( DiskTool_MountImage(argv[i+1], argv[i+2]) ) {
fprintf(stderr, "Unable to mount '%s' as '%s'\n", argv[i+2], argv[i+1]);
- exit(-1);
+ break;
}
i += 2;
if( DiskTool_RegisterLVM(argv[i+1], argv[i+2]) ) {
fprintf(stderr, "Unable to register '%s' as LVM '%s'\n", argv[i+2], argv[i+1]);
- exit(-1);
+ break;
}
i += 2;
if( strcmp("ls", argv[i]) == 0 ) {
if( argc - i < 2 ) {
fprintf(stderr, "ls 1 argument (path)\n");
- exit(-1);
+ break;
}
DiskTool_ListDirectory(argv[i+1]);
if( argc - i < 3 ) {
fprintf(stderr, "cp takes 2 arguments (source and destination)\n");
- exit(-1);
+ break;
}
DiskTool_Copy(argv[i+1], argv[i+2]);
}
}
- // Unmount all
- // Clear LVM
+ DiskTool_Cleanup();
return 0;
}