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