All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
To: ltp-list@lists.sourceforge.net
Subject: [LTP] [PATCH 1/2] semop/semop02.c: cleanup
Date: Thu, 26 Dec 2013 14:22:43 +0800	[thread overview]
Message-ID: <52BBCB33.8010904@cn.fujitsu.com> (raw)


* Delete some useless commtents.
* Move the test body form main to a new
  semop_verify function.
* Use some SAFE_* macros.
* Some cleanup.

Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
---
 testcases/kernel/syscalls/ipc/semop/semop02.c | 175 +++++++++-----------------
 1 file changed, 58 insertions(+), 117 deletions(-)

diff --git a/testcases/kernel/syscalls/ipc/semop/semop02.c b/testcases/kernel/syscalls/ipc/semop/semop02.c
index b97cc3f..08fc43c 100644
--- a/testcases/kernel/syscalls/ipc/semop/semop02.c
+++ b/testcases/kernel/syscalls/ipc/semop/semop02.c
@@ -18,56 +18,30 @@
  */
 
 /*
- * NAME
- *	semop02.c
- *
  * DESCRIPTION
  *	semop02 - test for E2BIG, EACCES, EFAULT and EINVAL errors
  *
- * ALGORITHM
- *	create a semaphore set with read and alter permissions
- *	create a semaphore set without read and alter permissions
- *	loop if that option was specified
- *	call semop with five different invalid cases
- *	check the errno value
- *	  issue a PASS message if we get E2BIG, EACCES, EFAULT or EINVAL
- *	otherwise, the tests fails
- *	  issue a FAIL message
- *	call cleanup
- *
- * USAGE:  <for command-line>
- *  semop02 [-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
  *
  *      10/03/2008 Renaud Lottiaux (Renaud.Lottiaux@kerlabs.com)
  *      - Fix concurrency issue. The second key used for this test could
  *        conflict with the key from another task.
- *
- * RESTRICTIONS
- *	none
  */
-#include <pwd.h>
 
+#include <pwd.h>
+#include "test.h"
+#include "safe_macros.h"
 #include "ipcsem.h"
 
 char *TCID = "semop02";
-int TST_TOTAL = 5;
 
-int exp_enos[] = { E2BIG, EACCES, EFAULT, EINVAL, 0 };
+static void semop_verify(int i);
 
-int sem_id_1 = -1;		/* a semaphore set with read & alter permissions */
-int sem_id_2 = -1;		/* a semaphore set without read & alter permissions */
+static int exp_enos[] = { E2BIG, EACCES, EFAULT, EINVAL, 0 };
+int sem_id_1 = -1;	/* a semaphore set with read & alter permissions */
+int sem_id_2 = -1;	/* a semaphore set without read & alter permissions */
 int bad_id = -1;
-char nobody_uid[] = "nobody";
-struct passwd *ltpuser;
 
 struct sembuf s_buf[PSEMS];
 
@@ -78,143 +52,110 @@ int badbuf = -1;
 				/* of semop operations that are permitted   */
 
 struct test_case_t {
-	int *semid;		/* the semaphore id */
-	struct sembuf *t_sbuf;	/* the first in an array of sembuf structures */
-	unsigned t_ops;		/* the number of elements in the above array */
-	int error;		/* the expected error number */
+	int *semid;
+	struct sembuf *t_sbuf;
+	unsigned t_ops;
+	int error;
 } TC[] = {
-	/* E2BIG - the number of operations is too big */
-	{
-	&sem_id_1, (struct sembuf *)&s_buf, BIGOPS, E2BIG},
-	    /* EACCES - the semaphore set has no access permission */
-	{
-	&sem_id_2, (struct sembuf *)&s_buf, NSOPS, EACCES},
-	    /* EFAULT - the address for the s_buf value is not accessible */
-	{
-	&sem_id_1, (struct sembuf *)-1, NSOPS, EFAULT},
-	    /* EINVAL - the number of elments (t_ops) is 0 */
-	{
-	&sem_id_1, (struct sembuf *)&s_buf, 0, EINVAL},
-	    /* EINVAL - the semaphore set doesn't exist */
-	{
-	&bad_id, (struct sembuf *)&s_buf, NSOPS, EINVAL}
+	{&sem_id_1, (struct sembuf *)&s_buf, BIGOPS, E2BIG},
+	{&sem_id_2, (struct sembuf *)&s_buf, NSOPS, EACCES},
+	{&sem_id_1, (struct sembuf *)-1, NSOPS, EFAULT},
+	{&sem_id_1, (struct sembuf *)&s_buf, 0, EINVAL},
+	{&bad_id, (struct sembuf *)&s_buf, NSOPS, EINVAL}
 };
 
+int TST_TOTAL = ARRAY_SIZE(TC);
+
 int main(int ac, char **av)
 {
 	int lc;
 	char *msg;
 	int i;
 
-	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
+	msg = parse_opts(ac, av, NULL, NULL);
+	if (msg != NULL)
 		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
-	}
-
-	setup();		/* global setup */
 
