Tools/NetTest - Add TCP retransmit test
[tpg/acess2.git] / KernelLand / Kernel / messages.c
index 09c8c14..b9d7a6f 100644 (file)
@@ -78,19 +78,21 @@ int Proc_SendMessage(Uint Dest, int Length, void *Data)
  * \fn int Proc_GetMessage(Uint *Source, void *Buffer)
  * \brief Gets a message
  * \param Source       Where to put the source TID
+ * \param BufSize      Size of \a Buffer, only this many bytes will be copied
  * \param Buffer       Buffer to place the message data (set to NULL to just get message length)
  * \return Message length
  */
-int Proc_GetMessage(Uint *Source, void *Buffer)
+int Proc_GetMessage(Uint *Source, Uint BufSize, void *Buffer)
 {
         int    ret;
        void    *tmp;
        tThread *cur = Proc_GetCurThread();
 
-       ENTER("pSource pBuffer", Source, Buffer);
+       ENTER("pSource xBufSize pBuffer", Source, BufSize, Buffer);
        
        // Check if queue has any items
        if(!cur->Messages) {
+               LOG("empty queue");
                LEAVE('i', 0);
                return 0;
        }
@@ -113,7 +115,7 @@ int Proc_GetMessage(Uint *Source, void *Buffer)
        // Get message
        if(Buffer != GETMSG_IGNORE)
        {
-               if( !CheckMem( Buffer, cur->Messages->Length ) )
+               if( !CheckMem( Buffer, BufSize ) )
                {
                        LOG("Invalid buffer");
                        errno = -EINVAL;
@@ -121,18 +123,28 @@ int Proc_GetMessage(Uint *Source, void *Buffer)
                        LEAVE('i', -1);
                        return -1;
                }
+               if( BufSize < cur->Messages->Length )
+                       Log_Notice("Threads", "Buffer of 0x%x passed, but 0x%x long message, truncated",
+                               BufSize, cur->Messages->Length);
+               else if( BufSize < cur->Messages->Length )
+                       BufSize = cur->Messages->Length;
+               else
+                       ;       // equal
                LOG("Copied to buffer");
-               memcpy(Buffer, cur->Messages->Data, cur->Messages->Length);
+               memcpy(Buffer, cur->Messages->Data, BufSize);
        }
        ret = cur->Messages->Length;
        
        // Remove from list
        tmp = cur->Messages;
        cur->Messages = cur->Messages->Next;
+       // - Removed last message? Clear the end-of-list pointer
        if(cur->Messages == NULL)       cur->LastMessage = NULL;
+       //  > Otherwise, re-mark the IPCMSG event flag
+       else    cur->EventState |= THREAD_EVENT_IPCMSG;
        
        SHORTREL( &cur->IsLocked );
-       
+
        free(tmp);      // Free outside of lock
 
        LEAVE('i', ret);

UCC git Repository :: git.ucc.asn.au