1/* 2 * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com> 3 * Copyright (C) 2003-2006 Kay Sievers <kay.sievers@vrfy.org> 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the 7 * Free Software Foundation version 2 of the License. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License along 15 * with this program; if not, write to the Free Software Foundation, Inc., 16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 17 * 18 */ 19 20#ifndef _UDEV_H_ 21#define _UDEV_H_ 22 23#include <sys/types.h> 24#include <sys/param.h> 25 26#include "list.h" 27#include "logging.h" 28#include "udev_sysdeps.h" 29#include "udev_version.h" 30 31#define COMMENT_CHARACTER '#' 32#define LINE_SIZE 512 33#define PATH_SIZE 512 34#define NAME_SIZE 256 35#define VALUE_SIZE 128 36 37#define ALLOWED_CHARS "#+-.:=@_" 38#define ALLOWED_CHARS_FILE ALLOWED_CHARS "/" 39#define ALLOWED_CHARS_INPUT ALLOWED_CHARS_FILE " $%?," 40 41#define DEFAULT_PARTITIONS_COUNT 15 42#define UDEV_ALARM_TIMEOUT 180 43 44#define UDEV_MAX(a,b) ((a) > (b) ? (a) : (b)) 45 46/* pipes */ 47#define READ_END 0 48#define WRITE_END 1 49 50#define DB_DIR ".udev/db" 51#define DB_NAME_INDEX_DIR ".udev/names" 52 53struct udev_rules; 54 55struct sysfs_device { 56 struct list_head node; /* for device cache */ 57 struct sysfs_device *parent; /* already cached parent*/ 58 char devpath[PATH_SIZE]; 59 char subsystem[NAME_SIZE]; /* $class, $bus, drivers, module */ 60 char kernel[NAME_SIZE]; /* device instance name */ 61 char kernel_number[NAME_SIZE]; 62 char driver[NAME_SIZE]; /* device driver name */ 63}; 64 65struct udevice { 66 /* device event */ 67 struct sysfs_device *dev; /* points to dev_local by default */ 68 struct sysfs_device dev_local; 69 struct sysfs_device *dev_parent; /* current parent device used for matching */ 70 char action[NAME_SIZE]; 71 72 /* node */ 73 char name[PATH_SIZE]; 74 struct list_head symlink_list; 75 int symlink_final; 76 char owner[NAME_SIZE]; 77 int owner_final; 78 char group[NAME_SIZE]; 79 int group_final; 80 mode_t mode; 81 int mode_final; 82 dev_t devt; 83 84 /* event processing */ 85 struct list_head run_list; 86 int run_final; 87 struct list_head env_list; 88 char tmp_node[PATH_SIZE]; 89 int partitions; 90 int ignore_device; 91 int ignore_remove; 92 char program_result[PATH_SIZE]; 93 int link_priority; 94 int test_run; 95}; 96 97/* udev_config.c */ 98extern char udev_root[PATH_SIZE]; 99extern char udev_config_filename[PATH_SIZE]; 100extern char udev_rules_dir[PATH_SIZE]; 101extern int udev_log_priority; 102extern int udev_run; 103extern void udev_config_init(void); 104 105/* udev_device.c */ 106extern struct udevice *udev_device_init(struct udevice *udev); 107extern void udev_device_cleanup(struct udevice *udev); 108extern int udev_device_event(struct udev_rules *rules, struct udevice *udev); 109extern dev_t udev_device_get_devt(struct udevice *udev); 110 111/* udev_sysfs.c */ 112extern char sysfs_path[PATH_SIZE]; 113extern int sysfs_init(void); 114extern void sysfs_cleanup(void); 115extern void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, 116 const char *subsystem, const char *driver); 117extern struct sysfs_device *sysfs_device_get(const char *devpath); 118extern struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev); 119extern struct sysfs_device *sysfs_device_get_parent_with_subsystem(struct sysfs_device *dev, const char *subsystem); 120extern char *sysfs_attr_get_value(const char *devpath, const char *attr_name); 121extern int sysfs_resolve_link(char *path, size_t size); 122extern int sysfs_lookup_devpath_by_subsys_id(char *devpath, size_t len, const char *subsystem, const char *id); 123 124/* udev_node.c */ 125extern int udev_node_mknod(struct udevice *udev, const char *file, dev_t devt, mode_t mode, uid_t uid, gid_t gid); 126extern void udev_node_update_symlinks(struct udevice *udev, struct udevice *udev_old); 127extern int udev_node_add(struct udevice *udev); 128extern int udev_node_remove(struct udevice *udev); 129 130/* udev_db.c */ 131extern int udev_db_add_device(struct udevice *dev); 132extern int udev_db_delete_device(struct udevice *dev); 133extern int udev_db_get_device(struct udevice *udev, const char *devpath); 134extern int udev_db_get_devices_by_name(const char *name, struct list_head *name_list); 135extern int udev_db_get_all_entries(struct list_head *name_list); 136 137/* udev_utils.c */ 138struct name_entry { 139 struct list_head node; 140 char name[PATH_SIZE]; 141}; 142extern int log_priority(const char *priority); 143extern char *name_list_add(struct list_head *name_list, const char *name, int sort); 144extern char *name_list_key_add(struct list_head *name_list, const char *key, const char *value); 145extern int name_list_key_remove(struct list_head *name_list, const char *key); 146extern void name_list_cleanup(struct list_head *name_list); 147extern int add_matching_files(struct list_head *name_list, const char *dirname, const char *suffix); 148extern uid_t lookup_user(const char *user); 149extern gid_t lookup_group(const char *group); 150 151/* udev_utils_string.c */ 152extern int string_is_true(const char *str); 153extern void remove_trailing_chars(char *path, char c); 154extern size_t path_encode(char *s, size_t len); 155extern size_t path_decode(char *s); 156extern int utf8_encoded_valid_unichar(const char *str); 157extern int replace_chars(char *str, const char *white); 158 159/* udev_utils_file.c */ 160extern int create_path(const char *path); 161extern int delete_path(const char *path); 162extern int file_map(const char *filename, char **buf, size_t *bufsize); 163extern void file_unmap(void *buf, size_t bufsize); 164extern int unlink_secure(const char *filename); 165extern size_t buf_get_line(const char *buf, size_t buflen, size_t cur); 166 167/* udev_utils_run.c */ 168extern int pass_env_to_socket(const char *name, const char *devpath, const char *action); 169extern int run_program(const char *command, const char *subsystem, 170 char *result, size_t ressize, size_t *reslen, int log); 171 172#endif 173