-	/* The following loop checks looping state if -i option given */
+	setup();
 
 	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		/* reset tst_count in case we are looping */
 		tst_count = 0;
 
-		for (i = 0; i < TST_TOTAL; i++) {
-			/*
-			 * use the TEST macro to make the call
-			 */
-
-			TEST(semop(*(TC[i].semid), TC[i].t_sbuf, TC[i].t_ops));
-
-			if (TEST_RETURN != -1) {
-				tst_resm(TFAIL, "call succeeded unexpectedly");
-				continue;
-			}
-
-			TEST_ERROR_LOG(TEST_ERRNO);
-
-			if (TEST_ERRNO == TC[i].error) {
-				tst_resm(TPASS, "expected failure - errno = "
-					 "%d : %s", TEST_ERRNO,
-					 strerror(TEST_ERRNO));
-			} else {
-				tst_resm(TFAIL, "unexpected error - "
-					 "%d : %s", TEST_ERRNO,
-					 strerror(TEST_ERRNO));
-			}
-		}
+		for (i = 0; i < TST_TOTAL; i++)
+			semop_verify(i);
 	}
 
 	cleanup();
-
 	tst_exit();
 }
 
-/*
- * setup() - performs all the ONE TIME setup for this test.
- */
 void setup(void)
 {
+	char nobody_uid[] = "nobody";
+	struct passwd *ltpuser;
 	key_t semkey2;
 
-	/* Switch to nobody user for correct error code collection */
-	if (geteuid() != 0) {
-		tst_brkm(TBROK, NULL, "Test must be run as root");
-	}
-	ltpuser = getpwnam(nobody_uid);
-	if (seteuid(ltpuser->pw_uid) == -1) {
-		tst_resm(TINFO, "setreuid failed to "
-			 "to set the effective uid to %d", ltpuser->pw_uid);
-		perror("setreuid");
-	}
+	tst_require_root(NULL);
+
+	ltpuser = SAFE_GETPWNAM(NULL, nobody_uid);
+	SAFE_SETUID(NULL, ltpuser->pw_uid);
 
 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
 
-	/* Set up the expected error numbers for -e option */
 	TEST_EXP_ENOS(exp_enos);
 
 	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 an IPC resource key */
 	semkey = getipckey();
 
 	/* create a semaphore set with read and alter permissions */
-	if ((sem_id_1 =
-	     semget(semkey, PSEMS, IPC_CREAT | IPC_EXCL | SEM_RA)) == -1) {
-		tst_brkm(TBROK, cleanup, "couldn't create semaphore in setup");
+	sem_id_1 = semget(semkey, PSEMS, IPC_CREAT | IPC_EXCL | SEM_RA);
+	if (sem_id_1 == -1) {
+		tst_brkm(TBROK | TERRNO, cleanup,
+			 "couldn't create semaphore in setup");
 	}
 
 	/* Get an new IPC resource key. */
 	semkey2 = getipckey();
 
 	/* create a semaphore set without read and alter permissions */
-	if ((sem_id_2 = semget(semkey2, PSEMS, IPC_CREAT | IPC_EXCL)) == -1) {
-		tst_brkm(TBROK, cleanup, "couldn't create semaphore in setup");
+	sem_id_2 = semget(semkey2, PSEMS, IPC_CREAT | IPC_EXCL);
+	if (sem_id_2 == -1) {
+		tst_brkm(TBROK | TERRNO, cleanup,
+			 "couldn't create semaphore in setup");
+	}
+}
+
+static void semop_verify(int i)
+{
+	TEST(semop(*(TC[i].semid), TC[i].t_sbuf, TC[i].t_ops));
+
+	if (TEST_RETURN != -1) {
+		tst_resm(TFAIL, "call succeeded unexpectedly");
+		return;
+	}
+
+	TEST_ERROR_LOG(TEST_ERRNO);
+
+	if (TEST_ERRNO == TC[i].error) {
+		tst_resm(TPASS | TTERRNO, "semop failed as expected");
+	} else {
+		tst_resm(TFAIL | TTERRNO,
+			 "semop failed unexpectedly; expected: "
+			 "%d - %s", TC[i].error, strerror(TC[i].error));
 	}
 }
 
-/*
- * cleanup() - performs all the ONE TIME cleanup for this test at completion
- * 	       or premature exit.
- */
 void cleanup(void)
 {
 	/* if they exist, remove the semaphore resources */
 	rm_sema(sem_id_1);
 	rm_sema(sem_id_2);
 
-	tst_rmdir();
-
-	/*
-	 * print timing stats if that option was specified.
-	 * print errno log if that option was specified.
-	 */
 	TEST_CLEANUP;
 
+	tst_rmdir();
 }
-- 
1.8.2.1


------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

             reply	other threads:[~2013-12-26  6:23 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-26  6:22 Xiaoguang Wang [this message]
2014-01-21  2:09 ` [LTP] [PATCH 1/2] semop/semop02.c: cleanup Wanlong Gao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52BBCB33.8010904@cn.fujitsu.com \
    --to=wangxg.fnst@cn.fujitsu.com \
    --cc=ltp-list@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.