| 
     
      
      
      From: Cyril H. <su...@li...> - 2013-11-14 14:51:16
      
     
   | 
The branch, master, has been updated
       via  b185f2281d0e8767db4c1270280ec160b9fa097b (commit)
       via  cb80f404615db93b9486c88de186dcb729133727 (commit)
       via  7b20026fd2d8766735b2adf78fe76ad1fc19b56a (commit)
      from  9b48608091e0b82620e4b35df768b1aeaae7ca0e (commit)
- Log -----------------------------------------------------------------
commit b185f2281d0e8767db4c1270280ec160b9fa097b
Author: Jan Stancek <jst...@re...>
Date:   Thu Nov 14 10:05:51 2013 +0100
    add test for tst_checkpoint_signal_child timing out
    
    This is simple test for patch which adds timeout to
    tst_checkpoint_signal_child().
    
    The test is expected to end with:
    
      Failed to open fifo 'tst_checkpoint_fifo' at
      tst_checkpoint_no_child.c:43: errno=ETIMEDOUT(110): Connection timed out
    
    Signed-off-by: Jan Stancek <jst...@re...>
    Signed-off-by: Cyril Hrubis <ch...@su...>
commit cb80f404615db93b9486c88de186dcb729133727
Author: Stanislav Kholmanskikh <sta...@or...>
Date:   Thu Nov 14 10:37:57 2013 +0400
    tst_checkpoint_signal_child: implemented timeout
    
    If a child exits before opening TST_CHECKPOINT_FIFO
    for reading, tst_checkpoint_signal_child() issued from the parent
    will block forever.
    
    To handle such situations added timeout logic to tst_checkpoint_signal_child();
    
    Signed-off-by: Stanislav Kholmanskikh <sta...@or...>
    Reviewed-by: Jan Stancek <jst...@re...>
    Acked-by: Cyril Hrubis <ch...@su...>
commit 7b20026fd2d8766735b2adf78fe76ad1fc19b56a
Author: Cyril Hrubis <ch...@su...>
Date:   Thu Nov 14 14:38:26 2013 +0100
    lib: tst_res: Add more errnos.
    
    Add all known Linux errnos.
    
    Signed-off-by: Cyril Hrubis <ch...@su...>
-----------------------------------------------------------------------
Summary of changes:
 .gitignore                                         |    1 +
 lib/errnos.h                                       |  171 ++++++++++++++++++++
 ...int_child_exits.c => tst_checkpoint_no_child.c} |   30 +---
 lib/tst_checkpoint.c                               |   36 ++++-
 lib/tst_res.c                                      |   84 +++--------
 5 files changed, 236 insertions(+), 86 deletions(-)
 create mode 100644 lib/errnos.h
 copy lib/tests/{tst_checkpoint_child_exits.c => tst_checkpoint_no_child.c} (74%)
 
diff --git a/.gitignore b/.gitignore
index 140f5f4..5f7f200 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,6 +55,7 @@ logfile.*
 /lib/tests/tst_tmpdir_test
 /lib/tests/tst_checkpoint_child
 /lib/tests/tst_checkpoint_child_exits
+/lib/tests/tst_checkpoint_no_child
 /lib/tests/tst_checkpoint_parent
 /lib/tests/tst_checkpoint_parent_exits
 /lib/tests/tst_process_state
