libposix: implemented getcwd, getlogin, getlogin_r, getpass, pread and pwrite
This commit is contained in:
parent
5d56943666
commit
ea6b68588c
@ -21,6 +21,7 @@ typedef uint64_t uintptr;
|
|||||||
typedef uint64_t uintptr_t;
|
typedef uint64_t uintptr_t;
|
||||||
typedef uint32_t usize;
|
typedef uint32_t usize;
|
||||||
typedef __SIZE_TYPE__ size_t;
|
typedef __SIZE_TYPE__ size_t;
|
||||||
|
typedef long ssize_t;
|
||||||
typedef int32_t pid_t;
|
typedef int32_t pid_t;
|
||||||
typedef uint32_t Rune;
|
typedef uint32_t Rune;
|
||||||
typedef union FPdbleword FPdbleword;
|
typedef union FPdbleword FPdbleword;
|
||||||
|
@ -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_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_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_getpid(int *errnop);
|
||||||
extern int POSIX_getppid(int *errnop);
|
extern int POSIX_getppid(int *errnop);
|
||||||
extern int POSIX_isatty(int *errnop, int file);
|
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 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 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 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 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 clock_t POSIX_times(int *errnop, void *tms);
|
extern clock_t POSIX_times(int *errnop, void *tms);
|
||||||
|
@ -196,6 +196,46 @@ POSIX_lseek(int *errnop, int fd, off_t pos, int whence)
|
|||||||
return -1;
|
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
|
int
|
||||||
POSIX_close(int *errno, int file)
|
POSIX_close(int *errno, int file)
|
||||||
{
|
{
|
||||||
|
@ -81,3 +81,108 @@ POSIX_gettimeofday(int *errnop, void *timeval, void *timezone)
|
|||||||
*errnop = __libposix_get_errno(PosixEINVAL);
|
*errnop = __libposix_get_errno(PosixEINVAL);
|
||||||
return -1;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user