#ifndef _SERVERS_DEVMAN_DEVMAN_H #define _SERVERS_DEVMAN_DEVMAN_H #define _SYSTEM 1 /* tell headers that this is the kernel */ #define DEVMAN_SERVER 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVMAN_DEFAULT_MODE (S_IRUSR | S_IRGRP | S_IROTH) #define DEVMAN_STRING_LEN 128 #define ADD_STRING "ADD " #define REMOVE_STRING "REMOVE " enum devman_inode_type { DEVMAN_DEVINFO_STATIC, DEVMAN_DEVINFO_DYNAMIC, DEVMAN_DEVICE }; typedef int (*devman_read_fn) (char **ptr, size_t *len, off_t offset, void *data); struct devman_device_file { int minor; int type; }; struct devman_static_info_inode { struct devman_device *dev; char data[DEVMAN_STRING_LEN]; }; struct devman_event { char data[DEVMAN_STRING_LEN]; TAILQ_ENTRY(devman_event) events; }; struct devman_event_inode { TAILQ_HEAD(event_head, devman_event) event_queue; }; struct devman_inode { struct inode *inode; devman_read_fn read_fn; void *data; TAILQ_ENTRY(devman_inode) inode_list; }; struct devman_device { int dev_id; char * name; int ref_count; int major; #define DEVMAN_DEVICE_ZOMBIE 2 #define DEVMAN_DEVICE_BOUND 1 #define DEVMAN_DEVICE_UNBOUND 0 int state; endpoint_t owner; struct devman_inode inode; struct devman_device *parent; /* the serialized information on this device */ struct devman_device_info *info; TAILQ_ENTRY(devman_device) siblings; /* devices attached to the this device */ TAILQ_HEAD(children_head, devman_device) children; TAILQ_HEAD(info_head, devman_inode) infos; }; #endif