BarryServer : Git

All the code for all my projects
// BarryServer : Git / OrionUserland / commit / 19aefaad8af9de8719ba1e5b5340e0a1b9c68853 / login

// Related

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;
+}