\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
--- /dev/null
+/*
+ * 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);
+
+
* 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
+
#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)
} 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
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
--- /dev/null
+/*
+ * 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);
+}
+
#include <stdio.h>
#include <string.h>
#include <acess/devices/pty.h>
+#include <errno.h>
// === CODE ===
int unlink(const char *pathname)
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
{
return _SysGetUID();
}
+gid_t getgid(void)
+{
+ return _SysGetGID();
+}
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?
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);
--- /dev/null
+/*
+ * 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
+}