mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:47:44 +00:00
Factor out the "non-syscall" parts of sys$execve() into exec().
..to prepare for sharing code with createUserProcess().
This commit is contained in:
parent
8f51f0e6b2
commit
c5eec9cbfc
2 changed files with 41 additions and 33 deletions
|
@ -282,21 +282,8 @@ pid_t Process::sys$fork(RegisterDump& regs)
|
||||||
return child->pid();
|
return child->pid();
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::sys$execve(const char* filename, const char** argv, const char** envp)
|
int Process::exec(const String& path, Vector<String>&& arguments, Vector<String>&& environment)
|
||||||
{
|
{
|
||||||
VALIDATE_USER_READ(filename, strlen(filename));
|
|
||||||
if (argv) {
|
|
||||||
for (size_t i = 0; argv[i]; ++i) {
|
|
||||||
VALIDATE_USER_READ(argv[i], strlen(argv[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (envp) {
|
|
||||||
for (size_t i = 0; envp[i]; ++i) {
|
|
||||||
VALIDATE_USER_READ(envp[i], strlen(envp[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String path(filename);
|
|
||||||
auto parts = path.split('/');
|
auto parts = path.split('/');
|
||||||
if (parts.isEmpty())
|
if (parts.isEmpty())
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
@ -315,22 +302,6 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
|
||||||
if (!elfData)
|
if (!elfData)
|
||||||
return -EIO; // FIXME: Get a more detailed error from VFS.
|
return -EIO; // FIXME: Get a more detailed error from VFS.
|
||||||
|
|
||||||
Vector<String> processArguments;
|
|
||||||
if (argv) {
|
|
||||||
for (size_t i = 0; argv[i]; ++i) {
|
|
||||||
processArguments.append(argv[i]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
processArguments.append(parts.last());
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector<String> processEnvironment;
|
|
||||||
if (envp) {
|
|
||||||
for (size_t i = 0; envp[i]; ++i) {
|
|
||||||
processEnvironment.append(envp[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dword entry_eip = 0;
|
dword entry_eip = 0;
|
||||||
PageDirectory* old_page_directory;
|
PageDirectory* old_page_directory;
|
||||||
PageDirectory* new_page_directory;
|
PageDirectory* new_page_directory;
|
||||||
|
@ -414,11 +385,11 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
|
||||||
MM.release_page_directory(*old_page_directory);
|
MM.release_page_directory(*old_page_directory);
|
||||||
|
|
||||||
m_executable = handle->vnode();
|
m_executable = handle->vnode();
|
||||||
m_arguments = move(processArguments);
|
m_arguments = move(arguments);
|
||||||
m_initialEnvironment = move(processEnvironment);
|
m_initialEnvironment = move(environment);
|
||||||
|
|
||||||
#ifdef TASK_DEBUG
|
#ifdef TASK_DEBUG
|
||||||
kprintf("Process %u (%s) execve'd %s @ %p\n", pid(), name().characters(), filename, m_tss.eip);
|
kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), filename, m_tss.eip);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
yield();
|
yield();
|
||||||
|
@ -426,6 +397,42 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Process::sys$execve(const char* filename, const char** argv, const char** envp)
|
||||||
|
{
|
||||||
|
VALIDATE_USER_READ(filename, strlen(filename));
|
||||||
|
if (argv) {
|
||||||
|
for (size_t i = 0; argv[i]; ++i) {
|
||||||
|
VALIDATE_USER_READ(argv[i], strlen(argv[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (envp) {
|
||||||
|
for (size_t i = 0; envp[i]; ++i) {
|
||||||
|
VALIDATE_USER_READ(envp[i], strlen(envp[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String path(filename);
|
||||||
|
auto parts = path.split('/');
|
||||||
|
|
||||||
|
Vector<String> arguments;
|
||||||
|
if (argv) {
|
||||||
|
for (size_t i = 0; argv[i]; ++i) {
|
||||||
|
arguments.append(argv[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
arguments.append(parts.last());
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<String> environment;
|
||||||
|
if (envp) {
|
||||||
|
for (size_t i = 0; envp[i]; ++i) {
|
||||||
|
environment.append(envp[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return exec(path, move(arguments), move(environment));
|
||||||
|
}
|
||||||
|
|
||||||
int Process::sys$spawn(const char* path, const char** args)
|
int Process::sys$spawn(const char* path, const char** args)
|
||||||
{
|
{
|
||||||
if (args) {
|
if (args) {
|
||||||
|
|
|
@ -158,6 +158,7 @@ public:
|
||||||
void send_signal(int signal, Process* sender);
|
void send_signal(int signal, Process* sender);
|
||||||
|
|
||||||
Process* fork(RegisterDump&);
|
Process* fork(RegisterDump&);
|
||||||
|
int exec(const String& path, Vector<String>&& arguments, Vector<String>&& environment);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class MemoryManager;
|
friend class MemoryManager;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue