summaryrefslogtreecommitdiff
path: root/src/user/yosh
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/yosh')
-rw-r--r--src/user/yosh/Makefile6
-rw-r--r--src/user/yosh/main.c368
2 files changed, 0 insertions, 374 deletions
diff --git a/src/user/yosh/Makefile b/src/user/yosh/Makefile
deleted file mode 100644
index 9879a73..0000000
--- a/src/user/yosh/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-Obj = main.o
-Out = yosh.elf
-
-include $(SrcPath)/user/app_common.make
-
-LDFLAGS += -Map test.map
diff --git a/src/user/yosh/main.c b/src/user/yosh/main.c
deleted file mode 100644
index d334d1e..0000000
--- a/src/user/yosh/main.c
+++ /dev/null
@@ -1,368 +0,0 @@
-#include <tce/syscall.h>
-#include <tce/vfs.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <readline.h>
-
-FILE cwd_f;
-char *cwd;
-
-void about() {
- print("Trivial/Computing Environment v0.1.0 - yosh 3.\n");
-}
-
-void help(char *args[]) {
- if (args[1] == 0) {
- print("Available commands: about, help, exit, ls, cd, goto.\n");
- } else if (strcmp(args[1], "about") == 0) {
- print("Usage:\tabout\nShows some info about yosh. Very usefull.\n");
- } else if (strcmp(args[1], "help") == 0) {
- print("Usage:\thelp\n\thelp <command>\n");
- print("Shows some info about the command you want, or commands in general.\n");
- } else if (strcmp(args[1], "exit") == 0) {
- print("Usage:\texit\n");
- print("Exits the shell.\nWill probably make your system panic if you only have a shell running.\n");
- } else if (strcmp(args[1], "cd") == 0) {
- print("Usage:\tcd <location>\nGoes to the location specified.\n");
- } else if (strcmp(args[1], "ls") == 0) {
- print("Usage:\tls\n\tls <location>...\nShows the content of the current/specified directory.\n");
- } else if (strcmp(args[1], "goto") == 0) {
- print("Usage:\tgoto <vt name>\nSwitchs focus to specified virtual terminal.\n");
- print("Type `ls /.ui` to see available terminals.\n");
- } else {
- printf("No such command: %s\n", args[1]);
- }
-}
-
-void simplify_path(char* p) {
- char *it = p;
- char *member = it;
- while (*it != 0) {
- if (*it == '/') {
- if (it == member && it != p) {
- // two consecutive slashes
- char *i = member;
- while (1) {
- i[0] = i[1];
- if (i[0] == 0) break;
- i++;
- }
- } else {
- *it = 0;
- if (strcmp(member, ".") == 0) {
- char *i = member;
- while (1) {
- i[0] = i[2];
- if (i[0] == 0) break;
- i++;
- }
- } else if (strcmp(member, "..") == 0) {
- *it = '/';
- char* start = member - 2;
- char* next = member + 3;
- while (start > p && *start != '/') {
- start--;
- }
- start++;
- it = member = start;
- while (1) {
- *start = *next;
- if (*start == 0) break;
- start++;
- next++;
- }
- } else {
- *it = '/';
- it++;
- member = it;
- }
- }
- } else {
- it++;
- }
- }
-}
-
-char* path_cat (char* a, char* b, int trailing_slash) {
- char* ret;
- if (b[0] == '/') {
- int lb = strlen(b);
- ret = (char*)malloc(lb + 2);
- memcpy(ret, b, lb);
- if (ret[lb - 1] != '/') {
- ret[lb] = '/';
- lb++;
- }
- ret[lb] = 0;
- } else {
- int la = strlen(a);
- int lb = strlen(b);
-
- ret = (char*)malloc(la + lb + 3);
- memcpy(ret, a, la);
- if (ret[la-1] != '/') {
- ret[la] = '/';
- la++;
- }
- memcpy(ret + la, b, lb);
- if (ret[la + lb - 1] != '/') {
- ret[la + lb] = '/';
- lb++;
- }
- ret[la + lb] = 0;
- }
- simplify_path(ret);
- if (!trailing_slash) {
- int l = strlen(ret);
- if (ret[l-1] == '/') ret[l-1] = 0;
- }
- return ret;
-}
-
-void cd(char **args) {
- if (args[1] == 0) {
- print("Usage: cd <directory>\n");
- }
- if (strcmp(args[1], ".") == 0) return;
-
- char* newcwd = path_cat(cwd, args[1], 1);
-
- file_info info;
- int i = stat(newcwd, &info);
- if (i == E_NOT_FOUND) {
- print("No such file or directory.\n");
- free(newcwd);
- } else if (i < 0) {
- printf("Error stating: %i\n", i);
- free(newcwd);
- } else if ((info.type & FT_DIR) == 0) {
- print("Not a directory.\n");
- free(newcwd);
- } else {
- FILE nf = open(newcwd, 0);
- if (nf < 0) {
- printf("Error opening: %i\n", nf);
- free(newcwd);
- } else {
- free(cwd);
- cwd = newcwd;
- close(cwd_f);
- cwd_f = nf;
- }
- }
-}
-
-void ls_dir(FILE f) {
- file_info info;
- int i = 0;
- char buf[256];
- while (read(f, i, 256, buf) > 0) {
- i++;
-
- if (strcmp(buf, ".") == 0 || strcmp(buf, "..") == 0) continue;
-
- printf(" %s", buf);
-
- stat_relative(f, buf, &info);
- if (info.type & FT_DIR) print("/");
- print(" \t");
-
- if (info.type & FT_FILE) print("file ");
- if (info.type & FT_DIR) print("dir ");
- if (info.type & FT_SYMLINK) print("symlink ");
- if (info.type & FT_DEV) print("dev ");
- if (info.type & FT_TERMINAL) print("term ");
-
- print("\t");
- if (info.type & FT_TERMINAL) {
- printf("%ix%i", info.size >> 16, info.size & 0xFFFF);
- } else if ((info.type & FT_DEV) == 0) {
- printf("%i", info.size);
- }
-
- print("\n");
- }
-}
-
-void ls(char **args) {
- if (args[1] == 0) {
- ls_dir(cwd_f);
- } else {
- int i;
- for (i = 1; args[i] != 0; i++) {
- printf("Contents of %s :\n", args[i]);
- char* d = path_cat(cwd, args[i], 1);
- file_info info;
- int e = stat(d, &info);
- if (e == E_NOT_FOUND) {
- print(" No such file or directory\n");
- } else if (e < 0) {
- printf(" Error stating: %i\n", e);
- } else if ((info.type & FT_DIR) == 0) {
- printf(" Not a directory.\n");
- } else {
- FILE ff = open(d, 0);
- if (ff < 0) {
- printf(" Error opening: %i\n", ff);
- } else {
- ls_dir(ff);
- close(ff);
- }
- }
- free(d);
- }
- }
-}
-
-void cat(char **args) {
- int i;
- for (i = 1; args[i] != 0; i++) {
- char *d = path_cat(cwd, args[i], 0);
- file_info info;
- int e = stat(d, &info);
- if (e == E_NOT_FOUND) {
- printf("No such file: %s\n", d);
- } else if (e < 0) {
- printf("Error stating %s : %i\n", d, e);
- } else if ((info.type & FT_FILE) == 0) {
- printf("Not a file: %s\n", d);
- } else {
- FILE ff = open(d, 0);
- char* buff = (char*)malloc(info.size);
- read(ff, 0, info.size, buff);
- close(ff);
- write(term, 0, info.size, buff);
- free(buff);
- }
- }
-}
-
-void t_goto(char** args) {
- if (args[1] == 0) {
- print("Usage: goto <vt_name>\n");
- return;
- }
- char* p = path_cat("/.ui/", args[1], 0);
- int i;
- if ((i = link(p, "/.dev/vgatxt", LM_OUTPUT_TO)) == 0) {
- link("/.dev/ps2kbd", p, LM_OUTPUT_TO);
- } else {
- printf("Error %i\n", i);
- }
-}
-
-int main(char **sh_args) {
- about();
-
- cwd = strdup("/");
- cwd_f = open(cwd, 0);
-
- char *path = path_cat(sh_args[0], "..", 1);
-
- int bg_pr[128], bg_pr_c = 0;
-
- readline_history h; h.str = 0; h.max = 4;
-
- while (1) {
- printf("\x1b[33m %s \x1b[1m", cwd);
-
- char *s = readline(term, &h);
- printf("\x1b[0m");
- if (s == 0) return -1;
- if (*s == 0) continue;
-
- char *c_args[16] = {0}, *cmd;
- c_args[0] = s;
- int argc = 1;
- for (cmd = s; *cmd != 0; cmd++) {
- if (*cmd == ' ') {
- *cmd = 0;
- if (cmd[1] != ' ' && cmd[1] != 0) {
- c_args[argc] = cmd + 1;
- argc++;
- if (argc == 15) break;
- }
- }
- }
-
- if (strcmp(c_args[0], "about") == 0) {
- about();
- } else if (strcmp(c_args[0], "help") == 0) {
- help(c_args);
- } else if (strcmp(c_args[0], "exit") == 0) {
- print("Exiting the shell. See you later!\n");
- break;
- } else if (strcmp(c_args[0], "cd") == 0) {
- cd(c_args);
- } else if (strcmp(c_args[0], "ls") == 0) {
- ls(c_args);
- } else if (strcmp(c_args[0], "goto") == 0) {
- t_goto(c_args);
- } else if (strcmp(c_args[0], "cat") == 0) {
- cat(c_args);
- } else {
- FILE vt = term;
- char *t = 0;
- if (strcmp(c_args[0], "on") == 0) {
- if (c_args[1] == 0 || c_args[2] == 0) {
- printf("Usage:\ton <vt> <command>\n");
- continue;
- }
- t = path_cat("/.ui/", c_args[1], 0);
- vt = open(t, 0);
- if (vt < 0 || vt == term) {
- printf("Error: cannot open terminal %s (%i)\n", t, vt);
- free(t);
- continue;
- }
- int i = 0;
- while (1) {
- c_args[i] = c_args[i+2];
- if (c_args[i] == 0) break;
- i++;
- }
- }
-
- char *c;
- if (strchr(c_args[0], '/')) {
- c = path_cat(cwd, c_args[0], 0);
- } else {
- c = path_cat(path, c_args[0], 0);
- }
- int pid = run(c, c_args + 1, vt);
- if (pid <= 0) {
- if (pid == E_NOT_FOUND) {
- printf("Error: no such file %s\n", c);
- } else {
- printf("Error %i\n", pid);
- }
- } else {
- if (vt == term) {
- int ret = waitpid(pid, 1);
- printf(" -> child (pid %i) exited with status %i\n", pid, ret);
- } else {
- printf(" -> running on terminal %s, pid:%i\n", t, pid);
- bg_pr[bg_pr_c++] = pid;
- free(t);
- }
- }
- free(c);
- }
-
- for (; s < cmd; s++) if (*s == 0) *s = ' ';
-
- int i = 0;
- while (i < bg_pr_c) {
- int ret = waitpid(bg_pr[i], 0);
- if (ret != E_NOT_FINISHED) {
- printf(" -> child (pid %i) exited with status %i\n", bg_pr[i], ret);
- bg_pr_c--;
- bg_pr[i] = bg_pr[bg_pr_c];
- } else {
- i++;
- }
- }
- }
-
- return 0;
-}