kern_descrip.c revision 100211
1/*
2 * Copyright (c) 1982, 1986, 1989, 1991, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 *    must display the following acknowledgement:
20 *	This product includes software developed by the University of
21 *	California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 *    may be used to endorse or promote products derived from this software
24 *    without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 *	@(#)kern_descrip.c	8.6 (Berkeley) 4/19/94
39 * $FreeBSD: head/sys/kern/kern_descrip.c 100211 2002-07-17 02:48:43Z jhb $
40 */
41
42#include "opt_compat.h"
43
44#include <sys/param.h>
45#include <sys/systm.h>
46#include <sys/lock.h>
47#include <sys/malloc.h>
48#include <sys/mutex.h>
49#include <sys/sysproto.h>
50#include <sys/conf.h>
51#include <sys/filedesc.h>
52#include <sys/kernel.h>
53#include <sys/sysctl.h>
54#include <sys/vnode.h>
55#include <sys/proc.h>
56#include <sys/namei.h>
57#include <sys/file.h>
58#include <sys/stat.h>
59#include <sys/filio.h>
60#include <sys/fcntl.h>
61#include <sys/unistd.h>
62#include <sys/resourcevar.h>
63#include <sys/event.h>
64#include <sys/sx.h>
65#include <sys/socketvar.h>
66#include <sys/signalvar.h>
67
68#include <machine/limits.h>
69
70#include <vm/vm.h>
71#include <vm/vm_extern.h>
72#include <vm/uma.h>
73
74static MALLOC_DEFINE(M_FILEDESC, "file desc", "Open file descriptor table");
75static MALLOC_DEFINE(M_SIGIO, "sigio", "sigio structures");
76
77uma_zone_t file_zone;
78
79static	 d_open_t  fdopen;
80#define NUMFDESC 64
81
82#define CDEV_MAJOR 22
83static struct cdevsw fildesc_cdevsw = {
84	/* open */	fdopen,
85	/* close */	noclose,
86	/* read */	noread,
87	/* write */	nowrite,
88	/* ioctl */	noioctl,
89	/* poll */	nopoll,
90	/* mmap */	nommap,
91	/* strategy */	nostrategy,
92	/* name */	"FD",
93	/* maj */	CDEV_MAJOR,
94	/* dump */	nodump,
95	/* psize */	nopsize,
96	/* flags */	0,
97};
98
99static int do_dup(struct filedesc *fdp, int old, int new, register_t *retval, struct thread *td);
100static int badfo_readwrite(struct file *fp, struct uio *uio,
101    struct ucred *cred, int flags, struct thread *td);
102static int badfo_ioctl(struct file *fp, u_long com, void *data,
103    struct thread *td);
104static int badfo_poll(struct file *fp, int events,
105    struct ucred *cred, struct thread *td);
106static int badfo_kqfilter(struct file *fp, struct knote *kn);
107static int badfo_stat(struct file *fp, struct stat *sb, struct thread *td);
108static int badfo_close(struct file *fp, struct thread *td);
109
110/*
111 * Descriptor management.
112 */
113struct filelist filehead;	/* head of list of open files */
114int nfiles;			/* actual number of open files */
115extern int cmask;
116struct sx filelist_lock;	/* sx to protect filelist */
117struct mtx sigio_lock;		/* mtx to protect pointers to sigio */
118
119/*
120 * System calls on descriptors.
121 */
122#ifndef _SYS_SYSPROTO_H_
123struct getdtablesize_args {
124	int	dummy;
125};
126#endif
127/*
128 * MPSAFE
129 */
130/* ARGSUSED */
131int
132getdtablesize(td, uap)
133	struct thread *td;
134	struct getdtablesize_args *uap;
135{
136	struct proc *p = td->td_proc;
137
138	mtx_lock(&Giant);
139	td->td_retval[0] =
140	    min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfilesperproc);
141	mtx_unlock(&Giant);
142	return (0);
143}
144
145/*
146 * Duplicate a file descriptor to a particular value.
147 *
148 * note: keep in mind that a potential race condition exists when closing
149 * descriptors from a shared descriptor table (via rfork).
150 */
151#ifndef _SYS_SYSPROTO_H_
152struct dup2_args {
153	u_int	from;
154	u_int	to;
155};
156#endif
157/*
158 * MPSAFE
159 */
160/* ARGSUSED */
161int
162dup2(td, uap)
163	struct thread *td;
164	struct dup2_args *uap;
165{
166	struct proc *p = td->td_proc;
167	register struct filedesc *fdp = td->td_proc->p_fd;
168	register u_int old = uap->from, new = uap->to;
169	int i, error;
170
171	FILEDESC_LOCK(fdp);
172retry:
173	if (old >= fdp->fd_nfiles ||
174	    fdp->fd_ofiles[old] == NULL ||
175	    new >= p->p_rlimit[RLIMIT_NOFILE].rlim_cur ||
176	    new >= maxfilesperproc) {
177		FILEDESC_UNLOCK(fdp);
178		return (EBADF);
179	}
180	if (old == new) {
181		td->td_retval[0] = new;
182		FILEDESC_UNLOCK(fdp);
183		return (0);
184	}
185	if (new >= fdp->fd_nfiles) {
186		if ((error = fdalloc(td, new, &i))) {
187			FILEDESC_UNLOCK(fdp);
188			return (error);
189		}
190		/*
191		 * fdalloc() may block, retest everything.
192		 */
193		goto retry;
194	}
195	error = do_dup(fdp, (int)old, (int)new, td->td_retval, td);
196	return(error);
197}
198
199/*
200 * Duplicate a file descriptor.
201 */
202#ifndef _SYS_SYSPROTO_H_
203struct dup_args {
204	u_int	fd;
205};
206#endif
207/*
208 * MPSAFE
209 */
210/* ARGSUSED */
211int
212dup(td, uap)
213	struct thread *td;
214	struct dup_args *uap;
215{
216	register struct filedesc *fdp;
217	u_int old;
218	int new, error;
219
220	old = uap->fd;
221	fdp = td->td_proc->p_fd;
222	FILEDESC_LOCK(fdp);
223	if (old >= fdp->fd_nfiles || fdp->fd_ofiles[old] == NULL) {
224		FILEDESC_UNLOCK(fdp);
225		return (EBADF);
226	}
227	if ((error = fdalloc(td, 0, &new))) {
228		FILEDESC_UNLOCK(fdp);
229		return (error);
230	}
231	error = do_dup(fdp, (int)old, new, td->td_retval, td);
232	return (error);
233}
234
235/*
236 * The file control system call.
237 */
238#ifndef _SYS_SYSPROTO_H_
239struct fcntl_args {
240	int	fd;
241	int	cmd;
242	long	arg;
243};
244#endif
245/*
246 * MPSAFE
247 */
248/* ARGSUSED */
249int
250fcntl(td, uap)
251	struct thread *td;
252	register struct fcntl_args *uap;
253{
254	register struct proc *p = td->td_proc;
255	register struct filedesc *fdp;
256	register struct file *fp;
257	register char *pop;
258	struct vnode *vp;
259	int i, tmp, error = 0, flg = F_POSIX;
260	struct flock fl;
261	u_int newmin;
262	struct proc *leaderp;
263
264	mtx_lock(&Giant);
265
266	fdp = p->p_fd;
267	FILEDESC_LOCK(fdp);
268	if ((unsigned)uap->fd >= fdp->fd_nfiles ||
269	    (fp = fdp->fd_ofiles[uap->fd]) == NULL) {
270		FILEDESC_UNLOCK(fdp);
271		error = EBADF;
272		goto done2;
273	}
274	pop = &fdp->fd_ofileflags[uap->fd];
275
276	switch (uap->cmd) {
277	case F_DUPFD:
278		newmin = uap->arg;
279		if (newmin >= p->p_rlimit[RLIMIT_NOFILE].rlim_cur ||
280		    newmin >= maxfilesperproc) {
281			FILEDESC_UNLOCK(fdp);
282			error = EINVAL;
283			break;
284		}
285		if ((error = fdalloc(td, newmin, &i))) {
286			FILEDESC_UNLOCK(fdp);
287			break;
288		}
289		error = do_dup(fdp, uap->fd, i, td->td_retval, td);
290		break;
291
292	case F_GETFD:
293		td->td_retval[0] = (*pop & UF_EXCLOSE) ? FD_CLOEXEC : 0;
294		FILEDESC_UNLOCK(fdp);
295		break;
296
297	case F_SETFD:
298		*pop = (*pop &~ UF_EXCLOSE) |
299		    (uap->arg & FD_CLOEXEC ? UF_EXCLOSE : 0);
300		FILEDESC_UNLOCK(fdp);
301		break;
302
303	case F_GETFL:
304		FILE_LOCK(fp);
305		FILEDESC_UNLOCK(fdp);
306		td->td_retval[0] = OFLAGS(fp->f_flag);
307		FILE_UNLOCK(fp);
308		break;
309
310	case F_SETFL:
311		fhold(fp);
312		FILEDESC_UNLOCK(fdp);
313		fp->f_flag &= ~FCNTLFLAGS;
314		fp->f_flag |= FFLAGS(uap->arg & ~O_ACCMODE) & FCNTLFLAGS;
315		tmp = fp->f_flag & FNONBLOCK;
316		error = fo_ioctl(fp, FIONBIO, &tmp, td);
317		if (error) {
318			fdrop(fp, td);
319			break;
320		}
321		tmp = fp->f_flag & FASYNC;
322		error = fo_ioctl(fp, FIOASYNC, &tmp, td);
323		if (!error) {
324			fdrop(fp, td);
325			break;
326		}
327		fp->f_flag &= ~FNONBLOCK;
328		tmp = 0;
329		(void)fo_ioctl(fp, FIONBIO, &tmp, td);
330		fdrop(fp, td);
331		break;
332
333	case F_GETOWN:
334		fhold(fp);
335		FILEDESC_UNLOCK(fdp);
336		error = fo_ioctl(fp, FIOGETOWN, (void *)td->td_retval, td);
337		fdrop(fp, td);
338		break;
339
340	case F_SETOWN:
341		fhold(fp);
342		FILEDESC_UNLOCK(fdp);
343		error = fo_ioctl(fp, FIOSETOWN, &uap->arg, td);
344		fdrop(fp, td);
345		break;
346
347	case F_SETLKW:
348		flg |= F_WAIT;
349		/* Fall into F_SETLK */
350
351	case F_SETLK:
352		if (fp->f_type != DTYPE_VNODE) {
353			FILEDESC_UNLOCK(fdp);
354			error = EBADF;
355			break;
356		}
357		vp = (struct vnode *)fp->f_data;
358		/*
359		 * copyin/lockop may block
360		 */
361		fhold(fp);
362		FILEDESC_UNLOCK(fdp);
363		vp = (struct vnode *)fp->f_data;
364
365		/* Copy in the lock structure */
366		error = copyin((caddr_t)(intptr_t)uap->arg, &fl, sizeof(fl));
367		if (error) {
368			fdrop(fp, td);
369			break;
370		}
371		if (fl.l_whence == SEEK_CUR) {
372			if (fp->f_offset < 0 ||
373			    (fl.l_start > 0 &&
374			     fp->f_offset > OFF_MAX - fl.l_start)) {
375				fdrop(fp, td);
376				error = EOVERFLOW;
377				break;
378			}
379			fl.l_start += fp->f_offset;
380		}
381
382		switch (fl.l_type) {
383		case F_RDLCK:
384			if ((fp->f_flag & FREAD) == 0) {
385				error = EBADF;
386				break;
387			}
388			PROC_LOCK(p);
389			p->p_flag |= P_ADVLOCK;
390			leaderp = p->p_leader;
391			PROC_UNLOCK(p);
392			error = VOP_ADVLOCK(vp, (caddr_t)leaderp, F_SETLK,
393			    &fl, flg);
394			break;
395		case F_WRLCK:
396			if ((fp->f_flag & FWRITE) == 0) {
397				error = EBADF;
398				break;
399			}
400			PROC_LOCK(p);
401			p->p_flag |= P_ADVLOCK;
402			leaderp = p->p_leader;
403			PROC_UNLOCK(p);
404			error = VOP_ADVLOCK(vp, (caddr_t)leaderp, F_SETLK,
405			    &fl, flg);
406			break;
407		case F_UNLCK:
408			PROC_LOCK(p);
409			leaderp = p->p_leader;
410			PROC_UNLOCK(p);
411			error = VOP_ADVLOCK(vp, (caddr_t)leaderp, F_UNLCK,
412				&fl, F_POSIX);
413			break;
414		default:
415			error = EINVAL;
416			break;
417		}
418		fdrop(fp, td);
419		break;
420
421	case F_GETLK:
422		if (fp->f_type != DTYPE_VNODE) {
423			FILEDESC_UNLOCK(fdp);
424			error = EBADF;
425			break;
426		}
427		vp = (struct vnode *)fp->f_data;
428		/*
429		 * copyin/lockop may block
430		 */
431		fhold(fp);
432		FILEDESC_UNLOCK(fdp);
433		vp = (struct vnode *)fp->f_data;
434
435		/* Copy in the lock structure */
436		error = copyin((caddr_t)(intptr_t)uap->arg, &fl, sizeof(fl));
437		if (error) {
438			fdrop(fp, td);
439			break;
440		}
441		if (fl.l_type != F_RDLCK && fl.l_type != F_WRLCK &&
442		    fl.l_type != F_UNLCK) {
443			fdrop(fp, td);
444			error = EINVAL;
445			break;
446		}
447		if (fl.l_whence == SEEK_CUR) {
448			if ((fl.l_start > 0 &&
449			     fp->f_offset > OFF_MAX - fl.l_start) ||
450			    (fl.l_start < 0 &&
451			     fp->f_offset < OFF_MIN - fl.l_start)) {
452				fdrop(fp, td);
453				error = EOVERFLOW;
454				break;
455			}
456			fl.l_start += fp->f_offset;
457		}
458		error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_GETLK,
459			    &fl, F_POSIX);
460		fdrop(fp, td);
461		if (error == 0) {
462			error = copyout(&fl, (caddr_t)(intptr_t)uap->arg,
463			    sizeof(fl));
464		}
465		break;
466	default:
467		FILEDESC_UNLOCK(fdp);
468		error = EINVAL;
469		break;
470	}
471done2:
472	mtx_unlock(&Giant);
473	return (error);
474}
475
476/*
477 * Common code for dup, dup2, and fcntl(F_DUPFD).
478 * filedesc must be locked, but will be unlocked as a side effect.
479 */
480static int
481do_dup(fdp, old, new, retval, td)
482	register struct filedesc *fdp;
483	register int old, new;
484	register_t *retval;
485	struct thread *td;
486{
487	struct file *fp;
488	struct file *delfp;
489
490	FILEDESC_LOCK_ASSERT(fdp, MA_OWNED);
491
492	/*
493	 * Save info on the descriptor being overwritten.  We have
494	 * to do the unmap now, but we cannot close it without
495	 * introducing an ownership race for the slot.
496	 */
497	delfp = fdp->fd_ofiles[new];
498#if 0
499	if (delfp && (fdp->fd_ofileflags[new] & UF_MAPPED))
500		(void) munmapfd(td, new);
501#endif
502
503	/*
504	 * Duplicate the source descriptor, update lastfile
505	 */
506	fp = fdp->fd_ofiles[old];
507	fdp->fd_ofiles[new] = fp;
508	fdp->fd_ofileflags[new] = fdp->fd_ofileflags[old] &~ UF_EXCLOSE;
509	fhold(fp);
510	if (new > fdp->fd_lastfile)
511		fdp->fd_lastfile = new;
512	*retval = new;
513
514	FILEDESC_UNLOCK(fdp);
515
516	/*
517	 * If we dup'd over a valid file, we now own the reference to it
518	 * and must dispose of it using closef() semantics (as if a
519	 * close() were performed on it).
520	 */
521	if (delfp) {
522		mtx_lock(&Giant);
523		(void) closef(delfp, td);
524		mtx_unlock(&Giant);
525	}
526	return (0);
527}
528
529/*
530 * If sigio is on the list associated with a process or process group,
531 * disable signalling from the device, remove sigio from the list and
532 * free sigio.
533 */
534void
535funsetown(sigiop)
536	struct sigio **sigiop;
537{
538	struct sigio *sigio;
539
540	SIGIO_LOCK();
541	sigio = *sigiop;
542	if (sigio == NULL) {
543		SIGIO_UNLOCK();
544		return;
545	}
546	*(sigio->sio_myref) = NULL;
547	if ((sigio)->sio_pgid < 0) {
548		struct pgrp *pg = (sigio)->sio_pgrp;
549		PGRP_LOCK(pg);
550		SLIST_REMOVE(&sigio->sio_pgrp->pg_sigiolst, sigio,
551			     sigio, sio_pgsigio);
552		PGRP_UNLOCK(pg);
553	} else {
554		struct proc *p = (sigio)->sio_proc;
555		PROC_LOCK(p);
556		SLIST_REMOVE(&sigio->sio_proc->p_sigiolst, sigio,
557			     sigio, sio_pgsigio);
558		PROC_UNLOCK(p);
559	}
560	SIGIO_UNLOCK();
561	crfree(sigio->sio_ucred);
562	FREE(sigio, M_SIGIO);
563}
564
565/*
566 * Free a list of sigio structures.
567 * We only need to lock the SIGIO_LOCK because we have made ourselves
568 * inaccessable to callers of fsetown and therefore do not need to lock
569 * the proc or pgrp struct for the list manipulation.
570 */
571void
572funsetownlst(sigiolst)
573	struct sigiolst *sigiolst;
574{
575	struct sigio *sigio;
576	struct proc *p;
577	struct pgrp *pg;
578
579	sigio = SLIST_FIRST(sigiolst);
580	if (sigio == NULL)
581		return;
582
583	p = NULL;
584	pg = NULL;
585
586	/*
587	 * Every entry of the list should belong
588	 * to a single proc or pgrp.
589	 */
590	if (sigio->sio_pgid < 0) {
591		pg = sigio->sio_pgrp;
592		PGRP_LOCK_ASSERT(pg, MA_NOTOWNED);
593	} else /* if (sigio->sio_pgid > 0) */ {
594		p = sigio->sio_proc;
595		PROC_LOCK_ASSERT(p, MA_NOTOWNED);
596	}
597
598	SIGIO_LOCK();
599	while ((sigio = SLIST_FIRST(sigiolst)) != NULL) {
600		*(sigio->sio_myref) = NULL;
601		if (pg != NULL) {
602			KASSERT(sigio->sio_pgid < 0,
603			    ("Proc sigio in pgrp sigio list"));
604			KASSERT(sigio->sio_pgrp == pg,
605			    ("Bogus pgrp in sigio list"));
606			PGRP_LOCK(pg);
607			SLIST_REMOVE(&pg->pg_sigiolst, sigio, sigio,
608			    sio_pgsigio);
609			PGRP_UNLOCK(pg);
610		} else /* if (p != NULL) */ {
611			KASSERT(sigio->sio_pgid > 0,
612			    ("Pgrp sigio in proc sigio list"));
613			KASSERT(sigio->sio_proc == p,
614			    ("Bogus proc in sigio list"));
615			PROC_LOCK(p);
616			SLIST_REMOVE(&p->p_sigiolst, sigio, sigio,
617			    sio_pgsigio);
618			PROC_UNLOCK(p);
619		}
620		SIGIO_UNLOCK();
621		crfree(sigio->sio_ucred);
622		FREE(sigio, M_SIGIO);
623		SIGIO_LOCK();
624	}
625	SIGIO_UNLOCK();
626}
627
628/*
629 * This is common code for FIOSETOWN ioctl called by fcntl(fd, F_SETOWN, arg).
630 *
631 * After permission checking, add a sigio structure to the sigio list for
632 * the process or process group.
633 */
634int
635fsetown(pgid, sigiop)
636	pid_t pgid;
637	struct sigio **sigiop;
638{
639	struct proc *proc;
640	struct pgrp *pgrp;
641	struct sigio *sigio;
642	int ret;
643
644	if (pgid == 0) {
645		funsetown(sigiop);
646		return (0);
647	}
648
649	ret = 0;
650
651	/* Allocate and fill in the new sigio out of locks. */
652	MALLOC(sigio, struct sigio *, sizeof(struct sigio), M_SIGIO, M_WAITOK);
653	sigio->sio_pgid = pgid;
654	sigio->sio_ucred = crhold(curthread->td_ucred);
655	sigio->sio_myref = sigiop;
656
657	sx_slock(&proctree_lock);
658	if (pgid > 0) {
659		proc = pfind(pgid);
660		if (proc == NULL) {
661			ret = ESRCH;
662			goto fail;
663		}
664
665		/*
666		 * Policy - Don't allow a process to FSETOWN a process
667		 * in another session.
668		 *
669		 * Remove this test to allow maximum flexibility or
670		 * restrict FSETOWN to the current process or process
671		 * group for maximum safety.
672		 */
673		PROC_UNLOCK(proc);
674		if (proc->p_session != curthread->td_proc->p_session) {
675			ret = EPERM;
676			goto fail;
677		}
678
679		pgrp = NULL;
680	} else /* if (pgid < 0) */ {
681		pgrp = pgfind(-pgid);
682		if (pgrp == NULL) {
683			ret = ESRCH;
684			goto fail;
685		}
686		PGRP_UNLOCK(pgrp);
687
688		/*
689		 * Policy - Don't allow a process to FSETOWN a process
690		 * in another session.
691		 *
692		 * Remove this test to allow maximum flexibility or
693		 * restrict FSETOWN to the current process or process
694		 * group for maximum safety.
695		 */
696		if (pgrp->pg_session != curthread->td_proc->p_session) {
697			ret = EPERM;
698			goto fail;
699		}
700
701		proc = NULL;
702	}
703	funsetown(sigiop);
704	if (pgid > 0) {
705		PROC_LOCK(proc);
706		/*
707		 * since funsetownlst() is called without the proctree
708		 * locked we need to check for P_WEXIT.
709		 * XXX: is ESRCH correct?
710		 */
711		if ((proc->p_flag & P_WEXIT) != 0) {
712			PROC_UNLOCK(proc);
713			ret = ESRCH;
714			goto fail;
715		}
716		SLIST_INSERT_HEAD(&proc->p_sigiolst, sigio, sio_pgsigio);
717		sigio->sio_proc = proc;
718		PROC_UNLOCK(proc);
719	} else {
720		PGRP_LOCK(pgrp);
721		SLIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
722		sigio->sio_pgrp = pgrp;
723		PGRP_UNLOCK(pgrp);
724	}
725	sx_sunlock(&proctree_lock);
726	SIGIO_LOCK();
727	*sigiop = sigio;
728	SIGIO_UNLOCK();
729	return (0);
730
731fail:
732	sx_sunlock(&proctree_lock);
733	crfree(sigio->sio_ucred);
734	FREE(sigio, M_SIGIO);
735	return (ret);
736}
737
738/*
739 * This is common code for FIOGETOWN ioctl called by fcntl(fd, F_GETOWN, arg).
740 */
741pid_t
742fgetown(sigio)
743	struct sigio *sigio;
744{
745	return (sigio != NULL ? sigio->sio_pgid : 0);
746}
747
748/*
749 * Close a file descriptor.
750 */
751#ifndef _SYS_SYSPROTO_H_
752struct close_args {
753        int     fd;
754};
755#endif
756/*
757 * MPSAFE
758 */
759/* ARGSUSED */
760int
761close(td, uap)
762	struct thread *td;
763	struct close_args *uap;
764{
765	register struct filedesc *fdp;
766	register struct file *fp;
767	register int fd = uap->fd;
768	int error = 0;
769
770	mtx_lock(&Giant);
771	fdp = td->td_proc->p_fd;
772	FILEDESC_LOCK(fdp);
773	if ((unsigned)fd >= fdp->fd_nfiles ||
774	    (fp = fdp->fd_ofiles[fd]) == NULL) {
775		FILEDESC_UNLOCK(fdp);
776		error = EBADF;
777		goto done2;
778	}
779#if 0
780	if (fdp->fd_ofileflags[fd] & UF_MAPPED)
781		(void) munmapfd(td, fd);
782#endif
783	fdp->fd_ofiles[fd] = NULL;
784	fdp->fd_ofileflags[fd] = 0;
785
786	/*
787	 * we now hold the fp reference that used to be owned by the descriptor
788	 * array.
789	 */
790	while (fdp->fd_lastfile > 0 && fdp->fd_ofiles[fdp->fd_lastfile] == NULL)
791		fdp->fd_lastfile--;
792	if (fd < fdp->fd_freefile)
793		fdp->fd_freefile = fd;
794	if (fd < fdp->fd_knlistsize) {
795		FILEDESC_UNLOCK(fdp);
796		knote_fdclose(td, fd);
797	} else
798		FILEDESC_UNLOCK(fdp);
799
800	error = closef(fp, td);
801done2:
802	mtx_unlock(&Giant);
803	return(error);
804}
805
806#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
807/*
808 * Return status information about a file descriptor.
809 */
810#ifndef _SYS_SYSPROTO_H_
811struct ofstat_args {
812	int	fd;
813	struct	ostat *sb;
814};
815#endif
816/*
817 * MPSAFE
818 */
819/* ARGSUSED */
820int
821ofstat(td, uap)
822	struct thread *td;
823	register struct ofstat_args *uap;
824{
825	struct file *fp;
826	struct stat ub;
827	struct ostat oub;
828	int error;
829
830	mtx_lock(&Giant);
831	if ((error = fget(td, uap->fd, &fp)) != 0)
832		goto done2;
833	error = fo_stat(fp, &ub, td);
834	if (error == 0) {
835		cvtstat(&ub, &oub);
836		error = copyout(&oub, uap->sb, sizeof (oub));
837	}
838	fdrop(fp, td);
839done2:
840	mtx_unlock(&Giant);
841	return (error);
842}
843#endif /* COMPAT_43 || COMPAT_SUNOS */
844
845/*
846 * Return status information about a file descriptor.
847 */
848#ifndef _SYS_SYSPROTO_H_
849struct fstat_args {
850	int	fd;
851	struct	stat *sb;
852};
853#endif
854/*
855 * MPSAFE
856 */
857/* ARGSUSED */
858int
859fstat(td, uap)
860	struct thread *td;
861	struct fstat_args *uap;
862{
863	struct file *fp;
864	struct stat ub;
865	int error;
866
867	mtx_lock(&Giant);
868	if ((error = fget(td, uap->fd, &fp)) != 0)
869		goto done2;
870	error = fo_stat(fp, &ub, td);
871	if (error == 0)
872		error = copyout(&ub, uap->sb, sizeof (ub));
873	fdrop(fp, td);
874done2:
875	mtx_unlock(&Giant);
876	return (error);
877}
878
879/*
880 * Return status information about a file descriptor.
881 */
882#ifndef _SYS_SYSPROTO_H_
883struct nfstat_args {
884	int	fd;
885	struct	nstat *sb;
886};
887#endif
888/*
889 * MPSAFE
890 */
891/* ARGSUSED */
892int
893nfstat(td, uap)
894	struct thread *td;
895	register struct nfstat_args *uap;
896{
897	struct file *fp;
898	struct stat ub;
899	struct nstat nub;
900	int error;
901
902	mtx_lock(&Giant);
903	if ((error = fget(td, uap->fd, &fp)) != 0)
904		goto done2;
905	error = fo_stat(fp, &ub, td);
906	if (error == 0) {
907		cvtnstat(&ub, &nub);
908		error = copyout(&nub, uap->sb, sizeof (nub));
909	}
910	fdrop(fp, td);
911done2:
912	mtx_unlock(&Giant);
913	return (error);
914}
915
916/*
917 * Return pathconf information about a file descriptor.
918 */
919#ifndef _SYS_SYSPROTO_H_
920struct fpathconf_args {
921	int	fd;
922	int	name;
923};
924#endif
925/*
926 * MPSAFE
927 */
928/* ARGSUSED */
929int
930fpathconf(td, uap)
931	struct thread *td;
932	register struct fpathconf_args *uap;
933{
934	struct file *fp;
935	struct vnode *vp;
936	int error;
937
938	if ((error = fget(td, uap->fd, &fp)) != 0)
939		return (error);
940
941	switch (fp->f_type) {
942	case DTYPE_PIPE:
943	case DTYPE_SOCKET:
944		if (uap->name != _PC_PIPE_BUF) {
945			error = EINVAL;
946		} else {
947			td->td_retval[0] = PIPE_BUF;
948			error = 0;
949		}
950		break;
951	case DTYPE_FIFO:
952	case DTYPE_VNODE:
953		vp = (struct vnode *)fp->f_data;
954		mtx_lock(&Giant);
955		error = VOP_PATHCONF(vp, uap->name, td->td_retval);
956		mtx_unlock(&Giant);
957		break;
958	default:
959		error = EOPNOTSUPP;
960		break;
961	}
962	fdrop(fp, td);
963	return(error);
964}
965
966/*
967 * Allocate a file descriptor for the process.
968 */
969static int fdexpand;
970SYSCTL_INT(_debug, OID_AUTO, fdexpand, CTLFLAG_RD, &fdexpand, 0, "");
971
972int
973fdalloc(td, want, result)
974	struct thread *td;
975	int want;
976	int *result;
977{
978	struct proc *p = td->td_proc;
979	register struct filedesc *fdp = td->td_proc->p_fd;
980	register int i;
981	int lim, last, nfiles;
982	struct file **newofile, **oldofile;
983	char *newofileflags;
984
985	FILEDESC_LOCK_ASSERT(fdp, MA_OWNED);
986
987	/*
988	 * Search for a free descriptor starting at the higher
989	 * of want or fd_freefile.  If that fails, consider
990	 * expanding the ofile array.
991	 */
992	lim = min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfilesperproc);
993	for (;;) {
994		last = min(fdp->fd_nfiles, lim);
995		if ((i = want) < fdp->fd_freefile)
996			i = fdp->fd_freefile;
997		for (; i < last; i++) {
998			if (fdp->fd_ofiles[i] == NULL) {
999				fdp->fd_ofileflags[i] = 0;
1000				if (i > fdp->fd_lastfile)
1001					fdp->fd_lastfile = i;
1002				if (want <= fdp->fd_freefile)
1003					fdp->fd_freefile = i;
1004				*result = i;
1005				return (0);
1006			}
1007		}
1008
1009		/*
1010		 * No space in current array.  Expand?
1011		 */
1012		if (fdp->fd_nfiles >= lim)
1013			return (EMFILE);
1014		if (fdp->fd_nfiles < NDEXTENT)
1015			nfiles = NDEXTENT;
1016		else
1017			nfiles = 2 * fdp->fd_nfiles;
1018		FILEDESC_UNLOCK(fdp);
1019		mtx_lock(&Giant);
1020		MALLOC(newofile, struct file **, nfiles * OFILESIZE,
1021		    M_FILEDESC, M_WAITOK);
1022		mtx_unlock(&Giant);
1023		FILEDESC_LOCK(fdp);
1024
1025		/*
1026		 * deal with file-table extend race that might have occured
1027		 * when malloc was blocked.
1028		 */
1029		if (fdp->fd_nfiles >= nfiles) {
1030			FILEDESC_UNLOCK(fdp);
1031			mtx_lock(&Giant);
1032			FREE(newofile, M_FILEDESC);
1033			mtx_unlock(&Giant);
1034			FILEDESC_LOCK(fdp);
1035			continue;
1036		}
1037		newofileflags = (char *) &newofile[nfiles];
1038		/*
1039		 * Copy the existing ofile and ofileflags arrays
1040		 * and zero the new portion of each array.
1041		 */
1042		bcopy(fdp->fd_ofiles, newofile,
1043			(i = sizeof(struct file *) * fdp->fd_nfiles));
1044		bzero((char *)newofile + i, nfiles * sizeof(struct file *) - i);
1045		bcopy(fdp->fd_ofileflags, newofileflags,
1046			(i = sizeof(char) * fdp->fd_nfiles));
1047		bzero(newofileflags + i, nfiles * sizeof(char) - i);
1048		if (fdp->fd_nfiles > NDFILE)
1049			oldofile = fdp->fd_ofiles;
1050		else
1051			oldofile = NULL;
1052		fdp->fd_ofiles = newofile;
1053		fdp->fd_ofileflags = newofileflags;
1054		fdp->fd_nfiles = nfiles;
1055		fdexpand++;
1056		if (oldofile != NULL) {
1057			FILEDESC_UNLOCK(fdp);
1058			mtx_lock(&Giant);
1059			FREE(oldofile, M_FILEDESC);
1060			mtx_unlock(&Giant);
1061			FILEDESC_LOCK(fdp);
1062		}
1063	}
1064	return (0);
1065}
1066
1067/*
1068 * Check to see whether n user file descriptors
1069 * are available to the process p.
1070 */
1071int
1072fdavail(td, n)
1073	struct thread *td;
1074	register int n;
1075{
1076	struct proc *p = td->td_proc;
1077	register struct filedesc *fdp = td->td_proc->p_fd;
1078	register struct file **fpp;
1079	register int i, lim, last;
1080
1081	FILEDESC_LOCK_ASSERT(fdp, MA_OWNED);
1082
1083	lim = min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfilesperproc);
1084	if ((i = lim - fdp->fd_nfiles) > 0 && (n -= i) <= 0)
1085		return (1);
1086
1087	last = min(fdp->fd_nfiles, lim);
1088	fpp = &fdp->fd_ofiles[fdp->fd_freefile];
1089	for (i = last - fdp->fd_freefile; --i >= 0; fpp++) {
1090		if (*fpp == NULL && --n <= 0)
1091			return (1);
1092	}
1093	return (0);
1094}
1095
1096/*
1097 * Create a new open file structure and allocate
1098 * a file decriptor for the process that refers to it.
1099 */
1100int
1101falloc(td, resultfp, resultfd)
1102	register struct thread *td;
1103	struct file **resultfp;
1104	int *resultfd;
1105{
1106	struct proc *p = td->td_proc;
1107	register struct file *fp, *fq;
1108	int error, i;
1109
1110	fp = uma_zalloc(file_zone, M_WAITOK | M_ZERO);
1111	sx_xlock(&filelist_lock);
1112	if (nfiles >= maxfiles) {
1113		sx_xunlock(&filelist_lock);
1114		uma_zfree(file_zone, fp);
1115		tablefull("file");
1116		return (ENFILE);
1117	}
1118	nfiles++;
1119
1120	/*
1121	 * If the process has file descriptor zero open, add the new file
1122	 * descriptor to the list of open files at that point, otherwise
1123	 * put it at the front of the list of open files.
1124	 */
1125	FILEDESC_LOCK(p->p_fd);
1126	if ((error = fdalloc(td, 0, &i))) {
1127		FILEDESC_UNLOCK(p->p_fd);
1128		nfiles--;
1129		sx_xunlock(&filelist_lock);
1130		uma_zfree(file_zone, fp);
1131		return (error);
1132	}
1133	fp->f_mtxp = mtx_pool_alloc();
1134	fp->f_gcflag = 0;
1135	fp->f_count = 1;
1136	fp->f_cred = crhold(td->td_ucred);
1137	fp->f_ops = &badfileops;
1138	fp->f_seqcount = 1;
1139	if ((fq = p->p_fd->fd_ofiles[0])) {
1140		LIST_INSERT_AFTER(fq, fp, f_list);
1141	} else {
1142		LIST_INSERT_HEAD(&filehead, fp, f_list);
1143	}
1144	p->p_fd->fd_ofiles[i] = fp;
1145	FILEDESC_UNLOCK(p->p_fd);
1146	sx_xunlock(&filelist_lock);
1147	if (resultfp)
1148		*resultfp = fp;
1149	if (resultfd)
1150		*resultfd = i;
1151	return (0);
1152}
1153
1154/*
1155 * Free a file descriptor.
1156 */
1157void
1158ffree(fp)
1159	register struct file *fp;
1160{
1161
1162	KASSERT((fp->f_count == 0), ("ffree: fp_fcount not 0!"));
1163	sx_xlock(&filelist_lock);
1164	LIST_REMOVE(fp, f_list);
1165	nfiles--;
1166	sx_xunlock(&filelist_lock);
1167	crfree(fp->f_cred);
1168	uma_zfree(file_zone, fp);
1169}
1170
1171/*
1172 * Build a new filedesc structure.
1173 */
1174struct filedesc *
1175fdinit(td)
1176	struct thread *td;
1177{
1178	register struct filedesc0 *newfdp;
1179	register struct filedesc *fdp = td->td_proc->p_fd;
1180
1181	MALLOC(newfdp, struct filedesc0 *, sizeof(struct filedesc0),
1182	    M_FILEDESC, M_WAITOK | M_ZERO);
1183	mtx_init(&newfdp->fd_fd.fd_mtx, FILEDESC_LOCK_DESC, NULL, MTX_DEF);
1184	FILEDESC_LOCK(&newfdp->fd_fd);
1185	newfdp->fd_fd.fd_cdir = fdp->fd_cdir;
1186	if (newfdp->fd_fd.fd_cdir)
1187		VREF(newfdp->fd_fd.fd_cdir);
1188	newfdp->fd_fd.fd_rdir = fdp->fd_rdir;
1189	if (newfdp->fd_fd.fd_rdir)
1190		VREF(newfdp->fd_fd.fd_rdir);
1191	newfdp->fd_fd.fd_jdir = fdp->fd_jdir;
1192	if (newfdp->fd_fd.fd_jdir)
1193		VREF(newfdp->fd_fd.fd_jdir);
1194
1195	/* Create the file descriptor table. */
1196	newfdp->fd_fd.fd_refcnt = 1;
1197	newfdp->fd_fd.fd_cmask = cmask;
1198	newfdp->fd_fd.fd_ofiles = newfdp->fd_dfiles;
1199	newfdp->fd_fd.fd_ofileflags = newfdp->fd_dfileflags;
1200	newfdp->fd_fd.fd_nfiles = NDFILE;
1201	newfdp->fd_fd.fd_knlistsize = -1;
1202	FILEDESC_UNLOCK(&newfdp->fd_fd);
1203
1204	return (&newfdp->fd_fd);
1205}
1206
1207/*
1208 * Share a filedesc structure.
1209 */
1210struct filedesc *
1211fdshare(p)
1212	struct proc *p;
1213{
1214	FILEDESC_LOCK(p->p_fd);
1215	p->p_fd->fd_refcnt++;
1216	FILEDESC_UNLOCK(p->p_fd);
1217	return (p->p_fd);
1218}
1219
1220/*
1221 * Copy a filedesc structure.
1222 */
1223struct filedesc *
1224fdcopy(td)
1225	struct thread *td;
1226{
1227	register struct filedesc *newfdp, *fdp = td->td_proc->p_fd;
1228	register struct file **fpp;
1229	register int i, j;
1230
1231	/* Certain daemons might not have file descriptors. */
1232	if (fdp == NULL)
1233		return (NULL);
1234
1235	FILEDESC_LOCK_ASSERT(fdp, MA_OWNED);
1236
1237	FILEDESC_UNLOCK(fdp);
1238	MALLOC(newfdp, struct filedesc *, sizeof(struct filedesc0),
1239	    M_FILEDESC, M_WAITOK);
1240	FILEDESC_LOCK(fdp);
1241	bcopy(fdp, newfdp, sizeof(struct filedesc));
1242	FILEDESC_UNLOCK(fdp);
1243	bzero(&newfdp->fd_mtx, sizeof(newfdp->fd_mtx));
1244	mtx_init(&newfdp->fd_mtx, FILEDESC_LOCK_DESC, NULL, MTX_DEF);
1245	if (newfdp->fd_cdir)
1246		VREF(newfdp->fd_cdir);
1247	if (newfdp->fd_rdir)
1248		VREF(newfdp->fd_rdir);
1249	if (newfdp->fd_jdir)
1250		VREF(newfdp->fd_jdir);
1251	newfdp->fd_refcnt = 1;
1252
1253	/*
1254	 * If the number of open files fits in the internal arrays
1255	 * of the open file structure, use them, otherwise allocate
1256	 * additional memory for the number of descriptors currently
1257	 * in use.
1258	 */
1259	FILEDESC_LOCK(fdp);
1260	newfdp->fd_lastfile = fdp->fd_lastfile;
1261	newfdp->fd_nfiles = fdp->fd_nfiles;
1262	if (newfdp->fd_lastfile < NDFILE) {
1263		newfdp->fd_ofiles = ((struct filedesc0 *) newfdp)->fd_dfiles;
1264		newfdp->fd_ofileflags =
1265		    ((struct filedesc0 *) newfdp)->fd_dfileflags;
1266		i = NDFILE;
1267	} else {
1268		/*
1269		 * Compute the smallest multiple of NDEXTENT needed
1270		 * for the file descriptors currently in use,
1271		 * allowing the table to shrink.
1272		 */
1273retry:
1274		i = newfdp->fd_nfiles;
1275		while (i > 2 * NDEXTENT && i > newfdp->fd_lastfile * 2)
1276			i /= 2;
1277		FILEDESC_UNLOCK(fdp);
1278		MALLOC(newfdp->fd_ofiles, struct file **, i * OFILESIZE,
1279		    M_FILEDESC, M_WAITOK);
1280		FILEDESC_LOCK(fdp);
1281		newfdp->fd_lastfile = fdp->fd_lastfile;
1282		newfdp->fd_nfiles = fdp->fd_nfiles;
1283		j = newfdp->fd_nfiles;
1284		while (j > 2 * NDEXTENT && j > newfdp->fd_lastfile * 2)
1285			j /= 2;
1286		if (i != j) {
1287			/*
1288			 * The size of the original table has changed.
1289			 * Go over once again.
1290			 */
1291			FILEDESC_UNLOCK(fdp);
1292			FREE(newfdp->fd_ofiles, M_FILEDESC);
1293			FILEDESC_LOCK(fdp);
1294			newfdp->fd_lastfile = fdp->fd_lastfile;
1295			newfdp->fd_nfiles = fdp->fd_nfiles;
1296			goto retry;
1297		}
1298		newfdp->fd_ofileflags = (char *) &newfdp->fd_ofiles[i];
1299	}
1300	newfdp->fd_nfiles = i;
1301	bcopy(fdp->fd_ofiles, newfdp->fd_ofiles, i * sizeof(struct file **));
1302	bcopy(fdp->fd_ofileflags, newfdp->fd_ofileflags, i * sizeof(char));
1303
1304	/*
1305	 * kq descriptors cannot be copied.
1306	 */
1307	if (newfdp->fd_knlistsize != -1) {
1308		fpp = &newfdp->fd_ofiles[newfdp->fd_lastfile];
1309		for (i = newfdp->fd_lastfile; i >= 0; i--, fpp--) {
1310			if (*fpp != NULL && (*fpp)->f_type == DTYPE_KQUEUE) {
1311				*fpp = NULL;
1312				if (i < newfdp->fd_freefile)
1313					newfdp->fd_freefile = i;
1314			}
1315			if (*fpp == NULL && i == newfdp->fd_lastfile && i > 0)
1316				newfdp->fd_lastfile--;
1317		}
1318		newfdp->fd_knlist = NULL;
1319		newfdp->fd_knlistsize = -1;
1320		newfdp->fd_knhash = NULL;
1321		newfdp->fd_knhashmask = 0;
1322	}
1323
1324	fpp = newfdp->fd_ofiles;
1325	for (i = newfdp->fd_lastfile; i-- >= 0; fpp++) {
1326		if (*fpp != NULL) {
1327			fhold(*fpp);
1328		}
1329	}
1330	return (newfdp);
1331}
1332
1333/*
1334 * Release a filedesc structure.
1335 */
1336void
1337fdfree(td)
1338	struct thread *td;
1339{
1340	register struct filedesc *fdp;
1341	struct file **fpp;
1342	register int i;
1343
1344	fdp = td->td_proc->p_fd;
1345	/* Certain daemons might not have file descriptors. */
1346	if (fdp == NULL)
1347		return;
1348
1349	FILEDESC_LOCK(fdp);
1350	if (--fdp->fd_refcnt > 0) {
1351		FILEDESC_UNLOCK(fdp);
1352		return;
1353	}
1354	/*
1355	 * we are the last reference to the structure, we can
1356	 * safely assume it will not change out from under us.
1357	 */
1358	FILEDESC_UNLOCK(fdp);
1359	fpp = fdp->fd_ofiles;
1360	for (i = fdp->fd_lastfile; i-- >= 0; fpp++) {
1361		if (*fpp)
1362			(void) closef(*fpp, td);
1363	}
1364
1365	PROC_LOCK(td->td_proc);
1366	td->td_proc->p_fd = NULL;
1367	PROC_UNLOCK(td->td_proc);
1368
1369	if (fdp->fd_nfiles > NDFILE)
1370		FREE(fdp->fd_ofiles, M_FILEDESC);
1371	if (fdp->fd_cdir)
1372		vrele(fdp->fd_cdir);
1373	if (fdp->fd_rdir)
1374		vrele(fdp->fd_rdir);
1375	if (fdp->fd_jdir)
1376		vrele(fdp->fd_jdir);
1377	if (fdp->fd_knlist)
1378		FREE(fdp->fd_knlist, M_KQUEUE);
1379	if (fdp->fd_knhash)
1380		FREE(fdp->fd_knhash, M_KQUEUE);
1381	mtx_destroy(&fdp->fd_mtx);
1382	FREE(fdp, M_FILEDESC);
1383}
1384
1385/*
1386 * For setugid programs, we don't want to people to use that setugidness
1387 * to generate error messages which write to a file which otherwise would
1388 * otherwise be off-limits to the process.
1389 *
1390 * This is a gross hack to plug the hole.  A better solution would involve
1391 * a special vop or other form of generalized access control mechanism.  We
1392 * go ahead and just reject all procfs filesystems accesses as dangerous.
1393 *
1394 * Since setugidsafety calls this only for fd 0, 1 and 2, this check is
1395 * sufficient.  We also don't for check setugidness since we know we are.
1396 */
1397static int
1398is_unsafe(struct file *fp)
1399{
1400	if (fp->f_type == DTYPE_VNODE &&
1401	    ((struct vnode *)(fp->f_data))->v_tag == VT_PROCFS)
1402		return (1);
1403	return (0);
1404}
1405
1406/*
1407 * Make this setguid thing safe, if at all possible.
1408 */
1409void
1410setugidsafety(td)
1411	struct thread *td;
1412{
1413	struct filedesc *fdp = td->td_proc->p_fd;
1414	register int i;
1415
1416	/* Certain daemons might not have file descriptors. */
1417	if (fdp == NULL)
1418		return;
1419
1420	/*
1421	 * note: fdp->fd_ofiles may be reallocated out from under us while
1422	 * we are blocked in a close.  Be careful!
1423	 */
1424	FILEDESC_LOCK(fdp);
1425	for (i = 0; i <= fdp->fd_lastfile; i++) {
1426		if (i > 2)
1427			break;
1428		if (fdp->fd_ofiles[i] && is_unsafe(fdp->fd_ofiles[i])) {
1429			struct file *fp;
1430
1431#if 0
1432			if ((fdp->fd_ofileflags[i] & UF_MAPPED) != 0)
1433				(void) munmapfd(td, i);
1434#endif
1435			if (i < fdp->fd_knlistsize) {
1436				FILEDESC_UNLOCK(fdp);
1437				knote_fdclose(td, i);
1438				FILEDESC_LOCK(fdp);
1439			}
1440			/*
1441			 * NULL-out descriptor prior to close to avoid
1442			 * a race while close blocks.
1443			 */
1444			fp = fdp->fd_ofiles[i];
1445			fdp->fd_ofiles[i] = NULL;
1446			fdp->fd_ofileflags[i] = 0;
1447			if (i < fdp->fd_freefile)
1448				fdp->fd_freefile = i;
1449			FILEDESC_UNLOCK(fdp);
1450			(void) closef(fp, td);
1451			FILEDESC_LOCK(fdp);
1452		}
1453	}
1454	while (fdp->fd_lastfile > 0 && fdp->fd_ofiles[fdp->fd_lastfile] == NULL)
1455		fdp->fd_lastfile--;
1456	FILEDESC_UNLOCK(fdp);
1457}
1458
1459/*
1460 * Close any files on exec?
1461 */
1462void
1463fdcloseexec(td)
1464	struct thread *td;
1465{
1466	struct filedesc *fdp = td->td_proc->p_fd;
1467	register int i;
1468
1469	/* Certain daemons might not have file descriptors. */
1470	if (fdp == NULL)
1471		return;
1472
1473	FILEDESC_LOCK(fdp);
1474
1475	/*
1476	 * We cannot cache fd_ofiles or fd_ofileflags since operations
1477	 * may block and rip them out from under us.
1478	 */
1479	for (i = 0; i <= fdp->fd_lastfile; i++) {
1480		if (fdp->fd_ofiles[i] != NULL &&
1481		    (fdp->fd_ofileflags[i] & UF_EXCLOSE)) {
1482			struct file *fp;
1483
1484#if 0
1485			if (fdp->fd_ofileflags[i] & UF_MAPPED)
1486				(void) munmapfd(td, i);
1487#endif
1488			if (i < fdp->fd_knlistsize) {
1489				FILEDESC_UNLOCK(fdp);
1490				knote_fdclose(td, i);
1491				FILEDESC_LOCK(fdp);
1492			}
1493			/*
1494			 * NULL-out descriptor prior to close to avoid
1495			 * a race while close blocks.
1496			 */
1497			fp = fdp->fd_ofiles[i];
1498			fdp->fd_ofiles[i] = NULL;
1499			fdp->fd_ofileflags[i] = 0;
1500			if (i < fdp->fd_freefile)
1501				fdp->fd_freefile = i;
1502			FILEDESC_UNLOCK(fdp);
1503			(void) closef(fp, td);
1504			FILEDESC_LOCK(fdp);
1505		}
1506	}
1507	while (fdp->fd_lastfile > 0 && fdp->fd_ofiles[fdp->fd_lastfile] == NULL)
1508		fdp->fd_lastfile--;
1509	FILEDESC_UNLOCK(fdp);
1510}
1511
1512/*
1513 * It is unsafe for set[ug]id processes to be started with file
1514 * descriptors 0..2 closed, as these descriptors are given implicit
1515 * significance in the Standard C library.  fdcheckstd() will create a
1516 * descriptor referencing /dev/null for each of stdin, stdout, and
1517 * stderr that is not already open.
1518 */
1519int
1520fdcheckstd(td)
1521	struct thread *td;
1522{
1523	struct nameidata nd;
1524	struct filedesc *fdp;
1525	struct file *fp;
1526	register_t retval;
1527	int fd, i, error, flags, devnull;
1528
1529	fdp = td->td_proc->p_fd;
1530	if (fdp == NULL)
1531		return (0);
1532	devnull = -1;
1533	error = 0;
1534	for (i = 0; i < 3; i++) {
1535		if (fdp->fd_ofiles[i] != NULL)
1536			continue;
1537		if (devnull < 0) {
1538			error = falloc(td, &fp, &fd);
1539			if (error != 0)
1540				break;
1541			NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, "/dev/null",
1542			    td);
1543			flags = FREAD | FWRITE;
1544			error = vn_open(&nd, &flags, 0);
1545			if (error != 0) {
1546				FILEDESC_LOCK(fdp);
1547				fdp->fd_ofiles[i] = NULL;
1548				FILEDESC_UNLOCK(fdp);
1549				fdrop(fp, td);
1550				break;
1551			}
1552			NDFREE(&nd, NDF_ONLY_PNBUF);
1553			fp->f_data = nd.ni_vp;
1554			fp->f_flag = flags;
1555			fp->f_ops = &vnops;
1556			fp->f_type = DTYPE_VNODE;
1557			VOP_UNLOCK(nd.ni_vp, 0, td);
1558			devnull = fd;
1559		} else {
1560			FILEDESC_LOCK(fdp);
1561			error = fdalloc(td, 0, &fd);
1562			if (error != 0) {
1563				FILEDESC_UNLOCK(fdp);
1564				break;
1565			}
1566			error = do_dup(fdp, devnull, fd, &retval, td);
1567			if (error != 0)
1568				break;
1569		}
1570	}
1571	return (error);
1572}
1573
1574/*
1575 * Internal form of close.
1576 * Decrement reference count on file structure.
1577 * Note: td may be NULL when closing a file
1578 * that was being passed in a message.
1579 */
1580int
1581closef(fp, td)
1582	register struct file *fp;
1583	register struct thread *td;
1584{
1585	struct vnode *vp;
1586	struct flock lf;
1587
1588	if (fp == NULL)
1589		return (0);
1590	/*
1591	 * POSIX record locking dictates that any close releases ALL
1592	 * locks owned by this process.  This is handled by setting
1593	 * a flag in the unlock to free ONLY locks obeying POSIX
1594	 * semantics, and not to free BSD-style file locks.
1595	 * If the descriptor was in a message, POSIX-style locks
1596	 * aren't passed with the descriptor.
1597	 */
1598	if (td && (td->td_proc->p_flag & P_ADVLOCK) &&
1599	    fp->f_type == DTYPE_VNODE) {
1600		lf.l_whence = SEEK_SET;
1601		lf.l_start = 0;
1602		lf.l_len = 0;
1603		lf.l_type = F_UNLCK;
1604		vp = (struct vnode *)fp->f_data;
1605		(void) VOP_ADVLOCK(vp, (caddr_t)td->td_proc->p_leader,
1606		    F_UNLCK, &lf, F_POSIX);
1607	}
1608	return (fdrop(fp, td));
1609}
1610
1611/*
1612 * Drop reference on struct file passed in, may call closef if the
1613 * reference hits zero.
1614 */
1615int
1616fdrop(fp, td)
1617	struct file *fp;
1618	struct thread *td;
1619{
1620
1621	FILE_LOCK(fp);
1622	return (fdrop_locked(fp, td));
1623}
1624
1625/*
1626 * Extract the file pointer associated with the specified descriptor for
1627 * the current user process.
1628 *
1629 * If the descriptor doesn't exist, EBADF is returned.
1630 *
1631 * If the descriptor exists but doesn't match 'flags' then
1632 * return EBADF for read attempts and EINVAL for write attempts.
1633 *
1634 * If 'hold' is set (non-zero) the file's refcount will be bumped on return.
1635 * It should be droped with fdrop().
1636 * If it is not set, then the refcount will not be bumped however the
1637 * thread's filedesc struct will be returned locked (for fgetsock).
1638 *
1639 * If an error occured the non-zero error is returned and *fpp is set to NULL.
1640 * Otherwise *fpp is set and zero is returned.
1641 */
1642static __inline
1643int
1644_fget(struct thread *td, int fd, struct file **fpp, int flags, int hold)
1645{
1646	struct filedesc *fdp;
1647	struct file *fp;
1648
1649	*fpp = NULL;
1650	if (td == NULL || (fdp = td->td_proc->p_fd) == NULL)
1651		return(EBADF);
1652	FILEDESC_LOCK(fdp);
1653	if ((fp = fget_locked(fdp, fd)) == NULL || fp->f_ops == &badfileops) {
1654		FILEDESC_UNLOCK(fdp);
1655		return(EBADF);
1656	}
1657
1658	/*
1659	 * Note: FREAD failures returns EBADF to maintain backwards
1660	 * compatibility with what routines returned before.
1661	 *
1662	 * Only one flag, or 0, may be specified.
1663	 */
1664	if (flags == FREAD && (fp->f_flag & FREAD) == 0) {
1665		FILEDESC_UNLOCK(fdp);
1666		return(EBADF);
1667	}
1668	if (flags == FWRITE && (fp->f_flag & FWRITE) == 0) {
1669		FILEDESC_UNLOCK(fdp);
1670		return(EINVAL);
1671	}
1672	if (hold) {
1673		fhold(fp);
1674		FILEDESC_UNLOCK(fdp);
1675	}
1676	*fpp = fp;
1677	return(0);
1678}
1679
1680int
1681fget(struct thread *td, int fd, struct file **fpp)
1682{
1683    return(_fget(td, fd, fpp, 0, 1));
1684}
1685
1686int
1687fget_read(struct thread *td, int fd, struct file **fpp)
1688{
1689    return(_fget(td, fd, fpp, FREAD, 1));
1690}
1691
1692int
1693fget_write(struct thread *td, int fd, struct file **fpp)
1694{
1695    return(_fget(td, fd, fpp, FWRITE, 1));
1696}
1697
1698/*
1699 * Like fget() but loads the underlying vnode, or returns an error if
1700 * the descriptor does not represent a vnode.  Note that pipes use vnodes
1701 * but never have VM objects (so VOP_GETVOBJECT() calls will return an
1702 * error).  The returned vnode will be vref()d.
1703 */
1704
1705static __inline
1706int
1707_fgetvp(struct thread *td, int fd, struct vnode **vpp, int flags)
1708{
1709	struct file *fp;
1710	int error;
1711
1712	*vpp = NULL;
1713	if ((error = _fget(td, fd, &fp, 0, 0)) != 0)
1714		return (error);
1715	if (fp->f_type != DTYPE_VNODE && fp->f_type != DTYPE_FIFO) {
1716		error = EINVAL;
1717	} else {
1718		*vpp = (struct vnode *)fp->f_data;
1719		vref(*vpp);
1720	}
1721	FILEDESC_UNLOCK(td->td_proc->p_fd);
1722	return (error);
1723}
1724
1725int
1726fgetvp(struct thread *td, int fd, struct vnode **vpp)
1727{
1728	return(_fgetvp(td, fd, vpp, 0));
1729}
1730
1731int
1732fgetvp_read(struct thread *td, int fd, struct vnode **vpp)
1733{
1734	return(_fgetvp(td, fd, vpp, FREAD));
1735}
1736
1737int
1738fgetvp_write(struct thread *td, int fd, struct vnode **vpp)
1739{
1740	return(_fgetvp(td, fd, vpp, FWRITE));
1741}
1742
1743/*
1744 * Like fget() but loads the underlying socket, or returns an error if
1745 * the descriptor does not represent a socket.
1746 *
1747 * We bump the ref count on the returned socket.  XXX Also obtain the SX lock in
1748 * the future.
1749 */
1750int
1751fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp)
1752{
1753	struct file *fp;
1754	int error;
1755
1756	*spp = NULL;
1757	if (fflagp)
1758		*fflagp = 0;
1759	if ((error = _fget(td, fd, &fp, 0, 0)) != 0)
1760		return (error);
1761	if (fp->f_type != DTYPE_SOCKET) {
1762		error = ENOTSOCK;
1763	} else {
1764		*spp = (struct socket *)fp->f_data;
1765		if (fflagp)
1766			*fflagp = fp->f_flag;
1767		soref(*spp);
1768	}
1769	FILEDESC_UNLOCK(td->td_proc->p_fd);
1770	return(error);
1771}
1772
1773/*
1774 * Drop the reference count on the the socket and XXX release the SX lock in
1775 * the future.  The last reference closes the socket.
1776 */
1777void
1778fputsock(struct socket *so)
1779{
1780	sorele(so);
1781}
1782
1783/*
1784 * Drop reference on struct file passed in, may call closef if the
1785 * reference hits zero.
1786 * Expects struct file locked, and will unlock it.
1787 */
1788int
1789fdrop_locked(fp, td)
1790	struct file *fp;
1791	struct thread *td;
1792{
1793	struct flock lf;
1794	struct vnode *vp;
1795	int error;
1796
1797	FILE_LOCK_ASSERT(fp, MA_OWNED);
1798
1799	if (--fp->f_count > 0) {
1800		FILE_UNLOCK(fp);
1801		return (0);
1802	}
1803	mtx_lock(&Giant);
1804	if (fp->f_count < 0)
1805		panic("fdrop: count < 0");
1806	if ((fp->f_flag & FHASLOCK) && fp->f_type == DTYPE_VNODE) {
1807		lf.l_whence = SEEK_SET;
1808		lf.l_start = 0;
1809		lf.l_len = 0;
1810		lf.l_type = F_UNLCK;
1811		vp = (struct vnode *)fp->f_data;
1812		FILE_UNLOCK(fp);
1813		(void) VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, F_FLOCK);
1814	} else
1815		FILE_UNLOCK(fp);
1816	if (fp->f_ops != &badfileops)
1817		error = fo_close(fp, td);
1818	else
1819		error = 0;
1820	ffree(fp);
1821	mtx_unlock(&Giant);
1822	return (error);
1823}
1824
1825/*
1826 * Apply an advisory lock on a file descriptor.
1827 *
1828 * Just attempt to get a record lock of the requested type on
1829 * the entire file (l_whence = SEEK_SET, l_start = 0, l_len = 0).
1830 */
1831#ifndef _SYS_SYSPROTO_H_
1832struct flock_args {
1833	int	fd;
1834	int	how;
1835};
1836#endif
1837/*
1838 * MPSAFE
1839 */
1840/* ARGSUSED */
1841int
1842flock(td, uap)
1843	struct thread *td;
1844	register struct flock_args *uap;
1845{
1846	struct file *fp;
1847	struct vnode *vp;
1848	struct flock lf;
1849	int error;
1850
1851	if ((error = fget(td, uap->fd, &fp)) != 0)
1852		return (error);
1853	if (fp->f_type != DTYPE_VNODE) {
1854		fdrop(fp, td);
1855		return (EOPNOTSUPP);
1856	}
1857
1858	mtx_lock(&Giant);
1859	vp = (struct vnode *)fp->f_data;
1860	lf.l_whence = SEEK_SET;
1861	lf.l_start = 0;
1862	lf.l_len = 0;
1863	if (uap->how & LOCK_UN) {
1864		lf.l_type = F_UNLCK;
1865		FILE_LOCK(fp);
1866		fp->f_flag &= ~FHASLOCK;
1867		FILE_UNLOCK(fp);
1868		error = VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, F_FLOCK);
1869		goto done2;
1870	}
1871	if (uap->how & LOCK_EX)
1872		lf.l_type = F_WRLCK;
1873	else if (uap->how & LOCK_SH)
1874		lf.l_type = F_RDLCK;
1875	else {
1876		error = EBADF;
1877		goto done2;
1878	}
1879	FILE_LOCK(fp);
1880	fp->f_flag |= FHASLOCK;
1881	FILE_UNLOCK(fp);
1882	error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf,
1883	    (uap->how & LOCK_NB) ? F_FLOCK : F_FLOCK | F_WAIT);
1884done2:
1885	fdrop(fp, td);
1886	mtx_unlock(&Giant);
1887	return (error);
1888}
1889
1890/*
1891 * File Descriptor pseudo-device driver (/dev/fd/).
1892 *
1893 * Opening minor device N dup()s the file (if any) connected to file
1894 * descriptor N belonging to the calling process.  Note that this driver
1895 * consists of only the ``open()'' routine, because all subsequent
1896 * references to this file will be direct to the other driver.
1897 */
1898/* ARGSUSED */
1899static int
1900fdopen(dev, mode, type, td)
1901	dev_t dev;
1902	int mode, type;
1903	struct thread *td;
1904{
1905
1906	/*
1907	 * XXX Kludge: set curthread->td_dupfd to contain the value of the
1908	 * the file descriptor being sought for duplication. The error
1909	 * return ensures that the vnode for this device will be released
1910	 * by vn_open. Open will detect this special error and take the
1911	 * actions in dupfdopen below. Other callers of vn_open or VOP_OPEN
1912	 * will simply report the error.
1913	 */
1914	td->td_dupfd = dev2unit(dev);
1915	return (ENODEV);
1916}
1917
1918/*
1919 * Duplicate the specified descriptor to a free descriptor.
1920 */
1921int
1922dupfdopen(td, fdp, indx, dfd, mode, error)
1923	struct thread *td;
1924	struct filedesc *fdp;
1925	int indx, dfd;
1926	int mode;
1927	int error;
1928{
1929	register struct file *wfp;
1930	struct file *fp;
1931
1932	/*
1933	 * If the to-be-dup'd fd number is greater than the allowed number
1934	 * of file descriptors, or the fd to be dup'd has already been
1935	 * closed, then reject.
1936	 */
1937	FILEDESC_LOCK(fdp);
1938	if ((u_int)dfd >= fdp->fd_nfiles ||
1939	    (wfp = fdp->fd_ofiles[dfd]) == NULL) {
1940		FILEDESC_UNLOCK(fdp);
1941		return (EBADF);
1942	}
1943
1944	/*
1945	 * There are two cases of interest here.
1946	 *
1947	 * For ENODEV simply dup (dfd) to file descriptor
1948	 * (indx) and return.
1949	 *
1950	 * For ENXIO steal away the file structure from (dfd) and
1951	 * store it in (indx).  (dfd) is effectively closed by
1952	 * this operation.
1953	 *
1954	 * Any other error code is just returned.
1955	 */
1956	switch (error) {
1957	case ENODEV:
1958		/*
1959		 * Check that the mode the file is being opened for is a
1960		 * subset of the mode of the existing descriptor.
1961		 */
1962		FILE_LOCK(wfp);
1963		if (((mode & (FREAD|FWRITE)) | wfp->f_flag) != wfp->f_flag) {
1964			FILE_UNLOCK(wfp);
1965			FILEDESC_UNLOCK(fdp);
1966			return (EACCES);
1967		}
1968		fp = fdp->fd_ofiles[indx];
1969#if 0
1970		if (fp && fdp->fd_ofileflags[indx] & UF_MAPPED)
1971			(void) munmapfd(td, indx);
1972#endif
1973		fdp->fd_ofiles[indx] = wfp;
1974		fdp->fd_ofileflags[indx] = fdp->fd_ofileflags[dfd];
1975		fhold_locked(wfp);
1976		FILE_UNLOCK(wfp);
1977		if (indx > fdp->fd_lastfile)
1978			fdp->fd_lastfile = indx;
1979		if (fp != NULL)
1980			FILE_LOCK(fp);
1981		FILEDESC_UNLOCK(fdp);
1982		/*
1983		 * we now own the reference to fp that the ofiles[] array
1984		 * used to own.  Release it.
1985		 */
1986		if (fp != NULL)
1987			fdrop_locked(fp, td);
1988		return (0);
1989
1990	case ENXIO:
1991		/*
1992		 * Steal away the file pointer from dfd, and stuff it into indx.
1993		 */
1994		fp = fdp->fd_ofiles[indx];
1995#if 0
1996		if (fp && fdp->fd_ofileflags[indx] & UF_MAPPED)
1997			(void) munmapfd(td, indx);
1998#endif
1999		fdp->fd_ofiles[indx] = fdp->fd_ofiles[dfd];
2000		fdp->fd_ofiles[dfd] = NULL;
2001		fdp->fd_ofileflags[indx] = fdp->fd_ofileflags[dfd];
2002		fdp->fd_ofileflags[dfd] = 0;
2003
2004		/*
2005		 * Complete the clean up of the filedesc structure by
2006		 * recomputing the various hints.
2007		 */
2008		if (indx > fdp->fd_lastfile) {
2009			fdp->fd_lastfile = indx;
2010		} else {
2011			while (fdp->fd_lastfile > 0 &&
2012			   fdp->fd_ofiles[fdp->fd_lastfile] == NULL) {
2013				fdp->fd_lastfile--;
2014			}
2015			if (dfd < fdp->fd_freefile)
2016				fdp->fd_freefile = dfd;
2017		}
2018		if (fp != NULL)
2019			FILE_LOCK(fp);
2020		FILEDESC_UNLOCK(fdp);
2021
2022		/*
2023		 * we now own the reference to fp that the ofiles[] array
2024		 * used to own.  Release it.
2025		 */
2026		if (fp != NULL)
2027			fdrop_locked(fp, td);
2028		return (0);
2029
2030	default:
2031		FILEDESC_UNLOCK(fdp);
2032		return (error);
2033	}
2034	/* NOTREACHED */
2035}
2036
2037/*
2038 * Get file structures.
2039 */
2040static int
2041sysctl_kern_file(SYSCTL_HANDLER_ARGS)
2042{
2043	int error;
2044	struct file *fp;
2045
2046	sx_slock(&filelist_lock);
2047	if (!req->oldptr) {
2048		/*
2049		 * overestimate by 10 files
2050		 */
2051		error = SYSCTL_OUT(req, 0, sizeof(filehead) +
2052				   (nfiles + 10) * sizeof(struct file));
2053		sx_sunlock(&filelist_lock);
2054		return (error);
2055	}
2056
2057	error = SYSCTL_OUT(req, &filehead, sizeof(filehead));
2058	if (error) {
2059		sx_sunlock(&filelist_lock);
2060		return (error);
2061	}
2062
2063	/*
2064	 * followed by an array of file structures
2065	 */
2066	LIST_FOREACH(fp, &filehead, f_list) {
2067		error = SYSCTL_OUT(req, fp, sizeof (struct file));
2068		if (error) {
2069			sx_sunlock(&filelist_lock);
2070			return (error);
2071		}
2072	}
2073	sx_sunlock(&filelist_lock);
2074	return (0);
2075}
2076
2077SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD,
2078    0, 0, sysctl_kern_file, "S,file", "Entire file table");
2079
2080SYSCTL_INT(_kern, KERN_MAXFILESPERPROC, maxfilesperproc, CTLFLAG_RW,
2081    &maxfilesperproc, 0, "Maximum files allowed open per process");
2082
2083SYSCTL_INT(_kern, KERN_MAXFILES, maxfiles, CTLFLAG_RW,
2084    &maxfiles, 0, "Maximum number of files");
2085
2086SYSCTL_INT(_kern, OID_AUTO, openfiles, CTLFLAG_RD,
2087    &nfiles, 0, "System-wide number of open files");
2088
2089static void
2090fildesc_drvinit(void *unused)
2091{
2092	dev_t dev;
2093
2094	dev = make_dev(&fildesc_cdevsw, 0, UID_BIN, GID_BIN, 0666, "fd/0");
2095	make_dev_alias(dev, "stdin");
2096	dev = make_dev(&fildesc_cdevsw, 1, UID_BIN, GID_BIN, 0666, "fd/1");
2097	make_dev_alias(dev, "stdout");
2098	dev = make_dev(&fildesc_cdevsw, 2, UID_BIN, GID_BIN, 0666, "fd/2");
2099	make_dev_alias(dev, "stderr");
2100	if (!devfs_present) {
2101		int fd;
2102
2103		for (fd = 3; fd < NUMFDESC; fd++)
2104			make_dev(&fildesc_cdevsw, fd, UID_BIN, GID_BIN, 0666,
2105			    "fd/%d", fd);
2106	}
2107}
2108
2109struct fileops badfileops = {
2110	badfo_readwrite,
2111	badfo_readwrite,
2112	badfo_ioctl,
2113	badfo_poll,
2114	badfo_kqfilter,
2115	badfo_stat,
2116	badfo_close
2117};
2118
2119static int
2120badfo_readwrite(fp, uio, cred, flags, td)
2121	struct file *fp;
2122	struct uio *uio;
2123	struct ucred *cred;
2124	struct thread *td;
2125	int flags;
2126{
2127
2128	return (EBADF);
2129}
2130
2131static int
2132badfo_ioctl(fp, com, data, td)
2133	struct file *fp;
2134	u_long com;
2135	void *data;
2136	struct thread *td;
2137{
2138
2139	return (EBADF);
2140}
2141
2142static int
2143badfo_poll(fp, events, cred, td)
2144	struct file *fp;
2145	int events;
2146	struct ucred *cred;
2147	struct thread *td;
2148{
2149
2150	return (0);
2151}
2152
2153static int
2154badfo_kqfilter(fp, kn)
2155	struct file *fp;
2156	struct knote *kn;
2157{
2158
2159	return (0);
2160}
2161
2162static int
2163badfo_stat(fp, sb, td)
2164	struct file *fp;
2165	struct stat *sb;
2166	struct thread *td;
2167{
2168
2169	return (EBADF);
2170}
2171
2172static int
2173badfo_close(fp, td)
2174	struct file *fp;
2175	struct thread *td;
2176{
2177
2178	return (EBADF);
2179}
2180
2181SYSINIT(fildescdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,
2182					fildesc_drvinit,NULL)
2183
2184static void filelistinit(void *);
2185SYSINIT(select, SI_SUB_LOCK, SI_ORDER_FIRST, filelistinit, NULL)
2186
2187/* ARGSUSED*/
2188static void
2189filelistinit(dummy)
2190	void *dummy;
2191{
2192	file_zone = uma_zcreate("Files", sizeof(struct file), NULL, NULL,
2193	    NULL, NULL, UMA_ALIGN_PTR, 0);
2194
2195	sx_init(&filelist_lock, "filelist lock");
2196	mtx_init(&sigio_lock, "sigio lock", NULL, MTX_DEF);
2197}
2198