OSDN Git Service

klibc基本機能実装. ACPICAの準備
[vaneos/DivergeMirror.git] / drivers / ramfs / sys.c
1 /*
2         sys.c
3         DrFS System
4         (C) 2015 VOSystems.
5 */
6
7 #include<Diverge/DrFS.h>
8 #include<Diverge/kstdio.h>
9 #include<string.h>
10 #include<Diverge/diverge.h>
11 #include<Diverge/BitMap.h>
12 #include<Diverge/dksh.h>
13
14 extern struct fnode *cdir;
15 extern struct DrFS_Prefix* drfs;
16 extern unsigned long map[64];
17
18 /*セクタのクリーンアップ 引数:セクタのアドレス*/
19 void SectorCleanUp(unsigned int sector)
20 {
21         FSDirPointer fsd=(FSDirPointer)sector;
22         int C;
23         for(C=0; C<128; C++){
24                 fsd[C]=0;
25         }
26         return;
27 }
28
29 unsigned int SearchObjectFromCDir(char* name, char mode, bool *error)
30 {
31         *error=true;
32         unsigned int C,ret;
33         FSDirPointer dp=(FSDirPointer)cdir->tnp;
34         struct fnode* node;
35         
36         for(C=0; C<128; C++){
37                 if(cdir->level==0){
38                         node=(struct fnode*)dp[C];
39                         if(strcmp(node->name,name)==0){
40                                 struct faright right=CheckObjectRight(node);
41                                 
42                                 if(right.dir==mode){
43                                         ret=dp[C];
44                                         *error=false;
45                                         break;
46                                 }
47                         }
48                 }else{
49                         
50                 }
51         }
52         return ret;
53 }
54
55 /*正常->作成したオブジェクトのfnodeポインタ 異常->NULL & *error==true*/
56 struct fnode* MakeObject(char* name, unsigned short ar, unsigned int uid, unsigned int gid, unsigned int pid, bool *error)
57 {
58         *error=false;
59         struct fnode* node=(struct fnode*)SearchSectorPysicalMemory(error);
60         if(*error==true)return NULL;
61         SectorCleanUp((unsigned int)node);
62         
63         *error=false;
64         unsigned int sector=SearchSectorPysicalMemory(error);
65         if(*error==true)return NULL;
66         SectorCleanUp(sector);
67         
68         time_t timer=time(NULL);
69         
70         strcpy(node->name,name);
71         node->attribute=ar;
72         node->uid=uid;
73         node->gid=gid;
74         node->pid=pid;
75         node->id=(unsigned int)node;
76         node->fsize=0;
77         node->level=0;
78         node->tnp=sector;
79         node->create=timer;
80         node->rewrite=timer;
81         node->access=timer;
82         
83         struct fnode* parent=(struct fnode*)pid;
84         FSDirPointer sec=(FSDirPointer)parent->tnp;
85         int C;
86         
87         *error=false;
88         
89         if(parent->level==0){
90                 *error=true;
91                 for(C=0; C<128; C++){
92                         if(sec[C]==0){
93                                 sec[C]=node->id;
94                                 *error=false;
95                                 break;
96                         }
97                 }
98                 if(*error==true)return NULL;
99         }else{
100                 /*セクタ段数が0じゃない時の開いているセクタポインタを探すロジック、あとで実装する。*/
101         }
102         parent->fsize+=4;
103         
104         return node;
105 }
106
107 unsigned int SectorSearch(bool *error)
108 {
109         unsigned int C,bit=0xffffffff;
110         *error=false;
111         
112         for(C=0; C<64; C++){
113                 bit=SearchEmptyBit(&map[C]);
114                 if(bit!=0xffffffff){
115                         break;
116                 }
117         }
118         if(bit==0xffffffff){
119                 *error=true;
120                 return 0;
121         }
122         ReserveBit(&map[C], bit);
123         return (C*32)+bit;
124 }
125
126 struct faright CheckObjectRight(const struct fnode* node)
127 {
128         struct faright right;
129         unsigned short ar=node->attribute;
130         
131         struct tm* temp=localtime(&node->create);
132         right.create_time=*temp;
133         
134         temp=localtime(&node->rewrite);
135         right.rewrite_time=*temp;
136         
137         temp=localtime(&node->access);
138         right.access_time=*temp;
139         
140         if((ar & 0x8000)==0){
141                 right.dir=0;
142         }else{
143                 right.dir=1;
144         }
145         
146         if((ar & 0x4000)!=0){
147                 right.hide=true;
148         }else{
149                 right.hide=false;
150         }
151         
152         if((ar & 0x2000)!=0){
153                 right.sys=true;
154         }else{
155                 right.sys=false;
156         }
157         
158         if((ar & 0x1000)!=0){
159                 right.tmp=true;
160         }else{
161                 right.tmp=false;
162         }
163         
164         if((ar & 0xc00)==0xc00){
165                 right.user_right=3;
166         }else if((ar & 0xc00)==0x800){
167                 right.user_right=2;
168         }else if((ar & 0xc00)==0x400){
169                 right.user_right=1;
170         }else{
171                 right.user_right=0;
172         }
173         
174         if((ar & 0x300)==0x300){
175                 right.group_right=3;
176         }else if((ar & 0x300)==0x200){
177                 right.group_right=2;
178         }else if((ar & 0x300)==0x100){
179                 right.group_right=1;
180         }else{
181                 right.group_right=0;
182         }
183         
184         if((ar & 0xc0)==0xc0){
185                 right.others_right=3;
186         }else if((ar & 0xc0)==0x80){
187                 right.others_right=2;
188         }else if((ar & 0xc0)==0x40){
189                 right.others_right=1;
190         }else{
191                 right.others_right=0;
192         }
193         
194         if(node->id==cdir->id){
195                 right.flag=0;
196         }else if(node->id==cdir->pid){
197                 right.flag=1;
198         }else{
199                 right.flag=2;
200         }
201         
202         right.uid=node->uid;
203         switch(right.uid){
204                 case 0:
205                         right.gid=GID_ROOT;
206                         break;
207                 case 1:
208                         right.gid=GID_ADMIN;
209                         break;
210                 case 2:
211                         right.gid=GID_USER;
212                         break;
213                 default:
214                         right.gid=0xffffffff;
215         }
216         
217         return right;
218 }
219
220 unsigned int SearchSectorPysicalMemory(bool* error)
221 {
222         unsigned int bit;
223         bit=SectorSearch(error);
224         if(*error==true)return NULL;
225         bit=(drfs->sector_size*bit)+FS_START_ADDR+1;
226         return bit;
227 }
228
229 void PrintFileList(struct faright right, struct fnode* node, int mode)
230 {
231         switch(mode){
232                 case 0:
233                         switch(right.flag){
234                                 case 0:
235                                         kputs(".\n");
236                                         break;
237                                 case 1:
238                                         kputs("..\n");
239                                         break;
240                                 default:
241                                         kprintf("%s\n",node->name);
242                                         break;
243                         }
244                         break;
245                 case 1:
246                         switch(right.dir){
247                                 case 0:
248                                         kputs("d");
249                                         break;
250                                 default:
251                                         kputs("f");
252                                         break;
253                         }
254                         switch(right.hide){
255                                 case true:
256                                         kputs("h");
257                                         break;
258                                 default:
259                                         kputs("-");
260                         }
261                         switch(right.sys){
262                                 case true:
263                                         kputs("s");
264                                         break;
265                                 default:
266                                         kputs("-");
267                                         break;
268                         }
269                         switch(right.tmp){
270                                 case true:
271                                         kputs("t");
272                                         break;
273                                 default:
274                                         kputs("-");
275                                         break;
276                         }
277                         switch(right.user_right){
278                                 case 0:
279                                         kputs("-");
280                                         break;
281                                 case 1:
282                                         kputs("r");
283                                         break;
284                                 case 2:
285                                         kputs("w");
286                                         break;
287                                 case 3:
288                                         kputs("a");
289                                         break;
290                                 default:
291                                         kputs("?");
292                                         break;
293                         }
294                         switch(right.group_right){
295                                 case 0:
296                                         kputs("-");
297                                         break;
298                                 case 1:
299                                         kputs("r");
300                                         break;
301                                 case 2:
302                                         kputs("w");
303                                         break;
304                                 case 3:
305                                         kputs("a");
306                                         break;
307                                 default:
308                                         kputs("?");
309                                         break;
310                         }
311                         switch(right.others_right){
312                                 case 0:
313                                         kputs("-");
314                                         break;
315                                 case 1:
316                                         kputs("r");
317                                         break;
318                                 case 2:
319                                         kputs("w");
320                                         break;
321                                 case 3:
322                                         kputs("a");
323                                         break;
324                                 default:
325                                         kputs("?");
326                                         break;
327                         }
328                         switch(right.gid){
329                                 case GID_ROOT:
330                                         kputs(" RootGroup  ");
331                                         break;
332                                 case GID_ADMIN:
333                                         kputs(" AdminGroup ");
334                                         break;
335                                 case GID_USER:
336                                         kputs(" UserGroup  ");
337                                         break;
338                                 default:
339                                         kputs(" ?          ");
340                         }
341                         switch(right.uid){
342                                 case GID_ROOT:
343                                         kputs("Root  ");
344                                         break;
345                                 case GID_ADMIN:
346                                         kputs("Admin ");
347                                         break;
348                                 case GID_USER:
349                                         kputs("User  ");
350                                         break;
351                                 default:
352                                         kputs("?     ");
353                         }
354                         kprintf(" %d/%d/%d %d:%d:%d %dB",right.rewrite_time.tm_year+1970, right.rewrite_time.tm_mon, right.rewrite_time.tm_mday, right.rewrite_time.tm_hour, right.rewrite_time.tm_min, right.rewrite_time.tm_sec, node->fsize);
355                         switch(right.flag){
356                                 case 0:
357                                         kputs(" .\n");
358                                         break;
359                                 case 1:
360                                         kputs(" ..\n");
361                                         break;
362                                 default:
363                                         kprintf(" %s\n",node->name);
364                                         break;
365                         }
366                         break;
367         }
368 }