From: Ben Gras Date: Thu, 8 Apr 2010 13:11:37 +0000 (+0000) Subject: ipc test improvements X-Git-Tag: v3.1.7~170 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/style.css?a=commitdiff_plain;h=2fd5eb25695f503fbc8ac8480bfceb5c964ab42d;p=minix.git ipc test improvements . rename testshm.sh to test.sh so all test scripts are called test.sh . delete msg* tests as msg* functionality isn't implemented . add ipc/test.sh that runs all test.sh scripts in the subdirs --- diff --git a/test/ipc/msgctl/Makefile b/test/ipc/msgctl/Makefile deleted file mode 100644 index 9071354e0..000000000 --- a/test/ipc/msgctl/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) International Business Machines Corp., 2001 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -# the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -CFLAGS += -I../lib -I../../../../../include -Wall -LDLIBS += -L../../../../../lib -lltp -L.. -lipc - -SRCS = $(wildcard *.c) -TARGETS = $(patsubst %.c,%,$(SRCS)) - -all: $(TARGETS) - -install: - @set -e; for i in $(TARGETS); do ln -f $$i ../../../../bin/$$i ; done - -clean: - rm -f $(TARGETS) diff --git a/test/ipc/msgctl/msgctl01.c b/test/ipc/msgctl/msgctl01.c deleted file mode 100644 index eb1c30295..000000000 --- a/test/ipc/msgctl/msgctl01.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgctl01.c - * - * DESCRIPTION - * msgctl01 - create a message queue, then issue the IPC_STAT command - * and RMID commands to test the functionality - * - * ALGORITHM - * create a message queue - * loop if that option was specified - * call msgctl() with the IPC_STAT command - * check the return code - * if failure, issue a FAIL message and break remaining tests - * otherwise, - * if doing functionality testing - * if the max number of bytes on the queue is > 0, - * issue a PASS message - * otherwise - * issue a FAIL message - * else issue a PASS message - * call cleanup - * - * USAGE: - * msgctl01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgctl01"; -int TST_TOTAL = 1; -extern int Tst_count; - -int msg_q_1 = -1; /* to hold the message queue id */ - -struct msqid_ds qs_buf; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * Get the msqid_ds structure values for the queue - */ - - TEST(msgctl(msg_q_1, IPC_STAT, &qs_buf)); - - if (TEST_RETURN == -1) { - tst_resm(TFAIL, "%s call failed - errno = %d" - " : %s", TCID, TEST_ERRNO, - strerror(TEST_ERRNO)); - } else { - if (STD_FUNCTIONAL_TEST) { - if (qs_buf.msg_qbytes > 0) { - tst_resm(TPASS, "qs_buf.msg_qbytes is" - " a positive value"); - } else { - tst_resm(TFAIL, "qs_buf.msg_qbytes did" - " not change"); - } - } else { - tst_resm(TPASS, "msgctl() call succeeded"); - } - } - - /* - * clean up things in case we are looping - */ - qs_buf.msg_qbytes = 0x0000; - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - /* get a message key */ - msgkey = getipckey(); - - /* make sure the initial # of bytes is 0 in our buffer */ - qs_buf.msg_qbytes = 0x0000; - - /* now we have a key, so let's create a message queue */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgctl/msgctl02.c b/test/ipc/msgctl/msgctl02.c deleted file mode 100644 index 32e03f866..000000000 --- a/test/ipc/msgctl/msgctl02.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgctl02.c - * - * DESCRIPTION - * msgctl02 - create a message queue, then issue the IPC_SET command - * to lower the msg_qbytes value. - * - * ALGORITHM - * create a message queue - * loop if that option was specified - * call msgctl() with the IPC_SET command with a new msg_qbytes value - * check the return code - * if failure, issue a FAIL message and break remaining tests - * otherwise, - * if doing functionality testing - * if the msg_qbytes value is the new value - * issue a PASS message - * otherwise - * issue a FAIL message - * else issue a PASS message - * call cleanup - * - * USAGE: - * msgctl02 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgctl02"; -int TST_TOTAL = 1; -extern int Tst_count; - -int msg_q_1 = -1; /* to hold the message queue id */ - -struct msqid_ds qs_buf; - -unsigned short new_bytes; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * Set the msqid_ds structure values for the queue - */ - - TEST(msgctl(msg_q_1, IPC_SET, &qs_buf)); - - if (TEST_RETURN == -1) { - tst_resm(TFAIL, "%s call failed - errno = %d" - " : %s", TCID, TEST_ERRNO, - strerror(TEST_ERRNO)); - } else { - if (STD_FUNCTIONAL_TEST) { - - /* do a stat to get current queue values */ - if ((msgctl(msg_q_1, IPC_STAT, &qs_buf) == -1)){ - tst_resm(TBROK, "stat on queue failed"); - continue; - } - - if (qs_buf.msg_qbytes == new_bytes) { - tst_resm(TPASS, "qs_buf.msg_qbytes is" - " the new value - %d", - qs_buf.msg_qbytes); - } else { - tst_resm(TFAIL, "qs_buf.msg_qbytes " - "value is not expected"); - tst_resm(TINFO, "expected - %d, " - "received - %d", new_bytes, - qs_buf.msg_qbytes); - } - } else { - tst_resm(TPASS, "msgctl() call succeeded"); - } - } - - /* - * decrement by one the msq_qbytes value - */ - qs_buf.msg_qbytes -= 1; - new_bytes = qs_buf.msg_qbytes; - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - /* get a message key */ - msgkey = getipckey(); - - /* make sure the initial # of bytes is 0 in our buffer */ - qs_buf.msg_qbytes = 0x3000; - - /* now we have a key, so let's create a message queue */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* now stat the queue to get the default msg_qbytes value */ - if ((msgctl(msg_q_1, IPC_STAT, &qs_buf)) == -1) { - tst_brkm(TBROK, cleanup, "Can't stat the message queue"); - } - - /* decrement msg_qbytes and copy its value */ - qs_buf.msg_qbytes -= 1; - new_bytes = qs_buf.msg_qbytes; -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgctl/msgctl03.c b/test/ipc/msgctl/msgctl03.c deleted file mode 100644 index 3027b9ca4..000000000 --- a/test/ipc/msgctl/msgctl03.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgctl03.c - * - * DESCRIPTION - * msgctl03 - create a message queue, then issue the IPC_RMID command - * - * ALGORITHM - * create a message queue - * loop if that option was specified - * call msgctl() with the IPC_RMID command - * check the return code - * if failure, issue a FAIL message and break remaining tests - * otherwise, - * if doing functionality testing - * issue an IPC_STAT on the queue that was just removed - * if the call fails - * issue a PASS message - * otherwise - * issue a FAIL message - * else issue a PASS message - * call cleanup - * - * USAGE: - * msgctl03 [-c n] [-f] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * This test does not support looping. - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgctl03"; -int TST_TOTAL = 1; -extern int Tst_count; - -int msg_q_1 = -1; /* to hold the message queue id */ - -struct msqid_ds qs_buf; - -int main(int ac, char **av) -{ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* - * Remove the queue that was created in setup() - */ - - TEST(msgctl(msg_q_1, IPC_RMID, NULL)); - - if (TEST_RETURN == -1) { - tst_brkm(TFAIL, cleanup, "%s call failed - errno = %d" - " : %s", TCID, TEST_ERRNO, strerror(TEST_ERRNO)); - } else { - if (STD_FUNCTIONAL_TEST) { - /* - * if the queue is gone, then an IPC_STAT msgctl() - * call should generate an EINVAL error. - */ - if ((msgctl(msg_q_1, IPC_STAT, &qs_buf) == -1)){ - if (errno == EINVAL) { - tst_resm(TPASS, "The queue is gone"); - } else { - tst_resm(TFAIL, "IPC_RMID succeeded ," - " but functional test did not" - " get expected EINVAL error"); - } - } - } else { - tst_resm(TPASS, "msgctl() call succeeded"); - } - } - - msg_q_1 = -1; - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - /* get a message key */ - msgkey = getipckey(); - - /* now we have a key, so let's create a message queue */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgctl/msgctl04.c b/test/ipc/msgctl/msgctl04.c deleted file mode 100644 index fc8866b94..000000000 --- a/test/ipc/msgctl/msgctl04.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgctl04.c - * - * DESCRIPTION - * msgctl04 - test for EACCES, EFAULT and EINVAL errors using - * a variety of incorrect calls. - * - * ALGORITHM - * create two message queues - * loop if that option was specified - * try to access a queue with some invalid argument - * check the errno value - * issue a PASS message if we get EACCES, EFAULT or EINVAL - * depending on the test case - * otherwise, the tests fails - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgctl04 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ -#include - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgctl04"; -int TST_TOTAL = 6; -extern int Tst_count; - -char nobody_uid[] = "nobody"; -struct passwd *ltpuser; - -int exp_enos[] = {EACCES, EFAULT, EINVAL, 0}; - -int msg_q_1 = -1; /* The message queue id created in setup */ -int msg_q_2 = -1; /* Another queue id created in setup */ -int bad_q = -1; /* a value to use as a bad queue id */ - -struct msqid_ds q_buf; - -struct test_case_t { /* This allows testing of many negative */ - int *queue_id; /* test cases that can all use the same */ - int ipc_cmd; /* basic test setup. */ - struct msqid_ds *buf; - int error; -} TC[] = { - /* EACCES - there is no read permission for the queue */ - {&msg_q_1, IPC_STAT, &q_buf, EACCES}, - - /* EFAULT - the structure address is invalid - IPC_STAT */ - {&msg_q_2, IPC_STAT, (struct msqid_ds *)-1, EFAULT}, - - /* EFAULT - the structure address is invalid - IPC_SET */ - {&msg_q_2, IPC_SET, (struct msqid_ds *)-1, EFAULT}, - - /* EINVAL - the command (-1) is invalid */ - {&msg_q_2, -1, &q_buf, EINVAL}, - - /* EINVAL - the queue id is invalid - IPC_STAT */ - {&bad_q, IPC_STAT, &q_buf, EINVAL}, - - /* EINVAL - the queue id is invalid - IPC_SET */ - {&bad_q, IPC_SET, &q_buf, EINVAL} -}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* loop through the test cases */ - - for (i=0; ipw_uid) == -1) { - tst_resm(TINFO, "setuid failed to " - "to set the effective uid to %d", - ltpuser->pw_uid); - perror("setuid"); - } - - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* now we have a key, so let's create a message queue */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue #1" ); - } - - /* now let's create another message queue with read & write access */ - if ((msg_q_2 = - msgget(msgkey + 1, IPC_CREAT | IPC_EXCL | MSG_RD | MSG_WR)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue #2" ); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* - * remove the message queues that were created. - */ - rm_queue(msg_q_1); - - rm_queue(msg_q_2); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgctl/msgctl05.c b/test/ipc/msgctl/msgctl05.c deleted file mode 100644 index 153a918d4..000000000 --- a/test/ipc/msgctl/msgctl05.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgctl05.c - * - * DESCRIPTION - * msgctl05 - test for EPERM error - * - * ALGORITHM - * create a message queue as root - * fork a child process and change its ID to nobody - * loop if that option was specified - * try to remove the queue in the child process with msgctl() - * check the errno value - * issue a PASS message if we get EPERM - * otherwise, the tests fails - * issue a FAIL message - * break any remaining tests - * call cleanup - * - * USAGE: - * msgctl05 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * The test must be run as root. - * There must be a nobody ID installed on the system. - */ - -#include -#include -#include - -#include "test.h" -#include "usctest.h" - - -#include "ipcmsg.h" - -char *TCID = "msgctl05"; -int TST_TOTAL = 1; -extern int Tst_count; - -int exp_enos[] = {EPERM, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ -uid_t ltp_uid; /* The user ID for a non root user */ -char *ltp_user = "nobody"; /* A non root user */ - -struct msqid_ds q_buf; - -int main(int ac, char **av) -{ - char *msg; /* message returned from parse_opts */ - pid_t pid; - void do_child(void); - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - if ((pid = FORK_OR_VFORK()) == -1) { - tst_brkm(TBROK, cleanup, "could not fork"); - } - - if (pid == 0) { /* child */ - /* set the user ID of the child to nobody */ - if (setuid(ltp_uid) == -1) { - tst_resm(TBROK, "setuid() failed"); - exit(1); - } - - do_child(); - } else { /* parent */ - if (waitpid(pid, NULL, 0) == -1) { - tst_resm(TBROK, "waitpid() failed"); - tst_resm(TINFO, "waitpid() error = %d : %s", errno, - strerror(errno)); - } - - /* if it exists, remove the message queue */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - } - - cleanup (); - /**NOT REACHED**/ - return(0); -} - -/* - * do_child - make the TEST call as the child process - */ -void -do_child() -{ - int lc; /* loop counter */ - int i; - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* loop through the test cases */ - - for (i=0; i /* needed for test */ -#include /* needed for test */ -#include /* needed for test */ -#include /* needed by testhead.h */ -#include /* definitions needed for errno */ -#include "test.h" -#include "usctest.h" - -void setup(); -void cleanup(); -/* - * * * These globals must be defined in the test. - * * */ - - -char *TCID="msgctl06"; /* Test program identifier. */ -int TST_TOTAL=1; /* Total number of test cases. */ -extern int Tst_count; /* Test Case counter for tst_* routines */ - -int exp_enos[]={0}; /* List must end with 0 */ - - -/* - * msgctl3_t -- union of msgctl(2)'s possible argument # 3 types. - */ -typedef union msgctl3_u { - struct msqid_ds *msq_ds; /* pointer to msqid_ds struct */ - struct ipc_acl *msq_acl; /* pointer ACL buff and size */ -} msgctl3_t; - -extern int local_flag; - -int msqid, status; -struct msqid_ds buf; - - -#define K 1024 - -/*--------------------------------------------------------------*/ - -int main(argc, argv) -int argc; -char *argv[]; -{ - key_t key; - setup(); - - key = 2 * K; - TEST(msgget(key, IPC_CREAT)); - msqid = TEST_RETURN; - if (TEST_RETURN == -1) - { - tst_resm(TFAIL, "msgget() failed errno = %d", errno); - tst_exit(); - } - TEST(msgctl(msqid, IPC_STAT, &buf)); - status = TEST_RETURN; - if (TEST_RETURN == -1) - { - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "msgctl(msqid, IPC_STAT, &buf) failed errno = %d", errno); - tst_exit(); - } - - /* - * Check contents of msqid_ds structure. - */ - - if (buf.msg_qnum != 0) - { - tst_resm(TFAIL, "error: unexpected nbr of messages %d", buf.msg_qnum); - tst_exit(); - } - if (buf.msg_perm.uid != getuid()) - { - tst_resm(TFAIL, "error: unexpected uid %d", buf.msg_perm.uid); - tst_exit(); - } - if (buf.msg_perm.gid != getgid()) - { - tst_resm(TFAIL, "error: unexpected gid %d", buf.msg_perm.gid); - tst_exit(); - } - if (buf.msg_perm.cuid != getuid()) - { - tst_resm(TFAIL, "error: unexpected cuid %d", buf.msg_perm.cuid); - tst_exit(); - } - if (buf.msg_perm.cgid != getgid()) - { - tst_resm(TFAIL, "error: unexpected cgid %d", buf.msg_perm.cgid); - tst_exit(); - } - - - tst_resm(TPASS,"msgctl06 ran successfully!"); - /*************************************************************** - * cleanup and exit - ***************************************************************/ - cleanup(); - - return 0; -} /* End main */ - - -/*************************************************************** - * * setup() - performs all ONE TIME setup for this test. - * ****************************************************************/ -void -setup() -{ - /* You will want to enable some signal handling so you can capture - * unexpected signals like SIGSEGV. - */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - /* One cavet that hasn't been fixed yet. TEST_PAUSE contains the code to - * fork the test with the -c option. You want to make sure you do this - * before you create your temporary directory. - */ - TEST_PAUSE; -} - - -/*************************************************************** - * * * cleanup() - performs all ONE TIME cleanup for this test at - * * * completion or premature exit. - * * ***************************************************************/ -void -cleanup() -{ - int status; - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* - * Remove the message queue from the system - */ -#ifdef DEBUG - tst_resm(TINFO,"Remove the message queue"); -#endif - fflush (stdout); - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - if ((status = msgctl(msqid, IPC_STAT, &buf)) != -1) - { - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "msgctl(msqid, IPC_RMID) failed"); - tst_exit(); - - } - - fflush (stdout); - /* exit with return code appropriate for results */ - tst_exit(); -} diff --git a/test/ipc/msgctl/msgctl07.c b/test/ipc/msgctl/msgctl07.c deleted file mode 100644 index 826bc508d..000000000 --- a/test/ipc/msgctl/msgctl07.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2002 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ -/* 11/06/2002 Port to LTP dbarrera@us.ibm.com */ - - -/* - * NAME - * msgctl07 - * - * CALLS - * msgget(2) msgctl(2) msgop(2) - * - * ALGORITHM - * Get and manipulate a message queue. - * - * RESTRICTIONS - * - */ - - -#include /* needed for test */ -#include /* needed for test */ -#include /* needed for test */ -#include /* needed for test */ -#include /* needed for test */ -#include /* needed by testhead.h */ -#include "test.h" -#include "usctest.h" -#include -#include -#include - -typedef void (*sighandler_t)(int); -volatile int ready; - -#define K 1024 -#define BYTES 100 -#define SECS 10 - -void setup(); -void cleanup(); -void do_child_1(); -void do_child_2(); - -/* - * * * * These globals must be defined in the test. - * * * */ - -char *TCID="msgctl07"; /* Test program identifier. */ -int TST_TOTAL=1; /* Total number of test cases. */ -extern int Tst_count; /* Test Case counter for tst_* routines */ - -/* Used by main() and do_child_1(): */ -static int msqid; -struct my_msgbuf { - long type; - char text[BYTES]; -} p1_msgp, p2_msgp, p3_msgp, c1_msgp, c2_msgp, c3_msgp; - - -/*--------------------------------------------------------------*/ - -int main(argc, argv) -int argc; -char *argv[]; -{ - key_t key; - int pid, status; - int i, j, k; - sighandler_t alrm(); - -#ifdef UCLINUX - char *msg; - - /* parse standard options */ - if ((msg = parse_opts(argc, argv, (option_t *)NULL, NULL)) != - (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - maybe_run_child(&do_child_1, "ndd", 1, &msqid, &c1_msgp.type); - maybe_run_child(&do_child_2, "ndddd", 2, &msqid, &c1_msgp.type, - &c2_msgp.type, &c3_msgp.type); -#endif - - key = 2 * K; - if ((msqid = msgget(key, IPC_CREAT)) == -1) - { - tst_resm(TFAIL, "msgget() failed errno = %d", errno); - tst_exit(); - - } - - pid = FORK_OR_VFORK(); - if (pid < 0) { - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "\tFork failed (may be OK if under stress)"); - tst_exit(); - } - else if (pid == 0) { -#ifdef UCLINUX - if (self_exec(argv[0], "ndd", 1, msqid, c1_msgp.type) < 0) { - tst_resm(TFAIL, "\tself_exec failed"); - tst_exit(); - } -#else - do_child_1(); -#endif - } - else { - struct sigaction act; - - memset(&act, 0, sizeof(act)); - act.sa_handler = (sighandler_t) alrm; - sigemptyset(&act.sa_mask); - sigaddset(&act.sa_mask, SIGALRM); - if ((sigaction(SIGALRM, &act, NULL)) < 0) { - kill(pid, SIGKILL); - (void)msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "signal failed. errno = %d", errno); - tst_exit(); - } - ready = 0; - alarm(SECS); - while (!ready) /* make the child wait */ - ; - for (i=0; i> 8) == 1) - { - tst_resm(TFAIL, "test failed. status = %d", (status >> 8)); - tst_exit(); - } - - pid = FORK_OR_VFORK(); - if (pid < 0) { - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "\tFork failed (may be OK if under stress)"); - tst_exit(); - } - else if (pid == 0) { -#ifdef UCLINUX - if (self_exec(argv[0], "ndddd", 1, msqid, c1_msgp.type, - c2_msgp.type, c3_msgp.type) < 0) { - tst_resm(TFAIL, "\tself_exec failed"); - tst_exit(); - } -#else - do_child_2(); -#endif - } - else { - struct sigaction act; - - memset(&act, 0, sizeof(act)); - act.sa_handler = (sighandler_t) alrm; - sigemptyset(&act.sa_mask); - sigaddset(&act.sa_mask, SIGALRM); - if ((sigaction(SIGALRM, &act, NULL)) < 0) { - kill(pid, SIGKILL); - (void)msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "signal failed. errno = %d", errno); - tst_exit(); - } - ready = 0; - alarm(SECS); - while (!ready) /* make the child wait */ - ; - for (i=0; i> 8) == 1) - { - tst_resm(TFAIL, "test failed. status = %d", (status >> 8)); - tst_exit(); - } - /* - * Remove the message queue from the system - */ -#ifdef DEBUG - tst_resm(TINFO,"Removing the message queue"); -#endif - fflush (stdout); - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - if ((status = msgctl(msqid, IPC_STAT, (struct msqid_ds *)NULL)) != -1) - { - (void) msgctl(msqid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "msgctl(msqid, IPC_RMID) failed"); - tst_exit(); - - } - - fflush (stdout); - tst_resm(TPASS,"msgctl07 ran successfully!"); - return (0); - -} -/*--------------------------------------------------------------*/ - -sighandler_t alrm(sig) -int sig; -{ - ready++; - return(0); -} -/*--------------------------------------------------------------*/ - -void -do_child_1() -{ - int i; - int size; - - if ((size = msgrcv(msqid, &c1_msgp, BYTES, 0, 0)) == -1) - { - tst_resm(TFAIL, "msgrcv() failed errno = %d", errno); - tst_exit(); - } - if (size != BYTES) - { - tst_resm(TFAIL, "error: received %d bytes expected %d", size, BYTES); - tst_exit(); - } - for (i=0; i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "test.h" -#include "usctest.h" - -void setup(); -void cleanup(); -/* - * * * * These globals must be defined in the test. - * * * */ - - -char *TCID="msgctl08"; /* Test program identifier. */ -int TST_TOTAL=1; /* Total number of test cases. */ -extern int Tst_count; /* Test Case counter for tst_* routines */ - -int exp_enos[]={0}; /* List must end with 0 */ - -#ifndef CONFIG_COLDFIRE -#define MAXNPROCS 1000000 /* This value is set to an arbitrary high limit. */ -#else -#define MAXNPROCS 100000 /* Coldfire can't deal with 1000000 */ -#endif -#define MAXNREPS 100000 -#define FAIL 1 -#define PASS 0 - -key_t keyarray[MAXNPROCS]; - -struct { - long type; - struct { - char len; - char pbytes[99]; - } data; - } buffer; - -int pidarray[MAXNPROCS]; -int tid; -int MSGMNI,nprocs, nreps; -int procstat; -int dotest(key_t key, int child_process); -int doreader(int id, long key, int child); -int dowriter(int id,long key, int child); -int fill_buffer(register char *buf, char val, register int size); -int verify(register char *buf,char val, register int size,int child); -void sig_handler(); /* signal catching function */ -int mykid; -#ifdef UCLINUX -static char *argv0; - -void do_child_1_uclinux(); -static key_t key_uclinux; -static int i_uclinux; - -void do_child_2_uclinux(); -static int id_uclinux; -static int child_process_uclinux; -#endif - -/*-----------------------------------------------------------------*/ -int main(argc, argv) -int argc; -char *argv[]; -{ - register int i, j, ok, pid; - int count, status; - struct sigaction act; - -#ifdef UCLINUX - char *msg; /* message returned from parse_opts */ - - argv0 = argv[0]; - - /* parse standard options */ - if ((msg = parse_opts(argc, argv, (option_t *)NULL, NULL)) != (char *)NULL) - { - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - maybe_run_child(&do_child_1_uclinux, "ndd", 1, &key_uclinux, &i_uclinux); - maybe_run_child(&do_child_2_uclinux, "nddd", 2, &id_uclinux, &key_uclinux, - &child_process_uclinux); -#endif - - setup(); - - if (argc == 1 ) - { - /* Set default parameters */ - nreps = MAXNREPS; - nprocs = MSGMNI; - } - else if (argc == 3 ) - { - if ( atoi(argv[1]) > MAXNREPS ) - { - tst_resm(TCONF,"Requested number of iterations too large, setting to Max. of %d", MAXNREPS); - nreps = MAXNREPS; - } - else - { - nreps = atoi(argv[1]); - } - if (atoi(argv[2]) > MSGMNI ) - { - tst_resm(TCONF,"Requested number of processes too large, setting to Max. of %d", MSGMNI); - nprocs = MSGMNI; - } - else - { - nprocs = atoi(argv[2]); - } - } - else - { - tst_resm(TCONF," Usage: %s [ number of iterations number of processes ]", argv[0]); - tst_exit(); - } - - srand(getpid()); - tid = -1; - - /* Setup signal handleing routine */ - memset(&act, 0, sizeof(act)); - act.sa_handler = sig_handler; - sigemptyset(&act.sa_mask); - sigaddset(&act.sa_mask, SIGTERM); - if (sigaction(SIGTERM, &act, NULL) < 0) - { - tst_resm(TFAIL, "Sigset SIGTERM failed"); - tst_exit(); - } - /* Set up array of unique keys for use in allocating message - * queues - */ - for (i = 0; i < nprocs; i++) - { - ok = 1; - do - { - /* Get random key */ - keyarray[i] = (key_t)rand(); - /* Make sure key is unique and not private */ - if (keyarray[i] == IPC_PRIVATE) - { - ok = 0; - continue; - } - for (j = 0; j < i; j++) - { - if (keyarray[j] == keyarray[i]) - { - ok = 0; - break; - } - ok = 1; - } - } while (ok == 0); - } - - /* Fork a number of processes, each of which will - * create a message queue with one reader/writer - * pair which will read and write a number (iterations) - * of random length messages with specific values. - */ - - for (i = 0; i < nprocs; i++) - { - fflush(stdout); - if ((pid = FORK_OR_VFORK()) < 0) - { - tst_resm(TFAIL, "\tFork failed (may be OK if under stress)"); - tst_exit(); - } - /* Child does this */ - if (pid == 0) - { -#ifdef UCLINUX - if (self_exec(argv[0], "ndd", 1, keyarray[i], i) < 0) - { - tst_resm(TFAIL, "\tself_exec failed"); - tst_exit(); - } -#else - procstat = 1; - exit( dotest(keyarray[i], i) ); -#endif - } - pidarray[i] = pid; - } - - count = 0; - while(1) - { - if (( wait(&status)) > 0) - { - if (status>>8 != 0 ) - { - tst_resm(TFAIL, "Child exit status = %d", status>>8); - tst_exit(); - } - count++; - } - else - { - if (errno != EINTR) - { - break; - } -#ifdef DEBUG - tst_resm(TINFO,"Signal detected during wait"); -#endif - } - } - /* Make sure proper number of children exited */ - if (count != nprocs) - { - tst_resm(TFAIL, "Wrong number of children exited, Saw %d, Expected %d", count, nprocs); - tst_exit(); - } - - tst_resm(TPASS,"msgctl08 ran successfully!"); - - cleanup(); - return (0); - -} -/*--------------------------------------------------------------------*/ - -#ifdef UCLINUX -void -do_child_1_uclinux() -{ - procstat = 1; - exit(dotest(key_uclinux, i_uclinux)); -} - -void -do_child_2_uclinux() -{ - exit(doreader(id_uclinux, key_uclinux % 255, child_process_uclinux)); -} -#endif - -int dotest(key, child_process) -key_t key; -int child_process; -{ - int id, pid; - - sighold(SIGTERM); - TEST(msgget(key, IPC_CREAT | S_IRUSR | S_IWUSR)); - if (TEST_RETURN < 0) - { - tst_resm(TFAIL, "Msgget error in child %d, errno = %d", child_process, TEST_ERRNO); - tst_exit(); - } - tid = id = TEST_RETURN; - sigrelse(SIGTERM); - - fflush(stdout); - if ((pid = FORK_OR_VFORK()) < 0) - { - tst_resm(TWARN, "\tFork failed (may be OK if under stress)"); - TEST(msgctl(tid, IPC_RMID, 0)); - if (TEST_RETURN < 0) - { - tst_resm(TFAIL, "Msgctl error in cleanup, errno = %d", errno); - } - tst_exit(); - } - /* Child does this */ - if (pid == 0) - { -#ifdef UCLINUX - if (self_exec(argv0, "nddd", 2, id, key, child_process) < 0) { - tst_resm(TWARN, "self_exec failed"); - TEST(msgctl(tid, IPC_RMID, 0)); - if (TEST_RETURN < 0) - { - tst_resm(TFAIL, "\tMsgctl error in cleanup, " - "errno = %d\n", errno); - } - tst_exit(); - } -#else - exit( doreader(id, key % 255, child_process) ); -#endif - } - /* Parent does this */ - mykid = pid; - procstat = 2; - dowriter(id, key % 255, child_process); - wait(0); - TEST(msgctl(id, IPC_RMID, 0)); - if (TEST_RETURN < 0) - { - tst_resm(TFAIL, "msgctl errno %d", TEST_ERRNO); - tst_exit(); - } - exit(PASS); -} - -int doreader(id, key, child) -int id, child; -long key; -{ - int i, size; - - for (i = 0; i < nreps; i++) - { - if ((size = msgrcv(id, &buffer, 100, 0, 0)) < 0) - { - tst_brkm(TBROK, cleanup, "Msgrcv error in child %d, read # = %d, errno = %d", (i + 1), child, errno); - tst_exit(); - } - if (buffer.data.len + 1 != size) - { - tst_resm(TFAIL, "Size mismatch in child %d, read # = %d", child, (i + 1)); - tst_resm(TFAIL, "for message size got %d expected %d %s",size ,buffer.data.len); - tst_exit(); - } - if ( verify(buffer.data.pbytes, key, size - 1, child) ) - { - tst_resm(TFAIL, "in read # = %d,key = %x", (i + 1), child, key); - tst_exit(); - } - key++; - } - return (0); -} - -int dowriter(id, key, child) -int id,child; -long key; -{ - int i, size; - - for (i = 0; i < nreps; i++) - { - do - { - size = (rand() % 99); - } while (size == 0); - fill_buffer(buffer.data.pbytes, key, size); - buffer.data.len = size; - buffer.type = 1; - TEST(msgsnd(id, &buffer, size + 1, 0)); - if (TEST_RETURN < 0) - { - tst_brkm(TBROK, cleanup, "Msgsnd error in child %d, key = %x errno = %d", child, key, TEST_ERRNO); - } - key++; - } - return (0); -} - -int fill_buffer(buf, val, size) -register char *buf; -char val; -register int size; -{ - register int i; - - for(i = 0; i < size; i++) - { - buf[i] = val; - } - - return (0); -} - - -/* - * verify() - * Check a buffer for correct values. - */ - -int verify(buf, val, size, child) - register char *buf; - char val; - register int size; - int child; -{ - while(size-- > 0) - { - if (*buf++ != val) - { - tst_resm(TWARN, "Verify error in child %d, *buf = %x, val = %x, size = %d", child, *buf, val, size); - return(FAIL); - } - } - return(PASS); -} - -/* - * * void - * * sig_handler() - signal catching function for 'SIGUSR1' signal. - * * - * * This is a null function and used only to catch the above signal - * * generated in parent process. - * */ -void -sig_handler() -{ -} - -#define BUFSIZE 512 - -/** Get the number of message queues already in use */ -static int get_used_msgqueues() -{ - FILE *f; - int used_queues; - char buff[BUFSIZE]; - - f = popen("ipcs -q", "r"); - if (!f) { - tst_resm(TBROK,"Could not run 'ipcs' to calculate used message queues"); - tst_exit(); - } - /* FIXME: Start at -4 because ipcs prints four lines of header */ - for (used_queues = -4; fgets(buff, BUFSIZE, f); used_queues++) - ; - pclose(f); - if (used_queues < 0) { - tst_resm(TBROK,"Could not read output of 'ipcs' to calculate used message queues"); - tst_exit(); - } - return used_queues; -} - -/** Get the max number of message queues allowed on system */ -static int get_max_msgqueues() -{ - FILE *f; - char buff[BUFSIZE]; - - /* Get the max number of message queues allowed on system */ - f = fopen("/proc/sys/kernel/msgmni", "r"); - if (!f){ - tst_resm(TBROK,"Could not open /proc/sys/kernel/msgmni"); - tst_exit(); - } - if (!fgets(buff, BUFSIZE, f)) { - tst_resm(TBROK,"Could not read /proc/sys/kernel/msgmni"); - tst_exit(); - } - fclose(f); - return atoi(buff); -} - -/*************************************************************** - * setup() - performs all ONE TIME setup for this test. - *****************************************************************/ -void -setup() -{ - tst_tmpdir(); - - /* You will want to enable some signal handling so you can capture - * unexpected signals like SIGSEGV. - */ - tst_sig(FORK, DEF_HANDLER, cleanup); - - - /* Pause if that option was specified */ - /* One cavet that hasn't been fixed yet. TEST_PAUSE contains the code to - * fork the test with the -c option. You want to make sure you do this - * before you create your temporary directory. - */ - TEST_PAUSE; - - MSGMNI = get_max_msgqueues() - get_used_msgqueues(); - if (MSGMNI <= 0){ - tst_resm(TBROK,"Max number of message queues already used, cannot create more."); - cleanup(); - } -} - - -/*************************************************************** - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - ****************************************************************/ -void -cleanup() -{ - int status; - /* - * Remove the message queue from the system - */ -#ifdef DEBUG - tst_resm(TINFO,"Removing the message queue"); -#endif - fflush (stdout); - (void) msgctl(tid, IPC_RMID, (struct msqid_ds *)NULL); - if ((status = msgctl(tid, IPC_STAT, (struct msqid_ds *)NULL)) != -1) - { - (void) msgctl(tid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "msgctl(tid, IPC_RMID) failed"); - tst_exit(); - } - - fflush (stdout); - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - tst_rmdir(); - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgctl/msgctl09.c b/test/ipc/msgctl/msgctl09.c deleted file mode 100644 index ec36e8a52..000000000 --- a/test/ipc/msgctl/msgctl09.c +++ /dev/null @@ -1,735 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2002 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ -/* 11/11/2002 Port to LTP dbarrera@us.ibm.com */ - - -/* - * NAME - * msgctl09 - * - * CALLS - * msgget(2) msgctl(2) msgop(2) - * - * ALGORITHM - * Get and manipulate a message queue. - * - * RESTRICTIONS - * - */ - -#define _XOPEN_SOURCE 500 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "test.h" -#include "usctest.h" - -#define MAXNREPS 1000 -#ifndef CONFIG_COLDFIRE -#define MAXNPROCS 1000000 /* This value is set to an arbitrary high limit. */ -#else -#define MAXNPROCS 100000 /* Coldfire can't deal with 1000000 */ -#endif -#define MAXNKIDS 10 -#define FAIL 1 -#define PASS 0 - -int dotest(key_t,int); -int doreader(long,int,int); -int dowriter(long,int,int); -int fill_buffer(char*,char,int); -int verify(char*,char,int,int); -void setup(); -void cleanup(); - -/* - * These globals must be defined in the test. - * */ - - -char *TCID="msgctl09"; /* Test program identifier. */ -int TST_TOTAL=1; /* Total number of test cases. */ -extern int Tst_count; /* Test Case counter for tst_* routines */ - -int exp_enos[]={0}; /* List must end with 0 */ - - -key_t keyarray[MAXNPROCS]; - -struct { - long type; - struct { - char len; - char pbytes[99]; - } data; - } buffer; - -int pidarray[MAXNPROCS]; -int rkidarray[MAXNKIDS]; -int wkidarray[MAXNKIDS]; -int tid; -int nprocs, nreps, nkids, MSGMNI; -int procstat; -void term(int); -#ifdef UCLINUX -static char *argv0; - -void do_child_1_uclinux(); -static key_t key_uclinux; -static int i_uclinux; - -void do_child_2_uclinux(); -static int pid_uclinux; -static int child_process_uclinux; - -void do_child_3_uclinux(); -static int rkid_uclinux; -#endif -void cleanup_msgqueue(int i, int tid); - -/*-----------------------------------------------------------------*/ -int main(argc, argv) -int argc; -char *argv[]; -{ - register int i, j, ok, pid; - int count, status; - -#ifdef UCLINUX - char *msg; /* message returned from parse_opts */ - - argv0 = argv[0]; - - /* parse standard options */ - if ((msg = parse_opts(argc, argv, (option_t *)NULL, NULL)) != (char *)NULL) - { - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - maybe_run_child(&do_child_1_uclinux, "ndd", 1, &key_uclinux, &i_uclinux); - maybe_run_child(&do_child_2_uclinux, "nddd", 2, &key_uclinux, - &pid_uclinux, &child_process_uclinux); - maybe_run_child(&do_child_3_uclinux, "nddd", 3, &key_uclinux, - &rkid_uclinux, &child_process_uclinux); -#endif - - setup(); - - if (argc == 1 ) - { - /* Set default parameters */ - nreps = MAXNREPS; - nprocs = MSGMNI; - nkids = MAXNKIDS; - } - else if (argc == 4 ) - { - if ( atoi(argv[1]) > MAXNREPS ) - { - tst_resm(TCONF,"Requested number of iterations too large, setting to Max. of %d", MAXNREPS); - nreps = MAXNREPS; - } - else - { - nreps = atoi(argv[1]); - } - if (atoi(argv[2]) > MSGMNI ) - { - tst_resm(TCONF,"Requested number of processes too large, setting to Max. of %d", MSGMNI); - nprocs = MSGMNI; - } - else - { - nprocs = atoi(argv[2]); - } - if (atoi(argv[3]) > MAXNKIDS ) - { - tst_resm(TCONF,"Requested number of read/write pairs too large; setting to Max. of %d", MAXNKIDS); - nkids = MAXNKIDS; - } - else - { - nkids = atoi(argv[3]); - } - } - else - { - tst_resm(TCONF," Usage: %s [ number of iterations number of processes number of read/write pairs ]", argv[0]); - tst_exit(); - } - - procstat = 0; - srand48((unsigned)getpid() + (unsigned)(getppid() << 16)); - tid = -1; - - /* Setup signal handleing routine */ - if (sigset(SIGTERM, term) == SIG_ERR) - { - tst_resm(TFAIL, "Sigset SIGTERM failed"); - tst_exit(); - } - /* Set up array of unique keys for use in allocating message - * queues - */ - for (i = 0; i < nprocs; i++) - { - ok = 1; - do - { - /* Get random key */ - keyarray[i] = (key_t)lrand48(); - /* Make sure key is unique and not private */ - if (keyarray[i] == IPC_PRIVATE) - { - ok = 0; - continue; - } - for (j = 0; j < i; j++) - { - if (keyarray[j] == keyarray[i]) - { - ok = 0; - break; - } - ok = 1; - } - } while (ok == 0); - } -/*-----------------------------------------------------------------*/ - /* Fork a number of processes (nprocs), each of which will - * create a message queue with several (nkids) reader/writer - * pairs which will read and write a number (iterations) - * of random length messages with specific values (keys). - */ - - for (i = 0; i < nprocs; i++) - { - fflush(stdout); - if ((pid = FORK_OR_VFORK()) < 0) - { - tst_resm(TFAIL, "\tFork failed (may be OK if under stress)"); - tst_exit(); - } - /* Child does this */ - if (pid == 0) - { -#ifdef UCLINUX - if (self_exec(argv[0], "ndd", 1, keyarray[i], i) < 0) - { - tst_resm(TFAIL, "\tself_exec failed"); - tst_exit(); - } -#else - procstat = 1; - exit( dotest(keyarray[i], i) ); -#endif - } - pidarray[i] = pid; - } - - count = 0; - while(1) - { - if (( wait(&status)) > 0) - { - if (status>>8 != PASS ) - { - tst_resm(TFAIL, "Child exit status = %d", status>>8); - tst_exit(); - } - count++; - } - else - { - if (errno != EINTR) - { - break; - } -#ifdef DEBUG - tst_resm(TINFO,"Signal detected during wait"); -#endif - } - } - /* Make sure proper number of children exited */ - if (count != nprocs) - { - tst_resm(TFAIL, "Wrong number of children exited, Saw %d, Expected %d", count, nprocs); - tst_exit(); - } - - tst_resm(TPASS,"msgctl09 ran successfully!"); - - cleanup(); - - return (0); - - - -} -/*--------------------------------------------------------------------*/ - -#ifdef UCLINUX -void -do_child_1_uclinux() -{ - procstat = 1; - exit(dotest(key_uclinux, i_uclinux)); -} - -void -do_child_2_uclinux() -{ - procstat = 2; - exit(doreader(key_uclinux, pid_uclinux, child_process_uclinux)); -} - -void -do_child_3_uclinux() -{ - procstat = 2; - exit(dowriter(key_uclinux, rkid_uclinux, child_process_uclinux)); -} -#endif - -void -cleanup_msgqueue(int i, int tid) -{ - /* - * Decrease the value of i by 1 because it - * is getting incremented even if the fork - * is failing. - */ - - i--; - /* - * Kill all children & free message queue. - */ - for (; i >= 0; i--) { - (void)kill(rkidarray[i], SIGKILL); - (void)kill(wkidarray[i], SIGKILL); - } - - if (msgctl(tid, IPC_RMID, 0) < 0) { - tst_resm(TFAIL, "Msgctl error in cleanup, errno = %d", errno); - tst_exit(); - } -} - -int dotest(key, child_process) -key_t key; -int child_process; -{ - int id, pid; - int i, count, status, exit_status; - - sighold(SIGTERM); - if ((id = msgget(key, IPC_CREAT | S_IRUSR | S_IWUSR )) < 0) - { - tst_resm(TFAIL, "Msgget error in child %d, errno = %d", child_process, errno); - tst_exit(); - } - tid = id; - sigrelse(SIGTERM); - - exit_status = PASS; - - for (i=0; i < nkids; i++) - { - fflush(stdout); - if ((pid = FORK_OR_VFORK()) < 0) - { - tst_resm(TWARN, "Fork failure in first child of child group %d", child_process); - cleanup_msgqueue(i, tid); - tst_exit(); - } - /* First child does this */ - if (pid == 0) - { -#ifdef UCLINUX - if (self_exec(argv0, "nddd", 2, key, getpid(), - child_process) < 0) { - tst_resm(TWARN, "self_exec failed"); - cleanup_msgqueue(i, tid); - tst_exit(); - } -#else - procstat = 2; - exit( doreader( key, getpid(), child_process) ); -#endif - } - rkidarray[i] = pid; - fflush(stdout); - if ((pid = FORK_OR_VFORK()) < 0) - { - tst_resm(TWARN, "Fork failure in first child of child group %d", child_process); - /* - * Kill the reader child process - */ - (void)kill(rkidarray[i], SIGKILL); - - cleanup_msgqueue(i, tid); - tst_exit(); - } - /* Second child does this */ - if (pid == 0) - { -#ifdef UCLINUX - if (self_exec(argv0, "nddd", 3, key, rkidarray[i], - child_process) < 0) { - tst_resm(TWARN, "\tFork failure in first child " - "of child group %d \n", child_process); - /* - * Kill the reader child process - */ - (void)kill(rkidarray[i], SIGKILL); - - cleanup_msgqueue(i, tid); - tst_exit(); - } -#else - procstat = 2; - exit( dowriter( key, rkidarray[i], child_process) ); -#endif - } - wkidarray[i] = pid; - } - /* Parent does this */ - count = 0; - while(1) - { - if (( wait(&status)) > 0) - { - if (status>>8 != PASS ) - { - tst_resm(TFAIL, "Child exit status = %d from child group %d", status>>8, child_process); - for (i = 0; i < nkids; i++) - { - kill(rkidarray[i], SIGTERM); - kill(wkidarray[i], SIGTERM); - } - if (msgctl(tid, IPC_RMID, 0) < 0) { - tst_resm(TFAIL, "Msgctl error, errno = %d", errno); - } - tst_exit(); - } - count++; - } - else - { - if (errno != EINTR) - { - break; - } - } - } - /* Make sure proper number of children exited */ - if (count != (nkids * 2)) - { - tst_resm(TFAIL, "Wrong number of children exited in child group %d, Saw %d Expected %d", child_process, count, (nkids * 2)); - if (msgctl(tid, IPC_RMID, 0) < 0) { - tst_resm(TFAIL, "Msgctl error, errno = %d", errno); - } - tst_exit(); - } - if (msgctl(id, IPC_RMID, 0) < 0) - { - tst_resm(TFAIL, "Msgctl failure in child group %d, errno %d", child_process, errno); - tst_exit(); - } - exit(exit_status); -} - -int doreader( key, type, child) -int type, child; -long key; -{ - int i, size; - int id; - - if ((id = msgget(key, 0)) < 0) - { - tst_resm(TFAIL, "Msgget error in reader of child group %d, errno = %d", child, errno); - tst_exit(); - } - if (id != tid) - { - tst_resm(TFAIL, "Message queue mismatch in reader of child group %d for message queue id %d", child, id); - tst_exit(); - } - for (i = 0; i < nreps; i++) - { - if ((size = msgrcv(id, &buffer, 100, type, 0)) < 0) - { - tst_resm(TFAIL, "Msgrcv error in child %d, read # = %d, errno = %d", (i + 1), child, errno); - tst_exit(); - } - if (buffer.type != type) - { - tst_resm(TFAIL, "Size mismatch in child %d, read # = %d", child, (i + 1)); - tst_resm(TFAIL, "\tfor message size got %d expected %d %s",size ,buffer.data.len); - tst_exit(); - } - if (buffer.data.len + 1 != size) - { - tst_resm(TFAIL, "Size mismatch in child %d, read # = %d, size = %d, expected = %d", child, (i + 1), buffer.data.len, size); - tst_exit(); - } - if ( verify(buffer.data.pbytes, (key % 255), size - 1, child) ) - { - tst_resm(TFAIL, "in read # = %d,key = %x", (i + 1), child, key); - tst_exit(); - } - key++; - } - exit(PASS); -} - -int dowriter( key, type, child) -int type,child; -long key; -{ - int i, size; - int id; - - if ((id = msgget(key, 0)) < 0) - { - tst_resm(TFAIL, "Msgget error in writer of child group %d, errno = %d", child, errno); - tst_exit(); - } - if (id != tid) - { - tst_resm(TFAIL, "Message queue mismatch in writer of child group %d", child); - tst_resm(TFAIL, "\tfor message queue id %d expected %d",id, tid); - tst_exit(); - } - - for (i = 0; i < nreps; i++) - { - do - { - size = (lrand48() % 99); - } while (size == 0); - fill_buffer(buffer.data.pbytes, (key % 255), size); - buffer.data.len = size; - buffer.type = type; - if (msgsnd(id, &buffer, size + 1, 0) < 0) - { - tst_resm(TFAIL, "Msgsnd error in child %d, key = %x errno = %d", child, key, errno); - tst_exit(); - } - key++; - } - exit(PASS); -} - -int fill_buffer(buf, val, size) -register char *buf; -char val; -register int size; -{ - register int i; - - for(i = 0; i < size; i++) - buf[i] = val; - return(0); -} - - -/* - * verify() - * Check a buffer for correct values. - */ - -int verify(buf, val, size, child) - register char *buf; - char val; - register int size; - int child; -{ - while(size-- > 0) - if (*buf++ != val) - { - tst_resm(TWARN, "Verify error in child %d, *buf = %x, val = %x, size = %d", child, *buf, val, size); - return(FAIL); - } - return(PASS); -} - -/* ARGSUSED */ -void -term(int sig) -{ - int i; - - if (procstat == 0) - { -#ifdef DEBUG - tst_resm(TINFO,"SIGTERM signal received, test killing kids"); -#endif - for (i = 0; i < nprocs; i++) - { - if ( pidarray[i] > 0){ - if ( kill(pidarray[i], SIGTERM) < 0) - { - tst_resm(TBROK,"Kill failed to kill child %d", i); - exit(FAIL); - } - } - } - return; - } - - if (procstat == 2) - { - fflush(stdout); - exit(PASS); - } - - if (tid == -1) - { - exit(FAIL); - } - for (i = 0; i < nkids; i++) - { - if (rkidarray[i] > 0) - kill(rkidarray[i], SIGTERM); - if (wkidarray[i] > 0) - kill(wkidarray[i], SIGTERM); - } -} - -#define BUFSIZE 512 - -/** Get the number of message queues already in use */ -static int get_used_msgqueues() -{ - FILE *f; - int used_queues; - char buff[BUFSIZE]; - - f = popen("ipcs -q", "r"); - if (!f) { - tst_resm(TBROK,"Could not run 'ipcs' to calculate used message queues"); - tst_exit(); - } - /* FIXME: Start at -4 because ipcs prints four lines of header */ - for (used_queues = -4; fgets(buff, BUFSIZE, f); used_queues++) - ; - pclose(f); - if (used_queues < 0) { - tst_resm(TBROK,"Could not read output of 'ipcs' to calculate used message queues"); - tst_exit(); - } - return used_queues; -} - -/** Get the max number of message queues allowed on system */ -static int get_max_msgqueues() -{ - FILE *f; - char buff[BUFSIZE]; - - /* Get the max number of message queues allowed on system */ - f = fopen("/proc/sys/kernel/msgmni", "r"); - if (!f){ - tst_resm(TBROK,"Could not open /proc/sys/kernel/msgmni"); - tst_exit(); - } - if (!fgets(buff, BUFSIZE, f)) { - tst_resm(TBROK,"Could not read /proc/sys/kernel/msgmni"); - tst_exit(); - } - fclose(f); - return atoi(buff); -} - -/*************************************************************** - * setup() - performs all ONE TIME setup for this test. - *****************************************************************/ -void -setup() -{ - tst_tmpdir(); - /* You will want to enable some signal handling so you can capture - * unexpected signals like SIGSEGV. - */ - tst_sig(FORK, DEF_HANDLER, cleanup); - - - /* Pause if that option was specified */ - /* One cavet that hasn't been fixed yet. TEST_PAUSE contains the code to - * fork the test with the -c option. You want to make sure you do this - * before you create your temporary directory. - */ - TEST_PAUSE; - - MSGMNI = get_max_msgqueues() - get_used_msgqueues(); - if (MSGMNI <= 0){ - tst_resm(TBROK,"Max number of message queues already used, cannot create more."); - cleanup(); - } - -} - - -/*************************************************************** - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - ****************************************************************/ -void -cleanup() -{ - int status; - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* - * Remove the message queue from the system - */ -#ifdef DEBUG - tst_resm(TINFO,"Removing the message queue"); -#endif - fflush (stdout); - (void) msgctl(tid, IPC_RMID, (struct msqid_ds *)NULL); - if ((status = msgctl(tid, IPC_STAT, (struct msqid_ds *)NULL)) != -1) - { - (void) msgctl(tid, IPC_RMID, (struct msqid_ds *)NULL); - tst_resm(TFAIL, "msgctl(tid, IPC_RMID) failed"); - tst_exit(); - } - - fflush (stdout); - tst_rmdir(); - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgget/Makefile b/test/ipc/msgget/Makefile deleted file mode 100644 index 9071354e0..000000000 --- a/test/ipc/msgget/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) International Business Machines Corp., 2001 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -# the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -CFLAGS += -I../lib -I../../../../../include -Wall -LDLIBS += -L../../../../../lib -lltp -L.. -lipc - -SRCS = $(wildcard *.c) -TARGETS = $(patsubst %.c,%,$(SRCS)) - -all: $(TARGETS) - -install: - @set -e; for i in $(TARGETS); do ln -f $$i ../../../../bin/$$i ; done - -clean: - rm -f $(TARGETS) diff --git a/test/ipc/msgget/msgget01.c b/test/ipc/msgget/msgget01.c deleted file mode 100644 index e8ca99530..000000000 --- a/test/ipc/msgget/msgget01.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgget01.c - * - * DESCRIPTION - * msgget01 - create a message queue, write a message to it and - * read it back. - * - * ALGORITHM - * loop if that option was specified - * create a message queue - * check the return code - * if failure, issue a FAIL message. - * otherwise, - * if doing functionality testing by writting a message to the queue, - * reading it back and comparing the two. - * if the messages are the same, - * issue a PASS message - * otherwise - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgget01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "ipcmsg.h" - -#include - -char *TCID = "msgget01"; -int TST_TOTAL = 1; -extern int Tst_count; - -int msg_q_1 = -1; /* to hold the message queue ID */ - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - void check_functionality(void); - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * Use TEST macro to make the call to create the message queue - */ - - TEST(msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RD | MSG_WR)); - - if (TEST_RETURN == -1) { - tst_resm(TFAIL, "%s call failed - errno = %d : %s", - TCID, TEST_ERRNO, strerror(TEST_ERRNO)); - } else { - msg_q_1 = TEST_RETURN; - if (STD_FUNCTIONAL_TEST) { - /* - * write a message to the queue. - * read back the message. - * PASS the test if they are the same. - */ - check_functionality(); - } else { - tst_resm(TPASS, "message queue was created"); - } - } - - /* - * remove the message queue that was created and mark the ID - * as invalid. - */ - if (msg_q_1 != -1) { - rm_queue(msg_q_1); - msg_q_1 = -1; - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * check_functionality() - check the functionality of the tested system call. - */ -void -check_functionality() -{ - int i=0; - MSGBUF snd_buf, rcv_buf; - - /* EAGLE: Houston, Tranquility Base here. The Eagle has landed! */ - char *queue_msg = - "Qston, check_functionality here. The message has queued!"; - - /* - * copy our message into the buffer and then set the type. - */ - do { - snd_buf.mtext[i++] = *queue_msg; - } while(*queue_msg++ != (char)NULL); - - snd_buf.mtype = MSGTYPE; - - /* send the message */ - if(msgsnd(msg_q_1, &snd_buf, MSGSIZE, 0) == -1) { - tst_brkm(TBROK, cleanup, "Could not send a message in the " - "check_functionality() routine."); - } - - /* receive the message */ - if(msgrcv(msg_q_1, &rcv_buf, MSGSIZE, MSGTYPE, IPC_NOWAIT) == -1) { - tst_brkm(TBROK, cleanup, "Could not read a messages in the " - "check_functionality() routine."); - } - - if(strcmp(snd_buf.mtext, rcv_buf.mtext) == 0) { - tst_resm(TPASS, "message received = message sent"); - } else { - tst_resm(TFAIL, "message received != message sent"); - } -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgget/msgget02.c b/test/ipc/msgget/msgget02.c deleted file mode 100644 index a7040f670..000000000 --- a/test/ipc/msgget/msgget02.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgget02.c - * - * DESCRIPTION - * msgget02 - test for EEXIST and ENOENT errors - * - * ALGORITHM - * create a message queue - * loop if that option was specified - * try to recreate the same queue - test #1 - * try to access a queue that doesn't exist - tests #2 & #3 - * check the errno value - * issue a PASS message if we get EEXIST or ENOENT depening on test - * otherwise, the tests fails - * issue a FAIL message - * break any remaining tests - * call cleanup - * - * USAGE: - * msgget02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgget02"; -int TST_TOTAL = 3; -extern int Tst_count; - -struct test_case_t { - int error; - int msg_incr; - int flags; -} TC[] = { - {EEXIST, 0, IPC_CREAT | IPC_EXCL}, - {ENOENT, 1, IPC_PRIVATE}, - {ENOENT, 1, IPC_EXCL} -}; - -int exp_enos[] = {EEXIST, ENOENT, 0}; - -int msg_q_1 = -1; /* The message queue id created in setup */ - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* loop through the test cases */ - - for (i=0; i - * msgget03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgget03"; -int TST_TOTAL = 1; -extern int Tst_count; - -int maxmsgs = 0; - -int exp_enos[] = {ENOSPC, 0}; /* 0 terminated list of expected errnos */ - -int *msg_q_arr = NULL; /* hold the id's that we create */ -int num_queue = 0; /* count the queues created */ - -static int get_max_msgqueues(); - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * Try to create another message queue. This should - * give us an ENOSPC error. - */ - - TEST(msgget(msgkey + num_queue + 1, IPC_CREAT|IPC_EXCL)); - - if (TEST_RETURN != -1) { - tst_resm(TFAIL, "call succeeded when error expected"); - continue; - } - - TEST_ERROR_LOG(TEST_ERRNO); - - switch(TEST_ERRNO) { - case ENOSPC: - tst_resm(TPASS, "expected failure - errno = %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - default: - tst_resm(TFAIL, "call failed with an " - "unexpected error - %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/** Get the max number of message queues allowed on system */ -int get_max_msgqueues() -{ - FILE *f; - char buff[512]; - - /* Get the max number of message queues allowed on system */ - f = fopen("/proc/sys/kernel/msgmni", "r"); - if (!f){ - tst_brkm(TBROK, cleanup, "Could not open /proc/sys/kernel/msgmni"); - } - if (!fgets(buff, 512, f)) { - tst_brkm(TBROK, cleanup, "Could not read /proc/sys/kernel/msgmni"); - } - fclose(f); - return atoi(buff); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - int msg_q; - - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Set up the expected error numbers for -e option */ - TEST_EXP_ENOS(exp_enos); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - maxmsgs = get_max_msgqueues(); - - msg_q_arr = (int *)calloc(maxmsgs, sizeof (int)); - if (msg_q_arr == NULL) { - tst_brkm(TBROK, cleanup, "Couldn't allocate memory " - "for msg_q_arr: calloc() failed"); - } - - /* - * Use a while loop to create the maximum number of queues. - * When we get an error, check for ENOSPC. - */ - while((msg_q = msgget(msgkey + num_queue, IPC_CREAT|IPC_EXCL)) != -1) { - msg_q_arr[num_queue] = msg_q; - if (num_queue == maxmsgs) { - tst_resm(TINFO, "The maximum number of message" - " queues (%d) has been reached", maxmsgs); - break; - } - num_queue++; - } - - /* - * if we have something other than ENOSPC, then something else is - * wrong. - */ - - if (errno != ENOSPC) { - tst_brkm(TBROK, cleanup, "Didn't get ENOSPC in test setup" - " - errno = %d : %s", errno, strerror(errno)); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - int i; - - /* - * remove the message queues if they were created - */ - - if (msg_q_arr != NULL) { - for (i=0; i - * msgget04 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ -#include -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -char *TCID = "msgget04"; -int TST_TOTAL = 3; -extern int Tst_count; - -char nobody_uid[] = "nobody"; -struct passwd *ltpuser; - - -int exp_enos[] = {EACCES, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* to hold the message queue id */ - -int test_flags[] = {MSG_RD, MSG_WR, MSG_RD | MSG_WR}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; /* a counter */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* loop through the test cases */ - - for (i=0; ipw_uid) == -1) { - tst_resm(TINFO, "setuid failed to " - "to set the effective uid to %d", - ltpuser->pw_uid); - perror("setuid"); - } - - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* - * Create the message queue without specifying permissions. - */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT|IPC_EXCL)) == -1) { - tst_brkm(TBROK, cleanup, "Could not create message queue" - " - errno = %d : %s", errno, strerror(errno)); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgrcv/Makefile b/test/ipc/msgrcv/Makefile deleted file mode 100644 index 9071354e0..000000000 --- a/test/ipc/msgrcv/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) International Business Machines Corp., 2001 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -# the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -CFLAGS += -I../lib -I../../../../../include -Wall -LDLIBS += -L../../../../../lib -lltp -L.. -lipc - -SRCS = $(wildcard *.c) -TARGETS = $(patsubst %.c,%,$(SRCS)) - -all: $(TARGETS) - -install: - @set -e; for i in $(TARGETS); do ln -f $$i ../../../../bin/$$i ; done - -clean: - rm -f $(TARGETS) diff --git a/test/ipc/msgrcv/msgrcv01.c b/test/ipc/msgrcv/msgrcv01.c deleted file mode 100644 index 66c92d084..000000000 --- a/test/ipc/msgrcv/msgrcv01.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgrcv01.c - * - * DESCRIPTION - * msgrcv01 - test that msgrcv() receives the expected message - * - * ALGORITHM - * create a message queue - * initialize a message buffer with a known message and type - * loop if that option was specified - * fork a child to receive the message - * parent enqueues the message then exits - * check the return code - * if failure, issue a FAIL message. - * otherwise, - * if doing functionality testing - * build a new message and compare it to the one received - * if they are the same, - * issue a PASS message - * otherwise - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgrcv01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include -#include - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); -void do_child(void); - -char *TCID = "msgrcv01"; -int TST_TOTAL = 1; -extern int Tst_count; - -int msg_q_1; -MSGBUF snd_buf, rcv_buf, cmp_buf; - -pid_t c_pid; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - void check_functionality(void); - int status, e_code; - - /* parse standard options */ - if ((msg = - parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *) NULL) { - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - -#ifdef UCLINUX - maybe_run_child(&do_child, "d", &msg_q_1); -#endif - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * fork a child to read from the queue while the parent - * enqueues the message to be read. - */ - if ((c_pid = FORK_OR_VFORK()) == -1) { - tst_brkm(TBROK, cleanup, "could not fork"); - } - - if (c_pid == 0) { /* child */ -#ifdef UCLINUX - if (self_exec(av[0], "d", msg_q_1) < 0) { - tst_brkm(TBROK, cleanup, "could not self_exec"); - } -#else - do_child(); -#endif - } else { /* parent */ - /* put the message on the queue */ - if (msgsnd(msg_q_1, &snd_buf, MSGSIZE, 0) == -1) { - tst_brkm(TBROK, cleanup, "Couldn't enqueue" " message"); - } - /* wait for the child to finish */ - wait(&status); - /* make sure the child returned a good exit status */ - e_code = status >> 8; - if (e_code != 0) { - tst_resm(TFAIL, "Failures reported above"); - } - - } - } - - cleanup(); - - /** NOT REACHED **/ - return(0); - -} - -/* - * do_child() - */ -void -do_child() -{ - int retval = 0; - - TEST(msgrcv(msg_q_1, &rcv_buf, MSGSIZE, 1, 0)); - - if (TEST_RETURN == -1) { - retval = 1; - tst_resm(TFAIL, "%s call failed - errno = %d : %s", - TCID, TEST_ERRNO, strerror(TEST_ERRNO)); - } else { - if (STD_FUNCTIONAL_TEST) { - /* - * Build a new message and compare it - * with the one received. - */ - init_buf(&cmp_buf, MSGTYPE, MSGSIZE); - - if (strcmp(rcv_buf.mtext, cmp_buf.mtext) == 0) { - tst_resm(TPASS, - "message received = " "message sent"); - } else { - retval = 1; - tst_resm(TFAIL, - "message received != " "message sent"); - } - } else { - tst_resm(TPASS, "call succeeded"); - } - } - exit(retval); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void setup(void) -{ - /* capture signals */ - tst_sig(FORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* initialize the message buffer */ - init_buf(&snd_buf, MSGTYPE, MSGSIZE); -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void cleanup(void) -{ - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} diff --git a/test/ipc/msgrcv/msgrcv02.c b/test/ipc/msgrcv/msgrcv02.c deleted file mode 100644 index c5cbdc3fa..000000000 --- a/test/ipc/msgrcv/msgrcv02.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgrcv02.c - * - * DESCRIPTION - * msgrcv02 - test for EACCES and EFAULT errors - * - * ALGORITHM - * create a message queue with read/write permissions - * initialize a message buffer with a known message and type - * enqueue the message - * create another message queue without read/write permissions - * loop if that option was specified - * call msgrcv() using two different invalid cases - * check the errno value - * issue a PASS message if we get EACCES or EFAULT - * otherwise, the tests fails - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgrcv02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgrcv02"; -int TST_TOTAL = 2; -extern int Tst_count; - -char nobody_uid[] = "nobody"; -struct passwd *ltpuser; - -int exp_enos[] = {EACCES, EFAULT, 0}; - -int msg_q_1 = -1; /* The message queue ID created in setup */ -int msg_q_2 = -1; /* Another message queue ID created in setup */ -MSGBUF snd_buf, rcv_buf; - -struct test_case_t { - int *queue_id; - MSGBUF *mbuf; - int error; -} TC[] = { - /* EACCES - the queue has no read access */ - {&msg_q_2, &rcv_buf, EACCES}, - - /* EFAULT - the message buffer address is invalid */ - {&msg_q_1, (MSGBUF *)-1, EFAULT} -}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - for (i=0; ipw_uid) == -1) { - tst_resm(TINFO, "setuid failed to " - "to set the effective uid to %d", - ltpuser->pw_uid); - perror("setuid"); - } - - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue #1"); - } - - /* initialize a message buffer */ - init_buf(&snd_buf, MSGTYPE, MSGSIZE); - - /* put it on msq_q_1 */ - if (msgsnd(msg_q_1, &snd_buf, MSGSIZE, IPC_NOWAIT) == -1) { - tst_brkm(TBROK, cleanup, "Couldn't put message on queue"); - } - - /* create a message queue without read/write permission */ - if ((msg_q_2 = msgget(msgkey + 1, IPC_CREAT | IPC_EXCL)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue #2"); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue #1 */ - rm_queue(msg_q_1); - - /* if it exists, remove the message queue #2 */ - rm_queue(msg_q_2); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgrcv/msgrcv03.c b/test/ipc/msgrcv/msgrcv03.c deleted file mode 100644 index b069b27b4..000000000 --- a/test/ipc/msgrcv/msgrcv03.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgrcv03.c - * - * DESCRIPTION - * msgrcv03 - test for EINVAL error - * - * ALGORITHM - * create a message queue with read/write permissions - * loop if that option was specified - * call msgrcv() using two different invalid cases - * check the errno value - * issue a PASS message if we get EINVAL - * otherwise, the tests fails - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgrcv03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgrcv03"; -int TST_TOTAL = 2; -extern int Tst_count; - -int exp_enos[] = {EINVAL, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ -int bad_q = -1; /* a value to use as a bad queue ID */ -MSGBUF rcv_buf; - -struct test_case_t { - int *queue_id; - int msize; - int error; -} TC[] = { - /* EINVAL - the queue ID is invalid */ - {&bad_q, MSGSIZE, EINVAL}, - - /* EINVAL - the message size is less than 0 */ - {&msg_q_1, -1, EINVAL} -}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - for (i=0; i - * msgrcv04 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgrcv04"; -int TST_TOTAL = 2; -extern int Tst_count; - -int exp_enos[] = {E2BIG, ENOMSG, 0}; - -int msg_q_1 = -1; /* The message queue id created in setup */ - -#define SMSIZE 512 - -MSGBUF snd_buf, rcv_buf; - -struct test_case_t { - int size; - int type; - int flags; - int error; -} TC[] = { - /* - * E2BIG - The receive buffer is too small for the message and - * MSG_NOERROR isn't asserted in the flags. - */ - {SMSIZE, 1, 0, E2BIG}, - - /* - * ENOMSG - There is no message with the requested type and - * IPC_NOWAIT is asserted in the flags. - */ - {MSGSIZE, 2, IPC_NOWAIT, ENOMSG} -}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - for (i=0; i - * msgrcv05 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -#include -#include - -void do_child(void); -void cleanup(void); -void setup(void); -void sighandler(int); -#ifdef UCLINUX -void do_child_uclinux(void); -#endif - -char *TCID = "msgrcv05"; -int TST_TOTAL = 1; -extern int Tst_count; - -int exp_enos[] = {EINTR, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ - -MSGBUF rcv_buf; -pid_t c_pid; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - -#ifdef UCLINUX - maybe_run_child(&do_child_uclinux, "d", &msg_q_1); -#endif - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * fork a child that will attempt to read a non-existent - * message from the queue - */ - if ((c_pid = FORK_OR_VFORK()) == -1) { - tst_brkm(TBROK, cleanup, "could not fork"); - } - - if (c_pid == 0) { /* child */ - /* - * Attempt to read a message without IPC_NOWAIT. - * With no message to read, the child sleeps. - */ -#ifdef UCLINUX - if (self_exec(av[0], "d", msg_q_1) < 0) { - tst_brkm(TBROK, cleanup, "could not self_exec"); - } -#else - do_child(); -#endif - } else { /* parent */ - usleep(250000); - - /* send a signal that must be caught to the child */ - if (kill(c_pid, SIGHUP) == -1) { - tst_brkm(TBROK, cleanup, "kill failed"); - } - - waitpid(c_pid, NULL, 0); - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * do_child() - */ -void -do_child() -{ - TEST(msgrcv(msg_q_1, &rcv_buf, MSGSIZE, 1, 0)); - - if (TEST_RETURN != -1) { - tst_resm(TFAIL, "call succeeded when error expected"); - exit(-1); - } - - TEST_ERROR_LOG(TEST_ERRNO); - - switch(TEST_ERRNO) { - case EINTR: - tst_resm(TPASS, "expected failure - errno = %d : %s", TEST_ERRNO, - strerror(TEST_ERRNO)); - break; - default: - tst_resm(TFAIL, "call failed with an unexpected error - %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - } - - exit(0); -} - -#ifdef UCLINUX -/* - * do_child_uclinux() - capture signals again, then run do_child() - */ -void -do_child_uclinux() -{ - tst_sig(FORK, sighandler, cleanup); - - do_child(); -} -#endif - -/* - * sighandler() - handle signals - */ -void -sighandler(int sig) -{ - /* we don't need to do anything here */ -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(FORK, sighandler, cleanup); - - /* Set up the expected error numbers for -e option */ - TEST_EXP_ENOS(exp_enos); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} diff --git a/test/ipc/msgrcv/msgrcv06.c b/test/ipc/msgrcv/msgrcv06.c deleted file mode 100644 index e5a1f6259..000000000 --- a/test/ipc/msgrcv/msgrcv06.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgrcv06.c - * - * DESCRIPTION - * msgrcv06 - test for EIDRM error - * - * ALGORITHM - * loop if that option was specified - * create a message queue with read/write permissions - * fork a child who sleeps on an attempted read with msgrcv() - * parent removes the queue then waits for child to complete - * check the errno value - * issue a PASS message if we get EIDRM - * otherwise, the tests fails - * issue a FAIL message - * child removes message queue if required - * parent callc cleanup - * - * USAGE: - * msgrcv06 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -#include -#include - -void do_child(void); -void cleanup(void); -void setup(void); -void sighandler(int); -#ifdef UCLINUX -void do_child_uclinux(void); -#endif - -char *TCID = "msgrcv06"; -int TST_TOTAL = 1; -extern int Tst_count; - -int exp_enos[] = {EIDRM, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ - -MSGBUF rcv_buf; -pid_t c_pid; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - -#ifdef UCLINUX - maybe_run_child(&do_child_uclinux, "d", &msg_q_1); -#endif - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * set up the queue here so that multiple test iterations - * will work. - */ - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) - == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* - * fork a child that will attempt to read a non-existent - * message from the queue - */ - if ((c_pid = FORK_OR_VFORK()) == -1) { - tst_brkm(TBROK, cleanup, "could not fork"); - } - - if (c_pid == 0) { /* child */ - /* - * Attempt to read a message without IPC_NOWAIT. - * With no message to read, the child sleeps. - */ -#ifdef UCLINUX - if (self_exec(av[0], "d", msg_q_1) < 0) { - tst_brkm(TBROK, cleanup, "could not self_exec"); - } -#else - do_child(); -#endif - } else { /* parent */ - usleep(250000); - - /* remove the queue */ - rm_queue(msg_q_1); - - waitpid(c_pid, NULL, 0); - } - } - - /*NOTREACHED*/ - return(0); -} - -/* - * do_child() - */ -void -do_child() -{ - TEST(msgrcv(msg_q_1, &rcv_buf, MSGSIZE, 1, 0)); - - if (TEST_RETURN != -1) { - tst_resm(TFAIL, "call succeeded when error expected"); - exit(-1); - } - - TEST_ERROR_LOG(TEST_ERRNO); - - switch(TEST_ERRNO) { - case EIDRM: - tst_resm(TPASS, "expected failure - errno = %d : %s", TEST_ERRNO, - strerror(TEST_ERRNO)); - - /* mark the queue as invalid as it was removed */ - msg_q_1 = -1; - break; - default: - tst_resm(TFAIL, "call failed with an unexpected error - %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - } - - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - exit(0); -} - -#ifdef UCLINUX -/* - * do_child_uclinux() - capture signals again, then run do_child() - */ -void -do_child_uclinux() -{ - tst_sig(FORK, sighandler, cleanup); - - do_child(); -} -#endif - -/* - * sighandler() - handle signals - */ -void -sighandler(int sig) -{ - /* we don't need to do anything here */ -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(FORK, sighandler, cleanup); - - /* Set up the expected error numbers for -e option */ - TEST_EXP_ENOS(exp_enos); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} diff --git a/test/ipc/msgsnd/Makefile b/test/ipc/msgsnd/Makefile deleted file mode 100644 index 9071354e0..000000000 --- a/test/ipc/msgsnd/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) International Business Machines Corp., 2001 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -# the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -CFLAGS += -I../lib -I../../../../../include -Wall -LDLIBS += -L../../../../../lib -lltp -L.. -lipc - -SRCS = $(wildcard *.c) -TARGETS = $(patsubst %.c,%,$(SRCS)) - -all: $(TARGETS) - -install: - @set -e; for i in $(TARGETS); do ln -f $$i ../../../../bin/$$i ; done - -clean: - rm -f $(TARGETS) diff --git a/test/ipc/msgsnd/msgsnd01.c b/test/ipc/msgsnd/msgsnd01.c deleted file mode 100644 index 368ea376d..000000000 --- a/test/ipc/msgsnd/msgsnd01.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgsnd01.c - * - * DESCRIPTION - * msgsnd01 - test that msgsnd() enqueues a message correctly - * - * ALGORITHM - * create a message queue - * initialize a message buffer with a known message and type - * loop if that option was specified - * enqueue the message - * check the return code - * if failure, issue a FAIL message. - * otherwise, - * if doing functionality testing - * stat the message queue - * check for # of bytes = MSGSIZE and # of messages = 1 - * if correct, - * issue a PASS message - * otherwise - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgsnd01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * None - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgsnd01"; -int TST_TOTAL = 1; -extern int Tst_count; - -int msg_q_1; -MSGBUF msg_buf, rd_buf; - -struct msqid_ds qs_buf; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * Use TEST macro to make the call - */ - - TEST(msgsnd(msg_q_1, &msg_buf, MSGSIZE, 0)); - - if (TEST_RETURN == -1) { - tst_resm(TFAIL, "%s call failed - errno = %d : %s", - TCID, TEST_ERRNO, strerror(TEST_ERRNO)); - continue; - } - - if (STD_FUNCTIONAL_TEST) { - - /* get the queue status */ - if (msgctl(msg_q_1, IPC_STAT, &qs_buf) == -1) { - tst_brkm(TBROK, cleanup, "Could not " - "get queue status"); - } - - if (qs_buf.msg_cbytes != MSGSIZE) { - tst_resm(TFAIL, "queue bytes != MSGSIZE"); - } - - if (qs_buf.msg_qnum != 1) { - tst_resm(TFAIL, "queue message != 1"); - } - - tst_resm(TPASS, "queue bytes = MSGSIZE and " - "queue messages = 1"); - } else { - tst_resm(TPASS, "call succeeded"); - } - - /* - * remove the message by reading from the queue - */ - if (msgrcv(msg_q_1, &rd_buf, MSGSIZE, 1, 0) == -1) { - tst_brkm(TBROK, cleanup, "Could not read from queue"); - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue with read/write permissions */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* initialize the message buffer */ - init_buf(&msg_buf, MSGTYPE, MSGSIZE); -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue if it exists */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgsnd/msgsnd02.c b/test/ipc/msgsnd/msgsnd02.c deleted file mode 100644 index 24af375b5..000000000 --- a/test/ipc/msgsnd/msgsnd02.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgsnd02.c - * - * DESCRIPTION - * msgsnd02 - test for EACCES and EFAULT errors - * - * ALGORITHM - * create a message queue without write permission - * create a trivial message buffer - * loop if that option was specified - * call msgsnd() using two different invalid cases - * check the errno value - * issue a PASS message if we get EACCES or EFAULT - * otherwise, the tests fails - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgsnd02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ -#include -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgsnd02"; -int TST_TOTAL = 2; -extern int Tst_count; - -char nobody_uid[] = "nobody"; -struct passwd *ltpuser; - -int exp_enos[] = {EACCES, EFAULT, 0}; - -int msg_q_1 = -1; /* The message queue id created in setup */ -MSGBUF msg_buf; /* a buffer for the message to queue */ -int bad_q = -1; /* a value to use as a bad queue ID */ - -struct test_case_t { - int *queue_id; - MSGBUF *buffer; - int error; -} TC[] = { - /* EACCES - there is no write permission for the queue */ - {&msg_q_1, &msg_buf, EACCES}, - - /* EFAULT - the message buffer address is invalid */ - {&msg_q_1, NULL, EFAULT}, -}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * loop through the test cases - */ - - for (i=0; ipw_uid) == -1) { - tst_resm(TINFO, "setuid failed to " - "to set the effective uid to %d", - ltpuser->pw_uid); - perror("setuid"); - } - - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue without write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RD)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* initialize the message buffer with something trivial */ - msg_buf.mtype = MSGTYPE; - msg_buf.mtext[0] = 'a'; -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgsnd/msgsnd03.c b/test/ipc/msgsnd/msgsnd03.c deleted file mode 100644 index 821492c5c..000000000 --- a/test/ipc/msgsnd/msgsnd03.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgsnd03.c - * - * DESCRIPTION - * msgsnd03 - test for EINVAL error - * - * ALGORITHM - * create a message queue with read/write permissions - * create a trivial message buffer - * loop if that option was specified - * call msgsnd() using four different invalid cases - * check the errno value - * issue a PASS message if we get EINVAL - * otherwise, the tests fails - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgsnd03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgsnd03"; -int TST_TOTAL = 4; -extern int Tst_count; - - -int exp_enos[] = {EINVAL, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ -MSGBUF msg_buf; /* a buffer for the message to queue */ -int bad_q = -1; /* a value to use as a bad queue ID */ - -struct test_case_t { - int *queue_id; - MSGBUF *buffer; - long mtype; - int msg_size; - int error; -} TC[] = { - /* EINVAL - the queue ID is invalid */ - {&bad_q, &msg_buf, 1, 1, EINVAL}, - - /* EINVAL - the message type is not positive (0) */ - {&msg_q_1, &msg_buf, 0, 1, EINVAL}, - - /* EINVAL - the message type is not positive (>0) */ - {&msg_q_1, &msg_buf, -1, 1, EINVAL}, - - /* EINVAL - the message size is less than zero */ - {&msg_q_1, &msg_buf, 1, -1, EINVAL} -}; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - int i; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * loop through the test cases - */ - - for (i=0; i - * msgsnd04 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); - -char *TCID = "msgsnd04"; -int TST_TOTAL = 1; -extern int Tst_count; - -int exp_enos[] = {EAGAIN, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ -MSGBUF msg_buf; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * Attempt to write another message to the full queue. - */ - - TEST(msgsnd(msg_q_1, &msg_buf, MSGSIZE, IPC_NOWAIT)); - - if (TEST_RETURN != -1) { - tst_resm(TFAIL, "call succeeded when error expected"); - continue; - } - - TEST_ERROR_LOG(TEST_ERRNO); - - switch(TEST_ERRNO) { - case EAGAIN: - tst_resm(TPASS, "expected failure - errno = %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - default: - tst_resm(TFAIL, "call failed with an " - "unexpected error - %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals */ - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - /* Set up the expected error numbers for -e option */ - TEST_EXP_ENOS(exp_enos); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* initialize the message buffer */ - init_buf(&msg_buf, MSGTYPE, MSGSIZE); - - /* write messages to the queue until it is full */ - while (msgsnd(msg_q_1, &msg_buf, MSGSIZE, IPC_NOWAIT) != -1) { - msg_buf.mtype += 1; - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgsnd/msgsnd05.c b/test/ipc/msgsnd/msgsnd05.c deleted file mode 100644 index eb0bb71b8..000000000 --- a/test/ipc/msgsnd/msgsnd05.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgsnd05.c - * - * DESCRIPTION - * msgsnd05 - test for EINTR error - * - * ALGORITHM - * create a message queue with read/write permissions - * initialize a message buffer with a known message and type - * enqueue the message in a loop until the queue is full - * loop if that option was specified - * fork a child process - * child attempts to enqueue a message to the full queue and sleeps - * parent sends a SIGHUP to the child then waits for the child to complete - * child get a return from msgsnd() - * check the errno value - * issue a PASS message if we get EINTR - * otherwise, the tests fails - * issue a FAIL message - * child exits, parent calls cleanup - * - * USAGE: - * msgsnd05 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -#include -#include - -void do_child(void); -void cleanup(void); -void setup(void); -void sighandler(int); -#ifdef UCLINUX -void do_child_uclinux(void); -#endif - -char *TCID = "msgsnd05"; -int TST_TOTAL = 1; -extern int Tst_count; - -int exp_enos[] = {EINTR, 0}; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ -MSGBUF msg_buf; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - pid_t c_pid; - - /* parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - -#ifdef UCLINUX - maybe_run_child(&do_child_uclinux, "d", &msg_q_1); -#endif - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - /* - * fork a child that will attempt to write a message - * to the queue without IPC_NOWAIT - */ - if ((c_pid = FORK_OR_VFORK()) == -1) { - tst_brkm(TBROK, cleanup, "could not fork"); - } - - if (c_pid == 0) { /* child */ - /* - * Attempt to write another message to the full queue. - * Without the IPC_NOWAIT flag, the child sleeps - */ -#ifdef UCLINUX - if (self_exec(av[0], "d", msg_q_1) < 0) { - tst_brkm(TBROK, cleanup, "could not self_exec"); - } -#else - do_child(); -#endif - } else { /* parent */ - usleep(250000); - - /* send a signal that must be caught to the child */ - if (kill(c_pid, SIGHUP) == -1) { - tst_brkm(TBROK, cleanup, "kill failed"); - } - - waitpid(c_pid, NULL, 0); - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * do_child() - */ -void -do_child() -{ - TEST(msgsnd(msg_q_1, &msg_buf, MSGSIZE, 0)); - - if (TEST_RETURN != -1) { - tst_resm(TFAIL, "call succeeded when error expected"); - exit(-1); - } - - TEST_ERROR_LOG(TEST_ERRNO); - - switch(TEST_ERRNO) { - case EINTR: - tst_resm(TPASS, "expected failure - errno = %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - default: - tst_resm(TFAIL, "call failed with an unexpected error - %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - } - - exit(0); -} - -#ifdef UCLINUX -/* - * do_child_uclinux() - capture signals, initialize buffer, then run do_child() - */ -void -do_child_uclinux() -{ - /* initialize the message buffer */ - init_buf(&msg_buf, MSGTYPE, MSGSIZE); - - tst_sig(FORK, sighandler, cleanup); - - do_child(); -} -#endif - -/* - * sighandler() - handle signals - */ -void -sighandler(int sig) -{ - /* we don't need to do anything here */ -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void -setup(void) -{ - /* capture signals in our own handler */ - tst_sig(FORK, sighandler, cleanup); - - /* Set up the expected error numbers for -e option */ - TEST_EXP_ENOS(exp_enos); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); - - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* initialize the message buffer */ - init_buf(&msg_buf, MSGTYPE, MSGSIZE); - - /* write messages to the queue until it is full */ - while (msgsnd(msg_q_1, &msg_buf, MSGSIZE, IPC_NOWAIT) != -1) { - msg_buf.mtype += 1; - } -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void -cleanup(void) -{ - /* if it exists, remove the message queue that was created */ - rm_queue(msg_q_1); - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} - diff --git a/test/ipc/msgsnd/msgsnd06.c b/test/ipc/msgsnd/msgsnd06.c deleted file mode 100644 index b7ed964e0..000000000 --- a/test/ipc/msgsnd/msgsnd06.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * - * Copyright (c) International Business Machines Corp., 2001 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * NAME - * msgsnd06.c - * - * DESCRIPTION - * msgsnd06 - test for EIDRM error - * - * ALGORITHM - * loop if that option was specified - * create a message queue with read/write permissions - * initialize a message buffer with a known message and type - * enqueue messages in a loop until the queue is full - * fork a child process - * child attempts to enqueue a message to the full queue and sleeps - * parent removes the queue and then exits - * child get a return from msgsnd() - * check the errno value - * issue a PASS message if we get EIDRM - * otherwise, the tests fails - * issue a FAIL message - * call cleanup - * - * USAGE: - * msgsnd06 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none - */ - -#include -#include "test.h" -#include "usctest.h" - -#include "ipcmsg.h" - -void cleanup(void); -void setup(void); -void do_child(void); - -char *TCID = "msgsnd06"; -int TST_TOTAL = 1; -extern int Tst_count; - -int exp_enos[] = { EIDRM, 0 }; /* 0 terminated list of expected errnos */ - -int msg_q_1 = -1; /* The message queue id created in setup */ -MSGBUF msg_buf; - -int main(int ac, char **av) -{ - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ - pid_t c_pid; - int status, e_code; - - /* parse standard options */ - if ((msg = - parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *) NULL) { - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - } - -#ifdef UCLINUX - maybe_run_child(&do_child, "d", &msg_q_1); -#endif - - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ - - for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset Tst_count in case we are looping */ - Tst_count = 0; - - msgkey = getipckey(); - - /* create a message queue with read/write permission */ - if ((msg_q_1 = msgget(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW)) - == -1) { - tst_brkm(TBROK, cleanup, "Can't create message queue"); - } - - /* initialize the message buffer */ - init_buf(&msg_buf, MSGTYPE, MSGSIZE); - - /* write messages to the queue until it is full */ - while (msgsnd(msg_q_1, &msg_buf, MSGSIZE, IPC_NOWAIT) != -1) { - msg_buf.mtype += 1; - } - - /* - * fork a child that will attempt to write a message - * to the queue without IPC_NOWAIT - */ - if ((c_pid = FORK_OR_VFORK()) == -1) { - tst_brkm(TBROK, cleanup, "could not fork"); - } - - if (c_pid == 0) { /* child */ -#ifdef UCLINUX - if (self_exec(av[0], "d", msg_q_1) < 0) { - tst_brkm(TBROK, cleanup, "could not self_exec"); - } -#else - do_child(); -#endif - } else { /* parent */ - sleep(1); - /* remove the queue */ - rm_queue(msg_q_1); - - /* wait for the child to finish */ - wait(&status); - /* make sure the child returned a good exit status */ - e_code = status >> 8; - if (e_code != 0) { - tst_resm(TFAIL, "Failures reported above"); - } - } - } - - cleanup(); - - /*NOTREACHED*/ - return(0); -} - -/* - * do_child() - */ -void -do_child() -{ - int retval = 0; - -#ifdef UCLINUX - /* initialize the message buffer */ - init_buf(&msg_buf, MSGTYPE, MSGSIZE); -#endif - - /* - * Attempt to write another message to the full queue. - * Without the IPC_NOWAIT flag, the child sleeps - */ - TEST(msgsnd(msg_q_1, &msg_buf, MSGSIZE, 0)); - - if (TEST_RETURN != -1) { - retval = 1; - tst_resm(TFAIL, "call succeeded when error expected"); - exit(retval); - } - - TEST_ERROR_LOG(TEST_ERRNO); - - switch (TEST_ERRNO) { - case EIDRM: - tst_resm(TPASS, "expected failure - errno = %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - - /* mark the queue as invalid as it was removed */ - msg_q_1 = -1; - break; - default: - retval = 1; - tst_resm(TFAIL, "call failed with an unexpected error - %d : %s", - TEST_ERRNO, strerror(TEST_ERRNO)); - break; - } - exit(retval); -} - -/* - * setup() - performs all the ONE TIME setup for this test. - */ -void setup(void) -{ - /* capture signals */ - tst_sig(FORK, DEF_HANDLER, cleanup); - - /* Set up the expected error numbers for -e option */ - TEST_EXP_ENOS(exp_enos); - - /* Pause if that option was specified */ - TEST_PAUSE; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ - tst_tmpdir(); -} - -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void cleanup(void) -{ - - /* Remove the temporary directory */ - tst_rmdir(); - - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ - TEST_CLEANUP; - - /* exit with return code appropriate for results */ - tst_exit(); -} diff --git a/test/ipc/shmt/testshm.sh b/test/ipc/shmt/test.sh similarity index 100% rename from test/ipc/shmt/testshm.sh rename to test/ipc/shmt/test.sh diff --git a/test/ipc/test.sh b/test/ipc/test.sh new file mode 100644 index 000000000..92f0c9cac --- /dev/null +++ b/test/ipc/test.sh @@ -0,0 +1,7 @@ +for d in semctl semget semop shmat shmctl shmdt shmget shmt +do echo $d + ( cd $d + sh test.sh + ) +done +