13
#include <drivers/char_dev.h>
14
#include <embox/unit.h>
15
#include <lib/libds/array.h>
16
#include <lib/libds/dlist.h>
18
EMBOX_UNIT_INIT(char_dev_registry_init);
20
static DLIST_DEFINE(char_dev_list);
22
struct dlist_head *const __char_dev_registry = &char_dev_list;
24
static int char_dev_check_name(const char *name) {
34
if (len >= sizeof(((struct char_dev *)0)->name)) {
38
char_dev_foreach(tmp) {
39
if (!strcmp(tmp->name, name)) {
47
struct char_dev *char_dev_iterate(struct char_dev *cdev) {
49
return dlist_first_entry_or_null(&char_dev_list, struct char_dev,
53
return dlist_next_entry_if_not_last(cdev, &char_dev_list, struct char_dev,
57
struct char_dev *char_dev_find(const char *name) {
58
struct char_dev *cdev;
62
char_dev_foreach(cdev) {
63
if (!strcmp(name, cdev->name)) {
71
int char_dev_register(struct char_dev *cdev) {
77
if ((err = char_dev_check_name(cdev->name))) {
81
dlist_add_next(&cdev->list_item, __char_dev_registry);
86
int char_dev_unregister(struct char_dev *cdev) {
91
char_dev_foreach(tmp) {
93
dlist_del_init(&cdev->list_item);
101
int char_dev_rename(struct char_dev *cdev, const char *new_name) {
107
if ((err = char_dev_check_name(cdev->name))) {
111
strcpy(cdev->name, new_name);
116
void char_dev_init(struct char_dev *cdev, const char *name,
117
const struct char_dev_ops *ops) {
122
dlist_init(&cdev->list_item);
123
cdev->usage_count = 0;
126
strncpy(cdev->name, name, sizeof(cdev->name) - 1);
127
cdev->name[sizeof(cdev->name) - 1] = '\0';
130
ARRAY_SPREAD_DEF(struct char_dev *const, __char_dev_static_registry);
132
static int char_dev_registry_init(void) {
133
struct char_dev *cdev;
136
array_spread_foreach(cdev, __char_dev_static_registry) {
137
if ((err = char_dev_register(cdev))) {