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;
568e0f8b158aa3015bfccc6e1b16dd2baee5d03e45Monson Shao		tst_resm(TINFO, "ns_name=%s, ns_fds[%d]=%d, ns_types[%d]=0x%x",
578e0f8b158aa3015bfccc6e1b16dd2baee5d03e45Monson Shao			 proc_name, ns_total, 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