libposix: implemented getcwd, getlogin, getlogin_r, getpass, pread and pwrite

This commit is contained in:
Giacomo Tesio 2017-08-21 00:20:12 +02:00
parent 5d56943666
commit ea6b68588c
4 changed files with 152 additions and 0 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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)
{

View File

@ -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;
}