Index: c/src/tests/psxtests/psxmsgq01/init.c
===================================================================
--- c/src/tests/psxtests/psxmsgq01/init.c	(revision b302d527c76e9b3442b396d7413a2e5d24877546)
+++ c/src/tests/psxtests/psxmsgq01/init.c	(revision 99e7ab890be886ba48430f3de41ef72b7cc4f54d)
@@ -36,4 +36,12 @@
 }
 
+typedef enum {
+  DEFAULT_SIZE_TYPE,
+  TEST_SIZE_TYPE,
+  MAX_SIZE,
+  TYPES_OF_TEST_SIZES
+} TEST_MQ_SIZE_TYPES;
+
+
 /*
  * Opens CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES then leaves size queues
@@ -66,5 +74,5 @@
   attr.mq_maxmsg = -1;
   puts( "mq_open - Create with maxmsg (-1) (EINVAL)" );
-  n_mq2 = mq_open("mq2", O_CREAT, O_RDONLY, &attr);
+  n_mq2 = mq_open("mq2", O_CREAT | O_RDONLY, 0x777, &attr);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -73,12 +81,11 @@
   attr.mq_msgsize = -1;
   puts( "mq_open - Create with msgsize (-1) (EINVAL)" );
-  n_mq2 = mq_open("mq2", O_CREAT, O_RDONLY, &attr);
+  n_mq2 = mq_open("mq2", O_CREAT | O_RDONLY, 0x777, &attr);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
   fatal_directive_status( errno, EINVAL,  "mq_open errno EINVAL"); 
 
-
   puts( "mq_open - Open new mq without create flag (ENOENT)" );
-  n_mq2 = mq_open("mq3", O_EXCL, O_RDONLY, NULL);
+  n_mq2 = mq_open("mq3", O_EXCL | O_RDONLY, 0x777, NULL);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -95,5 +102,5 @@
 
   puts( "mq_open - Open with too long of a name (ENAMETOOLONG)" );
-  n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT, O_RDONLY, NULL );
+  n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT | O_RDONLY, 0x777, NULL );
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -106,5 +113,5 @@
   puts( "mq_open - SUCCESSFUL" );
   for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES; i++) {
-    mqs[i] = mq_open( Get_Queue_Name(i), O_CREAT, O_RDONLY, NULL );
+    mqs[i] = mq_open( Get_Queue_Name(i), O_CREAT | O_RDWR, 0x777, NULL );
     assert( mqs[i] != (-1) );
     /*XXX - Isn't there a more general check */ 
@@ -126,5 +133,5 @@
    * XXX EACCES - queue exists permissions specified by o_flag are denied.
   puts( "mq_open - open mq as write (EACCES)" );
-  n_mq2 = mq_open("mq1", O_CREAT, O_WRONLY, NULL);
+  n_mq2 = mq_open("mq1", O_CREAT | O_WRONLY, 0x777, NULL);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -133,5 +140,5 @@
 
   puts( "mq_open - Create an Existing mq (EEXIST)" );
-  n_mq2 = mq_open("mq1", O_CREAT | O_EXCL, O_RDONLY, NULL);
+  n_mq2 = mq_open("mq1", O_CREAT | O_EXCL | O_RDONLY, 0x777, NULL);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -144,5 +151,5 @@
 
   puts( "mq_open - system is out of resources (ENFILE)" );
