*/
#include <acess.h>
#include <disktool_common.h>
-#include <ctype.h>
+#include <Storage/LVM/include/lvm.h>
// === IMPORTS ===
extern int NativeFS_Install(char **Arguments);
// === PROTOTYPES ===
void DiskTool_Initialise(void) __attribute__((constructor(101)));
-size_t DiskTool_int_TranslatePath(char *Buffer, const char *Path);
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);
+
+// === GLOBALS ===
+tLVM_VolType gDiskTool_VolumeType = {
+ .Name = "DiskTool",
+ .Read = DiskTook_LVM_Read,
+ .Write = DiskTook_LVM_Write
+};
// === CODE ===
void DiskTool_Initialise(void)
VFS_Mount("/", "/Native", "nativefs", "");
}
+int DiskTool_RegisterLVM(const char *Identifier, const char *Path)
+{
+ int fd = DiskTool_int_TranslateOpen(Path, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE);
+ if(fd == -1)
+ return -1;
+ VFS_Seek(fd, 0, SEEK_END);
+ LVM_AddVolume( &gDiskTool_VolumeType, Identifier, (void*)(tVAddr)fd, 512, VFS_Tell(fd)/512);
+ return 0;
+}
+
int DiskTool_MountImage(const char *Identifier, const char *Path)
{
// Validate Identifier and make mountpoint string
int DiskTool_Copy(const char *Source, const char *Destination)
{
- return -1;
+ int src = DiskTool_int_TranslateOpen(Source, VFS_OPENFLAG_READ);
+ if( src == -1 ) {
+ Log_Error("DiskTool", "Unable to open %s for reading", Source);
+ return -1;
+ }
+ int dst = DiskTool_int_TranslateOpen(Destination, VFS_OPENFLAG_WRITE|VFS_OPENFLAG_CREATE);
+ if( dst == -1 ) {
+ Log_Error("DiskTool", "Unable to open %s for writing", Destination);
+ VFS_Close(src);
+ return -1;
+ }
+
+ char buf[1024];
+ size_t len, total = 0;
+ while( (len = VFS_Read(src, sizeof(buf), buf)) == sizeof(buf) ) {
+ VFS_Write(dst, len, buf);
+ total += len;
+ }
+ VFS_Write(dst, len, buf), total += len;
+
+ Log_Notice("DiskTool", "Copied %i from %s to %s", total, Source, Destination);
+
+ VFS_Close(dst);
+ VFS_Close(src);
+
+ return 0;
}
-// --- Internal helpers ---
-size_t DiskTool_int_TranslatePath(char *Buffer, const char *Path)
+int DiskTool_ListDirectory(const char *Directory)
{
- const char *colon = strchr(Path, ':');
- if( colon )
- {
- const char *pos;
- for(pos = Path; pos < colon; pos ++)
- {
- if( !isalpha(*pos) )
- goto native_path;
- }
-
+ int fd = DiskTool_int_TranslateOpen(Directory, VFS_OPENFLAG_READ|VFS_OPENFLAG_DIRECTORY);
+ if(fd == -1) {
+// fprintf(stderr, "Can't open '%s'\n", Directory);
return -1;
}
-
-native_path: {
- int len = strlen("/Native");
- len += strlen( getenv("PWD") ) + 1;
- len += strlen(Path);
- if( Buffer ) {
- strcpy(Buffer, "/Native");
- strcat(Buffer, getenv("PWD"));
- strcat(Buffer, "/");
- strcat(Buffer, Path);
- }
- return len;
+
+ Log("Directory listing of '%s'", Directory);
+
+ char name[256];
+ while( VFS_ReadDir(fd, name) )
+ {
+ Log("- %s", name);
}
+
+ VFS_Close(fd);
+
+ return 0;
+}
+
+int DiskTook_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)
+{
+ VFS_WriteAt( (int)(tVAddr)Handle, Block*512, BlockCount*512, Dest);
+ return 0;
}
-int DiskTool_int_TranslateOpen(const char *File, int Mode)
+// --- Internal helpers ---
+int DiskTool_int_TranslateOpen(const char *File, int Flags)
{
- // Determine if the source is a mounted image or a file on the source FS
- return -1;
+ size_t tpath_len = DiskTool_int_TranslatePath(NULL, File);
+ if(tpath_len == -1)
+ return -1;
+ char tpath[tpath_len-1];
+ DiskTool_int_TranslatePath(tpath, File);
+
+ return VFS_Open(tpath, Flags);
}