Diff for /libaitrpc/src/srv.c between versions 1.1.1.1.2.4 and 1.1.1.1.2.5

version 1.1.1.1.2.4, 2010/06/23 11:33:38 version 1.1.1.1.2.5, 2010/06/23 15:07:15
Line 75  rpc_srv_dispatchCall(void *arg) Line 75  rpc_srv_dispatchCall(void *arg)
                                                 data += v[i].val_len + 1;                                                  data += v[i].val_len + 1;
                                                 break;                                                  break;
                                         case blob:                                          case blob:
                                                rpc_srv_getBLOB(&v[i], data);                                                rpc_srv_getBLOBVar(&v[i], data);
                                                 data += sizeof(rpc_cli_t);                                                  data += sizeof(rpc_cli_t);
                                                 break;                                                  break;
                                         default:                                          default:
Line 147  rpc_srv_dispatchCall(void *arg) Line 147  rpc_srv_dispatchCall(void *arg)
                                                 data += sizeof(rpc_cli_t);                                                  data += sizeof(rpc_cli_t);
                                                 Limit += sizeof(rpc_cli_t);                                                  Limit += sizeof(rpc_cli_t);
   
                                                rpc_srv_setBLOB(&vals[i], &cli);                                                rpc_srv_setBLOBVar(&vals[i], &cli);
                                                 break;                                                  break;
                                         default:                                          default:
                                                 break;                                                  break;
Line 181  static void * Line 181  static void *
 rpc_srv_dispatchVars(void *arg)  rpc_srv_dispatchVars(void *arg)
 {  {
         rpc_cli_t *c = arg;          rpc_cli_t *c = arg;
//        rpc_srv_t *s;        rpc_srv_t *s;
        int ret;        rpc_blob_t *b;
         int cx, ret;
         fd_set fds;
         u_char buf[BLOBSIZ];
         struct tagBLOBHdr *blob;
   
           if (!arg) {
                   rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t procced BLOB client ...\n");
                   return NULL;
           } else
                   s = c->cli_parent;
   
           cx = -1;
           do {
                   cx++;
   
                   FD_ZERO(&fds);
                   FD_SET(c->cli_sock, &fds);
                   ret = select(c->cli_sock + 1, &fds, NULL, NULL, NULL);
                   if (ret == -1) {
                           ret = -2;
                   }
                   memset(buf, 0, BLOBSIZ);
                   if ((ret = recv(c->cli_sock, buf, BLOBSIZ, 0)) == -1) {
                           LOGERR;
                           ret = -3;
                           break;
                   }
                   if (!ret) {             // receive EOF
                           ret = 0;
                           break;
                   }
                   if (ret < sizeof(struct tagBLOBHdr)) {
                           rpc_SetErr(EMSGSIZE, "Error:: too short BLOB packet ...\n");
                           ret = -4;
                           break;
                   } else
                           blob = (struct tagBLOBHdr*) buf;
                   // check BLOB packet session info
                   if (memcmp(&blob->hdr_session, &s->srv_session, sizeof blob->hdr_session) || 
                                   blob->hdr_seq != cx) {
                           rpc_SetErr(EINVAL, "Error:: get invalid BLOB session in seq=%d...\n", blob->hdr_seq);
                           ret = -5;
                           break;
                   }
                   // Go to decapsulate packet ...
                   if (!(b = rpc_srv_getBLOB(s, blob->hdr_var))) {
                           rpc_SetErr(EINVAL, "Error:: var (%x) not found into BLOB server ...\n", blob->hdr_var);
                           ret = -6;
                           break;
                   }
                   switch (blob->hdr_cmd) {
                           case get:
                                   ret = rpc_srv_sendBLOB(c, b);
                                   break;
                           case set:
                                   ret = rpc_srv_recvBLOB(c, b);
                                   break;
                           case unset:
                                   ret = rpc_srv_freeBLOB(b);
                                   break;
                           default:
                                   rpc_SetErr(EINVAL, "Error:: unsupported BLOB command (%d)...\n", 
                                                   blob->hdr_cmd);
                                   ret -7;
                   }
           } while (ret > -1);
   
           shutdown(c->cli_sock, SHUT_RDWR);
           close(c->cli_sock);
           memset(c, 0, sizeof(rpc_cli_t));
         return (void*) ret;          return (void*) ret;
 }  }
   
