Index: testsuites/sptests/spfifo03/init.c
===================================================================
--- testsuites/sptests/spfifo03/init.c	(revision 7d1a2437191d0f74f0ba442ad881dc23a8e9fd2f)
+++ testsuites/sptests/spfifo03/init.c	(revision 287febb50397f321d5a38f8d7df668833c192125)
@@ -1,5 +1,15 @@
-/*
- *  COPYRIGHT (c) 2010
- *  Bharath Suri<bharath.s.jois@gmail.com>.
+/*  Init
+ *
+ *  This routine is the initialization task for this test program.
+ *  It is a user initialization task and has the responsibility
+ *  of invoking the test routine
+ *
+ *  Input parameters:
+ *    not_used
+ *
+ *  Output parameters:  NONE
+ *
+ *  COPYRIGHT (c) 1989-1999.
+ *  On-Line Applications Research Corporation (OAR).
  *
  *  The license and distribution terms for this file may be
@@ -23,46 +33,167 @@
 #include <rtems/libio.h>
 
-
-void test_main(void)
+#define SEND_RCV_BUFSIZ 12
+rtems_id Barrier;
+
+rtems_task read_task(rtems_task_argument not_used)
 {
-
+  int fd = 0;
+  int status = -1;
+
+  char recvBuf_r1[SEND_RCV_BUFSIZ] = {0};
+  char recvBuf_r2[SEND_RCV_BUFSIZ] = {0};
+
+  puts("\nRead task activated, waiting till writer opens");
+
+  status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  sleep(1);
+
+  puts("\nNow, reader opening file(1)");  
+  fd = open("/tmp/fifo01", O_RDONLY);
+  if(fd <= 0) {
+    printf("Error opening file: (%d) :: %s", errno, strerror(errno));
+    rtems_test_assert(0);
+  }
+
+  status = read(fd, recvBuf_r1, sizeof(recvBuf_r1)-1);
+  rtems_test_assert(status == sizeof(recvBuf_r1)-1);
+
+  printf("\n@ receiver (being a unblocked reader): Got %s", recvBuf_r1);
+
+  status = close(fd);
+  rtems_test_assert(status == 0);
+
+  status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+  
+  puts("\nReader opening file(2)");
+  fd = open("/tmp/fifo01", O_RDONLY);
+  if(fd <= 0) {
+    printf("Error opening file: (%d) :: %s", errno, strerror(errno));
+    rtems_test_assert(0);
+  }
+
+  status = read(fd, recvBuf_r2, sizeof(recvBuf_r2)-1);
+  rtems_test_assert(status == sizeof(recvBuf_r2)-1);
+
+  printf("\n@ receiver (being a blocked reader): Got %s", recvBuf_r2);
+
+  status = close(fd);
+  rtems_test_assert(status == 0);
+  
+  
+  puts("\nReader done!");
+  status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+  rtems_task_delete( RTEMS_SELF );
+}
+
+
+void test_main(void) //Also acts as the write task
+{
+
+  rtems_id readTaskID;
+
+  rtems_name readTaskName;
+
+  char sendBuf_r1[SEND_RCV_BUFSIZ] = {0};
+  char sendBuf_r2[SEND_RCV_BUFSIZ] = {0};
   int status = -1;
   int fd = 0;
 
-  puts("\n\n*** FIFO / PIPE OPEN TEST - 3 ***");
-  puts(
-"\n\nConfiguration: Pipes configured, \
-but number of barriers configured = 1\n\
-Required number of barriers = 2"
-       );
-
-  puts("\n\nCreating directory /tmp");
+
+  strcpy( sendBuf_r1, "SendBuffer1" );
+  strcpy( sendBuf_r2, "SendBuffer2" );
+
+  memset( &Barrier, 0, sizeof(Barrier) );
+  status = rtems_barrier_create (
+    rtems_build_name ( 'B', 'A', 'R', 't' ),
+    RTEMS_BARRIER_AUTOMATIC_RELEASE,
+    2,
+    &Barrier
+    );
+
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  puts("\n\n*** FIFO / PIPE OPEN TEST - 6 ***");
+
+  puts("\nCreating a task name and a task");
+  readTaskName = rtems_build_name('T','A','r',' ');
+
+  status = rtems_task_create(
+			     readTaskName,
+			     1,
+			     RTEMS_MINIMUM_STACK_SIZE * 2,
+			     RTEMS_INTERRUPT_LEVEL(31),
+			     RTEMS_DEFAULT_ATTRIBUTES,
+			     &readTaskID
+			     );
+  
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  puts("\ncreating directory /tmp");
   status = mkdir("/tmp", 0777);
   rtems_test_assert(status == 0);
 
-  puts("\n\nCreating fifo /tmp/fifo");
+  puts("\ncreating fifo file /tmp/fifo01");
   status = mkfifo("/tmp/fifo01", 0777);
   rtems_test_assert(status == 0);
 
-  puts("\n\nAttempt to open the fifo file\n");
-  puts(
-"Must result in failure since \n\
-number of barriers = 1 => not all resources\n\
-were acquired"
-       );
-
-  fd = open("/tmp/fifo01", O_RDONLY);
-  rtems_test_assert(fd == -1);
-  rtems_test_assert(errno == EINTR); // Should this
-                                     // be ENOMEM?
-  puts("\n\nRemove the entry /tmp/fifo01");
+  puts("\nStarting the read task");
+  status = rtems_task_start(readTaskID, read_task, 0);
+  rtems_test_assert(status == 0);
+
+  status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  puts("\nWriter opening file(1)");
+  fd = open("/tmp/fifo01", O_WRONLY);
+  if(fd <= 0) {
+    printf("Error opening file: (%d) :: %s", errno, strerror(errno));
+    rtems_test_assert(0);
+  }
+
+  
+  printf("\n@ sender: %s", sendBuf_r1);
+  status = write(fd, sendBuf_r1, sizeof(sendBuf_r1)-1);
+  rtems_test_assert(status == sizeof(sendBuf_r1)-1);
+
+  status = close(fd);
+  rtems_test_assert(status == 0);
+  
+  status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  sleep(1);
+
+  // Reader would have blocked by now
+  puts("\nWriter opening file(2)");
+  fd = open("/tmp/fifo01", O_WRONLY);
+  if(fd <= 0) {
+    printf("Error opening file: (%d) :: %s", errno, strerror(errno));
+    rtems_test_assert(0);
+  }
+
+  printf("\n@ sender: %s", sendBuf_r2);
+  status = write(fd, sendBuf_r2, sizeof(sendBuf_r2)-1);
+  rtems_test_assert(status == sizeof(sendBuf_r2)-1);
+
+  status = close(fd);
+  rtems_test_assert(status == 0);
+
+  status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  puts( "Removing the fifo" );
   status = unlink("/tmp/fifo01");
   rtems_test_assert(status == 0);
-
-  puts("\n\nRemove directory /tmp");
+  
+  puts( "Removing /tmp" );
   status = rmdir("/tmp");
   rtems_test_assert(status == 0);
-
-  puts("\n\n*** END OF FIFO / PIPE OPEN TEST - 3 ***");
+  
+  puts("\n*** END OF FIFO / PIPE OPEN TEST - 6 ***");
 }
 
@@ -81,11 +212,16 @@
 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 6
 
-#define CONFIGURE_MAXIMUM_TASKS 1
+#define CONFIGURE_MAXIMUM_TASKS 3
 
 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
-#define CONFIGURE_PIPES_ENABLED
-#define CONFIGURE_MAXIMUM_PIPES 1
+
+#define CONFIGURE_MAXIMUM_BARRIERS 1
+
 #define CONFIGURE_INIT
-
+#define CONFIGURE_FIFOS_ENABLED
+#define CONFIGURE_MAXIMUM_FIFOS 1
+
+
+#define CONFIGURE_INIT
 #include <rtems/confdefs.h>
 
