--- libaitrpc/src/srv.c 2015/06/24 22:39:32 1.26.2.2 +++ libaitrpc/src/srv.c 2015/06/25 22:39:05 1.26.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.26.2.2 2015/06/24 22:39:32 misho Exp $ +* $Id: srv.c,v 1.26.2.5 2015/06/25 22:39:05 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -212,8 +212,6 @@ txPacket(sched_task_t *task) /* Go Encapsulate variables */ ret = ait_vars2buffer(buf + wlen, AIT_LEN(&c->cli_buf) - wlen, RPC_RETVARS(c)); - /* Free return values */ - ait_freeVars(&c->cli_vars); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); @@ -225,6 +223,9 @@ txPacket(sched_task_t *task) } } + /* Free return values */ + ait_freeVars(&c->cli_vars); + rpc->call_len = htonl(wlen); rpc->call_io = RPC_ACK; @@ -303,6 +304,7 @@ execCall(sched_task_t *task) rpc->call_rep.eno = RPC_ERROR(rpc_Errno); } rpc->call_argc ^= rpc->call_argc; + ait_freeVars(&c->cli_vars); } else { rpc->call_rep.eno ^= rpc->call_rep.eno; if (argc) { @@ -501,8 +503,6 @@ txUDPPacket(sched_task_t *task) /* Go Encapsulate variables */ ret = ait_vars2buffer(buf + wlen, AIT_LEN(&c->cli_buf) - wlen, RPC_RETVARS(c)); - /* Free return values */ - ait_freeVars(&c->cli_vars); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; @@ -513,6 +513,9 @@ txUDPPacket(sched_task_t *task) } } + /* Free return values */ + ait_freeVars(&c->cli_vars); + rpc->call_len = htonl(wlen); rpc->call_io = RPC_ACK; @@ -693,8 +696,6 @@ txRAWPacket(sched_task_t *task) /* Go Encapsulate variables */ ret = ait_vars2buffer(buf + wlen, AIT_LEN(&c->cli_buf) - wlen, RPC_RETVARS(c)); - /* Free return values */ - ait_freeVars(&c->cli_vars); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; @@ -705,6 +706,9 @@ txRAWPacket(sched_task_t *task) } } + /* Free return values */ + ait_freeVars(&c->cli_vars); + rpc->call_len = htonl(wlen); rpc->call_io = RPC_ACK; @@ -866,8 +870,6 @@ txBPFPacket(sched_task_t *task) /* Go Encapsulate variables */ ret = ait_vars2buffer(buf + wlen, AIT_LEN(&c->cli_buf) - wlen, RPC_RETVARS(c)); - /* Free return values */ - ait_freeVars(&RPC_RETVARS(c)); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; @@ -878,6 +880,9 @@ txBPFPacket(sched_task_t *task) } } + /* Free return values */ + ait_freeVars(&RPC_RETVARS(c)); + rpc->call_len = htonl(wlen); rpc->call_io = RPC_ACK; @@ -1036,8 +1041,6 @@ txEXTPacket(sched_task_t *task) /* Go Encapsulate variables */ ret = ait_vars2buffer(buf + wlen, AIT_LEN(&c->cli_buf) - wlen, RPC_RETVARS(c)); - /* Free return values */ - ait_freeVars(&RPC_RETVARS(c)); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); rpc->call_argc ^= rpc->call_argc; @@ -1048,6 +1051,9 @@ txEXTPacket(sched_task_t *task) } } + /* Free return values */ + ait_freeVars(&RPC_RETVARS(c)); + rpc->call_len = htonl(wlen); rpc->call_io = RPC_ACK; @@ -1478,6 +1484,9 @@ rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) srv->srv_blob.kill = 1; schedEnd(&srv->srv_blob.root); + + if (srv->srv_blob.server.cli_sa.sa.sa_family == AF_LOCAL) + unlink(srv->srv_blob.server.cli_sa.sun.sun_path); } /* @@ -1579,7 +1588,7 @@ rpc_srv_initServer(u_char InstID, int concurentClients rpc_SetErr(EINVAL, "Invalid parameters can`t init RPC server"); return NULL; } - if (!Port) + if (!Port && proto < SOCK_RAW) Port = RPC_DEFPORT; if (!e_gethostbyname(csHost, Port, &sa)) return NULL; @@ -1700,6 +1709,9 @@ rpc_srv_endServer(rpc_srv_t ** __restrict psrv) sleep(RPC_SCHED_POLLING); schedEnd(&(*psrv)->srv_root); + + if ((*psrv)->srv_server.cli_sa.sa.sa_family == AF_LOCAL) + unlink((*psrv)->srv_server.cli_sa.sun.sun_path); pthread_mutex_destroy(&(*psrv)->srv_funcs.mtx); e_free(*psrv);