Changeset af020036 in rtems


Ignore:
Timestamp:
Mar 19, 1999, 9:51:58 PM (21 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
9ec96478
Parents:
b64b1ed
Message:

Patch from Eric Norum <eric@…> that adds external
fcntl support and an external fcntl handler for sockets.

Files:
11 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libcsupport/include/rtems/libio.h

    rb64b1ed raf020036  
    116116);
    117117
     118typedef int (*rtems_filesystem_fcntl_t)(
     119  int cmd,
     120  rtems_libio_t *iop
     121);
     122
    118123typedef struct {
    119124    rtems_filesystem_open_t         open;
     
    129134    rtems_filesystem_fsync_t        fsync;
    130135    rtems_filesystem_fdatasync_t    fdatasync;
     136    rtems_filesystem_fcntl_t        fcntl;
    131137} rtems_filesystem_file_handlers_r;
    132138
  • c/src/exec/libcsupport/src/fcntl.c

    rb64b1ed raf020036  
    3131  int            fd2;
    3232  int            flags;
     33  int            ret = 0;
    3334 
    3435  va_start( ap, cmd );
     
    5455        /* allocate a file control block */
    5556        diop = rtems_libio_allocate();
    56         if ( diop == 0 )
    57           return -1;
     57        if ( diop == 0 ) {
     58          ret = -1;
     59          break;
     60        }
    5861      }
    5962
     
    6366      diop->pathinfo   = iop->pathinfo;
    6467     
    65       return 0;
     68      break;
    6669
    6770    case F_GETFD:        /* get f_flags */
    68       if ( iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC )
    69         return 1;
    70       return 0;
     71      ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
     72      break;
    7173
    7274    case F_SETFD:        /* set f_flags */
     
    8385      else
    8486        iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
    85       return 0;
     87      break;
    8688
    8789    case F_GETFL:        /* more flags (cloexec) */
    88       return rtems_libio_to_fcntl_flags( iop->flags );
     90      ret = rtems_libio_to_fcntl_flags( iop->flags );
    8991
    9092    case F_SETFL:
     
    9294
    9395      /*
    94        *  XXX Double check this in the POSIX spec.  According to the Linux
    95        *  XXX man page, only these flags can be added.
    96        */
    97 
    98       flags = (iop->flags & ~(O_APPEND|O_NONBLOCK)) |
    99                    (flags & (O_APPEND|O_NONBLOCK));
    100 
    101       /*
    10296       *  XXX If we are turning on append, should we seek to the end?
    10397       */
    10498
    105       iop->flags = flags;
    106       return 0;
     99      iop->flags = (iop->flags & ~(O_APPEND | O_NONBLOCK)) |
     100                   (flags & (O_APPEND | O_NONBLOCK));
     101      break;
    107102
    108103    case F_GETLK:
    109       return -1;
     104      errno = ENOTSUP;
     105      ret = -1;
     106      break;
    110107
    111108    case F_SETLK:
    112       return -1;
     109      errno = ENOTSUP;
     110      ret = -1;
     111      break;
    113112
    114113    case F_SETLKW:
    115       return -1;
     114      errno = ENOTSUP;
     115      ret = -1;
     116      break;
    116117
    117118    case F_SETOWN:       /*  for sockets. */
    118       return -1;
     119      errno = ENOTSUP;
     120      ret = -1;
     121      break;
    119122
    120123    case F_GETOWN:       /*  for sockets. */
    121       return -1;
     124      errno = ENOTSUP;
     125      ret = -1;
     126      break;
    122127
    123128    default:
    124129      break;
    125130  }
    126   return -1;
     131  if ((ret >= 0) && iop->handlers->fcntl) {
     132    int err = (*iop->handlers->fcntl)( cmd, iop );
     133    if (err) {
     134      errno = err;
     135      ret = -1;
     136    }
     137  }
     138  return ret;
    127139}
  • c/src/exec/libnetworking/rtems/rtems_syscall.c

    rb64b1ed raf020036  
    2121#include <sys/protosw.h>
    2222#include <sys/proc.h>
     23#include <sys/fcntl.h>
    2324#include <sys/filio.h>
    2425
     
    645646
    646647static int
    647 so_ioctl (struct socket *so, unsigned32 command, void *buffer)
     648so_ioctl (rtems_libio_t *iop, struct socket *so, unsigned32 command, void *buffer)
    648649{
    649650        switch (command) {
    650651        case FIONBIO:
    651                 if (*(int *)buffer)
     652                if (*(int *)buffer) {
     653                        iop->flags |= O_NONBLOCK;
    652654                        so->so_state |= SS_NBIO;
    653                 else
     655                }
     656                else {
     657                        iop->flags &= ~O_NONBLOCK;
    654658                        so->so_state &= ~SS_NBIO;
     659                }
    655660                return 0;
    656661
     
    679684                return -1;
    680685        }
    681         error = so_ioctl (so, command, buffer);
     686        error = so_ioctl (iop, so, command, buffer);
    682687        rtems_bsdnet_semaphore_release ();
    683688        if (error) {
     
    686691        }
    687692        return 0;
     693}
     694
     695static int
     696rtems_bsdnet_fcntl (int cmd, rtems_libio_t *iop)
     697{
     698        struct socket *so;
     699
     700        if (cmd == F_SETFL) {
     701                rtems_bsdnet_semaphore_obtain ();
     702                if ((so = iop->data1) == NULL) {
     703                        rtems_bsdnet_semaphore_release ();
     704                        return EBADF;
     705                }
     706                if (iop->flags & O_NONBLOCK)
     707                        so->so_state |= SS_NBIO;
     708                else
     709                        so->so_state &= ~SS_NBIO;
     710                rtems_bsdnet_semaphore_release ();
     711        }
     712        return 0;
    688713}
    689714
     
    708733        NULL,                   /* fsync */
    709734        NULL,                   /* fdatasync */
     735        rtems_bsdnet_fcntl,     /* fcntl */
    710736};
  • c/src/lib/include/rtems/libio.h

    rb64b1ed raf020036  
    116116);
    117117
     118typedef int (*rtems_filesystem_fcntl_t)(
     119  int cmd,
     120  rtems_libio_t *iop
     121);
     122
    118123typedef struct {
    119124    rtems_filesystem_open_t         open;
     
    129134    rtems_filesystem_fsync_t        fsync;
    130135    rtems_filesystem_fdatasync_t    fdatasync;
     136    rtems_filesystem_fcntl_t        fcntl;
    131137} rtems_filesystem_file_handlers_r;
    132138
  • c/src/lib/libc/fcntl.c

    rb64b1ed raf020036  
    3131  int            fd2;
    3232  int            flags;
     33  int            ret = 0;
    3334 
    3435  va_start( ap, cmd );
     
    5455        /* allocate a file control block */
    5556        diop = rtems_libio_allocate();
    56         if ( diop == 0 )
    57           return -1;
     57        if ( diop == 0 ) {
     58          ret = -1;
     59          break;
     60        }
    5861      }
    5962
     
    6366      diop->pathinfo   = iop->pathinfo;
    6467     
    65       return 0;
     68      break;
    6669
    6770    case F_GETFD:        /* get f_flags */
    68       if ( iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC )
    69         return 1;
    70       return 0;
     71      ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
     72      break;
    7173
    7274    case F_SETFD:        /* set f_flags */
     
    8385      else
    8486        iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
    85       return 0;
     87      break;
    8688
    8789    case F_GETFL:        /* more flags (cloexec) */
    88       return rtems_libio_to_fcntl_flags( iop->flags );
     90      ret = rtems_libio_to_fcntl_flags( iop->flags );
    8991
    9092    case F_SETFL:
     
    9294
    9395      /*
    94        *  XXX Double check this in the POSIX spec.  According to the Linux
    95        *  XXX man page, only these flags can be added.
    96        */
    97 
    98       flags = (iop->flags & ~(O_APPEND|O_NONBLOCK)) |
    99                    (flags & (O_APPEND|O_NONBLOCK));
    100 
    101       /*
    10296       *  XXX If we are turning on append, should we seek to the end?
    10397       */
    10498
    105       iop->flags = flags;
    106       return 0;
     99      iop->flags = (iop->flags & ~(O_APPEND | O_NONBLOCK)) |
     100                   (flags & (O_APPEND | O_NONBLOCK));
     101      break;
    107102
    108103    case F_GETLK:
    109       return -1;
     104      errno = ENOTSUP;
     105      ret = -1;
     106      break;
    110107
    111108    case F_SETLK:
    112       return -1;
     109      errno = ENOTSUP;
     110      ret = -1;
     111      break;
    113112
    114113    case F_SETLKW:
    115       return -1;
     114      errno = ENOTSUP;
     115      ret = -1;
     116      break;
    116117
    117118    case F_SETOWN:       /*  for sockets. */
    118       return -1;
     119      errno = ENOTSUP;
     120      ret = -1;
     121      break;
    119122
    120123    case F_GETOWN:       /*  for sockets. */
    121       return -1;
     124      errno = ENOTSUP;
     125      ret = -1;
     126      break;
    122127
    123128    default:
    124129      break;
    125130  }
    126   return -1;
     131  if ((ret >= 0) && iop->handlers->fcntl) {
     132    int err = (*iop->handlers->fcntl)( cmd, iop );
     133    if (err) {
     134      errno = err;
     135      ret = -1;
     136    }
     137  }
     138  return ret;
    127139}
  • c/src/lib/libc/libio.h

    rb64b1ed raf020036  
    116116);
    117117
     118typedef int (*rtems_filesystem_fcntl_t)(
     119  int cmd,
     120  rtems_libio_t *iop
     121);
     122
    118123typedef struct {
    119124    rtems_filesystem_open_t         open;
     
    129134    rtems_filesystem_fsync_t        fsync;
    130135    rtems_filesystem_fdatasync_t    fdatasync;
     136    rtems_filesystem_fcntl_t        fcntl;
    131137} rtems_filesystem_file_handlers_r;
    132138
  • c/src/lib/libnetworking/rtems/rtems_syscall.c

    rb64b1ed raf020036  
    2121#include <sys/protosw.h>
    2222#include <sys/proc.h>
     23#include <sys/fcntl.h>
    2324#include <sys/filio.h>
    2425
     
    645646
    646647static int
    647 so_ioctl (struct socket *so, unsigned32 command, void *buffer)
     648so_ioctl (rtems_libio_t *iop, struct socket *so, unsigned32 command, void *buffer)
    648649{
    649650        switch (command) {
    650651        case FIONBIO:
    651                 if (*(int *)buffer)
     652                if (*(int *)buffer) {
     653                        iop->flags |= O_NONBLOCK;
    652654                        so->so_state |= SS_NBIO;
    653                 else
     655                }
     656                else {
     657                        iop->flags &= ~O_NONBLOCK;
    654658                        so->so_state &= ~SS_NBIO;
     659                }
    655660                return 0;
    656661
     
    679684                return -1;
    680685        }
    681         error = so_ioctl (so, command, buffer);
     686        error = so_ioctl (iop, so, command, buffer);
    682687        rtems_bsdnet_semaphore_release ();
    683688        if (error) {
     
    686691        }
    687692        return 0;
     693}
     694
     695static int
     696rtems_bsdnet_fcntl (int cmd, rtems_libio_t *iop)
     697{
     698        struct socket *so;
     699
     700        if (cmd == F_SETFL) {
     701                rtems_bsdnet_semaphore_obtain ();
     702                if ((so = iop->data1) == NULL) {
     703                        rtems_bsdnet_semaphore_release ();
     704                        return EBADF;
     705                }
     706                if (iop->flags & O_NONBLOCK)
     707                        so->so_state |= SS_NBIO;
     708                else
     709                        so->so_state &= ~SS_NBIO;
     710                rtems_bsdnet_semaphore_release ();
     711        }
     712        return 0;
    688713}
    689714
     
    708733        NULL,                   /* fsync */
    709734        NULL,                   /* fdatasync */
     735        rtems_bsdnet_fcntl,     /* fcntl */
    710736};
  • c/src/libnetworking/rtems/rtems_syscall.c

    rb64b1ed raf020036  
    2121#include <sys/protosw.h>
    2222#include <sys/proc.h>
     23#include <sys/fcntl.h>
    2324#include <sys/filio.h>
    2425
     
    645646
    646647static int
    647 so_ioctl (struct socket *so, unsigned32 command, void *buffer)
     648so_ioctl (rtems_libio_t *iop, struct socket *so, unsigned32 command, void *buffer)
    648649{
    649650        switch (command) {
    650651        case FIONBIO:
    651                 if (*(int *)buffer)
     652                if (*(int *)buffer) {
     653                        iop->flags |= O_NONBLOCK;
    652654                        so->so_state |= SS_NBIO;
    653                 else
     655                }
     656                else {
     657                        iop->flags &= ~O_NONBLOCK;
    654658                        so->so_state &= ~SS_NBIO;
     659                }
    655660                return 0;
    656661
     
    679684                return -1;
    680685        }
    681         error = so_ioctl (so, command, buffer);
     686        error = so_ioctl (iop, so, command, buffer);
    682687        rtems_bsdnet_semaphore_release ();
    683688        if (error) {
     
    686691        }
    687692        return 0;
     693}
     694
     695static int
     696rtems_bsdnet_fcntl (int cmd, rtems_libio_t *iop)
     697{
     698        struct socket *so;
     699
     700        if (cmd == F_SETFL) {
     701                rtems_bsdnet_semaphore_obtain ();
     702                if ((so = iop->data1) == NULL) {
     703                        rtems_bsdnet_semaphore_release ();
     704                        return EBADF;
     705                }
     706                if (iop->flags & O_NONBLOCK)
     707                        so->so_state |= SS_NBIO;
     708                else
     709                        so->so_state &= ~SS_NBIO;
     710                rtems_bsdnet_semaphore_release ();
     711        }
     712        return 0;
    688713}
    689714
     
    708733        NULL,                   /* fsync */
    709734        NULL,                   /* fdatasync */
     735        rtems_bsdnet_fcntl,     /* fcntl */
    710736};
  • cpukit/libcsupport/include/rtems/libio.h

    rb64b1ed raf020036  
    116116);
    117117
     118typedef int (*rtems_filesystem_fcntl_t)(
     119  int cmd,
     120  rtems_libio_t *iop
     121);
     122
    118123typedef struct {
    119124    rtems_filesystem_open_t         open;
     
    129134    rtems_filesystem_fsync_t        fsync;
    130135    rtems_filesystem_fdatasync_t    fdatasync;
     136    rtems_filesystem_fcntl_t        fcntl;
    131137} rtems_filesystem_file_handlers_r;
    132138
  • cpukit/libcsupport/src/fcntl.c

    rb64b1ed raf020036  
    3131  int            fd2;
    3232  int            flags;
     33  int            ret = 0;
    3334 
    3435  va_start( ap, cmd );
     
    5455        /* allocate a file control block */
    5556        diop = rtems_libio_allocate();
    56         if ( diop == 0 )
    57           return -1;
     57        if ( diop == 0 ) {
     58          ret = -1;
     59          break;
     60        }
    5861      }
    5962
     
    6366      diop->pathinfo   = iop->pathinfo;
    6467     
    65       return 0;
     68      break;
    6669
    6770    case F_GETFD:        /* get f_flags */
    68       if ( iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC )
    69         return 1;
    70       return 0;
     71      ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
     72      break;
    7173
    7274    case F_SETFD:        /* set f_flags */
     
    8385      else
    8486        iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
    85       return 0;
     87      break;
    8688
    8789    case F_GETFL:        /* more flags (cloexec) */
    88       return rtems_libio_to_fcntl_flags( iop->flags );
     90      ret = rtems_libio_to_fcntl_flags( iop->flags );
    8991
    9092    case F_SETFL:
     
    9294
    9395      /*
    94        *  XXX Double check this in the POSIX spec.  According to the Linux
    95        *  XXX man page, only these flags can be added.
    96        */
    97 
    98       flags = (iop->flags & ~(O_APPEND|O_NONBLOCK)) |
    99                    (flags & (O_APPEND|O_NONBLOCK));
    100 
    101       /*
    10296       *  XXX If we are turning on append, should we seek to the end?
    10397       */
    10498
    105       iop->flags = flags;
    106       return 0;
     99      iop->flags = (iop->flags & ~(O_APPEND | O_NONBLOCK)) |
     100                   (flags & (O_APPEND | O_NONBLOCK));
     101      break;
    107102
    108103    case F_GETLK:
    109       return -1;
     104      errno = ENOTSUP;
     105      ret = -1;
     106      break;
    110107
    111108    case F_SETLK:
    112       return -1;
     109      errno = ENOTSUP;
     110      ret = -1;
     111      break;
    113112
    114113    case F_SETLKW:
    115       return -1;
     114      errno = ENOTSUP;
     115      ret = -1;
     116      break;
    116117
    117118    case F_SETOWN:       /*  for sockets. */
    118       return -1;
     119      errno = ENOTSUP;
     120      ret = -1;
     121      break;
    119122
    120123    case F_GETOWN:       /*  for sockets. */
    121       return -1;
     124      errno = ENOTSUP;
     125      ret = -1;
     126      break;
    122127
    123128    default:
    124129      break;
    125130  }
    126   return -1;
     131  if ((ret >= 0) && iop->handlers->fcntl) {
     132    int err = (*iop->handlers->fcntl)( cmd, iop );
     133    if (err) {
     134      errno = err;
     135      ret = -1;
     136    }
     137  }
     138  return ret;
    127139}
  • cpukit/libnetworking/rtems/rtems_syscall.c

    rb64b1ed raf020036  
    2121#include <sys/protosw.h>
    2222#include <sys/proc.h>
     23#include <sys/fcntl.h>
    2324#include <sys/filio.h>
    2425
     
    645646
    646647static int
    647 so_ioctl (struct socket *so, unsigned32 command, void *buffer)
     648so_ioctl (rtems_libio_t *iop, struct socket *so, unsigned32 command, void *buffer)
    648649{
    649650        switch (command) {
    650651        case FIONBIO:
    651                 if (*(int *)buffer)
     652                if (*(int *)buffer) {
     653                        iop->flags |= O_NONBLOCK;
    652654                        so->so_state |= SS_NBIO;
    653                 else
     655                }
     656                else {
     657                        iop->flags &= ~O_NONBLOCK;
    654658                        so->so_state &= ~SS_NBIO;
     659                }
    655660                return 0;
    656661
     
    679684                return -1;
    680685        }
    681         error = so_ioctl (so, command, buffer);
     686        error = so_ioctl (iop, so, command, buffer);
    682687        rtems_bsdnet_semaphore_release ();
    683688        if (error) {
     
    686691        }
    687692        return 0;
     693}
     694
     695static int
     696rtems_bsdnet_fcntl (int cmd, rtems_libio_t *iop)
     697{
     698        struct socket *so;
     699
     700        if (cmd == F_SETFL) {
     701                rtems_bsdnet_semaphore_obtain ();
     702                if ((so = iop->data1) == NULL) {
     703                        rtems_bsdnet_semaphore_release ();
     704                        return EBADF;
     705                }
     706                if (iop->flags & O_NONBLOCK)
     707                        so->so_state |= SS_NBIO;
     708                else
     709                        so->so_state &= ~SS_NBIO;
     710                rtems_bsdnet_semaphore_release ();
     711        }
     712        return 0;
    688713}
    689714
     
    708733        NULL,                   /* fsync */
    709734        NULL,                   /* fdatasync */
     735        rtems_bsdnet_fcntl,     /* fcntl */
    710736};
Note: See TracChangeset for help on using the changeset viewer.