From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/ape/lib/ap/plan9/fcntl.c | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 sys/src/ape/lib/ap/plan9/fcntl.c (limited to 'sys/src/ape/lib/ap/plan9/fcntl.c') diff --git a/sys/src/ape/lib/ap/plan9/fcntl.c b/sys/src/ape/lib/ap/plan9/fcntl.c new file mode 100755 index 000000000..053e38ec3 --- /dev/null +++ b/sys/src/ape/lib/ap/plan9/fcntl.c @@ -0,0 +1,81 @@ +#include "lib.h" +#include +#include +#include +#include "sys9.h" + +/* + * BUG: advisory locking not implemented + */ + +#define OFL (O_ACCMODE|O_NONBLOCK|O_APPEND) + +int +fcntl(int fd, int cmd, ...) +{ + int arg, i, ans, err; + Fdinfo *fi, *fans; + va_list va; + unsigned long oflags; + + err = 0; + ans = 0; + va_start(va, cmd); + arg = va_arg(va, int); + va_end(va); + fi = &_fdinfo[fd]; + if(fd<0 || fd>=OPEN_MAX || !(fi->flags&FD_ISOPEN)) + err = EBADF; + else switch(cmd){ + case F_DUPFD: + if(fi->flags&(FD_BUFFERED|FD_BUFFEREDX)){ + err = EGREG; /* dup of buffered fd not implemented */ + break; + } + oflags = fi->oflags; + for(i = (arg>0)? arg : 0; iflags = fi->flags&~FD_CLOEXEC; + fans->oflags = oflags; + fans->uid = fi->uid; + fans->gid = fi->gid; + } + } + break; + case F_GETFD: + ans = fi->flags&FD_CLOEXEC; + break; + case F_SETFD: + fi->flags = (fi->flags&~FD_CLOEXEC)|(arg&FD_CLOEXEC); + break; + case F_GETFL: + ans = fi->oflags&OFL; + break; + case F_SETFL: + fi->oflags = (fi->oflags&~OFL)|(arg&OFL); + break; + case F_GETLK: + case F_SETLK: + case F_SETLKW: + err = EINVAL; + break; + } + if(err){ + errno = err; + ans = -1; + } + return ans; +} -- cgit v1.2.3