home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / kn / sockcommon / destroyservsock.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-12  |  1.5 KB  |  66 lines

  1.  
  2. static void destroyservsocklist(kn_sockenv_t *sockenv, struct knservsocket *s, TLIST *list, TBOOL check);
  3.  
  4. /*
  5. **
  6. **    kn_destroyservsock(knsocket)
  7. **
  8. **    destroy server socket
  9. **
  10. */
  11.  
  12. TVOID kn_destroyservsock(TAPTR knsock)
  13. {
  14.     struct knservsocket *s = (struct knservsocket *) knsock;
  15.     kn_sockenv_t *sockenv = &s->sockenv;
  16.  
  17.     destroyservsocklist(sockenv, s, &s->userlandlist, TTRUE);
  18.     destroyservsocklist(sockenv, s, &s->readlist, TFALSE);
  19.     destroyservsocklist(sockenv, s, &s->writelist, TFALSE);
  20.     destroyservsocklist(sockenv, s, &s->deliverlist, TFALSE);
  21.  
  22.     kn_locksock(sockenv);
  23.     kn_closesocket(s->desc);
  24.     kn_unlocksock(sockenv);
  25.  
  26.     TMMUFree(s->mmu, s);
  27. }
  28.  
  29.  
  30. static void destroyservsocklist(kn_sockenv_t *sockenv, struct knservsocket *s, TLIST *list, TBOOL check)
  31. {
  32.     struct knsrvnode *cnode;
  33.     TNODE *nextnode, *node = list->head;
  34.     while ((nextnode = node->succ))
  35.     {
  36.         cnode = (struct knsrvnode *) node;
  37.  
  38.         if (check)
  39.         {
  40.             if (cnode->bufmsg)
  41.             {
  42.                 if (cnode->bufmsg->status & TMSG_STATUS_PENDING)
  43.                 {
  44.                     dbsprintf(10, "*** TEKLIB kn_destroyservsock: unlinking message from messageport\n");
  45.                     TRemove(&cnode->bufmsg->handle.node);
  46.                 }
  47.                 else dbsprintf(20, "*** TEKLIB kn_destroyservsock WARNING: message lost in userland\n");
  48.     
  49.             } else dbsprintf(30, "*** TEKLIB kn_destroyservsock ALERT: SEVERE MSGLIST CORRUPTION\n");
  50.         }
  51.  
  52.         if (cnode->bufmsg)
  53.         {
  54.             TFreeMsg(cnode->bufmsg + 1);
  55.         }
  56.  
  57.         kn_locksock(sockenv);
  58.         shutdown(cnode->desc, 2);
  59.         kn_closesocket(cnode->desc);
  60.         kn_unlocksock(sockenv);
  61.         
  62.         node = nextnode;
  63.     }
  64. }
  65.  
  66.