int
falloc(
struct lwp *l
, struct file **resultfp
, int *resultfd
)
struct
file
*
fd_getfile(
struct filedesc *fdp
, int fd
)
int
dupfdopen(
struct lwp *l
, int indx
, int dfd
, int mode
, int error
)
int
fdalloc(
struct proc *p
, int want
, int *result
)
int
fdcheckstd(
struct lwp *l
)
void
fdclear(
struct lwp *l
)
int
fdclone(
struct lwp *l
, struct file *fp
, int fd
, int flag
, const struct fileops *fops
, void *data
)
void
fdcloseexec(
struct lwp *l
)
struct
filedesc
*
fdcopy(
struct proc *p
)
void
fdexpand(
struct proc *p
)
void
fdfree(
struct lwp *l
)
struct
filedesc
*
fdinit(
struct proc *p
)
int
fdrelease(
struct lwp *l
, int fd
)
void
fdremove(
struct filedesc *fdp
, int fd
)
void
fdshare(
struct proc *p1
, struct proc *p2
)
void
fdunshare(
struct lwp *l
)
The kernel maintains a descriptor table for each process which is used to translate the external representation of a file descriptor into an internal representation. The file descriptor is merely an index into this table. The file descriptor table maintains the following information:
On creation of the file descriptor table, a fixed number of file entries are created. It is the responsibility of the file descriptor operations to expand the available number of entries if more are required. Each file entry in the descriptor table contains the information necessary to access the underlying object and to maintain common information. See file(9) for details of operations on the file entries.
New file descriptors are generally allocated by
falloc()
and freed by
fdrelease(
).
File entries are extracted from the file descriptor table by
fd_getfile(
).
Most of the remaining functions in the interface are purpose specific
and perform lower-level file descriptor operations.
p
, *resultfp
, *resultfd
)
p
.
This operation is performed by invoking
fdalloc(
)
to allocate the new file descriptor.
The credential on the file entry are inherited from process
p
.
The
falloc(
)
function is responsible for expanding the file descriptor table when
necessary.
A pointer to the file entry is returned in
*resultfp
and the file descriptor is returned in
*resultfd
.
The
falloc()
function returns zero on success, otherwise an appropriate error is
returned.
fdp
, fd
)
fd
in the file descriptor table
fdp
.
The file entry is returned if it is valid and useable, otherwise
NULL
is returned.
l
, indx
, dfd
, mode
, error
)
dfd
for lwp
l
.
The following functions operate on the file descriptor table for a process.
p
, want
, *result
)
want
for process
p
.
The resultant file descriptor is returned in
*result
.
The
fdalloc(
)
function returns zero on success, otherwise an appropriate error is
returned.
l
)
/dev/null
.
This operation is necessary as these file descriptors are given implicit
significance in the Standard C Library and it is unsafe for
setuid(2)
and
setgid(2)
processes to be started with these file descriptors closed.
l
)
l
.
This operation is performed by invoking
fdinit(
)
to initialise a new file descriptor table to replace the old file
descriptor table and invoking
fdfree(
)
to release the old one.
l
, fp
, fd
, flag
, fops
, data
)
)
fills
fp
with the given parameters.
It always returns the in-kernel errno value
EMOVEFD
,
which is meant to be returned from the device open routine.
This special return value is interpreted by the caller of the device
open routine.
l
)
p
that are marked
``close on exec''.
This operation is performed by invoking
fdunshare(
)
for the process and invoking
fdrelease(
)
on the appropriate file descriptor.
p
)
p
and return a pointer to the copy.
The returned file descriptor is guaranteed to have a reference count of one.
All file descriptor state is maintained.
The reference counts on each file entry referenced by the file
descriptor table is incremented accordingly.
p
)
p
by allocating memory for additional file descriptors.
l
)
l
and release the file descriptor table if the reference count drops to
zero.
p
)
p
.
The returned file descriptor table is guaranteed to have a reference
count of one.
l
, fd
)
fd
from the file descriptor table of lwp
l
.
The operation is performed by invoking
closef(
).
fdp
, fd
)
fd
from file descriptor table
fdp
.
p1
, p2
)
p1
with process
p2
.
Process
p2
is assumed not to have a file descriptor table already allocated.
The reference count on the file descriptor table is incremented.
This function is used by
fork1(9).
l
)
l
does not share its file descriptor table.
If its file descriptor table has more than one reference, the file
descriptor table is copied by invoking
fdcopy(
).
The reference count on the original file descriptor table is
decremented.
EBADF
]
EMFILE
]
ENOSPC
]
/usr/src
.
The framework for file descriptor handling is implemented within the
file
sys/kern/kern_descrip.c
.