New repo setup

This commit is contained in:
2024-05-28 17:19:44 -05:00
commit 5436c4c2ea
20 changed files with 974 additions and 0 deletions

89
init.cpp Normal file
View File

@@ -0,0 +1,89 @@
#include <stdio.h>
#include <sys/syscall.h>
#include <stddef.h>
#include <unistd.h>
#include <stdlib.h>
char **envp_global;
int pipefd_stdout[2];
int pipefd_stdin[2];
void shellThread(void *ptr)
{
fddup(pipefd_stdout[1], 1);
fddup(pipefd_stdin[0], 0);
char *args[] = {"/bin/shell", NULL};
// exec("/bin/shell", args, envp);
execve("shell", args, envp_global);
terminate();
}
int main(int argc, char **argv, char **envp)
{
const int stackSize = 1024;
printf("%s: Starting shell\n", argv[0]);
void *stack = malloc(stackSize);
envp_global = envp;
printf("%s: Creating pipes\n", argv[0]);
create_pipe(pipefd_stdout);
create_pipe(pipefd_stdin);
printf("%s: Spawning new thread\n", argv[0]);
clone(shellThread, stack + stackSize, nullptr, 0);
printf("%s: Entering I/O loop\n", argv[0]);
char line[1024];
char buffer[1024];
int pos = 0;
while (true)
{
// printf("init: I/O loop\n");
int status = read(0, &buffer[pos], 1);
// printf("init: Read status: %d\n", status);
while (status > 0)
{
char str[2];
str[0] = buffer[pos];
str[1] = '\0';
printf("%s", str);
if (str[0] == '\r')
{
printf("\n");
}
pos += status;
if (buffer[pos - 1] == '\r')
{
buffer[pos - 1] = '\n';
buffer[pos] = '\0';
fprintf(&pipefd_stdin[1], "%s", buffer);
pos = 0;
}
else if (pos == 1023)
{
buffer[pos] = '\0';
fprintf(&pipefd_stdin[1], "%s", buffer);
pos = 0;
}
status = read(0, &buffer[pos], 1);
}
if (status < 0)
{
printf("init: Error reading from UART.\n");
}
status = read(pipefd_stdout[0], line, 1023);
// printf("init: Read2 status: %d\n", status);
if (status > 0)
{
line[status] = '\0';
printf("%s", line);
}
yield();
// printk("hi");
}
}