[LTP] [PATCH 2/2] syscall/write03.c: Cleanup && convert to new API.
Jinhui Huang
huangjh.jy@cn.fujitsu.com
Fri Apr 21 12:48:27 CEST 2017
Signed-off-by: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
---
testcases/kernel/syscalls/write/write03.c | 177 +++++++-----------------------
1 file changed, 42 insertions(+), 135 deletions(-)
diff --git a/testcases/kernel/syscalls/write/write03.c b/testcases/kernel/syscalls/write/write03.c
index 63ef35a..4fabd62 100644
--- a/testcases/kernel/syscalls/write/write03.c
+++ b/testcases/kernel/syscalls/write/write03.c
@@ -1,6 +1,8 @@
/*
- *
* Copyright (c) International Business Machines Corp., 2001
+ * 07/2001 Ported by John George
+ * Copyright (c) 2017 Fujitsu Ltd.
+ * 04/2017 Modified by Jinhui Huang
*
* 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
@@ -18,9 +20,6 @@
*/
/*
- * NAME
- * write03.c
- *
* DESCRIPTION
* Testcase to check that write(2) doesn't corrupt a file when it fails
*
@@ -29,154 +28,62 @@
* fail with some erroneous parameter, close the fd. Then reopen the
* file in RDONLY mode, and read the contents of the file. Compare the
* buffers, to see whether they are same.
- *
- * USAGE: <for command-line>
- * write03 [-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
- * 07/2001 John George
- * -Ported
- *
- * Restrictions
- * NONE
*/
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
+#include <stdio.h>
#include <errno.h>
-#include "test.h"
-#include <sys/mman.h>
-
-char *TCID = "write03";
-int TST_TOTAL = 1;
-
-char *bad_addr = 0;
+#include "tst_test.h"
-void setup(void);
-void cleanup(void);
+static char *bad_addr;
+static char wbuf[BUFSIZ], rbuf[BUFSIZ];
+static int fd;
-char filename[100];
-
-#if !defined(UCLINUX)
-
-int main(int argc, char **argv)
+static void verify_write(void)
{
- int lc;
-
- char wbuf[BUFSIZ], rbuf[BUFSIZ];
- int fd;
-
- tst_parse_opts(argc, argv, NULL, NULL);
-
- /* global setup */
- 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;
-
-//block1:
- tst_resm(TINFO, "Enter Block 1: test to check if write "
- "corrupts the file when write fails");
-
- fd = creat(filename, 0644);
- if (fd < 0) {
- tst_resm(TBROK, "creating a new file failed");
- cleanup();
- }
-
- (void)memset(wbuf, '0', 100);
-
- if (write(fd, wbuf, 100) == -1) {
- tst_resm(TFAIL, "failed to write to %s", filename);
- cleanup();
- }
-
- if (write(fd, bad_addr, 100) != -1) {
- tst_resm(TFAIL, "write(2) failed to fail");
- cleanup();
- }
- close(fd);
-
- if ((fd = open(filename, O_RDONLY)) == -1) {
- tst_resm(TBROK, "open(2) failed, errno: %d", errno);
- cleanup();
- }
-
- if (read(fd, rbuf, 100) == -1) {
- tst_resm(TBROK, "read(2) failed, errno: %d", errno);
- cleanup();
- }
-
- if (memcmp(wbuf, rbuf, 100) == 0) {
- tst_resm(TPASS, "failure of write(2) didnot corrupt "
- "the file");
- } else {
- tst_resm(TFAIL, "failure of write(2) corrupted the "
- "file");
- }
- tst_resm(TINFO, "Exit block 1");
- close(fd);
- }
- cleanup();
- tst_exit();
-}
+ fd = SAFE_CREAT("testfile", 0644);
-#else
+ SAFE_WRITE(1, fd, wbuf, 100);
-int main(void)
-{
- tst_resm(TINFO, "test is not available on uClinux");
- tst_exit();
-}
-
-#endif /* if !defined(UCLINUX) */
-
-/*
- * setup() - performs all ONE TIME setup for this test
- */
-void setup(void)
-{
+ if (write(fd, bad_addr, 100) != -1) {
+ tst_res(TFAIL, "write() failed to fail");
+ SAFE_CLOSE(fd);
+ return;
+ }
- tst_sig(FORK, DEF_HANDLER, cleanup);
+ SAFE_CLOSE(fd);
- /* Pause if that option was specified
- * TEST_PAUSE contains the code to fork the test with the -i option.
- * You want to make sure you do this before you create your temporary
- * directory.
- */
- TEST_PAUSE;
+ fd = SAFE_OPEN("testfile", O_RDONLY);
- /* Create a unique temporary directory and chdir() to it. */
- tst_tmpdir();
+ memset(rbuf, 0, BUFSIZ);
- sprintf(filename, "./write03.%d", getpid());
+ SAFE_READ(0, fd, rbuf, 100);
- bad_addr = mmap(0, 1, PROT_NONE,
- MAP_PRIVATE_EXCEPT_UCLINUX | MAP_ANONYMOUS, 0, 0);
- if (bad_addr == MAP_FAILED) {
- printf("mmap failed\n");
- }
+ if (memcmp(wbuf, rbuf, 100) == 0)
+ tst_res(TPASS, "failure of write() didnot corrupt the file");
+ else
+ tst_res(TFAIL, "failure of write() corrupted the file");
+ SAFE_CLOSE(fd);
}
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at
- * completion or premature exit
- */
-void cleanup(void)
+static void setup(void)
{
+ bad_addr = SAFE_MMAP(0, 1, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
- unlink(filename);
- tst_rmdir();
+ memset(wbuf, '0', 100);
+}
+static void cleanup(void)
+{
+ if (fd > 0)
+ SAFE_CLOSE(fd);
}
+
+static struct tst_test test = {
+ .tid = "write03",
+ .test_all = verify_write,
+ .setup = setup,
+ .cleanup = cleanup,
+ .needs_tmpdir = 1,
+};
--
1.8.3.1
More information about the ltp
mailing list