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
|
/*
* 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 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#ifndef _SYS_SAD_H
#define _SYS_SAD_H
#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.5 */
#include <sys/types.h>
#ifdef _KERNEL
#include <sys/strsubr.h>
#endif
#include <sys/modhash.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Streams Administrative Driver
*/
/*
* As time has passed, it has become necessary to add members to some
* of the structures passed downstream with these ioctls. Currently,
* only the SAD_GAP/SAD_SAP ioctls are versioned, (which use the
* strapush structure), but the versioning mechanism is general enough
* to be applied to any SAD ioctls. This is done by repartitioning
* the SAD ioctl namespace to include a version number in addition to
* the command (see below).
*
* In the case of the SAD_GAP/SAD_SAP ioctls, an application can
* choose which "version" of the ioctl to use by #defining AP_VERSION
* before including this file. Old code implicitly has AP_VERSION set
* to 0, and even newly compiled code defaults to an AP_VERSION of 0,
* since it may not be aware of the new structure members and
* therefore not know to set them to reasonable values. In order for
* programs to make use of a newer version, they must explicitly
* #define AP_VERSION to the appropriate value. Note that the kernel
* always defaults to the latest version, since it is internally
* self-consistent.
*/
#ifndef AP_VERSION
#ifdef _KERNEL
#define AP_VERSION 1 /* latest version */
#else
#define AP_VERSION 0 /* SVR4 version */
#endif
#endif
/*
* ioctl defines
*
* The layout for the low 16 bits is 01000101VVVVCCCC, where the
* first bitpattern is `D' in binary, followed by a 4 bit version
* field (limiting the number of versions to 16), followed by a
* 4 bit command field (limiting the number of commands to 16).
*/
#define SADIOC ('D' << 8)
#define SAD_SAP (SADIOC|AP_VERSION << 4|01)
#define SAD_GAP (SADIOC|AP_VERSION << 4|02)
#define SAD_VML (SADIOC|03) /* validate module list */
/*
* Device naming and numbering conventions.
*/
#define USERDEV "/dev/sad/user"
#define ADMINDEV "/dev/sad/admin"
#define USRMIN 0
#define ADMMIN 1
/*
* The maximum modules you can push on a stream using the autopush
* feature. This should be less than NSTRPUSH.
*/
#define MAXAPUSH 8
/*
* autopush info common to user and kernel
*/
struct apcommon {
uint_t apc_cmd; /* command (see below) */
major_t apc_major; /* major # of device */
minor_t apc_minor; /* minor # of device */
minor_t apc_lastminor; /* last minor for range */
uint_t apc_npush; /* number of modules to push */
};
/*
* New autopush information structure. This wouldn't be necessary
* except `struct apcommon' wasn't defined last in the `strapush'
* structure, making it difficult to grow the structure without
* breaking binary compatibility. Note that new members can be added
* to this structure in the future, at which point AP_VERSION should
* be incremented (of course, a new STRAPUSH_Vx_LEN macro should be
* added and sad.c should be changed to handle the new member).
*/
struct apdata {
uint_t apd_anchor; /* position of anchor in stream */
};
/*
* ap_cmd: various flavors of autopush
*/
#define SAP_CLEAR 0 /* remove configuration list */
#define SAP_ONE 1 /* configure one minor device */
#define SAP_RANGE 2 /* configure range of minor devices */
#define SAP_ALL 3 /* configure all minor devices */
/*
* format for autopush ioctls
*/
struct strapush {
struct apcommon sap_common; /* see above */
char sap_list[MAXAPUSH][FMNAMESZ + 1]; /* module list */
#if AP_VERSION > 0
struct apdata sap_data; /* see above */
#endif
};
#define sap_cmd sap_common.apc_cmd
#define sap_major sap_common.apc_major
#define sap_minor sap_common.apc_minor
#define sap_lastminor sap_common.apc_lastminor
#define sap_npush sap_common.apc_npush
#define sap_anchor sap_data.apd_anchor
#ifdef _KERNEL
/*
* state values for ioctls
*/
#define GETSTRUCT 1
#define GETRESULT 2
#define GETLIST 3
#define SAD_VER(ioccmd) (((ioccmd) >> 4) & 0x0f)
#define SAD_CMD(ioccmd) ((ioccmd) & ~0xf0)
#define STRAPUSH_V0_LEN (size_t)(&((struct strapush *)0)->sap_data)
#define STRAPUSH_V1_LEN (size_t)(STRAPUSH_V0_LEN + sizeof (uint_t))
struct saddev {
queue_t *sa_qp; /* pointer to read queue */
caddr_t sa_addr; /* saved address for copyout */
int sa_flags; /* see below */
str_stack_t *sa_ss;
};
/*
* values for saddev flags field.
*/
#define SADPRIV 0x01
/*
* Module Autopush Cache
*/
struct autopush {
struct apcommon ap_common; /* see above */
char ap_list[MAXAPUSH][FMNAMESZ + 1];
/* list of modules to push */
int ap_cnt; /* in use count */
struct apdata ap_data; /* see above */
};
/*
* The command issued by the user ultimately becomes
* the type of the autopush entry. Therefore, occurrences of
* "type" in the code refer to an existing autopush entry.
* Occurrences of "cmd" in the code refer to the command the
* user is currently trying to complete. types and cmds take
* on the same values.
*/
#define ap_type ap_common.apc_cmd
#define ap_major ap_common.apc_major
#define ap_minor ap_common.apc_minor
#define ap_lastminor ap_common.apc_lastminor
#define ap_npush ap_common.apc_npush
#define ap_anchor ap_data.apd_anchor
/*
* function prototypes
*/
#ifdef C2_AUDIT
void audit_stropen(struct vnode *, dev_t *, int, cred_t *);
void audit_strclose(struct vnode *, int, cred_t *);
void audit_strioctl(struct vnode *, int, intptr_t, int, int, cred_t *, int *);
struct strbuf;
void audit_strputmsg(struct vnode *, struct strbuf *, struct strbuf *,
unsigned char, int, int);
void audit_fdsend(int, struct file *, int);
void audit_fdrecv(int, struct file *);
#endif
extern void sad_initspace(str_stack_t *);
extern void sad_freespace(str_stack_t *);
/*
* The following interfaces do not care about ss_sad_lock.
*/
extern struct autopush *sad_ap_alloc(void);
extern int sad_apc_verify(struct apcommon *);
extern int sad_ap_verify(struct autopush *);
/*
* The following interfaces attempt to acquire ss_sad_lock.
*/
extern void sad_ap_rele(struct autopush *, str_stack_t *);
extern struct autopush *sad_ap_find_by_dev(dev_t, str_stack_t *);
/*
* The following interfaces require ss_sad_lock to be held when invoked.
*/
extern void sad_ap_insert(struct autopush *, str_stack_t *);
extern void sad_ap_remove(struct autopush *, str_stack_t *);
extern struct autopush *sad_ap_find(struct apcommon *, str_stack_t *);
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_SAD_H */
|