libposix: add dup, dup2, getrusage, fstat and lstat
This commit is contained in:
		| @@ -82,11 +82,21 @@ struct __attribute__((__packed__)) dirent | |||||||
|  |  | ||||||
| typedef unsigned long clock_t; | typedef unsigned long clock_t; | ||||||
|  |  | ||||||
|  | typedef enum PosixRUsages | ||||||
|  | { | ||||||
|  | 	PosixRUsageSelf = 0, | ||||||
|  | 	PosixRUsageChildren = 1, | ||||||
|  |  | ||||||
|  | 	PosixRUsageUnknown = -1 | ||||||
|  | } PosixRUsages; | ||||||
|  |  | ||||||
| #define __POSIX_EXIT_PREFIX "posix error " | #define __POSIX_EXIT_PREFIX "posix error " | ||||||
| #define __POSIX_EXIT_SIGNAL_PREFIX "terminated by posix signal " | #define __POSIX_EXIT_SIGNAL_PREFIX "terminated by posix signal " | ||||||
| #define __POSIX_SIGNAL_PREFIX "posix: " | #define __POSIX_SIGNAL_PREFIX "posix: " | ||||||
|  |  | ||||||
| extern int POSIX_access(int *errnop, const char *path, int amode); | 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 void POSIX_exit(int code) __attribute__((noreturn)); | ||||||
| extern int POSIX_chmod(int *errnop, const char *path, int mode); | 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); | 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_close(int *errnop, int file); | ||||||
| extern int POSIX_execve(int *errnop, const char *name, char * const*argv, char * const*env); | extern int POSIX_execve(int *errnop, const char *name, char * const*argv, char * const*env); | ||||||
| extern int POSIX_fork(int *errnop); | 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_getcwd(int *errnop, char *buf, int size); | ||||||
| extern char* POSIX_getlogin(int *errnop); | extern char* POSIX_getlogin(int *errnop); | ||||||
| extern int POSIX_getlogin_r(int *errnop, char *name, int namesize); | 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_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 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_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 clock_t POSIX_times(int *errnop, void *tms); | ||||||
| extern int POSIX_unlink(int *errnop, const char *name); | extern int POSIX_unlink(int *errnop, const char *name); | ||||||
| extern int POSIX_wait(int *errnop, int *status); | extern int POSIX_wait(int *errnop, int *status); | ||||||
|   | |||||||
| @@ -153,6 +153,38 @@ AccessDone: | |||||||
| 	return -1; | 	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 | int | ||||||
| POSIX_pipe(int *errnop, int fildes[2]) | POSIX_pipe(int *errnop, int fildes[2]) | ||||||
| { | { | ||||||
| @@ -427,6 +459,12 @@ POSIX_stat(int *errnop, const char *file, void *pstat) | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | POSIX_lstat(int *errnop, const char *file, void *pstat) | ||||||
|  | { | ||||||
|  | 	return POSIX_stat(errnop, file, pstat); | ||||||
|  | } | ||||||
|  |  | ||||||
| int | int | ||||||
| POSIX_chmod(int *errnop, const char *path, int mode) | POSIX_chmod(int *errnop, const char *path, int mode) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -28,6 +28,17 @@ ChildList **__libposix_child_list; | |||||||
| static PosixExitStatusTranslator __libposix_exit_status_translator; | static PosixExitStatusTranslator __libposix_exit_status_translator; | ||||||
| static int __libposix_wnohang; | 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) | #define __POSIX_SIGNAL_PREFIX_LEN (sizeof(__POSIX_SIGNAL_PREFIX)-1) | ||||||
|  |  | ||||||
| static int | static int | ||||||
| @@ -138,6 +149,32 @@ POSIX_exit(int code) | |||||||
| 	exits(buf); | 	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 | int | ||||||
| POSIX_execve(int *errnop, const char *name, char * const*argv, char * const*env) | POSIX_execve(int *errnop, const char *name, char * const*argv, char * const*env) | ||||||
| { | { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user