Commit 7adff31c by Daniel Lezcano

fork/exec after attach

The command to attach has to be fork/exec. Signed-off-by: 's avatarDaniel Lezcano <dlezcano@fr.ibm.com>
parent 91480a0f
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
#include <errno.h> #include <errno.h>
#include <sys/param.h> #include <sys/param.h>
#include <pwd.h> #include <pwd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "commands.h" #include "commands.h"
#include "arguments.h" #include "arguments.h"
#include "namespace.h" #include "namespace.h"
...@@ -106,29 +109,58 @@ int main(int argc, char *argv[], char *envp[]) ...@@ -106,29 +109,58 @@ int main(int argc, char *argv[], char *envp[])
return -1; return -1;
} }
if (my_args.argc) { pid = fork();
execve(my_args.argv[0], my_args.argv, envp);
SYSERROR("failed to exec '%s'", my_args.argv[0]); if (pid < 0) {
SYSERROR("failed to fork");
return -1; return -1;
} }
uid = getuid(); if (pid) {
int status;
again:
if (waitpid(pid, &status, 0) < 0) {
if (errno == EINTR)
goto again;
SYSERROR("failed to wait '%d'", pid);
return -1;
}
if (WIFEXITED(status))
return WEXITSTATUS(status);
passwd = getpwuid(uid);
if (!passwd) {
SYSERROR("failed to get passwd entry for uid '%d'", uid);
return -1; return -1;
} }
{ if (!pid) {
char *const args[] = {
passwd->pw_shell, if (my_args.argc) {
NULL, execve(my_args.argv[0], my_args.argv, envp);
}; SYSERROR("failed to exec '%s'", my_args.argv[0]);
return -1;
}
uid = getuid();
passwd = getpwuid(uid);
if (!passwd) {
SYSERROR("failed to get passwd " \
"entry for uid '%d'", uid);
return -1;
}
{
char *const args[] = {
passwd->pw_shell,
NULL,
};
execve(args[0], args, envp);
SYSERROR("failed to exec '%s'", args[0]);
return -1;
}
execve(args[0], args, envp);
SYSERROR("failed to exec '%s'", args[0]);
return -1;
} }
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment