Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / KernelLand / Kernel / vfs / main.c
1 /* 
2  * Acess 2
3  * Virtual File System
4  */
5 #include <acess.h>
6 #include <fs_sysfs.h>
7 #include <threads.h>
8 #include <vfs.h>
9 #include <vfs_int.h>
10 #include <vfs_ext.h>
11
12 // === IMPORTS ===
13 extern tVFS_Driver      gRootFS_Info;
14 extern tVFS_Driver      gDevFS_Info;
15
16 // === PROTOTYPES ===
17 #if 0
18  int    VFS_Init(void);
19 char    *VFS_GetTruePath(const char *Path);
20 void    VFS_GetMemPath(char *Dest, void *Base, Uint Length);
21 tVFS_Driver     *VFS_GetFSByName(const char *Name);
22  int    VFS_AddDriver(tVFS_Driver *Info);
23 #endif
24 void    VFS_UpdateDriverFile(void);
25
26 // === EXPORTS ===
27 EXPORT(VFS_AddDriver);
28
29 // === GLOBALS ===
30 tVFS_Node       NULLNode = {.Type=NULL};
31 tShortSpinlock  slDriverListLock;
32 tVFS_Driver     *gVFS_Drivers = NULL;
33 char    *gsVFS_DriverFile = NULL;
34  int    giVFS_DriverFileID = 0;
35
36 char    *gsVFS_MountFile = NULL;
37  int    giVFS_MountFileID = 0;
38
39 // === CODE ===
40 /**
41  * \fn int VFS_Init(void)
42  * \brief Initialises the VFS for use by the kernel and user
43  */
44 int VFS_Init(void)
45 {
46         // Core Drivers
47         gVFS_Drivers = &gRootFS_Info;
48         gVFS_Drivers->Next = &gDevFS_Info;
49         VFS_UpdateDriverFile();
50         
51         // Register with SysFS
52         giVFS_MountFileID = SysFS_RegisterFile("VFS/Mounts", NULL, 0);
53         giVFS_DriverFileID = SysFS_RegisterFile("VFS/Drivers", NULL, 0);
54         
55         if( VFS_Mount("root", "/", "rootfs", "") != 0 ) {
56                 Log_KernelPanic("VFS", "Unable to mount root (Where the **** is rootfs?)");
57                 return -1;
58         }
59         VFS_MkDir("/Devices");
60         VFS_MkDir("/Mount");
61         VFS_Mount("dev", "/Devices", "devfs", "");
62         
63         // Set default max user file count
64         // - Applies to PID0, but propagated to all children
65         *Threads_GetMaxFD(NULL) = 32;
66         return 0;
67 }
68
69 void VFS_Deinit(void)
70 {
71         SysFS_RemoveFile(giVFS_MountFileID);
72         free(gsVFS_MountFile);
73         SysFS_RemoveFile(giVFS_DriverFileID);
74         free(gsVFS_DriverFile);
75 }
76
77 /**
78  * \fn char *VFS_GetTruePath(const char *Path)
79  * \brief Gets the true path (non-symlink) of a file
80  */
81 char *VFS_GetTruePath(const char *Path)
82 {
83         tVFS_Node       *node;
84         char    *ret, *tmp;
85         
86         tmp = VFS_GetAbsPath(Path);
87         if(tmp == NULL) return NULL;
88         //Log(" VFS_GetTruePath: tmp = '%s'", tmp);
89         node = VFS_ParsePath(tmp, &ret, NULL);
90         free(tmp);
91         //Log(" VFS_GetTruePath: node=%p, ret='%s'", node, ret);
92         
93         if(!node)       return NULL;
94         if(node->Type->Close)   node->Type->Close(node);
95         
96         return ret;
97 }
98
99 /**
100  * \fn void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
101  * \brief Create a VFS memory pointer path
102  */
103 void VFS_GetMemPath(char *Dest, void *Base, Uint Length)
104 {
105         Dest[0] = '$';
106         itoa( &Dest[1], (tVAddr)Base, 16, BITS/4, '0' );
107         Dest[BITS/4+1] = ':';
108         itoa( &Dest[BITS/4+2], Length, 16, BITS/4, '0' );
109         Dest[BITS/2+2] = '\0';
110 }
111
112 /**
113  * \fn tVFS_Driver *VFS_GetFSByName(const char *Name)
114  * \brief Gets a filesystem structure given a name
115  */
116 tVFS_Driver *VFS_GetFSByName(const char *Name)
117 {
118         tVFS_Driver     *drv = gVFS_Drivers;
119         
120         for(;drv;drv=drv->Next)
121         {
122 //              Log("strcmp('%s' (%p), '%s') == 0?", drv->Name, drv->Name, Name);
123                 if(strcmp(drv->Name, Name) == 0)
124                         return drv;
125         }
126         return NULL;
127 }
128
129 /**
130  * \fn int VFS_AddDriver(tVFS_Driver *Info)
131  */
132 int VFS_AddDriver(tVFS_Driver *Info)
133 {
134         if(!Info)       return  -1;
135         
136         SHORTLOCK( &slDriverListLock );
137         Info->Next = gVFS_Drivers;
138         gVFS_Drivers = Info;
139         SHORTREL( &slDriverListLock );
140         
141         VFS_UpdateDriverFile();
142         
143         return 0;
144 }
145
146 /**
147  * \fn void VFS_UpdateDriverFile(void)
148  * \brief Updates the driver list file
149  */
150 void VFS_UpdateDriverFile(void)
151 {
152         tVFS_Driver     *drv;
153          int    len = 0;
154         char    *buf;
155         
156         // Format:
157         // <name>\n
158         for( drv = gVFS_Drivers; drv; drv = drv->Next )
159         {
160                 len += 1 + strlen(drv->Name);
161         }
162         buf = malloc(len+1);
163         len = 0;
164         for( drv = gVFS_Drivers; drv; drv = drv->Next )
165         {
166                 strcpy( &buf[len], drv->Name );
167                 len += strlen(drv->Name);
168                 buf[len++] = '\n';
169         }
170         buf[len] = '\0';
171         
172         SysFS_UpdateFile( giVFS_DriverFileID, buf, len );
173         if(gsVFS_DriverFile)    free(gsVFS_DriverFile);
174         gsVFS_DriverFile = buf;
175 }
176
177 void VFS_CleanupNode(tVFS_Node *Node)
178 {
179         
180 }
181

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