Usermode/libposix - Hacking up some functions to compile dropbear
authorJohn Hodge <[email protected]>
Sat, 27 Jul 2013 10:23:04 +0000 (18:23 +0800)
committerJohn Hodge <[email protected]>
Sat, 27 Jul 2013 10:23:04 +0000 (18:23 +0800)
Usermode/Libraries/libposix.so_src/Makefile
Usermode/Libraries/libposix.so_src/grp.c [new file with mode: 0644]
Usermode/Libraries/libposix.so_src/include_exp/grp.h
Usermode/Libraries/libposix.so_src/include_exp/sys/wait.h
Usermode/Libraries/libposix.so_src/include_exp/unistd.h
Usermode/Libraries/libposix.so_src/sys_wait.c [new file with mode: 0644]
Usermode/Libraries/libposix.so_src/unistd.c
Usermode/Libraries/libposix.so_src/unistd_crypt.c [new file with mode: 0644]

index ba1cb2f..ce28c7e 100644 (file)
@@ -10,7 +10,8 @@ LDFLAGS  += -soname libposix.so -Map map.txt -lc
 \r
 OBJ  = main.o unistd.o dirent.o stat.o utmpx.o termios.o\r
 OBJ += pwd.o syslog.o sys_time.o sys_ioctl.o sys_resource.o\r
-OBJ += fcntl.o clocks.o\r
+OBJ += fcntl.o clocks.o sys_wait.o unistd_crypt.o\r
+OBJ += grp.o\r
 DEPFILES := $(OBJ:%.o=%.d)\r
 BIN = libposix.so\r
 \r
diff --git a/Usermode/Libraries/libposix.so_src/grp.c b/Usermode/Libraries/libposix.so_src/grp.c
new file mode 100644 (file)
index 0000000..b3316c3
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Acess2 POSIX Emulation Layer
+ * - By John Hodge
+ * 
+ * grp.c
+ * - Group management
+ */
+#include <grp.h>
+#include <string.h>
+#include <errno.h>
+
+// === 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);
+
+
index b3d42bf..e29d4c4 100644 (file)
@@ -5,3 +5,24 @@
  * grp.h
  * - Group Management
  */
+#ifndef _LIBPOSIX__GRP_H_
+#define _LIBPOSIX__GRP_H_
+
+#include <sys/types.h>
+
+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
+
index 73e83f2..ae29ec6 100644 (file)
 #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
index 118cdfe..b0b8374 100644 (file)
@@ -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 (file)
index 0000000..74966d3
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Acess2 POSIX Emulation
+ * - By John Hodge (thePowersGang)
+ *
+ * sys_wait.c
+ * - Waiting
+ */
+#include <sys/wait.h>
+#include <acess/sys.h>
+#include <errno.h>
+
+// === 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);
+}
+
index 09b603c..545ef16 100644 (file)
@@ -12,6 +12,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <acess/devices/pty.h>
+#include <errno.h>
 
 // === 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 (file)
index 0000000..a5eebfa
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Acess2 POSIX Emulation
+ * - By John Hodge (thePowersGang)
+ *
+ * unistd_crypt.c
+ * - crypt(3)
+ */
+#include <unistd.h>
+
+// === CODE ===
+char *crypt(const char *key, const char *salt)
+{
+       return "YIH14pBTDJvJ6"; // 'password' with the salt YI
+}

UCC git Repository :: git.ucc.asn.au