X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_rules.h;h=4ecada1c039dba3632d5b32e779dc1af1857016d;hp=42552cfa410ece68203dfb7abddb905a21eff169;hb=a82f23bf96bf6e05ae7e986678f411dfa2ad65cc;hpb=3b6ed8bb06d18a2855d530dcb9034e9d37114827 diff --git a/udev_rules.h b/udev_rules.h index 42552cfa4..4ecada1c0 100644 --- a/udev_rules.h +++ b/udev_rules.h @@ -20,77 +20,88 @@ * */ -#ifndef NAMEDEV_H -#define NAMEDEV_H +#ifndef UDEV_RULES_H +#define UDEV_RULES_H #include "libsysfs/sysfs/libsysfs.h" #include "udev.h" #include "list.h" +#define PAIRS_MAX 5 +#define RULEFILE_SUFFIX ".rules" -#define FIELD_KERNEL "KERNEL" -#define FIELD_SUBSYSTEM "SUBSYSTEM" -#define FIELD_BUS "BUS" -#define FIELD_SYSFS "SYSFS" -#define FIELD_ID "ID" -#define FIELD_PROGRAM "PROGRAM" -#define FIELD_RESULT "RESULT" -#define FIELD_DRIVER "DRIVER" -#define FIELD_NAME "NAME" -#define FIELD_SYMLINK "SYMLINK" -#define FIELD_OWNER "OWNER" -#define FIELD_GROUP "GROUP" -#define FIELD_MODE "MODE" -#define FIELD_OPTIONS "OPTIONS" - -#define OPTION_LAST_RULE "last_rule" -#define OPTION_IGNORE_DEVICE "ignore_device" -#define OPTION_IGNORE_REMOVE "ignore_remove" -#define OPTION_PARTITIONS "all_partitions" - -#define MAX_SYSFS_PAIRS 5 +enum key_operation { + KEY_OP_UNSET, + KEY_OP_MATCH, + KEY_OP_NOMATCH, + KEY_OP_ADD, + KEY_OP_ASSIGN, + KEY_OP_ASSIGN_FINAL, +}; -#define RULEFILE_SUFFIX ".rules" +struct key { + enum key_operation operation; + size_t val_off; +}; -struct sysfs_pair { - char file[PATH_SIZE]; - char value[VALUE_SIZE]; +struct key_pair { + struct key key; + size_t key_name_off; +}; + +struct key_pairs { + int count; + struct key_pair keys[PAIRS_MAX]; }; struct udev_rule { - struct list_head node; - - char kernel[NAME_SIZE]; - char subsystem[NAME_SIZE]; - char bus[NAME_SIZE]; - char id[NAME_SIZE]; - struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS]; - char program[PATH_SIZE]; - char result[PATH_SIZE]; - char driver[NAME_SIZE]; - char name[PATH_SIZE]; - char symlink[PATH_SIZE]; - - char owner[USER_SIZE]; - char group[USER_SIZE]; + struct key kernel_name; + struct key subsystem; + struct key action; + struct key devpath; + struct key bus; + struct key id; + struct key driver; + struct key program; + struct key result; + struct key modalias; + struct key import; + struct key_pairs sysfs; + struct key_pairs env; + + struct key name; + struct key symlink; + struct key run; + struct key owner; + struct key group; + enum key_operation mode_operation; mode_t mode; - int last_rule; - int ignore_device; - int ignore_remove; - int partitions; + unsigned int partitions; + unsigned int last_rule:1, + ignore_device:1, + ignore_remove:1, + import_exec:1; + + size_t bufsize; + char buf[]; +}; - char config_file[PATH_SIZE]; - int config_line; +struct udev_rules { + char *buf; + size_t bufsize; + size_t current; + int mapped; + int resolve_names; }; -extern struct list_head udev_rule_list; +extern int udev_rules_init(struct udev_rules *rules, int resolve_names); +extern void udev_rules_close(struct udev_rules *rules); -extern int udev_rules_init(void); -extern int udev_rules_get_name(struct udevice *udev, struct sysfs_class_device *class_dev); -extern void udev_rules_close(void); +extern void udev_rules_iter_init(struct udev_rules *rules); +extern struct udev_rule *udev_rules_iter_next(struct udev_rules *rules); -extern void udev_rule_dump(struct udev_rule *rule); -extern void udev_rule_list_dump(void); +extern int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct sysfs_class_device *class_dev); +extern int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev, struct sysfs_device *sysfs_device); #endif