want_mans = get_option('man')
want_tests = get_option('tests')
want_tools = get_option('tools')
+want_tools_multicall = get_option('tools-multicall')
want_commands = get_option('commands')
want_capabilities = get_option('capabilities')
want_apparmor = get_option('apparmor')
if want_commands
subdir('src/lxc/cmd')
endif
-if want_tools
+if want_tools or want_tools_multicall
subdir('src/lxc/tools')
endif
subdir('src/lxc/tools/include')
option('tools', type: 'boolean', value: 'true',
description: 'build and install tools')
+option('tools-multicall', type: 'boolean', value: 'false',
+ description: 'build and install busybox style multicall binary')
+
# was --{disable,enable}-commands in autotools
option('commands', type: 'boolean', value: 'true',
description: 'build and install commands')
return fd;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_attach_main"))) main(int argc, char *argv[]);
+int lxc_attach_main(int argc, char *argv[])
{
int ret = -1;
int wexit = 0;
return 1;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_autostart_main"))) main(int argc, char *argv[]);
+int lxc_autostart_main(int argc, char *argv[])
{
int count = 0, failed = 0, i = 0, ret = 0;
struct lxc_list *cmd_group;
return 0;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_cgroup_main"))) main(int argc, char *argv[]);
+int lxc_cgroup_main(int argc, char *argv[])
{
char *state_object = NULL, *value = NULL;
struct lxc_container *c;
}
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_checkpoint_main"))) main(int argc, char *argv[]);
+int lxc_checkpoint_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
exit(EXIT_SUCCESS);
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_config_main"))) main(int argc, char *argv[]);
+int lxc_config_main(int argc, char *argv[])
{
struct lxc_config_items *i;
const char *value;
return 1 + ((c > 'Z') ? (c - 'a') : (c - 'Z'));
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_console_main"))) main(int argc, char *argv[]);
+int lxc_console_main(int argc, char *argv[])
{
int ret;
struct lxc_container *c;
static int parse_bind_mnt(char *mntstring, enum mnttype type);
static int parse_ovl_mnt(char *mntstring, enum mnttype type);
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_copy_main"))) main(int argc, char *argv[]);
+int lxc_copy_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
return true;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_create_main"))) main(int argc, char *argv[]);
+int lxc_create_main(int argc, char *argv[])
{
struct lxc_container *c;
struct bdev_specs spec;
return bret;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_destroy_main"))) main(int argc, char *argv[]);
+int lxc_destroy_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
return false;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_device_main"))) main(int argc, char *argv[]);
+int lxc_device_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
return true;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_execute_main"))) main(int argc, char *argv[]);
+int lxc_execute_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
.log_file = "none",
};
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_freeze_main"))) main(int argc, char *argv[]);
+int lxc_freeze_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
return 0;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_info_main"))) main(int argc, char *argv[]);
+int lxc_info_main(int argc, char *argv[])
{
int ret = EXIT_FAILURE;
struct lxc_log log;
.ls_nesting = 0,
};
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_ls_main"))) main(int argc, char *argv[]);
+int lxc_ls_main(int argc, char *argv[])
{
int ret = EXIT_FAILURE;
struct lxc_log log;
_exit(EXIT_FAILURE);
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_monitor_main"))) main(int argc, char *argv[]);
+int lxc_monitor_main(int argc, char *argv[])
{
char *regexp;
struct lxc_msg msg;
--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <string.h>
+#include <stdio.h>
+
+#define PREFIX "lxc-"
+
+int lxc_attach_main(int argc, char *argv[]);
+int lxc_autostart_main(int argc, char *argv[]);
+int lxc_cgroup_main(int argc, char *argv[]);
+int lxc_checkpoint_main(int argc, char *argv[]);
+int lxc_config_main(int argc, char *argv[]);
+int lxc_console_main(int argc, char *argv[]);
+int lxc_copy_main(int argc, char *argv[]);
+int lxc_create_main(int argc, char *argv[]);
+int lxc_destroy_main(int argc, char *argv[]);
+int lxc_device_main(int argc, char *argv[]);
+int lxc_execute_main(int argc, char *argv[]);
+int lxc_freeze_main(int argc, char *argv[]);
+int lxc_info_main(int argc, char *argv[]);
+int lxc_ls_main(int argc, char *argv[]);
+int lxc_monitor_main(int argc, char *argv[]);
+int lxc_snapshot_main(int argc, char *argv[]);
+int lxc_start_main(int argc, char *argv[]);
+int lxc_stop_main(int argc, char *argv[]);
+int lxc_top_main(int argc, char *argv[]);
+int lxc_unfreeze_main(int argc, char *argv[]);
+int lxc_unshare_main(int argc, char *argv[]);
+int lxc_wait_main(int argc, char *argv[]);
+
+static const struct {
+ const char *cmd;
+ int (*main)(int argc, char *argv[]);
+} applets[] = {
+ { "attach", lxc_attach_main },
+ { "autostart", lxc_autostart_main },
+ { "cgroup", lxc_cgroup_main },
+ { "checkpoint", lxc_checkpoint_main },
+ { "config", lxc_config_main },
+ { "console", lxc_console_main },
+ { "copy", lxc_copy_main },
+ { "create", lxc_create_main },
+ { "destroy", lxc_destroy_main },
+ { "device", lxc_device_main },
+ { "execute", lxc_execute_main },
+ { "freeze", lxc_freeze_main },
+ { "info", lxc_info_main },
+ { "ls", lxc_ls_main },
+ { "monitor", lxc_monitor_main },
+ { "snapshot", lxc_snapshot_main },
+ { "start", lxc_start_main },
+ { "stop", lxc_stop_main },
+ { "top", lxc_top_main },
+ { "unfreeze", lxc_unfreeze_main },
+ { "unshare", lxc_unshare_main },
+ { "wait", lxc_wait_main }
+};
+
+const int applets_nmemb = (int)(sizeof(applets)/sizeof(applets[0]));
+
+int main(int argc, char *argv[])
+{
+ const char *cmd;
+ int i;
+
+ if (argc < 1)
+ goto err0;
+
+ cmd = strrchr(argv[0], '/');
+ cmd = cmd ? cmd + 1 : argv[0];
+
+
+ if (!strcmp(cmd, "lxc")) {
+ if (argc < 2)
+ goto err0;
+ cmd = argv[1];
+ argc -= 1;
+ argv += 1;
+ if (!strcmp(cmd, "-h") || !strcmp(cmd, "--help"))
+ goto err0;
+ } else if (!strncmp(cmd, PREFIX, strlen(PREFIX))) {
+ cmd += strlen(PREFIX);
+ } else {
+ goto err0;
+ }
+
+ for (i = 0; i < applets_nmemb; i++) {
+ if (!strcmp(applets[i].cmd, cmd))
+ return applets[i].main(argc, argv);
+ }
+
+ fprintf(stderr, "Unsupported command '%s'\n", cmd);
+ goto err1;
+
+err0: fprintf(stderr, "This is a multi-call binary, argv[0] is expected to be\n"
+ " a name of the requested command prefixed with '%s'\n"
+ "or\n"
+ " 'lxc' and the command should be the 1st argument.\n\n"
+ "For example calling this program as '%sls' or 'lxc' "
+ "with the argument 'ls' lists containers.\n\n",
+ PREFIX, PREFIX);
+err1: fprintf(stderr, "Known commands:\n");
+ for (i = 0; i < applets_nmemb; i++) {
+ fprintf(stderr, "%s ", applets[i].cmd);
+ }
+ putc('\n', stderr);
+ return 1;
+}
static int do_snapshot_task(struct lxc_container *c, enum task task);
static void print_file(char *path);
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_snapshot_main"))) main(int argc, char *argv[]);
+int lxc_snapshot_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
return 0;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_start_main"))) main(int argc, char *argv[]);
+int lxc_start_main(int argc, char *argv[])
{
const char *lxcpath;
char *const *args;
return 0;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_stop_main"))) main(int argc, char *argv[]);
+int lxc_stop_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
return LXC_MAINLOOP_CLOSE;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_top_main"))) main(int argc, char *argv[]);
+int lxc_top_main(int argc, char *argv[])
{
struct lxc_async_descr descr;
int ret, ct_print_cnt;
.log_file = "none",
};
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_unfreeze_main"))) main(int argc, char *argv[]);
+int lxc_unfreeze_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
}
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_unshare_main"))) main(int argc, char *argv[]);
+int lxc_unshare_main(int argc, char *argv[])
{
int ret;
pid_t pid;
return 0;
}
-int main(int argc, char *argv[])
+int __attribute__((weak, alias("lxc_wait_main"))) main(int argc, char *argv[]);
+int lxc_wait_main(int argc, char *argv[])
{
struct lxc_container *c;
struct lxc_log log;
install: true)
endforeach
endif
+
+if want_tools_multicall
+ tools_all_sources = files('lxc_multicall.c') + tools_common_sources
+ foreach cmd : tools_commands
+ tools_all_sources += files('lxc_' + cmd + '.c')
+ endforeach
+
+ public_programs += executable(
+ 'lxc',
+ tools_all_sources,
+ include_directories: liblxc_includes,
+ dependencies: liblxc_dep,
+ install: true)
+
+ if want_tools == false
+ foreach cmd : tools_commands
+ public_programs += install_symlink(
+ 'lxc-' + cmd,
+ pointing_to: 'lxc',
+ install_dir: get_option('bindir'))
+ endforeach
+ endif
+endif