home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / emacs-19.28-src.tgz / tar.out / fsf / emacs / unixlib / src / fcntl.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  809b  |  44 lines

  1. #include "amiga.h"
  2. #include "files.h"
  3. #include <fcntl.h>
  4. #include <sys/filio.h>
  5. #include <stdarg.h>
  6.  
  7. /* Flags that can be changed with fcntl */
  8. #define FCNTL_FLAGS (O_NDELAY | O_APPEND)
  9.  
  10. int fcntl(int fd, int cmd, ...)
  11. {
  12.   struct fileinfo *fi;
  13.   va_list args;
  14.   int arg;
  15.  
  16.   chkabort();
  17.   va_start(args, cmd);
  18.   arg = va_arg(args, int);
  19.   va_end(args);
  20.  
  21.   if (fi = _find_fd(fd))
  22.     {
  23.       switch (cmd)
  24.     {
  25.     default: errno = EINVAL; break;
  26.     case F_GETFL: return fi->flags & FCNTL_FLAGS;
  27.     case F_SETFL:
  28.       {
  29.         int oldfl = fi->flags;
  30.  
  31.         fi->flags = (fi->flags & ~FCNTL_FLAGS) | (arg & FCNTL_FLAGS);
  32.         if ((oldfl & O_NDELAY) != (fi->flags & O_NDELAY))
  33.           {
  34.         int ndelay = fi->flags & O_NDELAY;
  35.  
  36.         return fi->ioctl(fi->userinfo, FIONBIO, &ndelay);
  37.           }
  38.         return 0;
  39.       }
  40.     }
  41.     }
  42.   return -1;
  43. }
  44.