386BSD 0.1 development
[unix-history] / usr / src / sys.386bsd / sys / namei.h
CommitLineData
b688fc87
WJ
1/*
2 * Copyright (c) 1985, 1989, 1991 Regents of the University of California.
3 * 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 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)namei.h 7.15 (Berkeley) 5/15/91
34 */
35
36#ifndef _NAMEI_H_
37#define _NAMEI_H_
38
39/*
40 * Encapsulation of namei parameters.
41 */
42struct nameidata {
43 /*
44 * Arguments to namei.
45 */
46 caddr_t ni_dirp; /* pathname pointer */
47 enum uio_seg ni_segflg; /* location of pathname */
48 u_long ni_nameiop; /* see below */
49 /*
50 * Arguments to lookup.
51 */
52 struct ucred *ni_cred; /* credentials */
53 struct vnode *ni_startdir; /* starting directory */
54 struct vnode *ni_rootdir; /* logical root directory */
55 /*
56 * Results
57 */
58 struct vnode *ni_vp; /* vnode of result */
59 struct vnode *ni_dvp; /* vnode of intermediate directory */
60 /*
61 * Shared between namei, lookup routines, and commit routines.
62 */
63 char *ni_pnbuf; /* pathname buffer */
64 long ni_pathlen; /* remaining chars in path */
65 char *ni_ptr; /* current location in pathname */
66 long ni_namelen; /* length of current component */
67 char *ni_next; /* next location in pathname */
68 u_long ni_hash; /* hash value of current component */
69 u_char ni_loopcnt; /* count of symlinks encountered */
70 u_char ni_makeentry; /* 1 => add entry to name cache */
71 u_char ni_isdotdot; /* 1 => current component name is .. */
72 u_char ni_more; /* 1 => symlink needs interpretation */
73 /*
74 * Side effects.
75 */
76 struct ufs_specific { /* saved info for new dir entry */
77 off_t ufs_endoff; /* end of useful directory contents */
78 long ufs_offset; /* offset of free space in directory */
79 long ufs_count; /* size of free slot in directory */
80 ino_t ufs_ino; /* inode number of found directory */
81 u_long ufs_reclen; /* size of found directory entry */
82 } ni_ufs;
83};
84
85#ifdef KERNEL
86/*
87 * namei operations
88 */
89#define LOOKUP 0 /* perform name lookup only */
90#define CREATE 1 /* setup for file creation */
91#define DELETE 2 /* setup for file deletion */
92#define RENAME 3 /* setup for file renaming */
93#define OPMASK 3 /* mask for operation */
94/*
95 * namei operational modifiers
96 */
97#define LOCKLEAF 0x0004 /* lock inode on return */
98#define LOCKPARENT 0x0008 /* want parent vnode returned locked */
99#define WANTPARENT 0x0010 /* want parent vnode returned unlocked */
100#define NOCACHE 0x0020 /* name must not be left in cache */
101#define FOLLOW 0x0040 /* follow symbolic links */
102#define NOFOLLOW 0x0000 /* do not follow symbolic links (pseudo) */
103#define MODMASK 0x00fc /* mask of operational modifiers */
104/*
105 * Namei parameter descriptors.
106 *
107 * SAVENAME may be set by either the callers of namei or by VOP_LOOKUP.
108 * If the caller of namei sets the flag (for example execve wants to
109 * know the name of the program that is being executed), then it must
110 * free the buffer. If VOP_LOOKUP sets the flag, then the buffer must
111 * be freed by either the commit routine or the VOP_ABORT routine.
112 * SAVESTART is set only by the callers of namei. It implies SAVENAME
113 * plus the addition of saving the parent directory that contains the
114 * name in ni_startdir. It allows repeated calls to lookup for the
115 * name being sought. The caller is responsible for releasing the
116 * buffer and for vrele'ing ni_startdir.
117 */
118#define NOCROSSMOUNT 0x0100 /* do not cross mount points */
119#define REMOTE 0x0200 /* lookup for remote filesystem servers */
120#define HASBUF 0x0400 /* has allocated pathname buffer */
121#define SAVENAME 0x0800 /* save pathanme buffer */
122#define SAVESTART 0x1000 /* save starting directory */
123#define PARAMASK 0xff00 /* mask of parameter descriptors */
124#endif
125
126/*
127 * This structure describes the elements in the cache of recent
128 * names looked up by namei. NCHNAMLEN is sized to make structure
129 * size a power of two to optimize malloc's. Minimum reasonable
130 * size is 15.
131 */
132
133#define NCHNAMLEN 31 /* maximum name segment length we bother with */
134
135struct namecache {
136 struct namecache *nc_forw; /* hash chain, MUST BE FIRST */
137 struct namecache *nc_back; /* hash chain, MUST BE FIRST */
138 struct namecache *nc_nxt; /* LRU chain */
139 struct namecache **nc_prev; /* LRU chain */
140 struct vnode *nc_dvp; /* vnode of parent of name */
141 u_long nc_dvpid; /* capability number of nc_dvp */
142 struct vnode *nc_vp; /* vnode the name refers to */
143 u_long nc_vpid; /* capability number of nc_vp */
144 char nc_nlen; /* length of name */
145 char nc_name[NCHNAMLEN]; /* segment name */
146};
147
148#ifdef KERNEL
149u_long nextvnodeid;
150int namei __P((struct nameidata *ndp, struct proc *p));
151int lookup __P((struct nameidata *ndp, struct proc *p));
152#endif
153
154/*
155 * Stats on usefulness of namei caches.
156 */
157struct nchstats {
158 long ncs_goodhits; /* hits that we can really use */
159 long ncs_neghits; /* negative hits that we can use */
160 long ncs_badhits; /* hits we must drop */
161 long ncs_falsehits; /* hits with id mismatch */
162 long ncs_miss; /* misses */
163 long ncs_long; /* long names that ignore cache */
164 long ncs_pass2; /* names found with passes == 2 */
165 long ncs_2passes; /* number of times we attempt it */
166};
167#endif /* !_NAMEI_H_ */