-  n_mq2 = mq_open( Get_Queue_Name(i), O_CREAT, O_RDONLY, NULL );
+  n_mq2 = mq_open( Get_Queue_Name(i), O_CREAT | O_RDONLY, 0x777, NULL );
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -165,6 +172,6 @@
 
 void validate_mq_unlink_error_codes(
-  mqd_t   *mqs,      /* Must be large enough for Maximum to be opened. */
-  int      size      /* Number still open */
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
 )
 {
@@ -178,12 +185,10 @@
    * XXX ENAMETOOLONG - Not checked in either sem_unlink or mq_unlink is
    *                    this an error? 
-  for ( i=0; i< PATH_MAX+1; i++ )
-    name[i] = 'N';
-  puts( "mq_open - Open with too long of a name (ENAMETOOLONG)" );
-  n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT, O_RDONLY, NULL );
-  fatal_directive_status( 
-    (int) n_mq2, (int ) (-1), "mq_open error return status" );
-  fatal_directive_status( errno, ENAMETOOLONG,  "mq_open errno ENAMETOOLONG"); 
-  */
+   */
+
+  puts( "mq_unlink - mq_unlink with too long of a name (ENAMETOOLONG)" );
+  status = mq_unlink( Get_Too_Long_Name() );
+  fatal_directive_status( status, -1, "mq_unlink error return status");
+  fatal_directive_status( errno, ENAMETOOLONG, "mq_unlink errno ENAMETOOLONG");
   
   puts( "mq_unlink - UNSUCCESSFUL (ENOENT)" );
@@ -191,9 +196,23 @@
   fatal_directive_status( status, -1, "mq_unlink error return status");
   fatal_directive_status( errno, ENOENT, "mq_unlink errno ENOENT");
+
+  /*
+   * XXX - These errors are not in the POSIX manual but may occur.
+   */
+
+  puts( "mq_unlink (NULL) - EINVAL" );
+  status = mq_unlink( NULL );
+  fatal_directive_status( status, -1, "mq_unlink error return status");
+  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
+
+  puts( "mq_unlink (\"\") - EINVAL" );
+  status = mq_unlink( "" );
+  fatal_directive_status( status, -1, "mq_unlink error return status");
+  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
 }
 
 void validate_mq_close_error_codes(
-  mqd_t   *mqs,      /* Must be large enough for Maximum to be opened. */
-  int      size      /* Number still open */
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
 )
 {
@@ -204,5 +223,165 @@
   fatal_directive_status( status, -1, "mq_close error return status");
   fatal_directive_status( errno, EBADF, "mq_close errno EBADF");
-
+}
+  
+/*
+ * Returns the number of messages queued after the test on the
+ * first queue.
+ */
+
+int validate_mq_send_error_codes( 
+  mqd_t   *mqs,
+  int      size      /* Number still open in mqs */
+)
+{
+  int             status;
+  int             i;
+  mqd_t           n_mq1;
+  struct mq_attr  attr;
+
+  attr.mq_maxmsg  = 3;
+  attr.mq_msgsize = 8;
+
+  /*
+   * XXX - EBADF  Not a valid message descriptor.
+   *       Write to a invalid message descriptor
+   * XXX - Write to a read only queue
+   */
+
+  puts( "mq_send - Closed message queue (EBADF)" );
+  status = mq_send( mqs[size], "", 1, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EBADF, "mq_send errno EBADF");
+
+  puts( "mq_open - Open a read only queue" );
+  n_mq1 = mq_open("read_only", O_CREAT | O_RDONLY, 0x777, &attr);
+  assert( n_mq1 != (-1) );
+  /*XXX - Isn't there a more general check */ 
+
+  puts( "mq_send - Read only message queue (EBADF)" );
+  status = mq_send( n_mq1, "", 1, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EBADF, "mq_send errno EBADF");
+
+  status = mq_close( n_mq1 );
+  fatal_directive_status( status, 0, "mq_close message queue"); 
+
+  status = mq_unlink( "read_only" );
+  fatal_directive_status( status, 0, "mq_unlink message queue"); 
+
+  /*
+   * XXX - EINTR
+   *       Signal interrupted the call.
+
+  puts( "mq_send - UNSUCCESSFUL (EINTR)" );
+  status = mq_send( mqs, "", 0xffff, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, E, "mq_send errno E");
+   */
+
+  /*
+   * XXX - EINVAL priority is out of range.
+   */
+
+  puts( "mq_send - Priority out of range (EINVAL)" );
+  status = mq_send( mqs[0], "", 1, MQ_PRIO_MAX + 1 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EINVAL, "mq_send errno EINVAL");
+
+  /*
+   * XXX - EMSGSIZE - Message size larger than msg_len
+   */
+
+  puts( "mq_send - Message longer than msg_len (EMSGSIZE)" );
+  status = mq_send( mqs[0], "", 0xffff, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EMSGSIZE, "mq_send errno EMSGSIZE");
+
+  /*
+   * ENOSYS - send is supported should never happen.
+   */
+
+
+  /*
+   * XXX - EAGAIN 
+   *       O_NONBLOCK and message queue is full.
+   *       This is validated in the read/write test.
+   */
+
+  i=0;
+  do {
+    status = mq_send( mqs[0], "", 1, 0 );
+    i++;
+  } while (status == 0);
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EAGAIN, "mq_send errno EAGAIN");
+
+  return i-1;
+}
+
+void validate_mq_receive_error_codes( 
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
+)
+{
+  int             status;
+
+  /*
+   * EAGAIN - 
+   */
+
+  /*
+   * EBADF - 
+   */
+
+  /*
+   * EMSGSIZE - 
+   */
+
+  /*
+   * EINTR - 
+   */
+
+  /*
+   * EBADMSG - a data corruption problem.
+   *  XXX - Can not cause.
+   */
+
+  /*
+  puts( "mq_ - UNSUCCESSFUL ()" );
+  status = mq_(  );
+  fatal_directive_status( status, -1, "mq_ error return status");
+  fatal_directive_status( errno, E, "mq_c errno E");
+
+  */
+  /*
+   * ENOSYS - 
+   */
+
+}
+
+void non_blocking_mq_read_write(
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
+)
+{
+  /*
+  int         status;
+  char       *messages[] = {
+    "Msg 1",
+    "Test 2",
+    "12345678901234567890"
+  };
+
+  status = mq_send( mqs[0], messages[0], strlen( messages[0] ), 0 );
+  fatal_directive_status( status, 0, "mq_send error return status" );
+    
+  puts( "mq_send - UNSUCCESSFUL ()" );
+  do {
+    status = mq_send(  );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, E, "mq_send errno E");
+  }
+  */
 }
 
@@ -212,13 +391,12 @@
 {
   int             status;
-  int             value;
-  int             i;
   mqd_t           mqs[CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES];
-  mqd_t           mq2;
   mqd_t           n_mq1;
   mqd_t           n_mq2;
-  struct timespec waittime;
-  char            failure_msg[80];
-  struct mq_attr  attr;
+  char           *messages[] = {
+    "Msg 1",
+    "Test 2",
+    "12345678901234567890"
+  };
 
   puts( "\n\n*** POSIX MESSAGE QUEUE TEST ***" );
@@ -228,4 +406,8 @@
   validate_mq_close_error_codes( mqs, 2 );
 
+  validate_mq_send_error_codes( mqs, 2 );
+  validate_mq_receive_error_codes( mqs, 2 );
+
+
   /*
    * Validate a second open returns the same message queue.
@@ -233,7 +415,7 @@
 
   puts( "mq_open - Open an existing mq ( same id )" );
-  n_mq2 = mq_open("mq1", 0 );
-  fatal_directive_status( 
-    (int) n_mq2, (int ) mqs[0], "mq_open error return status" );
+  n_mq1 = mq_open("mq1", 0 );
+  fatal_directive_status( 
+    (int) n_mq1, (int ) mqs[0], "mq_open error return status" );
   
   /*
@@ -252,42 +434,28 @@
 
   /*
-   * Validate it n_mq2 (the last open for mq1 name can be
-   * correctly closed and unlinked.
-   */
-
-  puts( "Init: mq_unlink - mq1 (2) SUCCESSFUL" );
+   * Validate it "mq1" can be closed and unlinked.
+   */
+
+  puts( "mq_unlink - mq1 SUCCESSFUL" );
   status = mq_unlink( "mq1" );
   fatal_directive_status( status, 0, "mq_unlink locked message queue"); 
 
-  puts( "Init: mq_close (2) - SUCCESSFUL" );
+  puts( "mq_close mq1 - SUCCESSFUL" );
   status = mq_close( n_mq2 );
   fatal_directive_status( status, 0, "mq_close message queue"); 
-
-
-  puts( "Init: mq_unlink - UNSUCCESSFUL (ENOENT)" );
+  status = mq_close( n_mq1 );
+  fatal_directive_status( status, 0, "mq_close message queue"); 
+  status = mq_close( mqs[0] );
+  fatal_directive_status( status, 0, "mq_close message queue"); 
+
+  puts( "mq_unlink - UNSUCCESSFUL (ENOENT)" );
   status = mq_unlink("mq1");
   fatal_directive_status( status, -1, "mq_unlink error return status");
   fatal_directive_status( errno, ENOENT, "mq_close errno EINVAL");
-
-
-  /*
-   * Validate we can unlink (2)
-   */
-
-  puts( "Init: mq_unlink (NULL) - EINVAL" );
-  status = mq_unlink( NULL );
-  fatal_directive_status( status, -1, "mq_unlink error return status");
-  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
-
-  puts( "Init: mq_unlink (\"\") - EINVAL" );
-  status = mq_unlink( "" );
-  fatal_directive_status( status, -1, "mq_unlink error return status");
-  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
 
   /*
    * XXX - Cant' create location OBJECTS_ERROR or OBJECTS_REMOTE.
    *       mq_close and mq_unlink.
-   */
-
+   * XXX - Don't think we need this save until yellow line tested.
   puts( "Init: mq_unlink - UNSUCCESSFUL (ENOENT)" );
   status = mq_unlink("mq3");
@@ -295,5 +463,5 @@
   fatal_directive_status( errno, ENOENT, "mq_unlink errno ENOENT");
   assert( (status == -1) && (errno == ENOENT) );
-
+  */
 
 
@@ -313,2 +481,4 @@
   return NULL; /* just so the compiler thinks we returned something */
 }
