diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-15 12:46:57 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-15 12:46:57 +0200 |
commit | 894c965d95d971392b14bd2e9c0abf380ba80f02 (patch) | |
tree | 81ec615823caf2b4a942358627b4ee114d07bff0 /freebsd/sys/kern/uipc_syscalls.c | |
parent | Include missing <string.h> and <limits.h> (diff) | |
download | rtems-libbsd-894c965d95d971392b14bd2e9c0abf380ba80f02.tar.bz2 |
Support reference counting for file descriptors
Close #3132.
Diffstat (limited to 'freebsd/sys/kern/uipc_syscalls.c')
-rw-r--r-- | freebsd/sys/kern/uipc_syscalls.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/freebsd/sys/kern/uipc_syscalls.c b/freebsd/sys/kern/uipc_syscalls.c index fa948c78..3c6d7efd 100644 --- a/freebsd/sys/kern/uipc_syscalls.c +++ b/freebsd/sys/kern/uipc_syscalls.c @@ -126,11 +126,16 @@ rtems_bsd_getsock(int fd, struct file **fpp, u_int *fflagp) int error; if ((uint32_t) fd < rtems_libio_number_iops) { + unsigned int flags; + fp = rtems_bsd_fd_to_fp(fd); - if ((fp->f_io.flags & LIBIO_FLAGS_OPEN) != LIBIO_FLAGS_OPEN) { + flags = rtems_libio_iop_hold(&fp->f_io); + if ((flags & LIBIO_FLAGS_OPEN) == 0) { + rtems_libio_iop_drop(&fp->f_io); fp = NULL; error = EBADF; } else if (fp->f_io.pathinfo.handlers != &socketops) { + rtems_libio_iop_drop(&fp->f_io); fp = NULL; error = ENOTSOCK; } else { |