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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2016 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _DEVFSADM_H
#define _DEVFSADM_H
#include <sys/types.h>
#include <libdevinfo.h>
#include <sys/devinfo_impl.h>
#include <regex.h>
#undef DEBUG
#ifndef DEBUG
#define NDEBUG 1
#else
#undef NDEBUG
#endif
#include <assert.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DEVFSADM_SUCCESS 0
#define DEVFSADM_FAILURE -1
#define DEVFSADM_MULTIPLE -2
#define DEVFSADM_TRUE 0
#define DEVFSADM_FALSE -1
#define ILEVEL_0 0
#define ILEVEL_1 1
#define ILEVEL_2 2
#define ILEVEL_3 3
#define ILEVEL_4 4
#define ILEVEL_5 5
#define ILEVEL_6 6
#define ILEVEL_7 7
#define ILEVEL_8 8
#define ILEVEL_9 9
#define DEVFSADM_V0 0
#define DEVFSADM_V1 1
#define DEVFSADM_CONTINUE 0
#define DEVFSADM_TERMINATE 1
#define INTEGER 0
#define CHARACTER 1
#define RM_HOT 0x01
#define RM_PRE 0x02
#define RM_POST 0x04
#define RM_ALWAYS 0x08
#define RM_NOINTERPOSE 0x10
#define TYPE_EXACT 0x01
#define TYPE_RE 0x02
#define TYPE_PARTIAL 0x04
#define TYPE_MASK 0x07
#define DRV_EXACT 0x10
#define DRV_RE 0x20
#define DRV_MASK 0x30
#define CREATE_DEFER 0x100
#define CREATE_MASK 0x100
/* command to start daemon */
#define DEVFSADMD_START_PATH "/usr/lib/devfsadm/devfsadmd"
#define DEVFSADMD_START "devfsadmd"
/* devfsadm event service door */
#define DEVFSADM_SERVICE_DOOR "/etc/sysevent/devfsadm_event_channel"
#define DEVNAME_LOOKUP_DOOR ".devname_lookup_door"
/* File of reserved devnames */
#define ENUMERATE_RESERVED "/etc/dev/reserved_devnames"
/* flags for devfsadm_mklink */
#define DEV_SYNC 0x02 /* synchronous mklink */
#define INFO_MID NULL /* always prints */
#define VERBOSE_MID "verbose" /* prints with -v */
#define CHATTY_MID "chatty" /* prints with -V chatty */
typedef struct devfsadm_create {
char *device_class; /* eg "disk", "tape", "display" */
char *node_type; /* eg DDI_NT_TAPE, DDI_NT_BLOCK, etc */
char *drv_name; /* eg sd, ssd */
int flags; /* TYPE_{EXACT,RE,PARTIAL}, DRV_{EXACT,RE} */
int interpose_lvl; /* eg ILEVEL_0.. ILEVEL_10 */
int (*callback_fcn)(di_minor_t minor, di_node_t node);
} devfsadm_create_t;
typedef struct devfsadm_remove {
char *device_class; /* eg "disk", "tape", "display" */
char *dev_dirs_re; /* dev dirs regex selector */
int flags; /* eg POST, PRE, HOT, ALWAYS */
int interpose_lvl; /* eg ILEVEL_0 .. ILEVEL_10 */
void (*callback_fcn)(char *);
} devfsadm_remove_t;
typedef struct devfsadm_remove_V1 {
char *device_class; /* eg "disk", "tape", "display" */
char *dev_dirs_re; /* dev dirs regex selector */
int flags; /* eg POST, PRE, HOT, ALWAYS */
int interpose_lvl; /* eg ILEVEL_0 .. ILEVEL_10 */
int (*callback_fcn)(char *);
} devfsadm_remove_V1_t;
typedef struct _devfsadm_create_reg {
uint_t version;
uint_t count; /* number of node type registration */
/* structures */
devfsadm_create_t *tblp;
} _devfsadm_create_reg_t;
typedef struct _devfsadm_remove_reg {
uint_t version;
uint_t count; /* number of node type registration */
/* structures */
devfsadm_remove_t *tblp;
} _devfsadm_remove_reg_t;
typedef struct _devfsadm_remove_reg_V1 {
uint_t version;
uint_t count; /* number of node type registration */
/* structures */
devfsadm_remove_V1_t *tblp;
} _devfsadm_remove_reg_V1_t;
/*
* "flags" in the devfs_enumerate structure can take the following values.
* These values specify the substring of devfs path to be used for
* enumeration. Components (see MATCH_ADDR/MATCH_MINOR) may be specified
* by using the "match_arg" member in the devfsadm_enumerate structure.
*/
#define MATCH_ALL 0x001 /* Match entire devfs path */
#define MATCH_PARENT 0x002 /* Match upto last '/' in devfs path */
#define MATCH_ADDR 0x004 /* Match upto nth component of last address */
#define MATCH_MINOR 0x008 /* Match upto nth component of minor name */
#define MATCH_CALLBACK 0x010 /* Use callback to derive match string */
/*
* The following flags are private to devfsadm and the disks module.
* NOT to be used by other modules.
*/
#define MATCH_NODE 0x020
#define MATCH_MASK 0x03F
#define MATCH_UNCACHED 0x040 /* retry flags for disks module */
typedef struct devfsadm_enumerate {
char *re;
int subexp;
uint_t flags;
char *match_arg;
char *(*sel_fcn)(const char *path, void *cb_arg);
void *cb_arg;
} devfsadm_enumerate_t;
#define DEVFSADM_CREATE_INIT_V0(tbl) \
_devfsadm_create_reg_t _devfsadm_create_reg = { \
DEVFSADM_V0, \
(sizeof (tbl) / sizeof (devfsadm_create_t)), \
((devfsadm_create_t *)(tbl)) }
#define DEVFSADM_REMOVE_INIT_V0(tbl)\
_devfsadm_remove_reg_t _devfsadm_remove_reg = {\
DEVFSADM_V0, \
(sizeof (tbl) / sizeof (devfsadm_remove_t)), \
((devfsadm_remove_t *)(tbl)) }
#define DEVFSADM_REMOVE_INIT_V1(tbl)\
_devfsadm_remove_reg_V1_t _devfsadm_remove_reg = {\
DEVFSADM_V1, \
(sizeof (tbl) / sizeof (devfsadm_remove_V1_t)), \
((devfsadm_remove_V1_t *)(tbl)) }
/* reserved devname support */
typedef struct devlink_re {
char *d_re;
int d_subexp;
regex_t d_rcomp;
regmatch_t *d_pmatch;
} devlink_re_t;
typedef struct enumerate_file {
char *er_file;
char *er_id;
struct enumerate_file *er_next;
} enumerate_file_t;
int devfsadm_noupdate(void);
const char *devfsadm_root_path(void);
int devfsadm_link_valid(di_node_t anynode, char *link);
int devfsadm_mklink(char *link, di_node_t node, di_minor_t minor, int flags);
int devfsadm_secondary_link(char *link, char *primary_link, int flags);
void devfsadm_rm_link(char *file);
void devfsadm_rm_all(char *file);
void devfsadm_rm_stale_links(char *dir_re, char *valid_link, di_node_t node,
di_minor_t minor);
void devfsadm_errprint(char *message, ...);
void devfsadm_print(char *mid, char *message, ...);
int devfsadm_enumerate_int(char *devfs_path, int index, char **buf,
devfsadm_enumerate_t rules[], int nrules);
int devfsadm_enumerate_char(char *devfs_path, int index, char **buf,
devfsadm_enumerate_t rules[], int nrules);
char **devfsadm_lookup_dev_names(char *phys_path, char *re, int *lenp);
void devfsadm_free_dev_names(char **dev_names, int len);
/* devlink cache related */
di_devlink_handle_t devfsadm_devlink_cache(void);
/*
* Private enumerate interface for controllers, disks, and sgen modules
*/
int ctrl_enumerate_int(char *devfs_path, int index, char **buf,
devfsadm_enumerate_t rules[], int nrules,
int multiple, boolean_t scsi_vhci);
/*
* Private interfaces for ports module (port_link.c).
*/
int devfsadm_enumerate_char_start(char *devfs_path, int index,
char **buf, devfsadm_enumerate_t rules[], int nrules, char *start);
int devfsadm_read_link(di_node_t node, char *link, char **devfs_path);
char *s_strdup(const char *ptr);
/* Private interface between reserve subsystm and disks link generator */
int devfsadm_have_reserved(void);
int devfsadm_is_reserved(devlink_re_t re_array[], char *devlink);
int devfsadm_reserve_id_cache(devlink_re_t re_array[], enumerate_file_t *head);
#ifdef __cplusplus
}
#endif
#endif /* _DEVFSADM_H */
|