+
+
Index: testsuites/psxtests/psxmsgq01/init.c
===================================================================
--- testsuites/psxtests/psxmsgq01/init.c	(revision b302d527c76e9b3442b396d7413a2e5d24877546)
+++ testsuites/psxtests/psxmsgq01/init.c	(revision 99e7ab890be886ba48430f3de41ef72b7cc4f54d)
@@ -36,4 +36,12 @@
 }
 
+typedef enum {
+  DEFAULT_SIZE_TYPE,
+  TEST_SIZE_TYPE,
+  MAX_SIZE,
+  TYPES_OF_TEST_SIZES
+} TEST_MQ_SIZE_TYPES;
+
+
 /*
  * Opens CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES then leaves size queues
@@ -66,5 +74,5 @@
   attr.mq_maxmsg = -1;
   puts( "mq_open - Create with maxmsg (-1) (EINVAL)" );
-  n_mq2 = mq_open("mq2", O_CREAT, O_RDONLY, &attr);
+  n_mq2 = mq_open("mq2", O_CREAT | O_RDONLY, 0x777, &attr);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -73,12 +81,11 @@
   attr.mq_msgsize = -1;
   puts( "mq_open - Create with msgsize (-1) (EINVAL)" );
-  n_mq2 = mq_open("mq2", O_CREAT, O_RDONLY, &attr);
+  n_mq2 = mq_open("mq2", O_CREAT | O_RDONLY, 0x777, &attr);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
   fatal_directive_status( errno, EINVAL,  "mq_open errno EINVAL"); 
 
-
   puts( "mq_open - Open new mq without create flag (ENOENT)" );
-  n_mq2 = mq_open("mq3", O_EXCL, O_RDONLY, NULL);
+  n_mq2 = mq_open("mq3", O_EXCL | O_RDONLY, 0x777, NULL);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -95,5 +102,5 @@
 
   puts( "mq_open - Open with too long of a name (ENAMETOOLONG)" );
-  n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT, O_RDONLY, NULL );
+  n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT | O_RDONLY, 0x777, NULL );
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -106,5 +113,5 @@
   puts( "mq_open - SUCCESSFUL" );
   for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES; i++) {
-    mqs[i] = mq_open( Get_Queue_Name(i), O_CREAT, O_RDONLY, NULL );
+    mqs[i] = mq_open( Get_Queue_Name(i), O_CREAT | O_RDWR, 0x777, NULL );
     assert( mqs[i] != (-1) );
     /*XXX - Isn't there a more general check */ 
