Updated the CLI Shell to use the new path, adding login to git
authorJohn Hodge <[email protected]>
Wed, 30 Sep 2009 14:31:56 +0000 (22:31 +0800)
committerJohn Hodge <[email protected]>
Wed, 30 Sep 2009 14:31:56 +0000 (22:31 +0800)
Usermode/Applications/CLIShell_src/main.c
Usermode/Applications/login_src/Makefile [new file with mode: 0644]
Usermode/Applications/login_src/database_tpl.c [new file with mode: 0644]
Usermode/Applications/login_src/main.c [new file with mode: 0644]

index 4fe8a4a..dbe18c5 100644 (file)
@@ -28,7 +28,7 @@ struct        {
        {"colour", Command_Colour}, {"clear", Command_Clear},\r
        {"cd", Command_Cd}, {"dir", Command_Dir}\r
 };\r
        {"colour", Command_Colour}, {"clear", Command_Clear},\r
        {"cd", Command_Cd}, {"dir", Command_Dir}\r
 };\r
-static char    *cDEFAULT_PATH[] = {"/Acess"};\r
+static char    *cDEFAULT_PATH[] = {"/Acess/Bin"};\r
 #define        BUILTIN_COUNT   (sizeof(cBUILTINS)/sizeof(cBUILTINS[0]))\r
 \r
 // ==== LOCAL VARIABLES ====\r
 #define        BUILTIN_COUNT   (sizeof(cBUILTINS)/sizeof(cBUILTINS[0]))\r
 \r
 // ==== LOCAL VARIABLES ====\r
diff --git a/Usermode/Applications/login_src/Makefile b/Usermode/Applications/login_src/Makefile
new file mode 100644 (file)
index 0000000..83d9d7a
--- /dev/null
@@ -0,0 +1,33 @@
+#
+#
+#
+
+DBTYPE = tpl
+
+CC = gcc
+AS = nasm
+LD = ld
+RM = rm -f
+
+ASFLAGS = -felf
+CPPFLAGS = -I../../include
+CFLAGS = -fno-stack-protector -Wall -Werror -O3 $(CPPFLAGS)
+LDFLAGS = -I/Acess/Libs/ld-acess.so -L../../Libraries ../../Libraries/crt0.o -lacess -lgcc -lc
+
+OBJ = main.o database_$(DBTYPE).o
+BIN = ../login
+
+.PHONY: all clean
+
+all: $(BIN)
+
+clean:
+       $(RM) $(BIN) $(OBJ)
+
+$(BIN): $(OBJ)
+       $(LD) $(LDFLAGS) $(OBJ) -o $(BIN)
+       cp $(BIN) /mnt/AcessHDD/Acess2/SBin/
+       objdump -d ../login > login.dsm
+
+%.o: %.c Makefile
+       $(CC) $(CFLAGS) -c $< -o $@
diff --git a/Usermode/Applications/login_src/database_tpl.c b/Usermode/Applications/login_src/database_tpl.c
new file mode 100644 (file)
index 0000000..de903d5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Acess 2 Login
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include "header.h"
+
+// === CONSTANTS ===
+
+// === PROTOTYPES ===
+ int   ValidateUser(char *Username, char *Password);
+tUserInfo      *GetUserInfo(int UID);
+
+// === GLOBALS ===
+tUserInfo      gUserInfo;
+
+// === CODE ===
+/**
+ * \fn int ValidateUser(char *Username, char *Password)
+ * \brief Validates a users credentials
+ * \return UID on success, -1 on failure
+ */
+int ValidateUser(char *Username, char *Password)
+{
+       if(Username == NULL)    return -1;
+       if(Password == NULL)    return -1;
+       if(strcmp(Username, "root") == 0)       return 0;
+       return -1;
+}
+
+/**
+ * \fn void GetUserInfo(int UID)
+ * \brief Gets a users information
+ */
+tUserInfo *GetUserInfo(int UID)
+{
+       if(UID != 0)    return NULL;
+       
+       gUserInfo.UID = 0;
+       gUserInfo.GID = 0;
+       gUserInfo.Shell = "/Acess/Bin/CLIShell";
+       gUserInfo.Home = "/Acess/Root";
+       return &gUserInfo;
+}
+
diff --git a/Usermode/Applications/login_src/main.c b/Usermode/Applications/login_src/main.c
new file mode 100644 (file)
index 0000000..5453283
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Acess 2 Login
+ */
+#include "header.h"
+
+// === CONSTANTS ===
+#define BUFLEN 1024
+
+// === PROTOTYPES ===
+char   *GetUsername();
+char   *GetPassword();
+
+// === CODE ===
+int main(int argc, char *argv[])
+{
+       char    *sUsername, *sPassword;
+        int    pid, uid;
+        int    status = 0;
+       tUserInfo       *uinfo;
+       
+       putchar('\n');
+       for(;;)
+       {
+               // Validate User
+               do {
+                       sUsername = GetUsername();
+                       sPassword = GetPassword();
+               } while( (uid = ValidateUser(sUsername, sPassword)) == -1 );
+               putchar('\n');
+               
+               // Get user information
+               uinfo = GetUserInfo(uid);
+               
+               // Create child process
+               pid = clone(CLONE_VM, 0);
+               // Error check
+               if(pid == -1) {
+                       fprintf(stderr, "Unable to fork the login process!\n");
+                       return -1;
+               }
+               
+               // Spawn shell in a child process
+               if(pid == 0)
+               {
+                       char    *argv[2] = {uinfo->Shell, 0};
+                       char    **envp = NULL;
+                       setgid(uinfo->GID);
+                       setuid(uid);
+                       
+                       execve(uinfo->Shell, argv, envp);
+                       exit(-1);
+               }
+               
+               // Wait for child to terminate
+               waittid(pid, &status);
+       }
+       
+       return 0;
+}
+
+/**
+ * \fn char *GetUsername()
+ */
+char *GetUsername()
+{
+       char    ret[BUFLEN];
+        int    pos = 0;
+       char    ch;
+       
+       // Prompt the user
+       printf("Username: ");
+       
+       // Read in text
+       while( (ch = fgetc(stdin)) != -1 && ch != '\n' )
+       {
+               if(ch == '\b') {
+                       pos --;
+                       ret[pos] = '\0';
+               }
+               else
+                       ret[pos++] = ch;
+               
+               // Echo out to the screen
+               fputc(ch, stdout);
+               
+               if(pos == BUFLEN-1)     break;
+       }
+       
+       // Finish String
+       ret[pos] = '\0';
+       
+       printf("\n");
+       return strdup(ret);
+}
+
+/**
+ * \fn char *GetPassword()
+ */
+char *GetPassword()
+{
+       char    ret[BUFLEN];
+        int    pos = 0;
+       char    ch;
+       
+       // Prompt the user
+       printf("Password: ");
+       
+       // Read in text
+       while( (ch = fgetc(stdin)) != -1 && ch != '\n' )
+       {
+               if(ch == '\b') {
+                       pos --;
+                       ret[pos] = '\0';
+               }
+               else
+                       ret[pos++] = ch;
+               
+               // Don't echo out to the screen
+               //fputc(stdout, ch);
+               
+               if(pos == BUFLEN-1)     break;
+       }
+       
+       ret[pos] = '\0';
+       
+       printf("\n");
+       return strdup(ret);
+}

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