Fixed bit arithmatic
[tpg/acess2.git] / Kernel / vfs / open.c
index fa5fe66..54838e9 100644 (file)
@@ -392,7 +392,7 @@ int VFS_Open(char *Path, Uint Mode)
        if( !(Mode & VFS_OPENFLAG_NOLINK) && (node->Flags & VFS_FFLAG_SYMLINK) )
        {
                if( !node->Read ) {
-                       LOG("No read method on symlink");
+                       Warning("No read method on symlink");
                        LEAVE('i', -1);
                        return -1;
                }
@@ -495,20 +495,60 @@ void VFS_Close(int FD)
        h->Node = NULL;
 }
 
+/**
+ * \fn int VFS_ChDir(char *New)
+ * \brief Change current working directory
+ */
+int VFS_ChDir(char *New)
+{
+       char    *buf;
+       tVFS_Node       *node;
+       
+       // Create Absolute
+       buf = VFS_GetAbsPath(New);
+       if(buf == NULL) return -1;
+       
+       // Check if path is valid
+       node = VFS_ParsePath(buf, NULL);
+       if(!node)       return -1;
+       
+       // Check if is a directory
+       if( !(node->Flags & VFS_FFLAG_DIRECTORY) ) {
+               if(node->Close) node->Close(node);
+               return -1;
+       }
+       // Close node
+       if(node->Close) node->Close(node);
+       
+       // Copy over
+       strcpy(buf, New);
+       
+       // Free old and set new
+       free( CFGPTR(CFG_VFS_CWD) );
+       CFGPTR(CFG_VFS_CWD) = buf;
+       
+       return 1;
+}
+
 /**
  * \fn tVFS_Handle *VFS_GetHandle(int FD)
  * \brief Gets a pointer to the handle information structure
  */
 tVFS_Handle *VFS_GetHandle(int FD)
 {
+       tVFS_Handle     *h;
+       
        if(FD < 0)      return NULL;
        
        if(FD & VFS_KERNEL_FLAG) {
                FD &= (VFS_KERNEL_FLAG - 1);
                if(FD >= MAX_KERNEL_FILES)      return NULL;
-               return &gaKernelHandles[ FD ];
+               h = &gaKernelHandles[ FD ];
        } else {
                if(FD >= CFGINT(CFG_VFS_MAXFILES))      return NULL;
-               return &gaUserHandles[ FD ];
+               h = &gaUserHandles[ FD ];
        }
+       
+       if(h->Node == NULL)     return NULL;
+       return h;
 }

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