home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / kn / sockcommon / putclientsockmsg.c < prev    next >
Encoding:
Text File  |  2001-05-12  |  1.7 KB  |  78 lines

  1. /*
  2. **
  3. **    processed = kn_putclientsockmsg(sock, msg)
  4. **
  5. **    put message to socket.
  6. **
  7. **    returns TFALSE when the message must be resent later, i.e. when
  8. **    local storage for KNSOCK_MAXPENDING messages is exhausted.
  9. **
  10. **    when the socket is not in SOCKSTATUS_CONNECTED state, messages
  11. **    will be delivered with TMSG_STATUS_FAILED, and this functions
  12. **    returns TTRUE.
  13. **
  14. */
  15.  
  16. TBOOL kn_putclientsockmsg(TAPTR knsock, TMSG *msg)
  17. {
  18.     struct knclientsocket *s = (struct knclientsocket *) knsock;
  19.  
  20.     if (s->status == SOCKSTATUS_CONNECTED)
  21.     {
  22.         struct knclinode *cnode = (struct knclinode *) TRemHead(&s->freelist);
  23.         if (cnode)
  24.         {
  25.             TTIME now;
  26.  
  27.             cnode->msg = msg;
  28.             cnode->bytestowrite = msg->size - sizeof(TMSG) + sizeof(knnethead);
  29.             cnode->bytesdone = 0;
  30.             cnode->nethead.msgsize = htonl(cnode->bytestowrite);
  31.             cnode->msgID = s->msgID++;
  32.             cnode->nethead.msgID = htonl(cnode->msgID);
  33.             cnode->nethead.protocol = msg->replyport ? KNSOCK_PROTO_PUTREPLY : KNSOCK_PROTO_PUT;
  34.  
  35.             kn_querytimer(s->timer, &now);
  36.             cnode->timestamp = TTIMETOF(&now);
  37.             
  38.             cnode->nethead.version = KNSOCK_VERSION;
  39.  
  40.             TAddTail(&s->writelist, (TNODE *) cnode);
  41.             return TTRUE;
  42.         
  43.         }
  44.         else
  45.         {
  46.             dbsprintf(1, "*** kn_putclientsockmsg: socket message pool exhausted\n");
  47.         }
  48.     }
  49.     else
  50.     {
  51.         dbsprintf(2, "*** kn_putclientsockmsg: socket not in connected state\n");
  52.  
  53.         if (msg->replyport)
  54.         {
  55.             struct knclinode *cnode = (struct knclinode *) TRemHead(&s->freelist);
  56.             if (cnode)
  57.             {
  58.                 /* two-way message failed */
  59.  
  60.                 cnode->msg = msg;
  61.                 msg->status = TMSG_STATUS_FAILED;
  62.                 TAddTail(&s->deliverlist, (TNODE *) cnode);
  63.                 return TTRUE;
  64.             }
  65.         }
  66.         else
  67.         {
  68.             /* one-way message failed */
  69.  
  70.             TFreeMsg(msg + 1);
  71.  
  72.             return TTRUE;
  73.         }
  74.     }
  75.  
  76.     return TFALSE;
  77. }
  78.