summary refs log tree commit diff stats
path: root/examples
Commit message (Expand)AuthorAgeFilesLines
* added the examples from the man page to the examples directoryhut2012-08-065-0/+67
' href='#n10'>10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 14
#include "devfs.h"
#include "common.h"
#include "fs.h"
#include "alloc.h"
#include "device.h"
#include "screen.h"
#include "list.h"
#include "spinlock.h"

static FileSystemNode* gDevRoot = NULL;

static List* gDeviceList = NULL;
static Spinlock gDeviceListLock;

static BOOL devfs_open(File *node, uint32 flags);
static FileSystemDirent *devfs_readdir(FileSystemNode *node, uint32 index);
static FileSystemNode *devfs_finddir(FileSystemNode *node, char *name);

static FileSystemDirent gDirent;

void initializeDevFS() {
    gDevRoot = kmalloc(sizeof(FileSystemNode));
    memset((uint8*)gDevRoot, 0, sizeof(FileSystemNode));

    gDevRoot->nodeType = FT_Directory;

    FileSystemNode* rootFs = getFileSystemRootNode();

    FileSystemNode* devNode = finddir_fs(rootFs, "dev");

    if (devNode) {
        devNode->nodeType |= FT_MountPoint;
        devNode->mountPoint = gDevRoot;
        gDevRoot->parent = devNode->parent;
        strcpy(gDevRoot->name, devNode->name);
    }
    else {
        PANIC("/dev does not exist!");
    }

    gDevRoot->open = devfs_open;
    gDevRoot->finddir = devfs_finddir;
    gDevRoot->readdir = devfs_readdir;

    gDeviceList = List_Create();
    Spinlock_Init(&gDeviceListLock);
}

static BOOL devfs_open(File *node, uint32 flags) {
    return TRUE;
}

static FileSystemDirent *devfs_readdir(FileSystemNode *node, uint32 index) {
    FileSystemDirent * result = NULL;

    uint32 counter = 0;

    Spinlock_Lock(&gDeviceListLock);

    List_Foreach(n, gDeviceList) {
        if (index == counter) {
            FileSystemNode* deviceNode = (FileSystemNode*)n->data;
            strcpy(gDirent.name, deviceNode->name);
            gDirent.fileType = deviceNode->nodeType;
            gDirent.inode = index;
            result = &gDirent;
            break;
        }

        ++counter;
    }
    Spinlock_Unlock(&gDeviceListLock);

    return result;
}

static FileSystemNode *devfs_finddir(FileSystemNode *node, char *name) {
    FileSystemNode* result = NULL;


    Spinlock_Lock(&gDeviceListLock);

    List_Foreach(n, gDeviceList) {
        FileSystemNode* deviceNode = (FileSystemNode*)n->data;

        if (strcmp(name, deviceNode->name) == 0) {
            result = deviceNode;
            break;
        }
    }

    Spinlock_Unlock(&gDeviceListLock);

    return result;
}

FileSystemNode* registerDevice(Device* device) {
    Spinlock_Lock(&gDeviceListLock);

    List_Foreach(n, gDeviceList) {
        FileSystemNode* deviceNode = (FileSystemNode*)n->data;

        if (strcmp(device->name, deviceNode->name) == 0) {
            //There is already a device with the same name
            Spinlock_Unlock(&gDeviceListLock);
            return NULL;
        }
    }

    FileSystemNode* deviceNode = (FileSystemNode*)kmalloc(sizeof(FileSystemNode));
    memset((uint8*)deviceNode, 0, sizeof(FileSystemNode));
    strcpy(deviceNode->name, device->name);
    deviceNode->nodeType = device->deviceType;
    deviceNode->open = device->open;
    deviceNode->close = device->close;
    deviceNode->readBlock = device->readBlock;
    deviceNode->writeBlock = device->writeBlock;
    deviceNode->read = device->read;
    deviceNode->write = device->write;
    deviceNode->ioctl = device->ioctl;
    deviceNode->ftruncate = device->ftruncate;
    deviceNode->mmap = device->mmap;
    deviceNode->munmap = device->munmap;
    deviceNode->privateNodeData = device->privateData;
    deviceNode->parent = gDevRoot;

    List_Append(gDeviceList, deviceNode);

    Spinlock_Unlock(&gDeviceListLock);

    return deviceNode;
}
998' href='#n998'>998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029