1717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak/* 2717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* Copyright (c) International Business Machines Corp., 2009 3717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* This program is free software; you can redistribute it and/or modify 4717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* it under the terms of the GNU General Public License as published by 5717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* the Free Software Foundation; either version 2 of the License, or 6717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* (at your option) any later version. 7717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* 8717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* This program is distributed in the hope that it will be useful, 9717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* but WITHOUT ANY WARRANTY; without even the implied warranty of 10717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 11717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* the GNU General Public License for more details. 12717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* You should have received a copy of the GNU General Public License 13717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_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 15717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* 16717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* Author: Serge Hallyn <serue@us.ibm.com> 17717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* 18717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* Check mqueuefs lifetime 19717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . parent creates /dev/mqueue2 20717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . child mounts mqueue there 21717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . child does mq_open("/ab") 22717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . parent checks for /dev/mqueue2 23717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . child exits 24717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . parent checks for /dev/mqueue2 25717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . parent tries 'touch /dev/mqueue2/dd' -> should fail 26717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak* . parent umounts /dev/mqueue2 27717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 28717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak***************************************************************************/ 29717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 30be3fdcfb86982af9836b5ffea136a3a65c12d718yaberauneya#ifndef _GNU_SOURCE 31be3fdcfb86982af9836b5ffea136a3a65c12d718yaberauneya#define _GNU_SOURCE 32be3fdcfb86982af9836b5ffea136a3a65c12d718yaberauneya#endif 332f5ede3bf758e9dbbaeb20a21f4e86a2c1e98ed1Garrett Cooper#include <sys/types.h> 342f5ede3bf758e9dbbaeb20a21f4e86a2c1e98ed1Garrett Cooper#include <sys/stat.h> 35717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <sys/wait.h> 36717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <assert.h> 37717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <stdio.h> 38717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <stdlib.h> 39717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <unistd.h> 40717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <string.h> 41717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include <errno.h> 42717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#include "mqns.h" 43d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov#include "mqns_helper.h" 44717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 45717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modakchar *TCID = "posixmq_namespace_04"; 46354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint TST_TOTAL = 1; 47717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 48717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modakint p1[2]; 49717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modakint p2[2]; 50717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 51717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#define FNAM1 DEV_MQUEUE2 SLASH_MQ1 52717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak#define FNAM2 DEV_MQUEUE2 SLASH_MQ2 53717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 54717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modakint check_mqueue(void *vtest) 55717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak{ 56717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak char buf[30]; 57717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak mqd_t mqd; 58717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak int rc; 59717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 60d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov (void) vtest; 61d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov 62717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak close(p1[1]); 63717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak close(p2[0]); 64717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao read(p1[0], buf, 3); /* go */ 66717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 67359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek mqd = ltp_syscall(__NR_mq_open, NOSLASH_MQ1, O_RDWR | O_CREAT | O_EXCL, 68359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek 0755, NULL); 69717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (mqd == -1) { 70717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak write(p2[1], "mqfail", 7); 7188c166cc3a4f0720e3f723613789ced23db286c6subrata_modak tst_exit(); 72717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 73717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 743e8f77bfe4f8a1b620c736ca11e5ffc895b468fdyaberauneya mq_close(mqd); 75717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 76717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rc = mount("mqueue", DEV_MQUEUE2, "mqueue", 0, NULL); 77717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (rc == -1) { 78717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak perror("mount"); 79717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak write(p2[1], "mount", 6); 8088c166cc3a4f0720e3f723613789ced23db286c6subrata_modak tst_exit(); 81717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 82717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 83717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak write(p2[1], "go", 3); 84717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak read(p1[0], buf, 3); 85717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 8688c166cc3a4f0720e3f723613789ced23db286c6subrata_modak tst_exit(); 87717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak} 88717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 89d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkovstatic void setup(void) 90d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov{ 91d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis tst_require_root(); 92d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov check_mqns(); 93d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov} 94d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov 95717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modakint main(int argc, char *argv[]) 96717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak{ 97717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak int rc; 98717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak int status; 99717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak char buf[30]; 100717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak struct stat statbuf; 101717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak int use_clone = T_UNSHARE; 102717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 103d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov setup(); 104d1c8f682c2225cdd7170b17323850bcde5163269Artem Savkov 105717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (argc == 2 && strcmp(argv[1], "-clone") == 0) { 106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, 10745192246690d9c8389f48602dfeb8877d40094bcMonson Shao "Testing posix mq namespaces through clone(2)."); 108717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak use_clone = T_CLONE; 109717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } else 110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TINFO, 11145192246690d9c8389f48602dfeb8877d40094bcMonson Shao "Testing posix mq namespaces through unshare(2)."); 112717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (pipe(p1) == -1) { 114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao perror("pipe"); 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(EXIT_FAILURE); 116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if (pipe(p2) == -1) { 118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao perror("pipe"); 119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(EXIT_FAILURE); 120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 121717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 122717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak mkdir(DEV_MQUEUE2, 0755); 123717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 12445192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TINFO, "Checking mqueue filesystem lifetime"); 125717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 126717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak /* fire off the test */ 127717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rc = do_clone_unshare_test(use_clone, CLONE_NEWIPC, check_mqueue, NULL); 128717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (rc < 0) { 12945192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TFAIL, "failed clone/unshare"); 130717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 131717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 132717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 133717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak close(p1[0]); 134717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak close(p2[1]); 135717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak write(p1[1], "go", 3); 136717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 137717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak read(p2[0], buf, 7); 138717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (!strcmp(buf, "mqfail")) { 13945192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TFAIL, "child process could not create mqueue"); 140717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 141717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } else if (!strcmp(buf, "mount")) { 14245192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TFAIL, "child process could not mount mqueue"); 143717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 144717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 145717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 146717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rc = stat(FNAM1, &statbuf); 147717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (rc == -1) { 148717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak perror("stat"); 149717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak write(p1[1], "go", 3); 15045192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TFAIL, "parent could not see child's created mq"); 151717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 152717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 153717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak write(p1[1], "go", 3); 154717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 155717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rc = wait(&status); 156717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (rc == -1) { 157717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak perror("wait"); 15845192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TFAIL, "error while parent waited on child to exit"); 159717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 160717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 161717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (!WIFEXITED(status)) { 16245192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TFAIL, "Child did not exit normally (status %d)", 163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao status); 164717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 165717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 166717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rc = stat(FNAM1, &statbuf); 167717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (rc == -1) { 168354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 16945192246690d9c8389f48602dfeb8877d40094bcMonson Shao "parent's view of child's mq died with child"); 170717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 171717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 172717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 173717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rc = creat(FNAM2, 0755); 174717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak if (rc != -1) { 175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 17645192246690d9c8389f48602dfeb8877d40094bcMonson Shao "parent was able to create a file in dead child's mqfs"); 177717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak goto fail; 178717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak } 179717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 18045192246690d9c8389f48602dfeb8877d40094bcMonson Shao tst_resm(TPASS, "Child mqueue fs still visible for parent"); 181717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 182717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modakfail: 183717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak umount(DEV_MQUEUE2); 184717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak rmdir(DEV_MQUEUE2); 185717937a59ca9d7b1375c6b28963369a5f8c444e6subrata_modak 1862c28215423293e443469a07ae7011135d058b671Garrett Cooper tst_exit(); 187ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 188