@@ -126,5 +133,5 @@
    * XXX EACCES - queue exists permissions specified by o_flag are denied.
   puts( "mq_open - open mq as write (EACCES)" );
-  n_mq2 = mq_open("mq1", O_CREAT, O_WRONLY, NULL);
+  n_mq2 = mq_open("mq1", O_CREAT | O_WRONLY, 0x777, NULL);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -133,5 +140,5 @@
 
   puts( "mq_open - Create an Existing mq (EEXIST)" );
-  n_mq2 = mq_open("mq1", O_CREAT | O_EXCL, O_RDONLY, NULL);
+  n_mq2 = mq_open("mq1", O_CREAT | O_EXCL | O_RDONLY, 0x777, NULL);
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -144,5 +151,5 @@
 
   puts( "mq_open - system is out of resources (ENFILE)" );
-  n_mq2 = mq_open( Get_Queue_Name(i), O_CREAT, O_RDONLY, NULL );
+  n_mq2 = mq_open( Get_Queue_Name(i), O_CREAT | O_RDONLY, 0x777, NULL );
   fatal_directive_status( 
     (int) n_mq2, (int ) (-1), "mq_open error return status" );
@@ -165,6 +172,6 @@
 
 void validate_mq_unlink_error_codes(
-  mqd_t   *mqs,      /* Must be large enough for Maximum to be opened. */
-  int      size      /* Number still open */
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
 )
 {
@@ -178,12 +185,10 @@
    * XXX ENAMETOOLONG - Not checked in either sem_unlink or mq_unlink is
    *                    this an error? 
-  for ( i=0; i< PATH_MAX+1; i++ )
-    name[i] = 'N';
-  puts( "mq_open - Open with too long of a name (ENAMETOOLONG)" );
-  n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT, O_RDONLY, NULL );
-  fatal_directive_status( 
-    (int) n_mq2, (int ) (-1), "mq_open error return status" );
-  fatal_directive_status( errno, ENAMETOOLONG,  "mq_open errno ENAMETOOLONG"); 
-  */
+   */
+
+  puts( "mq_unlink - mq_unlink with too long of a name (ENAMETOOLONG)" );
+  status = mq_unlink( Get_Too_Long_Name() );
+  fatal_directive_status( status, -1, "mq_unlink error return status");
+  fatal_directive_status( errno, ENAMETOOLONG, "mq_unlink errno ENAMETOOLONG");
   
   puts( "mq_unlink - UNSUCCESSFUL (ENOENT)" );
@@ -191,9 +196,23 @@
   fatal_directive_status( status, -1, "mq_unlink error return status");
   fatal_directive_status( errno, ENOENT, "mq_unlink errno ENOENT");
