OrionUserland
Barry Importing existing Orion Userland 19aefaa (3 years, 3 months ago)
diff --git a/login/Makefile b/login/Makefile
new file mode 100644
index 0000000..5254c7c
--- /dev/null
+++ b/login/Makefile
@@ -0,0 +1,46 @@
+PRODUCT=$(notdir $(abspath $(CURDIR)))
+
+CC=i686-orion-gcc
+CFLAGS=
+
+AS=i686-orion-as
+AFLAGS=
+
+LD=i686-orion-gcc
+LFLAGS=
+
+AS_SOURCES := $(shell find . -name '*.S')
+OBJS = $(sort $(subst ./,build/,$(subst .S,.o,$(AS_SOURCES))))
+
+C_SOURCES := $(shell find . -name '*.c')
+OBJS += $(sort $(subst ./,build/,$(subst .c,.o,$(C_SOURCES))))
+
+.PHONY: clean all install
+
+all: $(PRODUCT)
+
+clean:
+ @echo "REMOVING OBJECT FILES"
+ @mkdir -p build
+ @rm -rf build
+ @touch $(PRODUCT)
+ @rm $(PRODUCT)
+
+install: $(PRODUCT)
+ @echo "INSTALLING $^"
+ @mkdir -p ${SYSROOT}/bin/
+ @install -Dm 755 $(PRODUCT) -t ${SYSROOT}/bin/
+
+$(PRODUCT): $(OBJS)
+ @echo "LINKING $@"
+ @$(LD) -o $@ $^ $(LFLAGS)
+
+build/%.o: %.c
+ @echo "COMPILING $<"
+ @mkdir -p $(@D)
+ @$(CC) -c $< -o $@ $(CFLAGS)
+
+build/%.o: %.S
+ @echo "ASSEMBLING $<"
+ @mkdir -p $(@D)
+ @$(AS) $< -o $@ $(AFLAGS)
diff --git a/login/login b/login/login
new file mode 100755
index 0000000..b45884b
Binary files /dev/null and b/login/login differ
diff --git a/login/main.c b/login/main.c
new file mode 100644
index 0000000..d1bfd55
--- /dev/null
+++ b/login/main.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+#include <pwd.h>
+
+#define MANUAL_LOGIN
+
+/* Main function */
+int
+main(int argc, char *argv[])
+{
+ int fd, sz;
+ char *buf, *line, *input = malloc(1024);
+
+ Passwd *pwd;
+ Termios tcold, tcnew;
+
+ while (1) {
+ printf("\nUsername: ");
+ memset(input, 0, 1024);
+#ifdef MANUAL_LOGIN
+ sz = read(STDIN_FILENO, input, 1024);
+#else
+ printf("root\n");
+ sz = 5;
+ memcpy(input, "root", 5);
+#endif
+ input[--sz] = '\0';
+ if (sz < 1)
+ continue;
+
+ pwd = getpwname(input);
+ if (!pwd)
+ continue;
+
+ printf("Password: ");
+ memset(input, 0, 1024);
+ ioctl(STDIN_FILENO, TCGETS, &tcold);
+ memcpy(&tcnew, &tcold, sizeof(Termios));
+ tcnew.lflag &= ~ECHO;
+ ioctl(STDIN_FILENO, TCSETS, &tcnew);
+#ifdef MANUAL_LOGIN
+ sz = read(STDIN_FILENO, input, 1024);
+#else
+ printf("password\n");
+ sz = 9;
+ memcpy(input, "password", 9);
+#endif
+ input[--sz] = '\0';
+ if (sz < 1)
+ continue;
+ ioctl(STDIN_FILENO, TCSETS, &tcold);
+
+ if (!strcmp(input, pwd->password))
+ break;
+ printf("Login incorrect\n");
+ }
+ printf("\n");
+
+ dbgprintf("Authenticating \"%s\" (%d:%d) -> \"%s\" @ \"%s\"",
+ pwd->username, pwd->uid, pwd->gid, pwd->shell, pwd->homedir);
+ chdir(pwd->homedir);
+ setuid(pwd->uid);
+ setgid(pwd->gid);
+ char *v[] = { "sh", NULL };
+ execve(pwd->shell, v, NULL);
+
+ return 0;
+}