* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <sys/types.h>
+#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
+
#include "log.h"
#include "start.h"
int quiet;
};
+/* historically lxc-init has been under /usr/lib/lxc. Now with
+ * multi-arch it can be under /usr/lib/$ARCH/lxc. Serge thinks
+ * it makes more sense to put it under /sbin.
+ * If /usr/lib/$ARCH/lxc exists and is used, then LXCINITDIR will
+ * point to it.
+ */
+static char *choose_init(void)
+{
+ char *retv = malloc(PATH_MAX);
+ int ret;
+ struct stat mystat;
+ if (!retv)
+ return NULL;
+
+ snprintf(retv, PATH_MAX-1, LXCINITDIR "/lxc/lxc-init");
+ ret = stat(retv, &mystat);
+ if (ret == 0)
+ return retv;
+ snprintf(retv, PATH_MAX-1, "/usr/lib/lxc/lxc-init");
+ ret = stat(retv, &mystat);
+ if (ret == 0)
+ return retv;
+ snprintf(retv, PATH_MAX-1, "/sbin/lxc-init");
+ ret = stat(retv, &mystat);
+ if (ret == 0)
+ return retv;
+ return NULL;
+}
+
static int execute_start(struct lxc_handler *handler, void* data)
{
int j, i = 0;
struct execute_args *my_args = data;
char **argv;
int argc = 0;
+ char *initpath;
while (my_args->argv[argc++]);
if (!argv)
return 1;
- argv[i++] = LXCINITDIR "/lxc-init";
+ initpath = choose_init();
+ if (!initpath) {
+ ERROR("Failed to find an lxc-init");
+ return 1;
+ }
+ argv[i++] = initpath;
if (my_args->quiet)
argv[i++] = "--quiet";
argv[i++] = "--";