git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Kernel - (experimental) Allowing THREAD_EVENT_TIMER to wake a semaphore
[tpg/acess2.git]
/
KernelLand
/
Kernel
/
drv
/
fifo.c
diff --git
a/KernelLand/Kernel/drv/fifo.c
b/KernelLand/Kernel/drv/fifo.c
index
cb62193
..
6c63578
100644
(file)
--- 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 <acess.h>
*/
#define DEBUG 0
#include <acess.h>
@@
-26,9
+30,9
@@
typedef struct sPipe {
// === PROTOTYPES ===
int FIFO_Install(char **Arguments);
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
// === PROTOTYPES ===
int FIFO_Install(char **Arguments);
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
-
char *FIFO_ReadDir(tVFS_Node *Node, int Id
);
+
int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX]
);
tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename);
tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename);
-
int
FIFO_MkNod(tVFS_Node *Node, const char *Name, 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_Unlink(tVFS_Node *Node, const char *OldName);
void FIFO_Reference(tVFS_Node *Node);
void FIFO_Close(tVFS_Node *Node);
int FIFO_Unlink(tVFS_Node *Node, const char *OldName);
@@
-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
*/
* \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
{
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;
// 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;
}
/**
}
/**
@@
-121,9
+130,8
@@
tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename)
if(Filename[0] == '\0') return NULL;
// Anon Pipe
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 )
+ {
tmp = FIFO_Int_NewPipe(DEFAULT_RING_SIZE, "anon");
return &tmp->Node;
}
tmp = FIFO_Int_NewPipe(DEFAULT_RING_SIZE, "anon");
return &tmp->Node;
}
@@
-142,7
+150,7
@@
tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename)
/**
* \fn int FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
*/
/**
* \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;
}
{
return 0;
}
@@
-272,6
+280,7
@@
size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
// Mark some flags
if( pipe->ReadPos == pipe->WritePos ) {
// 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
VFS_MarkAvaliable(Node, 0);
}
VFS_MarkFull(Node, 0); // Buffer can't still be full
@@
-307,9
+316,12
@@
size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff
while(remaining)
{
// Wait for buffer to empty
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)
+ {
+ if( pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize ) {
+ LOG("Blocking write on FIFO");
VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write");
VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write");
+ }
len = remaining;
if( pipe->ReadPos > pipe->WritePos )
len = remaining;
if( pipe->ReadPos > pipe->WritePos )
@@
-341,11
+353,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;
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[pipe->WritePos], Buffer, ofs);
- memcpy(&pipe->Buffer, (Uint8*)Buffer + ofs, len-ofs);
+ memcpy(&pipe->Buffer
[0]
, (Uint8*)Buffer + ofs, len-ofs);
}
else
{
}
else
{
+ LOG("pipe->Buffer = %p, pipe->WritePos = %i", pipe->Buffer, pipe->WritePos);
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, len);
}
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, len);
}
@@
-355,6
+370,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 ) {
// Mark some flags
if( pipe->ReadPos == pipe->WritePos ) {
+ LOG("Buffer is full");
VFS_MarkFull(Node, 1); // Buffer full
}
VFS_MarkAvaliable(Node, 1);
VFS_MarkFull(Node, 1); // Buffer full
}
VFS_MarkAvaliable(Node, 1);
@@
-379,11
+395,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;
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);
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
ret->Flags = PF_BLOCKING;
// Allocate Buffer
@@
-404,14
+422,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.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
.Perm
s = -1;
ret->Node.CTime
= ret->Node.MTime
= ret->Node.ATime = now();
ret->Node.Type = &gFIFO_PipeNodeType;
ret->Node.CTime
= ret->Node.MTime
= ret->Node.ATime = now();
ret->Node.Type = &gFIFO_PipeNodeType;
+
+ LEAVE('p', ret);
return ret;
}
return ret;
}
UCC
git Repository :: git.ucc.asn.au