Kernel - Added 'Flags' param to VFS Read/Write/FindDir
[tpg/acess2.git] / KernelLand / Kernel / drv / fifo.c
index 0779a60..de3192a 100644 (file)
@@ -1,5 +1,9 @@
-/* AcessOS
- * FIFO Pipe Driver
+/* 
+ * Acess2 Kernel
+ * - By John Hodge (thePowersGang)
+ *
+ * drv/fifo.c
+ * - FIFO Pipe Driver
  */
 #define DEBUG  0
 #include <acess.h>
@@ -26,14 +30,14 @@ typedef struct sPipe {
 // === PROTOTYPES ===
  int   FIFO_Install(char **Arguments);
  int   FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
-char   *FIFO_ReadDir(tVFS_Node *Node, int Id);
-tVFS_Node      *FIFO_FindDir(tVFS_Node *Node, const char *Filename);
- int   FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);
+ int   FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX]);
+tVFS_Node      *FIFO_FindDir(tVFS_Node *Node, const char *Filename, Uint Flags);
+tVFS_Node      *FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);
 void   FIFO_Reference(tVFS_Node *Node);
 void   FIFO_Close(tVFS_Node *Node);
- int   FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName);
-Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
-Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer);
+ int   FIFO_Unlink(tVFS_Node *Node, const char *OldName);
+size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
+size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags);
 tPipe  *FIFO_Int_NewPipe(int Size, const char *Name);
 
 // === GLOBALS ===
@@ -43,7 +47,7 @@ tVFS_NodeType gFIFO_DirNodeType = {
        .ReadDir = FIFO_ReadDir,
        .FindDir = FIFO_FindDir,
        .MkNod = FIFO_MkNod,
-       .Relink = FIFO_Relink,
+       .Unlink = FIFO_Unlink,
        .IOCtl = FIFO_IOCtl
 };
 tVFS_NodeType  gFIFO_PipeNodeType = {
@@ -92,19 +96,24 @@ int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data)
  * \fn char *FIFO_ReadDir(tVFS_Node *Node, int Id)
  * \brief Reads from the FIFO root
  */
-char *FIFO_ReadDir(tVFS_Node *Node, int Id)
+int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX])
 {
        tPipe   *tmp = gFIFO_NamedPipes;
        
        // Entry 0 is Anon Pipes
-       if(Id == 0)     return strdup("anon");
+       if(Id == 0) {
+               strcpy(Dest, "anon");
+               return 0;
+       }
        
        // Find the id'th node
        while(--Id && tmp)      tmp = tmp->Next;
-       // If node found, return it
-       if(tmp) return strdup(tmp->Name);
-       // else error return
-       return NULL;
+       // If the list ended, error return
+       if(!tmp)
+               return -EINVAL;
+       // Return good
+       strncpy(Dest, tmp->Name, FILENAME_MAX);
+       return 0;
 }
 
 /**
@@ -112,7 +121,7 @@ char *FIFO_ReadDir(tVFS_Node *Node, int Id)
  * \brief Find a file in the FIFO root
  * \note Creates an anon pipe if anon is requested
  */
-tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename)
+tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename, Uint Flags)
 {
        tPipe   *tmp;
        if(!Filename)   return NULL;
@@ -121,9 +130,11 @@ tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename)
        if(Filename[0] == '\0') return NULL;
        
        // Anon Pipe
-       if(Filename[0] == 'a' && Filename[1] == 'n'
-       && Filename[2] == 'o' && Filename[3] == 'n'
-       && Filename[4] == '\0') {
+       if( strcmp(Filename, "anon") == 0 )
+       {
+               if( Flags & VFS_FDIRFLAG_STAT ) {
+                       //return &gFIFI_TemplateAnonNode;
+               }
                tmp = FIFO_Int_NewPipe(DEFAULT_RING_SIZE, "anon");
                return &tmp->Node;
        }
@@ -142,7 +153,7 @@ tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename)
 /**
  * \fn int FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
  */
-int FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
+tVFS_Node *FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
 {
        return 0;
 }
@@ -178,12 +189,11 @@ void FIFO_Close(tVFS_Node *Node)
 }
 
 /**
- * \fn int FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName)
- * \brief Relink a file (Deletes named pipes)
+ * \brief Delete a pipe
  */
-int FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName)
+int FIFO_Unlink(tVFS_Node *Node, const char *OldName)
 {
-       tPipe   *pipe, *tmp;
+       tPipe   *pipe;
        
        if(Node != &gFIFO_DriverInfo.RootNode)  return 0;
        
@@ -200,22 +210,6 @@ int FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName)
        }
        if(!pipe)       return 0;
        
-       // Relink a named pipe
-       if(NewName) {
-               // Check new name
-               for(tmp = gFIFO_NamedPipes;
-                       tmp;
-                       tmp = tmp->Next)
-               {
-                       if(strcmp(tmp->Name, NewName) == 0)     return 0;
-               }
-               // Create new name
-               free(pipe->Name);
-               pipe->Name = malloc(strlen(NewName)+1);
-               strcpy(pipe->Name, NewName);
-               return 1;
-       }
-       
        // Unlink the pipe
        if(Node->ImplPtr) {
                free(Node->ImplPtr);
@@ -226,10 +220,9 @@ int FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName)
 }
 
 /**
- * \fn Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
  * \brief Read from a fifo pipe
  */
-Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
+size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
 {
        tPipe   *pipe = Node->ImplPtr;
        Uint    len;
@@ -237,12 +230,12 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
 
        if(!pipe)       return 0;
        
-       ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
+       ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);
        
        while(remaining)
        {
                // Wait for buffer to fill
-               if(pipe->Flags & PF_BLOCKING)
+               if( (pipe->Flags & PF_BLOCKING) && !(Flags & VFS_IOFLAG_NOBLOCK) )
                {
                        if( pipe->ReadPos == pipe->WritePos )
                                VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "FIFO_Read");
@@ -290,6 +283,7 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                
                // Mark some flags
                if( pipe->ReadPos == pipe->WritePos ) {
+                       LOG("%i == %i, marking none to read", pipe->ReadPos, pipe->WritePos);
                        VFS_MarkAvaliable(Node, 0);
                }
                VFS_MarkFull(Node, 0);  // Buffer can't still be full
@@ -310,10 +304,9 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
 }
 
 /**
- * \fn Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
  * \brief Write to a fifo pipe
  */
-Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer)
+size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags)
 {
        tPipe   *pipe = Node->ImplPtr;
        Uint    len;
@@ -321,14 +314,17 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buf
        
        if(!pipe)       return 0;
 
-       ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
+       ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer);
        
        while(remaining)
        {
                // Wait for buffer to empty
-               if(pipe->Flags & PF_BLOCKING) {
-                       if( pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize )
+               if( (pipe->Flags & PF_BLOCKING) && !(Flags & VFS_IOFLAG_NOBLOCK) )
+               {
+                       if( pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize ) {
+                               LOG("Blocking write on FIFO");
                                VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write");
+                       }
 
                        len = remaining;
                        if( pipe->ReadPos > pipe->WritePos )
@@ -360,11 +356,14 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buf
                if(len > pipe->BufSize - pipe->WritePos)
                {
                        int ofs = pipe->BufSize - pipe->WritePos;
+                       LOG("pipe->Buffer = %p, pipe->WritePos = %i, ofs=%i, len=%i",
+                               pipe->Buffer, pipe->WritePos, ofs, len);
                        memcpy(&pipe->Buffer[pipe->WritePos], Buffer, ofs);
-                       memcpy(&pipe->Buffer, (Uint8*)Buffer + ofs, len-ofs);
+                       memcpy(&pipe->Buffer[0], (Uint8*)Buffer + ofs, len-ofs);
                }
                else
                {
+                       LOG("pipe->Buffer = %p, pipe->WritePos = %i", pipe->Buffer, pipe->WritePos);
                        memcpy(&pipe->Buffer[pipe->WritePos], Buffer, len);
                }
                
@@ -374,6 +373,7 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buf
                
                // Mark some flags
                if( pipe->ReadPos == pipe->WritePos ) {
+                       LOG("Buffer is full");
                        VFS_MarkFull(Node, 1);  // Buffer full
                }
                VFS_MarkAvaliable(Node, 1);
@@ -388,7 +388,7 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buf
        return Length;
 }
 
-// --- HELPERS ---
+// --- HeLPERS ---
 /**
  * \fn tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
  * \brief Create a new pipe
@@ -398,11 +398,13 @@ tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
        tPipe   *ret;
         int    namelen = strlen(Name) + 1;
         int    allocsize = sizeof(tPipe) + sizeof(tVFS_ACL) + Size + namelen;
-       
+
+       ENTER("iSize sName", Size, Name);       
+
        ret = calloc(1, allocsize);
-       if(!ret)        return NULL;
+       if(!ret)        LEAVE_RET('n', NULL);
        
-       // Clear Return
+       // Set default flags
        ret->Flags = PF_BLOCKING;
        
        // Allocate Buffer
@@ -423,14 +425,16 @@ tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
        ret->Node.GID = Threads_GetGID();
        ret->Node.NumACLs = 1;
        ret->Node.ACLs = (void*)( (Uint)ret + sizeof(tPipe) );
-               ret->Node.ACLs->Group = 0;
-               ret->Node.ACLs->ID = ret->Node.UID;
-               ret->Node.ACLs->Inv = 0;
-               ret->Node.ACLs->Perms = -1;
+               ret->Node.ACLs->Ent.Group = 0;
+               ret->Node.ACLs->Ent.ID = ret->Node.UID;
+               ret->Node.ACLs->Perm.Inv = 0;
+               ret->Node.ACLs->Perm.Perms = -1;
        ret->Node.CTime
                = ret->Node.MTime
                = ret->Node.ATime = now();
        ret->Node.Type = &gFIFO_PipeNodeType;
+
+       LEAVE('p', ret);
        
        return ret;
 }

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