Autodoc corrections
[cake.git] / compiler / clib / fcntl.c
blob62a5a57a604683411194407eb11833ea8e858161
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <proto/dos.h>
8 #include <fcntl.h>
9 #include <errno.h>
10 #include <stdarg.h>
12 #include "__errno.h"
13 #include "__open.h"
15 /*****************************************************************************
17 NAME */
18 int fcntl(
20 /* SYNOPSIS */
21 int fd,
22 int cmd,
23 ...)
25 /* FUNCTION
27 INPUTS
29 RESULT
31 NOTES
33 EXAMPLE
35 BUGS
37 SEE ALSO
39 INTERNALS
41 ******************************************************************************/
43 fdesc *desc = __getfdesc(fd);
45 if (!desc)
47 errno = EBADF;
48 return -1;
51 switch (cmd)
53 case F_DUPFD:
55 va_list ap;
56 int arg;
58 va_start(ap, cmd);
59 arg = va_arg(ap, int);
60 va_end(ap);
63 FIXME: FD_CLOEXEC must be off on the copy, once this flag
64 is supported (related to F_GETFD and F_SETFD).
67 return dup2(fd, __getfirstfd(arg));
70 case F_GETFL:
71 return desc->flags & (O_NONBLOCK|O_APPEND|O_ASYNC);
73 case F_SETFL:
75 va_list ap;
76 int arg;
77 int oldmode = __oflags2amode(desc->flags & ~(O_NONBLOCK|O_APPEND|O_ASYNC));
79 va_start(ap, cmd);
80 arg = va_arg(ap, int);
81 va_end(ap);
83 arg &= (O_NONBLOCK|O_APPEND|O_ASYNC);
85 if (ChangeMode(CHANGE_FH, desc->fh, oldmode | __oflags2amode(arg)) == DOSTRUE)
87 desc->flags &= ~(O_NONBLOCK|O_APPEND|O_ASYNC);
88 desc->flags |= arg;
89 return 0;
92 errno = IoErr2errno(IoErr());
93 return -1;
96 default:
97 errno = EINVAL;
98 return -1;