From 097165066c0f83c57e4f4cce02225c601deb2f02 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Mon, 31 Aug 2026 08:23:26 +0000 Subject: path --- src/eval.cc | 3 ++- src/main.cc | 8 +++++++- src/path.cc | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/path.cc (limited to 'src') diff --git a/src/eval.cc b/src/eval.cc index 369e032..4350367 100644 --- a/src/eval.cc +++ b/src/eval.cc @@ -43,12 +43,13 @@ void eval(char *cmdline) block_all(&prev); pid_t pid = fork(); + const char* cmd = find_cmd(argv[0]).c_str(); if (pid == 0) // child { sigprocmask(SIG_SETMASK, &prev, nullptr); setpgid(0, 0); - execve(argv[0], argv, environ); + execve(cmd, argv, environ); atomic_print(cmdline, true); atomic_print(": Command not found\n"); diff --git a/src/main.cc b/src/main.cc index 5a2bd71..1042cf8 100644 --- a/src/main.cc +++ b/src/main.cc @@ -22,6 +22,7 @@ #include "handler.h" #include "ground.h" #include "eval.h" +#include "path.h" using namespace std; using namespace ov4; @@ -47,13 +48,18 @@ handler_t *Signal(int signum, handler_t *handler); // built-in commands void builtin_command_quit(); - +void test() +{ + cout << find_cmd("ls") << endl; + exit(0); +} /* * main - The shell's main routine */ int main(int argc, char **argv) { + //test(); init(); char c; char cmdline[MAXLINE]; diff --git a/src/path.cc b/src/path.cc new file mode 100644 index 0000000..519fd20 --- /dev/null +++ b/src/path.cc @@ -0,0 +1,42 @@ +#include "path.h" + +namespace ov4 +{ + +using namespace std; + +string find_cmd(char* s) +{ + string tmp = s; + return find_cmd(tmp); +} + +string find_cmd(string s) +{ + if (s.size() == 0) return "/"; + if (s[0] == '/') return s; + + string path = getenv("PATH"); + size_t i = 0, j = 0, l = path.size(); + while (true) + { + for (; j < l; j++) + if (path[j] == ':') + break; + + string cmd = path.substr(i, j-i) + '/' +s; + cout << cmd << endl; + if (access(cmd.c_str(), F_OK) == 0) + return cmd; + + if (j == l) + return "/"; + + j++; + i=j; + + } +} + + +} -- cgit v1.3.1-4-g156e