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