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

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