<div dir="ltr"><div>I managed to make lxc-start return the container's exit code, I'm not sure if this could break something else and I appreciate any comment.</div><div><br></div><div><div><div>Signed-off-by: Rodrigo Sampaio Vaz <<a href="mailto:rodrigo@heroku.com">rodrigo@heroku.com</a>></div>
<div>---</div><div> src/lxc/lxc_start.c    | 5 ++---</div><div> src/lxc/lxccontainer.c | 8 ++++----</div><div> src/lxc/lxccontainer.h | 4 ++--</div><div> 3 files changed, 8 insertions(+), 9 deletions(-)</div><div><br></div>
<div>diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c</div><div>index 1d8145f..0f4649c 100644</div><div>--- a/src/lxc/lxc_start.c</div><div>+++ b/src/lxc/lxc_start.c</div><div>@@ -328,9 +328,8 @@ int main(int argc, char *argv[])</div>
<div> <span class="" style="white-space:pre">  </span>if (my_args.close_all_fds)</div><div> <span class="" style="white-space:pre">               </span>c->want_close_all_fds(c, true);</div><div> </div><div>-<span class="" style="white-space:pre">       </span>err = c->start(c, 0, args) ? 0 : 1;</div>
<div>-</div><div>-<span class="" style="white-space:pre">   </span>if (err) {</div><div>+<span class="" style="white-space:pre">        </span>err = c->start(c, 0, args);</div><div>+<span class="" style="white-space:pre">    </span>if (err > 0) {</div>
<div> <span class="" style="white-space:pre">          </span>ERROR("The container failed to start.");</div><div> <span class="" style="white-space:pre">               </span>if (my_args.daemonize)</div><div> <span class="" style="white-space:pre">                   </span>ERROR("To get more details, run the container in foreground mode.");</div>
<div>diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c</div><div>index 62e38d7..dc89f33 100644</div><div>--- a/src/lxc/lxccontainer.c</div><div>+++ b/src/lxc/lxccontainer.c</div><div>@@ -547,7 +547,7 @@ static bool am_single_threaded(void)</div>
<div>  * I can't decide if it'd be more convenient for callers if we accept '...',</div><div>  * or a null-terminated array (i.e. execl vs execv)</div><div>  */</div><div>-static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv[])</div>
<div>+static int lxcapi_start(struct lxc_container *c, int useinit, char * const argv[])</div><div> {</div><div> <span class="" style="white-space:pre">      </span>int ret;</div><div> <span class="" style="white-space:pre"> </span>struct lxc_conf *conf;</div>
<div>@@ -683,15 +683,15 @@ reboot:</div><div> <span class="" style="white-space:pre">      </span>}</div><div> </div><div> <span class="" style="white-space:pre">       </span>if (daemonize)</div><div>-<span class="" style="white-space:pre">            </span>exit (ret == 0 ? true : false);</div>
<div>+<span class="" style="white-space:pre">           </span>exit (ret);</div><div> <span class="" style="white-space:pre">      </span>else</div><div>-<span class="" style="white-space:pre">              </span>return (ret == 0 ? true : false);</div>
<div>+<span class="" style="white-space:pre">           </span>return (ret);</div><div> }</div><div> </div><div> /*</div><div>  * note there MUST be an ending NULL</div><div>  */</div><div>-static bool lxcapi_startl(struct lxc_container *c, int useinit, ...)</div>
<div>+static int lxcapi_startl(struct lxc_container *c, int useinit, ...)</div><div> {</div><div> <span class="" style="white-space:pre">     </span>va_list ap;</div><div> <span class="" style="white-space:pre">      </span>char **inargs = NULL;</div>
<div>diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h</div><div>index 1d0628a..303f426 100644</div><div>--- a/src/lxc/lxccontainer.h</div><div>+++ b/src/lxc/lxccontainer.h</div><div>@@ -189,7 +189,7 @@ struct lxc_container {</div>
<div> <span class="" style="white-space:pre">  </span> *</div><div> <span class="" style="white-space:pre">       </span> * \return \c true on success, else \c false.</div><div> <span class="" style="white-space:pre">    </span> */</div>
<div>-<span class="" style="white-space:pre">   </span>bool (*start)(struct lxc_container *c, int useinit, char * const argv[]);</div><div>+<span class="" style="white-space:pre"> </span>int (*start)(struct lxc_container *c, int useinit, char * const argv[]);</div>
<div> </div><div> <span class="" style="white-space:pre"> </span>/*!</div><div> <span class="" style="white-space:pre">      </span> * \brief Start the container (list variant).</div><div>@@ -204,7 +204,7 @@ struct lxc_container {</div>
<div> <span class="" style="white-space:pre">  </span> *  arguments are specified via a list rather than an array of</div><div> <span class="" style="white-space:pre">  </span> *  pointers.</div><div> <span class="" style="white-space:pre">   </span> */</div>
<div>-<span class="" style="white-space:pre">   </span>bool (*startl)(struct lxc_container *c, int useinit, ...);</div><div>+<span class="" style="white-space:pre">        </span>int (*startl)(struct lxc_container *c, int useinit, ...);</div>
<div> </div><div> <span class="" style="white-space:pre"> </span>/*!</div><div> <span class="" style="white-space:pre">      </span> * \brief Stop the container.</div><div>-- </div><div>2.0.1</div></div><div><br></div><div><br>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 1, 2014 at 6:36 PM, Rodrigo Vaz <span dir="ltr"><<a href="mailto:rodrigo@heroku.com" target="_blank">rodrigo@heroku.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr">Hi, <div><br></div><div>I've started testing lxc 1.0.4 on our environment with ubuntu trusty images and found an issue with the exit code of lxc-start.</div><div><br></div><div>On lxc 0.9.0 the exit code matches the container:</div>

<div><br></div><div><div>vagrant@vagrant-ubuntu-trusty-64:~$ sudo lxc-start -l debug -o lxc.log -n u1 -- bash -c 'echo TEST && sleep 10 && exit 143'</div><div>TEST</div><div>vagrant@vagrant-ubuntu-trusty-64:~$ echo $?</div>

<div>143</div></div><div><br></div><div>Running the same test on lxc 1.0.4:</div><div><br></div><div><div>root@runtime.21 ~# lxc-start -l debug -o lxc.log -n u1 -- bash -c 'echo TEST && sleep 10 && exit 143'</div>

<div>TEST</div><div>lxc-start: The container failed to start.</div><div>lxc-start: Additional information can be obtained by setting the --logfile and --log-priority options.</div><div>root@runtime.21 ~# echo $?</div><div>

1</div></div><div><br></div><div>lxc.log says:</div><div><br></div><div><div>     lxc-start 1404250316.378 INFO     lxc_error - child <18118> ended on error (143)</div><div>      lxc-start 1404250316.378 WARN     lxc_conf - failed to remove interface '(null)'</div>

<div>      lxc-start 1404250316.382 ERROR    lxc_start_ui - The container failed to start.</div><div>      lxc-start 1404250316.382 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --log-priority options.</div>

</div><div><br></div><div>This was reproducible on the same machine using lxc 0.9.0 and 1.0.4.</div><div><br></div><div>Has anything changed recently regarding exit codes?</div><div><br></div><div>Regards,</div><div><br>
</div>
<div>Rodrigo. </div></div>
</blockquote></div><br></div></div></div></div>