diff --git a/arch/amd64/include/u.h b/arch/amd64/include/u.h index 8e51db2..eb2bb53 100644 --- a/arch/amd64/include/u.h +++ b/arch/amd64/include/u.h @@ -21,6 +21,7 @@ typedef uint64_t uintptr; typedef uint64_t uintptr_t; typedef uint32_t usize; typedef __SIZE_TYPE__ size_t; +typedef long ssize_t; typedef int32_t pid_t; typedef uint32_t Rune; typedef union FPdbleword FPdbleword; diff --git a/sys/include/posix.h b/sys/include/posix.h index 1f3d006..81842a5 100644 --- a/sys/include/posix.h +++ b/sys/include/posix.h @@ -40,6 +40,10 @@ 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 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); +extern char* POSIX_getpass(int *errnop, const char *prompt); extern int POSIX_getpid(int *errnop); extern int POSIX_getppid(int *errnop); extern int POSIX_isatty(int *errnop, int file); @@ -47,6 +51,8 @@ extern int POSIX_kill(int *errnop, int pid, int sig); extern int POSIX_link(int *errnop, const char *old, const char *new); extern off_t POSIX_lseek(int *errnop, int fd, off_t pos, int whence); extern int POSIX_open(int *errnop, const char *name, int flags, int mode); +extern long POSIX_pread(int *errnop, int fd, char *buf, size_t len, off_t offset); +extern long POSIX_pwrite(int *errnop, int fd, const char *buf, size_t len, off_t 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 clock_t POSIX_times(int *errnop, void *tms); diff --git a/sys/src/lib/posix/files.c b/sys/src/lib/posix/files.c index edea7b6..0d07149 100644 --- a/sys/src/lib/posix/files.c +++ b/sys/src/lib/posix/files.c @@ -196,6 +196,46 @@ POSIX_lseek(int *errnop, int fd, off_t pos, int whence) return -1; } +long +POSIX_pread(int *errnop, int fd, char *buf, size_t len, long offset) +{ + long r; + + if(fd < 0){ + *errnop = __libposix_get_errno(PosixEBADF); + return -1; + } +OnIgnoredSignalInterrupt: + r = sys_pread(fd, buf, len, offset); + if(r < 0){ + if(__libposix_restart_syscall()) + goto OnIgnoredSignalInterrupt; + *errnop = __libposix_translate_errstr((uintptr_t)POSIX_read); + return -1; + } + return r; +} + +long +POSIX_pwrite(int *errnop, int fd, const void *buf, size_t len, long offset) +{ + long w; + + if(fd < 0){ + *errnop = __libposix_get_errno(PosixEBADF); + return -1; + } +OnIgnoredSignalInterrupt: + w = sys_pwrite(fd, buf, len, offset); + if(w < 0){ + if(__libposix_restart_syscall()) + goto OnIgnoredSignalInterrupt; + *errnop = __libposix_translate_errstr((uintptr_t)POSIX_write); + return -1; + } + return w; +} + int POSIX_close(int *errno, int file) { diff --git a/sys/src/lib/posix/others.c b/sys/src/lib/posix/others.c index 68b73c7..94c29cb 100644 --- a/sys/src/lib/posix/others.c +++ b/sys/src/lib/posix/others.c @@ -81,3 +81,108 @@ POSIX_gettimeofday(int *errnop, void *timeval, void *timezone) *errnop = __libposix_get_errno(PosixEINVAL); return -1; } + +char* +POSIX_getlogin(int *errnop) +{ + return jehanne_getuser(); +} + +int +POSIX_getlogin_r(int *errnop, char *name, int namesize) +{ + static char user[64]; + int fd; + int n; + + fd = open("/dev/user", OREAD); + if(fd < 0) + goto None; + n = read(fd, user, (sizeof user)-1); + close(fd); + if(n <= 0) + goto None; + if(namesize < n){ + *errnop = __libposix_get_errno(PosixERANGE); + return __libposix_get_errno(PosixERANGE); + } + user[n] = 0; + return 0; +None: + if(namesize < 5){ + *errnop = __libposix_get_errno(PosixERANGE); + return __libposix_get_errno(PosixERANGE); + } + jehanne_strcpy(name, "none"); + name[5] = 0; + return 0; +} + +char* +POSIX_getcwd(int *errnop, char *buf, int size) +{ + long len; + if(buf == nil || size <= 0){ + *errnop = __libposix_get_errno(PosixEINVAL); + return nil; + } + len = jehanne_getwd(buf, size); + if(len == 0){ + *errnop = __libposix_get_errno(PosixEACCES); + return nil; + } + if(len < 0){ + *errnop = __libposix_get_errno(PosixERANGE); + return nil; + } + return buf; +} + +char* +POSIX_getpass(int *errnop, const char *prompt) +{ + int r, w, ctl; + char *p; + static char buf[256]; + + if(fd2path(0, buf, sizeof(buf)) == 0 && strcmp("/dev/cons", buf) == 0) + r = 0; + else if((r = open("/dev/cons", OREAD)) < 0) + goto ReturnENXIO; + + if(fd2path(1, buf, sizeof(buf)) == 0 && strcmp("/dev/cons", buf) == 0) + w = 1; + else if((w = open("/dev/cons", OWRITE)) < 0) + goto CloseRAndReturnENXIO; + + if((ctl = open("/dev/consctl", OWRITE)) < 0) + goto CloseRWAndReturnENXIO; + + fprint(w, "%s", prompt); + + write(ctl, "rawon", 5); + p = buf; + while(p < buf+sizeof(buf)-1 && read(r, p, 1) == 1){ + if(*p == '\n') + break; + if(*p == ('u' & 037)) + p = buf; + else if(*p == '\b'){ + if (p > buf) + --p; + } else + ++p; + } + *p = '\0'; + write(ctl, "rawoff", 6); + + return buf; + +CloseRWAndReturnENXIO: + close(w); +CloseRAndReturnENXIO: + close(r); +ReturnENXIO: + *errnop = __libposix_get_errno(PosixENXIO); + return nil; +}