X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fdir.c;h=64c5d3786665e4fba131aa97240dc50e0532c92f;hb=ac01ae9668972f7fc8223d8fd68168f27c7baec0;hp=b7133c50bb54b6a2d206283bd308cbf897ad0208;hpb=f6b468cee21ebf1c9b98efec5315950aa043ead5;p=tpg%2Facess2.git diff --git a/Kernel/vfs/dir.c b/Kernel/vfs/dir.c index b7133c50..64c5d378 100644 --- a/Kernel/vfs/dir.c +++ b/Kernel/vfs/dir.c @@ -1,14 +1,20 @@ /* + * Acess2 VFS + * - Directory Management Functions */ -#include "vfs.h" -#include "vfs_int.h" +#define DEBUG 0 +#include +#include +#include // === IMPORTS === extern tVFS_Mount *gRootMount; // === PROTOTYPES === - int VFS_MkDir(char *Path); - int VFS_MkNod(char *Path, Uint Flags); +#if 0 + int VFS_MkDir(const char *Path); +#endif + int VFS_MkNod(const char *Path, Uint Flags); // === CODE === /** @@ -16,7 +22,7 @@ extern tVFS_Mount *gRootMount; * \brief Create a new node * \param Path Path of directory to create */ -int VFS_MkDir(char *Path) +int VFS_MkDir(const char *Path) { return VFS_MkNod(Path, VFS_FFLAG_DIRECTORY); } @@ -27,42 +33,56 @@ int VFS_MkDir(char *Path) * \param Path Path of new node * \param Flags Flags to apply to the node */ -int VFS_MkNod(char *Path, Uint Flags) +int VFS_MkNod(const char *Path, Uint Flags) { char *absPath, *name; - int pos=0, oldpos = 0; + int pos = 0, oldpos = 0; + int next = 0; tVFS_Node *parent; int ret; - Debug_Enter("VFS_MkNod", "sPath xFlags", Path, Flags); + ENTER("sPath xFlags", Path, Flags); absPath = VFS_GetAbsPath(Path); + LOG("absPath = '%s'", absPath); - while( (pos = strpos8(&absPath[pos+1], '/')) != -1 ) oldpos = pos; + while( (next = strpos(&absPath[pos+1], '/')) != -1 ) { + LOG("next = %i", next); + pos += next+1; + LOG("pos = %i", pos); + oldpos = pos; + } absPath[oldpos] = '\0'; // Mutilate path name = &absPath[oldpos+1]; + LOG("absPath = '%s', name = '%s'", absPath, name); + // Check for root if(absPath[0] == '\0') parent = VFS_ParsePath("/", NULL); else parent = VFS_ParsePath(absPath, NULL); - if(!parent) return -1; // Error Check + LOG("parent = %p", parent); + + if(!parent) { + LEAVE('i', -1); + return -1; // Error Check + } // Permissions Check if( !VFS_CheckACL(parent, VFS_PERM_EXECUTE|VFS_PERM_WRITE) ) { if(parent->Close) parent->Close( parent ); free(absPath); - Debug_Leave("VFS_MkNod", 'i', -1); + LEAVE('i', -1); return -1; } - Debug_Log("VFS_MkNod", "parent = %p\n", parent); + LOG("parent = %p", parent); if(parent->MkNod == NULL) { Warning("VFS_MkNod - Directory has no MkNod method"); - Debug_Leave("VFS_MkNod", 'i', -1); + LEAVE('i', -1); return -1; } @@ -76,40 +96,45 @@ int VFS_MkNod(char *Path, Uint Flags) if(parent->Close) parent->Close( parent ); // Error Check - if(ret == 0) return -1; + if(ret == 0) { + LEAVE('i', -1); + return -1; + } - Debug_Leave("VFS_MkNod", 'i', 0); + LEAVE('i', 0); return 0; } /** - * \fn int VFS_Symlink(char *Name, char *Link) + * \fn int VFS_Symlink(const char *Name, const char *Link) * \brief Creates a symlink called \a Name to \a Link * \param Name Name of symbolic link * \param Link Destination of symbolic link */ -int VFS_Symlink(char *Name, char *Link) +int VFS_Symlink(const char *Name, const char *Link) { char *realLink; int fp; tVFS_Node *destNode; + char *_link; - //LogF("vfs_symlink: (name='%s', link='%s')\n", name, link); + //ENTER("sName sLink", Name, Link); // Get absolue path name - Link = VFS_GetAbsPath( Link ); - if(!Link) { - Warning("Path '%s' is badly formed", Link); + _link = VFS_GetAbsPath( Link ); + if(!_link) { + Log_Warning("VFS", "Path '%s' is badly formed", Link); return -1; } // Get true path and node - destNode = VFS_ParsePath( Link, &realLink ); - free(Link); + destNode = VFS_ParsePath( _link, &realLink ); + free(_link); + _link = NULL; // Check if destination exists if(!destNode) { - Warning("File '%s' does not exist, symlink not created", Link); + Log_Warning("VFS", "File '%s' does not exist, symlink not created", Link); return -1; } @@ -118,7 +143,7 @@ int VFS_Symlink(char *Name, char *Link) // Make node if( VFS_MkNod(Name, VFS_FFLAG_SYMLINK) != 0 ) { - Warning("Unable to create link node '%s'", Name); + Log_Warning("VFS", "Unable to create link node '%s'", Name); return -2; // Make link node } @@ -141,15 +166,15 @@ int VFS_ReadDir(int FD, char *Dest) tVFS_Handle *h = VFS_GetHandle(FD); char *tmp; - ENTER("ph pDest", h, Dest); + //ENTER("ph pDest", h, Dest); if(!h || h->Node->ReadDir == NULL) { - LEAVE('i', 0); + //LEAVE('i', 0); return 0; } - if(h->Position >= h->Node->Size) { - LEAVE('i', 0); + if(h->Node->Size != -1 && h->Position >= h->Node->Size) { + //LEAVE('i', 0); return 0; } @@ -160,18 +185,17 @@ int VFS_ReadDir(int FD, char *Dest) else h->Position ++; } while(tmp != NULL && (Uint)tmp < (Uint)VFS_MAXSKIP); - LOG("tmp = '%s'", tmp); + + //LOG("tmp = '%s'", tmp); if(!tmp) { - LEAVE('i', 0); + //LEAVE('i', 0); return 0; } strcpy(Dest, tmp); + free(tmp); - if((Uint)tmp & 1) - free((void*)( (Uint)tmp & ~1 )); - - LEAVE('i', 1); + //LEAVE('i', 1); return 1; }