+
+  /*
+   * XXX - These errors are not in the POSIX manual but may occur.
+   */
+
+  puts( "mq_unlink (NULL) - EINVAL" );
+  status = mq_unlink( NULL );
+  fatal_directive_status( status, -1, "mq_unlink error return status");
+  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
+
+  puts( "mq_unlink (\"\") - EINVAL" );
+  status = mq_unlink( "" );
+  fatal_directive_status( status, -1, "mq_unlink error return status");
+  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
 }
 
 void validate_mq_close_error_codes(
-  mqd_t   *mqs,      /* Must be large enough for Maximum to be opened. */
-  int      size      /* Number still open */
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
 )
 {
@@ -204,5 +223,165 @@
   fatal_directive_status( status, -1, "mq_close error return status");
   fatal_directive_status( errno, EBADF, "mq_close errno EBADF");
-
+}
+  
+/*
+ * Returns the number of messages queued after the test on the
+ * first queue.
+ */
+
+int validate_mq_send_error_codes( 
+  mqd_t   *mqs,
+  int      size      /* Number still open in mqs */
+)
+{
+  int             status;
+  int             i;
+  mqd_t           n_mq1;
+  struct mq_attr  attr;
+
+  attr.mq_maxmsg  = 3;
+  attr.mq_msgsize = 8;
+
+  /*
+   * XXX - EBADF  Not a valid message descriptor.
+   *       Write to a invalid message descriptor
+   * XXX - Write to a read only queue
+   */
+
+  puts( "mq_send - Closed message queue (EBADF)" );
+  status = mq_send( mqs[size], "", 1, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EBADF, "mq_send errno EBADF");
+
+  puts( "mq_open - Open a read only queue" );
+  n_mq1 = mq_open("read_only", O_CREAT | O_RDONLY, 0x777, &attr);
+  assert( n_mq1 != (-1) );
+  /*XXX - Isn't there a more general check */ 
+
+  puts( "mq_send - Read only message queue (EBADF)" );
+  status = mq_send( n_mq1, "", 1, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EBADF, "mq_send errno EBADF");
+
+  status = mq_close( n_mq1 );
+  fatal_directive_status( status, 0, "mq_close message queue"); 
+
+  status = mq_unlink( "read_only" );
+  fatal_directive_status( status, 0, "mq_unlink message queue"); 
+
+  /*
+   * XXX - EINTR
+   *       Signal interrupted the call.
+
+  puts( "mq_send - UNSUCCESSFUL (EINTR)" );
+  status = mq_send( mqs, "", 0xffff, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, E, "mq_send errno E");
+   */
+
+  /*
+   * XXX - EINVAL priority is out of range.
+   */
+
+  puts( "mq_send - Priority out of range (EINVAL)" );
+  status = mq_send( mqs[0], "", 1, MQ_PRIO_MAX + 1 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EINVAL, "mq_send errno EINVAL");
+
+  /*
+   * XXX - EMSGSIZE - Message size larger than msg_len
+   */
+
+  puts( "mq_send - Message longer than msg_len (EMSGSIZE)" );
+  status = mq_send( mqs[0], "", 0xffff, 0 );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EMSGSIZE, "mq_send errno EMSGSIZE");
+
+  /*
+   * ENOSYS - send is supported should never happen.
+   */
+
+
+  /*
+   * XXX - EAGAIN 
+   *       O_NONBLOCK and message queue is full.
+   *       This is validated in the read/write test.
+   */
+
+  i=0;
+  do {
+    status = mq_send( mqs[0], "", 1, 0 );
+    i++;
+  } while (status == 0);
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, EAGAIN, "mq_send errno EAGAIN");
+
+  return i-1;
+}
+
+void validate_mq_receive_error_codes( 
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
+)
+{
+  int             status;
+
+  /*
+   * EAGAIN - 
+   */
+
+  /*
+   * EBADF - 
+   */
+
+  /*
+   * EMSGSIZE - 
+   */
+
+  /*
+   * EINTR - 
+   */
+
+  /*
+   * EBADMSG - a data corruption problem.
+   *  XXX - Can not cause.
+   */
+
+  /*
+  puts( "mq_ - UNSUCCESSFUL ()" );
+  status = mq_(  );
+  fatal_directive_status( status, -1, "mq_ error return status");
+  fatal_directive_status( errno, E, "mq_c errno E");
+
+  */
+  /*
+   * ENOSYS - 
+   */
+
+}
+
+void non_blocking_mq_read_write(
+  mqd_t   *mqs,      
+  int      size      /* Number still open in mqs */
+)
+{
+  /*
+  int         status;
+  char       *messages[] = {
+    "Msg 1",
+    "Test 2",
+    "12345678901234567890"
+  };
+
+  status = mq_send( mqs[0], messages[0], strlen( messages[0] ), 0 );
+  fatal_directive_status( status, 0, "mq_send error return status" );
+    
+  puts( "mq_send - UNSUCCESSFUL ()" );
+  do {
+    status = mq_send(  );
+  fatal_directive_status( status, -1, "mq_send error return status");
+  fatal_directive_status( errno, E, "mq_send errno E");
+  }
+  */
 }
 
