summaryrefslogtreecommitdiff
path: root/nuttx/examples/pipe/pipe_main.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-07-30 00:29:11 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-07-30 00:29:11 +0000
commitd5b792fdafc619122a2e5cae2e5918cc451ff84a (patch)
treedff6e171ddbfd6667a9308bb8099b12391b68fe2 /nuttx/examples/pipe/pipe_main.c
parent18161f32055969218532f2174e577e4b888b29f1 (diff)
downloadpx4-nuttx-d5b792fdafc619122a2e5cae2e5918cc451ff84a.tar.gz
px4-nuttx-d5b792fdafc619122a2e5cae2e5918cc451ff84a.tar.bz2
px4-nuttx-d5b792fdafc619122a2e5cae2e5918cc451ff84a.zip
Added redirection test
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@790 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/examples/pipe/pipe_main.c')
-rw-r--r--nuttx/examples/pipe/pipe_main.c193
1 files changed, 39 insertions, 154 deletions
diff --git a/nuttx/examples/pipe/pipe_main.c b/nuttx/examples/pipe/pipe_main.c
index d6764c247..46b44390c 100644
--- a/nuttx/examples/pipe/pipe_main.c
+++ b/nuttx/examples/pipe/pipe_main.c
@@ -44,6 +44,7 @@
#include <stdio.h>
#include <unistd.h>
+#include <sched.h>
#include <fcntl.h>
#include <errno.h>
@@ -66,151 +67,6 @@
****************************************************************************/
/****************************************************************************
- * Name: null_writer
- ****************************************************************************/
-
-static void *null_writer(pthread_addr_t pvarg)
-{
- int fd;
-
- /* Wait a bit */
-
- printf("null_writer: started -- sleeping\n");
- sleep(5);
-
- /* Then open the FIFO for write access */
-
- printf("null_writer: Opening FIFO for write access\n");
- fd = open(FIFO_PATH2, O_WRONLY);
- if (fd < 0)
- {
- fprintf(stderr, "null_writer: Failed to open FIFO %s for writing, errno=%d\n",
- FIFO_PATH2, errno);
- return (void*)1;
- }
-
- /* Wait a bit more */
-
- printf("null_writer: Opened %s for writing -- sleeping\n", FIFO_PATH2);
- sleep(5);
-
- /* Then close the FIFO */
-
- printf("null_writer: Closing %s\n", FIFO_PATH2);
- close(fd);
- sleep(5);
-
- printf("null_writer: Returning success\n");
- return (void*)0;
-}
-
-/****************************************************************************
- * Name: interlock_test
- ****************************************************************************/
-
-static int interlock_test(void)
-{
- pthread_t writerid;
- void *value;
- char data[16];
- ssize_t nbytes;
- int fd;
- int ret;
-
- /* Create a FIFO */
-
- ret = mkfifo(FIFO_PATH2, 0666);
- if (ret < 0)
- {
- fprintf(stderr, "interlock_test: mkfifo failed with errno=%d\n", errno);
- return 1;
- }
-
- /* Start the null_writer_thread */
-
- printf("interlock_test: Starting null_writer thread\n");
- ret = pthread_create(&writerid, NULL, null_writer, (pthread_addr_t)NULL);
- if (ret != 0)
- {
- fprintf(stderr, "interlock_test: Failed to create null_writer thread, error=%d\n", ret);
- ret = 2;
- goto errout_with_fifo;
- }
-
- /* Open one end of the FIFO for reading. This open call should block until the
- * null_writer thread opens the other end of the FIFO for writing.
- */
-
- printf("interlock_test: Opening FIFO for read access\n");
- fd = open(FIFO_PATH2, O_RDONLY);
- if (fd < 0)
- {
- fprintf(stderr, "interlock_test: Failed to open FIFO %s for reading, errno=%d\n",
- FIFO_PATH2, errno);
- ret = 3;
- goto errout_with_thread;
- }
-
- /* Attempt to read one byte from the FIFO. This should return end-of-file because
- * the null_writer closes the FIFO without writing anything.
- */
-
- printf("interlock_test: Reading from %s\n", FIFO_PATH2);
- nbytes = read(fd, data, 16);
- if (nbytes < 0 )
- {
- fprintf(stderr, "interlock_test: read failed, errno=%d\n", errno);
- ret = 4;
- goto errout_with_file;
- }
- else if (ret != 0)
- {
- fprintf(stderr, "interlock_test: Read %d bytes of data -- aborting: %d\n", nbytes);
- ret = 5;
- goto errout_with_file;
- }
-
- /* Close the file */
-
- printf("interlock_test: Closing %s\n", FIFO_PATH2);
- close(fd);
-
- /* Wait for null_writer thread to complete */
-
- printf("interlock_test: Waiting for null_writer thread\n");
- ret = pthread_join(writerid, &value);
- if (ret != 0)
- {
- fprintf(stderr, "interlock_test: pthread_join failed, error=%d\n", ret);
- ret = 6;
- goto errout_with_fifo;
- }
- else
- {
- printf("interlock_test: writer returned %d\n", (int)value);
- if (value != (void*)0)
- {
- ret = 7;
- goto errout_with_fifo;
- }
- }
-
- /* unlink(FIFO_PATH2); */
- printf("interlock_test: Returning success\n");
- return 0;
-
-errout_with_file:
- close(fd);
-errout_with_thread:
- pthread_detach(writerid);
- pthread_cancel(writerid);
-errout_with_fifo:
- /* unlink(FIFO_PATH2); */
- printf("interlock_test: Returning %d\n", ret);
- return ret;
-}
-
-/****************************************************************************
* Public Functions
****************************************************************************/
@@ -233,7 +89,7 @@ int user_start(int argc, char *argv[])
/* Test FIFO logic */
- printf("user_start: Performing FIFO test\n");
+ printf("\nuser_start: Performing FIFO test\n");
ret = mkfifo(FIFO_PATH1, 0666);
if (ret < 0)
{
@@ -260,16 +116,26 @@ int user_start(int argc, char *argv[])
{
fprintf(stderr, "user_start: Failed to open FIFO %s for reading, errno=%d\n",
FIFO_PATH1, errno);
- close(filedes[1]);
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
return 3;
}
/* Then perform the test using those file descriptors */
ret = transfer_test(filedes[0], filedes[1]);
- close(filedes[0]);
- close(filedes[1]);
+ if (close(filedes[0]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
/* unlink(FIFO_PATH1); fails */
+
if (ret != 0)
{
fprintf(stderr, "user_start: FIFO test FAILED (%d)\n", ret);
@@ -279,7 +145,7 @@ int user_start(int argc, char *argv[])
/* Test PIPE logic */
- printf("user_start: Performing pipe test\n");
+ printf("\nuser_start: Performing pipe test\n");
ret = pipe(filedes);
if (ret < 0)
{
@@ -290,9 +156,15 @@ int user_start(int argc, char *argv[])
/* Then perform the test using those file descriptors */
ret = transfer_test(filedes[0], filedes[1]);
- close(filedes[0]);
- close(filedes[1]);
- /* unlink(FIFO_PATH1); fails */
+ if (close(filedes[0]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+
if (ret != 0)
{
fprintf(stderr, "user_start: PIPE test FAILED (%d)\n", ret);
@@ -300,7 +172,9 @@ int user_start(int argc, char *argv[])
}
printf("user_start: PIPE test PASSED\n");
- /* Then perform the FIFO interlock test */
+ /* Perform the FIFO interlock test */
+
+ printf("\nuser_start: Performing pipe interlock test\n");
ret = interlock_test();
if (ret != 0)
{
@@ -309,6 +183,17 @@ int user_start(int argc, char *argv[])
}
printf("user_start: PIPE interlock test PASSED\n");
+ /* Perform the pipe redirection test */
+
+ printf("\nuser_start: Performing redirection test\n");
+ ret = redirection_test();
+ if (ret != 0)
+ {
+ fprintf(stderr, "user_start: FIFO redirection test FAILED (%d)\n", ret);
+ return 7;
+ }
+ printf("user_start: PIPE redirection test PASSED\n");
+
fflush(stdout);
return 0;
}