fdesc_vnops.c revision 1.2 1 1.1 cgd /*
2 1.1 cgd * Copyright (c) 1990, 1992 Jan-Simon Pendry
3 1.1 cgd * All rights reserved.
4 1.1 cgd *
5 1.2 cgd * This code is derived from software contributed to Berkeley by
6 1.1 cgd * Jan-Simon Pendry.
7 1.1 cgd *
8 1.2 cgd * Redistribution and use in source and binary forms, with or without
9 1.2 cgd * modification, are permitted provided that the following conditions
10 1.2 cgd * are met:
11 1.2 cgd * 1. Redistributions of source code must retain the above copyright
12 1.2 cgd * notice, this list of conditions and the following disclaimer.
13 1.2 cgd * 2. Redistributions in binary form must reproduce the above copyright
14 1.2 cgd * notice, this list of conditions and the following disclaimer in the
15 1.2 cgd * documentation and/or other materials provided with the distribution.
16 1.2 cgd * 3. All advertising materials mentioning features or use of this software
17 1.2 cgd * must display the following acknowledgement:
18 1.2 cgd * This product includes software developed by the University of
19 1.2 cgd * California, Berkeley and its contributors.
20 1.2 cgd * 4. Neither the name of the University nor the names of its contributors
21 1.2 cgd * may be used to endorse or promote products derived from this software
22 1.2 cgd * without specific prior written permission.
23 1.1 cgd *
24 1.2 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 1.2 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 1.2 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 1.2 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 1.2 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 1.2 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 1.2 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 1.2 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 1.2 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 1.2 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 1.2 cgd * SUCH DAMAGE.
35 1.1 cgd *
36 1.2 cgd * $Id: fdesc_vnops.c,v 1.2 1993/03/25 06:00:19 cgd Exp $
37 1.1 cgd */
38 1.1 cgd
39 1.1 cgd /*
40 1.1 cgd * /dev/fd Filesystem
41 1.1 cgd */
42 1.1 cgd
43 1.1 cgd #include "param.h"
44 1.1 cgd #include "systm.h"
45 1.1 cgd #include "types.h"
46 1.1 cgd #include "time.h"
47 1.1 cgd #include "proc.h"
48 1.1 cgd #include "resourcevar.h"
49 1.1 cgd #include "filedesc.h"
50 1.1 cgd #include "vnode.h"
51 1.1 cgd #include "file.h"
52 1.1 cgd #include "stat.h"
53 1.1 cgd #include "mount.h"
54 1.1 cgd #include "namei.h"
55 1.1 cgd #include "buf.h"
56 1.1 cgd #include "miscfs/fdesc/fdesc.h"
57 1.1 cgd
58 1.1 cgd #include "../ufs/dir.h" /* For readdir() XXX */
59 1.1 cgd
60 1.1 cgd /*
61 1.1 cgd * vp is the current namei directory
62 1.1 cgd * ndp is the name to locate in that directory...
63 1.1 cgd */
64 1.1 cgd fdesc_lookup(dvp, ndp, p)
65 1.1 cgd struct vnode *dvp;
66 1.1 cgd struct nameidata *ndp;
67 1.1 cgd struct proc *p;
68 1.1 cgd {
69 1.1 cgd char *pname = ndp->ni_ptr;
70 1.1 cgd int nfiles = p->p_fd->fd_nfiles;
71 1.1 cgd unsigned fd;
72 1.1 cgd int error;
73 1.1 cgd struct vnode *fvp;
74 1.1 cgd
75 1.1 cgd #ifdef FDESC_DIAGNOSTIC
76 1.1 cgd printf("fdesc_lookup(%s)\n", pname);
77 1.1 cgd #endif
78 1.1 cgd if (ndp->ni_namelen == 1 && *pname == '.') {
79 1.1 cgd ndp->ni_dvp = dvp;
80 1.1 cgd ndp->ni_vp = dvp;
81 1.1 cgd VREF(dvp);
82 1.1 cgd /*VOP_LOCK(dvp);*/
83 1.1 cgd return (0);
84 1.1 cgd }
85 1.1 cgd
86 1.1 cgd fd = 0;
87 1.1 cgd while (*pname >= '0' && *pname <= '9') {
88 1.1 cgd fd = 10 * fd + *pname++ - '0';
89 1.1 cgd if (fd >= nfiles)
90 1.1 cgd break;
91 1.1 cgd }
92 1.1 cgd
93 1.1 cgd #ifdef FDESC_DIAGNOSTIC
94 1.1 cgd printf("fdesc_lookup: fd = %d, *pname = %x\n", fd, *pname);
95 1.1 cgd #endif
96 1.1 cgd if (*pname == '/') {
97 1.1 cgd error = ENOTDIR;
98 1.1 cgd goto bad;
99 1.1 cgd }
100 1.1 cgd
101 1.1 cgd if (*pname != '\0') {
102 1.1 cgd error = ENOENT;
103 1.1 cgd goto bad;
104 1.1 cgd }
105 1.1 cgd
106 1.1 cgd if (fd >= nfiles || p->p_fd->fd_ofiles[fd] == NULL) {
107 1.1 cgd error = EBADF;
108 1.1 cgd goto bad;
109 1.1 cgd }
110 1.1 cgd
111 1.1 cgd #ifdef FDESC_DIAGNOSTIC
112 1.1 cgd printf("fdesc_lookup: allocate new vnode\n");
113 1.1 cgd #endif
114 1.1 cgd error = getnewvnode(VT_UFS, dvp->v_mount, &fdesc_vnodeops, &fvp);
115 1.1 cgd if (error)
116 1.1 cgd goto bad;
117 1.1 cgd VTOFDESC(fvp)->f_fd = fd;
118 1.1 cgd /*VTOFDESC(fvp)->f_isroot = 0;*/
119 1.1 cgd ndp->ni_dvp = dvp;
120 1.1 cgd ndp->ni_vp = fvp;
121 1.1 cgd #ifdef FDESC_DIAGNOSTIC
122 1.1 cgd printf("fdesc_lookup: newvp = %x\n", fvp);
123 1.1 cgd #endif
124 1.1 cgd return (0);
125 1.1 cgd
126 1.1 cgd bad:;
127 1.1 cgd ndp->ni_dvp = dvp;
128 1.1 cgd ndp->ni_vp = NULL;
129 1.1 cgd #ifdef FDESC_DIAGNOSTIC
130 1.1 cgd printf("fdesc_lookup: error = %d\n", error);
131 1.1 cgd #endif
132 1.1 cgd return (error);
133 1.1 cgd }
134 1.1 cgd
135 1.1 cgd fdesc_open(vp, mode, cred, p)
136 1.1 cgd struct vnode *vp;
137 1.1 cgd int mode;
138 1.1 cgd struct ucred *cred;
139 1.1 cgd struct proc *p;
140 1.1 cgd {
141 1.1 cgd int error;
142 1.1 cgd struct filedesc *fdp;
143 1.1 cgd struct file *fp;
144 1.1 cgd int dfd;
145 1.1 cgd int fd;
146 1.1 cgd
147 1.1 cgd /*
148 1.1 cgd * Can always open the root (modulo perms)
149 1.1 cgd */
150 1.1 cgd if (vp->v_flag & VROOT)
151 1.1 cgd return (0);
152 1.1 cgd
153 1.1 cgd /*
154 1.1 cgd * XXX Kludge: set p->p_dupfd to contain the value of the
155 1.1 cgd * the file descriptor being sought for duplication. The error
156 1.1 cgd * return ensures that the vnode for this device will be released
157 1.1 cgd * by vn_open. Open will detect this special error and take the
158 1.1 cgd * actions in dupfdopen. Other callers of vn_open or VOP_OPEN
159 1.1 cgd * will simply report the error.
160 1.1 cgd */
161 1.1 cgd p->p_dupfd = VTOFDESC(vp)->f_fd; /* XXX */
162 1.1 cgd return (ENODEV);
163 1.1 cgd }
164 1.1 cgd
165 1.1 cgd static int
166 1.1 cgd fdesc_attr(fd, vap, cred, p)
167 1.1 cgd int fd;
168 1.1 cgd struct vattr *vap;
169 1.1 cgd struct ucred *cred;
170 1.1 cgd struct proc *p;
171 1.1 cgd {
172 1.1 cgd struct filedesc *fdp = p->p_fd;
173 1.1 cgd struct file *fp;
174 1.1 cgd int error;
175 1.1 cgd
176 1.1 cgd #ifdef FDESC_DIAGNOSTIC
177 1.1 cgd printf("fdesc_attr: fd = %d, nfiles = %d\n", fd, fdp->fd_nfiles);
178 1.1 cgd #endif
179 1.1 cgd if (fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL) {
180 1.1 cgd #ifdef FDESC_DIAGNOSTIC
181 1.1 cgd printf("fdesc_attr: fp = %x (EBADF)\n", fp);
182 1.1 cgd #endif
183 1.1 cgd return (EBADF);
184 1.1 cgd }
185 1.1 cgd
186 1.1 cgd /*
187 1.1 cgd * Can stat the underlying vnode, but not sockets because
188 1.1 cgd * they don't use struct vattrs. Well, we could convert from
189 1.1 cgd * a struct stat back to a struct vattr, later...
190 1.1 cgd */
191 1.1 cgd switch (fp->f_type) {
192 1.1 cgd case DTYPE_VNODE:
193 1.1 cgd error = VOP_GETATTR((struct vnode *) fp->f_data, vap, cred, p);
194 1.1 cgd break;
195 1.1 cgd
196 1.1 cgd case DTYPE_SOCKET:
197 1.1 cgd error = EOPNOTSUPP;
198 1.1 cgd break;
199 1.1 cgd
200 1.1 cgd default:
201 1.1 cgd panic("fdesc attr");
202 1.1 cgd break;
203 1.1 cgd }
204 1.1 cgd
205 1.1 cgd #ifdef FDESC_DIAGNOSTIC
206 1.1 cgd printf("fdesc_attr: returns error %d\n", error);
207 1.1 cgd #endif
208 1.1 cgd return (error);
209 1.1 cgd }
210 1.1 cgd
211 1.1 cgd fdesc_getattr(vp, vap, cred, p)
212 1.1 cgd struct vnode *vp;
213 1.1 cgd struct vattr *vap;
214 1.1 cgd struct ucred *cred;
215 1.1 cgd struct proc *p;
216 1.1 cgd {
217 1.1 cgd unsigned fd;
218 1.1 cgd int error;
219 1.1 cgd
220 1.1 cgd if (vp->v_flag & VROOT) {
221 1.1 cgd #ifdef FDESC_DIAGNOSTIC
222 1.1 cgd printf("fdesc_getattr: stat rootdir\n");
223 1.1 cgd #endif
224 1.1 cgd bzero((caddr_t) vap, sizeof(*vap));
225 1.1 cgd vattr_null(vap);
226 1.1 cgd vap->va_type = VDIR;
227 1.1 cgd vap->va_mode = S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
228 1.1 cgd vap->va_nlink = 2;
229 1.1 cgd vap->va_uid = 0;
230 1.1 cgd vap->va_gid = 0;
231 1.1 cgd vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
232 1.1 cgd vap->va_fileid = 2;
233 1.1 cgd /* vap->va_qsize = 0; */
234 1.1 cgd vap->va_size = DEV_BSIZE;
235 1.1 cgd vap->va_blocksize = DEV_BSIZE;
236 1.1 cgd microtime(&vap->va_atime);
237 1.1 cgd vap->va_mtime = vap->va_atime;
238 1.1 cgd vap->va_ctime = vap->va_ctime;
239 1.1 cgd vap->va_gen = 0;
240 1.1 cgd vap->va_flags = 0;
241 1.1 cgd vap->va_rdev = 0;
242 1.1 cgd /* vap->va_qbytes = 0; */
243 1.1 cgd vap->va_bytes = 0;
244 1.1 cgd return (0);
245 1.1 cgd }
246 1.1 cgd
247 1.1 cgd fd = VTOFDESC(vp)->f_fd;
248 1.1 cgd error = fdesc_attr(fd, vap, cred, p);
249 1.1 cgd if (error == 0)
250 1.1 cgd vp->v_type = vap->va_type;
251 1.1 cgd return (error);
252 1.1 cgd }
253 1.1 cgd
254 1.1 cgd fdesc_setattr(vp, vap, cred, p)
255 1.1 cgd struct vnode *vp;
256 1.1 cgd struct vattr *vap;
257 1.1 cgd struct ucred *cred;
258 1.1 cgd struct proc *p;
259 1.1 cgd {
260 1.1 cgd struct filedesc *fdp = p->p_fd;
261 1.1 cgd struct file *fp;
262 1.1 cgd unsigned fd;
263 1.1 cgd int error;
264 1.1 cgd
265 1.1 cgd /*
266 1.1 cgd * Can't mess with the root vnode
267 1.1 cgd */
268 1.1 cgd if (vp->v_flag & VROOT)
269 1.1 cgd return (EACCES);
270 1.1 cgd
271 1.1 cgd fd = VTOFDESC(vp)->f_fd;
272 1.1 cgd #ifdef FDESC_DIAGNOSTIC
273 1.1 cgd printf("fdesc_setattr: fd = %d, nfiles = %d\n", fd, fdp->fd_nfiles);
274 1.1 cgd #endif
275 1.1 cgd if (fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL) {
276 1.1 cgd #ifdef FDESC_DIAGNOSTIC
277 1.1 cgd printf("fdesc_setattr: fp = %x (EBADF)\n", fp);
278 1.1 cgd #endif
279 1.1 cgd return (EBADF);
280 1.1 cgd }
281 1.1 cgd
282 1.1 cgd /*
283 1.1 cgd * Can setattr the underlying vnode, but not sockets!
284 1.1 cgd */
285 1.1 cgd switch (fp->f_type) {
286 1.1 cgd case DTYPE_VNODE:
287 1.1 cgd error = VOP_SETATTR((struct vnode *) fp->f_data, vap, cred, p);
288 1.1 cgd break;
289 1.1 cgd
290 1.1 cgd case DTYPE_SOCKET:
291 1.1 cgd error = EOPNOTSUPP;
292 1.1 cgd break;
293 1.1 cgd
294 1.1 cgd default:
295 1.1 cgd panic("fdesc setattr");
296 1.1 cgd break;
297 1.1 cgd }
298 1.1 cgd
299 1.1 cgd #ifdef FDESC_DIAGNOSTIC
300 1.1 cgd printf("fdesc_setattr: returns error %d\n", error);
301 1.1 cgd #endif
302 1.1 cgd return (error);
303 1.1 cgd }
304 1.1 cgd
305 1.1 cgd fdesc_readdir(vp, uio, cred, eofflagp)
306 1.1 cgd struct vnode *vp;
307 1.1 cgd struct uio *uio;
308 1.1 cgd struct ucred *cred;
309 1.1 cgd int *eofflagp;
310 1.1 cgd {
311 1.1 cgd struct filedesc *fdp;
312 1.1 cgd int i;
313 1.1 cgd int error;
314 1.1 cgd
315 1.1 cgd #define UIO_MX 16
316 1.1 cgd
317 1.1 cgd fdp = uio->uio_procp->p_fd;
318 1.1 cgd i = uio->uio_offset / UIO_MX;
319 1.1 cgd error = 0;
320 1.1 cgd while (uio->uio_resid > 0) {
321 1.1 cgd if (i >= fdp->fd_nfiles) {
322 1.1 cgd *eofflagp = 1;
323 1.1 cgd break;
324 1.1 cgd }
325 1.1 cgd if (fdp->fd_ofiles[i] != NULL) {
326 1.1 cgd struct direct d;
327 1.1 cgd struct direct *dp = &d;
328 1.1 cgd char *cp = dp->d_name;
329 1.1 cgd #ifdef FDESC_FILEID
330 1.1 cgd struct vattr va;
331 1.1 cgd #endif
332 1.1 cgd int j;
333 1.1 cgd
334 1.1 cgd bzero((caddr_t) dp, UIO_MX);
335 1.1 cgd
336 1.1 cgd /*
337 1.1 cgd * Generate an ASCII representation of the name.
338 1.1 cgd * This can cope with fds in the range 0..99999
339 1.1 cgd */
340 1.1 cgd cp++;
341 1.1 cgd if (i > 10) cp++;
342 1.1 cgd if (i > 100) cp++;
343 1.1 cgd if (i > 1000) cp++;
344 1.1 cgd if (i > 10000) cp++;
345 1.1 cgd if (i > 100000) panic("fdesc_readdir");
346 1.1 cgd dp->d_namlen = cp - dp->d_name;
347 1.1 cgd *cp = '\0';
348 1.1 cgd j = i;
349 1.1 cgd do {
350 1.1 cgd *--cp = j % 10 + '0';
351 1.1 cgd j /= 10;
352 1.1 cgd } while (j > 0);
353 1.1 cgd /*
354 1.1 cgd * Fill in the remaining fields
355 1.1 cgd */
356 1.1 cgd dp->d_reclen = UIO_MX;
357 1.1 cgd dp->d_ino = i + 3;
358 1.1 cgd #ifdef FDESC_FILEID
359 1.1 cgd /*
360 1.1 cgd * If we want the file ids to match the
361 1.1 cgd * we must call getattr on the underlying file.
362 1.1 cgd * fdesc_attr may return an error, in which case
363 1.1 cgd * we ignore the returned file id.
364 1.1 cgd */
365 1.1 cgd error = fdesc_attr(i, &va, cred, p);
366 1.1 cgd if (error == 0)
367 1.1 cgd dp->d_ino = va.va_fileid;
368 1.1 cgd #endif
369 1.1 cgd /*
370 1.1 cgd * And ship to userland
371 1.1 cgd */
372 1.1 cgd error = uiomove((caddr_t) dp, UIO_MX, uio);
373 1.1 cgd if (error)
374 1.1 cgd break;
375 1.1 cgd }
376 1.1 cgd i++;
377 1.1 cgd }
378 1.1 cgd
379 1.1 cgd uio->uio_offset = i * UIO_MX;
380 1.1 cgd return (error);
381 1.1 cgd }
382 1.1 cgd
383 1.1 cgd fdesc_inactive(vp, p)
384 1.1 cgd struct vnode *vp;
385 1.1 cgd struct proc *p;
386 1.1 cgd {
387 1.1 cgd /*
388 1.1 cgd * Clear out the v_type field to avoid
389 1.1 cgd * nasty things happening in vgone().
390 1.1 cgd */
391 1.1 cgd vp->v_type = VNON;
392 1.1 cgd #ifdef FDESC_DIAGNOSTIC
393 1.1 cgd printf("fdesc_inactive(%x)\n", vp);
394 1.1 cgd #endif
395 1.1 cgd return (0);
396 1.1 cgd }
397 1.1 cgd
398 1.1 cgd /*
399 1.1 cgd * Print out the contents of a /dev/fd vnode.
400 1.1 cgd */
401 1.1 cgd /* ARGSUSED */
402 1.1 cgd fdesc_print(vp)
403 1.1 cgd struct vnode *vp;
404 1.1 cgd {
405 1.1 cgd printf("tag VT_NON, fdesc vnode\n");
406 1.1 cgd }
407 1.1 cgd
408 1.1 cgd /*
409 1.1 cgd * /dev/fd vnode unsupported operation
410 1.1 cgd */
411 1.1 cgd fdesc_enotsupp()
412 1.1 cgd {
413 1.1 cgd return (EOPNOTSUPP);
414 1.1 cgd }
415 1.1 cgd
416 1.1 cgd /*
417 1.1 cgd * /dev/fd "should never get here" operation
418 1.1 cgd */
419 1.1 cgd fdesc_badop()
420 1.1 cgd {
421 1.1 cgd panic("fdesc: bad op");
422 1.1 cgd /* NOTREACHED */
423 1.1 cgd }
424 1.1 cgd
425 1.1 cgd /*
426 1.1 cgd * /dev/fd vnode null operation
427 1.1 cgd */
428 1.1 cgd fdesc_nullop()
429 1.1 cgd {
430 1.1 cgd return (0);
431 1.1 cgd }
432 1.1 cgd
433 1.1 cgd #define fdesc_create ((int (*) __P(( \
434 1.1 cgd struct nameidata *ndp, \
435 1.1 cgd struct vattr *vap, \
436 1.1 cgd struct proc *p))) fdesc_enotsupp)
437 1.1 cgd #define fdesc_mknod ((int (*) __P(( \
438 1.1 cgd struct nameidata *ndp, \
439 1.1 cgd struct vattr *vap, \
440 1.1 cgd struct ucred *cred, \
441 1.1 cgd struct proc *p))) fdesc_enotsupp)
442 1.1 cgd #define fdesc_close ((int (*) __P(( \
443 1.1 cgd struct vnode *vp, \
444 1.1 cgd int fflag, \
445 1.1 cgd struct ucred *cred, \
446 1.1 cgd struct proc *p))) nullop)
447 1.1 cgd #define fdesc_access ((int (*) __P(( \
448 1.1 cgd struct vnode *vp, \
449 1.1 cgd int mode, \
450 1.1 cgd struct ucred *cred, \
451 1.1 cgd struct proc *p))) nullop)
452 1.1 cgd #define fdesc_read ((int (*) __P(( \
453 1.1 cgd struct vnode *vp, \
454 1.1 cgd struct uio *uio, \
455 1.1 cgd int ioflag, \
456 1.1 cgd struct ucred *cred))) fdesc_enotsupp)
457 1.1 cgd #define fdesc_write ((int (*) __P(( \
458 1.1 cgd struct vnode *vp, \
459 1.1 cgd struct uio *uio, \
460 1.1 cgd int ioflag, \
461 1.1 cgd struct ucred *cred))) fdesc_enotsupp)
462 1.1 cgd #define fdesc_ioctl ((int (*) __P(( \
463 1.1 cgd struct vnode *vp, \
464 1.1 cgd int command, \
465 1.1 cgd caddr_t data, \
466 1.1 cgd int fflag, \
467 1.1 cgd struct ucred *cred, \
468 1.1 cgd struct proc *p))) fdesc_enotsupp)
469 1.1 cgd #define fdesc_select ((int (*) __P(( \
470 1.1 cgd struct vnode *vp, \
471 1.1 cgd int which, \
472 1.1 cgd int fflags, \
473 1.1 cgd struct ucred *cred, \
474 1.1 cgd struct proc *p))) fdesc_enotsupp)
475 1.1 cgd #define fdesc_mmap ((int (*) __P(( \
476 1.1 cgd struct vnode *vp, \
477 1.1 cgd int fflags, \
478 1.1 cgd struct ucred *cred, \
479 1.1 cgd struct proc *p))) fdesc_enotsupp)
480 1.1 cgd #define fdesc_fsync ((int (*) __P(( \
481 1.1 cgd struct vnode *vp, \
482 1.1 cgd int fflags, \
483 1.1 cgd struct ucred *cred, \
484 1.1 cgd int waitfor, \
485 1.1 cgd struct proc *p))) nullop)
486 1.1 cgd #define fdesc_seek ((int (*) __P(( \
487 1.1 cgd struct vnode *vp, \
488 1.1 cgd off_t oldoff, \
489 1.1 cgd off_t newoff, \
490 1.1 cgd struct ucred *cred))) nullop)
491 1.1 cgd #define fdesc_remove ((int (*) __P(( \
492 1.1 cgd struct nameidata *ndp, \
493 1.1 cgd struct proc *p))) fdesc_enotsupp)
494 1.1 cgd #define fdesc_link ((int (*) __P(( \
495 1.1 cgd struct vnode *vp, \
496 1.1 cgd struct nameidata *ndp, \
497 1.1 cgd struct proc *p))) fdesc_enotsupp)
498 1.1 cgd #define fdesc_rename ((int (*) __P(( \
499 1.1 cgd struct nameidata *fndp, \
500 1.1 cgd struct nameidata *tdnp, \
501 1.1 cgd struct proc *p))) fdesc_enotsupp)
502 1.1 cgd #define fdesc_mkdir ((int (*) __P(( \
503 1.1 cgd struct nameidata *ndp, \
504 1.1 cgd struct vattr *vap, \
505 1.1 cgd struct proc *p))) fdesc_enotsupp)
506 1.1 cgd #define fdesc_rmdir ((int (*) __P(( \
507 1.1 cgd struct nameidata *ndp, \
508 1.1 cgd struct proc *p))) fdesc_enotsupp)
509 1.1 cgd #define fdesc_symlink ((int (*) __P(( \
510 1.1 cgd struct nameidata *ndp, \
511 1.1 cgd struct vattr *vap, \
512 1.1 cgd char *target, \
513 1.1 cgd struct proc *p))) fdesc_enotsupp)
514 1.1 cgd #define fdesc_readlink ((int (*) __P(( \
515 1.1 cgd struct vnode *vp, \
516 1.1 cgd struct uio *uio, \
517 1.1 cgd struct ucred *cred))) fdesc_enotsupp)
518 1.1 cgd #define fdesc_abortop ((int (*) __P(( \
519 1.1 cgd struct nameidata *ndp))) nullop)
520 1.1 cgd #ifdef FDESC_DIAGNOSTIC
521 1.1 cgd int fdesc_reclaim(vp)
522 1.1 cgd struct vnode *vp;
523 1.1 cgd {
524 1.1 cgd printf("fdesc_reclaim(%x)\n", vp);
525 1.1 cgd return (0);
526 1.1 cgd }
527 1.1 cgd #else
528 1.1 cgd #define fdesc_reclaim ((int (*) __P(( \
529 1.1 cgd struct vnode *vp))) nullop)
530 1.1 cgd #endif
531 1.1 cgd #define fdesc_lock ((int (*) __P(( \
532 1.1 cgd struct vnode *vp))) nullop)
533 1.1 cgd #define fdesc_unlock ((int (*) __P(( \
534 1.1 cgd struct vnode *vp))) nullop)
535 1.1 cgd #define fdesc_bmap ((int (*) __P(( \
536 1.1 cgd struct vnode *vp, \
537 1.1 cgd daddr_t bn, \
538 1.1 cgd struct vnode **vpp, \
539 1.1 cgd daddr_t *bnp))) fdesc_badop)
540 1.1 cgd #define fdesc_strategy ((int (*) __P(( \
541 1.1 cgd struct buf *bp))) fdesc_badop)
542 1.1 cgd #define fdesc_islocked ((int (*) __P(( \
543 1.1 cgd struct vnode *vp))) nullop)
544 1.1 cgd #define fdesc_advlock ((int (*) __P(( \
545 1.1 cgd struct vnode *vp, \
546 1.1 cgd caddr_t id, \
547 1.1 cgd int op, \
548 1.1 cgd struct flock *fl, \
549 1.1 cgd int flags))) fdesc_enotsupp)
550 1.1 cgd
551 1.1 cgd struct vnodeops fdesc_vnodeops = {
552 1.1 cgd fdesc_lookup, /* lookup */
553 1.1 cgd fdesc_create, /* create */
554 1.1 cgd fdesc_mknod, /* mknod */
555 1.1 cgd fdesc_open, /* open */
556 1.1 cgd fdesc_close, /* close */
557 1.1 cgd fdesc_access, /* access */
558 1.1 cgd fdesc_getattr, /* getattr */
559 1.1 cgd fdesc_setattr, /* setattr */
560 1.1 cgd fdesc_read, /* read */
561 1.1 cgd fdesc_write, /* write */
562 1.1 cgd fdesc_ioctl, /* ioctl */
563 1.1 cgd fdesc_select, /* select */
564 1.1 cgd fdesc_mmap, /* mmap */
565 1.1 cgd fdesc_fsync, /* fsync */
566 1.1 cgd fdesc_seek, /* seek */
567 1.1 cgd fdesc_remove, /* remove */
568 1.1 cgd fdesc_link, /* link */
569 1.1 cgd fdesc_rename, /* rename */
570 1.1 cgd fdesc_mkdir, /* mkdir */
571 1.1 cgd fdesc_rmdir, /* rmdir */
572 1.1 cgd fdesc_symlink, /* symlink */
573 1.1 cgd fdesc_readdir, /* readdir */
574 1.1 cgd fdesc_readlink, /* readlink */
575 1.1 cgd fdesc_abortop, /* abortop */
576 1.1 cgd fdesc_inactive, /* inactive */
577 1.1 cgd fdesc_reclaim, /* reclaim */
578 1.1 cgd fdesc_lock, /* lock */
579 1.1 cgd fdesc_unlock, /* unlock */
580 1.1 cgd fdesc_bmap, /* bmap */
581 1.1 cgd fdesc_strategy, /* strategy */
582 1.1 cgd fdesc_print, /* print */
583 1.1 cgd fdesc_islocked, /* islocked */
584 1.1 cgd fdesc_advlock, /* advlock */
585 1.1 cgd };
586