1 /*- 2 * Copyright (c) 1985, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)namei.h 8.5 (Berkeley) 1/9/95 30 * $FreeBSD$ 31 */ 32 33 #ifndef _SYS_NAMEI_H_ 34 #define _SYS_NAMEI_H_ 35 36 #include <sys/queue.h> 37 #include <sys/uio.h> 38 39 struct componentname { 40 /* 41 * Arguments to lookup. 42 */ 43 u_long cn_nameiop; /* namei operation */ 44 u_int64_t cn_flags; /* flags to namei */ 45 struct thread *cn_thread;/* thread requesting lookup */ 46 struct ucred *cn_cred; /* credentials */ 47 int cn_lkflags; /* Lock flags LK_EXCLUSIVE or LK_SHARED */ 48 /* 49 * Shared between lookup and commit routines. 50 */ 51 char *cn_pnbuf; /* pathname buffer */ 52 char *cn_nameptr; /* pointer to looked up name */ 53 long cn_namelen; /* length of looked up component */ 54 long cn_consume; /* chars to consume in lookup() */ 55 }; 56 57 /* 58 * Encapsulation of namei parameters. 59 */ 60 struct nameidata { 61 /* 62 * Arguments to namei/lookup. 63 */ 64 const char *ni_dirp; /* pathname pointer */ 65 enum uio_seg ni_segflg; /* location of pathname */ 66 /* 67 * Arguments to lookup. 68 */ 69 struct vnode *ni_startdir; /* starting directory */ 70 struct vnode *ni_rootdir; /* logical root directory */ 71 struct vnode *ni_topdir; /* logical top directory */ 72 int ni_dirfd; /* starting directory for *at functions */ 73 /* 74 * Results: returned from/manipulated by lookup 75 */ 76 struct vnode *ni_vp; /* vnode of result */ 77 struct vnode *ni_dvp; /* vnode of intermediate directory */ 78 /* 79 * Shared between namei and lookup/commit routines. 80 */ 81 size_t ni_pathlen; /* remaining chars in path */ 82 char *ni_next; /* next location in pathname */ 83 u_int ni_loopcnt; /* count of symlinks encountered */ 84 /* 85 * Lookup parameters: this structure describes the subset of 86 * information from the nameidata structure that is passed 87 * through the VOP interface. 88 */ 89 struct componentname ni_cnd; 90 }; 91 92 #ifdef _KERNEL 93 /* 94 * namei operations 95 */ 96 #define LOOKUP 0 /* perform name lookup only */ 97 #define CREATE 1 /* setup for file creation */ 98 #define DELETE 2 /* setup for file deletion */ 99 #define RENAME 3 /* setup for file renaming */ 100 #define OPMASK 3 /* mask for operation */ 101 /* 102 * namei operational modifier flags, stored in ni_cnd.flags 103 */ 104 #define LOCKLEAF 0x0004 /* lock inode on return */ 105 #define LOCKPARENT 0x0008 /* want parent vnode returned locked */ 106 #define WANTPARENT 0x0010 /* want parent vnode returned unlocked */ 107 #define NOCACHE 0x0020 /* name must not be left in cache */ 108 #define FOLLOW 0x0040 /* follow symbolic links */ 109 #define LOCKSHARED 0x0100 /* Shared lock leaf */ 110 #define NOFOLLOW 0x0000 /* do not follow symbolic links (pseudo) */ 111 #define MODMASK 0x01fc /* mask of operational modifiers */ 112 /* 113 * Namei parameter descriptors. 114 * 115 * SAVENAME may be set by either the callers of namei or by VOP_LOOKUP. 116 * If the caller of namei sets the flag (for example execve wants to 117 * know the name of the program that is being executed), then it must 118 * free the buffer. If VOP_LOOKUP sets the flag, then the buffer must 119 * be freed by either the commit routine or the VOP_ABORT routine. 120 * SAVESTART is set only by the callers of namei. It implies SAVENAME 121 * plus the addition of saving the parent directory that contains the 122 * name in ni_startdir. It allows repeated calls to lookup for the 123 * name being sought. The caller is responsible for releasing the 124 * buffer and for vrele'ing ni_startdir. 125 */ 126 #define RDONLY 0x00000200 /* lookup with read-only semantics */ 127 #define HASBUF 0x00000400 /* has allocated pathname buffer */ 128 #define SAVENAME 0x00000800 /* save pathname buffer */ 129 #define SAVESTART 0x00001000 /* save starting directory */ 130 #define ISDOTDOT 0x00002000 /* current component name is .. */ 131 #define MAKEENTRY 0x00004000 /* entry is to be added to name cache */ 132 #define ISLASTCN 0x00008000 /* this is last component of pathname */ 133 #define ISSYMLINK 0x00010000 /* symlink needs interpretation */ 134 #define ISWHITEOUT 0x00020000 /* found whiteout */ 135 #define DOWHITEOUT 0x00040000 /* do whiteouts */ 136 #define WILLBEDIR 0x00080000 /* new files will be dirs; allow trailing / */ 137 #define ISUNICODE 0x00100000 /* current component name is unicode*/ 138 #define ISOPEN 0x00200000 /* caller is opening; return a real vnode. */ 139 #define NOCROSSMOUNT 0x00400000 /* do not cross mount points */ 140 #define NOMACCHECK 0x00800000 /* do not perform MAC checks */ 141 #define MPSAFE 0x01000000 /* namei() must acquire Giant if needed. */ 142 #define GIANTHELD 0x02000000 /* namei() is holding giant. */ 143 #define AUDITVNODE1 0x04000000 /* audit the looked up vnode information */ 144 #define AUDITVNODE2 0x08000000 /* audit the looked up vnode information */ 145 #define TRAILINGSLASH 0x10000000 /* path ended in a slash */ 146 #define PARAMASK 0x1ffffe00 /* mask of parameter descriptors */ 147 148 #define NDHASGIANT(NDP) (((NDP)->ni_cnd.cn_flags & GIANTHELD) != 0) 149 150 /* 151 * Initialization of a nameidata structure. 152 */ 153 #define NDINIT(ndp, op, flags, segflg, namep, td) \ 154 NDINIT_ALL(ndp, op, flags, segflg, namep, AT_FDCWD, NULL, td) 155 #define NDINIT_AT(ndp, op, flags, segflg, namep, dirfd, td) \ 156 NDINIT_ALL(ndp, op, flags, segflg, namep, dirfd, NULL, td) 157 #define NDINIT_ATVP(ndp, op, flags, segflg, namep, vp, td) \ 158 NDINIT_ALL(ndp, op, flags, segflg, namep, AT_FDCWD, vp, td) 159 160 static __inline void 161 NDINIT_ALL(struct nameidata *ndp, 162 u_long op, u_long flags, 163 enum uio_seg segflg, 164 const char *namep, 165 int dirfd, 166 struct vnode *startdir, 167 struct thread *td) 168 { 169 ndp->ni_cnd.cn_nameiop = op; 170 ndp->ni_cnd.cn_flags = flags; 171 ndp->ni_segflg = segflg; 172 ndp->ni_dirp = namep; 173 ndp->ni_dirfd = dirfd; 174 ndp->ni_startdir = startdir; 175 ndp->ni_cnd.cn_thread = td; 176 } 177 178 #define NDF_NO_DVP_RELE 0x00000001 179 #define NDF_NO_DVP_UNLOCK 0x00000002 180 #define NDF_NO_DVP_PUT 0x00000003 181 #define NDF_NO_VP_RELE 0x00000004 182 #define NDF_NO_VP_UNLOCK 0x00000008 183 #define NDF_NO_VP_PUT 0x0000000c 184 #define NDF_NO_STARTDIR_RELE 0x00000010 185 #define NDF_NO_FREE_PNBUF 0x00000020 186 #define NDF_ONLY_PNBUF (~NDF_NO_FREE_PNBUF) 187 188 void NDFREE(struct nameidata *, const u_int); 189 190 int namei(struct nameidata *ndp); 191 int lookup(struct nameidata *ndp); 192 int relookup(struct vnode *dvp, struct vnode **vpp, 193 struct componentname *cnp); 194 #endif 195 196 /* 197 * Stats on usefulness of namei caches. 198 */ 199 struct nchstats { 200 long ncs_goodhits; /* hits that we can really use */ 201 long ncs_neghits; /* negative hits that we can use */ 202 long ncs_badhits; /* hits we must drop */ 203 long ncs_falsehits; /* hits with id mismatch */ 204 long ncs_miss; /* misses */ 205 long ncs_long; /* long names that ignore cache */ 206 long ncs_pass2; /* names found with passes == 2 */ 207 long ncs_2passes; /* number of times we attempt it */ 208 }; 209 210 extern struct nchstats nchstats; 211 212 #endif /* !_SYS_NAMEI_H_ */ 213