summaryrefslogtreecommitdiff
path: root/udev.h
blob: 9327e90913a9ca4d0355856528177ed3deca4b6b (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
 * udev.h
 *
 * Userspace devfs
 *
 * Copyright (C) 2003 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_H
#define UDEV_H

#include <stdlib.h>
#include <string.h>
#include <sysfs/libsysfs.h>
#include <stddef.h>
#include <sys/param.h>

#define COMMENT_CHARACTER		'#'

#define NAME_SIZE	100
#define OWNER_SIZE	30
#define GROUP_SIZE	30
#define MODE_SIZE	8

#define ACTION_SIZE	30
#define DEVPATH_SIZE	255
#define SUBSYSTEM_SIZE	30

/* length of public data */
#define UDEVICE_LEN (offsetof(struct udevice, bus_id))

struct udevice {
	char name[NAME_SIZE];
	char owner[OWNER_SIZE];
	char group[GROUP_SIZE];
	char type;
	int major;
	int minor;
	unsigned int mode;	/* not mode_t due to conflicting definitions in different libcs */
	char symlink[NAME_SIZE];
	int partitions;

	/* private data that help us in building strings */
	char bus_id[SYSFS_NAME_LEN];
	char program_result[NAME_SIZE];
	char kernel_number[NAME_SIZE];
	char kernel_name[NAME_SIZE];
};

#define strfieldcpy(to, from) \
do { \
	to[sizeof(to)-1] = '\0'; \
	strncpy(to, from, sizeof(to)-1); \
} while (0)

#define strfieldcat(to, from) \
do { \
	to[sizeof(to)-1] = '\0'; \
	strncat(to, from, sizeof(to) - strlen(to)-1); \
} while (0)

#define strnfieldcpy(to, from, maxsize) \
do { \
	to[maxsize-1] = '\0'; \
	strncpy(to, from, maxsize-1); \
} while (0)

#define strnfieldcat(to, from, maxsize) \
do { \
	to[maxsize-1] = '\0'; \
	strncat(to, from, maxsize - strlen(to)-1); \
} while (0)

#define strintcat(to, i) \
do { \
	to[sizeof(to)-1] = '\0'; \
	snprintf((to) + strlen(to), sizeof(to) - strlen(to)-1, "%u", i); \
} while (0)

#define strnintcat(to, i, maxsize) \
do { \
	to[maxsize-1] = '\0'; \
	snprintf((to) + strlen(to), maxsize - strlen(to)-1, "%u", i); \
} while (0)

#define foreach_strpart(str, separator, pos, len) \
	for(pos = 0, len = strcspn(str, separator); \
	    (pos) < strlen(str); \
	    pos = pos + (len) + 1, len = strcspn((str) + pos, separator)) \
		if (len > 0)

static inline char *get_action(void)
{
	char *action;

	action = getenv("ACTION");
	if (action != NULL && strlen(action) > ACTION_SIZE)
		action[ACTION_SIZE-1] = '\0';

	return action;
}

static inline char *get_devpath(void)
{
	char *devpath;

	devpath = getenv("DEVPATH");
	if (devpath != NULL && strlen(devpath) > DEVPATH_SIZE)
		devpath[DEVPATH_SIZE-1] = '\0';

	return devpath;
}

static inline char *get_seqnum(void)
{
	char *seqnum;

	seqnum = getenv("SEQNUM");

	return seqnum;
}

static inline char *get_subsystem(char *subsystem)
{
	if (subsystem != NULL && strlen(subsystem) > SUBSYSTEM_SIZE)
		subsystem[SUBSYSTEM_SIZE-1] = '\0';

	return subsystem;
}

extern int udev_add_device(char *path, char *subsystem, int fake);
extern int udev_remove_device(char *path, char *subsystem);
extern void udev_init_config(void);
extern int parse_get_pair(char **orig_string, char **left, char **right);

extern char **main_argv;
extern char **main_envp;
extern char sysfs_path[SYSFS_PATH_MAX];
extern char udev_root[PATH_MAX];
extern char udev_db_filename[PATH_MAX+NAME_MAX];
extern char udev_permissions_filename[PATH_MAX+NAME_MAX];
extern char udev_config_filename[PATH_MAX+NAME_MAX];
extern char udev_rules_filename[PATH_MAX+NAME_MAX];
extern char default_mode_str[MODE_SIZE];
extern char default_owner_str[OWNER_SIZE];
extern char default_group_str[GROUP_SIZE];
extern int udev_log;
extern int udev_sleep;

#endif