diff --git a/lib/errnos.h b/lib/errnos.h
new file mode 100644
index 0000000..797aed4
--- /dev/null
+++ b/lib/errnos.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2009-2013 Cyril Hrubis <ch...@su...>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Further, this software is distributed without any warranty that it is
+ * free of the rightful claim of any third person regarding infringement
+ * or the like.  Any license provided herein, whether implied or
+ * otherwise, applies only to this software file.  Patent licenses, if
+ * any, provided herein do not apply to combinations of this program with
+ * other software, or any other product whatsoever.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+ * Mountain View, CA  94043, or:
+ */
+
+static const char *strerrnodef(int err)
+{
+	struct pair errno_pairs[] = {
+		/* asm-generic/errno-base.h */
+		PAIR(EPERM)
+		PAIR(ENOENT)
+		PAIR(ESRCH)
+		PAIR(EINTR)
+		PAIR(EIO)
+		PAIR(ENXIO)
+		PAIR(E2BIG)
+		PAIR(ENOEXEC)
+		PAIR(EBADF)
+		PAIR(ECHILD)
+		PAIR(EAGAIN)
+		PAIR(ENOMEM)
+		PAIR(EACCES)
+		PAIR(EFAULT)
+		PAIR(ENOTBLK)
+		PAIR(EBUSY)
+		PAIR(EEXIST)
+		PAIR(EXDEV)
+		PAIR(ENODEV)
+		PAIR(ENOTDIR)
+		PAIR(EISDIR)
+		PAIR(EINVAL)
+		PAIR(ENFILE)
+		PAIR(EMFILE)
+		PAIR(ENOTTY)
+		PAIR(ETXTBSY)
+		PAIR(EFBIG)
+		PAIR(ENOSPC)
+		PAIR(ESPIPE)
+		PAIR(EROFS)
+		PAIR(EMLINK)
+		PAIR(EPIPE)
+		PAIR(EDOM)
+		PAIR(ERANGE)
+		/* asm-generic/errno.h */
+		PAIR(EDEADLK)
+		PAIR(ENAMETOOLONG)
+		PAIR(ENOLCK)
+		PAIR(ENOSYS)
+		PAIR(ENOTEMPTY)
+		PAIR(ELOOP)
+		/* EWOULDBLOCK == EAGAIN skipped */
+		PAIR(ENOMSG)
+		PAIR(EIDRM)
+		PAIR(ECHRNG)
+		PAIR(EL2NSYNC)
+		PAIR(EL3HLT)
+		PAIR(EL3RST)
+		PAIR(ELNRNG)
+		PAIR(EUNATCH)
+		PAIR(ENOCSI)
+		PAIR(EL2HLT)
+		PAIR(EBADE)
+		PAIR(EBADR)
+		PAIR(EXFULL)
+		PAIR(ENOANO)
+		PAIR(EBADRQC)
+		PAIR(EBADSLT)
+		/* EDEADLOCK == EDEADLK skipped */
+		PAIR(EBFONT)
+		PAIR(ENOSTR)
+		PAIR(ENODATA)
+		PAIR(ETIME)
+		PAIR(ENOSR)
+		PAIR(ENONET)
+		PAIR(ENOPKG)
+		PAIR(EREMOTE)
+		PAIR(ENOLINK)
+		PAIR(EADV)
+		PAIR(ESRMNT)
+		PAIR(ECOMM)
+		PAIR(EPROTO)
+		PAIR(EMULTIHOP)
+		PAIR(EDOTDOT)
+		PAIR(EBADMSG)
+		PAIR(EOVERFLOW)
+		PAIR(ENOTUNIQ)
+		PAIR(EBADFD)
+		PAIR(EREMCHG)
+		PAIR(ELIBACC)
+		PAIR(ELIBBAD)
+		PAIR(ELIBSCN)
+		PAIR(ELIBMAX)
+		PAIR(ELIBEXEC)
+		PAIR(EILSEQ)
+		PAIR(ERESTART)
+		PAIR(ESTRPIPE)
+		PAIR(EUSERS)
+		PAIR(ENOTSOCK)
+		PAIR(EDESTADDRREQ)
+		PAIR(EMSGSIZE)
+		PAIR(EPROTOTYPE)
+		PAIR(ENOPROTOOPT)
+		PAIR(EPROTONOSUPPORT)
+		PAIR(ESOCKTNOSUPPORT)
+		PAIR(EOPNOTSUPP)
+		PAIR(EPFNOSUPPORT)
+		PAIR(EAFNOSUPPORT)
+		PAIR(EADDRINUSE)
+		PAIR(EADDRNOTAVAIL)
+		PAIR(ENETDOWN)
+		PAIR(ENETUNREACH)
+		PAIR(ENETRESET)
+		PAIR(ECONNABORTED)
+		PAIR(ECONNRESET)
+		PAIR(ENOBUFS)
+		PAIR(EISCONN)
+		PAIR(ENOTCONN)
+		PAIR(ESHUTDOWN)
+		PAIR(ETOOMANYREFS)
+		PAIR(ETIMEDOUT)
+		PAIR(ECONNREFUSED)
+		PAIR(EHOSTDOWN)
+		PAIR(EHOSTUNREACH)
+		PAIR(EALREADY)
+		PAIR(EINPROGRESS)
+		PAIR(ESTALE)
+		PAIR(EUCLEAN)
+		PAIR(ENOTNAM)
+		PAIR(ENAVAIL)
+		PAIR(EISNAM)
+		PAIR(EREMOTEIO)
+		PAIR(EDQUOT)
+		PAIR(ENOMEDIUM)
+		PAIR(EMEDIUMTYPE)
+		PAIR(ECANCELED)
+		PAIR(ENOKEY)
+		PAIR(EKEYEXPIRED)
+		PAIR(EKEYREVOKED)
+		PAIR(EKEYREJECTED)
+		PAIR(EOWNERDEAD)
+		PAIR(ENOTRECOVERABLE)
+		PAIR(ERFKILL)
+#ifdef EHWPOISON
+		PAIR(EHWPOISON)
+#endif
+	};
+
+	PAIR_LOOKUP(errno_pairs, err);
+}
diff --git a/lib/tests/tst_checkpoint_child_exits.c b/lib/tests/tst_checkpoint_no_child.c
similarity index 74%
copy from lib/tests/tst_checkpoint_child_exits.c
copy to lib/tests/tst_checkpoint_no_child.c
index 3488ba2..fcf2745 100644
--- a/lib/tests/tst_checkpoint_child_exits.c
+++ b/lib/tests/tst_checkpoint_no_child.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Cyril Hrubis <ch...@su...>
+ * Copyright (C) 2013 Linux Test Project
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -25,35 +25,23 @@
 
 #include "test.h"
 
-char *TCID = "tst_checkpoint_child_exits";
+char *TCID = "tst_checkpoint_no_child";
 int TST_TOTAL = 1;
 
+static void cleanup(void)
+{
+	tst_rmdir();
+}
+
 int main(void)
 {
-	int pid;
 	struct tst_checkpoint checkpoint;
 
 	tst_tmpdir();
 
 	TST_CHECKPOINT_INIT(&checkpoint);
+	TST_CHECKPOINT_SIGNAL_CHILD(cleanup, &checkpoint);
+	fprintf(stderr, "Parent: checkpoint reached\n");
 
-	pid = fork();
-
-	switch (pid) {
-	case -1:
-		tst_brkm(TBROK | TERRNO, NULL, "Fork failed");
-	break;
-	case 0:
-		fprintf(stderr, "Child: exiting without signaling\n");
-		exit(0);
-	break;
-	default:
-		TST_CHECKPOINT_PARENT_WAIT(NULL, &checkpoint);
-		fprintf(stderr, "Parent: checkpoint reached\n");
-	break;
-	}
-		
-	wait(NULL);
-	tst_rmdir();
 	return 0;
 }
diff --git a/lib/tst_checkpoint.c b/lib/tst_checkpoint.c
index 56c86b5..a581c36 100644
--- a/lib/tst_checkpoint.c
+++ b/lib/tst_checkpoint.c
@@ -33,6 +33,40 @@
 
 #include "tst_checkpoint.h"
 
