robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 1 | /* |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 2 | * Copyright (c) International Business Machines Corp., 2002 |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 3 | * |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 4 | * This program is free software; you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License as published by |
| 6 | * the Free Software Foundation; either version 2 of the License, or |
| 7 | * (at your option) any later version. |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 8 | * |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 9 | * This program is distributed in the hope that it will be useful, |
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| 12 | * the GNU General Public License for more details. |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 13 | * |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 14 | * You should have received a copy of the GNU General Public License |
| 15 | * along with this program; if not, write to the Free Software |
| 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 17 | * |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 18 | * 06/30/2001 Port to Linux nsharoff@us.ibm.com |
| 19 | * 11/06/2002 Port to LTP dbarrera@us.ibm.com |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 20 | */ |
| 21 | |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 22 | /* |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 23 | * Get and manipulate a message queue. |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 24 | */ |
| 25 | |
| 26 | #define _XOPEN_SOURCE 500 |
| 27 | #include <signal.h> |
| 28 | #include <errno.h> |
| 29 | #include <string.h> |
| 30 | #include <fcntl.h> |
| 31 | #include <stdlib.h> |
| 32 | #include <stdio.h> |
| 33 | #include <unistd.h> |
robbiew | ef4118b | 2003-01-17 18:56:04 +0000 | [diff] [blame] | 34 | #include <values.h> |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 35 | #include <sys/types.h> |
| 36 | #include <sys/wait.h> |
| 37 | #include <sys/stat.h> |
| 38 | #include <sys/ipc.h> |
| 39 | #include <sys/msg.h> |
| 40 | #include "test.h" |
subrata_modak | 440341b | 2008-02-20 09:40:48 +0000 | [diff] [blame] | 41 | #include "ipcmsg.h" |
Peng Haitao | 1f1e15a | 2013-12-02 10:30:05 +0800 | [diff] [blame] | 42 | #include "../lib/libmsgctl.h" |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 43 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 44 | char *TCID = "msgctl08"; |
| 45 | int TST_TOTAL = 1; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 46 | |
robbiew | 6eaecb2 | 2005-12-22 20:18:22 +0000 | [diff] [blame] | 47 | #ifndef CONFIG_COLDFIRE |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 48 | #define MAXNPROCS 1000000 /* This value is set to an arbitrary high limit. */ |
robbiew | 6eaecb2 | 2005-12-22 20:18:22 +0000 | [diff] [blame] | 49 | #else |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 50 | #define MAXNPROCS 100000 /* Coldfire can't deal with 1000000 */ |
robbiew | 6eaecb2 | 2005-12-22 20:18:22 +0000 | [diff] [blame] | 51 | #endif |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 52 | #define MAXNREPS 100000 |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 53 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 54 | static key_t keyarray[MAXNPROCS]; |
| 55 | static int pidarray[MAXNPROCS]; |
| 56 | static int tid; |
| 57 | static int MSGMNI, nprocs, nreps; |
| 58 | static int procstat; |
| 59 | static int mykid; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 60 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 61 | void setup(void); |
| 62 | void cleanup(void); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 63 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 64 | static int dotest(key_t key, int child_process); |
| 65 | static void sig_handler(); |
| 66 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 67 | #ifdef UCLINUX |
| 68 | static char *argv0; |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 69 | static key_t key_uclinux; |
| 70 | static int i_uclinux; |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 71 | static int id_uclinux; |
| 72 | static int child_process_uclinux; |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 73 | |
| 74 | static void do_child_1_uclinux(void); |
| 75 | static void do_child_2_uclinux(void); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 76 | #endif |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 77 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 78 | int main(int argc, char **argv) |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 79 | { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 80 | int i, j, ok, pid; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 81 | int count, status; |
robbiew | d16a793 | 2005-02-24 17:02:44 +0000 | [diff] [blame] | 82 | struct sigaction act; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 83 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 84 | #ifdef UCLINUX |
Cyril Hrubis | 7422562 | 2014-06-02 17:54:38 +0200 | [diff] [blame] | 85 | const char *msg; |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 86 | |
| 87 | argv0 = argv[0]; |
| 88 | |
Cyril Hrubis | 7422562 | 2014-06-02 17:54:38 +0200 | [diff] [blame] | 89 | if ((msg = parse_opts(argc, argv, NULL, NULL)) != NULL) |
Garrett Cooper | 60fa801 | 2010-11-22 13:50:58 -0800 | [diff] [blame] | 90 | tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 91 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 92 | maybe_run_child(&do_child_1_uclinux, "ndd", 1, &key_uclinux, |
| 93 | &i_uclinux); |
| 94 | maybe_run_child(&do_child_2_uclinux, "nddd", 2, &id_uclinux, |
| 95 | &key_uclinux, &child_process_uclinux); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 96 | #endif |
| 97 | |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 98 | setup(); |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 99 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 100 | if (argc == 1) { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 101 | /* Set default parameters */ |
| 102 | nreps = MAXNREPS; |
robbiew | ef4118b | 2003-01-17 18:56:04 +0000 | [diff] [blame] | 103 | nprocs = MSGMNI; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 104 | } else if (argc == 3) { |
| 105 | if (atoi(argv[1]) > MAXNREPS) { |
| 106 | tst_resm(TCONF, |
| 107 | "Requested number of iterations too large, setting to Max. of %d", |
| 108 | MAXNREPS); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 109 | nreps = MAXNREPS; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 110 | } else { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 111 | nreps = atoi(argv[1]); |
| 112 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 113 | if (atoi(argv[2]) > MSGMNI) { |
| 114 | tst_resm(TCONF, |
| 115 | "Requested number of processes too large, setting to Max. of %d", |
| 116 | MSGMNI); |
robbiew | ef4118b | 2003-01-17 18:56:04 +0000 | [diff] [blame] | 117 | nprocs = MSGMNI; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 118 | } else { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 119 | nprocs = atoi(argv[2]); |
| 120 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 121 | } else { |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 122 | tst_brkm(TCONF, |
| 123 | NULL, |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 124 | " Usage: %s [ number of iterations number of processes ]", |
| 125 | argv[0]); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 126 | } |
| 127 | |
| 128 | srand(getpid()); |
| 129 | tid = -1; |
| 130 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 131 | /* Setup signal handling routine */ |
robbiew | d16a793 | 2005-02-24 17:02:44 +0000 | [diff] [blame] | 132 | memset(&act, 0, sizeof(act)); |
| 133 | act.sa_handler = sig_handler; |
| 134 | sigemptyset(&act.sa_mask); |
| 135 | sigaddset(&act.sa_mask, SIGTERM); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 136 | if (sigaction(SIGTERM, &act, NULL) < 0) { |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 137 | tst_brkm(TFAIL, NULL, "Sigset SIGTERM failed"); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 138 | } |
| 139 | /* Set up array of unique keys for use in allocating message |
| 140 | * queues |
| 141 | */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 142 | for (i = 0; i < nprocs; i++) { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 143 | ok = 1; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 144 | do { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 145 | /* Get random key */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 146 | keyarray[i] = (key_t) rand(); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 147 | /* Make sure key is unique and not private */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 148 | if (keyarray[i] == IPC_PRIVATE) { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 149 | ok = 0; |
| 150 | continue; |
| 151 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 152 | for (j = 0; j < i; j++) { |
| 153 | if (keyarray[j] == keyarray[i]) { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 154 | ok = 0; |
| 155 | break; |
| 156 | } |
| 157 | ok = 1; |
| 158 | } |
| 159 | } while (ok == 0); |
| 160 | } |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 161 | |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 162 | /* Fork a number of processes, each of which will |
| 163 | * create a message queue with one reader/writer |
| 164 | * pair which will read and write a number (iterations) |
| 165 | * of random length messages with specific values. |
| 166 | */ |
| 167 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 168 | for (i = 0; i < nprocs; i++) { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 169 | fflush(stdout); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 170 | if ((pid = FORK_OR_VFORK()) < 0) { |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 171 | tst_brkm(TFAIL, |
| 172 | NULL, |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 173 | "\tFork failed (may be OK if under stress)"); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 174 | } |
| 175 | /* Child does this */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 176 | if (pid == 0) { |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 177 | #ifdef UCLINUX |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 178 | if (self_exec(argv[0], "ndd", 1, keyarray[i], i) < 0) { |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 179 | tst_brkm(TFAIL, NULL, "\tself_exec failed"); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 180 | } |
| 181 | #else |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 182 | procstat = 1; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 183 | exit(dotest(keyarray[i], i)); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 184 | #endif |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 185 | } |
| 186 | pidarray[i] = pid; |
| 187 | } |
| 188 | |
| 189 | count = 0; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 190 | while (1) { |
| 191 | if ((wait(&status)) > 0) { |
| 192 | if (status >> 8 != 0) { |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 193 | tst_brkm(TFAIL, NULL, |
| 194 | "Child exit status = %d", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 195 | status >> 8); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 196 | } |
| 197 | count++; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 198 | } else { |
| 199 | if (errno != EINTR) { |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 200 | break; |
| 201 | } |
| 202 | #ifdef DEBUG |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 203 | tst_resm(TINFO, "Signal detected during wait"); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 204 | #endif |
| 205 | } |
| 206 | } |
| 207 | /* Make sure proper number of children exited */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 208 | if (count != nprocs) { |
Cyril Hrubis | 526fdf8 | 2014-12-04 14:35:01 +0100 | [diff] [blame] | 209 | tst_brkm(TFAIL, |
| 210 | NULL, |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 211 | "Wrong number of children exited, Saw %d, Expected %d", |
| 212 | count, nprocs); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 213 | } |
| 214 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 215 | tst_resm(TPASS, "msgctl08 ran successfully!"); |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 216 | |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 217 | cleanup(); |
Cyril Hrubis | 4dff854 | 2014-09-23 12:11:59 +0200 | [diff] [blame] | 218 | tst_exit(); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 219 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 220 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 221 | #ifdef UCLINUX |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 222 | static void do_child_1_uclinux(void) |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 223 | { |
| 224 | procstat = 1; |
| 225 | exit(dotest(key_uclinux, i_uclinux)); |
| 226 | } |
| 227 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 228 | static void do_child_2_uclinux(void) |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 229 | { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 230 | exit(doreader(key_uclinux, id_uclinux, 1, |
| 231 | child_process_uclinux, nreps)); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 232 | } |
| 233 | #endif |
| 234 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 235 | static int dotest(key_t key, int child_process) |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 236 | { |
| 237 | int id, pid; |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 238 | int ret, status; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 239 | |
| 240 | sighold(SIGTERM); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 241 | TEST(msgget(key, IPC_CREAT | S_IRUSR | S_IWUSR)); |
| 242 | if (TEST_RETURN < 0) { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 243 | printf("msgget() error in child %d: %s\n", |
| 244 | child_process, strerror(TEST_ERRNO)); |
| 245 | |
| 246 | return FAIL; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 247 | } |
| 248 | tid = id = TEST_RETURN; |
| 249 | sigrelse(SIGTERM); |
| 250 | |
| 251 | fflush(stdout); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 252 | if ((pid = FORK_OR_VFORK()) < 0) { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 253 | printf("\tFork failed (may be OK if under stress)\n"); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 254 | TEST(msgctl(tid, IPC_RMID, 0)); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 255 | if (TEST_RETURN < 0) { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 256 | printf("mscgtl() error in cleanup: %s\n", |
| 257 | strerror(TEST_ERRNO)); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 258 | } |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 259 | return FAIL; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 260 | } |
| 261 | /* Child does this */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 262 | if (pid == 0) { |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 263 | #ifdef UCLINUX |
| 264 | if (self_exec(argv0, "nddd", 2, id, key, child_process) < 0) { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 265 | printf("self_exec failed\n"); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 266 | TEST(msgctl(tid, IPC_RMID, 0)); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 267 | if (TEST_RETURN < 0) { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 268 | printf("msgctl() error in cleanup: %s\n", |
| 269 | strerror(errno)); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 270 | } |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 271 | return FAIL; |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 272 | } |
| 273 | #else |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 274 | exit(doreader(key, id, 1, child_process, nreps)); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 275 | #endif |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 276 | } |
| 277 | /* Parent does this */ |
| 278 | mykid = pid; |
| 279 | procstat = 2; |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 280 | ret = dowriter(key, id, 1, child_process, nreps); |
| 281 | wait(&status); |
| 282 | |
| 283 | if (ret != PASS) |
| 284 | exit(FAIL); |
| 285 | |
| 286 | if ((!WIFEXITED(status) || (WEXITSTATUS(status) != PASS))) |
| 287 | exit(FAIL); |
| 288 | |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 289 | TEST(msgctl(id, IPC_RMID, 0)); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 290 | if (TEST_RETURN < 0) { |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 291 | printf("msgctl() errno %d: %s\n", |
| 292 | TEST_ERRNO, strerror(TEST_ERRNO)); |
| 293 | |
| 294 | return FAIL; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 295 | } |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 296 | return PASS; |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 297 | } |
| 298 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 299 | static void sig_handler(void) |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 300 | { |
| 301 | } |
| 302 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 303 | void setup(void) |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 304 | { |
subrata_modak | 5b69374 | 2008-02-22 08:33:53 +0000 | [diff] [blame] | 305 | int nr_msgqs; |
| 306 | |
robbiew | f6e92cd | 2003-01-17 21:06:36 +0000 | [diff] [blame] | 307 | tst_tmpdir(); |
subrata_modak | 4bb656a | 2009-02-26 12:02:09 +0000 | [diff] [blame] | 308 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 309 | tst_sig(FORK, DEF_HANDLER, cleanup); |
subrata_modak | 4bb656a | 2009-02-26 12:02:09 +0000 | [diff] [blame] | 310 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 311 | TEST_PAUSE; |
robbiew | ef4118b | 2003-01-17 18:56:04 +0000 | [diff] [blame] | 312 | |
subrata_modak | 5b69374 | 2008-02-22 08:33:53 +0000 | [diff] [blame] | 313 | nr_msgqs = get_max_msgqueues(); |
| 314 | if (nr_msgqs < 0) |
| 315 | cleanup(); |
| 316 | |
| 317 | nr_msgqs -= get_used_msgqueues(); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 318 | if (nr_msgqs <= 0) { |
| 319 | tst_resm(TBROK, |
| 320 | "Max number of message queues already used, cannot create more."); |
subrata_modak | 4bb656a | 2009-02-26 12:02:09 +0000 | [diff] [blame] | 321 | cleanup(); |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 322 | } |
subrata_modak | 5b69374 | 2008-02-22 08:33:53 +0000 | [diff] [blame] | 323 | |
| 324 | /* |
| 325 | * Since msgmni scales to the memory size, it may reach huge values |
| 326 | * that are not necessary for this test. |
| 327 | * That's why we define NR_MSGQUEUES as a high boundary for it. |
| 328 | */ |
| 329 | MSGMNI = min(nr_msgqs, NR_MSGQUEUES); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 330 | } |
| 331 | |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 332 | void cleanup(void) |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 333 | { |
| 334 | int status; |
Cyril Hrubis | 9e4b117 | 2014-09-23 13:10:52 +0200 | [diff] [blame] | 335 | |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 336 | #ifdef DEBUG |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 337 | tst_resm(TINFO, "Removing the message queue"); |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 338 | #endif |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 339 | fflush(stdout); |
Garrett Cooper | df3eb16 | 2010-11-28 22:44:32 -0800 | [diff] [blame] | 340 | (void)msgctl(tid, IPC_RMID, NULL); |
| 341 | if ((status = msgctl(tid, IPC_STAT, NULL)) != -1) { |
| 342 | (void)msgctl(tid, IPC_RMID, NULL); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 343 | tst_resm(TFAIL, "msgctl(tid, IPC_RMID) failed"); |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 344 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 345 | } |
robbiew | 577ff1a | 2002-12-05 20:12:28 +0000 | [diff] [blame] | 346 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 347 | fflush(stdout); |
Stanislav Kholmanskikh | 119cf4a | 2013-11-08 16:16:18 +0400 | [diff] [blame] | 348 | |
robbiew | f6e92cd | 2003-01-17 21:06:36 +0000 | [diff] [blame] | 349 | tst_rmdir(); |
Chris Dearman | ec6edca | 2012-10-17 19:54:01 -0700 | [diff] [blame] | 350 | } |