From c5aaa72bbb6897e4fb24b70e8a34db6eeb20604a Mon Sep 17 00:00:00 2001 From: Giacomo Tesio Date: Sun, 3 Sep 2017 17:51:44 +0200 Subject: [PATCH] libposix: add dup, dup2, getrusage, fstat and lstat --- sys/include/posix.h | 14 ++++++++++++- sys/src/lib/posix/files.c | 38 +++++++++++++++++++++++++++++++++++ sys/src/lib/posix/processes.c | 37 ++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/sys/include/posix.h b/sys/include/posix.h index e9c61dc..2784185 100644 --- a/sys/include/posix.h +++ b/sys/include/posix.h @@ -82,11 +82,21 @@ struct __attribute__((__packed__)) dirent typedef unsigned long clock_t; +typedef enum PosixRUsages +{ + PosixRUsageSelf = 0, + PosixRUsageChildren = 1, + + PosixRUsageUnknown = -1 +} PosixRUsages; + #define __POSIX_EXIT_PREFIX "posix error " #define __POSIX_EXIT_SIGNAL_PREFIX "terminated by posix signal " #define __POSIX_SIGNAL_PREFIX "posix: " extern int POSIX_access(int *errnop, const char *path, int amode); +extern int POSIX_dup(int *errnop, int fildes); +extern int POSIX_dup2(int *errnop, int fildes, int fildes2); extern void POSIX_exit(int code) __attribute__((noreturn)); extern int POSIX_chmod(int *errnop, const char *path, int mode); extern int POSIX_fchmodat(int *errnop, int fd, const char *path, long mode, int flag); @@ -99,7 +109,7 @@ extern int POSIX_mkdir(int *errnop, const char *path, int mode); extern int POSIX_close(int *errnop, int file); extern int POSIX_execve(int *errnop, const char *name, char * const*argv, char * const*env); extern int POSIX_fork(int *errnop); -extern int POSIX_fstat(int *errnop, int file, void *stat); +extern int POSIX_getrusage(int *errnop, PosixRUsages who, void *r_usage); extern char* POSIX_getcwd(int *errnop, char *buf, int size); extern char* POSIX_getlogin(int *errnop); extern int POSIX_getlogin_r(int *errnop, char *name, int namesize); @@ -115,6 +125,8 @@ extern long POSIX_pread(int *errnop, int fd, char *buf, size_t len, long offset) extern long POSIX_pwrite(int *errnop, int fd, const char *buf, size_t len, long offset); extern long POSIX_read(int *errnop, int fd, char *buf, size_t len); extern int POSIX_stat(int *errnop, const char *file, void *stat); +extern int POSIX_fstat(int *errnop, int file, void *stat); +extern int POSIX_lstat(int *errnop, const char *file, void *stat); extern clock_t POSIX_times(int *errnop, void *tms); extern int POSIX_unlink(int *errnop, const char *name); extern int POSIX_wait(int *errnop, int *status); diff --git a/sys/src/lib/posix/files.c b/sys/src/lib/posix/files.c index 97ff98f..161ef70 100644 --- a/sys/src/lib/posix/files.c +++ b/sys/src/lib/posix/files.c @@ -153,6 +153,38 @@ AccessDone: return -1; } +int +POSIX_dup2(int *errnop, int fildes, int fildes2) +{ + int newfd; + if(fildes < 0 || fildes2 < 0){ + *errnop = __libposix_get_errno(PosixEBADF); + return -1; + } + newfd = dup(fildes, fildes2); + if(newfd < 0){ + *errnop = __libposix_get_errno(PosixEINTR); + return -1; + } + return newfd; +} + +int +POSIX_dup(int *errnop, int fildes) +{ + int newfd; + if(fildes < 0){ + *errnop = __libposix_get_errno(PosixEBADF); + return -1; + } + newfd = dup(fildes, -1); + if(newfd < 0){ + *errnop = __libposix_get_errno(PosixEBADF); + return -1; + } + return newfd; +} + int POSIX_pipe(int *errnop, int fildes[2]) { @@ -427,6 +459,12 @@ POSIX_stat(int *errnop, const char *file, void *pstat) return -1; } +int +POSIX_lstat(int *errnop, const char *file, void *pstat) +{ + return POSIX_stat(errnop, file, pstat); +} + int POSIX_chmod(int *errnop, const char *path, int mode) { diff --git a/sys/src/lib/posix/processes.c b/sys/src/lib/posix/processes.c index 31d0efa..e9be8f2 100644 --- a/sys/src/lib/posix/processes.c +++ b/sys/src/lib/posix/processes.c @@ -28,6 +28,17 @@ ChildList **__libposix_child_list; static PosixExitStatusTranslator __libposix_exit_status_translator; static int __libposix_wnohang; +struct timeval { + unsigned int tv_sec; + unsigned int tv_usec; +}; + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + struct timeval ru_etime; /* real elapsed time */ +}; + #define __POSIX_SIGNAL_PREFIX_LEN (sizeof(__POSIX_SIGNAL_PREFIX)-1) static int @@ -138,6 +149,32 @@ POSIX_exit(int code) exits(buf); } +int +POSIX_getrusage(int *errnop, PosixRUsages who, void *r_usagep) +{ + int32_t t[4]; + struct rusage *r_usage = r_usagep; + + times(&t[0]); + switch(who){ + case PosixRUsageSelf: + r_usage->ru_utime.tv_sec = t[0]/1000; + r_usage->ru_utime.tv_sec = (t[0]%1000)*1000; + r_usage->ru_stime.tv_sec = t[1]/1000; + r_usage->ru_stime.tv_sec = (t[1]%1000)*1000; + return 0; + case PosixRUsageChildren: + r_usage->ru_utime.tv_sec = t[2]/1000; + r_usage->ru_utime.tv_sec = (t[2]%1000)*1000; + r_usage->ru_stime.tv_sec = t[3]/1000; + r_usage->ru_stime.tv_sec = (t[3]%1000)*1000; + return 0; + default: + *errnop = __libposix_get_errno(PosixEINVAL); + return -1; + } +} + int POSIX_execve(int *errnop, const char *name, char * const*argv, char * const*env) {