When the reboot is detected, reboot the container.

Signed-off-by: Daniel Lezcano <dlezc...@fr.ibm.com>
---
 src/lxc/commands.c  |    7 +++++++
 src/lxc/conf.c      |    6 ------
 src/lxc/conf.h      |    1 +
 src/lxc/confile.c   |   30 +++++++++++++++++++++++-------
 src/lxc/lxc.h       |    3 ++-
 src/lxc/lxc_start.c |   19 ++++++++++++++-----
 src/lxc/start.c     |    3 +++
 src/lxc/utmp.c      |    3 ++-
 8 files changed, 52 insertions(+), 20 deletions(-)

Index: lxc/src/lxc/commands.c
===================================================================
--- lxc.orig/src/lxc/commands.c
+++ lxc/src/lxc/commands.c
@@ -25,6 +25,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <signal.h>
+#include <fcntl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/poll.h>
@@ -228,6 +229,12 @@ extern int lxc_command_mainloop_add(cons
                return -1;
        }
 
+       if (fcntl(fd, F_SETFD, FD_CLOEXEC)) {
+               SYSERROR("failed to set sigfd to close-on-exec");
+               close(fd);
+               return -1;
+       }
+
        ret = lxc_mainloop_add_handler(descr, fd, incoming_command_handler, 
handler);
        if (ret) {
                ERROR("failed to add handler for command socket");
Index: lxc/src/lxc/lxc.h
===================================================================
--- lxc.orig/src/lxc/lxc.h
+++ lxc/src/lxc/lxc.h
@@ -43,9 +43,10 @@ struct lxc_conf;
  * Start the specified command inside a container
  * @name     : the name of the container
  * @argv     : an array of char * corresponding to the commande line
+ * @conf     : configuration
  * Returns 0 on sucess, < 0 otherwise
  */
-extern int lxc_start(const char *name, char *const argv[], struct lxc_conf *);
+extern int lxc_start(const char *name, char *const argv[], struct lxc_conf 
*conf);
 
 /*
  * Stop the container previously started with lxc_start, all
Index: lxc/src/lxc/lxc_start.c
===================================================================
--- lxc.orig/src/lxc/lxc_start.c
+++ lxc/src/lxc/lxc_start.c
@@ -90,17 +90,15 @@ Options :\n\
 
 int main(int argc, char *argv[])
 {
-       char *const *args;
        int err = -1;
-
+       struct lxc_conf *conf;
+       char *const *args;
+       char *rcfile = NULL;
        char *const default_args[] = {
                "/sbin/init",
                '\0',
        };
 
-       char *rcfile = NULL;
-       struct lxc_conf *conf;
-
        lxc_list_init(&defines);
 
        if (lxc_arguments_parse(&my_args, argc, argv))
@@ -176,6 +174,17 @@ int main(int argc, char *argv[])
 
        err = lxc_start(my_args.name, args, conf);
 
+       /*
+        * exec ourself, that requires to have all opened fd
+        * with the close-on-exec flag set
+        */
+       if (conf->reboot) {
+               INFO("rebooting container");
+               execvp(argv[0], argv);
+               SYSERROR("failed to exec");
+               err = -1;
+       }
+
        return err;
 }
 
Index: lxc/src/lxc/start.c
===================================================================
--- lxc.orig/src/lxc/start.c
+++ lxc/src/lxc/start.c
@@ -471,6 +471,9 @@ int lxc_start(const char *name, char *co
        while (waitpid(handler->pid, &status, 0) < 0 && errno == EINTR)
                continue;
 
+       if (sigprocmask(SIG_SETMASK, &handler->oldmask, NULL))
+               WARN("failed to restore sigprocmask");
+
        err =  lxc_error_set_and_log(handler->pid, status);
 out_fini:
        lxc_fini(name, handler);
Index: lxc/src/lxc/utmp.c
===================================================================
--- lxc.orig/src/lxc/utmp.c
+++ lxc/src/lxc/utmp.c
@@ -94,7 +94,8 @@ static int utmp_handler(int fd, void *da
                }
 
                if (currun_level == '6') {
-                       INFO("container has reboot");
+                       INFO("container has rebooted");
+                       conf->reboot = 1;
                        kill(handler->pid, SIGKILL);
                }
        }
Index: lxc/src/lxc/conf.c
===================================================================
--- lxc.orig/src/lxc/conf.c
+++ lxc/src/lxc/conf.c
@@ -1068,12 +1068,6 @@ struct lxc_conf *lxc_conf_init(void)
        }
        memset(new, 0, sizeof(*new));
 
-       new->rootfs = NULL;
-       new->pivotdir = NULL;
-       new->fstab = NULL;
-       new->utsname = NULL;
-       new->tty = 0;
-       new->pts = 0;
        new->console.peer = -1;
        new->console.master = -1;
        new->console.slave = -1;
Index: lxc/src/lxc/conf.h
===================================================================
--- lxc.orig/src/lxc/conf.h
+++ lxc/src/lxc/conf.h
@@ -181,6 +181,7 @@ struct lxc_conf {
        char *fstab;
        int tty;
        int pts;
+       int reboot;
        struct utsname *utsname;
        struct lxc_list cgroup;
        struct lxc_list network;
Index: lxc/src/lxc/confile.c
===================================================================
--- lxc.orig/src/lxc/confile.c
+++ lxc/src/lxc/confile.c
@@ -692,22 +692,34 @@ static int config_utsname(const char *ke
 static int parse_line(char *buffer, void *data)
 {
        struct config *config;
-       char *line = buffer;
+       char *line;
        char *dot;
        char *key;
        char *value;
+       int ret = -1;
 
-       if (lxc_is_line_empty(line))
+       if (lxc_is_line_empty(buffer))
                return 0;
 
+       /* we have to dup the buffer otherwise, at the re-exec for reboot we 
modified
+        * the original string on the stack by replacing '=' by '\0' below
+        */
+       line = strdup(buffer);
+       if (!line) {
+               SYSERROR("failed to allocate memory for '%s'", buffer);
+               goto out;
+       }
+
        line += lxc_char_left_gc(line, strlen(line));
-       if (line[0] == '#')
-               return 0;
+       if (line[0] == '#') {
+               ret = 0;
+               goto out;
+       }
 
        dot = strstr(line, "=");
        if (!dot) {
                ERROR("invalid configuration line: %s", line);
-               return -1;
+               goto out;
        }
 
        *dot = '\0';
@@ -722,10 +734,14 @@ static int parse_line(char *buffer, void
        config = getconfig(key);
        if (!config) {
                ERROR("unknow key %s", key);
-               return -1;
+               goto out;
        }
 
-       return config->cb(key, value, data);
+       ret = config->cb(key, value, data);
+
+out:
+       free(line);
+       return ret;
 }
 
 int lxc_config_readline(char *buffer, struct lxc_conf *conf)


------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to