Changeset 863

Show
Ignore:
Timestamp:
09/01/08 18:26:21 (3 years ago)
Author:
mwhitworth
Message:

Write basic configfs functions, including SysConfRead and SysConfWrite.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/fs/infofs/config.c

    r851 r863  
    66#include <fs/icfs.h> 
    77#include <fs/vfs.h> 
     8#include <sys.h> 
    89 
    910static struct KeFsEntry root; 
     11 
     12int ConfigAddIntEntry(struct KeFsEntry* dir, char* name, int* value) 
     13{ 
     14        return IcFsAddIntEntry(&root, dir, name, value); 
     15} 
     16 
     17SYMBOL_EXPORT(ConfigAddIntEntry); 
     18 
     19int ConfigAddArrayEntry(struct KeFsEntry* dir, char* name, BYTE* value, int minLen, int maxLen, int size) 
     20{ 
     21        /* TODO: Create general IcFs function. */ 
     22        struct IcFsEntry* entry; 
     23         
     24        entry=IcFsAddStrEntry(&root, dir, name, value); 
     25         
     26        if (!entry) 
     27                return -EINVAL; 
     28         
     29        entry->type=ICFS_TYPE_BYTE; 
     30        entry->minLen=minLen; 
     31        entry->maxLen=maxLen; 
     32        entry->size=size; 
     33         
     34        return 0; 
     35} 
     36 
     37SYMBOL_EXPORT(ConfigAddArrayEntry); 
     38 
     39int ConfigAddSoftLink(struct KeFsEntry* dir, char* name, int (*followLink)(char* buffer, int size)) 
     40{ 
     41        return IcFsAddSoftLink(&root, dir, name, followLink); 
     42} 
     43 
     44SYMBOL_EXPORT(ConfigAddSoftLink); 
     45 
     46struct KeFsEntry* ConfigCreateDir(struct KeFsEntry* dir, char* name) 
     47{ 
     48        return IcFsCreateDir(&root, dir, name); 
     49} 
     50 
     51SYMBOL_EXPORT(ConfigCreateDir); 
    1052 
    1153DWORD ConfigGetRootId() 
     
    1355        return (DWORD)&root; 
    1456} 
     57 
     58SYMBOL_EXPORT(ConfigGetRootId); 
    1559 
    1660int ConfigRootCreate() 
     
    2165} 
    2266 
     67struct KeFsEntry* ConfigResolvePath(char* name) 
     68{ 
     69        /* Parse name. */ 
     70        struct KeFsRoot* currNode=&root; 
     71        struct KeFsDir* dir; 
     72        struct KeFsEntry* entry; 
     73         
     74        if (name[0] == '/') 
     75                name++; 
     76         
     77        dir=KeFsNameToDir(&root.dir, &name); 
     78         
     79        if (!dir) 
     80                return NULL; 
     81 
     82        entry=KeFsLookupDir(dir, name, strlen(name)); 
     83         
     84        if (!entry) 
     85                return NULL; 
     86         
     87        /* Handle symlinks in KeFsLookupDir? */ 
     88        if (!(entry->type & VFS_ATTR_FILE)) 
     89                return NULL; 
     90                 
     91        return entry; 
     92} 
     93 
     94int SysConfRead(char* name, BYTE* data, int size) 
     95{ 
     96        struct KeFsEntry* entry; 
     97        int position=0; 
     98         
     99        entry=ConfigResolvePath(name); 
     100         
     101        IcRead(&position, entry->file, data, size); 
     102         
     103        return 0; 
     104} 
     105 
     106int SysConfWrite(char* name, BYTE* data, int size) 
     107{ 
     108        struct KeFsEntry* entry; 
     109        int position=0; 
     110         
     111        entry=ConfigResolvePath(name); 
     112         
     113//      KePrint("data = %#X, size = %d\n", data, size); 
     114         
     115        IcWrite(&position, entry->file, data, size); 
     116         
     117        return 0; 
     118} 
     119 
     120struct SysCall configSystemCalls[]= 
     121{ 
     122        SysEntry(SysConfRead, 12), 
     123        SysEntry(SysConfWrite, 12), 
     124        SysEntryEnd() 
     125}; 
     126 
    23127int ConfigInit() 
    24128{ 
    25129        ConfigRootCreate(); 
     130         
     131        /* Create standard directories */ 
     132        ConfigCreateDir(NULL, "Devices"); 
     133        ConfigCreateDir(NULL, "Devices/Storage"); 
     134         
     135        /* Register the ReadConf and WriteConf system calls, for quick access to configuration variables. */ 
     136        SysRegisterRange(SYS_CONFIG_BASE, configSystemCalls); 
     137         
    26138        return 0; 
    27139}