1 /*
2 *
3 * Copyright (c) International Business Machines Corp., 2001
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 /*
21 * NAME
22 * msgget02.c
23 *
24 * DESCRIPTION
25 * msgget02 - test for EEXIST and ENOENT errors
26 *
27 * ALGORITHM
28 * create a message queue
29 * loop if that option was specified
30 * try to recreate the same queue - test #1
31 * try to access a queue that doesn't exist - tests #2 & #3
32 * check the errno value
33 * issue a PASS message if we get EEXIST or ENOENT depening on test
34 * otherwise, the tests fails
35 * issue a FAIL message
36 * break any remaining tests
37 * call cleanup
38 *
39 * USAGE: <for command-line>
40 * msgget02 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
41 * where, -c n : Run n copies concurrently.
42 * -e : Turn on errno logging.
43 * -i n : Execute test n times.
44 * -I x : Execute test for x seconds.
45 * -P x : Pause for x seconds between iterations.
46 * -t : Turn on syscall timing.
47 *
48 * HISTORY
49 * 03/2001 - Written by Wayne Boyer
50 *
51 * 28/03/2008 Renaud Lottiaux (Renaud.Lottiaux@kerlabs.com)
52 * - Fix concurrency issue. The second key used for this test was
53 * sometime conflicting with the key from another task.
54 * Generate a valid second key through getipckey to avoid conflicts.
55 *
56 * RESTRICTIONS
57 * none
58 */
59
60 #include "test.h"
61
62 #include "ipcmsg.h"
63
64 char *TCID = "msgget02";
65 int TST_TOTAL = 3;
66
67 struct test_case_t {
68 int error;
69 int msgkey;
70 int flags;
71 } TC[] = {
72 {
73 EEXIST, 0, IPC_CREAT | IPC_EXCL}, {
74 ENOENT, 1, IPC_PRIVATE}, {
75 ENOENT, 1, IPC_EXCL}
76 };
77
78 key_t msgkey1;
79 int msg_q_1 = -1; /* The message queue id created in setup */
80
main(int ac,char ** av)81 int main(int ac, char **av)
82 {
83 int lc;
84 int i;
85 key_t key;
86
87 tst_parse_opts(ac, av, NULL, NULL);
88
89 setup(); /* global setup */
90
91 /* The following loop checks looping state if -i option given */
92
93 for (lc = 0; TEST_LOOPING(lc); lc++) {
94 /* reset tst_count in case we are looping */
95 tst_count = 0;
96
97 /* loop through the test cases */
98
99 for (i = 0; i < TST_TOTAL; i++) {
100
101 if (TC[i].msgkey == 0)
102 key = msgkey;
103 else
104 key = msgkey1;
105
106 TEST(msgget(key, TC[i].flags));
107
108 if (TEST_RETURN != -1) {
109 tst_resm(TFAIL, "msgget() call succeeded "
110 "on expected fail");
111 continue;
112 }
113
114 switch (TEST_ERRNO) {
115 case ENOENT:
116 /*FALLTHROUGH*/ case EEXIST:
117 if (TEST_ERRNO == TC[i].error) {
118 tst_resm(TPASS, "expected failure - "
119 "errno = %d : %s", TEST_ERRNO,
120 strerror(TEST_ERRNO));
121 break;
122 }
123 /*FALLTHROUGH*/ default:
124 tst_resm(TFAIL, "call failed with an "
125 "unexpected error - %d : %s",
126 TEST_ERRNO, strerror(TEST_ERRNO));
127 break;
128 }
129 }
130 }
131
132 cleanup();
133
134 tst_exit();
135 }
136
137 /*
138 * setup() - performs all the ONE TIME setup for this test.
139 */
setup(void)140 void setup(void)
141 {
142
143 tst_sig(NOFORK, DEF_HANDLER, cleanup);
144
145 TEST_PAUSE;
146
147 /*
148 * Create a temporary directory and cd into it.
149 * This helps to ensure that a unique msgkey is created.
150 * See ../lib/libipc.c for more information.
151 */
152 tst_tmpdir();
153
154 msgkey = getipckey();
155 msgkey1 = getipckey();
156
157 /* now we have a key, so let's create a message queue */
158 if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL)) == -1) {
159 system("ipcs > /tmp/toto");
160 system("ps -aux >> /tmp/toto");
161 tst_brkm(TBROK, cleanup, "Can't create message queue");
162 }
163 }
164
165 /*
166 * cleanup() - performs all the ONE TIME cleanup for this test at completion
167 * or premature exit.
168 */
cleanup(void)169 void cleanup(void)
170 {
171 /* if it exists, remove the message queue that was created. */
172 rm_queue(msg_q_1);
173
174 tst_rmdir();
175
176 }
177