diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-07-30 00:29:11 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-07-30 00:29:11 +0000 |
commit | d5b792fdafc619122a2e5cae2e5918cc451ff84a (patch) | |
tree | dff6e171ddbfd6667a9308bb8099b12391b68fe2 /nuttx/examples/pipe/pipe_main.c | |
parent | 18161f32055969218532f2174e577e4b888b29f1 (diff) | |
download | px4-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.c | 193 |
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; } |