Diff for /libaitrpc/src/srv.c between versions 1.23.6.1 and 1.23.6.2

version 1.23.6.1, 2014/11/17 23:28:55 version 1.23.6.2, 2014/11/17 23:51:26
Line 59  static void *txUDPPacket(sched_task_t *); Line 59  static void *txUDPPacket(sched_task_t *);
   
 /* SOCK_RAW */  /* SOCK_RAW */
   
static sched_task_func_t cbProto[SOCK_RAW + 1][4] = {/* SOCK_BPF */
 static void *rxBPFPacket(sched_task_t *);
 static void *txBPFPacket(sched_task_t *);
 
 static sched_task_func_t cbProto[SOCK_BPF + 1][4] = {
         { acceptClients, closeClient, rxPacket, txPacket },     /* SOCK_STREAM */          { acceptClients, closeClient, rxPacket, txPacket },     /* SOCK_STREAM */
         { acceptClients, closeClient, rxPacket, txPacket },     /* SOCK_STREAM */          { acceptClients, closeClient, rxPacket, txPacket },     /* SOCK_STREAM */
         { rxUDPPacket, freeClient, rxUDPPacket, txUDPPacket },  /* SOCK_DGRAM */          { rxUDPPacket, freeClient, rxUDPPacket, txUDPPacket },  /* SOCK_DGRAM */
        { NULL, NULL, NULL, NULL }                              /* SOCK_RAW */        { NULL, NULL, NULL, NULL },                                /* SOCK_RAW */
         { rxBPFPacket, freeClient, rxBPFPacket, txBPFPacket }   /* SOCK_BPF */
 };  };
   
 /* Global Signal Argument when kqueue support disabled */  /* Global Signal Argument when kqueue support disabled */
Line 1299  rpc_srv_execCall(rpc_cli_t * __restrict cli, struct ta Line 1304  rpc_srv_execCall(rpc_cli_t * __restrict cli, struct ta
  * @concurentClients = Concurent clients at same time to this server   * @concurentClients = Concurent clients at same time to this server
  * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)   * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
  * @csIface = Interface name for bind server, if NULL first interface on host   * @csIface = Interface name for bind server, if NULL first interface on host
  * @protoNum = Protocol ethernet number for bind server, if Port == 0 default port is selected  
  * return: NULL == error or !=NULL bind and created RPC server instance   * return: NULL == error or !=NULL bind and created RPC server instance
  */   */
 rpc_srv_t *  rpc_srv_t *
rpc_srv_initServer2(u_char InstID, int concurentClients, int netBuf, rpc_srv_initServer2(u_char InstID, int concurentClients, int netBuf, const char *csIface)
                const char *csIface, u_short protoNum) 
 {  {
         int n = 1;          int n = 1;
         rpc_srv_t *srv = NULL;          rpc_srv_t *srv = NULL;
Line 1324  rpc_srv_initServer2(u_char InstID, int concurentClient Line 1327  rpc_srv_initServer2(u_char InstID, int concurentClient
                 strlcpy(szIface, csIface, sizeof szIface);                  strlcpy(szIface, csIface, sizeof szIface);
         if (e_getifacebyname(szIface, &sa))          if (e_getifacebyname(szIface, &sa))
                 return NULL;                  return NULL;
         if (!protoNum)  
                 protoNum = RPC_DEFPORT;  
   
 #ifdef HAVE_SRANDOMDEV  #ifdef HAVE_SRANDOMDEV
         srandomdev();          srandomdev();
Line 1342  rpc_srv_initServer2(u_char InstID, int concurentClient Line 1343  rpc_srv_initServer2(u_char InstID, int concurentClient
         } else          } else
                 memset(srv, 0, sizeof(rpc_srv_t));                  memset(srv, 0, sizeof(rpc_srv_t));
   
        srv->srv_proto = protoNum;        srv->srv_proto = SOCK_BPF;
         srv->srv_netbuf = netBuf;          srv->srv_netbuf = netBuf;
         srv->srv_session.sess_version = RPC_VERSION;          srv->srv_session.sess_version = RPC_VERSION;
         srv->srv_session.sess_instance = InstID;          srv->srv_session.sess_instance = InstID;
Line 1423  err: /* error condition */ Line 1424  err: /* error condition */
         return NULL;          return NULL;
 }  }
   
   /*
    * rpc_srv_loopServer2() - Execute Main layer2 server loop and wait for clients requests
    *
    * @srv = RPC Server instance
    * return: -1 error or 0 ok, infinite loop ...
    */
   int
   rpc_srv_loopServer2(rpc_srv_t * __restrict srv)
   {
           rpc_cli_t *c;
           register int i;
           rpc_func_t *f;
           struct timespec ts = { RPC_SCHED_POLLING, 0 };
   
           if (!srv) {
                   rpc_SetErr(EINVAL, "Invalid parameter can`t start RPC server");
                   return -1;
           }
   
           if (!schedRead(srv->srv_root, cbProto[srv->srv_proto][CB_ACCEPTCLIENT], srv, 
                                   srv->srv_server.cli_sock, NULL, 0)) {
                   rpc_SetErr(sched_GetErrno(), "%s", sched_GetError());
                   return -1;
           }
   
           schedPolling(srv->srv_root, &ts, NULL);
           /* main rpc loop */
           schedRun(srv->srv_root, &srv->srv_kill);
   
           /* close all clients connections & server socket */
           for (i = 0; i < array_Size(srv->srv_clients); i++) {
                   c = array(srv->srv_clients, i, rpc_cli_t*);
                   if (c) {
                           schedCancelby(srv->srv_root, taskMAX, CRITERIA_ARG, c, NULL);
                           ait_freeVars(&RPC_RETVARS(c));
                           AIT_FREE_VAL(&c->cli_buf);
                   }
                   array_Del(srv->srv_clients, i, 42);
           }
           array_Destroy(&srv->srv_clients);
   
           close(srv->srv_server.cli_sock);
   
           /* detach exported calls */
           RPC_FUNCS_LOCK(&srv->srv_funcs);
           while ((f = SLIST_FIRST(&srv->srv_funcs))) {
                   SLIST_REMOVE_HEAD(&srv->srv_funcs, func_next);
   
                   AIT_FREE_VAL(&f->func_name);
                   e_free(f);
           }
           srv->srv_funcs.avlh_root = NULL;
           RPC_FUNCS_UNLOCK(&srv->srv_funcs);
   
           return 0;
   }

Removed from v.1.23.6.1  
changed lines
  Added in v.1.23.6.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>