Line 192  rpc_srv_dispatchVars(void *arg) Line 261  rpc_srv_dispatchVars(void *arg)
 /*  /*
  * rpc_srv_initBLOBServer() Init & create BLOB Server   * rpc_srv_initBLOBServer() Init & create BLOB Server
  * @Port = Port for bind server, if Port == 0 default port is selected   * @Port = Port for bind server, if Port == 0 default port is selected
    * @diskDir = Disk place for BLOB file objects
  * return: -1 == error or 0 bind and created BLOB server instance   * return: -1 == error or 0 bind and created BLOB server instance
  */   */
 int  int
rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_short Port)rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_short Port, const char *diskDir)
 {  {
         int n = 1;          int n = 1;
         struct sockaddr_in sin;          struct sockaddr_in sin;
Line 213  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s Line 283  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s
                 Port = RPC_DEFPORT + 1;                  Port = RPC_DEFPORT + 1;
   
         memset(&srv->srv_blob, 0, sizeof srv->srv_blob);          memset(&srv->srv_blob, 0, sizeof srv->srv_blob);
           if (access(diskDir, R_OK | W_OK) == -1) {
                   LOGERR;
                   return -1;
           } else
                   strlcpy(srv->srv_blob.dir, diskDir, UCHAR_MAX + 1);
   
         srv->srv_blob.server.cli_tid = pthread_self();          srv->srv_blob.server.cli_tid = pthread_self();
         srv->srv_blob.server.cli_parent = srv;          srv->srv_blob.server.cli_parent = srv;
         if (srv->srv_server.cli_sa.sa_family == AF_INET) {          if (srv->srv_server.cli_sa.sa_family == AF_INET) {
Line 258  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s Line 334  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s
         rpc_srv_registerCall(srv, NULL, CALL_BLOBVARS, 0);          rpc_srv_registerCall(srv, NULL, CALL_BLOBVARS, 0);
         pthread_mutex_unlock(&srv->srv_mtx);          pthread_mutex_unlock(&srv->srv_mtx);
   
        srv->srv_blob.state = 1;       // enable BLOB        srv->srv_blob.state = enable;       // enable BLOB
         return 0;          return 0;
 }  }
   
Line 278  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) Line 354  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
                 rpc_SetErr(EINVAL, "Error:: Can`t destroy server because parameter is null!\n");                  rpc_SetErr(EINVAL, "Error:: Can`t destroy server because parameter is null!\n");
                 return;                  return;
         } else          } else
                srv->srv_blob.state = 0;                srv->srv_blob.state = disable;
   
         for (i = 0, c = srv->srv_blob.clients; i < srv->srv_numcli && c; i++, c++)          for (i = 0, c = srv->srv_blob.clients; i < srv->srv_numcli && c; i++, c++)
                 if (c->cli_sa.sa_family)                  if (c->cli_sa.sa_family)
