mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 21:37:34 +00:00
Kernel: Forked processes should inherit arguments and environment.
This commit is contained in:
parent
6127d33cee
commit
61e50780aa
2 changed files with 16 additions and 19 deletions
|
@ -224,11 +224,8 @@ Process* Process::fork(RegisterDump& regs)
|
||||||
dbgprintf("fork: child=%p\n", child);
|
dbgprintf("fork: child=%p\n", child);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
child->m_initial_arguments = m_initial_arguments;
|
||||||
// FIXME: An honest fork() would copy these. Needs a Vector copy ctor.
|
child->m_initial_environment = m_initial_environment;
|
||||||
child->m_arguments = m_arguments;
|
|
||||||
child->m_initialEnvironment = m_initialEnvironment;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (auto& region : m_regions) {
|
for (auto& region : m_regions) {
|
||||||
#ifdef FORK_DEBUG
|
#ifdef FORK_DEBUG
|
||||||
|
@ -408,8 +405,8 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
|
||||||
m_tss.ss2 = m_pid;
|
m_tss.ss2 = m_pid;
|
||||||
|
|
||||||
m_executable = descriptor->inode();
|
m_executable = descriptor->inode();
|
||||||
m_arguments = move(arguments);
|
m_initial_arguments = move(arguments);
|
||||||
m_initialEnvironment = move(environment);
|
m_initial_environment = move(environment);
|
||||||
|
|
||||||
#ifdef TASK_DEBUG
|
#ifdef TASK_DEBUG
|
||||||
kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), m_tss.eip);
|
kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), m_tss.eip);
|
||||||
|
@ -525,14 +522,14 @@ int Process::sys$get_environment(char*** environ)
|
||||||
MM.map_region(*this, *region);
|
MM.map_region(*this, *region);
|
||||||
char* envpage = (char*)region->linearAddress.get();
|
char* envpage = (char*)region->linearAddress.get();
|
||||||
*environ = (char**)envpage;
|
*environ = (char**)envpage;
|
||||||
char* bufptr = envpage + (sizeof(char*) * (m_initialEnvironment.size() + 1));
|
char* bufptr = envpage + (sizeof(char*) * (m_initial_environment.size() + 1));
|
||||||
for (size_t i = 0; i < m_initialEnvironment.size(); ++i) {
|
for (size_t i = 0; i < m_initial_environment.size(); ++i) {
|
||||||
(*environ)[i] = bufptr;
|
(*environ)[i] = bufptr;
|
||||||
memcpy(bufptr, m_initialEnvironment[i].characters(), m_initialEnvironment[i].length());
|
memcpy(bufptr, m_initial_environment[i].characters(), m_initial_environment[i].length());
|
||||||
bufptr += m_initialEnvironment[i].length();
|
bufptr += m_initial_environment[i].length();
|
||||||
*(bufptr++) = '\0';
|
*(bufptr++) = '\0';
|
||||||
}
|
}
|
||||||
(*environ)[m_initialEnvironment.size()] = nullptr;
|
(*environ)[m_initial_environment.size()] = nullptr;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,13 +540,13 @@ int Process::sys$get_arguments(int* argc, char*** argv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
MM.map_region(*this, *region);
|
MM.map_region(*this, *region);
|
||||||
char* argpage = (char*)region->linearAddress.get();
|
char* argpage = (char*)region->linearAddress.get();
|
||||||
*argc = m_arguments.size();
|
*argc = m_initial_arguments.size();
|
||||||
*argv = (char**)argpage;
|
*argv = (char**)argpage;
|
||||||
char* bufptr = argpage + (sizeof(char*) * m_arguments.size());
|
char* bufptr = argpage + (sizeof(char*) * m_initial_arguments.size());
|
||||||
for (size_t i = 0; i < m_arguments.size(); ++i) {
|
for (size_t i = 0; i < m_initial_arguments.size(); ++i) {
|
||||||
(*argv)[i] = bufptr;
|
(*argv)[i] = bufptr;
|
||||||
memcpy(bufptr, m_arguments[i].characters(), m_arguments[i].length());
|
memcpy(bufptr, m_initial_arguments[i].characters(), m_initial_arguments[i].length());
|
||||||
bufptr += m_arguments[i].length();
|
bufptr += m_initial_arguments[i].length();
|
||||||
*(bufptr++) = '\0';
|
*(bufptr++) = '\0';
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -347,8 +347,8 @@ private:
|
||||||
|
|
||||||
static void notify_waiters(pid_t waitee, int exit_status, int signal);
|
static void notify_waiters(pid_t waitee, int exit_status, int signal);
|
||||||
|
|
||||||
Vector<String> m_arguments;
|
Vector<String> m_initial_arguments;
|
||||||
Vector<String> m_initialEnvironment;
|
Vector<String> m_initial_environment;
|
||||||
HashTable<gid_t> m_gids;
|
HashTable<gid_t> m_gids;
|
||||||
|
|
||||||
Region* m_stack_region { nullptr };
|
Region* m_stack_region { nullptr };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue