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

  1.  
  2. /*
  3. **    knsocket = kn_createservsock(mmu, msgmmu, localsockname, maxmsgsize, timer, timeout, *portnr)
  4. **
  5. **    create server socket (replyport proxy scenario), 
  6. **    associate it with given name, put it into listening state.
  7. **    the timeout applies to no activity on incoming connections.
  8. */
  9.  
  10. TAPTR kn_createservsock(TAPTR mmu, TAPTR msgmmu, knsockobj *knsockname, TUINT maxmsgsize, TKNOB *timer, TTIME *timeout, TUINT *portnr)
  11. {
  12.     TBOOL success = TFALSE;
  13.  
  14.     struct knservsocket *s = TMMUAlloc(mmu, sizeof(struct knservsocket));
  15.     if (s)
  16.     {
  17.         kn_sockenv_t *sockenv = &s->sockenv;
  18.         if (kn_getsockenv(sockenv))
  19.         {
  20.             kn_locksock(sockenv);
  21.         
  22.             s->desc = socket(PF_INET, SOCK_STREAM, 0);
  23.             if (s->desc >= 0)
  24.             {
  25.                 int yes = 1;
  26.                 if (setsockopt(s->desc, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == 0)
  27.                 {
  28.                     if (knsockname)
  29.                     {
  30.                         success = (bind(s->desc, (struct sockaddr *) knsockname, sizeof(struct sockaddr_in)) == 0);
  31.                     }
  32.                     else
  33.                     {
  34.                         success = TTRUE;
  35.                     }
  36.                 
  37.                     if (success)
  38.                     {
  39.                         if (listen(s->desc, KNSOCK_MAXLISTEN) == 0)
  40.                         {
  41.                             int i;
  42.                             struct knsrvnode *cnode;
  43.                         
  44.                             FD_ZERO(&s->readset);
  45.                             FD_ZERO(&s->writeset);
  46.                             FD_SET(s->desc, &s->readset);
  47.                 
  48.                             s->connID = 0;
  49.                             s->maxmsgsize = maxmsgsize > 0xffffffff - sizeof(knnethead) ? 0xffffffff - sizeof(knnethead) : maxmsgsize;
  50.                             s->mmu = mmu;
  51.                             s->msgmmu = msgmmu;
  52.                             /*s->localname = knsockname;*/
  53.                             s->timer = timer;
  54.                             s->readtimeout = TTIMETOF(timeout);
  55.                             
  56.                             TInitList(&s->freelist);
  57.                             TInitList(&s->readlist);
  58.                             TInitList(&s->writelist);
  59.                             TInitList(&s->deliverlist);
  60.                             TInitList(&s->userlandlist);
  61.                 
  62.                             cnode = s->nodebuf;
  63.                             for (i = 0; i < KNSOCK_MAXLISTEN; ++i)
  64.                             {
  65.                                 TAddTail(&s->freelist, (TNODE *) cnode);
  66.                                 cnode++;
  67.                             }
  68.                             
  69.                             success = TTRUE;
  70.                             
  71.                             if (!knsockname && portnr)
  72.                             {
  73.                                 knsockobj mysockname;
  74.                                 int namelen = sizeof(knsockobj);
  75.                                 if (getsockname(s->desc, (struct sockaddr *) &mysockname, &namelen) == 0)
  76.                                 {
  77.                                     *portnr = (TUINT) kn_getsockport(&mysockname);
  78.                                 }
  79.                                 else
  80.                                 {
  81.                                     dbsprintf(20, "*** TEKLIB kn_createservsock: could not get own port nr\n");
  82.                                     success = TFALSE;
  83.                                 }
  84.                             }
  85.  
  86.  
  87.                         }
  88.                         else dbsprintf(10, "*** TEKLIB kn_createservsock: listen()\n");
  89.                     }
  90.                     else dbsprintf(10, "*** TEKLIB kn_createservsock: bind()\n");
  91.                 }
  92.                 else dbsprintf(20, "*** TEKLIB kn_createservsock: setsockopt()\n");
  93.  
  94.                 if (!success)
  95.                 {    
  96.                     kn_closesocket(s->desc);
  97.                 }
  98.             }
  99.             else dbsprintf(10, "*** TEKLIB kn_createservsock: socket()\n");
  100.  
  101.             kn_unlocksock(sockenv);
  102.         }
  103.  
  104.         if (!success)
  105.         {
  106.             TMMUFree(mmu, s);
  107.             s = TNULL;
  108.         }
  109.     }
  110.  
  111.     return (TAPTR) s;
  112. }
  113.