@@ -212,13 +391,12 @@
 {
   int             status;
-  int             value;
-  int             i;
   mqd_t           mqs[CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES];
-  mqd_t           mq2;
   mqd_t           n_mq1;
   mqd_t           n_mq2;
-  struct timespec waittime;
-  char            failure_msg[80];
-  struct mq_attr  attr;
+  char           *messages[] = {
+    "Msg 1",
+    "Test 2",
+    "12345678901234567890"
+  };
 
   puts( "\n\n*** POSIX MESSAGE QUEUE TEST ***" );
@@ -228,4 +406,8 @@
   validate_mq_close_error_codes( mqs, 2 );
 
+  validate_mq_send_error_codes( mqs, 2 );
+  validate_mq_receive_error_codes( mqs, 2 );
+
+
   /*
    * Validate a second open returns the same message queue.
@@ -233,7 +415,7 @@
 
   puts( "mq_open - Open an existing mq ( same id )" );
-  n_mq2 = mq_open("mq1", 0 );
-  fatal_directive_status( 
-    (int) n_mq2, (int ) mqs[0], "mq_open error return status" );
+  n_mq1 = mq_open("mq1", 0 );
+  fatal_directive_status( 
+    (int) n_mq1, (int ) mqs[0], "mq_open error return status" );
   
   /*
@@ -252,42 +434,28 @@
 
   /*
-   * Validate it n_mq2 (the last open for mq1 name can be
-   * correctly closed and unlinked.
-   */
-
-  puts( "Init: mq_unlink - mq1 (2) SUCCESSFUL" );
+   * Validate it "mq1" can be closed and unlinked.
+   */
+
+  puts( "mq_unlink - mq1 SUCCESSFUL" );
   status = mq_unlink( "mq1" );
   fatal_directive_status( status, 0, "mq_unlink locked message queue"); 
 
-  puts( "Init: mq_close (2) - SUCCESSFUL" );
+  puts( "mq_close mq1 - SUCCESSFUL" );
   status = mq_close( n_mq2 );
   fatal_directive_status( status, 0, "mq_close message queue"); 
-
-
-  puts( "Init: mq_unlink - UNSUCCESSFUL (ENOENT)" );
+  status = mq_close( n_mq1 );
+  fatal_directive_status( status, 0, "mq_close message queue"); 
+  status = mq_close( mqs[0] );
+  fatal_directive_status( status, 0, "mq_close message queue"); 
+
+  puts( "mq_unlink - UNSUCCESSFUL (ENOENT)" );
   status = mq_unlink("mq1");
   fatal_directive_status( status, -1, "mq_unlink error return status");
   fatal_directive_status( errno, ENOENT, "mq_close errno EINVAL");
-
-
-  /*
-   * Validate we can unlink (2)
-   */
-
-  puts( "Init: mq_unlink (NULL) - EINVAL" );
-  status = mq_unlink( NULL );
-  fatal_directive_status( status, -1, "mq_unlink error return status");
-  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
-
-  puts( "Init: mq_unlink (\"\") - EINVAL" );
-  status = mq_unlink( "" );
-  fatal_directive_status( status, -1, "mq_unlink error return status");
-  fatal_directive_status( errno, EINVAL, "mq_unlink errno value"); 
 
   /*
    * XXX - Cant' create location OBJECTS_ERROR or OBJECTS_REMOTE.
    *       mq_close and mq_unlink.
-   */
-
+   * XXX - Don't think we need this save until yellow line tested.
   puts( "Init: mq_unlink - UNSUCCESSFUL (ENOENT)" );
   status = mq_unlink("mq3");
@@ -295,5 +463,5 @@
   fatal_directive_status( errno, ENOENT, "mq_unlink errno ENOENT");
   assert( (status == -1) && (errno == ENOENT) );
-
+  */
 
 
@@ -313,2 +481,4 @@
   return NULL; /* just so the compiler thinks we returned something */
 }
+
+
