home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 1 / RISC_DISC_1.iso / pd_share / code / unixlib / !UnixLib / src / unix / c / fcntl < prev    next >
Encoding:
Text File  |  1994-09-30  |  1.1 KB  |  63 lines

  1. static char sccs_id[] = "@(#) fcntl.c 1.2 " __DATE__ " HJR";
  2.  
  3. /* fcntl.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <errno.h>
  6.  
  7. #include "fcntl.h"
  8.  
  9. #include "sys/unix.h"
  10.  
  11. int
  12. fcntl (int fd, register int cmd, register int arg)
  13. {
  14.   register struct file *f;
  15.  
  16.   if (BADF (fd))
  17.     {
  18.       errno = EBADF;
  19.       return (-1);
  20.     }
  21.  
  22.   f = __u->file + fd;
  23.  
  24.   switch (cmd)
  25.     {
  26.     case F_DUPFD:
  27.       {
  28.     register struct file *_f;
  29.  
  30.     _f = __u->file + arg;
  31.     while (arg < MAXFD && _f->dup)
  32.       arg++, _f++;
  33.     if (arg >= MAXFD)
  34.       {
  35.         errno = EMFILE;
  36.         return (-1);
  37.       }
  38.       }
  39.       return (dup2 (fd, arg));
  40.       break;
  41.     case F_GETFD:
  42.       return ((f->oflag & O_EXECCL) ? 1 : 0);
  43.       break;
  44.     case F_SETFD:
  45.       f->oflag = (f->oflag & (~O_EXECCL)) | \
  46.     ((arg & 1) ? O_EXECCL : 0);
  47.       return (0);
  48.       break;
  49.     case F_GETFL:
  50.       return (f->oflag);
  51.       break;
  52.     case F_SETFL:
  53.       f->oflag = (f->oflag & ~(O_APPEND | O_NDELAY)) | \
  54.     (arg & (O_APPEND | O_NDELAY));
  55.       return (0);
  56.       break;
  57.     default:
  58.       errno = EINVAL;
  59.       return (-1);
  60.       break;
  61.     }
  62. }
  63.