Added .gitignore
[comos.git] / kernel / chardev.c
blob906d3d2bdcfcd7fd10b9ebb668ab6af15bde8c8f
1 #include "chardev.h"
2 #include "stddef.h"
3 #include "console.h"
5 static struct chardev *devs[MAX_CHARDEV_MAJOR + 1];
7 void chardev_init(void)
9 int i;
10 for (i = 0; i <= MAX_CHARDEV_MAJOR; ++i){
11 devs[i] = NULL;
15 ssize_t chardev_read(struct chardev *d, void *buf, size_t len)
17 return d->functab->read(d, buf, len);
20 ssize_t chardev_write(struct chardev *d, const void *buf, size_t len)
22 return d->functab->write(d, buf, len);
25 int chardev_register(struct chardev *cdev)
27 int major = cdev->major;
28 if (devs[major]){
29 devs[major]->prev = cdev;
32 cdev->prev = NULL;
33 cdev->next = devs[major];
34 devs[major] = cdev;
35 return 0;
38 int chardev_unregister(struct chardev *cdev)
40 int major = cdev->major;
42 *(cdev->prev ? &cdev->prev->next : &devs[major])
43 = cdev->next;
45 if (cdev->next){
46 cdev->next->prev = cdev->prev;
49 cdev->prev = cdev->next = NULL;
50 return 0;
53 struct chardev *chardev_get(int major, int minor)
55 struct chardev *cdev;
56 cdev = devs[major];
57 while (cdev && cdev->minor != minor){
58 cdev = cdev->next;
60 return cdev;