X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibposix.so_src%2Funistd.c;h=7cfb71abd00f8d4091b14864ce24e2e3514b672a;hb=4d184c30a3385600c0d87a2f93b4259c8c973e73;hp=68c4e52208937a8dd03744313bafde02148b04e7;hpb=6cca7994b0b4b232df98a7c3856197d6075bf1cc;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libposix.so_src/unistd.c b/Usermode/Libraries/libposix.so_src/unistd.c index 68c4e522..7cfb71ab 100644 --- a/Usermode/Libraries/libposix.so_src/unistd.c +++ b/Usermode/Libraries/libposix.so_src/unistd.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include // === CODE === int unlink(const char *pathname) @@ -37,6 +39,9 @@ int open(const char *path, int openmode, ...) va_end(args); } + if( openmode & O_NONBLOCK ) + openflags |= OPENFLAG_NONBLOCK; + return _SysOpen(path, openflags, create_mode); } @@ -85,9 +90,94 @@ int execv(const char *b, char *v[]) return _SysExecVE(b, v, NULL); } +int dup(int oldfd) +{ + _SysDebug("libposix: dup() does not share offsets/flags"); + // NOTE: Acess's CopyFD doesn't cause offset sharing + // TODO: Check that -1 does cause a new allocation + return _SysCopyFD(oldfd, -1); +} + int dup2(int oldfd, int newfd) { + _SysDebug("libposix: dup2() does not share offsets/flags"); // NOTE: Acess's CopyFD doesn't cause offset sharing return _SysCopyFD(oldfd, newfd); } + +/* + * Set session ID to PID + */ +pid_t setsid(void) +{ + // TODO: actual syscall for this + return _SysGetPID(); +} + +pid_t getpid(void) +{ + return _SysGetPID(); +} + +uid_t getuid(void) +{ + return _SysGetUID(); +} + +uid_t geteuid(void) +{ + // TODO: Impliment EUIDs in-kernel? + return _SysGetUID(); +} + +int kill(pid_t pid, int signal) +{ + // TODO: Need special handling? + return _SysKill(pid, signal); +} + +int select(int nfd, fd_set *rfd, fd_set *wfd, fd_set *efd, struct timeval *timeout) +{ + + if( timeout ) + { + long long int ltimeout = 0; + ltimeout = timeout->tv_sec*1000 + timeout->tv_usec / 1000; + int ret = _SysSelect(nfd, rfd, wfd, efd, <imeout, 0); + return ret; + } + else + { + return _SysSelect(nfd, rfd, wfd, efd, NULL, 0); + } +} + +int pipe(int pipefd[2]) +{ + pipefd[0] = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE); + pipefd[1] = _SysCopyFD(pipefd[0], -1); + _SysFDFlags(pipefd[1], OPENFLAG_READ|OPENFLAG_WRITE, OPENFLAG_WRITE); + return 0; +} + +int chdir(const char *dir) +{ + return _SysChdir(dir); +} + +int mkdir(const char *pathname, mode_t mode) +{ + _SysDebug("TODO: POSIX mkdir(%i, 0%o)", pathname, mode); + return -1; +} + +char *getpass(const char *prompt) +{ + static char passbuf[PASS_MAX+1]; + fprintf(stderr, "%s", prompt); + fgets(passbuf, PASS_MAX+1, stdin); + fprintf(stderr, "\n"); + return passbuf; +} +