view toys/unshare.c @ 551:2548e6e590b2

Add string to mode_t parser added new function string_to_mode(char *m_string, mode_t base) which parses a given string and converts it to a mode_t. If either + or - are part of m_string the permissions are either added or removed from base. Currently support for permision copy is missing (e.g. g=u), but all other flags should work. Format for m_string: either symbolic modes or octal representation. symbolic modes: [auog][[+-=][rwxst]*] examples: string_to_mode("u=rwx,g=rw,o=r", 0); string_to_mode("a-x", 0777); string_to_mode("0744", 0);
author Daniel Walter <d.walter@0x90.at>
date Mon, 19 Mar 2012 19:57:56 -0500
parents 99cb6ad605ee
children
line wrap: on
line source

/* vi: set sw=4 ts=4:
 *
 * unshare.c - run command in new context
 *
 * Copyright 2011 Rob Landley <rob@landley.net>
 *
 * Not in SUSv4.

USE_UNSHARE(NEWTOY(unshare, "<1^nium", TOYFLAG_USR|TOYFLAG_BIN))

config UNSHARE
	bool "unshare"
	default y
	depends on TOYBOX_CONTAINER
	help
	  usage: unshare [-muin] COMMAND...

	  Create new namespace(s) for this process and its children, so some
	  attribute is not shared with the parent process.  This is part of
	  Linux Containers.  Each process can have its own:

	  -m	Mount/unmount tree
	  -u	Host and domain names
	  -i	SysV IPC (message queues, semaphores, shared memory)
	  -n	Network address, sockets, routing, iptables
*/

#include "toys.h"
#include <linux/sched.h>
extern int unshare (int __flags);

void unshare_main(void)
{
	unsigned flags[]={CLONE_NEWNS, CLONE_NEWUTS, CLONE_NEWIPC, CLONE_NEWNET,0};
	unsigned f=0;
	int i;

	for (i=0; flags[i]; i++)
		if (toys.optflags & (1<<i))
			f |= flags[i];

	if(unshare(f)) perror_exit("failed");

	xexec(toys.optargs);
}