X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Ffifo.c;h=de3192ab004aae0f4945c73f1aa193522fec9c1e;hb=015f48988e0ff398409d71dfc692005ab439490a;hp=94e8aaebf8f085e6f5d366826fd96cc35dc597e2;hpb=880dd63bfcba522dab0a75cc63fdec1d04ff8c89;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/fifo.c b/KernelLand/Kernel/drv/fifo.c index 94e8aaeb..de3192ab 100644 --- a/KernelLand/Kernel/drv/fifo.c +++ b/KernelLand/Kernel/drv/fifo.c @@ -1,5 +1,9 @@ -/* AcessOS - * FIFO Pipe Driver +/* + * Acess2 Kernel + * - By John Hodge (thePowersGang) + * + * drv/fifo.c + * - FIFO Pipe Driver */ #define DEBUG 0 #include @@ -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); -size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer); -size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t 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); @@ -228,7 +222,7 @@ int FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName) /** * \brief Read from a fifo pipe */ -size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t 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; @@ -241,7 +235,7 @@ size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *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"); @@ -289,6 +283,7 @@ size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t 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 @@ -311,7 +306,7 @@ size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) /** * \brief Write to a fifo pipe */ -size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t 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; @@ -324,9 +319,12 @@ size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff 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 ) @@ -358,11 +356,14 @@ size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff 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); } @@ -372,6 +373,7 @@ size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff // Mark some flags if( pipe->ReadPos == pipe->WritePos ) { + LOG("Buffer is full"); VFS_MarkFull(Node, 1); // Buffer full } VFS_MarkAvaliable(Node, 1); @@ -386,7 +388,7 @@ size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff return Length; } -// --- HELPERS --- +// --- HeLPERS --- /** * \fn tPipe *FIFO_Int_NewPipe(int Size, const char *Name) * \brief Create a new pipe @@ -396,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 @@ -421,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; }