|
|
| version 1.4.2.8, 2011/09/03 12:39:27 | version 1.5.2.3, 2011/09/07 09:22:15 |
|---|---|
| Line 60 rpc_srv_dispatchCall(void *arg) | Line 60 rpc_srv_dispatchCall(void *arg) |
| u_char *buf; | u_char *buf; |
| int ret, argc = 0, Limit = 0; | int ret, argc = 0, Limit = 0; |
| register int i; | register int i; |
| uint16_t tag = 0; | |
| uint32_t hash = 0; | |
| if (!arg) { | if (!arg) { |
| rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t procced RPC client ...\n"); | rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t procced RPC client ...\n"); |
| Line 103 rpc_srv_dispatchCall(void *arg) | Line 105 rpc_srv_dispatchCall(void *arg) |
| } else | } else |
| rpc = (struct tagRPCCall*) buf; | rpc = (struct tagRPCCall*) buf; |
| /* check RPC packet session info */ | /* check RPC packet session info */ |
| if (memcmp(&rpc->call_session, &s->srv_session, sizeof rpc->call_session)) { | if (rpc_chkPktSession(&rpc->call_session, &s->srv_session)) { |
| rpc_SetErr(ERPCMISMATCH, "Error:: get invalid RPC session ...\n"); | rpc_SetErr(ERPCMISMATCH, "Error:: get invalid RPC session ...\n"); |
| ret = -5; | ret = -5; |
| goto makeReply; | goto makeReply; |
| } else | } else |
| Limit = sizeof(struct tagRPCCall); | Limit = sizeof(struct tagRPCCall); |
| tag = rpc->call_tag; | |
| hash = rpc->call_hash; | |
| /* RPC is OK! Go decapsulate variables ... */ | /* RPC is OK! Go decapsulate variables ... */ |
| if (rpc->call_argc) { | if (ntohs(rpc->call_argc)) { |
| arr = io_buffer2vals(buf + Limit, s->srv_netbuf - Limit, rpc->call_argc, 1); | arr = io_buffer2vals(buf + Limit, s->srv_netbuf - Limit, |
| ntohs(rpc->call_argc), 1); | |
| if (!arr) { | if (!arr) { |
| ret = -5; | ret = -5; |
| goto makeReply; | goto makeReply; |
| } | } |
| } | } else |
| arr = NULL; | |
| /* execute call */ | /* execute call */ |
| argc = 0; | argc = 0; |
| memcpy(&ses, &rpc->call_session, sizeof ses); | memcpy(&ses, &rpc->call_session, sizeof ses); |
| if (!(f = rpc_srv_getCall(s, rpc->call_tag, rpc->call_hash))) { | if (!(f = rpc_srv_getCall(s, ntohs(tag), ntohl(hash)))) { |
| rpc_SetErr(EPROGUNAVAIL, "Error:: call not found into RPC server ...\n"); | rpc_SetErr(EPROGUNAVAIL, "Error:: call not found into RPC server ...\n"); |
| ret = -6; | ret = -6; |
| } else | } else |
| Line 145 makeReply: | Line 152 makeReply: |
| Limit = sizeof(struct tagRPCRet); | Limit = sizeof(struct tagRPCRet); |
| memcpy(&rrpc->ret_session, &ses, sizeof(rpc_sess_t)); | memcpy(&rrpc->ret_session, &ses, sizeof(rpc_sess_t)); |
| rrpc->ret_tag = rpc->call_tag; | rrpc->ret_tag = tag; |
| rrpc->ret_hash = rpc->call_hash; | rrpc->ret_hash = hash; |
| rrpc->ret_errno = rpc_Errno; | rrpc->ret_errno = htonl(rpc_Errno); |
| rrpc->ret_retcode = ret; | rrpc->ret_retcode = htonl(ret); |
| rrpc->ret_argc = argc; | rrpc->ret_argc = htons(argc); |
| if (argc && arr) { | if (argc && arr) { |
| /* Go Encapsulate variables ... */ | /* Go Encapsulate variables ... */ |
| Line 437 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) | Line 444 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) |
| } else | } else |
| srv->srv_blob.state = kill; | srv->srv_blob.state = kill; |
| /* | |
| rpc_srv_unregisterCall(srv, NULL, CALL_BLOBSHUTDOWN); | rpc_srv_unregisterCall(srv, NULL, CALL_BLOBSHUTDOWN); |
| rpc_srv_unregisterCall(srv, NULL, CALL_BLOBCLIENTS); | rpc_srv_unregisterCall(srv, NULL, CALL_BLOBCLIENTS); |
| rpc_srv_unregisterCall(srv, NULL, CALL_BLOBVARS); | rpc_srv_unregisterCall(srv, NULL, CALL_BLOBVARS); |
| rpc_srv_unregisterCall(srv, NULL, CALL_BLOBSTATE); | rpc_srv_unregisterCall(srv, NULL, CALL_BLOBSTATE); |
| */ | |
| /* close all clients connections & server socket */ | /* close all clients connections & server socket */ |
| 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++) |
| Line 450 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) | Line 455 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) |
| shutdown(c->cli_sock, SHUT_RDWR); | shutdown(c->cli_sock, SHUT_RDWR); |
| close(srv->srv_blob.server.cli_sock); | close(srv->srv_blob.server.cli_sock); |
| pthread_mutex_lock(&srv->srv_blob.mtx); | |
| if (srv->srv_blob.clients) { | if (srv->srv_blob.clients) { |
| free(srv->srv_blob.clients); | free(srv->srv_blob.clients); |
| srv->srv_blob.clients = NULL; | srv->srv_blob.clients = NULL; |
| } | } |
| /* detach blobs */ | /* detach blobs */ |
| pthread_mutex_lock(&srv->srv_blob.mtx); | |
| while ((f = srv->srv_blob.blobs)) { | while ((f = srv->srv_blob.blobs)) { |
| srv->srv_blob.blobs = f->blob_next; | srv->srv_blob.blobs = f->blob_next; |
| rpc_srv_blobFree(srv, f); | rpc_srv_blobFree(srv, f); |
| Line 498 rpc_srv_loopBLOB(rpc_srv_t * __restrict srv) | Line 503 rpc_srv_loopBLOB(rpc_srv_t * __restrict srv) |
| if (!c->cli_sa.sa_family) | if (!c->cli_sa.sa_family) |
| break; | break; |
| if (i >= srv->srv_numcli) { | if (i >= srv->srv_numcli) { |
| usleep(1000000); | |
| #ifdef HAVE_PTHREAD_YIELD | #ifdef HAVE_PTHREAD_YIELD |
| pthread_yield(); | pthread_yield(); |
| #else | |
| usleep(1000000); | |
| #endif | #endif |
| continue; | continue; |
| } | } |
| Line 530 rpc_srv_loopBLOB(rpc_srv_t * __restrict srv) | Line 536 rpc_srv_loopBLOB(rpc_srv_t * __restrict srv) |
| pthread_detach(c->cli_tid); | pthread_detach(c->cli_tid); |
| } | } |
| srv->srv_blob.state = disable; | srv->srv_blob.state = kill; |
| return 0; | return 0; |
| } | } |
| Line 761 rpc_srv_loopServer(rpc_srv_t * __restrict srv) | Line 767 rpc_srv_loopServer(rpc_srv_t * __restrict srv) |
| if (!c->cli_sa.sa_family) | if (!c->cli_sa.sa_family) |
| break; | break; |
| if (i >= srv->srv_numcli) { | if (i >= srv->srv_numcli) { |
| usleep(1000000); | |
| #ifdef HAVE_PTHREAD_YIELD | #ifdef HAVE_PTHREAD_YIELD |
| pthread_yield(); | pthread_yield(); |
| #else | |
| usleep(1000000); | |
| #endif | #endif |
| continue; | continue; |
| } | } |
| Line 826 rpc_srv_execCall(rpc_func_t * __restrict call, struct | Line 833 rpc_srv_execCall(rpc_func_t * __restrict call, struct |
| func = dlsym(dl, (char*) call->func_name); | func = dlsym(dl, (char*) call->func_name); |
| if (func) | if (func) |
| ret = func(call, rpc->call_argc, args); | ret = func(call, ntohs(rpc->call_argc), args); |
| else { | else { |
| rpc_SetErr(ENOEXEC, "Error:: Can`t find function %s!\n", dlerror()); | rpc_SetErr(ENOEXEC, "Error:: Can`t find function %s!\n", dlerror()); |
| ret = -1; | ret = -1; |