DiskTool - Mounts successfully, debugging readdir
[tpg/acess2.git] / Tools / DiskTool / src / actions.c
1 /*
2  * Acess2 DiskTool
3  * - By John Hodge (thePowersGang)
4  *
5  * actions.c
6  * - High level actions that call the VFS
7  * # Kernel-space compiled
8  */
9 #include <acess.h>
10 #include <disktool_common.h>
11 #include <ctype.h>
12
13 // === IMPORTS ===
14 extern int      NativeFS_Install(char **Arguments);
15
16 // === PROTOTYPES ===
17 void    DiskTool_Initialise(void)       __attribute__((constructor(101)));
18 size_t  DiskTool_int_TranslatePath(char *Buffer, const char *Path);
19  int    DiskTool_int_TranslateOpen(const char *File, int Mode);
20
21 // === CODE ===
22 void DiskTool_Initialise(void)
23 {
24         VFS_Init();
25         NativeFS_Install(NULL);
26         VFS_MkDir("/Native");
27         VFS_Mount("/", "/Native", "nativefs", "");
28 }
29
30 int DiskTool_MountImage(const char *Identifier, const char *Path)
31 {
32         // Validate Identifier and make mountpoint string
33         char mountpoint[sizeof("/Mount/") + strlen(Identifier) + 1];
34         strcpy(mountpoint, "/Mount/");
35         strcat(mountpoint, Identifier);
36         
37         // Translate path       
38         size_t tpath_len = DiskTool_int_TranslatePath(NULL, Path);
39         if(tpath_len == -1)
40                 return -1;
41         char tpath[tpath_len-1];
42         DiskTool_int_TranslatePath(tpath, Path);
43         
44         // Call mount
45         // TODO: Detect filesystem?
46         return VFS_Mount(tpath, mountpoint, "fat", "");
47 }
48
49 int DiskTool_Copy(const char *Source, const char *Destination)
50 {
51         return -1;
52 }
53
54 int DiskTool_ListDirectory(const char *Directory)
55 {
56         int fd = DiskTool_int_TranslateOpen(Directory, 2);
57         if(fd == -1) {
58 //              fprintf(stderr, "Can't open '%s'\n", Directory);
59                 return -1;
60         }
61
62         printf("Directory listing of '%s'\n", Directory);       
63
64         char    name[256];
65         while( VFS_ReadDir(fd, name) )
66         {
67                 printf("%s\n", name);
68         }
69         
70         VFS_Close(fd);
71         
72         return 0;
73 }
74
75 // --- Internal helpers ---
76 size_t DiskTool_int_TranslatePath(char *Buffer, const char *Path)
77 {
78          int    len;
79         const char *colon = strchr(Path, ':');
80         if( colon )
81         {
82                 const char *pos;
83                 for(pos = Path; pos < colon; pos ++)
84                 {
85                         if( !isalpha(*pos) )
86                                 goto native_path;
87                 }
88                 
89                 len = strlen("/Mount/");
90                 len += strlen(Path);
91                 if( Buffer ) {
92                         strcpy(Buffer, "/Mount/");
93                         strncat(Buffer+strlen("/Mount/"), Path, colon - Path);
94                         strcat(Buffer, colon + 1);
95                 }
96                 return len;
97         }
98         
99 native_path:
100         len = strlen("/Native");
101         len += strlen( getenv("PWD") ) + 1;
102         len += strlen(Path);
103         if( Buffer ) {
104                 strcpy(Buffer, "/Native");
105                 strcat(Buffer, getenv("PWD"));
106                 strcat(Buffer, "/");
107                 strcat(Buffer, Path);
108         }
109         return len;
110 }
111
112 int DiskTool_int_TranslateOpen(const char *File, int Mode)
113 {
114         size_t tpath_len = DiskTool_int_TranslatePath(NULL, File);
115         if(tpath_len == -1)
116                 return -1;
117         char tpath[tpath_len-1];
118         DiskTool_int_TranslatePath(tpath, File);
119
120 //      printf("Opening '%s'\n", tpath);        
121
122         switch(Mode)
123         {
124         case 0: // Read
125                 return VFS_Open(tpath, VFS_OPENFLAG_READ);
126         case 1: // Write
127                 return VFS_Open(tpath, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE);
128         case 2: // Directory
129                 return VFS_Open(tpath, VFS_OPENFLAG_READ|VFS_OPENFLAG_EXEC);
130         default:
131                 return -1;
132         }
133 }
134

UCC git Repository :: git.ucc.asn.au