b21d1eff8d31622797c949b5ac9dc9a624ab17c0
[tpg/acess2.git] / KernelLand / Kernel / drv / zero-one.c
1 /*
2  * Acess2 Kernel
3  * - By John Hodge (thePowersGang)
4  *
5  * drv/zero-one.c
6  * - /Devices/{null,zero,one}
7  */
8 #define DEBUG   0
9 #include <acess.h>
10 #include <modules.h>
11 #include <fs_devfs.h>
12
13 // === PROTOTYPES ===
14  int    CoreDevs_Install(char **Arguments);
15 size_t  CoreDevs_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags);
16 size_t  CoreDevs_Read_Zero(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
17 size_t  CoreDevs_Read_One (tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
18 size_t  CoreDevs_Read_Null(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
19 size_t  CoreDevs_Read_FRandom(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
20 size_t  CoreDevs_Read_GRandom(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
21
22 // === GLOBALS ===
23 MODULE_DEFINE(0, 0x0100, CoreDevs, CoreDevs_Install, NULL, NULL);
24 tVFS_NodeType   gCoreDevs_NT_Null = {
25         .TypeName = "CoreDevs-null",
26         .Flags = VFS_NODETYPEFLAG_STREAM,
27         .Read  = CoreDevs_Read_Null,
28         .Write = CoreDevs_Write
29 };
30 tVFS_NodeType   gCoreDevs_NT_Zero = {
31         .TypeName = "CoreDevs-zero",
32         .Flags = VFS_NODETYPEFLAG_STREAM,
33         .Read  = CoreDevs_Read_Zero,
34         .Write = CoreDevs_Write
35 };
36 tVFS_NodeType   gCoreDevs_NT_One = {
37         .TypeName = "CoreDevs-one",
38         .Flags = VFS_NODETYPEFLAG_STREAM,
39         .Read  = CoreDevs_Read_One,
40         .Write = CoreDevs_Write
41 };
42 tVFS_NodeType   gCoreDevs_NT_FRandom = {
43         .TypeName = "CoreDevs-frandom",
44         .Flags = VFS_NODETYPEFLAG_STREAM,
45         .Read  = CoreDevs_Read_FRandom,
46         .Write = CoreDevs_Write
47 };
48 tVFS_NodeType   gCoreDevs_NT_GRandom = {
49         .TypeName = "CoreDevs-grandom",
50         .Flags = VFS_NODETYPEFLAG_STREAM,
51         .Read  = CoreDevs_Read_GRandom,
52         .Write = CoreDevs_Write
53 };
54 tDevFS_Driver   gCoreDevs_Null = {
55         NULL, "null",
56         {
57         .Size = -1, .NumACLs = 1,
58         .ACLs = &gVFS_ACL_EveryoneRW,
59         .Type = &gCoreDevs_NT_Null
60         }
61 };
62 tDevFS_Driver   gCoreDevs_Zero = {
63         NULL, "zero",
64         {
65         .Size = -1, .NumACLs = 1,
66         .ACLs = &gVFS_ACL_EveryoneRW,
67         .Type = &gCoreDevs_NT_Zero
68         }
69 };
70 tDevFS_Driver   gCoreDevs_One = {
71         NULL, "one",
72         {
73         .Size = -1, .NumACLs = 1,
74         .ACLs = &gVFS_ACL_EveryoneRW,
75         .Type = &gCoreDevs_NT_One
76         }
77 };
78 tDevFS_Driver   gCoreDevs_FRandom = {
79         NULL, "frandom",
80         {
81         .Size = -1, .NumACLs = 1,
82         .ACLs = &gVFS_ACL_EveryoneRW,
83         .Type = &gCoreDevs_NT_FRandom,
84         .DataAvaliable = 1
85         }
86 };
87 tDevFS_Driver   gCoreDevs_GRandom = {
88         NULL, "grandom",
89         {
90         .Size = -1, .NumACLs = 1,
91         .ACLs = &gVFS_ACL_EveryoneRW,
92         .Type = &gCoreDevs_NT_GRandom,
93         .DataAvaliable = 1
94         }
95 };
96
97 // === CODE ===
98 /**
99  * \brief Installs the CoreDevs driver
100  */
101 int CoreDevs_Install(char **Options)
102 {
103         DevFS_AddDevice( &gCoreDevs_Null );
104         DevFS_AddDevice( &gCoreDevs_Zero );
105         DevFS_AddDevice( &gCoreDevs_One  );
106         DevFS_AddDevice( &gCoreDevs_FRandom  );
107         //DevFS_AddDevice( &gCoreDevs_GRandom  );
108         return MODULE_ERR_OK;
109 }
110
111 size_t CoreDevs_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags)
112 {
113         return Length;  // Ignore
114 }
115
116 size_t CoreDevs_Read_Zero(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
117 {
118         memset(Buffer, 0, Length);
119         return Length;
120 }
121
122 size_t CoreDevs_Read_One (tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
123 {
124         Uint8   *ptr = Buffer;
125         size_t  rem;
126         for( rem = Length; rem --; ptr ++ )
127                 *ptr = 0xFF;
128         return Length;
129 }
130
131 size_t CoreDevs_Read_Null(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
132 {
133         return 0;
134 }
135
136 //! Fast random number generator
137 size_t CoreDevs_Read_FRandom(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
138 {
139         Uint8   *cbuf = Buffer;
140         for( int i = 0; i < Length; i ++ )
141                 *cbuf++ = rand();
142         return Length;
143 }
144
145 size_t CoreDevs_Read_GRandom(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
146 {
147         // TODO: VFS_IOFLAG_NOBLOCK
148         Log_Error("CoreDevs", "GRandom is unimplimented");
149         return -1;
150 }
151

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