18cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak/*
2c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* Copyright (c) International Business Machines Corp., 2007
3c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* This program is free software; you can redistribute it and/or modify
4c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* it under the terms of the GNU General Public License as published by
5c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* the Free Software Foundation; either version 2 of the License, or
6c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* (at your option) any later version.
7c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak*
8c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* This program is distributed in the hope that it will be useful,
9c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* but WITHOUT ANY WARRANTY; without even the implied warranty of
10c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
11c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* the GNU General Public License for more details.
12c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* You should have received a copy of the GNU General Public License
13c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* along with this program; if not, write to the Free Software
144548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak*
16c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* Author: Serge Hallyn <serue@us.ibm.com>
17c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak*
18c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* Create shm with key 0xEAEAEA
19c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* clone, clone(CLONE_NEWIPC), or unshare(CLONE_NEWIPC)
20c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak* In cloned process, try to get the created shm
21c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak
22c2aab6c5dac302afdd6a40ac93459c2330b47af6subrata_modak***************************************************************************/
238cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
248cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#define _GNU_SOURCE 1
258cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <sys/wait.h>
268cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <assert.h>
278cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <stdio.h>
288cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <stdlib.h>
298cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <unistd.h>
308cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <string.h>
318cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <errno.h>
328cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <sys/ipc.h>
338cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#include <sys/shm.h>
34287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov#include "ipcns_helper.h"
3538e181cbc686d59dcfd1b1b90ee0d8e5f1dd7505Cyril Hrubis#include "test.h"
368cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
378cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modakchar *TCID = "sysvipc_namespace";
38354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint TST_TOTAL = 1;
398cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#define TESTKEY 0xEAEAEA
408cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
418cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modakint p1[2];
428cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modakint p2[2];
438cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
448cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modakint check_shmid(void *vtest)
458cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak{
46354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char buf[3];
47354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int id;
488cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
49287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov	(void) vtest;
50287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov
51354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	close(p1[1]);
52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	close(p2[0]);
538cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	read(p1[0], buf, 3);
55354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	id = shmget(TESTKEY, 100, 0);
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (id == -1) {
57354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		write(p2[1], "notfnd", 7);
58354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else {
59354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		write(p2[1], "exists", 7);
60354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		shmctl(id, IPC_RMID, NULL);
61354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
621e9d84b1c4da16705e6c67baa46e250a9d5fa66csubrata_modak
63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_exit();
648cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak}
658cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
66287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkovstatic void setup(void)
67287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov{
68d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis	tst_require_root();
69287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov	check_newipc();
70287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov}
71287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov
728cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#define UNSHARESTR "unshare"
738cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#define CLONESTR "clone"
748cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak#define NONESTR "none"
758cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modakint main(int argc, char *argv[])
768cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak{
77354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int r, use_clone = T_NONE;
78354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int id;
79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *tsttype = NONESTR;
80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char buf[7];
818cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
82287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov	setup();
83287fdd0d814043a3bc0c332375438e33f39e480aArtem Savkov
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (argc != 2) {
8545192246690d9c8389f48602dfeb8877d40094bcMonson Shao		tst_resm(TFAIL, "Usage: %s <clone|unshare|none>", argv[0]);
86526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TFAIL,
87526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis			 NULL,
88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 " where clone, unshare, or fork specifies unshare method.");
89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (pipe(p1) == -1) {
91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		perror("pipe");
92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		exit(EXIT_FAILURE);
93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (pipe(p2) == -1) {
95354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		perror("pipe");
96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		exit(EXIT_FAILURE);
97354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tsttype = NONESTR;
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (strcmp(argv[1], "clone") == 0) {
100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		use_clone = T_CLONE;
101354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tsttype = CLONESTR;
102354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if (strcmp(argv[1], "unshare") == 0) {
103354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		use_clone = T_UNSHARE;
104354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tsttype = UNSHARESTR;
105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1068cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* first create the key */
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	id = shmget(TESTKEY, 100, IPC_CREAT);
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (id == -1) {
110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		perror("shmget");
111526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TFAIL, NULL, "shmget failed");
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1138cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
11445192246690d9c8389f48602dfeb8877d40094bcMonson Shao	tst_resm(TINFO, "shmid namespaces test : %s", tsttype);
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* fire off the test */
116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	r = do_clone_unshare_test(use_clone, CLONE_NEWIPC, check_shmid, NULL);
117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (r < 0) {
118526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TFAIL, NULL, "%s failed", tsttype);
119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1208cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	close(p1[0]);
122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	close(p2[1]);
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	write(p1[1], "go", 3);
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	read(p2[0], buf, 7);
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (strcmp(buf, "exists") == 0) {
126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (use_clone == T_NONE)
12745192246690d9c8389f48602dfeb8877d40094bcMonson Shao			tst_resm(TPASS, "plain cloned process found shmid");
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		else
12945192246690d9c8389f48602dfeb8877d40094bcMonson Shao			tst_resm(TFAIL, "%s: child process found shmid",
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 tsttype);
131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else {
132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (use_clone == T_NONE)
133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_resm(TFAIL,
13445192246690d9c8389f48602dfeb8877d40094bcMonson Shao				 "plain cloned process didn't find shmid");
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		else
13645192246690d9c8389f48602dfeb8877d40094bcMonson Shao			tst_resm(TPASS, "%s: child process didn't find shmid",
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 tsttype);
138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
1398cd7305413205aa7cbd7ca23ce8fef55e31ae778subrata_modak
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* destroy the key */
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	shmctl(id, IPC_RMID, NULL);
1421e9d84b1c4da16705e6c67baa46e250a9d5fa66csubrata_modak
143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_exit();
144ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
145