]> git.proxmox.com Git - mirror_lxc.git/commitdiff
fork/exec after attach
authorDaniel Lezcano <dlezcano@fr.ibm.com>
Thu, 8 Apr 2010 07:44:23 +0000 (09:44 +0200)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Thu, 8 Apr 2010 07:44:23 +0000 (09:44 +0200)
The command to attach has to be fork/exec.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/lxc_attach.c

index a012c2c6e0a69dc434ca83027fc8dfa8d9b9e1a8..bae76ed4e15cc44a48d8592416f02373130c8c8a 100644 (file)
@@ -25,6 +25,9 @@
 #include <errno.h>
 #include <sys/param.h>
 #include <pwd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
 #include "commands.h"
 #include "arguments.h"
 #include "namespace.h"
@@ -106,29 +109,58 @@ int main(int argc, char *argv[], char *envp[])
                return -1;
        }
 
-       if (my_args.argc) {
-               execve(my_args.argv[0], my_args.argv, envp);
-               SYSERROR("failed to exec '%s'", my_args.argv[0]);
+       pid = fork();
+
+       if (pid < 0) {
+               SYSERROR("failed to fork");
                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;
        }
 
-       {
-               char *const args[] = {
-                       passwd->pw_shell,
-                       NULL,
-               };
+       if (!pid) {
+
+               if (my_args.argc) {
+                       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;