Add kernel-layer support for chflags checks, remove (most) from the VFS layer.
[dragonfly.git] / sys / sys / nlookup.h
CommitLineData
690a3127
MD
1/*
2 * Copyright (c) 2004 The DragonFly Project. All rights reserved.
3 *
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@backplane.com>
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
5312fa43 34 * $DragonFly: src/sys/sys/nlookup.h,v 1.6 2008/05/09 17:52:18 dillon Exp $
690a3127
MD
35 */
36
37#ifndef _SYS_NLOOKUP_H_
38#define _SYS_NLOOKUP_H_
39
fad57d0e
MD
40#ifndef _SYS_UIO_H_
41#include <sys/uio.h>
42#endif
28623bf9
MD
43#ifndef _SYS_NAMECACHE_H_
44#include <sys/namecache.h>
45#endif
fad57d0e
MD
46
47struct vnode;
21739618
MD
48struct vattr;
49struct mount;
21739618
MD
50struct thread;
51struct ucred;
52
690a3127
MD
53/*
54 * nlookup component
55 */
56struct nlcomponent {
57 char *nlc_nameptr;
58 int nlc_namelen;
59};
60
61/*
21739618
MD
62 * Encapsulation of nlookup parameters.
63 *
64 * Note on nl_flags and nl_op: nl_flags supports a simplified subset of
65 * namei's original CNP flags. nl_op (e.g. NAMEI_*) does no in any way
66 * effect the state of the returned namecache and is only used to enforce
67 * access checks.
690a3127
MD
68 */
69struct nlookupdata {
fad57d0e 70 /*
28623bf9 71 * These fields are setup by nlookup_init() with nl_nch set to
fad57d0e
MD
72 * the current directory if a process or the root directory if
73 * a pure thread. The result from nlookup() will be returned in
28623bf9 74 * nl_nch.
fad57d0e 75 */
28623bf9
MD
76 struct nchandle nl_nch; /* start-point and result */
77 struct nchandle nl_rootnch; /* root directory */
78 struct nchandle nl_jailnch; /* jail directory */
690a3127
MD
79
80 char *nl_path; /* path buffer */
81 struct thread *nl_td; /* thread requesting the nlookup */
82 struct ucred *nl_cred; /* credentials for nlookup */
5312fa43 83 struct vnode *nl_dvp; /* NLC_REFDVP */
690a3127
MD
84
85 int nl_flags; /* operations flags */
86 int nl_loopcnt; /* symlinks encountered */
fad57d0e
MD
87
88 /*
89 * These fields are populated by vn_open(). nlookup_done() will
90 * vn_close() a non-NULL vp so if you extract it be sure to NULL out
91 * nl_open_vp.
92 */
93 struct vnode *nl_open_vp;
94 int nl_vp_fmode;
690a3127
MD
95};
96
3a907475
MD
97/*
98 * NOTE: nlookup() flags related to open checks do not actually perform
99 * any modifying operation. e.g. the file isn't created, truncated,
100 * etc. vn_open() handles that.
101 */
21739618
MD
102#define NLC_FOLLOW 0x00000001 /* follow leaf symlink */
103#define NLC_NOCROSSMOUNT 0x00000002 /* do not cross mount points */
104#define NLC_HASBUF 0x00000004 /* nl_path is allocated */
105#define NLC_ISWHITEOUT 0x00000008
106#define NLC_WILLBEDIR 0x00000010
107#define NLC_NCPISLOCKED 0x00000020
fad57d0e 108#define NLC_LOCKVP 0x00000040 /* nl_open_vp from vn_open */
3a907475
MD
109#define NLC_CREATE 0x00000080 /* do create checks */
110#define NLC_DELETE 0x00000100 /* do delete checks */
111#define NLC_RENAME_DST 0x00000200 /* do rename checks (target) */
112#define NLC_OPEN 0x00000400 /* do open checks */
113#define NLC_TRUNCATE 0x00000800 /* do truncation checks */
114#define NLC_HLINK 0x00001000 /* do hardlink checks */
115#define NLC_RENAME_SRC 0x00002000 /* do rename checks (source) */
116#define NLC_UNUSED00004000 0x00004000
117#define NLC_UNUSED00008000 0x00008000
fad57d0e
MD
118#define NLC_NFS_RDONLY 0x00010000 /* set by nfs_namei() only */
119#define NLC_NFS_NOSOFTLINKTRAV 0x00020000 /* do not traverse softlnks */
5312fa43 120#define NLC_REFDVP 0x00040000 /* set ref'd/unlocked nl_dvp */
690a3127 121
3a907475
MD
122#define NLC_APPEND 0x00100000 /* open check: append */
123#define NLC_UNUSED00200000 0x00200000
124
125#define NLC_READ 0x00400000 /* require read access */
126#define NLC_WRITE 0x00800000 /* require write access */
127#define NLC_EXEC 0x01000000 /* require execute access */
128#define NLC_EXCL 0x02000000 /* open check: exclusive */
129#define NLC_OWN 0x04000000 /* open check: owner override */
130#define NLC_UNUSED08000000 0x08000000
131#define NLC_STICKY 0x10000000 /* indicate sticky case */
132#define NLC_APPENDONLY 0x20000000 /* indicate append-only */
133#define NLC_IMMUTABLE 0x40000000 /* indicate immutable set */
134#define NLC_WRITABLE 0x80000000 /* indicate writeable */
135
136/*
137 * All checks. If any of these bits are set general user/group/world
138 * permission checks will be done by nlookup().
139 */
140#define NLC_ALLCHKS (NLC_CREATE | NLC_DELETE | NLC_RENAME_DST | \
141 NLC_OPEN | NLC_TRUNCATE | NLC_RENAME_SRC | \
142 NLC_READ | NLC_WRITE | NLC_EXEC | NLC_OWN)
143
690a3127
MD
144#ifdef _KERNEL
145
146int nlookup_init(struct nlookupdata *, const char *, enum uio_seg, int);
28623bf9 147int nlookup_init_raw(struct nlookupdata *, const char *, enum uio_seg, int, struct ucred *, struct nchandle *);
1f95166e 148void nlookup_set_cred(struct nlookupdata *nd, struct ucred *cred);
fad57d0e 149void nlookup_zero(struct nlookupdata *);
690a3127 150void nlookup_done(struct nlookupdata *);
28623bf9 151struct nchandle nlookup_simple(const char *str, enum uio_seg seg,
690a3127 152 int niflags, int *error);
28623bf9 153int nlookup_mp(struct mount *mp, struct nchandle *nch);
690a3127 154int nlookup(struct nlookupdata *);
28623bf9 155int nreadsymlink(struct nlookupdata *nd, struct nchandle *nch,
690a3127 156 struct nlcomponent *nlc);
dae8d54f 157int naccess(struct nchandle *nch, int vmode, struct ucred *cred, int *stickyp);
3a907475 158int naccess_va(struct vattr *va, int nflags, struct ucred *cred);
690a3127
MD
159
160#endif
161
162#endif /* !_SYS_NAMEI_H_ */