home *** CD-ROM | disk | FTP | other *** search
- static char sccs_id[] = "@(#) fcntl.c 1.2 " __DATE__ " HJR";
-
- /* fcntl.c (c) Copyright 1990 H.Rogers */
-
- #include <errno.h>
-
- #include "fcntl.h"
-
- #include "sys/unix.h"
-
- int
- fcntl (int fd, register int cmd, register int arg)
- {
- register struct file *f;
-
- if (BADF (fd))
- {
- errno = EBADF;
- return (-1);
- }
-
- f = __u->file + fd;
-
- switch (cmd)
- {
- case F_DUPFD:
- {
- register struct file *_f;
-
- _f = __u->file + arg;
- while (arg < MAXFD && _f->dup)
- arg++, _f++;
- if (arg >= MAXFD)
- {
- errno = EMFILE;
- return (-1);
- }
- }
- return (dup2 (fd, arg));
- break;
- case F_GETFD:
- return ((f->oflag & O_EXECCL) ? 1 : 0);
- break;
- case F_SETFD:
- f->oflag = (f->oflag & (~O_EXECCL)) | \
- ((arg & 1) ? O_EXECCL : 0);
- return (0);
- break;
- case F_GETFL:
- return (f->oflag);
- break;
- case F_SETFL:
- f->oflag = (f->oflag & ~(O_APPEND | O_NDELAY)) | \
- (arg & (O_APPEND | O_NDELAY));
- return (0);
- break;
- default:
- errno = EINVAL;
- return (-1);
- break;
- }
- }
-