setns.h revision eecee42404c961f6ee63ecaffd144b91fb1ca6a2
1eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek/* 2eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * Copyright (C) 2013 Linux Test Project, Inc. 3eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * 4eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * This program is free software; you can redistribute it and/or 5eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * modify it under the terms of version 2 of the GNU General Public 6eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * License as published by the Free Software Foundation. 7eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * 8eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * This program is distributed in the hope that it would be useful, 9eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * but WITHOUT ANY WARRANTY; without even the implied warranty of 10eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * 12eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * Further, this software is distributed without any warranty that it 13eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * is free of the rightful claim of any third person regarding 14eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * infringement or the like. Any license provided herein, whether 15eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * implied or otherwise, applies only to this software file. Patent 16eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * licenses, if any, provided herein do not apply to combinations of 17eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * this program with other software, or any other product whatsoever. 18eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * 19eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * You should have received a copy of the GNU General Public License 20eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * along with this program; if not, write the Free Software 21eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 22eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek * 02110-1301, USA. 23eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek */ 24eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 25eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#define NS_MAX 5 26eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic int ns_types[NS_MAX]; 27eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic int ns_fds[NS_MAX]; 28eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic int ns_total; 29eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 30eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic int get_ns_fd(int pid, const char *ns) 31eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek{ 32eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek char tmp[PATH_MAX]; 33eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek struct stat st; 34eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek int fd = -1; 35eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 36eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek sprintf(tmp, "/proc/%d/ns/%s", pid, ns); 37eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek if (stat(tmp, &st) == 0) { 38eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek fd = open(tmp, O_RDONLY); 39eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek if (fd == -1) 40eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek tst_brkm(TBROK|TERRNO, NULL, "failed to open %s", tmp); 41eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek } else { 42eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek if (errno != ENOENT) 43eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek tst_brkm(TBROK|TERRNO, NULL, "failed to stat %s", tmp); 44eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek } 45eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek return fd; 46eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek} 47eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 48eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic void init_ns_type(int clone_type, const char *proc_name) 49eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek{ 50eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek int fd; 51eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 52eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek fd = get_ns_fd(getpid(), proc_name); 53eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek if (fd != -1) { 54eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek ns_types[ns_total] = clone_type; 55eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek ns_fds[ns_total] = fd; 56eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek tst_resm(TINFO, "ns_fds[%d]=%d, ns_types[%d]=0x%x", ns_total, 57eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek fd, ns_total, clone_type); 58eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek ns_total++; 59eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek } 60eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek} 61eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 62eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic void init_available_ns(void) 63eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek{ 64eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#if defined(CLONE_NEWIPC) 65eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek init_ns_type(CLONE_NEWIPC, "ipc"); 66eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#endif 67eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#if defined(CLONE_NEWNS) 68eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek init_ns_type(CLONE_NEWNS, "mnt"); 69eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#endif 70eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#if defined(CLONE_NEWNET) 71eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek init_ns_type(CLONE_NEWNET, "net"); 72eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#endif 73eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#if defined(CLONE_NEWPID) 74eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek init_ns_type(CLONE_NEWPID, "pid"); 75eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#endif 76eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#if defined(CLONE_NEWUTS) 77eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek init_ns_type(CLONE_NEWUTS, "uts"); 78eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek#endif 79eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek} 80eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 81eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancekstatic void close_ns_fds(void) 82eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek{ 83eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek int i; 84eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek 85eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek for (i = 0; i < ns_total; i++) 86eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek if (ns_fds[i] != -1) 87eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek close(ns_fds[i]); 88eecee42404c961f6ee63ecaffd144b91fb1ca6a2Jan Stancek} 89