Line 571  rpc_srv_execServer(rpc_srv_t * __restrict srv) Line 647  rpc_srv_execServer(rpc_srv_t * __restrict srv)
         }          }
   
         return 0;          return 0;
 }  
   
 // ---------------------------------------------------------  
   
 /*  
  * rpc_srv_freeValsCall() Free return variables for RPC call  
  * @call = RPC function call  
  * return: none  
  */  
 inline void  
 rpc_srv_freeValsCall(rpc_func_t * __restrict call)  
 {  
         rpc_srv_declValsCall(call, 0);  
 }  
   
 /*  
  * rpc_srv_declValsCall() Declare return variables for RPC call  
  * @call = RPC function call  
  * @return_vals = Number of return variables  
  * return: -1 error, !=-1 ok  
  */  
 inline int  
 rpc_srv_declValsCall(rpc_func_t * __restrict call, int return_vals)  
 {  
         void *ptr;  
   
         if (!call || return_vals < 0) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t declare return variables for RPC call...\n");  
                 return -1;  
         } else  
                 call->func_args = return_vals;  
   
         if (!return_vals) {  
                 if (call->func_vals) {  
                         free(call->func_vals);  
                         call->func_vals = NULL;  
                 }  
         } else {  
                 ptr = realloc(call->func_vals, return_vals * sizeof(rpc_val_t));  
                 if (!ptr) {  
                         LOGERR;  
                         return -1;  
                 } else  
                         call->func_vals = ptr;  
         }  
   
         return call->func_args;  
 }  
   
 /*  
  * rpc_srv_delValsCall() Clean values from return variables of RPC call  
  * @call = RPC function call  
  * return: -1 error, !=-1 Returned number of cleaned RPC variables  
  */  
 inline int  
 rpc_srv_delValsCall(rpc_func_t * __restrict call)  
 {  
         if (!call) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t delete return variables ...\n");  
                 return -1;  
         }  
   
         memset(call->func_vals, 0, call->func_args * sizeof(rpc_val_t));  
         return call->func_args;  
 }  
   
 /*  
  * rpc_srv_copyValsCall() Copy return variables for RPC call to new variable  
  * @call = RPC function call  
  * @newvals = New allocated variables array, must be free after use  
  * return: -1 error, !=-1 Returned number of copied RPC variables  
  */  
 inline int  
 rpc_srv_copyValsCall(rpc_func_t * __restrict call, rpc_val_t ** __restrict newvals)  
 {  
         if (!call || !newvals) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t copy return variables to new array\n");  
                 return -1;  
         }  
   
         *newvals = calloc(call->func_args, sizeof(rpc_val_t));  
         if (!*newvals) {  
                 LOGERR;  
                 return -1;  
         } else  
                 memcpy(*newvals, call->func_vals, call->func_args * sizeof(rpc_val_t));  
   
         return call->func_args;  
 }  
   
 /*  
  * rpc_srv_getValsCall() Get return variables for RPC call  
  * @call = RPC function call  
  * @vals = Returned variables, may be NULL  
  * return: -1 error, !=-1 Number of returned variables  
  */  
 inline int  
 rpc_srv_getValsCall(rpc_func_t * __restrict call, rpc_val_t ** __restrict vals)  
 {  
         if (!call) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get return variables ...\n");  
                 return -1;  
         }  
   
         if (vals)  
                 *vals = call->func_vals;  
         return call->func_args;  
 }  
   
 // ---------------------------------------------------------  
   
 /*  
  * rpc_srv_registerCall() Register call to RPC server  
  * @srv = RPC Server instance  
  * @csModule = Module name, if NULL self binary  
  * @csFunc = Function name  
  * @args = Number of function arguments  
  * return: -1 error or 0 register ok  
  */  
 int  
 rpc_srv_registerCall(rpc_srv_t * __restrict srv, const char *csModule, const char *csFunc, u_char args)  
 {  
         rpc_func_t *func;  
         u_char str[MAXPATHLEN + UCHAR_MAX + 1];  
   
         memset(str, 0, MAXPATHLEN + UCHAR_MAX + 1);  
         if (!srv || !csFunc) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t register function to RPC server ...\n");  
                 return -1;  
         }  
         if (!(func = malloc(sizeof(rpc_func_t)))) {  
                 LOGERR;  
                 return -1;  
         } else {  
                 memset(func, 0, sizeof(rpc_func_t));  
                 strlcpy((char*) func->func_name, csFunc, UCHAR_MAX + 1);  
         }  
         if (csModule) {  
                 strlcpy((char*) func->func_file, csModule, MAXPATHLEN);  
                 strlcpy((char*) str, csModule, MAXPATHLEN + UCHAR_MAX + 1);  
         }  
         strlcat((char*) str, "__", MAXPATHLEN + UCHAR_MAX + 1);  
         strlcat((char*) str, csFunc, MAXPATHLEN + UCHAR_MAX + 1);  
   
         func->func_tag = crcFletcher16((u_short*) str, (MAXPATHLEN + UCHAR_MAX + 1) / 2);  
         func->func_hash = hash_fnv((char*) str, MAXPATHLEN + UCHAR_MAX + 1);  
   
         if (rpc_srv_declValsCall(func, args) == -1) {  
                 free(func);  
                 return -1;  
         }  
   
         pthread_mutex_lock(&srv->srv_mtx);  
         func->func_next = srv->srv_funcs;  
         srv->srv_funcs = func;  
         pthread_mutex_unlock(&srv->srv_mtx);  
         return 0;  
 }  
   
 /*  
  * rpc_srv_unregisterCall() Unregister call from RPC server  
  * @srv = RPC Server instance  
  * @csModule = Module name, if NULL self binary  
  * @csFunc = Function name  
  * return: -1 error, 0 not found call, 1 unregister ok  
  */  
 int  
 rpc_srv_unregisterCall(rpc_srv_t * __restrict srv, const char *csModule, const char *csFunc)  
 {  
         rpc_func_t func, *f, *curr;  
         u_char str[MAXPATHLEN + UCHAR_MAX + 1];  
   
         memset(&func, 0, sizeof(rpc_func_t));  
         memset(str, 0, MAXPATHLEN + UCHAR_MAX + 1);  
         if (!srv || !csFunc) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t unregister function from RPC server ...\n");  
                 return -1;  
         } else  
                 strlcpy((char*) func.func_name, csFunc, UCHAR_MAX + 1);  
         if (csModule) {  
                 strlcpy((char*) func.func_file, csModule, MAXPATHLEN);  
                 strlcpy((char*) str, csModule, MAXPATHLEN + UCHAR_MAX + 1);  
         }  
         strlcat((char*) str, "__", MAXPATHLEN + UCHAR_MAX + 1);  
         strlcat((char*) str, csFunc, MAXPATHLEN + UCHAR_MAX + 1);  
   
         func.func_tag = crcFletcher16((u_short*) str, (MAXPATHLEN + UCHAR_MAX + 1) / 2);  
         func.func_hash = hash_fnv((char*) str, MAXPATHLEN + UCHAR_MAX + 1);  
   
         f = rpc_srv_getCall(srv, func.func_tag, func.func_hash);  
         if (!f)         // not found element for unregister  
                 return 0;  
   
         pthread_mutex_lock(&srv->srv_mtx);  
         if (srv->srv_funcs == f) {      // if is 1st element  
                 srv->srv_funcs = srv->srv_funcs->func_next;  
   
                 if (f->func_args && f->func_vals)  
                         free(f->func_vals);  
                 free(f);  
         } else {  
                 for (curr = srv->srv_funcs; curr->func_next != f; curr = curr->func_next);  
                 curr->func_next = curr->func_next->func_next;  
   
                 if (f->func_args && f->func_vals)  
                         free(f->func_vals);  
                 free(f);  
         }  
         pthread_mutex_unlock(&srv->srv_mtx);  
   
         return 1;  
 }  
   
 /*  
  * rpc_srv_getCall() Get registered call from RPC server  
  * @srv = RPC Server instance  
  * @tag = tag for function  
  * @hash = hash for function  
  * return: NULL not found call, !=NULL return call  
  */  
 inline rpc_func_t *  
 rpc_srv_getCall(rpc_srv_t * __restrict srv, uint16_t tag, uint32_t hash)  
 {  
         rpc_func_t *f;  
   
         if (!srv) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get function from RPC server ...\n");  
                 return NULL;  
         }  
   
         for (f = srv->srv_funcs; f; f = f->func_next)  
                 if (f->func_tag == tag && f->func_hash == hash)  
                         break;  
   
         return f;  
 }  
   
 /*  
  * rpc_srv_getFunc() Get registered call from RPC server by Name  
  * @srv = RPC Server instance  
  * @csModule = Module name, if NULL self binary  
  * @csFunc = Function name  
  * return: NULL not found call, !=NULL return call  
  */  
 rpc_func_t *  
 rpc_srv_getFunc(rpc_srv_t * __restrict srv, const char *csModule, const char *csFunc)  
 {  
         rpc_func_t func;  
         u_char str[MAXPATHLEN + UCHAR_MAX + 1];  
   
         memset(&func, 0, sizeof(rpc_func_t));  
         memset(str, 0, MAXPATHLEN + UCHAR_MAX + 1);  
         if (!srv || !csFunc) {  
                 rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t get function from RPC server ...\n");  
                 return NULL;  
         } else  
                 strlcpy((char*) func.func_name, csFunc, UCHAR_MAX + 1);  
         if (csModule) {  
                 strlcpy((char*) func.func_file, csModule, MAXPATHLEN);  
                 strlcpy((char*) str, csModule, MAXPATHLEN + UCHAR_MAX + 1);  
         }  
         strlcat((char*) str, "__", MAXPATHLEN + UCHAR_MAX + 1);  
         strlcat((char*) str, csFunc, MAXPATHLEN + UCHAR_MAX + 1);  
   
         func.func_tag = crcFletcher16((u_short*) str, (MAXPATHLEN + UCHAR_MAX + 1) / 2);  
         func.func_hash = hash_fnv((char*) str, MAXPATHLEN + UCHAR_MAX + 1);  
   
         return rpc_srv_getCall(srv, func.func_tag, func.func_hash);  
 }  }
   
 // ---------------------------------------------------------  // ---------------------------------------------------------

Removed from v.1.1.1.1.2.4  
changed lines
  Added in v.1.1.1.1.2.5


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