libc -- string: strspn should return 0 for empty match strings, not string len.
[dragonfly.git] / sys / kern / kern_descrip.c
1 /*
2  * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Jeffrey Hsu.
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *
35  * Copyright (c) 1982, 1986, 1989, 1991, 1993
36  *      The Regents of the University of California.  All rights reserved.
37  * (c) UNIX System Laboratories, Inc.
38  * All or some portions of this file are derived from material licensed
39  * to the University of California by American Telephone and Telegraph
40  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
41  * the permission of UNIX System Laboratories, Inc.
42  *
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions
45  * are met:
46  * 1. Redistributions of source code must retain the above copyright
47  *    notice, this list of conditions and the following disclaimer.
48  * 2. Redistributions in binary form must reproduce the above copyright
49  *    notice, this list of conditions and the following disclaimer in the
50  *    documentation and/or other materials provided with the distribution.
51  * 3. All advertising materials mentioning features or use of this software
52  *    must display the following acknowledgement:
53  *      This product includes software developed by the University of
54  *      California, Berkeley and its contributors.
55  * 4. Neither the name of the University nor the names of its contributors
56  *    may be used to endorse or promote products derived from this software
57  *    without specific prior written permission.
58  *
59  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
60  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
63  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
64  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
65  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
66  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
67  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
68  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69  * SUCH DAMAGE.
70  *
71  *      @(#)kern_descrip.c      8.6 (Berkeley) 4/19/94
72  * $FreeBSD: src/sys/kern/kern_descrip.c,v 1.81.2.19 2004/02/28 00:43:31 tegge Exp $
73  */
74
75 #include "opt_compat.h"
76 #include <sys/param.h>
77 #include <sys/systm.h>
78 #include <sys/malloc.h>
79 #include <sys/sysproto.h>
80 #include <sys/conf.h>
81 #include <sys/device.h>
82 #include <sys/file.h>
83 #include <sys/filedesc.h>
84 #include <sys/kernel.h>
85 #include <sys/sysctl.h>
86 #include <sys/vnode.h>
87 #include <sys/proc.h>
88 #include <sys/nlookup.h>
89 #include <sys/stat.h>
90 #include <sys/filio.h>
91 #include <sys/fcntl.h>
92 #include <sys/unistd.h>
93 #include <sys/resourcevar.h>
94 #include <sys/event.h>
95 #include <sys/kern_syscall.h>
96 #include <sys/kcore.h>
97 #include <sys/kinfo.h>
98 #include <sys/un.h>
99
100 #include <vm/vm.h>
101 #include <vm/vm_extern.h>
102
103 #include <sys/thread2.h>
104 #include <sys/file2.h>
105 #include <sys/spinlock2.h>
106
107 static void fsetfd_locked(struct filedesc *fdp, struct file *fp, int fd);
108 static void fdreserve_locked (struct filedesc *fdp, int fd0, int incr);
109 static struct file *funsetfd_locked (struct filedesc *fdp, int fd);
110 static void ffree(struct file *fp);
111
112 static MALLOC_DEFINE(M_FILEDESC, "file desc", "Open file descriptor table");
113 static MALLOC_DEFINE(M_FILEDESC_TO_LEADER, "file desc to leader",
114                      "file desc to leader structures");
115 MALLOC_DEFINE(M_FILE, "file", "Open file structure");
116 static MALLOC_DEFINE(M_SIGIO, "sigio", "sigio structures");
117
118 static struct krate krate_uidinfo = { .freq = 1 };
119
120 static   d_open_t  fdopen;
121 #define NUMFDESC 64
122
123 #define CDEV_MAJOR 22
124 static struct dev_ops fildesc_ops = {
125         { "FD", 0, 0 },
126         .d_open =       fdopen,
127 };
128
129 /*
130  * Descriptor management.
131  */
132 static struct filelist filehead = LIST_HEAD_INITIALIZER(&filehead);
133 static struct spinlock filehead_spin = SPINLOCK_INITIALIZER(&filehead_spin);
134 static int nfiles;              /* actual number of open files */
135 extern int cmask;       
136
137 /*
138  * Fixup fd_freefile and fd_lastfile after a descriptor has been cleared.
139  *
140  * MPSAFE - must be called with fdp->fd_spin exclusively held
141  */
142 static __inline
143 void
144 fdfixup_locked(struct filedesc *fdp, int fd)
145 {
146         if (fd < fdp->fd_freefile) {
147                fdp->fd_freefile = fd;
148         }
149         while (fdp->fd_lastfile >= 0 &&
150                fdp->fd_files[fdp->fd_lastfile].fp == NULL &&
151                fdp->fd_files[fdp->fd_lastfile].reserved == 0
152         ) {
153                 --fdp->fd_lastfile;
154         }
155 }
156
157 /*
158  * System calls on descriptors.
159  *
160  * MPSAFE
161  */
162 int
163 sys_getdtablesize(struct getdtablesize_args *uap) 
164 {
165         struct proc *p = curproc;
166         struct plimit *limit = p->p_limit;
167         int dtsize;
168
169         spin_lock(&limit->p_spin);
170         if (limit->pl_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
171                 dtsize = INT_MAX;
172         else
173                 dtsize = (int)limit->pl_rlimit[RLIMIT_NOFILE].rlim_cur;
174         spin_unlock(&limit->p_spin);
175
176         if (dtsize > maxfilesperproc)
177                 dtsize = maxfilesperproc;
178         if (dtsize < minfilesperproc)
179                 dtsize = minfilesperproc;
180         if (p->p_ucred->cr_uid && dtsize > maxfilesperuser)
181                 dtsize = maxfilesperuser;
182         uap->sysmsg_result = dtsize;
183         return (0);
184 }
185
186 /*
187  * Duplicate a file descriptor to a particular value.
188  *
189  * note: keep in mind that a potential race condition exists when closing
190  * descriptors from a shared descriptor table (via rfork).
191  *
192  * MPSAFE
193  */
194 int
195 sys_dup2(struct dup2_args *uap)
196 {
197         int error;
198         int fd = 0;
199
200         error = kern_dup(DUP_FIXED, uap->from, uap->to, &fd);
201         uap->sysmsg_fds[0] = fd;
202
203         return (error);
204 }
205
206 /*
207  * Duplicate a file descriptor.
208  *
209  * MPSAFE
210  */
211 int
212 sys_dup(struct dup_args *uap)
213 {
214         int error;
215         int fd = 0;
216
217         error = kern_dup(DUP_VARIABLE, uap->fd, 0, &fd);
218         uap->sysmsg_fds[0] = fd;
219
220         return (error);
221 }
222
223 /*
224  * MPALMOSTSAFE - acquires mplock for fp operations
225  */
226 int
227 kern_fcntl(int fd, int cmd, union fcntl_dat *dat, struct ucred *cred)
228 {
229         struct thread *td = curthread;
230         struct proc *p = td->td_proc;
231         struct file *fp;
232         struct vnode *vp;
233         u_int newmin;
234         u_int oflags;
235         u_int nflags;
236         int tmp, error, flg = F_POSIX;
237
238         KKASSERT(p);
239
240         /*
241          * Operations on file descriptors that do not require a file pointer.
242          */
243         switch (cmd) {
244         case F_GETFD:
245                 error = fgetfdflags(p->p_fd, fd, &tmp);
246                 if (error == 0)
247                         dat->fc_cloexec = (tmp & UF_EXCLOSE) ? FD_CLOEXEC : 0;
248                 return (error);
249
250         case F_SETFD:
251                 if (dat->fc_cloexec & FD_CLOEXEC)
252                         error = fsetfdflags(p->p_fd, fd, UF_EXCLOSE);
253                 else
254                         error = fclrfdflags(p->p_fd, fd, UF_EXCLOSE);
255                 return (error);
256         case F_DUPFD:
257                 newmin = dat->fc_fd;
258                 error = kern_dup(DUP_VARIABLE, fd, newmin, &dat->fc_fd);
259                 return (error);
260         default:
261                 break;
262         }
263
264         /*
265          * Operations on file pointers
266          */
267         if ((fp = holdfp(p->p_fd, fd, -1)) == NULL)
268                 return (EBADF);
269
270         switch (cmd) {
271         case F_GETFL:
272                 dat->fc_flags = OFLAGS(fp->f_flag);
273                 error = 0;
274                 break;
275
276         case F_SETFL:
277                 oflags = fp->f_flag;
278                 nflags = FFLAGS(dat->fc_flags & ~O_ACCMODE) & FCNTLFLAGS;
279                 nflags |= oflags & ~FCNTLFLAGS;
280
281                 error = 0;
282                 if (((nflags ^ oflags) & O_APPEND) && (oflags & FAPPENDONLY))
283                         error = EINVAL;
284                 if (error == 0 && ((nflags ^ oflags) & FASYNC)) {
285                         tmp = nflags & FASYNC;
286                         error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp,
287                                          cred, NULL);
288                 }
289                 if (error == 0)
290                         fp->f_flag = nflags;
291                 break;
292
293         case F_GETOWN:
294                 error = fo_ioctl(fp, FIOGETOWN, (caddr_t)&dat->fc_owner,
295                                  cred, NULL);
296                 break;
297
298         case F_SETOWN:
299                 error = fo_ioctl(fp, FIOSETOWN, (caddr_t)&dat->fc_owner,
300                                  cred, NULL);
301                 break;
302
303         case F_SETLKW:
304                 flg |= F_WAIT;
305                 /* Fall into F_SETLK */
306
307         case F_SETLK:
308                 if (fp->f_type != DTYPE_VNODE) {
309                         error = EBADF;
310                         break;
311                 }
312                 vp = (struct vnode *)fp->f_data;
313
314                 /*
315                  * copyin/lockop may block
316                  */
317                 if (dat->fc_flock.l_whence == SEEK_CUR)
318                         dat->fc_flock.l_start += fp->f_offset;
319
320                 switch (dat->fc_flock.l_type) {
321                 case F_RDLCK:
322                         if ((fp->f_flag & FREAD) == 0) {
323                                 error = EBADF;
324                                 break;
325                         }
326                         p->p_leader->p_flag |= P_ADVLOCK;
327                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
328                             &dat->fc_flock, flg);
329                         break;
330                 case F_WRLCK:
331                         if ((fp->f_flag & FWRITE) == 0) {
332                                 error = EBADF;
333                                 break;
334                         }
335                         p->p_leader->p_flag |= P_ADVLOCK;
336                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
337                             &dat->fc_flock, flg);
338                         break;
339                 case F_UNLCK:
340                         error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK,
341                                 &dat->fc_flock, F_POSIX);
342                         break;
343                 default:
344                         error = EINVAL;
345                         break;
346                 }
347
348                 /*
349                  * It is possible to race a close() on the descriptor while
350                  * we were blocked getting the lock.  If this occurs the
351                  * close might not have caught the lock.
352                  */
353                 if (checkfdclosed(p->p_fd, fd, fp)) {
354                         dat->fc_flock.l_whence = SEEK_SET;
355                         dat->fc_flock.l_start = 0;
356                         dat->fc_flock.l_len = 0;
357                         dat->fc_flock.l_type = F_UNLCK;
358                         (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader,
359                                            F_UNLCK, &dat->fc_flock, F_POSIX);
360                 }
361                 break;
362
363         case F_GETLK:
364                 if (fp->f_type != DTYPE_VNODE) {
365                         error = EBADF;
366                         break;
367                 }
368                 vp = (struct vnode *)fp->f_data;
369                 /*
370                  * copyin/lockop may block
371                  */
372                 if (dat->fc_flock.l_type != F_RDLCK &&
373                     dat->fc_flock.l_type != F_WRLCK &&
374                     dat->fc_flock.l_type != F_UNLCK) {
375                         error = EINVAL;
376                         break;
377                 }
378                 if (dat->fc_flock.l_whence == SEEK_CUR)
379                         dat->fc_flock.l_start += fp->f_offset;
380                 error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_GETLK,
381                             &dat->fc_flock, F_POSIX);
382                 break;
383         default:
384                 error = EINVAL;
385                 break;
386         }
387
388         fdrop(fp);
389         return (error);
390 }
391
392 /*
393  * The file control system call.
394  *
395  * MPSAFE
396  */
397 int
398 sys_fcntl(struct fcntl_args *uap)
399 {
400         union fcntl_dat dat;
401         int error;
402
403         switch (uap->cmd) {
404         case F_DUPFD:
405                 dat.fc_fd = uap->arg;
406                 break;
407         case F_SETFD:
408                 dat.fc_cloexec = uap->arg;
409                 break;
410         case F_SETFL:
411                 dat.fc_flags = uap->arg;
412                 break;
413         case F_SETOWN:
414                 dat.fc_owner = uap->arg;
415                 break;
416         case F_SETLKW:
417         case F_SETLK:
418         case F_GETLK:
419                 error = copyin((caddr_t)uap->arg, &dat.fc_flock,
420                                sizeof(struct flock));
421                 if (error)
422                         return (error);
423                 break;
424         }
425
426         error = kern_fcntl(uap->fd, uap->cmd, &dat, curthread->td_ucred);
427
428         if (error == 0) {
429                 switch (uap->cmd) {
430                 case F_DUPFD:
431                         uap->sysmsg_result = dat.fc_fd;
432                         break;
433                 case F_GETFD:
434                         uap->sysmsg_result = dat.fc_cloexec;
435                         break;
436                 case F_GETFL:
437                         uap->sysmsg_result = dat.fc_flags;
438                         break;
439                 case F_GETOWN:
440                         uap->sysmsg_result = dat.fc_owner;
441                 case F_GETLK:
442                         error = copyout(&dat.fc_flock, (caddr_t)uap->arg,
443                             sizeof(struct flock));
444                         break;
445                 }
446         }
447
448         return (error);
449 }
450
451 /*
452  * Common code for dup, dup2, and fcntl(F_DUPFD).
453  *
454  * The type flag can be either DUP_FIXED or DUP_VARIABLE.  DUP_FIXED tells
455  * kern_dup() to destructively dup over an existing file descriptor if new
456  * is already open.  DUP_VARIABLE tells kern_dup() to find the lowest
457  * unused file descriptor that is greater than or equal to new.
458  *
459  * MPSAFE
460  */
461 int
462 kern_dup(enum dup_type type, int old, int new, int *res)
463 {
464         struct thread *td = curthread;
465         struct proc *p = td->td_proc;
466         struct filedesc *fdp = p->p_fd;
467         struct file *fp;
468         struct file *delfp;
469         int oldflags;
470         int holdleaders;
471         int dtsize;
472         int error, newfd;
473
474         /*
475          * Verify that we have a valid descriptor to dup from and
476          * possibly to dup to.
477          *
478          * NOTE: maxfilesperuser is not applicable to dup()
479          */
480 retry:
481         if (p->p_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
482                 dtsize = INT_MAX;
483         else
484                 dtsize = (int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
485         if (dtsize > maxfilesperproc)
486                 dtsize = maxfilesperproc;
487         if (dtsize < minfilesperproc)
488                 dtsize = minfilesperproc;
489
490         if (new < 0 || new > dtsize)
491                 return (EINVAL);
492
493         spin_lock(&fdp->fd_spin);
494         if ((unsigned)old >= fdp->fd_nfiles || fdp->fd_files[old].fp == NULL) {
495                 spin_unlock(&fdp->fd_spin);
496                 return (EBADF);
497         }
498         if (type == DUP_FIXED && old == new) {
499                 *res = new;
500                 spin_unlock(&fdp->fd_spin);
501                 return (0);
502         }
503         fp = fdp->fd_files[old].fp;
504         oldflags = fdp->fd_files[old].fileflags;
505         fhold(fp);      /* MPSAFE - can be called with a spinlock held */
506
507         /*
508          * Allocate a new descriptor if DUP_VARIABLE, or expand the table
509          * if the requested descriptor is beyond the current table size.
510          *
511          * This can block.  Retry if the source descriptor no longer matches
512          * or if our expectation in the expansion case races.
513          *
514          * If we are not expanding or allocating a new decriptor, then reset
515          * the target descriptor to a reserved state so we have a uniform
516          * setup for the next code block.
517          */
518         if (type == DUP_VARIABLE || new >= fdp->fd_nfiles) {
519                 spin_unlock(&fdp->fd_spin);
520                 error = fdalloc(p, new, &newfd);
521                 spin_lock(&fdp->fd_spin);
522                 if (error) {
523                         spin_unlock(&fdp->fd_spin);
524                         fdrop(fp);
525                         return (error);
526                 }
527                 /*
528                  * Check for ripout
529                  */
530                 if (old >= fdp->fd_nfiles || fdp->fd_files[old].fp != fp) {
531                         fsetfd_locked(fdp, NULL, newfd);
532                         spin_unlock(&fdp->fd_spin);
533                         fdrop(fp);
534                         goto retry;
535                 }
536                 /*
537                  * Check for expansion race
538                  */
539                 if (type != DUP_VARIABLE && new != newfd) {
540                         fsetfd_locked(fdp, NULL, newfd);
541                         spin_unlock(&fdp->fd_spin);
542                         fdrop(fp);
543                         goto retry;
544                 }
545                 /*
546                  * Check for ripout, newfd reused old (this case probably
547                  * can't occur).
548                  */
549                 if (old == newfd) {
550                         fsetfd_locked(fdp, NULL, newfd);
551                         spin_unlock(&fdp->fd_spin);
552                         fdrop(fp);
553                         goto retry;
554                 }
555                 new = newfd;
556                 delfp = NULL;
557         } else {
558                 if (fdp->fd_files[new].reserved) {
559                         spin_unlock(&fdp->fd_spin);
560                         fdrop(fp);
561                         kprintf("Warning: dup(): target descriptor %d is reserved, waiting for it to be resolved\n", new);
562                         tsleep(fdp, 0, "fdres", hz);
563                         goto retry;
564                 }
565
566                 /*
567                  * If the target descriptor was never allocated we have
568                  * to allocate it.  If it was we have to clean out the
569                  * old descriptor.  delfp inherits the ref from the 
570                  * descriptor table.
571                  */
572                 delfp = fdp->fd_files[new].fp;
573                 fdp->fd_files[new].fp = NULL;
574                 fdp->fd_files[new].reserved = 1;
575                 if (delfp == NULL) {
576                         fdreserve_locked(fdp, new, 1);
577                         if (new > fdp->fd_lastfile)
578                                 fdp->fd_lastfile = new;
579                 }
580
581         }
582
583         /*
584          * NOTE: still holding an exclusive spinlock
585          */
586
587         /*
588          * If a descriptor is being overwritten we may hve to tell 
589          * fdfree() to sleep to ensure that all relevant process
590          * leaders can be traversed in closef().
591          */
592         if (delfp != NULL && p->p_fdtol != NULL) {
593                 fdp->fd_holdleaderscount++;
594                 holdleaders = 1;
595         } else {
596                 holdleaders = 0;
597         }
598         KASSERT(delfp == NULL || type == DUP_FIXED,
599                 ("dup() picked an open file"));
600
601         /*
602          * Duplicate the source descriptor, update lastfile.  If the new
603          * descriptor was not allocated and we aren't replacing an existing
604          * descriptor we have to mark the descriptor as being in use.
605          *
606          * The fd_files[] array inherits fp's hold reference.
607          */
608         fsetfd_locked(fdp, fp, new);
609         fdp->fd_files[new].fileflags = oldflags & ~UF_EXCLOSE;
610         spin_unlock(&fdp->fd_spin);
611         fdrop(fp);
612         *res = new;
613
614         /*
615          * If we dup'd over a valid file, we now own the reference to it
616          * and must dispose of it using closef() semantics (as if a
617          * close() were performed on it).
618          */
619         if (delfp) {
620                 if (SLIST_FIRST(&delfp->f_klist))
621                         knote_fdclose(delfp, fdp, new);
622                 closef(delfp, p);
623                 if (holdleaders) {
624                         spin_lock(&fdp->fd_spin);
625                         fdp->fd_holdleaderscount--;
626                         if (fdp->fd_holdleaderscount == 0 &&
627                             fdp->fd_holdleaderswakeup != 0) {
628                                 fdp->fd_holdleaderswakeup = 0;
629                                 spin_unlock(&fdp->fd_spin);
630                                 wakeup(&fdp->fd_holdleaderscount);
631                         } else {
632                                 spin_unlock(&fdp->fd_spin);
633                         }
634                 }
635         }
636         return (0);
637 }
638
639 /*
640  * If sigio is on the list associated with a process or process group,
641  * disable signalling from the device, remove sigio from the list and
642  * free sigio.
643  *
644  * MPSAFE
645  */
646 void
647 funsetown(struct sigio **sigiop)
648 {
649         struct pgrp *pgrp;
650         struct proc *p;
651         struct sigio *sigio;
652
653         if ((sigio = *sigiop) != NULL) {
654                 lwkt_gettoken(&proc_token);     /* protect sigio */
655                 KKASSERT(sigiop == sigio->sio_myref);
656                 sigio = *sigiop;
657                 *sigiop = NULL;
658                 lwkt_reltoken(&proc_token);
659         }
660         if (sigio == NULL)
661                 return;
662
663         if (sigio->sio_pgid < 0) {
664                 pgrp = sigio->sio_pgrp;
665                 sigio->sio_pgrp = NULL;
666                 lwkt_gettoken(&pgrp->pg_token);
667                 SLIST_REMOVE(&pgrp->pg_sigiolst, sigio, sigio, sio_pgsigio);
668                 lwkt_reltoken(&pgrp->pg_token);
669                 pgrel(pgrp);
670         } else /* if ((*sigiop)->sio_pgid > 0) */ {
671                 p = sigio->sio_proc;
672                 sigio->sio_proc = NULL;
673                 PHOLD(p);
674                 lwkt_gettoken(&p->p_token);
675                 SLIST_REMOVE(&p->p_sigiolst, sigio, sigio, sio_pgsigio);
676                 lwkt_reltoken(&p->p_token);
677                 PRELE(p);
678         }
679         crfree(sigio->sio_ucred);
680         sigio->sio_ucred = NULL;
681         kfree(sigio, M_SIGIO);
682 }
683
684 /*
685  * Free a list of sigio structures.  Caller is responsible for ensuring
686  * that the list is MPSAFE.
687  *
688  * MPSAFE
689  */
690 void
691 funsetownlst(struct sigiolst *sigiolst)
692 {
693         struct sigio *sigio;
694
695         while ((sigio = SLIST_FIRST(sigiolst)) != NULL)
696                 funsetown(sigio->sio_myref);
697 }
698
699 /*
700  * This is common code for FIOSETOWN ioctl called by fcntl(fd, F_SETOWN, arg).
701  *
702  * After permission checking, add a sigio structure to the sigio list for
703  * the process or process group.
704  *
705  * MPSAFE
706  */
707 int
708 fsetown(pid_t pgid, struct sigio **sigiop)
709 {
710         struct proc *proc = NULL;
711         struct pgrp *pgrp = NULL;
712         struct sigio *sigio;
713         int error;
714
715         if (pgid == 0) {
716                 funsetown(sigiop);
717                 return (0);
718         }
719
720         if (pgid > 0) {
721                 proc = pfind(pgid);
722                 if (proc == NULL) {
723                         error = ESRCH;
724                         goto done;
725                 }
726
727                 /*
728                  * Policy - Don't allow a process to FSETOWN a process
729                  * in another session.
730                  *
731                  * Remove this test to allow maximum flexibility or
732                  * restrict FSETOWN to the current process or process
733                  * group for maximum safety.
734                  */
735                 if (proc->p_session != curproc->p_session) {
736                         error = EPERM;
737                         goto done;
738                 }
739         } else /* if (pgid < 0) */ {
740                 pgrp = pgfind(-pgid);
741                 if (pgrp == NULL) {
742                         error = ESRCH;
743                         goto done;
744                 }
745
746                 /*
747                  * Policy - Don't allow a process to FSETOWN a process
748                  * in another session.
749                  *
750                  * Remove this test to allow maximum flexibility or
751                  * restrict FSETOWN to the current process or process
752                  * group for maximum safety.
753                  */
754                 if (pgrp->pg_session != curproc->p_session) {
755                         error = EPERM;
756                         goto done;
757                 }
758         }
759         sigio = kmalloc(sizeof(struct sigio), M_SIGIO, M_WAITOK | M_ZERO);
760         if (pgid > 0) {
761                 KKASSERT(pgrp == NULL);
762                 lwkt_gettoken(&proc->p_token);
763                 SLIST_INSERT_HEAD(&proc->p_sigiolst, sigio, sio_pgsigio);
764                 sigio->sio_proc = proc;
765                 lwkt_reltoken(&proc->p_token);
766         } else {
767                 KKASSERT(proc == NULL);
768                 lwkt_gettoken(&pgrp->pg_token);
769                 SLIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
770                 sigio->sio_pgrp = pgrp;
771                 lwkt_reltoken(&pgrp->pg_token);
772                 pgrp = NULL;
773         }
774         sigio->sio_pgid = pgid;
775         sigio->sio_ucred = crhold(curthread->td_ucred);
776         /* It would be convenient if p_ruid was in ucred. */
777         sigio->sio_ruid = sigio->sio_ucred->cr_ruid;
778         sigio->sio_myref = sigiop;
779
780         lwkt_gettoken(&proc_token);
781         while (*sigiop)
782                 funsetown(sigiop);
783         *sigiop = sigio;
784         lwkt_reltoken(&proc_token);
785         error = 0;
786 done:
787         if (pgrp)
788                 pgrel(pgrp);
789         if (proc)
790                 PRELE(proc);
791         return (error);
792 }
793
794 /*
795  * This is common code for FIOGETOWN ioctl called by fcntl(fd, F_GETOWN, arg).
796  *
797  * MPSAFE
798  */
799 pid_t
800 fgetown(struct sigio **sigiop)
801 {
802         struct sigio *sigio;
803         pid_t own;
804
805         lwkt_gettoken(&proc_token);
806         sigio = *sigiop;
807         own = (sigio != NULL ? sigio->sio_pgid : 0);
808         lwkt_reltoken(&proc_token);
809
810         return (own);
811 }
812
813 /*
814  * Close many file descriptors.
815  *
816  * MPSAFE
817  */
818 int
819 sys_closefrom(struct closefrom_args *uap)
820 {
821         return(kern_closefrom(uap->fd));
822 }
823
824 /*
825  * Close all file descriptors greater then or equal to fd
826  *
827  * MPSAFE
828  */
829 int
830 kern_closefrom(int fd)
831 {
832         struct thread *td = curthread;
833         struct proc *p = td->td_proc;
834         struct filedesc *fdp;
835
836         KKASSERT(p);
837         fdp = p->p_fd;
838
839         if (fd < 0)
840                 return (EINVAL);
841
842         /*
843          * NOTE: This function will skip unassociated descriptors and
844          * reserved descriptors that have not yet been assigned.  
845          * fd_lastfile can change as a side effect of kern_close().
846          */
847         spin_lock(&fdp->fd_spin);
848         while (fd <= fdp->fd_lastfile) {
849                 if (fdp->fd_files[fd].fp != NULL) {
850                         spin_unlock(&fdp->fd_spin);
851                         /* ok if this races another close */
852                         if (kern_close(fd) == EINTR)
853                                 return (EINTR);
854                         spin_lock(&fdp->fd_spin);
855                 }
856                 ++fd;
857         }
858         spin_unlock(&fdp->fd_spin);
859         return (0);
860 }
861
862 /*
863  * Close a file descriptor.
864  *
865  * MPSAFE
866  */
867 int
868 sys_close(struct close_args *uap)
869 {
870         return(kern_close(uap->fd));
871 }
872
873 /*
874  * MPSAFE
875  */
876 int
877 kern_close(int fd)
878 {
879         struct thread *td = curthread;
880         struct proc *p = td->td_proc;
881         struct filedesc *fdp;
882         struct file *fp;
883         int error;
884         int holdleaders;
885
886         KKASSERT(p);
887         fdp = p->p_fd;
888
889         spin_lock(&fdp->fd_spin);
890         if ((fp = funsetfd_locked(fdp, fd)) == NULL) {
891                 spin_unlock(&fdp->fd_spin);
892                 return (EBADF);
893         }
894         holdleaders = 0;
895         if (p->p_fdtol != NULL) {
896                 /*
897                  * Ask fdfree() to sleep to ensure that all relevant
898                  * process leaders can be traversed in closef().
899                  */
900                 fdp->fd_holdleaderscount++;
901                 holdleaders = 1;
902         }
903
904         /*
905          * we now hold the fp reference that used to be owned by the descriptor
906          * array.
907          */
908         spin_unlock(&fdp->fd_spin);
909         if (SLIST_FIRST(&fp->f_klist))
910                 knote_fdclose(fp, fdp, fd);
911         error = closef(fp, p);
912         if (holdleaders) {
913                 spin_lock(&fdp->fd_spin);
914                 fdp->fd_holdleaderscount--;
915                 if (fdp->fd_holdleaderscount == 0 &&
916                     fdp->fd_holdleaderswakeup != 0) {
917                         fdp->fd_holdleaderswakeup = 0;
918                         spin_unlock(&fdp->fd_spin);
919                         wakeup(&fdp->fd_holdleaderscount);
920                 } else {
921                         spin_unlock(&fdp->fd_spin);
922                 }
923         }
924         return (error);
925 }
926
927 /*
928  * shutdown_args(int fd, int how)
929  */
930 int
931 kern_shutdown(int fd, int how)
932 {
933         struct thread *td = curthread;
934         struct proc *p = td->td_proc;
935         struct file *fp;
936         int error;
937
938         KKASSERT(p);
939
940         if ((fp = holdfp(p->p_fd, fd, -1)) == NULL)
941                 return (EBADF);
942         error = fo_shutdown(fp, how);
943         fdrop(fp);
944
945         return (error);
946 }
947
948 /*
949  * MPALMOSTSAFE
950  */
951 int
952 sys_shutdown(struct shutdown_args *uap)
953 {
954         int error;
955
956         error = kern_shutdown(uap->s, uap->how);
957
958         return (error);
959 }
960
961 /*
962  * MPSAFE
963  */
964 int
965 kern_fstat(int fd, struct stat *ub)
966 {
967         struct thread *td = curthread;
968         struct proc *p = td->td_proc;
969         struct file *fp;
970         int error;
971
972         KKASSERT(p);
973
974         if ((fp = holdfp(p->p_fd, fd, -1)) == NULL)
975                 return (EBADF);
976         error = fo_stat(fp, ub, td->td_ucred);
977         fdrop(fp);
978
979         return (error);
980 }
981
982 /*
983  * Return status information about a file descriptor.
984  *
985  * MPSAFE
986  */
987 int
988 sys_fstat(struct fstat_args *uap)
989 {
990         struct stat st;
991         int error;
992
993         error = kern_fstat(uap->fd, &st);
994
995         if (error == 0)
996                 error = copyout(&st, uap->sb, sizeof(st));
997         return (error);
998 }
999
1000 /*
1001  * Return pathconf information about a file descriptor.
1002  *
1003  * MPALMOSTSAFE
1004  */
1005 int
1006 sys_fpathconf(struct fpathconf_args *uap)
1007 {
1008         struct thread *td = curthread;
1009         struct proc *p = td->td_proc;
1010         struct file *fp;
1011         struct vnode *vp;
1012         int error = 0;
1013
1014         if ((fp = holdfp(p->p_fd, uap->fd, -1)) == NULL)
1015                 return (EBADF);
1016
1017         switch (fp->f_type) {
1018         case DTYPE_PIPE:
1019         case DTYPE_SOCKET:
1020                 if (uap->name != _PC_PIPE_BUF) {
1021                         error = EINVAL;
1022                 } else {
1023                         uap->sysmsg_result = PIPE_BUF;
1024                         error = 0;
1025                 }
1026                 break;
1027         case DTYPE_FIFO:
1028         case DTYPE_VNODE:
1029                 vp = (struct vnode *)fp->f_data;
1030                 error = VOP_PATHCONF(vp, uap->name, &uap->sysmsg_reg);
1031                 break;
1032         default:
1033                 error = EOPNOTSUPP;
1034                 break;
1035         }
1036         fdrop(fp);
1037         return(error);
1038 }
1039
1040 static int fdexpand;
1041 SYSCTL_INT(_debug, OID_AUTO, fdexpand, CTLFLAG_RD, &fdexpand, 0,
1042     "Number of times a file table has been expanded");
1043
1044 /*
1045  * Grow the file table so it can hold through descriptor (want).
1046  *
1047  * The fdp's spinlock must be held exclusively on entry and may be held
1048  * exclusively on return.  The spinlock may be cycled by the routine.
1049  *
1050  * MPSAFE
1051  */
1052 static void
1053 fdgrow_locked(struct filedesc *fdp, int want)
1054 {
1055         struct fdnode *newfiles;
1056         struct fdnode *oldfiles;
1057         int nf, extra;
1058
1059         nf = fdp->fd_nfiles;
1060         do {
1061                 /* nf has to be of the form 2^n - 1 */
1062                 nf = 2 * nf + 1;
1063         } while (nf <= want);
1064
1065         spin_unlock(&fdp->fd_spin);
1066         newfiles = kmalloc(nf * sizeof(struct fdnode), M_FILEDESC, M_WAITOK);
1067         spin_lock(&fdp->fd_spin);
1068
1069         /*
1070          * We could have raced another extend while we were not holding
1071          * the spinlock.
1072          */
1073         if (fdp->fd_nfiles >= nf) {
1074                 spin_unlock(&fdp->fd_spin);
1075                 kfree(newfiles, M_FILEDESC);
1076                 spin_lock(&fdp->fd_spin);
1077                 return;
1078         }
1079         /*
1080          * Copy the existing ofile and ofileflags arrays
1081          * and zero the new portion of each array.
1082          */
1083         extra = nf - fdp->fd_nfiles;
1084         bcopy(fdp->fd_files, newfiles, fdp->fd_nfiles * sizeof(struct fdnode));
1085         bzero(&newfiles[fdp->fd_nfiles], extra * sizeof(struct fdnode));
1086
1087         oldfiles = fdp->fd_files;
1088         fdp->fd_files = newfiles;
1089         fdp->fd_nfiles = nf;
1090
1091         if (oldfiles != fdp->fd_builtin_files) {
1092                 spin_unlock(&fdp->fd_spin);
1093                 kfree(oldfiles, M_FILEDESC);
1094                 spin_lock(&fdp->fd_spin);
1095         }
1096         fdexpand++;
1097 }
1098
1099 /*
1100  * Number of nodes in right subtree, including the root.
1101  */
1102 static __inline int
1103 right_subtree_size(int n)
1104 {
1105         return (n ^ (n | (n + 1)));
1106 }
1107
1108 /*
1109  * Bigger ancestor.
1110  */
1111 static __inline int
1112 right_ancestor(int n)
1113 {
1114         return (n | (n + 1));
1115 }
1116
1117 /*
1118  * Smaller ancestor.
1119  */
1120 static __inline int
1121 left_ancestor(int n)
1122 {
1123         return ((n & (n + 1)) - 1);
1124 }
1125
1126 /*
1127  * Traverse the in-place binary tree buttom-up adjusting the allocation
1128  * count so scans can determine where free descriptors are located.
1129  *
1130  * MPSAFE - caller must be holding an exclusive spinlock on fdp
1131  */
1132 static
1133 void
1134 fdreserve_locked(struct filedesc *fdp, int fd, int incr)
1135 {
1136         while (fd >= 0) {
1137                 fdp->fd_files[fd].allocated += incr;
1138                 KKASSERT(fdp->fd_files[fd].allocated >= 0);
1139                 fd = left_ancestor(fd);
1140         }
1141 }
1142
1143 /*
1144  * Reserve a file descriptor for the process.  If no error occurs, the
1145  * caller MUST at some point call fsetfd() or assign a file pointer
1146  * or dispose of the reservation.
1147  *
1148  * MPSAFE
1149  */
1150 int
1151 fdalloc(struct proc *p, int want, int *result)
1152 {
1153         struct filedesc *fdp = p->p_fd;
1154         struct uidinfo *uip;
1155         int fd, rsize, rsum, node, lim;
1156
1157         /*
1158          * Check dtable size limit
1159          */
1160         spin_lock(&p->p_limit->p_spin);
1161         if (p->p_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
1162                 lim = INT_MAX;
1163         else
1164                 lim = (int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
1165         spin_unlock(&p->p_limit->p_spin);
1166
1167         if (lim > maxfilesperproc)
1168                 lim = maxfilesperproc;
1169         if (lim < minfilesperproc)
1170                 lim = minfilesperproc;
1171         if (want >= lim)
1172                 return (EMFILE);
1173
1174         /*
1175          * Check that the user has not run out of descriptors (non-root only).
1176          * As a safety measure the dtable is allowed to have at least
1177          * minfilesperproc open fds regardless of the maxfilesperuser limit.
1178          */
1179         if (p->p_ucred->cr_uid && fdp->fd_nfiles >= minfilesperproc) {
1180                 uip = p->p_ucred->cr_uidinfo;
1181                 if (uip->ui_openfiles > maxfilesperuser) {
1182                         krateprintf(&krate_uidinfo,
1183                                     "Warning: user %d pid %d (%s) ran out of "
1184                                     "file descriptors (%d/%d)\n",
1185                                     p->p_ucred->cr_uid, (int)p->p_pid,
1186                                     p->p_comm,
1187                                     uip->ui_openfiles, maxfilesperuser);
1188                         return(ENFILE);
1189                 }
1190         }
1191
1192         /*
1193          * Grow the dtable if necessary
1194          */
1195         spin_lock(&fdp->fd_spin);
1196         if (want >= fdp->fd_nfiles)
1197                 fdgrow_locked(fdp, want);
1198
1199         /*
1200          * Search for a free descriptor starting at the higher
1201          * of want or fd_freefile.  If that fails, consider
1202          * expanding the ofile array.
1203          *
1204          * NOTE! the 'allocated' field is a cumulative recursive allocation
1205          * count.  If we happen to see a value of 0 then we can shortcut
1206          * our search.  Otherwise we run through through the tree going
1207          * down branches we know have free descriptor(s) until we hit a
1208          * leaf node.  The leaf node will be free but will not necessarily
1209          * have an allocated field of 0.
1210          */
1211 retry:
1212         /* move up the tree looking for a subtree with a free node */
1213         for (fd = max(want, fdp->fd_freefile); fd < min(fdp->fd_nfiles, lim);
1214              fd = right_ancestor(fd)) {
1215                 if (fdp->fd_files[fd].allocated == 0)
1216                         goto found;
1217
1218                 rsize = right_subtree_size(fd);
1219                 if (fdp->fd_files[fd].allocated == rsize)
1220                         continue;       /* right subtree full */
1221
1222                 /*
1223                  * Free fd is in the right subtree of the tree rooted at fd.
1224                  * Call that subtree R.  Look for the smallest (leftmost)
1225                  * subtree of R with an unallocated fd: continue moving
1226                  * down the left branch until encountering a full left
1227                  * subtree, then move to the right.
1228                  */
1229                 for (rsum = 0, rsize /= 2; rsize > 0; rsize /= 2) {
1230                         node = fd + rsize;
1231                         rsum += fdp->fd_files[node].allocated;
1232                         if (fdp->fd_files[fd].allocated == rsum + rsize) {
1233                                 fd = node;      /* move to the right */
1234                                 if (fdp->fd_files[node].allocated == 0)
1235                                         goto found;
1236                                 rsum = 0;
1237                         }
1238                 }
1239                 goto found;
1240         }
1241
1242         /*
1243          * No space in current array.  Expand?
1244          */
1245         if (fdp->fd_nfiles >= lim) {
1246                 spin_unlock(&fdp->fd_spin);
1247                 return (EMFILE);
1248         }
1249         fdgrow_locked(fdp, want);
1250         goto retry;
1251
1252 found:
1253         KKASSERT(fd < fdp->fd_nfiles);
1254         if (fd > fdp->fd_lastfile)
1255                 fdp->fd_lastfile = fd;
1256         if (want <= fdp->fd_freefile)
1257                 fdp->fd_freefile = fd;
1258         *result = fd;
1259         KKASSERT(fdp->fd_files[fd].fp == NULL);
1260         KKASSERT(fdp->fd_files[fd].reserved == 0);
1261         fdp->fd_files[fd].fileflags = 0;
1262         fdp->fd_files[fd].reserved = 1;
1263         fdreserve_locked(fdp, fd, 1);
1264         spin_unlock(&fdp->fd_spin);
1265         return (0);
1266 }
1267
1268 /*
1269  * Check to see whether n user file descriptors
1270  * are available to the process p.
1271  *
1272  * MPSAFE
1273  */
1274 int
1275 fdavail(struct proc *p, int n)
1276 {
1277         struct filedesc *fdp = p->p_fd;
1278         struct fdnode *fdnode;
1279         int i, lim, last;
1280
1281         spin_lock(&p->p_limit->p_spin);
1282         if (p->p_rlimit[RLIMIT_NOFILE].rlim_cur > INT_MAX)
1283                 lim = INT_MAX;
1284         else
1285                 lim = (int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
1286         spin_unlock(&p->p_limit->p_spin);
1287
1288         if (lim > maxfilesperproc)
1289                 lim = maxfilesperproc;
1290         if (lim < minfilesperproc)
1291                 lim = minfilesperproc;
1292
1293         spin_lock(&fdp->fd_spin);
1294         if ((i = lim - fdp->fd_nfiles) > 0 && (n -= i) <= 0) {
1295                 spin_unlock(&fdp->fd_spin);
1296                 return (1);
1297         }
1298         last = min(fdp->fd_nfiles, lim);
1299         fdnode = &fdp->fd_files[fdp->fd_freefile];
1300         for (i = last - fdp->fd_freefile; --i >= 0; ++fdnode) {
1301                 if (fdnode->fp == NULL && --n <= 0) {
1302                         spin_unlock(&fdp->fd_spin);
1303                         return (1);
1304                 }
1305         }
1306         spin_unlock(&fdp->fd_spin);
1307         return (0);
1308 }
1309
1310 /*
1311  * Revoke open descriptors referencing (f_data, f_type)
1312  *
1313  * Any revoke executed within a prison is only able to
1314  * revoke descriptors for processes within that prison.
1315  *
1316  * Returns 0 on success or an error code.
1317  */
1318 struct fdrevoke_info {
1319         void *data;
1320         short type;
1321         short unused;
1322         int count;
1323         int intransit;
1324         struct ucred *cred;
1325         struct file *nfp;
1326 };
1327
1328 static int fdrevoke_check_callback(struct file *fp, void *vinfo);
1329 static int fdrevoke_proc_callback(struct proc *p, void *vinfo);
1330
1331 int
1332 fdrevoke(void *f_data, short f_type, struct ucred *cred)
1333 {
1334         struct fdrevoke_info info;
1335         int error;
1336
1337         bzero(&info, sizeof(info));
1338         info.data = f_data;
1339         info.type = f_type;
1340         info.cred = cred;
1341         error = falloc(NULL, &info.nfp, NULL);
1342         if (error)
1343                 return (error);
1344
1345         /*
1346          * Scan the file pointer table once.  dups do not dup file pointers,
1347          * only descriptors, so there is no leak.  Set FREVOKED on the fps
1348          * being revoked.
1349          */
1350         allfiles_scan_exclusive(fdrevoke_check_callback, &info);
1351
1352         /*
1353          * If any fps were marked track down the related descriptors
1354          * and close them.  Any dup()s at this point will notice
1355          * the FREVOKED already set in the fp and do the right thing.
1356          *
1357          * Any fps with non-zero msgcounts (aka sent over a unix-domain
1358          * socket) bumped the intransit counter and will require a
1359          * scan.  Races against fps leaving the socket are closed by
1360          * the socket code checking for FREVOKED.
1361          */
1362         if (info.count)
1363                 allproc_scan(fdrevoke_proc_callback, &info);
1364         if (info.intransit)
1365                 unp_revoke_gc(info.nfp);
1366         fdrop(info.nfp);
1367         return(0);
1368 }
1369
1370 /*
1371  * Locate matching file pointers directly.
1372  *
1373  * WARNING: allfiles_scan_exclusive() holds a spinlock through these calls!
1374  */
1375 static int
1376 fdrevoke_check_callback(struct file *fp, void *vinfo)
1377 {
1378         struct fdrevoke_info *info = vinfo;
1379
1380         /*
1381          * File pointers already flagged for revokation are skipped.
1382          */
1383         if (fp->f_flag & FREVOKED)
1384                 return(0);
1385
1386         /*
1387          * If revoking from a prison file pointers created outside of
1388          * that prison, or file pointers without creds, cannot be revoked.
1389          */
1390         if (info->cred->cr_prison &&
1391             (fp->f_cred == NULL ||
1392              info->cred->cr_prison != fp->f_cred->cr_prison)) {
1393                 return(0);
1394         }
1395
1396         /*
1397          * If the file pointer matches then mark it for revocation.  The
1398          * flag is currently only used by unp_revoke_gc().
1399          *
1400          * info->count is a heuristic and can race in a SMP environment.
1401          */
1402         if (info->data == fp->f_data && info->type == fp->f_type) {
1403                 atomic_set_int(&fp->f_flag, FREVOKED);
1404                 info->count += fp->f_count;
1405                 if (fp->f_msgcount)
1406                         ++info->intransit;
1407         }
1408         return(0);
1409 }
1410
1411 /*
1412  * Locate matching file pointers via process descriptor tables.
1413  */
1414 static int
1415 fdrevoke_proc_callback(struct proc *p, void *vinfo)
1416 {
1417         struct fdrevoke_info *info = vinfo;
1418         struct filedesc *fdp;
1419         struct file *fp;
1420         int n;
1421
1422         if (p->p_stat == SIDL || p->p_stat == SZOMB)
1423                 return(0);
1424         if (info->cred->cr_prison &&
1425             info->cred->cr_prison != p->p_ucred->cr_prison) {
1426                 return(0);
1427         }
1428
1429         /*
1430          * If the controlling terminal of the process matches the
1431          * vnode being revoked we clear the controlling terminal.
1432          *
1433          * The normal spec_close() may not catch this because it
1434          * uses curproc instead of p.
1435          */
1436         if (p->p_session && info->type == DTYPE_VNODE &&
1437             info->data == p->p_session->s_ttyvp) {
1438                 p->p_session->s_ttyvp = NULL;
1439                 vrele(info->data);
1440         }
1441
1442         /*
1443          * Softref the fdp to prevent it from being destroyed
1444          */
1445         spin_lock(&p->p_spin);
1446         if ((fdp = p->p_fd) == NULL) {
1447                 spin_unlock(&p->p_spin);
1448                 return(0);
1449         }
1450         atomic_add_int(&fdp->fd_softrefs, 1);
1451         spin_unlock(&p->p_spin);
1452
1453         /*
1454          * Locate and close any matching file descriptors.
1455          */
1456         spin_lock(&fdp->fd_spin);
1457         for (n = 0; n < fdp->fd_nfiles; ++n) {
1458                 if ((fp = fdp->fd_files[n].fp) == NULL)
1459                         continue;
1460                 if (fp->f_flag & FREVOKED) {
1461                         fhold(info->nfp);
1462                         fdp->fd_files[n].fp = info->nfp;
1463                         spin_unlock(&fdp->fd_spin);
1464                         knote_fdclose(fp, fdp, n);      /* XXX */
1465                         closef(fp, p);
1466                         spin_lock(&fdp->fd_spin);
1467                         --info->count;
1468                 }
1469         }
1470         spin_unlock(&fdp->fd_spin);
1471         atomic_subtract_int(&fdp->fd_softrefs, 1);
1472         return(0);
1473 }
1474
1475 /*
1476  * falloc:
1477  *      Create a new open file structure and reserve a file decriptor
1478  *      for the process that refers to it.
1479  *
1480  *      Root creds are checked using lp, or assumed if lp is NULL.  If
1481  *      resultfd is non-NULL then lp must also be non-NULL.  No file
1482  *      descriptor is reserved (and no process context is needed) if
1483  *      resultfd is NULL.
1484  *
1485  *      A file pointer with a refcount of 1 is returned.  Note that the
1486  *      file pointer is NOT associated with the descriptor.  If falloc
1487  *      returns success, fsetfd() MUST be called to either associate the
1488  *      file pointer or clear the reservation.
1489  *
1490  * MPSAFE
1491  */
1492 int
1493 falloc(struct lwp *lp, struct file **resultfp, int *resultfd)
1494 {
1495         static struct timeval lastfail;
1496         static int curfail;
1497         struct file *fp;
1498         struct ucred *cred = lp ? lp->lwp_thread->td_ucred : proc0.p_ucred;
1499         int error;
1500
1501         fp = NULL;
1502
1503         /*
1504          * Handle filetable full issues and root overfill.
1505          */
1506         if (nfiles >= maxfiles - maxfilesrootres &&
1507             (cred->cr_ruid != 0 || nfiles >= maxfiles)) {
1508                 if (ppsratecheck(&lastfail, &curfail, 1)) {
1509                         kprintf("kern.maxfiles limit exceeded by uid %d, "
1510                                 "please see tuning(7).\n",
1511                                 cred->cr_ruid);
1512                 }
1513                 error = ENFILE;
1514                 goto done;
1515         }
1516
1517         /*
1518          * Allocate a new file descriptor.
1519          */
1520         fp = kmalloc(sizeof(struct file), M_FILE, M_WAITOK | M_ZERO);
1521         spin_init(&fp->f_spin);
1522         SLIST_INIT(&fp->f_klist);
1523         fp->f_count = 1;
1524         fp->f_ops = &badfileops;
1525         fp->f_seqcount = 1;
1526         fsetcred(fp, cred);
1527         spin_lock(&filehead_spin);
1528         nfiles++;
1529         LIST_INSERT_HEAD(&filehead, fp, f_list);
1530         spin_unlock(&filehead_spin);
1531         if (resultfd) {
1532                 if ((error = fdalloc(lp->lwp_proc, 0, resultfd)) != 0) {
1533                         fdrop(fp);
1534                         fp = NULL;
1535                 }
1536         } else {
1537                 error = 0;
1538         }
1539 done:
1540         *resultfp = fp;
1541         return (error);
1542 }
1543
1544 /*
1545  * Check for races against a file descriptor by determining that the
1546  * file pointer is still associated with the specified file descriptor,
1547  * and a close is not currently in progress.
1548  *
1549  * MPSAFE
1550  */
1551 int
1552 checkfdclosed(struct filedesc *fdp, int fd, struct file *fp)
1553 {
1554         int error;
1555
1556         spin_lock(&fdp->fd_spin);
1557         if ((unsigned)fd >= fdp->fd_nfiles || fp != fdp->fd_files[fd].fp)
1558                 error = EBADF;
1559         else
1560                 error = 0;
1561         spin_unlock(&fdp->fd_spin);
1562         return (error);
1563 }
1564
1565 /*
1566  * Associate a file pointer with a previously reserved file descriptor.
1567  * This function always succeeds.
1568  *
1569  * If fp is NULL, the file descriptor is returned to the pool.
1570  */
1571
1572 /*
1573  * MPSAFE (exclusive spinlock must be held on call)
1574  */
1575 static void
1576 fsetfd_locked(struct filedesc *fdp, struct file *fp, int fd)
1577 {
1578         KKASSERT((unsigned)fd < fdp->fd_nfiles);
1579         KKASSERT(fdp->fd_files[fd].reserved != 0);
1580         if (fp) {
1581                 fhold(fp);
1582                 fdp->fd_files[fd].fp = fp;
1583                 fdp->fd_files[fd].reserved = 0;
1584         } else {
1585                 fdp->fd_files[fd].reserved = 0;
1586                 fdreserve_locked(fdp, fd, -1);
1587                 fdfixup_locked(fdp, fd);
1588         }
1589 }
1590
1591 /*
1592  * MPSAFE
1593  */
1594 void
1595 fsetfd(struct filedesc *fdp, struct file *fp, int fd)
1596 {
1597         spin_lock(&fdp->fd_spin);
1598         fsetfd_locked(fdp, fp, fd);
1599         spin_unlock(&fdp->fd_spin);
1600 }
1601
1602 /*
1603  * MPSAFE (exclusive spinlock must be held on call)
1604  */
1605 static 
1606 struct file *
1607 funsetfd_locked(struct filedesc *fdp, int fd)
1608 {
1609         struct file *fp;
1610
1611         if ((unsigned)fd >= fdp->fd_nfiles)
1612                 return (NULL);
1613         if ((fp = fdp->fd_files[fd].fp) == NULL)
1614                 return (NULL);
1615         fdp->fd_files[fd].fp = NULL;
1616         fdp->fd_files[fd].fileflags = 0;
1617
1618         fdreserve_locked(fdp, fd, -1);
1619         fdfixup_locked(fdp, fd);
1620         return(fp);
1621 }
1622
1623 /*
1624  * MPSAFE
1625  */
1626 int
1627 fgetfdflags(struct filedesc *fdp, int fd, int *flagsp)
1628 {
1629         int error;
1630
1631         spin_lock(&fdp->fd_spin);
1632         if (((u_int)fd) >= fdp->fd_nfiles) {
1633                 error = EBADF;
1634         } else if (fdp->fd_files[fd].fp == NULL) {
1635                 error = EBADF;
1636         } else {
1637                 *flagsp = fdp->fd_files[fd].fileflags;
1638                 error = 0;
1639         }
1640         spin_unlock(&fdp->fd_spin);
1641         return (error);
1642 }
1643
1644 /*
1645  * MPSAFE
1646  */
1647 int
1648 fsetfdflags(struct filedesc *fdp, int fd, int add_flags)
1649 {
1650         int error;
1651
1652         spin_lock(&fdp->fd_spin);
1653         if (((u_int)fd) >= fdp->fd_nfiles) {
1654                 error = EBADF;
1655         } else if (fdp->fd_files[fd].fp == NULL) {
1656                 error = EBADF;
1657         } else {
1658                 fdp->fd_files[fd].fileflags |= add_flags;
1659                 error = 0;
1660         }
1661         spin_unlock(&fdp->fd_spin);
1662         return (error);
1663 }
1664
1665 /*
1666  * MPSAFE
1667  */
1668 int
1669 fclrfdflags(struct filedesc *fdp, int fd, int rem_flags)
1670 {
1671         int error;
1672
1673         spin_lock(&fdp->fd_spin);
1674         if (((u_int)fd) >= fdp->fd_nfiles) {
1675                 error = EBADF;
1676         } else if (fdp->fd_files[fd].fp == NULL) {
1677                 error = EBADF;
1678         } else {
1679                 fdp->fd_files[fd].fileflags &= ~rem_flags;
1680                 error = 0;
1681         }
1682         spin_unlock(&fdp->fd_spin);
1683         return (error);
1684 }
1685
1686 /*
1687  * Set/Change/Clear the creds for a fp and synchronize the uidinfo.
1688  */
1689 void
1690 fsetcred(struct file *fp, struct ucred *ncr)
1691 {
1692         struct ucred *ocr;
1693         struct uidinfo *uip;
1694
1695         ocr = fp->f_cred;
1696         if (ocr == NULL || ncr == NULL || ocr->cr_uidinfo != ncr->cr_uidinfo) {
1697                 if (ocr) {
1698                         uip = ocr->cr_uidinfo;
1699                         atomic_add_int(&uip->ui_openfiles, -1);
1700                 }
1701                 if (ncr) {
1702                         uip = ncr->cr_uidinfo;
1703                         atomic_add_int(&uip->ui_openfiles, 1);
1704                 }
1705         }
1706         if (ncr)
1707                 crhold(ncr);
1708         fp->f_cred = ncr;
1709         if (ocr)
1710                 crfree(ocr);
1711 }
1712
1713 /*
1714  * Free a file descriptor.
1715  */
1716 static
1717 void
1718 ffree(struct file *fp)
1719 {
1720         KASSERT((fp->f_count == 0), ("ffree: fp_fcount not 0!"));
1721         spin_lock(&filehead_spin);
1722         LIST_REMOVE(fp, f_list);
1723         nfiles--;
1724         spin_unlock(&filehead_spin);
1725         fsetcred(fp, NULL);
1726         if (fp->f_nchandle.ncp)
1727             cache_drop(&fp->f_nchandle);
1728         kfree(fp, M_FILE);
1729 }
1730
1731 /*
1732  * called from init_main, initialize filedesc0 for proc0.
1733  */
1734 void
1735 fdinit_bootstrap(struct proc *p0, struct filedesc *fdp0, int cmask)
1736 {
1737         p0->p_fd = fdp0;
1738         p0->p_fdtol = NULL;
1739         fdp0->fd_refcnt = 1;
1740         fdp0->fd_cmask = cmask;
1741         fdp0->fd_files = fdp0->fd_builtin_files;
1742         fdp0->fd_nfiles = NDFILE;
1743         fdp0->fd_lastfile = -1;
1744         spin_init(&fdp0->fd_spin);
1745 }
1746
1747 /*
1748  * Build a new filedesc structure.
1749  *
1750  * NOT MPSAFE (vref)
1751  */
1752 struct filedesc *
1753 fdinit(struct proc *p)
1754 {
1755         struct filedesc *newfdp;
1756         struct filedesc *fdp = p->p_fd;
1757
1758         newfdp = kmalloc(sizeof(struct filedesc), M_FILEDESC, M_WAITOK|M_ZERO);
1759         spin_lock(&fdp->fd_spin);
1760         if (fdp->fd_cdir) {
1761                 newfdp->fd_cdir = fdp->fd_cdir;
1762                 vref(newfdp->fd_cdir);
1763                 cache_copy(&fdp->fd_ncdir, &newfdp->fd_ncdir);
1764         }
1765
1766         /*
1767          * rdir may not be set in e.g. proc0 or anything vm_fork'd off of
1768          * proc0, but should unconditionally exist in other processes.
1769          */
1770         if (fdp->fd_rdir) {
1771                 newfdp->fd_rdir = fdp->fd_rdir;
1772                 vref(newfdp->fd_rdir);
1773                 cache_copy(&fdp->fd_nrdir, &newfdp->fd_nrdir);
1774         }
1775         if (fdp->fd_jdir) {
1776                 newfdp->fd_jdir = fdp->fd_jdir;
1777                 vref(newfdp->fd_jdir);
1778                 cache_copy(&fdp->fd_njdir, &newfdp->fd_njdir);
1779         }
1780         spin_unlock(&fdp->fd_spin);
1781
1782         /* Create the file descriptor table. */
1783         newfdp->fd_refcnt = 1;
1784         newfdp->fd_cmask = cmask;
1785         newfdp->fd_files = newfdp->fd_builtin_files;
1786         newfdp->fd_nfiles = NDFILE;
1787         newfdp->fd_lastfile = -1;
1788         spin_init(&newfdp->fd_spin);
1789
1790         return (newfdp);
1791 }
1792
1793 /*
1794  * Share a filedesc structure.
1795  *
1796  * MPSAFE
1797  */
1798 struct filedesc *
1799 fdshare(struct proc *p)
1800 {
1801         struct filedesc *fdp;
1802
1803         fdp = p->p_fd;
1804         spin_lock(&fdp->fd_spin);
1805         fdp->fd_refcnt++;
1806         spin_unlock(&fdp->fd_spin);
1807         return (fdp);
1808 }
1809
1810 /*
1811  * Copy a filedesc structure.
1812  *
1813  * MPSAFE
1814  */
1815 int
1816 fdcopy(struct proc *p, struct filedesc **fpp)
1817 {
1818         struct filedesc *fdp = p->p_fd;
1819         struct filedesc *newfdp;
1820         struct fdnode *fdnode;
1821         int i;
1822         int ni;
1823
1824         /*
1825          * Certain daemons might not have file descriptors. 
1826          */
1827         if (fdp == NULL)
1828                 return (0);
1829
1830         /*
1831          * Allocate the new filedesc and fd_files[] array.  This can race
1832          * with operations by other threads on the fdp so we have to be
1833          * careful.
1834          */
1835         newfdp = kmalloc(sizeof(struct filedesc), 
1836                          M_FILEDESC, M_WAITOK | M_ZERO | M_NULLOK);
1837         if (newfdp == NULL) {
1838                 *fpp = NULL;
1839                 return (-1);
1840         }
1841 again:
1842         spin_lock(&fdp->fd_spin);
1843         if (fdp->fd_lastfile < NDFILE) {
1844                 newfdp->fd_files = newfdp->fd_builtin_files;
1845                 i = NDFILE;
1846         } else {
1847                 /*
1848                  * We have to allocate (N^2-1) entries for our in-place
1849                  * binary tree.  Allow the table to shrink.
1850                  */
1851                 i = fdp->fd_nfiles;
1852                 ni = (i - 1) / 2;
1853                 while (ni > fdp->fd_lastfile && ni > NDFILE) {
1854                         i = ni;
1855                         ni = (i - 1) / 2;
1856                 }
1857                 spin_unlock(&fdp->fd_spin);
1858                 newfdp->fd_files = kmalloc(i * sizeof(struct fdnode),
1859                                           M_FILEDESC, M_WAITOK | M_ZERO);
1860
1861                 /*
1862                  * Check for race, retry
1863                  */
1864                 spin_lock(&fdp->fd_spin);
1865                 if (i <= fdp->fd_lastfile) {
1866                         spin_unlock(&fdp->fd_spin);
1867                         kfree(newfdp->fd_files, M_FILEDESC);
1868                         goto again;
1869                 }
1870         }
1871
1872         /*
1873          * Dup the remaining fields. vref() and cache_hold() can be
1874          * safely called while holding the read spinlock on fdp.
1875          *
1876          * The read spinlock on fdp is still being held.
1877          *
1878          * NOTE: vref and cache_hold calls for the case where the vnode
1879          * or cache entry already has at least one ref may be called
1880          * while holding spin locks.
1881          */
1882         if ((newfdp->fd_cdir = fdp->fd_cdir) != NULL) {
1883                 vref(newfdp->fd_cdir);
1884                 cache_copy(&fdp->fd_ncdir, &newfdp->fd_ncdir);
1885         }
1886         /*
1887          * We must check for fd_rdir here, at least for now because
1888          * the init process is created before we have access to the
1889          * rootvode to take a reference to it.
1890          */
1891         if ((newfdp->fd_rdir = fdp->fd_rdir) != NULL) {
1892                 vref(newfdp->fd_rdir);
1893                 cache_copy(&fdp->fd_nrdir, &newfdp->fd_nrdir);
1894         }
1895         if ((newfdp->fd_jdir = fdp->fd_jdir) != NULL) {
1896                 vref(newfdp->fd_jdir);
1897                 cache_copy(&fdp->fd_njdir, &newfdp->fd_njdir);
1898         }
1899         newfdp->fd_refcnt = 1;
1900         newfdp->fd_nfiles = i;
1901         newfdp->fd_lastfile = fdp->fd_lastfile;
1902         newfdp->fd_freefile = fdp->fd_freefile;
1903         newfdp->fd_cmask = fdp->fd_cmask;
1904         spin_init(&newfdp->fd_spin);
1905
1906         /*
1907          * Copy the descriptor table through (i).  This also copies the
1908          * allocation state.   Then go through and ref the file pointers
1909          * and clean up any KQ descriptors.
1910          *
1911          * kq descriptors cannot be copied.  Since we haven't ref'd the
1912          * copied files yet we can ignore the return value from funsetfd().
1913          *
1914          * The read spinlock on fdp is still being held.
1915          */
1916         bcopy(fdp->fd_files, newfdp->fd_files, i * sizeof(struct fdnode));
1917         for (i = 0 ; i < newfdp->fd_nfiles; ++i) {
1918                 fdnode = &newfdp->fd_files[i];
1919                 if (fdnode->reserved) {
1920                         fdreserve_locked(newfdp, i, -1);
1921                         fdnode->reserved = 0;
1922                         fdfixup_locked(newfdp, i);
1923                 } else if (fdnode->fp) {
1924                         if (fdnode->fp->f_type == DTYPE_KQUEUE) {
1925                                 (void)funsetfd_locked(newfdp, i);
1926                         } else {
1927                                 fhold(fdnode->fp);
1928                         }
1929                 }
1930         }
1931         spin_unlock(&fdp->fd_spin);
1932         *fpp = newfdp;
1933         return (0);
1934 }
1935
1936 /*
1937  * Release a filedesc structure.
1938  *
1939  * NOT MPSAFE (MPSAFE for refs > 1, but the final cleanup code is not MPSAFE)
1940  */
1941 void
1942 fdfree(struct proc *p, struct filedesc *repl)
1943 {
1944         struct filedesc *fdp;
1945         struct fdnode *fdnode;
1946         int i;
1947         struct filedesc_to_leader *fdtol;
1948         struct file *fp;
1949         struct vnode *vp;
1950         struct flock lf;
1951
1952         /*
1953          * Certain daemons might not have file descriptors.
1954          */
1955         fdp = p->p_fd;
1956         if (fdp == NULL) {
1957                 p->p_fd = repl;
1958                 return;
1959         }
1960
1961         /*
1962          * Severe messing around to follow.
1963          */
1964         spin_lock(&fdp->fd_spin);
1965
1966         /* Check for special need to clear POSIX style locks */
1967         fdtol = p->p_fdtol;
1968         if (fdtol != NULL) {
1969                 KASSERT(fdtol->fdl_refcount > 0,
1970                         ("filedesc_to_refcount botch: fdl_refcount=%d",
1971                          fdtol->fdl_refcount));
1972                 if (fdtol->fdl_refcount == 1 &&
1973                     (p->p_leader->p_flag & P_ADVLOCK) != 0) {
1974                         for (i = 0; i <= fdp->fd_lastfile; ++i) {
1975                                 fdnode = &fdp->fd_files[i];
1976                                 if (fdnode->fp == NULL ||
1977                                     fdnode->fp->f_type != DTYPE_VNODE) {
1978                                         continue;
1979                                 }
1980                                 fp = fdnode->fp;
1981                                 fhold(fp);
1982                                 spin_unlock(&fdp->fd_spin);
1983
1984                                 lf.l_whence = SEEK_SET;
1985                                 lf.l_start = 0;
1986                                 lf.l_len = 0;
1987                                 lf.l_type = F_UNLCK;
1988                                 vp = (struct vnode *)fp->f_data;
1989                                 (void) VOP_ADVLOCK(vp,
1990                                                    (caddr_t)p->p_leader,
1991                                                    F_UNLCK,
1992                                                    &lf,
1993                                                    F_POSIX);
1994                                 fdrop(fp);
1995                                 spin_lock(&fdp->fd_spin);
1996                         }
1997                 }
1998         retry:
1999                 if (fdtol->fdl_refcount == 1) {
2000                         if (fdp->fd_holdleaderscount > 0 &&
2001                             (p->p_leader->p_flag & P_ADVLOCK) != 0) {
2002                                 /*
2003                                  * close() or do_dup() has cleared a reference
2004                                  * in a shared file descriptor table.
2005                                  */
2006                                 fdp->fd_holdleaderswakeup = 1;
2007                                 ssleep(&fdp->fd_holdleaderscount,
2008                                        &fdp->fd_spin, 0, "fdlhold", 0);
2009                                 goto retry;
2010                         }
2011                         if (fdtol->fdl_holdcount > 0) {
2012                                 /* 
2013                                  * Ensure that fdtol->fdl_leader
2014                                  * remains valid in closef().
2015                                  */
2016                                 fdtol->fdl_wakeup = 1;
2017                                 ssleep(fdtol, &fdp->fd_spin, 0, "fdlhold", 0);
2018                                 goto retry;
2019                         }
2020                 }
2021                 fdtol->fdl_refcount--;
2022                 if (fdtol->fdl_refcount == 0 &&
2023                     fdtol->fdl_holdcount == 0) {
2024                         fdtol->fdl_next->fdl_prev = fdtol->fdl_prev;
2025                         fdtol->fdl_prev->fdl_next = fdtol->fdl_next;
2026                 } else {
2027                         fdtol = NULL;
2028                 }
2029                 p->p_fdtol = NULL;
2030                 if (fdtol != NULL) {
2031                         spin_unlock(&fdp->fd_spin);
2032                         kfree(fdtol, M_FILEDESC_TO_LEADER);
2033                         spin_lock(&fdp->fd_spin);
2034                 }
2035         }
2036         if (--fdp->fd_refcnt > 0) {
2037                 spin_unlock(&fdp->fd_spin);
2038                 spin_lock(&p->p_spin);
2039                 p->p_fd = repl;
2040                 spin_unlock(&p->p_spin);
2041                 return;
2042         }
2043
2044         /*
2045          * Even though we are the last reference to the structure allproc
2046          * scans may still reference the structure.  Maintain proper
2047          * locks until we can replace p->p_fd.
2048          *
2049          * Also note that kqueue's closef still needs to reference the
2050          * fdp via p->p_fd, so we have to close the descriptors before
2051          * we replace p->p_fd.
2052          */
2053         for (i = 0; i <= fdp->fd_lastfile; ++i) {
2054                 if (fdp->fd_files[i].fp) {
2055                         fp = funsetfd_locked(fdp, i);
2056                         if (fp) {
2057                                 spin_unlock(&fdp->fd_spin);
2058                                 if (SLIST_FIRST(&fp->f_klist))
2059                                         knote_fdclose(fp, fdp, i);
2060                                 closef(fp, p);
2061                                 spin_lock(&fdp->fd_spin);
2062                         }
2063                 }
2064         }
2065         spin_unlock(&fdp->fd_spin);
2066
2067         /*
2068          * Interlock against an allproc scan operations (typically frevoke).
2069          */
2070         spin_lock(&p->p_spin);
2071         p->p_fd = repl;
2072         spin_unlock(&p->p_spin);
2073
2074         /*
2075          * Wait for any softrefs to go away.  This race rarely occurs so
2076          * we can use a non-critical-path style poll/sleep loop.  The
2077          * race only occurs against allproc scans.
2078          *
2079          * No new softrefs can occur with the fdp disconnected from the
2080          * process.
2081          */
2082         if (fdp->fd_softrefs) {
2083                 kprintf("pid %d: Warning, fdp race avoided\n", p->p_pid);
2084                 while (fdp->fd_softrefs)
2085                         tsleep(&fdp->fd_softrefs, 0, "fdsoft", 1);
2086         }
2087
2088         if (fdp->fd_files != fdp->fd_builtin_files)
2089                 kfree(fdp->fd_files, M_FILEDESC);
2090         if (fdp->fd_cdir) {
2091                 cache_drop(&fdp->fd_ncdir);
2092                 vrele(fdp->fd_cdir);
2093         }
2094         if (fdp->fd_rdir) {
2095                 cache_drop(&fdp->fd_nrdir);
2096                 vrele(fdp->fd_rdir);
2097         }
2098         if (fdp->fd_jdir) {
2099                 cache_drop(&fdp->fd_njdir);
2100                 vrele(fdp->fd_jdir);
2101         }
2102         kfree(fdp, M_FILEDESC);
2103 }
2104
2105 /*
2106  * Retrieve and reference the file pointer associated with a descriptor.
2107  *
2108  * MPSAFE
2109  */
2110 struct file *
2111 holdfp(struct filedesc *fdp, int fd, int flag)
2112 {
2113         struct file* fp;
2114
2115         spin_lock(&fdp->fd_spin);
2116         if (((u_int)fd) >= fdp->fd_nfiles) {
2117                 fp = NULL;
2118                 goto done;
2119         }
2120         if ((fp = fdp->fd_files[fd].fp) == NULL)
2121                 goto done;
2122         if ((fp->f_flag & flag) == 0 && flag != -1) {
2123                 fp = NULL;
2124                 goto done;
2125         }
2126         fhold(fp);
2127 done:
2128         spin_unlock(&fdp->fd_spin);
2129         return (fp);
2130 }
2131
2132 /*
2133  * holdsock() - load the struct file pointer associated
2134  * with a socket into *fpp.  If an error occurs, non-zero
2135  * will be returned and *fpp will be set to NULL.
2136  *
2137  * MPSAFE
2138  */
2139 int
2140 holdsock(struct filedesc *fdp, int fd, struct file **fpp)
2141 {
2142         struct file *fp;
2143         int error;
2144
2145         spin_lock(&fdp->fd_spin);
2146         if ((unsigned)fd >= fdp->fd_nfiles) {
2147                 error = EBADF;
2148                 fp = NULL;
2149                 goto done;
2150         }
2151         if ((fp = fdp->fd_files[fd].fp) == NULL) {
2152                 error = EBADF;
2153                 goto done;
2154         }
2155         if (fp->f_type != DTYPE_SOCKET) {
2156                 error = ENOTSOCK;
2157                 goto done;
2158         }
2159         fhold(fp);
2160         error = 0;
2161 done:
2162         spin_unlock(&fdp->fd_spin);
2163         *fpp = fp;
2164         return (error);
2165 }
2166
2167 /*
2168  * Convert a user file descriptor to a held file pointer.
2169  *
2170  * MPSAFE
2171  */
2172 int
2173 holdvnode(struct filedesc *fdp, int fd, struct file **fpp)
2174 {
2175         struct file *fp;
2176         int error;
2177
2178         spin_lock(&fdp->fd_spin);
2179         if ((unsigned)fd >= fdp->fd_nfiles) {
2180                 error = EBADF;
2181                 fp = NULL;
2182                 goto done;
2183         }
2184         if ((fp = fdp->fd_files[fd].fp) == NULL) {
2185                 error = EBADF;
2186                 goto done;
2187         }
2188         if (fp->f_type != DTYPE_VNODE && fp->f_type != DTYPE_FIFO) {
2189                 fp = NULL;
2190                 error = EINVAL;
2191                 goto done;
2192         }
2193         fhold(fp);
2194         error = 0;
2195 done:
2196         spin_unlock(&fdp->fd_spin);
2197         *fpp = fp;
2198         return (error);
2199 }
2200
2201 /*
2202  * For setugid programs, we don't want to people to use that setugidness
2203  * to generate error messages which write to a file which otherwise would
2204  * otherwise be off-limits to the process.
2205  *
2206  * This is a gross hack to plug the hole.  A better solution would involve
2207  * a special vop or other form of generalized access control mechanism.  We
2208  * go ahead and just reject all procfs file systems accesses as dangerous.
2209  *
2210  * Since setugidsafety calls this only for fd 0, 1 and 2, this check is
2211  * sufficient.  We also don't for check setugidness since we know we are.
2212  */
2213 static int
2214 is_unsafe(struct file *fp)
2215 {
2216         if (fp->f_type == DTYPE_VNODE && 
2217             ((struct vnode *)(fp->f_data))->v_tag == VT_PROCFS)
2218                 return (1);
2219         return (0);
2220 }
2221
2222 /*
2223  * Make this setguid thing safe, if at all possible.
2224  *
2225  * NOT MPSAFE - scans fdp without spinlocks, calls knote_fdclose()
2226  */
2227 void
2228 setugidsafety(struct proc *p)
2229 {
2230         struct filedesc *fdp = p->p_fd;
2231         int i;
2232
2233         /* Certain daemons might not have file descriptors. */
2234         if (fdp == NULL)
2235                 return;
2236
2237         /*
2238          * note: fdp->fd_files may be reallocated out from under us while
2239          * we are blocked in a close.  Be careful!
2240          */
2241         for (i = 0; i <= fdp->fd_lastfile; i++) {
2242                 if (i > 2)
2243                         break;
2244                 if (fdp->fd_files[i].fp && is_unsafe(fdp->fd_files[i].fp)) {
2245                         struct file *fp;
2246
2247                         /*
2248                          * NULL-out descriptor prior to close to avoid
2249                          * a race while close blocks.
2250                          */
2251                         if ((fp = funsetfd_locked(fdp, i)) != NULL) {
2252                                 knote_fdclose(fp, fdp, i);
2253                                 closef(fp, p);
2254                         }
2255                 }
2256         }
2257 }
2258
2259 /*
2260  * Close any files on exec?
2261  *
2262  * NOT MPSAFE - scans fdp without spinlocks, calls knote_fdclose()
2263  */
2264 void
2265 fdcloseexec(struct proc *p)
2266 {
2267         struct filedesc *fdp = p->p_fd;
2268         int i;
2269
2270         /* Certain daemons might not have file descriptors. */
2271         if (fdp == NULL)
2272                 return;
2273
2274         /*
2275          * We cannot cache fd_files since operations may block and rip
2276          * them out from under us.
2277          */
2278         for (i = 0; i <= fdp->fd_lastfile; i++) {
2279                 if (fdp->fd_files[i].fp != NULL &&
2280                     (fdp->fd_files[i].fileflags & UF_EXCLOSE)) {
2281                         struct file *fp;
2282
2283                         /*
2284                          * NULL-out descriptor prior to close to avoid
2285                          * a race while close blocks.
2286                          */
2287                         if ((fp = funsetfd_locked(fdp, i)) != NULL) {
2288                                 knote_fdclose(fp, fdp, i);
2289                                 closef(fp, p);
2290                         }
2291                 }
2292         }
2293 }
2294
2295 /*
2296  * It is unsafe for set[ug]id processes to be started with file
2297  * descriptors 0..2 closed, as these descriptors are given implicit
2298  * significance in the Standard C library.  fdcheckstd() will create a
2299  * descriptor referencing /dev/null for each of stdin, stdout, and
2300  * stderr that is not already open.
2301  *
2302  * NOT MPSAFE - calls falloc, vn_open, etc
2303  */
2304 int
2305 fdcheckstd(struct lwp *lp)
2306 {
2307         struct nlookupdata nd;
2308         struct filedesc *fdp;
2309         struct file *fp;
2310         int retval;
2311         int i, error, flags, devnull;
2312
2313         fdp = lp->lwp_proc->p_fd;
2314         if (fdp == NULL)
2315                 return (0);
2316         devnull = -1;
2317         error = 0;
2318         for (i = 0; i < 3; i++) {
2319                 if (fdp->fd_files[i].fp != NULL)
2320                         continue;
2321                 if (devnull < 0) {
2322                         if ((error = falloc(lp, &fp, &devnull)) != 0)
2323                                 break;
2324
2325                         error = nlookup_init(&nd, "/dev/null", UIO_SYSSPACE,
2326                                                 NLC_FOLLOW|NLC_LOCKVP);
2327                         flags = FREAD | FWRITE;
2328                         if (error == 0)
2329                                 error = vn_open(&nd, fp, flags, 0);
2330                         if (error == 0)
2331                                 fsetfd(fdp, fp, devnull);
2332                         else
2333                                 fsetfd(fdp, NULL, devnull);
2334                         fdrop(fp);
2335                         nlookup_done(&nd);
2336                         if (error)
2337                                 break;
2338                         KKASSERT(i == devnull);
2339                 } else {
2340                         error = kern_dup(DUP_FIXED, devnull, i, &retval);
2341                         if (error != 0)
2342                                 break;
2343                 }
2344         }
2345         return (error);
2346 }
2347
2348 /*
2349  * Internal form of close.
2350  * Decrement reference count on file structure.
2351  * Note: td and/or p may be NULL when closing a file
2352  * that was being passed in a message.
2353  *
2354  * MPALMOSTSAFE - acquires mplock for VOP operations
2355  */
2356 int
2357 closef(struct file *fp, struct proc *p)
2358 {
2359         struct vnode *vp;
2360         struct flock lf;
2361         struct filedesc_to_leader *fdtol;
2362
2363         if (fp == NULL)
2364                 return (0);
2365
2366         /*
2367          * POSIX record locking dictates that any close releases ALL
2368          * locks owned by this process.  This is handled by setting
2369          * a flag in the unlock to free ONLY locks obeying POSIX
2370          * semantics, and not to free BSD-style file locks.
2371          * If the descriptor was in a message, POSIX-style locks
2372          * aren't passed with the descriptor.
2373          */
2374         if (p != NULL && fp->f_type == DTYPE_VNODE &&
2375             (((struct vnode *)fp->f_data)->v_flag & VMAYHAVELOCKS)
2376         ) {
2377                 if ((p->p_leader->p_flag & P_ADVLOCK) != 0) {
2378                         lf.l_whence = SEEK_SET;
2379                         lf.l_start = 0;
2380                         lf.l_len = 0;
2381                         lf.l_type = F_UNLCK;
2382                         vp = (struct vnode *)fp->f_data;
2383                         (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK,
2384                                            &lf, F_POSIX);
2385                 }
2386                 fdtol = p->p_fdtol;
2387                 if (fdtol != NULL) {
2388                         lwkt_gettoken(&p->p_token);
2389                         /*
2390                          * Handle special case where file descriptor table
2391                          * is shared between multiple process leaders.
2392                          */
2393                         for (fdtol = fdtol->fdl_next;
2394                              fdtol != p->p_fdtol;
2395                              fdtol = fdtol->fdl_next) {
2396                                 if ((fdtol->fdl_leader->p_flag &
2397                                      P_ADVLOCK) == 0)
2398                                         continue;
2399                                 fdtol->fdl_holdcount++;
2400                                 lf.l_whence = SEEK_SET;
2401                                 lf.l_start = 0;
2402                                 lf.l_len = 0;
2403                                 lf.l_type = F_UNLCK;
2404                                 vp = (struct vnode *)fp->f_data;
2405                                 (void) VOP_ADVLOCK(vp,
2406                                                    (caddr_t)fdtol->fdl_leader,
2407                                                    F_UNLCK, &lf, F_POSIX);
2408                                 fdtol->fdl_holdcount--;
2409                                 if (fdtol->fdl_holdcount == 0 &&
2410                                     fdtol->fdl_wakeup != 0) {
2411                                         fdtol->fdl_wakeup = 0;
2412                                         wakeup(fdtol);
2413                                 }
2414                         }
2415                         lwkt_reltoken(&p->p_token);
2416                 }
2417         }
2418         return (fdrop(fp));
2419 }
2420
2421 /*
2422  * MPSAFE
2423  *
2424  * fhold() can only be called if f_count is already at least 1 (i.e. the
2425  * caller of fhold() already has a reference to the file pointer in some
2426  * manner or other). 
2427  *
2428  * f_count is not spin-locked.  Instead, atomic ops are used for
2429  * incrementing, decrementing, and handling the 1->0 transition.
2430  */
2431 void
2432 fhold(struct file *fp)
2433 {
2434         atomic_add_int(&fp->f_count, 1);
2435 }
2436
2437 /*
2438  * fdrop() - drop a reference to a descriptor
2439  *
2440  * MPALMOSTSAFE - acquires mplock for final close sequence
2441  */
2442 int
2443 fdrop(struct file *fp)
2444 {
2445         struct flock lf;
2446         struct vnode *vp;
2447         int error;
2448
2449         /*
2450          * A combined fetch and subtract is needed to properly detect
2451          * 1->0 transitions, otherwise two cpus dropping from a ref
2452          * count of 2 might both try to run the 1->0 code.
2453          */
2454         if (atomic_fetchadd_int(&fp->f_count, -1) > 1)
2455                 return (0);
2456
2457         KKASSERT(SLIST_FIRST(&fp->f_klist) == NULL);
2458
2459         /*
2460          * The last reference has gone away, we own the fp structure free
2461          * and clear.
2462          */
2463         if (fp->f_count < 0)
2464                 panic("fdrop: count < 0");
2465         if ((fp->f_flag & FHASLOCK) && fp->f_type == DTYPE_VNODE &&
2466             (((struct vnode *)fp->f_data)->v_flag & VMAYHAVELOCKS)
2467         ) {
2468                 lf.l_whence = SEEK_SET;
2469                 lf.l_start = 0;
2470                 lf.l_len = 0;
2471                 lf.l_type = F_UNLCK;
2472                 vp = (struct vnode *)fp->f_data;
2473                 (void) VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, 0);
2474         }
2475         if (fp->f_ops != &badfileops)
2476                 error = fo_close(fp);
2477         else
2478                 error = 0;
2479         ffree(fp);
2480         return (error);
2481 }
2482
2483 /*
2484  * Apply an advisory lock on a file descriptor.
2485  *
2486  * Just attempt to get a record lock of the requested type on
2487  * the entire file (l_whence = SEEK_SET, l_start = 0, l_len = 0).
2488  *
2489  * MPALMOSTSAFE
2490  */
2491 int
2492 sys_flock(struct flock_args *uap)
2493 {
2494         struct proc *p = curproc;
2495         struct file *fp;
2496         struct vnode *vp;
2497         struct flock lf;
2498         int error;
2499
2500         if ((fp = holdfp(p->p_fd, uap->fd, -1)) == NULL)
2501                 return (EBADF);
2502         if (fp->f_type != DTYPE_VNODE) {
2503                 error = EOPNOTSUPP;
2504                 goto done;
2505         }
2506         vp = (struct vnode *)fp->f_data;
2507         lf.l_whence = SEEK_SET;
2508         lf.l_start = 0;
2509         lf.l_len = 0;
2510         if (uap->how & LOCK_UN) {
2511                 lf.l_type = F_UNLCK;
2512                 fp->f_flag &= ~FHASLOCK;
2513                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, 0);
2514                 goto done;
2515         }
2516         if (uap->how & LOCK_EX)
2517                 lf.l_type = F_WRLCK;
2518         else if (uap->how & LOCK_SH)
2519                 lf.l_type = F_RDLCK;
2520         else {
2521                 error = EBADF;
2522                 goto done;
2523         }
2524         fp->f_flag |= FHASLOCK;
2525         if (uap->how & LOCK_NB)
2526                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, 0);
2527         else
2528                 error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, F_WAIT);
2529 done:
2530         fdrop(fp);
2531         return (error);
2532 }
2533
2534 /*
2535  * File Descriptor pseudo-device driver (/dev/fd/).
2536  *
2537  * Opening minor device N dup()s the file (if any) connected to file
2538  * descriptor N belonging to the calling process.  Note that this driver
2539  * consists of only the ``open()'' routine, because all subsequent
2540  * references to this file will be direct to the other driver.
2541  */
2542 static int
2543 fdopen(struct dev_open_args *ap)
2544 {
2545         thread_t td = curthread;
2546
2547         KKASSERT(td->td_lwp != NULL);
2548
2549         /*
2550          * XXX Kludge: set curlwp->lwp_dupfd to contain the value of the
2551          * the file descriptor being sought for duplication. The error
2552          * return ensures that the vnode for this device will be released
2553          * by vn_open. Open will detect this special error and take the
2554          * actions in dupfdopen below. Other callers of vn_open or VOP_OPEN
2555          * will simply report the error.
2556          */
2557         td->td_lwp->lwp_dupfd = minor(ap->a_head.a_dev);
2558         return (ENODEV);
2559 }
2560
2561 /*
2562  * The caller has reserved the file descriptor dfd for us.  On success we
2563  * must fsetfd() it.  On failure the caller will clean it up.
2564  *
2565  * MPSAFE
2566  */
2567 int
2568 dupfdopen(struct filedesc *fdp, int dfd, int sfd, int mode, int error)
2569 {
2570         struct file *wfp;
2571         struct file *xfp;
2572         int werror;
2573
2574         if ((wfp = holdfp(fdp, sfd, -1)) == NULL)
2575                 return (EBADF);
2576
2577         /*
2578          * Close a revoke/dup race.  Duping a descriptor marked as revoked
2579          * will dup a dummy descriptor instead of the real one.
2580          */
2581         if (wfp->f_flag & FREVOKED) {
2582                 kprintf("Warning: attempt to dup() a revoked descriptor\n");
2583                 fdrop(wfp);
2584                 wfp = NULL;
2585                 werror = falloc(NULL, &wfp, NULL);
2586                 if (werror)
2587                         return (werror);
2588         }
2589
2590         /*
2591          * There are two cases of interest here.
2592          *
2593          * For ENODEV simply dup sfd to file descriptor dfd and return.
2594          *
2595          * For ENXIO steal away the file structure from sfd and store it
2596          * dfd.  sfd is effectively closed by this operation.
2597          *
2598          * Any other error code is just returned.
2599          */
2600         switch (error) {
2601         case ENODEV:
2602                 /*
2603                  * Check that the mode the file is being opened for is a
2604                  * subset of the mode of the existing descriptor.
2605                  */
2606                 if (((mode & (FREAD|FWRITE)) | wfp->f_flag) != wfp->f_flag) {
2607                         error = EACCES;
2608                         break;
2609                 }
2610                 spin_lock(&fdp->fd_spin);
2611                 fdp->fd_files[dfd].fileflags = fdp->fd_files[sfd].fileflags;
2612                 fsetfd_locked(fdp, wfp, dfd);
2613                 spin_unlock(&fdp->fd_spin);
2614                 error = 0;
2615                 break;
2616         case ENXIO:
2617                 /*
2618                  * Steal away the file pointer from dfd, and stuff it into indx.
2619                  */
2620                 spin_lock(&fdp->fd_spin);
2621                 fdp->fd_files[dfd].fileflags = fdp->fd_files[sfd].fileflags;
2622                 fsetfd(fdp, wfp, dfd);
2623                 if ((xfp = funsetfd_locked(fdp, sfd)) != NULL) {
2624                         spin_unlock(&fdp->fd_spin);
2625                         fdrop(xfp);
2626                 } else {
2627                         spin_unlock(&fdp->fd_spin);
2628                 }
2629                 error = 0;
2630                 break;
2631         default:
2632                 break;
2633         }
2634         fdrop(wfp);
2635         return (error);
2636 }
2637
2638 /*
2639  * NOT MPSAFE - I think these refer to a common file descriptor table
2640  * and we need to spinlock that to link fdtol in.
2641  */
2642 struct filedesc_to_leader *
2643 filedesc_to_leader_alloc(struct filedesc_to_leader *old,
2644                          struct proc *leader)
2645 {
2646         struct filedesc_to_leader *fdtol;
2647         
2648         fdtol = kmalloc(sizeof(struct filedesc_to_leader), 
2649                         M_FILEDESC_TO_LEADER, M_WAITOK | M_ZERO);
2650         fdtol->fdl_refcount = 1;
2651         fdtol->fdl_holdcount = 0;
2652         fdtol->fdl_wakeup = 0;
2653         fdtol->fdl_leader = leader;
2654         if (old != NULL) {
2655                 fdtol->fdl_next = old->fdl_next;
2656                 fdtol->fdl_prev = old;
2657                 old->fdl_next = fdtol;
2658                 fdtol->fdl_next->fdl_prev = fdtol;
2659         } else {
2660                 fdtol->fdl_next = fdtol;
2661                 fdtol->fdl_prev = fdtol;
2662         }
2663         return fdtol;
2664 }
2665
2666 /*
2667  * Scan all file pointers in the system.  The callback is made with
2668  * the master list spinlock held exclusively.
2669  *
2670  * MPSAFE
2671  */
2672 void
2673 allfiles_scan_exclusive(int (*callback)(struct file *, void *), void *data)
2674 {
2675         struct file *fp;
2676         int res;
2677
2678         spin_lock(&filehead_spin);
2679         LIST_FOREACH(fp, &filehead, f_list) {
2680                 res = callback(fp, data);
2681                 if (res < 0)
2682                         break;
2683         }
2684         spin_unlock(&filehead_spin);
2685 }
2686
2687 /*
2688  * Get file structures.
2689  *
2690  * NOT MPSAFE - process list scan, SYSCTL_OUT (probably not mpsafe)
2691  */
2692
2693 struct sysctl_kern_file_info {
2694         int count;
2695         int error;
2696         struct sysctl_req *req;
2697 };
2698
2699 static int sysctl_kern_file_callback(struct proc *p, void *data);
2700
2701 static int
2702 sysctl_kern_file(SYSCTL_HANDLER_ARGS)
2703 {
2704         struct sysctl_kern_file_info info;
2705
2706         /*
2707          * Note: because the number of file descriptors is calculated
2708          * in different ways for sizing vs returning the data,
2709          * there is information leakage from the first loop.  However,
2710          * it is of a similar order of magnitude to the leakage from
2711          * global system statistics such as kern.openfiles.
2712          *
2713          * When just doing a count, note that we cannot just count
2714          * the elements and add f_count via the filehead list because 
2715          * threaded processes share their descriptor table and f_count might
2716          * still be '1' in that case.
2717          *
2718          * Since the SYSCTL op can block, we must hold the process to
2719          * prevent it being ripped out from under us either in the 
2720          * file descriptor loop or in the greater LIST_FOREACH.  The
2721          * process may be in varying states of disrepair.  If the process
2722          * is in SZOMB we may have caught it just as it is being removed
2723          * from the allproc list, we must skip it in that case to maintain
2724          * an unbroken chain through the allproc list.
2725          */
2726         info.count = 0;
2727         info.error = 0;
2728         info.req = req;
2729         allproc_scan(sysctl_kern_file_callback, &info);
2730
2731         /*
2732          * When just calculating the size, overestimate a bit to try to
2733          * prevent system activity from causing the buffer-fill call 
2734          * to fail later on.
2735          */
2736         if (req->oldptr == NULL) {
2737                 info.count = (info.count + 16) + (info.count / 10);
2738                 info.error = SYSCTL_OUT(req, NULL,
2739                                         info.count * sizeof(struct kinfo_file));
2740         }
2741         return (info.error);
2742 }
2743
2744 static int
2745 sysctl_kern_file_callback(struct proc *p, void *data)
2746 {
2747         struct sysctl_kern_file_info *info = data;
2748         struct kinfo_file kf;
2749         struct filedesc *fdp;
2750         struct file *fp;
2751         uid_t uid;
2752         int n;
2753
2754         if (p->p_stat == SIDL || p->p_stat == SZOMB)
2755                 return(0);
2756         if (!PRISON_CHECK(info->req->td->td_ucred, p->p_ucred) != 0)
2757                 return(0);
2758
2759         /*
2760          * Softref the fdp to prevent it from being destroyed
2761          */
2762         spin_lock(&p->p_spin);
2763         if ((fdp = p->p_fd) == NULL) {
2764                 spin_unlock(&p->p_spin);
2765                 return(0);
2766         }
2767         atomic_add_int(&fdp->fd_softrefs, 1);
2768         spin_unlock(&p->p_spin);
2769
2770         /*
2771          * The fdp's own spinlock prevents the contents from being
2772          * modified.
2773          */
2774         spin_lock(&fdp->fd_spin);
2775         for (n = 0; n < fdp->fd_nfiles; ++n) {
2776                 if ((fp = fdp->fd_files[n].fp) == NULL)
2777                         continue;
2778                 if (info->req->oldptr == NULL) {
2779                         ++info->count;
2780                 } else {
2781                         uid = p->p_ucred ? p->p_ucred->cr_uid : -1;
2782                         kcore_make_file(&kf, fp, p->p_pid, uid, n);
2783                         spin_unlock(&fdp->fd_spin);
2784                         info->error = SYSCTL_OUT(info->req, &kf, sizeof(kf));
2785                         spin_lock(&fdp->fd_spin);
2786                         if (info->error)
2787                                 break;
2788                 }
2789         }
2790         spin_unlock(&fdp->fd_spin);
2791         atomic_subtract_int(&fdp->fd_softrefs, 1);
2792         if (info->error)
2793                 return(-1);
2794         return(0);
2795 }
2796
2797 SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD,
2798     0, 0, sysctl_kern_file, "S,file", "Entire file table");
2799
2800 SYSCTL_INT(_kern, OID_AUTO, minfilesperproc, CTLFLAG_RW,
2801     &minfilesperproc, 0, "Minimum files allowed open per process");
2802 SYSCTL_INT(_kern, KERN_MAXFILESPERPROC, maxfilesperproc, CTLFLAG_RW, 
2803     &maxfilesperproc, 0, "Maximum files allowed open per process");
2804 SYSCTL_INT(_kern, OID_AUTO, maxfilesperuser, CTLFLAG_RW,
2805     &maxfilesperuser, 0, "Maximum files allowed open per user");
2806
2807 SYSCTL_INT(_kern, KERN_MAXFILES, maxfiles, CTLFLAG_RW, 
2808     &maxfiles, 0, "Maximum number of files");
2809
2810 SYSCTL_INT(_kern, OID_AUTO, maxfilesrootres, CTLFLAG_RW, 
2811     &maxfilesrootres, 0, "Descriptors reserved for root use");
2812
2813 SYSCTL_INT(_kern, OID_AUTO, openfiles, CTLFLAG_RD, 
2814         &nfiles, 0, "System-wide number of open files");
2815
2816 static void
2817 fildesc_drvinit(void *unused)
2818 {
2819         int fd;
2820
2821         for (fd = 0; fd < NUMFDESC; fd++) {
2822                 make_dev(&fildesc_ops, fd,
2823                          UID_BIN, GID_BIN, 0666, "fd/%d", fd);
2824         }
2825
2826         make_dev(&fildesc_ops, 0, UID_ROOT, GID_WHEEL, 0666, "stdin");
2827         make_dev(&fildesc_ops, 1, UID_ROOT, GID_WHEEL, 0666, "stdout");
2828         make_dev(&fildesc_ops, 2, UID_ROOT, GID_WHEEL, 0666, "stderr");
2829 }
2830
2831 /*
2832  * MPSAFE
2833  */
2834 struct fileops badfileops = {
2835         .fo_read = badfo_readwrite,
2836         .fo_write = badfo_readwrite,
2837         .fo_ioctl = badfo_ioctl,
2838         .fo_kqfilter = badfo_kqfilter,
2839         .fo_stat = badfo_stat,
2840         .fo_close = badfo_close,
2841         .fo_shutdown = badfo_shutdown
2842 };
2843
2844 int
2845 badfo_readwrite(
2846         struct file *fp,
2847         struct uio *uio,
2848         struct ucred *cred,
2849         int flags
2850 ) {
2851         return (EBADF);
2852 }
2853
2854 int
2855 badfo_ioctl(struct file *fp, u_long com, caddr_t data,
2856             struct ucred *cred, struct sysmsg *msgv)
2857 {
2858         return (EBADF);
2859 }
2860
2861 /*
2862  * Must return an error to prevent registration, typically
2863  * due to a revoked descriptor (file_filtops assigned).
2864  */
2865 int
2866 badfo_kqfilter(struct file *fp, struct knote *kn)
2867 {
2868         return (EOPNOTSUPP);
2869 }
2870
2871 /*
2872  * MPSAFE
2873  */
2874 int
2875 badfo_stat(struct file *fp, struct stat *sb, struct ucred *cred)
2876 {
2877         return (EBADF);
2878 }
2879
2880 /*
2881  * MPSAFE
2882  */
2883 int
2884 badfo_close(struct file *fp)
2885 {
2886         return (EBADF);
2887 }
2888
2889 /*
2890  * MPSAFE
2891  */
2892 int
2893 badfo_shutdown(struct file *fp, int how)
2894 {
2895         return (EBADF);
2896 }
2897
2898 /*
2899  * MPSAFE
2900  */
2901 int
2902 nofo_shutdown(struct file *fp, int how)
2903 {
2904         return (EOPNOTSUPP);
2905 }
2906
2907 SYSINIT(fildescdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,
2908                                         fildesc_drvinit,NULL)