This makes it easier to write a binding, and presents a cleaner API. Use strdupa in a few places to get mutable strings for tokenizing / parsing. Also change the argv type in lxcapi_start and lxcapi_create to match that of execv(3).
Signed-off-by: Dwight Engen <dwight.en...@oracle.com> --- src/lxc/conf.c | 10 ++-- src/lxc/conf.h | 6 +- src/lxc/confile.c | 168 ++++++++++++++++++++++++++---------------------- src/lxc/confile.h | 8 +- src/lxc/lxc.h | 2 +- src/lxc/lxccontainer.c | 24 ++++---- src/lxc/lxccontainer.h | 20 +++--- src/lxc/lxclock.c | 4 +- src/lxc/lxclock.h | 2 +- src/lxc/state.c | 16 ++++- src/lxc/state.h | 2 +- 11 files changed, 143 insertions(+), 119 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 0753221..eb0c07e 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2478,7 +2478,7 @@ static void lxc_remove_nic(struct lxc_list *it) } /* we get passed in something like '0', '0.ipv4' or '1.ipv6' */ -int lxc_clear_nic(struct lxc_conf *c, char *key) +int lxc_clear_nic(struct lxc_conf *c, const char *key) { char *p1; int ret, idx, i; @@ -2586,11 +2586,11 @@ int lxc_clear_config_caps(struct lxc_conf *c) return 0; } -int lxc_clear_cgroups(struct lxc_conf *c, char *key) +int lxc_clear_cgroups(struct lxc_conf *c, const char *key) { struct lxc_list *it,*next; bool all = false; - char *k = key + 11; + const char *k = key + 11; if (strcmp(key, "lxc.cgroup") == 0) all = true; @@ -2620,11 +2620,11 @@ int lxc_clear_mount_entries(struct lxc_conf *c) return 0; } -int lxc_clear_hooks(struct lxc_conf *c, char *key) +int lxc_clear_hooks(struct lxc_conf *c, const char *key) { struct lxc_list *it,*next; bool all = false, done = false; - char *k = key + 9; + const char *k = key + 9; int i; if (strcmp(key, "lxc.hook") == 0) diff --git a/src/lxc/conf.h b/src/lxc/conf.h index 76bf19d..535823d 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -259,11 +259,11 @@ extern int lxc_create_tty(const char *name, struct lxc_conf *conf); extern void lxc_delete_tty(struct lxc_tty_info *tty_info); extern int lxc_clear_config_network(struct lxc_conf *c); -extern int lxc_clear_nic(struct lxc_conf *c, char *key); +extern int lxc_clear_nic(struct lxc_conf *c, const char *key); extern int lxc_clear_config_caps(struct lxc_conf *c); -extern int lxc_clear_cgroups(struct lxc_conf *c, char *key); +extern int lxc_clear_cgroups(struct lxc_conf *c, const char *key); extern int lxc_clear_mount_entries(struct lxc_conf *c); -extern int lxc_clear_hooks(struct lxc_conf *c, char *key); +extern int lxc_clear_hooks(struct lxc_conf *c, const char *key); /* * Configure the container from inside diff --git a/src/lxc/confile.c b/src/lxc/confile.c index c1cb693..bc55f8c 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -20,6 +20,7 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -46,40 +47,40 @@ lxc_log_define(lxc_confile, lxc); -static int config_personality(const char *, char *, struct lxc_conf *); -static int config_pts(const char *, char *, struct lxc_conf *); -static int config_tty(const char *, char *, struct lxc_conf *); -static int config_ttydir(const char *, char *, struct lxc_conf *); +static int config_personality(const char *, const char *, struct lxc_conf *); +static int config_pts(const char *, const char *, struct lxc_conf *); +static int config_tty(const char *, const char *, struct lxc_conf *); +static int config_ttydir(const char *, const char *, struct lxc_conf *); #if HAVE_APPARMOR -static int config_aa_profile(const char *, char *, struct lxc_conf *); +static int config_aa_profile(const char *, const char *, struct lxc_conf *); #endif -static int config_cgroup(const char *, char *, struct lxc_conf *); -static int config_mount(const char *, char *, struct lxc_conf *); -static int config_rootfs(const char *, char *, struct lxc_conf *); -static int config_rootfs_mount(const char *, char *, struct lxc_conf *); -static int config_pivotdir(const char *, char *, struct lxc_conf *); -static int config_utsname(const char *, char *, struct lxc_conf *); -static int config_hook(const char *key, char *value, struct lxc_conf *lxc_conf); -static int config_network_type(const char *, char *, struct lxc_conf *); -static int config_network_flags(const char *, char *, struct lxc_conf *); -static int config_network_link(const char *, char *, struct lxc_conf *); -static int config_network_name(const char *, char *, struct lxc_conf *); -static int config_network_veth_pair(const char *, char *, struct lxc_conf *); -static int config_network_macvlan_mode(const char *, char *, struct lxc_conf *); -static int config_network_hwaddr(const char *, char *, struct lxc_conf *); -static int config_network_vlan_id(const char *, char *, struct lxc_conf *); -static int config_network_mtu(const char *, char *, struct lxc_conf *); -static int config_network_ipv4(const char *, char *, struct lxc_conf *); -static int config_network_ipv4_gateway(const char *, char *, struct lxc_conf *); -static int config_network_script(const char *, char *, struct lxc_conf *); -static int config_network_ipv6(const char *, char *, struct lxc_conf *); -static int config_network_ipv6_gateway(const char *, char *, struct lxc_conf *); -static int config_cap_drop(const char *, char *, struct lxc_conf *); -static int config_console(const char *, char *, struct lxc_conf *); -static int config_seccomp(const char *, char *, struct lxc_conf *); -static int config_includefile(const char *, char *, struct lxc_conf *); -static int config_network_nic(const char *, char *, struct lxc_conf *); -static int config_autodev(const char *, char *, struct lxc_conf *); +static int config_cgroup(const char *, const char *, struct lxc_conf *); +static int config_mount(const char *, const char *, struct lxc_conf *); +static int config_rootfs(const char *, const char *, struct lxc_conf *); +static int config_rootfs_mount(const char *, const char *, struct lxc_conf *); +static int config_pivotdir(const char *, const char *, struct lxc_conf *); +static int config_utsname(const char *, const char *, struct lxc_conf *); +static int config_hook(const char *, const char *, struct lxc_conf *lxc_conf); +static int config_network_type(const char *, const char *, struct lxc_conf *); +static int config_network_flags(const char *, const char *, struct lxc_conf *); +static int config_network_link(const char *, const char *, struct lxc_conf *); +static int config_network_name(const char *, const char *, struct lxc_conf *); +static int config_network_veth_pair(const char *, const char *, struct lxc_conf *); +static int config_network_macvlan_mode(const char *, const char *, struct lxc_conf *); +static int config_network_hwaddr(const char *, const char *, struct lxc_conf *); +static int config_network_vlan_id(const char *, const char *, struct lxc_conf *); +static int config_network_mtu(const char *, const char *, struct lxc_conf *); +static int config_network_ipv4(const char *, const char *, struct lxc_conf *); +static int config_network_ipv4_gateway(const char *, const char *, struct lxc_conf *); +static int config_network_script(const char *, const char *, struct lxc_conf *); +static int config_network_ipv6(const char *, const char *, struct lxc_conf *); +static int config_network_ipv6_gateway(const char *, const char *, struct lxc_conf *); +static int config_cap_drop(const char *, const char *, struct lxc_conf *); +static int config_console(const char *, const char *, struct lxc_conf *); +static int config_seccomp(const char *, const char *, struct lxc_conf *); +static int config_includefile(const char *, const char *, struct lxc_conf *); +static int config_network_nic(const char *, const char *, struct lxc_conf *); +static int config_autodev(const char *, const char *, struct lxc_conf *); static struct lxc_config_t config[] = { @@ -97,7 +98,7 @@ static struct lxc_config_t config[] = { { "lxc.pivotdir", config_pivotdir }, { "lxc.utsname", config_utsname }, { "lxc.hook.pre-start", config_hook }, - { "lxc.hook.pre-mount", config_hook }, + { "lxc.hook.pre-mount", config_hook }, { "lxc.hook.mount", config_hook }, { "lxc.hook.start", config_hook }, { "lxc.hook.post-stop", config_hook }, @@ -173,7 +174,7 @@ int lxc_listconfigs(char *retv, int inlen) * comes an integer, find the right callback (by rewriting * the key), and call it. */ -static int config_network_nic(const char *key, char *value, +static int config_network_nic(const char *key, const char *value, struct lxc_conf *lxc_conf) { char *copy = strdup(key), *p; @@ -208,7 +209,7 @@ out: return ret; } -static int config_network_type(const char *key, char *value, +static int config_network_type(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_list *network = &lxc_conf->network; @@ -302,7 +303,8 @@ static struct lxc_netdev *get_netdev_from_key(const char *key, return netdev; } -extern int lxc_list_nicconfigs(struct lxc_conf *c, char *key, char *retv, int inlen) +extern int lxc_list_nicconfigs(struct lxc_conf *c, const char *key, + char *retv, int inlen) { struct lxc_netdev *netdev; int fulllen = 0, len; @@ -369,7 +371,7 @@ static struct lxc_netdev *network_netdev(const char *key, const char *value, return netdev; } -static int network_ifname(char **valuep, char *value) +static int network_ifname(char **valuep, const char *value) { if (strlen(value) >= IFNAMSIZ) { ERROR("interface name '%s' too long (>%d)\n", @@ -398,7 +400,7 @@ static int network_ifname(char **valuep, char *value) # define MACVLAN_MODE_BRIDGE 4 #endif -static int macvlan_mode(int *valuep, char *value) +static int macvlan_mode(int *valuep, const char *value) { struct mc_mode { char *name; @@ -422,7 +424,7 @@ static int macvlan_mode(int *valuep, char *value) return -1; } -static int config_network_flags(const char *key, char *value, +static int config_network_flags(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -436,7 +438,7 @@ static int config_network_flags(const char *key, char *value, return 0; } -static int config_network_link(const char *key, char *value, +static int config_network_link(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -448,7 +450,7 @@ static int config_network_link(const char *key, char *value, return network_ifname(&netdev->link, value); } -static int config_network_name(const char *key, char *value, +static int config_network_name(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -460,7 +462,7 @@ static int config_network_name(const char *key, char *value, return network_ifname(&netdev->name, value); } -static int config_network_veth_pair(const char *key, char *value, +static int config_network_veth_pair(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -472,7 +474,7 @@ static int config_network_veth_pair(const char *key, char *value, return network_ifname(&netdev->priv.veth_attr.pair, value); } -static int config_network_macvlan_mode(const char *key, char *value, +static int config_network_macvlan_mode(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -484,7 +486,7 @@ static int config_network_macvlan_mode(const char *key, char *value, return macvlan_mode(&netdev->priv.macvlan_attr.mode, value); } -static int config_network_hwaddr(const char *key, char *value, +static int config_network_hwaddr(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -506,7 +508,7 @@ static int config_network_hwaddr(const char *key, char *value, return 0; } -static int config_network_vlan_id(const char *key, char *value, +static int config_network_vlan_id(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -521,7 +523,7 @@ static int config_network_vlan_id(const char *key, char *value, return 0; } -static int config_network_mtu(const char *key, char *value, +static int config_network_mtu(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -543,7 +545,7 @@ static int config_network_mtu(const char *key, char *value, return 0; } -static int config_network_ipv4(const char *key, char *value, +static int config_network_ipv4(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -571,7 +573,7 @@ static int config_network_ipv4(const char *key, char *value, lxc_list_init(list); list->elem = inetdev; - addr = value; + addr = strdupa(value); cursor = strstr(addr, " "); if (cursor) { @@ -618,7 +620,7 @@ static int config_network_ipv4(const char *key, char *value, return 0; } -static int config_network_ipv4_gateway(const char *key, char *value, +static int config_network_ipv4_gateway(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -655,13 +657,13 @@ static int config_network_ipv4_gateway(const char *key, char *value, return 0; } -static int config_network_ipv6(const char *key, char *value, +static int config_network_ipv6(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; struct lxc_inet6dev *inet6dev; struct lxc_list *list; - char *slash; + char *slash,*valdup; char *netmask; netdev = network_netdev(key, value, &lxc_conf->network); @@ -684,8 +686,9 @@ static int config_network_ipv6(const char *key, char *value, lxc_list_init(list); list->elem = inet6dev; + valdup = strdupa(value); inet6dev->prefix = 64; - slash = strstr(value, "/"); + slash = strstr(valdup, "/"); if (slash) { *slash = '\0'; netmask = slash + 1; @@ -702,7 +705,7 @@ static int config_network_ipv6(const char *key, char *value, return 0; } -static int config_network_ipv6_gateway(const char *key, char *value, +static int config_network_ipv6_gateway(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -739,7 +742,7 @@ static int config_network_ipv6_gateway(const char *key, char *value, return 0; } -static int config_network_script(const char *key, char *value, +static int config_network_script(const char *key, const char *value, struct lxc_conf *lxc_conf) { struct lxc_netdev *netdev; @@ -780,7 +783,7 @@ static int add_hook(struct lxc_conf *lxc_conf, int which, char *hook) return 0; } -static int config_seccomp(const char *key, char *value, +static int config_seccomp(const char *key, const char *value, struct lxc_conf *lxc_conf) { char *path; @@ -802,7 +805,7 @@ static int config_seccomp(const char *key, char *value, return 0; } -static int config_hook(const char *key, char *value, +static int config_hook(const char *key, const char *value, struct lxc_conf *lxc_conf) { char *copy = strdup(value); @@ -825,7 +828,7 @@ static int config_hook(const char *key, char *value, return -1; } -static int config_personality(const char *key, char *value, +static int config_personality(const char *key, const const char *value, struct lxc_conf *lxc_conf) { signed long personality = lxc_config_parse_arch(value); @@ -838,7 +841,8 @@ static int config_personality(const char *key, char *value, return 0; } -static int config_pts(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_pts(const char *key, const char *value, + struct lxc_conf *lxc_conf) { int maxpts = atoi(value); @@ -847,7 +851,8 @@ static int config_pts(const char *key, char *value, struct lxc_conf *lxc_conf) return 0; } -static int config_tty(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_tty(const char *key, const char *value, + struct lxc_conf *lxc_conf) { int nbtty = atoi(value); @@ -856,7 +861,7 @@ static int config_tty(const char *key, char *value, struct lxc_conf *lxc_conf) return 0; } -static int config_ttydir(const char *key, char *value, +static int config_ttydir(const char *key, const char *value, struct lxc_conf *lxc_conf) { char *path; @@ -877,7 +882,8 @@ static int config_ttydir(const char *key, char *value, } #if HAVE_APPARMOR -static int config_aa_profile(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_aa_profile(const char *key, const char *value, + struct lxc_conf *lxc_conf) { char *path; @@ -897,7 +903,7 @@ static int config_aa_profile(const char *key, char *value, struct lxc_conf *lxc_ } #endif -static int config_autodev(const char *key, char *value, +static int config_autodev(const char *key, const char *value, struct lxc_conf *lxc_conf) { int v = atoi(value); @@ -907,7 +913,8 @@ static int config_autodev(const char *key, char *value, return 0; } -static int config_cgroup(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_cgroup(const char *key, const char *value, + struct lxc_conf *lxc_conf) { char *token = "lxc.cgroup."; char *subkey; @@ -992,7 +999,8 @@ static int config_fstab(const char *key, const char *value, return config_path_item(key, value, lxc_conf, &lxc_conf->fstab); } -static int config_mount(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_mount(const char *key, const char *value, + struct lxc_conf *lxc_conf) { char *fstab_token = "lxc.mount"; char *token = "lxc.mount.entry"; @@ -1028,7 +1036,7 @@ static int config_mount(const char *key, char *value, struct lxc_conf *lxc_conf) return 0; } -static int config_cap_drop(const char *key, char *value, +static int config_cap_drop(const char *key, const char *value, struct lxc_conf *lxc_conf) { char *dropcaps, *dropptr, *sptr, *token; @@ -1074,7 +1082,7 @@ static int config_cap_drop(const char *key, char *value, return ret; } -static int config_console(const char *key, char *value, +static int config_console(const char *key, const char *value, struct lxc_conf *lxc_conf) { char *path; @@ -1092,28 +1100,32 @@ static int config_console(const char *key, char *value, return 0; } -static int config_includefile(const char *key, char *value, +static int config_includefile(const char *key, const char *value, struct lxc_conf *lxc_conf) { return lxc_config_read(value, lxc_conf); } -static int config_rootfs(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_rootfs(const char *key, const char *value, + struct lxc_conf *lxc_conf) { return config_path_item(key, value, lxc_conf, &lxc_conf->rootfs.path); } -static int config_rootfs_mount(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_rootfs_mount(const char *key, const char *value, + struct lxc_conf *lxc_conf) { return config_path_item(key, value, lxc_conf, &lxc_conf->rootfs.mount); } -static int config_pivotdir(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_pivotdir(const char *key, const char *value, + struct lxc_conf *lxc_conf) { return config_path_item(key, value, lxc_conf, &lxc_conf->rootfs.pivot); } -static int config_utsname(const char *key, char *value, struct lxc_conf *lxc_conf) +static int config_utsname(const char *key, const char *value, + struct lxc_conf *lxc_conf) { struct utsname *utsname; @@ -1298,7 +1310,8 @@ static int lxc_get_arch_entry(struct lxc_conf *c, char *retv, int inlen) * If you ask for 'lxc.cgroup", then all cgroup entries will be printed, * in 'lxc.cgroup.subsystem.key = value' format. */ -static int lxc_get_cgroup_entry(struct lxc_conf *c, char *retv, int inlen, char *key) +static int lxc_get_cgroup_entry(struct lxc_conf *c, char *retv, int inlen, + const char *key) { int fulllen = 0, len; int all = 0; @@ -1323,7 +1336,8 @@ static int lxc_get_cgroup_entry(struct lxc_conf *c, char *retv, int inlen, char return fulllen; } -static int lxc_get_item_hooks(struct lxc_conf *c, char *retv, int inlen, char *key) +static int lxc_get_item_hooks(struct lxc_conf *c, char *retv, int inlen, + const char *key) { char *subkey; int len, fulllen = 0, found = -1; @@ -1398,7 +1412,8 @@ static int lxc_get_mount_entries(struct lxc_conf *c, char *retv, int inlen) * things like veth.pair return '' if invalid (i.e. if called for vlan * type). */ -static int lxc_get_item_nic(struct lxc_conf *c, char *retv, int inlen, char *key) +static int lxc_get_item_nic(struct lxc_conf *c, char *retv, int inlen, + const char *key) { char *p1; int len, fulllen = 0; @@ -1508,7 +1523,8 @@ static int lxc_get_item_network(struct lxc_conf *c, char *retv, int inlen) return fulllen; } -int lxc_get_config_item(struct lxc_conf *c, char *key, char *retv, int inlen) +int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv, + int inlen) { char *v = NULL; @@ -1559,7 +1575,7 @@ int lxc_get_config_item(struct lxc_conf *c, char *key, char *retv, int inlen) return strlen(v); } -int lxc_clear_config_item(struct lxc_conf *c, char *key) +int lxc_clear_config_item(struct lxc_conf *c, const char *key) { if (strcmp(key, "lxc.network") == 0) return lxc_clear_config_network(c); diff --git a/src/lxc/confile.h b/src/lxc/confile.h index 7c52447..a96efce 100644 --- a/src/lxc/confile.h +++ b/src/lxc/confile.h @@ -27,14 +27,14 @@ struct lxc_conf; struct lxc_list; -typedef int (*config_cb)(const char *, char *, struct lxc_conf *); +typedef int (*config_cb)(const char *, const char *, struct lxc_conf *); struct lxc_config_t { char *name; config_cb cb; }; extern struct lxc_config_t *lxc_getconfig(const char *key); -extern int lxc_list_nicconfigs(struct lxc_conf *c, char *key, char *retv, int inlen); +extern int lxc_list_nicconfigs(struct lxc_conf *c, const char *key, char *retv, int inlen); extern int lxc_listconfigs(char *retv, int inlen); extern int lxc_config_read(const char *file, struct lxc_conf *conf); extern int lxc_config_readline(char *buffer, struct lxc_conf *conf); @@ -46,7 +46,7 @@ extern int lxc_config_define_load(struct lxc_list *defines, /* needed for lxc-attach */ extern signed long lxc_config_parse_arch(const char *arch); -extern int lxc_get_config_item(struct lxc_conf *c, char *key, char *retv, int inlen); -extern int lxc_clear_config_item(struct lxc_conf *c, char *key); +extern int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv, int inlen); +extern int lxc_clear_config_item(struct lxc_conf *c, const char *key); extern void write_config(FILE *fout, struct lxc_conf *c); #endif diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h index 93849ec..349bbbc 100644 --- a/src/lxc/lxc.h +++ b/src/lxc/lxc.h @@ -182,7 +182,7 @@ extern const char const *lxc_version(void); /* * Create and return a new lxccontainer struct. */ -extern struct lxc_container *lxc_container_new(char *name); +extern struct lxc_container *lxc_container_new(const char *name); /* * Returns 1 on success, 0 on failure. diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index ed2c483..1f4d390 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -218,7 +218,7 @@ static pid_t lxcapi_init_pid(struct lxc_container *c) return ret; } -static bool load_config_locked(struct lxc_container *c, char *fname) +static bool load_config_locked(struct lxc_container *c, const char *fname) { if (!c->lxc_conf) c->lxc_conf = lxc_conf_init(); @@ -227,10 +227,10 @@ static bool load_config_locked(struct lxc_container *c, char *fname) return false; } -static bool lxcapi_load_config(struct lxc_container *c, char *alt_file) +static bool lxcapi_load_config(struct lxc_container *c, const char *alt_file) { bool ret = false; - char *fname; + const char *fname; if (!c) return false; @@ -253,7 +253,7 @@ static void lxcapi_want_daemonize(struct lxc_container *c) c->daemonize = 1; } -static bool lxcapi_wait(struct lxc_container *c, char *state, int timeout) +static bool lxcapi_wait(struct lxc_container *c, const char *state, int timeout) { int ret; @@ -284,7 +284,7 @@ static bool wait_on_daemonized_start(struct lxc_container *c) * I can't decide if it'd be more convenient for callers if we accept '...', * or a null-terminated array (i.e. execl vs execv) */ -static bool lxcapi_start(struct lxc_container *c, int useinit, char ** argv) +static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv[]) { int ret; struct lxc_conf *conf; @@ -499,7 +499,7 @@ static bool create_container_dir(struct lxc_container *c) * for ->create, argv contains the arguments to pass to the template, * terminated by NULL. If no arguments, you can just pass NULL. */ -static bool lxcapi_create(struct lxc_container *c, char *t, char **argv) +static bool lxcapi_create(struct lxc_container *c, char *t, char *const argv[]) { bool bret = false; pid_t pid; @@ -703,7 +703,7 @@ out: return bret; } -static bool lxcapi_clear_config_item(struct lxc_container *c, char *key) +static bool lxcapi_clear_config_item(struct lxc_container *c, const char *key) { int ret; @@ -717,7 +717,7 @@ static bool lxcapi_clear_config_item(struct lxc_container *c, char *key) return ret == 0; } -static int lxcapi_get_config_item(struct lxc_container *c, char *key, char *retv, int inlen) +static int lxcapi_get_config_item(struct lxc_container *c, const char *key, char *retv, int inlen) { int ret; @@ -731,7 +731,7 @@ static int lxcapi_get_config_item(struct lxc_container *c, char *key, char *retv return ret; } -static int lxcapi_get_keys(struct lxc_container *c, char *key, char *retv, int inlen) +static int lxcapi_get_keys(struct lxc_container *c, const char *key, char *retv, int inlen) { if (!key) return lxc_listconfigs(retv, inlen); @@ -754,7 +754,7 @@ static int lxcapi_get_keys(struct lxc_container *c, char *key, char *retv, int i /* default config file - should probably come through autoconf */ #define LXC_DEFAULT_CONFIG "/etc/lxc/lxc.conf" -static bool lxcapi_save_config(struct lxc_container *c, char *alt_file) +static bool lxcapi_save_config(struct lxc_container *c, const char *alt_file) { if (!alt_file) alt_file = c->configfile; @@ -815,7 +815,7 @@ again: return WEXITSTATUS(status) == 0; } -static bool lxcapi_set_config_item(struct lxc_container *c, char *key, char *v) +static bool lxcapi_set_config_item(struct lxc_container *c, const char *key, const char *v) { int ret; bool b = false; @@ -850,7 +850,7 @@ static char *lxcapi_config_file_name(struct lxc_container *c) return strdup(c->configfile); } -struct lxc_container *lxc_container_new(char *name) +struct lxc_container *lxc_container_new(const char *name) { struct lxc_container *c; int ret, len; diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h index cad31ee..2ad497e 100644 --- a/src/lxc/lxccontainer.h +++ b/src/lxc/lxccontainer.h @@ -25,9 +25,9 @@ struct lxc_container { bool (*freeze)(struct lxc_container *c); bool (*unfreeze)(struct lxc_container *c); pid_t (*init_pid)(struct lxc_container *c); - bool (*load_config)(struct lxc_container *c, char *alt_file); + bool (*load_config)(struct lxc_container *c, const char *alt_file); /* The '...' is the command line. If provided, it must be ended with a NULL */ - bool (*start)(struct lxc_container *c, int useinit, char ** argv); + bool (*start)(struct lxc_container *c, int useinit, char * const argv[]); bool (*startl)(struct lxc_container *c, int useinit, ...); bool (*stop)(struct lxc_container *c); void (*want_daemonize)(struct lxc_container *c); @@ -35,20 +35,20 @@ struct lxc_container { char *(*config_file_name)(struct lxc_container *c); // for wait, timeout == -1 means wait forever, timeout == 0 means don't wait. // otherwise timeout is seconds to wait. - bool (*wait)(struct lxc_container *c, char *state, int timeout); - bool (*set_config_item)(struct lxc_container *c, char *key, char *value); + bool (*wait)(struct lxc_container *c, const char *state, int timeout); + bool (*set_config_item)(struct lxc_container *c, const char *key, const char *value); bool (*destroy)(struct lxc_container *c); - bool (*save_config)(struct lxc_container *c, char *alt_file); - bool (*create)(struct lxc_container *c, char *t, char **argv); + bool (*save_config)(struct lxc_container *c, const char *alt_file); + bool (*create)(struct lxc_container *c, char *t, char *const argv[]); bool (*createl)(struct lxc_container *c, char *t, ...); /* send SIGPWR. if timeout is not 0 or -1, do a hard stop after timeout seconds */ bool (*shutdown)(struct lxc_container *c, int timeout); /* clear all network or capability items in the in-memory configuration */ - bool (*clear_config_item)(struct lxc_container *c, char *key); + bool (*clear_config_item)(struct lxc_container *c, const char *key); /* print a config item to a in-memory string allocated by the caller. Return * the length which was our would be printed. */ - int (*get_config_item)(struct lxc_container *c, char *key, char *retv, int inlen); - int (*get_keys)(struct lxc_container *c, char *key, char *retv, int inlen); + int (*get_config_item)(struct lxc_container *c, const char *key, char *retv, int inlen); + int (*get_keys)(struct lxc_container *c, const char *key, char *retv, int inlen); #if 0 bool (*commit_cgroups)(struct lxc_container *c); @@ -60,7 +60,7 @@ struct lxc_container { #endif }; -struct lxc_container *lxc_container_new(char *name); +struct lxc_container *lxc_container_new(const char *name); int lxc_container_get(struct lxc_container *c); int lxc_container_put(struct lxc_container *c); int lxc_get_wait_states(const char **states); diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index 95b4470..2d10d77 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -27,7 +27,7 @@ #define LXCLOCK_PREFIX "/lxcapi." -static char *lxclock_name(char *container) +static char *lxclock_name(const char *container) { int ret; int len = strlen(container) + strlen(LXCLOCK_PREFIX) + 1; @@ -62,7 +62,7 @@ static sem_t *lxc_new_unnamed_sem(void) return s; } -sem_t *lxc_newlock(char *name) +sem_t *lxc_newlock(const char *name) { char *lname; sem_t *lock; diff --git a/src/lxc/lxclock.h b/src/lxc/lxclock.h index 35df182..1226c22 100644 --- a/src/lxc/lxclock.h +++ b/src/lxc/lxclock.h @@ -44,7 +44,7 @@ * return NULL on failure, else a sem_t * which can be passed to * lxclock() and lxcunlock(). */ -extern sem_t *lxc_newlock(char *name); +extern sem_t *lxc_newlock(const char *name); /* * lxclock: take an existing lock. If timeout is 0, wait diff --git a/src/lxc/state.c b/src/lxc/state.c index be66739..7ce4b53 100644 --- a/src/lxc/state.c +++ b/src/lxc/state.c @@ -21,6 +21,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h> @@ -164,26 +165,33 @@ out: return ret; } -static int fillwaitedstates(char *strstates, int *states) +static int fillwaitedstates(const char *strstates, int *states) { char *token, *saveptr = NULL; + char *strstates_dup = strdup(strstates); int state; - token = strtok_r(strstates, "|", &saveptr); + if (!strstates_dup) + return -1; + + token = strtok_r(strstates_dup, "|", &saveptr); while (token) { state = lxc_str2state(token); - if (state < 0) + if (state < 0) { + free(strstates_dup); return -1; + } states[state] = 1; token = strtok_r(NULL, "|", &saveptr); } + free(strstates_dup); return 0; } -extern int lxc_wait(char *lxcname, char *states, int timeout) +extern int lxc_wait(const char *lxcname, const char *states, int timeout) { struct lxc_msg msg; int state, ret; diff --git a/src/lxc/state.h b/src/lxc/state.h index 77b3424..df8070a 100644 --- a/src/lxc/state.h +++ b/src/lxc/state.h @@ -33,6 +33,6 @@ extern lxc_state_t lxc_getstate(const char *name); extern lxc_state_t lxc_str2state(const char *state); extern const char *lxc_state2str(lxc_state_t state); -extern int lxc_wait(char *lxcname, char *states, int timeout); +extern int lxc_wait(const char *lxcname, const char *states, int timeout); #endif -- 1.7.1 ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel