From df87dda63ca3e363913341ac8e96f9a2523b9196 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 26 Oct 2018 11:16:56 +0200 Subject: [PATCH] Implement argc/argv support for spawned tasks. Celebrate the new functionality with a simple /bin/cat implementation. :^) --- Kernel/Syscall.cpp | 4 +++- Kernel/Syscall.h | 1 + Kernel/Task.cpp | 37 ++++++++++++++++++++++++++++++++++--- Kernel/Task.h | 7 +++++-- Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes Kernel/sync-sh | 1 + LibC/entry.cpp | 9 ++++++--- LibC/process.cpp | 4 ++-- LibC/process.h | 2 +- Userland/.gitignore | 3 ++- Userland/Makefile | 9 +++++++-- Userland/cat.cpp | 30 ++++++++++++++++++++++++++++++ Userland/sh.cpp | 15 +++++++++++++-- 13 files changed, 105 insertions(+), 17 deletions(-) create mode 100644 Userland/cat.cpp diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index df6fe77662..6dc00beb29 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -65,7 +65,7 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) case Syscall::PosixGettimeofday: return current->sys$gettimeofday((timeval*)arg1); case Syscall::Spawn: - return current->sys$spawn((const char*)arg1); + return current->sys$spawn((const char*)arg1, (const char**)arg2); case Syscall::GetDirEntries: return current->sys$get_dir_entries((int)arg1, (void*)arg2, (size_t)arg3); case Syscall::PosixLstat: @@ -108,6 +108,8 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) current->sys$exit((int)arg1); ASSERT_NOT_REACHED(); return 0; + case Syscall::GetArguments: + return current->sys$get_arguments((int*)arg1, (char***)arg2); default: kprintf("int0x80: Unknown function %x requested {%x, %x, %x}\n", function, arg1, arg2, arg3); break; diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 1c704b2fff..5f225fc12d 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -31,6 +31,7 @@ enum Function { PosixGetcwd = 0x1999, PosixGettimeofday = 0x2000, PosixGethostname = 0x2001, + GetArguments = 0x2002, }; void initialize(); diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index b505de76fc..e7abce35d2 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -185,18 +185,19 @@ int Task::sys$gethostname(char* buffer, size_t size) if (size < (hn.length() + 1)) return -ENAMETOOLONG; memcpy(buffer, hn.characters(), size); + return 0; } -int Task::sys$spawn(const char* path) +int Task::sys$spawn(const char* path, const char** args) { int error = 0; - auto* child = Task::createUserTask(path, m_uid, m_gid, m_pid, error); + auto* child = Task::createUserTask(path, m_uid, m_gid, m_pid, error, args); if (child) return child->pid(); return error; } -Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t parentPID, int& error) +Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t parentPID, int& error, const char** args) { auto parts = path.split('/'); if (parts.isEmpty()) { @@ -216,9 +217,20 @@ Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t paren return nullptr; } + Vector taskArguments; + if (args) { + for (size_t i = 0; args[i]; ++i) { + taskArguments.append(args[i]); + } + } else { + taskArguments.append(parts.last()); + } + InterruptDisabler disabler; // FIXME: Get rid of this, jesus christ. This "critical" section is HUGE. Task* t = new Task(parts.takeLast(), uid, gid, parentPID, Ring3); + t->m_arguments = move(taskArguments); + ExecSpace space; space.hookableAlloc = [&] (const String& name, size_t size) { if (!size) @@ -257,6 +269,25 @@ Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t paren return t; } +int Task::sys$get_arguments(int* argc, char*** argv) +{ + auto* region = allocateRegion(4096, "argv"); + if (!region) + return -ENOMEM; + MemoryManager::the().mapRegion(*this, *region); + char* argpage = (char*)region->linearAddress.get(); + *argc = m_arguments.size(); + *argv = (char**)argpage; + char* bufptr = argpage + (sizeof(char*) * m_arguments.size()); + for (size_t i = 0; i < m_arguments.size(); ++i) { + (*argv)[i] = bufptr; + memcpy(bufptr, m_arguments[i].characters(), m_arguments[i].length()); + bufptr += m_arguments[i].length(); + *(bufptr++) = '\0'; + } + return 0; +} + Task* Task::createKernelTask(void (*e)(), String&& name) { Task* task = new Task(move(name), (uid_t)0, (gid_t)0, (pid_t)0, Ring0); diff --git a/Kernel/Task.h b/Kernel/Task.h index 6cf40481b3..e2d9c35834 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -16,7 +16,7 @@ class Task : public InlineLinkedListNode { friend class InlineLinkedListNode; public: static Task* createKernelTask(void (*entry)(), String&& name); - static Task* createUserTask(const String& path, uid_t, gid_t, pid_t parentPID, int& error); + static Task* createUserTask(const String& path, uid_t, gid_t, pid_t parentPID, int& error, const char** args = nullptr); ~Task(); static Vector allTasks(); @@ -92,7 +92,7 @@ public: int sys$kill(pid_t pid, int sig); int sys$geterror() { return m_error; } void sys$exit(int status); - int sys$spawn(const char* path); + int sys$spawn(const char* path, const char** args); pid_t sys$waitpid(pid_t); void* sys$mmap(void*, size_t size); int sys$munmap(void*, size_t size); @@ -101,6 +101,7 @@ public: int sys$sleep(unsigned seconds); int sys$gettimeofday(timeval*); int sys$gethostname(char* name, size_t length); + int sys$get_arguments(int* argc, char*** argv); static void initialize(); @@ -170,6 +171,8 @@ private: LinearAddress m_nextRegion; pid_t m_parentPID { 0 }; + + Vector m_arguments; }; extern void task_init(); diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index 7ee095bf0e7966552f5d9161a425b8eaa1115ca9..a5772d962da950456da17abd517b6236be8f1adf 100644 GIT binary patch delta 28736 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 Nt_RA?FBCA}0RS=DXs!SN delta 70833 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 diff --git a/Kernel/sync-sh b/Kernel/sync-sh index 24ba204577..922f07931c 100755 --- a/Kernel/sync-sh +++ b/Kernel/sync-sh @@ -10,5 +10,6 @@ cp ../Userland/date mnt/bin/date cp ../Userland/true mnt/bin/true cp ../Userland/false mnt/bin/false cp ../Userland/hostname mnt/bin/hostname +cp ../Userland/cat mnt/bin/cat umount mnt sync diff --git a/LibC/entry.cpp b/LibC/entry.cpp index 2308bc453c..5d5eb27078 100644 --- a/LibC/entry.cpp +++ b/LibC/entry.cpp @@ -8,9 +8,12 @@ extern "C" int _start() { errno = 0; - // FIXME: Pass appropriate argc/argv. - int status = main(0, nullptr); - + int argc; + char** argv; + int rc = Syscall::invoke(Syscall::GetArguments, (dword)&argc, (dword)&argv); + int status = 254; + if (rc == 0) + status = main(argc, argv); Syscall::invoke(Syscall::PosixExit, status); // Birger's birthday <3 diff --git a/LibC/process.cpp b/LibC/process.cpp index 223b6871d7..eb3040b80e 100644 --- a/LibC/process.cpp +++ b/LibC/process.cpp @@ -4,9 +4,9 @@ extern "C" { -int spawn(const char* path) +int spawn(const char* path, const char** args) { - int rc = Syscall::invoke(Syscall::Spawn, (dword)path); + int rc = Syscall::invoke(Syscall::Spawn, (dword)path, (dword)args); __RETURN_WITH_ERRNO(rc, rc, -1); } diff --git a/LibC/process.h b/LibC/process.h index 2a35644085..235415469a 100644 --- a/LibC/process.h +++ b/LibC/process.h @@ -2,7 +2,7 @@ extern "C" { -int spawn(const char* path); +int spawn(const char* path, const char** args); } diff --git a/Userland/.gitignore b/Userland/.gitignore index ffdbff1187..2c52d710f8 100644 --- a/Userland/.gitignore +++ b/Userland/.gitignore @@ -1,3 +1,4 @@ +*.o id sh ps @@ -8,4 +9,4 @@ date false true hostname -*.o +cat diff --git a/Userland/Makefile b/Userland/Makefile index c5a8b4e209..d433c7422d 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -8,7 +8,8 @@ OBJS = \ date.o \ true.o \ false.o \ - hostname.o + hostname.o \ + cat.o APPS = \ id \ @@ -20,7 +21,8 @@ APPS = \ date \ true \ false \ - hostname + hostname \ + cat ARCH_FLAGS = STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib @@ -70,6 +72,9 @@ false: false.o hostname: hostname.o $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a +cat: cat.o + $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a + .cpp.o: @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< diff --git a/Userland/cat.cpp b/Userland/cat.cpp new file mode 100644 index 0000000000..ce99c6499b --- /dev/null +++ b/Userland/cat.cpp @@ -0,0 +1,30 @@ +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + if (argc != 2) { + printf("usage: cat \n"); + return 1; + } + int fd = open(argv[1]); + if (fd == -1) { + printf("failed to open %s: %s\n", argv[1], strerror(errno)); + return 1; + } + for (;;) { + char buf[128]; + ssize_t nread = read(fd, buf, sizeof(buf)); + if (nread == 0) + break; + if (nread < 0) { + printf("read() error: %s\n", strerror(errno)); + return 2; + } + for (ssize_t i = 0; i < nread; ++i) + putchar(buf[i]); + } + return 0; +} diff --git a/Userland/sh.cpp b/Userland/sh.cpp index 35905dc861..b4adda1731 100644 --- a/Userland/sh.cpp +++ b/Userland/sh.cpp @@ -16,10 +16,21 @@ static int runcmd(char* cmd) { if (cmd[0] == 0) return 0; - //printf("command: '%s'\n", cmd); char buf[128]; sprintf(buf, "/bin/%s", cmd); - int ret = spawn(buf); + + const char* argv[32]; + size_t argi = 1; + argv[0] = &buf[0]; + size_t buflen = strlen(buf); + for (size_t i = 0; i < buflen; ++i) { + if (buf[i] == ' ') { + buf[i] = '\0'; + argv[argi++] = &buf[i + 1]; + } + } + argv[argi + 1] = nullptr; + int ret = spawn(argv[0], argv); if (ret == -1) { printf("spawn failed: %s (%s)\n", cmd, strerror(errno)); return 1;