summaryrefslogtreecommitdiff
path: root/udev_rules.h
blob: bad8406cf486ba84ad766f2cb0ddddbe5c35634e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * udev_rules.h
 *
 * Userspace devfs
 *
 * Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
 *
 *	This program is free software; you can redistribute it and/or modify it
 *	under the terms of the GNU General Public License as published by the
 *	Free Software Foundation version 2 of the License.
 * 
 *	This program is distributed in the hope that it will be useful, but
 *	WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *	General Public License for more details.
 * 
 *	You should have received a copy of the GNU General Public License along
 *	with this program; if not, write to the Free Software Foundation, Inc.,
 *	675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef UDEV_RULES_H
#define UDEV_RULES_H

#include "libsysfs/sysfs/libsysfs.h"
#include "udev.h"
#include "list.h"


#define KEY_KERNEL		"KERNEL"
#define KEY_SUBSYSTEM		"SUBSYSTEM"
#define KEY_ACTION		"ACTION"
#define KEY_DEVPATH		"DEVPATH"
#define KEY_BUS			"BUS"
#define KEY_ID			"ID"
#define KEY_PROGRAM		"PROGRAM"
#define KEY_RESULT		"RESULT"
#define KEY_DRIVER		"DRIVER"
#define KEY_SYSFS		"SYSFS"
#define KEY_ENV			"ENV"
#define KEY_MODALIAS		"MODALIAS"
#define KEY_IMPORT		"IMPORT"
#define KEY_NAME		"NAME"
#define KEY_SYMLINK		"SYMLINK"
#define KEY_OWNER		"OWNER"
#define KEY_GROUP		"GROUP"
#define KEY_MODE		"MODE"
#define KEY_RUN			"RUN"
#define KEY_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 KEY_SYSFS_PAIRS_MAX	5
#define KEY_ENV_PAIRS_MAX	5

#define RULEFILE_SUFFIX		".rules"

enum key_operation {
	KEY_OP_UNSET,
	KEY_OP_MATCH,
	KEY_OP_NOMATCH,
	KEY_OP_ADD,
	KEY_OP_ASSIGN,
	KEY_OP_ASSIGN_FINAL,
};

struct key_pair {
	char name[NAME_SIZE];
	char value[VALUE_SIZE];
	enum key_operation operation;
};

struct udev_rule {
	struct list_head node;

	char kernel[NAME_SIZE];
	enum key_operation kernel_operation;
	char subsystem[NAME_SIZE];
	enum key_operation subsystem_operation;
	char action[NAME_SIZE];
	enum key_operation action_operation;
	char devpath[PATH_SIZE];
	enum key_operation devpath_operation;
	char bus[NAME_SIZE];
	enum key_operation bus_operation;
	char id[NAME_SIZE];
	enum key_operation id_operation;
	char driver[NAME_SIZE];
	enum key_operation driver_operation;
	char program[PATH_SIZE];
	enum key_operation program_operation;
	char result[PATH_SIZE];
	enum key_operation result_operation;
	struct key_pair sysfs_pair[KEY_SYSFS_PAIRS_MAX];
	int sysfs_pair_count;
	struct key_pair env_pair[KEY_ENV_PAIRS_MAX];
	int env_pair_count;
	char modalias[NAME_SIZE];
	enum key_operation modalias_operation;
	char import[PATH_SIZE];
	enum key_operation import_operation;
	int import_exec;

	char name[PATH_SIZE];
	enum key_operation name_operation;
	char symlink[PATH_SIZE];
	enum key_operation symlink_operation;
	char owner[USER_SIZE];
	enum key_operation owner_operation;
	char group[USER_SIZE];
	enum key_operation group_operation;
	mode_t mode;
	enum key_operation mode_operation;
	char run[PATH_SIZE];
	enum key_operation run_operation;

	int last_rule;
	int ignore_device;
	int ignore_remove;
	int partitions;

	char config_file[PATH_SIZE];
	int config_line;
};

extern int udev_rules_init(void);
extern void udev_rules_close(void);

extern int udev_rules_iter_init(void);
extern struct udev_rule *udev_rules_iter_next(void);

extern int udev_rules_get_name(struct udevice *udev, struct sysfs_class_device *class_dev);
extern int udev_rules_get_run(struct udevice *udev, struct sysfs_device *sysfs_device);

#endif