From e632a3212d1767a18a74e7a7c35f52c8a1a784d2 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 27 Jul 2013 18:23:04 +0800 Subject: [PATCH] Usermode/libposix - Hacking up some functions to compile dropbear --- Usermode/Libraries/libposix.so_src/Makefile | 3 +- Usermode/Libraries/libposix.so_src/grp.c | 50 +++++++++++++++++++ .../libposix.so_src/include_exp/grp.h | 21 ++++++++ .../libposix.so_src/include_exp/sys/wait.h | 12 +++-- .../libposix.so_src/include_exp/unistd.h | 18 +++++-- Usermode/Libraries/libposix.so_src/sys_wait.c | 27 ++++++++++ Usermode/Libraries/libposix.so_src/unistd.c | 49 ++++++++++++++++++ .../Libraries/libposix.so_src/unistd_crypt.c | 14 ++++++ 8 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 Usermode/Libraries/libposix.so_src/grp.c create mode 100644 Usermode/Libraries/libposix.so_src/sys_wait.c create mode 100644 Usermode/Libraries/libposix.so_src/unistd_crypt.c diff --git a/Usermode/Libraries/libposix.so_src/Makefile b/Usermode/Libraries/libposix.so_src/Makefile index ba1cb2fe..ce28c7e4 100644 --- a/Usermode/Libraries/libposix.so_src/Makefile +++ b/Usermode/Libraries/libposix.so_src/Makefile @@ -10,7 +10,8 @@ LDFLAGS += -soname libposix.so -Map map.txt -lc OBJ = main.o unistd.o dirent.o stat.o utmpx.o termios.o OBJ += pwd.o syslog.o sys_time.o sys_ioctl.o sys_resource.o -OBJ += fcntl.o clocks.o +OBJ += fcntl.o clocks.o sys_wait.o unistd_crypt.o +OBJ += grp.o DEPFILES := $(OBJ:%.o=%.d) BIN = libposix.so diff --git a/Usermode/Libraries/libposix.so_src/grp.c b/Usermode/Libraries/libposix.so_src/grp.c new file mode 100644 index 00000000..b3316c30 --- /dev/null +++ b/Usermode/Libraries/libposix.so_src/grp.c @@ -0,0 +1,50 @@ +/* + * Acess2 POSIX Emulation Layer + * - By John Hodge + * + * grp.c + * - Group management + */ +#include +#include +#include + +// === GLOBALS === +char *group_wheel_members[] = {"root", NULL}; +struct group group_wheel = { + .gr_name = "wheel", + .gr_password = "", + .gr_gid = 0, + .gr_mem = group_wheel_members +}; + +// === CODE === +int initgroups(const char *user, gid_t group) +{ + if( strcmp(user, "root") != 0 ) { + errno = EINVAL; + return 1; + } + + return 0; +} +struct group *getgrnam(const char *name) +{ + if( strcmp(name, group_wheel.gr_name) == 0 ) + { + return &group_wheel; + } + return NULL; +} + +struct group *getgrgid(gid_t gid) +{ + if( gid == 0 ) + return &group_wheel; + return NULL; +} + +//extern int getgrnam_r(const char *name, struct group *grp, char *buf, size_t buflen, struct group **result); +//extern int getgrgid_r(gid_t gid, struct group *grp, char *buf, size_t buflen, struct group **result); + + diff --git a/Usermode/Libraries/libposix.so_src/include_exp/grp.h b/Usermode/Libraries/libposix.so_src/include_exp/grp.h index b3d42bf7..e29d4c4d 100644 --- a/Usermode/Libraries/libposix.so_src/include_exp/grp.h +++ b/Usermode/Libraries/libposix.so_src/include_exp/grp.h @@ -5,3 +5,24 @@ * grp.h * - Group Management */ +#ifndef _LIBPOSIX__GRP_H_ +#define _LIBPOSIX__GRP_H_ + +#include + +struct group +{ + char *gr_name; + char *gr_password; + gid_t gr_gid; + char **gr_mem; // Members +}; + +extern int initgroups(const char *user, gid_t group); +extern struct group *getgrnam(const char *name); +extern struct group *getgrgid(gid_t gid); +extern int getgrnam_r(const char *name, struct group *grp, char *buf, size_t buflen, struct group **result); +extern int getgrgid_r(gid_t gid, struct group *grp, char *buf, size_t buflen, struct group **result); + +#endif + diff --git a/Usermode/Libraries/libposix.so_src/include_exp/sys/wait.h b/Usermode/Libraries/libposix.so_src/include_exp/sys/wait.h index 73e83f2a..ae29ec62 100644 --- a/Usermode/Libraries/libposix.so_src/include_exp/sys/wait.h +++ b/Usermode/Libraries/libposix.so_src/include_exp/sys/wait.h @@ -15,7 +15,13 @@ #define WUNTRACED 0x02 // POSIX, status values -#define WEXITSTATUS(v) v +#define WIFEXITED(v) (((v)>>16)==0) +#define WEXITSTATUS(v) (v&0xFF) +#define WIFSIGNALED(v) (((v)>>16)==1) +#define WTERMSIG(v) (v&0xFFF) +#define WCOREDUMP(v) (!!(v>>12)) +#define WIFSTOPPED(v) 0 +#define WSTOPSIG(v) 0 #define WIFCONTINUED(v) 0 // POSIX/XSI, waitid(options) @@ -33,11 +39,11 @@ typedef enum } idtype_t; // POSIX -extern pid_t wait(int *); +extern pid_t wait(int *status); // POSIX/XSI //extern int waitid(idtype_t, id_t, siginfo_t *, int); // POSIX -extern pid_t waitpid(pid_t, int *, int); +extern pid_t waitpid(pid_t pid, int *status, int options); #endif diff --git a/Usermode/Libraries/libposix.so_src/include_exp/unistd.h b/Usermode/Libraries/libposix.so_src/include_exp/unistd.h index 118cdfe6..b0b83749 100644 --- a/Usermode/Libraries/libposix.so_src/include_exp/unistd.h +++ b/Usermode/Libraries/libposix.so_src/include_exp/unistd.h @@ -68,15 +68,27 @@ extern int chmod(const char *path, mode_t mode); extern pid_t setsid(void); extern uid_t getuid(void); +//extern int setuid(uid_t uid); extern uid_t geteuid(void); extern pid_t getpid(void); +extern int seteuid(uid_t euid); +extern int setegid(gid_t egid); +//extern int setgid(gid_t gid); + +typedef uint32_t useconds_t; + +extern unsigned int sleep(unsigned int seconds); +extern int usleep(useconds_t usec); + +// - crypt.c +extern char *crypt(const char *key, const char *salt); + // signal.h / sys/types.h -#define SIGWINCH 101 -#define SIGTSTP 102 extern int kill(pid_t pid, int sig); -extern int chdir(const char *dir); +extern int chdir(const char *dir); +extern int rmdir(const char *pathname); // Deprecated POSIX.1-2001 #define PASS_MAX 63 diff --git a/Usermode/Libraries/libposix.so_src/sys_wait.c b/Usermode/Libraries/libposix.so_src/sys_wait.c new file mode 100644 index 00000000..74966d3d --- /dev/null +++ b/Usermode/Libraries/libposix.so_src/sys_wait.c @@ -0,0 +1,27 @@ +/* + * Acess2 POSIX Emulation + * - By John Hodge (thePowersGang) + * + * sys_wait.c + * - Waiting + */ +#include +#include +#include + +// === CODE === +pid_t wait(int *status) +{ + return _SysWaitTID(0, status); +} + +pid_t waitpid(pid_t pid, int *status, int options) +{ + if( options & WNOHANG ) { + _SysDebug("TODO: support waitpid(...,WNOHANG)"); + errno = EINVAL; + return -1; + } + return _SysWaitTID(pid, status); +} + diff --git a/Usermode/Libraries/libposix.so_src/unistd.c b/Usermode/Libraries/libposix.so_src/unistd.c index 09b603ce..545ef164 100644 --- a/Usermode/Libraries/libposix.so_src/unistd.c +++ b/Usermode/Libraries/libposix.so_src/unistd.c @@ -12,6 +12,7 @@ #include #include #include +#include // === CODE === int unlink(const char *pathname) @@ -116,6 +117,18 @@ int dup2(int oldfd, int newfd) return _SysCopyFD(oldfd, newfd); } +int chown(const char *path, uid_t owner, gid_t group) +{ + _SysDebug("TODO: chown(%s, %i, %i)", path, owner, group); + errno = ENOTIMPL; + return -1; +} +int chmod(const char *path, mode_t mode) +{ + _SysDebug("TODO: chmod(%s, 0%o)", path, mode); + errno = ENOTIMPL; + return -1; +} /* * Set session ID to PID @@ -135,6 +148,10 @@ uid_t getuid(void) { return _SysGetUID(); } +gid_t getgid(void) +{ + return _SysGetGID(); +} uid_t geteuid(void) { @@ -142,6 +159,30 @@ uid_t geteuid(void) return _SysGetUID(); } +int seteuid(uid_t euid) +{ + _SysDebug("TODO: %s", __func__); + return 0; +} +int setegid(gid_t egid) +{ + _SysDebug("TODO: %s", __func__); + return 0; +} + +unsigned int sleep(unsigned int seconds) +{ + int64_t start = _SysTimestamp(); + _SysTimedSleep( seconds*1000 ); + return (_SysTimestamp() - start) / 1000; +} + +int usleep(useconds_t usec) +{ + _SysTimedSleep( (usec+999)/1000 ); + return 0; +} + int kill(pid_t pid, int signal) { // TODO: Need special handling? @@ -177,6 +218,14 @@ int chdir(const char *dir) return _SysChdir(dir); } +int rmdir(const char *pathname) +{ +// return _SysUnlink(pathname); + _SysDebug("TODO: POSIX rmdir('%s')", pathname); + errno = ENOTIMPL; + return -1; +} + int mkdir(const char *pathname, mode_t mode) { _SysDebug("TODO: POSIX mkdir('%s', 0%o)", pathname, mode); diff --git a/Usermode/Libraries/libposix.so_src/unistd_crypt.c b/Usermode/Libraries/libposix.so_src/unistd_crypt.c new file mode 100644 index 00000000..a5eebfa2 --- /dev/null +++ b/Usermode/Libraries/libposix.so_src/unistd_crypt.c @@ -0,0 +1,14 @@ +/* + * Acess2 POSIX Emulation + * - By John Hodge (thePowersGang) + * + * unistd_crypt.c + * - crypt(3) + */ +#include + +// === CODE === +char *crypt(const char *key, const char *salt) +{ + return "YIH14pBTDJvJ6"; // 'password' with the salt YI +} -- 2.20.1