Merge pull request #1312 from brauner/2016-11-22/fix_lxc_unshare_parsing

tools: replace non-standard namespace identifiers
This commit is contained in:
Stéphane Graber 2016-11-22 12:12:21 -05:00 committed by GitHub
commit dea1cfbd16
2 changed files with 52 additions and 4 deletions

View File

@ -107,6 +107,8 @@ static int add_to_simple_array(char ***array, ssize_t *capacity, char *value)
static int my_parser(struct lxc_arguments* args, int c, char* arg)
{
char **it;
char *del;
int ret;
switch (c) {
@ -125,6 +127,30 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg)
break;
case 's':
namespace_flags = 0;
/* The identifiers for namespaces used with lxc-attach as given
* on the manpage do not align with the standard identifiers.
* This affects network, mount, and uts namespaces. The standard
* identifiers are: "mnt", "uts", and "net" whereas lxc-attach
* uses "MOUNT", "UTSNAME", and "NETWORK". So let's use some
* cheap memmove()s to replace them by their standard
* identifiers. Let's illustrate this with an example:
* Assume the string:
*
* "IPC|MOUNT|PID"
*
* then we memmove()
*
* dest: del + 1 == ONT|PID
* src: del + 3 == NT|PID
*/
while ((del = strstr(arg, "MOUNT")))
memmove(del + 1, del + 3, strlen(del) - 2);
for (it = (char *[]){"NETWORK", "UTSNAME", NULL}; it && *it; it++)
while ((del = strstr(arg, *it)))
memmove(del + 3, del + 7, strlen(del) - 6);
ret = lxc_fill_namespace_flags(arg, &namespace_flags);
if (ret)
return -1;

View File

@ -76,7 +76,7 @@ static void usage(char *cmd)
fprintf(stderr, "\t -i <iface> : Interface name to be moved into container (presumably with NETWORK unsharing set)\n");
fprintf(stderr, "\t -H <hostname>: Set the hostname in the container\n");
fprintf(stderr, "\t -d : Daemonize (do not wait for container to exit)\n");
fprintf(stderr, "\t -M : reMount default fs inside container (/proc /dev/shm /dev/mqueue)\n");
fprintf(stderr, "\t -M : Remount default fs inside container (/proc /dev/shm /dev/mqueue)\n");
_exit(EXIT_SUCCESS);
}
@ -151,12 +151,12 @@ static int do_start(void *arg)
int main(int argc, char *argv[])
{
char *del;
char **it, **args;
int opt, status;
int ret;
char *namespaces = NULL;
char **args;
int flags = 0;
int daemonize = 0;
int flags = 0, daemonize = 0;
uid_t uid = 0; /* valid only if (flags & CLONE_NEWUSER) */
pid_t pid;
struct my_iflist *tmpif, *my_iflist = NULL;
@ -213,6 +213,28 @@ int main(int argc, char *argv[])
if (ret)
exit(EXIT_FAILURE);
/* The identifiers for namespaces used with lxc-unshare as given on the
* manpage do not align with the standard identifiers. This affects
* network, mount, and uts namespaces. The standard identifiers are:
* "mnt", "uts", and "net" whereas lxc-unshare uses "MOUNT", "UTSNAME",
* and "NETWORK". So let's use some cheap memmove()s to replace them by
* their standard identifiers. Let's illustrate this with an example:
* Assume the string:
*
* "IPC|MOUNT|PID"
*
* then we memmove()
*
* dest: del + 1 == ONT|PID
* src: del + 3 == NT|PID
*/
while ((del = strstr(namespaces, "MOUNT")))
memmove(del + 1, del + 3, strlen(del) - 2);
for (it = (char *[]){"NETWORK", "UTSNAME", NULL}; it && *it; it++)
while ((del = strstr(namespaces, *it)))
memmove(del + 3, del + 7, strlen(del) - 6);
ret = lxc_fill_namespace_flags(namespaces, &flags);
if (ret)
usage(argv[0]);