bsm_fcntl.c revision 256281
119304Speter/*-
219304Speter * Copyright (c) 2008-2009 Apple Inc.
319304Speter * All rights reserved.
419304Speter *
519304Speter * Redistribution and use in source and binary forms, with or without
619304Speter * modification, are permitted provided that the following conditions
719304Speter * are met:
819304Speter * 1.  Redistributions of source code must retain the above copyright
919304Speter *     notice, this list of conditions and the following disclaimer.
1019304Speter * 2.  Redistributions in binary form must reproduce the above copyright
1119304Speter *     notice, this list of conditions and the following disclaimer in the
1219304Speter *     documentation and/or other materials provided with the distribution.
13254225Speter * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
1419304Speter *     its contributors may be used to endorse or promote products derived
1519304Speter *     from this software without specific prior written permission.
1619304Speter *
1719304Speter * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
1819304Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1919304Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2019304Speter * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
2119304Speter * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2219304Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2319304Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2419304Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2519304Speter * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2619304Speter * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2719304Speter * POSSIBILITY OF SUCH DAMAGE.
2819304Speter *
2919304Speter * P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_fcntl.c#2
3019304Speter */
3119304Speter
3219304Speter#include <sys/cdefs.h>
3319304Speter__FBSDID("$FreeBSD: stable/10/sys/security/audit/bsm_fcntl.c 244267 2012-12-15 15:21:09Z rwatson $");
3419304Speter
3519304Speter#include <sys/param.h>
3619304Speter#include <sys/fcntl.h>
3719304Speter
38254225Speter#include <security/audit/audit.h>
3919304Speter
4019304Speter#include <bsm/audit_fcntl.h>
4119304Speter#include <bsm/audit_record.h>
4219304Speter
4319304Speterstruct bsm_fcntl_cmd {
4419304Speter	u_short	bfc_bsm_fcntl_cmd;
4519304Speter	int	bfc_local_fcntl_cmd;
4619304Speter};
4719304Spetertypedef struct bsm_fcntl_cmd	bsm_fcntl_cmd_t;
4819304Speter
4919304Speterstatic const bsm_fcntl_cmd_t bsm_fcntl_cmdtab[] = {
5019304Speter	{ BSM_F_DUPFD, 		F_DUPFD },
5119304Speter	{ BSM_F_GETFD,		F_GETFD },
5219304Speter	{ BSM_F_SETFD,		F_SETFD	},
5319304Speter	{ BSM_F_GETFL,		F_GETFL },
5419304Speter	{ BSM_F_SETFL,		F_SETFL },
5519304Speter#ifdef	F_O_GETLK
5619304Speter	{ BSM_F_O_GETLK,	F_O_GETLK },
5719304Speter#endif
5819304Speter	{ BSM_F_SETLK,		F_SETLK },
5919304Speter	{ BSM_F_SETLKW,		F_SETLK },
6019304Speter#ifdef	F_CHFL
61254225Speter	{ BSM_F_CHKFL,		F_CHKFL },
6219304Speter#endif
6319304Speter#ifdef 	F_DUP2FD
6419304Speter	{ BSM_F_DUP2FD,		F_DUP2FD },
6519304Speter#endif
6619304Speter#ifdef	F_ALLOCSP
6719304Speter	{ BSM_F_ALLOCSP,	F_ALLOCSP },
6819304Speter#endif
6919304Speter#ifdef	F_FREESP
7019304Speter	{ BSM_F_FREESP,		F_FREESP },
7119304Speter#endif
7219304Speter#ifdef	F_ISSTREAM
7319304Speter	{ BSM_F_ISSTREAM,	F_ISSTREAM},
7419304Speter#endif
7519304Speter	{ BSM_F_GETLK,		F_GETLK },
7619304Speter#ifdef 	F_PRIV
7719304Speter	{ BSM_F_PRIV,		F_PRIV },
7819304Speter#endif
7919304Speter#ifdef	F_NPRIV
8019304Speter	{ BSM_F_NPRIV,		F_NPRIV },
8119304Speter#endif
8219304Speter#ifdef 	F_QUOTACTL
8319304Speter	{ BSM_F_QUOTACTL,	F_QUOTACTL },
84254225Speter#endif
8519304Speter#ifdef	F_BLOCKS
8619304Speter	{ BSM_F_BLOCKS,		F_BLOCKS },
8719304Speter#endif
8819304Speter#ifdef	F_BLKSIZE
8919304Speter	{ BSM_F_BLKSIZE,	F_BLKSIZE },
9019304Speter#endif
9119304Speter	{ BSM_F_GETOWN,		F_GETOWN },
9219304Speter	{ BSM_F_SETOWN,		F_SETOWN },
9319304Speter#ifdef	F_REVOKE
9419304Speter	{ BSM_F_REVOKE,		F_REVOKE },
9519304Speter#endif
96254225Speter#ifdef 	F_HASREMOTEBLOCKS
9719304Speter	{ BSM_F_HASREMOTEBLOCKS,
9819304Speter				F_HASREMOTEBLOCKS },
9919304Speter#endif
10019304Speter#ifdef 	F_FREESP
10119304Speter	{ BSM_F_FREESP,		F_FREESP },
10219304Speter#endif
10319304Speter#ifdef 	F_ALLOCSP
10419304Speter	{ BSM_F_ALLOCSP,	F_ALLOCSP },
10519304Speter#endif
10619304Speter#ifdef	F_FREESP64
10719304Speter	{ BSM_F_FREESP64,	F_FREESP64 },
10819304Speter#endif
10919304Speter#ifdef 	F_ALLOCSP64
11019304Speter	{ BSM_F_ALLOCSP64,	F_ALLOCSP64 },
111254225Speter#endif
11219304Speter#ifdef	F_GETLK64
11319304Speter	{ BSM_F_GETLK64, 	F_GETLK64 },
11419304Speter#endif
11519304Speter#ifdef	F_SETLK64
11619304Speter	{ BSM_F_SETLK64, 	F_SETLK64 },
11719304Speter#endif
11819304Speter#ifdef	F_SETLKW64
11919304Speter	{ BSM_F_SETLKW64, 	F_SETLKW64 },
120254225Speter#endif
12119304Speter#ifdef	F_SHARE
12219304Speter	{ BSM_F_SHARE,		F_SHARE },
123254225Speter#endif
12419304Speter#ifdef	F_UNSHARE
12519304Speter	{ BSM_F_UNSHARE,	F_UNSHARE },
12619304Speter#endif
12719304Speter#ifdef	F_SETLK_NBMAND
12819304Speter	{ BSM_F_SETLK_NBMAND,	F_SETLK_NBMAND },
12919304Speter#endif
13019304Speter#ifdef	F_SHARE_NBMAND
13119304Speter	{ BSM_F_SHARE_NBMAND,	F_SHARE_NBMAND },
13219304Speter#endif
13319304Speter#ifdef	F_SETLK64_NBMAND
13419304Speter	{ BSM_F_SETLK64_NBMAND,	F_SETLK64_NBMAND },
13519304Speter#endif
13619304Speter#ifdef	F_GETXFL
13719304Speter	{ BSM_F_GETXFL,		F_GETXFL },
138254225Speter#endif
13919304Speter#ifdef	F_BADFD
14019304Speter	{ BSM_F_BADFD,		F_BADFD },
14119304Speter#endif
14219304Speter#ifdef	F_OGETLK
14319304Speter	{ BSM_F_OGETLK,		F_OGETLK },
14419304Speter#endif
14519304Speter#ifdef	F_OSETLK
14619304Speter	{ BSM_F_OSETLK,		F_OSETLK },
14719304Speter#endif
14819304Speter#ifdef	F_OSETLKW
14919304Speter	{ BSM_F_OSETLKW,	F_OSETLKW },
15019304Speter#endif
15119304Speter#ifdef	F_SETLK_REMOTE
15219304Speter	{ BSM_F_SETLK_REMOTE,	F_SETLK_REMOTE },
15319304Speter#endif
15419304Speter
15519304Speter#ifdef	F_SETSIG
15619304Speter	{ BSM_F_SETSIG,		F_SETSIG },
15719304Speter#endif
15819304Speter#ifdef	F_GETSIG
15919304Speter	{ BSM_F_GETSIG,		F_GETSIG },
16019304Speter#endif
16119304Speter
16219304Speter#ifdef	F_CHKCLEAN
16319304Speter	{ BSM_F_CHKCLEAN,	F_CHKCLEAN },
16419304Speter#endif
16519304Speter#ifdef	F_PREALLOCATE
16619304Speter	{ BSM_F_PREALLOCATE,	F_PREALLOCATE },
16719304Speter#endif
168#ifdef	F_SETSIZE
169	{ BSM_F_SETSIZE,	F_SETSIZE },
170#endif
171#ifdef	F_RDADVISE
172	{ BSM_F_RDADVISE,	F_RDADVISE },
173#endif
174#ifdef	F_RDAHEAD
175	{ BSM_F_RDAHEAD,	F_RDAHEAD },
176#endif
177#ifdef	F_READBOOTSTRAP
178	{ BSM_F_READBOOTSTRAP,	F_READBOOTSTRAP },
179#endif
180#ifdef	F_WRITEBOOTSTRAP
181	{ BSM_F_WRITEBOOTSTRAP,	F_WRITEBOOTSTRAP },
182#endif
183#ifdef	F_NOCACHE
184	{ BSM_F_NOCACHE,	F_NOCACHE },
185#endif
186#ifdef	F_LOG2PHYS
187	{ BSM_F_LOG2PHYS,	F_LOG2PHYS },
188#endif
189#ifdef	F_GETPATH
190	{ BSM_F_GETPATH,	F_GETPATH },
191#endif
192#ifdef	F_FULLFSYNC
193	{ BSM_F_FULLFSYNC,	F_FULLFSYNC },
194#endif
195#ifdef	F_PATHPKG_CHECK
196	{ BSM_F_PATHPKG_CHECK,	F_PATHPKG_CHECK },
197#endif
198#ifdef	F_FREEZE_FS
199	{ BSM_F_FREEZE_FS,	F_FREEZE_FS },
200#endif
201#ifdef	F_THAW_FS
202	{ BSM_F_THAW_FS,	F_THAW_FS },
203#endif
204#ifdef	F_GLOBAL_NOCACHE
205	{ BSM_F_GLOBAL_NOCACHE,	F_GLOBAL_NOCACHE },
206#endif
207#ifdef	F_OPENFROM
208	{ BSM_F_OPENFROM,	F_OPENFROM },
209#endif
210#ifdef	F_UNLINKFROM
211	{ BSM_F_UNLINKFROM,	F_UNLINKFROM },
212#endif
213#ifdef	F_CHECK_OPENEVT
214	{ BSM_F_CHECK_OPENEVT,	F_CHECK_OPENEVT },
215#endif
216#ifdef	F_ADDSIGS
217	{ BSM_F_ADDSIGS,	F_ADDSIGS },
218#endif
219#ifdef	F_MARKDEPENDENCY
220	{ BSM_F_MARKDEPENDENCY,	F_MARKDEPENDENCY },
221#endif
222
223#ifdef	FCNTL_FS_SPECIFIC_BASE
224	{ BSM_F_FS_SPECIFIC_0,	FCNTL_FS_SPECIFIC_BASE},
225	{ BSM_F_FS_SPECIFIC_1,	FCNTL_FS_SPECIFIC_BASE + 1},
226	{ BSM_F_FS_SPECIFIC_2,	FCNTL_FS_SPECIFIC_BASE + 2},
227	{ BSM_F_FS_SPECIFIC_3,	FCNTL_FS_SPECIFIC_BASE + 3},
228	{ BSM_F_FS_SPECIFIC_4,	FCNTL_FS_SPECIFIC_BASE + 4},
229	{ BSM_F_FS_SPECIFIC_5,	FCNTL_FS_SPECIFIC_BASE + 5},
230	{ BSM_F_FS_SPECIFIC_6,	FCNTL_FS_SPECIFIC_BASE + 6},
231	{ BSM_F_FS_SPECIFIC_7,	FCNTL_FS_SPECIFIC_BASE + 7},
232	{ BSM_F_FS_SPECIFIC_8,	FCNTL_FS_SPECIFIC_BASE + 8},
233	{ BSM_F_FS_SPECIFIC_9,	FCNTL_FS_SPECIFIC_BASE + 9},
234	{ BSM_F_FS_SPECIFIC_10,	FCNTL_FS_SPECIFIC_BASE + 10},
235	{ BSM_F_FS_SPECIFIC_11,	FCNTL_FS_SPECIFIC_BASE + 11},
236	{ BSM_F_FS_SPECIFIC_12,	FCNTL_FS_SPECIFIC_BASE + 12},
237	{ BSM_F_FS_SPECIFIC_13,	FCNTL_FS_SPECIFIC_BASE + 13},
238	{ BSM_F_FS_SPECIFIC_14,	FCNTL_FS_SPECIFIC_BASE + 14},
239	{ BSM_F_FS_SPECIFIC_15,	FCNTL_FS_SPECIFIC_BASE + 15},
240#endif	/* FCNTL_FS_SPECIFIC_BASE */
241};
242static const int bsm_fcntl_cmd_count = sizeof(bsm_fcntl_cmdtab) /
243	    sizeof(bsm_fcntl_cmdtab[0]);
244
245static const bsm_fcntl_cmd_t *
246bsm_lookup_local_fcntl_cmd(int local_fcntl_cmd)
247{
248	int i;
249
250	for (i = 0; i < bsm_fcntl_cmd_count; i++) {
251		if (bsm_fcntl_cmdtab[i].bfc_local_fcntl_cmd ==
252		    local_fcntl_cmd)
253			return (&bsm_fcntl_cmdtab[i]);
254	}
255	return (NULL);
256}
257
258u_short
259au_fcntl_cmd_to_bsm(int local_fcntl_cmd)
260{
261	const bsm_fcntl_cmd_t *bfcp;
262
263	bfcp = bsm_lookup_local_fcntl_cmd(local_fcntl_cmd);
264	if (bfcp == NULL)
265		return (BSM_F_UNKNOWN);
266	return (bfcp->bfc_bsm_fcntl_cmd);
267}
268
269static const bsm_fcntl_cmd_t *
270bsm_lookup_bsm_fcntl_cmd(u_short bsm_fcntl_cmd)
271{
272	int i;
273
274	for (i = 0; i < bsm_fcntl_cmd_count; i++) {
275		if (bsm_fcntl_cmdtab[i].bfc_bsm_fcntl_cmd ==
276		    bsm_fcntl_cmd)
277			return (&bsm_fcntl_cmdtab[i]);
278	}
279	return (NULL);
280}
281
282int
283au_bsm_to_fcntl_cmd(u_short bsm_fcntl_cmd, int *local_fcntl_cmdp)
284{
285	const bsm_fcntl_cmd_t *bfcp;
286
287	bfcp = bsm_lookup_bsm_fcntl_cmd(bsm_fcntl_cmd);
288	if (bfcp == NULL || bfcp->bfc_local_fcntl_cmd)
289		return (-1);
290	*local_fcntl_cmdp = bfcp->bfc_local_fcntl_cmd;
291	return (0);
292}
293