+/*
+ * Issue open() on 'path' fifo with O_WRONLY flag and wait for
+ * a reader up to 'timeout' ms.
+ *
+ * Returns:
+ *   >= 0 - file descriptor
+ *   -1  - an error has occurred (errno is set accordingly)
+ *
+ */
+int open_wronly_timed(const char *path, unsigned int timeout)
+{
+	int fd;
+	int i;
+	int interval = 1; /* how often issue open(O_NONBLOCK), in ms */
+
+	for (i = 0; i < timeout; i += interval) {
+		fd = open(path, O_WRONLY | O_NONBLOCK);
+		if (fd < 0) {
+			if ((errno == ENXIO) || (errno == EINTR)) {
+				usleep(interval * 1000);
+
+				continue;
+			}
+
+			return -1;
+		}
+
+		return fd;
+	}
+
+	errno = ETIMEDOUT;
+	return -1;
+}
+
 void tst_checkpoint_init(const char *file, const int lineno,
                          struct tst_checkpoint *self)
 {
@@ -195,7 +229,7 @@ void tst_checkpoint_signal_child(const char *file, const int lineno,
 {
 	int ret, fd;
 	
-	fd = open(TST_CHECKPOINT_FIFO, O_WRONLY);
+	fd = open_wronly_timed(TST_CHECKPOINT_FIFO, self->timeout);
 
 	if (fd < 0) {
 		tst_brkm(TBROK | TERRNO, cleanup_fn,
diff --git a/lib/tst_res.c b/lib/tst_res.c
index f73022b..a24982e 100644
--- a/lib/tst_res.c
+++ b/lib/tst_res.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- * Copyright (c) 2009, 2012 Cyril Hrubis <ch...@su...>
+ * Copyright (c) 2009-2013 Cyril Hrubis <ch...@su...>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -176,21 +176,21 @@ int tst_count = 0;		/* current count of test cases executed; NOTE: */
  */
 extern char *TCID;		/* Test case identifier from the test source */
 extern int TST_TOTAL;		/* Total number of test cases from the test */
-			/* source */
+
 
 struct pair {
 	const char *name;
 	int val;
 };
-#define PAIR(def) [def] = { .name = #def, .val = def, },
-const char *pair_lookup(struct pair *pair, int pair_size, int idx)
-{
-	if (idx < 0 || idx >= pair_size || pair[idx].name == NULL)
-		return "???";
-	return pair[idx].name;
-}
 
-#define pair_lookup(pair, idx) pair_lookup(pair, ARRAY_SIZE(pair), idx)
+#define PAIR(def) [def] = {.name = #def, .val = def},
+
+#define PAIR_LOOKUP(pair_arr, idx) do {               \
+	if (idx < 0 || idx >= ARRAY_SIZE(pair_arr) || \
+	    pair_arr[idx].name == NULL)               \
+		return "???";                         \
+	return pair_arr[idx].name;                    \
+} while (0)
 
 /*
  * strttype() - convert a type result to the human readable string
@@ -199,65 +199,21 @@ const char *strttype(int ttype)
 {
 	struct pair ttype_pairs[] = {
 		PAIR(TPASS)
-		    PAIR(TFAIL)
-		    PAIR(TBROK)
-		    PAIR(TRETR)
-		    PAIR(TCONF)
-		    PAIR(TWARN)
-		    PAIR(TINFO)
+		PAIR(TFAIL)
+		PAIR(TBROK)
+		PAIR(TRETR)
+		PAIR(TCONF)
+		PAIR(TWARN)
+		PAIR(TINFO)
 	};
-	return pair_lookup(ttype_pairs, TTYPE_RESULT(ttype));
+
+	PAIR_LOOKUP(ttype_pairs, TTYPE_RESULT(ttype));
 }
 
 /*
- * strerrnodef() - convert an errno value to its C define
+ * Include table of errnos and strerrnodef() function.
  */
-static const char *strerrnodef(int err)
-{
-	struct pair errno_pairs[] = {
-		PAIR(EPERM)
-		    PAIR(ENOENT)
-		    PAIR(ESRCH)
-		    PAIR(EINTR)
-		    PAIR(EIO)
-		    PAIR(ENXIO)
-		    PAIR(E2BIG)
-		    PAIR(ENOEXEC)
-		    PAIR(EBADF)
-		    PAIR(ECHILD)
-		    PAIR(EAGAIN)
-		    PAIR(ENOMEM)
-		    PAIR(EACCES)
-		    PAIR(EFAULT)
-		    PAIR(ENOTBLK)
-		    PAIR(EBUSY)
-		    PAIR(EEXIST)
-		    PAIR(EXDEV)
-		    PAIR(ENODEV)
-		    PAIR(ENOTDIR)
-		    PAIR(EISDIR)
-		    PAIR(EINVAL)
-		    PAIR(ENFILE)
-		    PAIR(EMFILE)
-		    PAIR(ENOTTY)
-		    PAIR(ETXTBSY)
-		    PAIR(EFBIG)
-		    PAIR(ENOSPC)
-		    PAIR(ESPIPE)
-		    PAIR(EROFS)
-		    PAIR(EMLINK)
-		    PAIR(EPIPE)
-		    PAIR(EDOM)
-		    PAIR(ERANGE)
-		    PAIR(EDEADLK)
-		    PAIR(ENAMETOOLONG)
-		    PAIR(ENOLCK)
-		    PAIR(ENOSYS)
-		    PAIR(ENOTEMPTY)
-		    PAIR(ELOOP)
-	};
-	return pair_lookup(errno_pairs, err);
-}
+#include "errnos.h"
 
 /*
  * tst_res() - Main result reporting function.  Handle test information
hooks/post-receive
-- 
ltp
 |