--- libaitrpc/src/srv.c 2010/06/18 01:48:06 1.1.1.1 +++ libaitrpc/src/srv.c 2010/06/23 07:50:01 1.1.1.1.2.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.1.1.1 2010/06/18 01:48:06 misho Exp $ +* $Id: srv.c,v 1.1.1.1.2.3 2010/06/23 07:50:01 misho Exp $ * *************************************************************************/ #include "global.h" @@ -74,8 +74,8 @@ rpc_srv_dispatchCall(void *arg) v[i].val.string = (int8_t*) data; data += v[i].val_len + 1; break; - case array: - v[i].val.array = (int8_t**) data; + case blob: + v[i].val.blob = (int8_t**) data; data += v[i].val_len; break; default: @@ -135,7 +135,7 @@ rpc_srv_dispatchCall(void *arg) data += vals[i].val_len + 1; Limit += vals[i].val_len + 1; break; - case array: + case blob: if (ret || Limit + vals[i].val_len > BUFSIZ) { rpc_SetErr(EMSGSIZE, "Error:: in prepare RPC packet (-7) ...\n"); rrpc.ret_retcode = ret = -7; @@ -143,7 +143,7 @@ rpc_srv_dispatchCall(void *arg) break; } - memcpy(data, vals[i].val.array, vals[i].val_len); + memcpy(data, vals[i].val.blob, vals[i].val_len); data += vals[i].val_len; Limit += vals[i].val_len; break; @@ -243,6 +243,7 @@ rpc_srv_initServer(u_int regProgID, u_int regProcID, i srv->srv_session.sess_program = regProgID; srv->srv_session.sess_process = regProcID; + srv->srv_server.cli_tid = pthread_self(); srv->srv_server.cli_parent = srv; if (family == AF_INET) memcpy(&srv->srv_server.cli_sa, &sin, sizeof srv->srv_server.cli_sa); @@ -276,9 +277,12 @@ rpc_srv_initServer(u_int regProgID, u_int regProcID, i } else memset(srv->srv_clients, 0, srv->srv_numcli * sizeof(rpc_cli_t)); + rpc_srv_registerCall(srv, NULL, CALL_SRVSHUTDOWN, 0); rpc_srv_registerCall(srv, NULL, CALL_SRVCLIENTS, 0); rpc_srv_registerCall(srv, NULL, CALL_SRVCALLS, 0); rpc_srv_registerCall(srv, NULL, CALL_SRVSESSIONS, 0); + + pthread_mutex_init(&rpc_mtx, NULL); return srv; } @@ -299,6 +303,8 @@ rpc_srv_endServer(rpc_srv_t * __restrict srv) return; } + pthread_mutex_destroy(&rpc_mtx); + while ((f = srv->srv_funcs)) { srv->srv_funcs = f->func_next; free(f); @@ -329,6 +335,9 @@ rpc_srv_execServer(rpc_srv_t * __restrict srv) socklen_t salen = sizeof(struct sockaddr); register int i; rpc_cli_t *c; + fd_set fds; + int ret; + struct timeval tv = { DEF_RPC_TIMEOUT, 0 }; if (!srv) { rpc_SetErr(EINVAL, "Error:: Invalid parameter can`t start RPC server ...\n"); @@ -340,7 +349,7 @@ rpc_srv_execServer(rpc_srv_t * __restrict srv) return -1; } - while (42) { + while (!rpc_Kill) { for (c = srv->srv_clients, i = 0; i < srv->srv_numcli && c; i++, c++) if (!c->cli_sa.sa_family) break; @@ -348,9 +357,20 @@ rpc_srv_execServer(rpc_srv_t * __restrict srv) usleep(1000000); continue; } + + FD_ZERO(&fds); + FD_SET(srv->srv_server.cli_sock, &fds); + ret = select(srv->srv_server.cli_sock + 1, &fds, NULL, NULL, &tv); + if (ret == -1) { + LOGERR; + ret = 1; + break; + } + if (!ret) + continue; + c->cli_sock = accept(srv->srv_server.cli_sock, &c->cli_sa, &salen); if (c->cli_sock == -1) { - printf("%s(%d): #%d - %s\n", __func__, __LINE__, errno, strerror(errno)); LOGERR; continue; } else @@ -362,7 +382,6 @@ rpc_srv_execServer(rpc_srv_t * __restrict srv) } } - /* not reached !!! */ return 0; }