--- libaitrpc/src/srv.c 2015/07/22 20:01:46 1.28 +++ libaitrpc/src/srv.c 2016/08/02 10:39:50 1.28.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.28 2015/07/22 20:01:46 misho Exp $ +* $Id: srv.c,v 1.28.2.2 2016/08/02 10:39:50 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2015 +Copyright 2004 - 2016 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -312,8 +312,7 @@ rxPacket(sched_task_t *task) u_short crc; #endif u_char *buf = AIT_GET_BUF(&c->cli_buf); - u_char b[sizeof(struct tagRPCCall)]; - struct tagRPCCall *rpc = (struct tagRPCCall*) buf; + struct tagRPCCall b, *rpc = (struct tagRPCCall*) buf; #ifdef TCP_SESSION_TIMEOUT struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; @@ -323,9 +322,9 @@ rxPacket(sched_task_t *task) #endif /* prepare rx */ - len = recv(TASK_FD(task), b, sizeof b, MSG_PEEK); + len = recv(TASK_FD(task), &b, sizeof b, MSG_PEEK); if (len == sizeof b) - rlen = ntohl(((struct tagRPCCall*) b)->call_len); + rlen = ntohl(b.call_len); rlen = recv(TASK_FD(task), buf, rlen, 0); if (rlen == -1) { @@ -499,7 +498,7 @@ txUDPPacket(sched_task_t *task) /* send reply */ ret = sendto(TASK_FD(task), buf, wlen, MSG_NOSIGNAL, - &c->cli_sa.sa, c->cli_sa.sa.sa_len); + &c->cli_sa.sa, sizeof c->cli_sa.sa); if (ret == -1) { /* close connection */ schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], @@ -518,13 +517,15 @@ rxUDPPacket(sched_task_t *task) u_short crc; struct tagRPCCall *rpc; sockaddr_t sa; - socklen_t salen; + socklen_t salen = (u_char) MIN(sizeof(sockaddr_t), 0xff); struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; ait_val_t b = AIT_VAL_INIT; /* receive connect packet */ AIT_SET_BUF(&b, NULL, srv->srv_netbuf); - salen = sa.ss.ss_len = (u_char) MIN(sizeof(sockaddr_t), 0xff); +#ifndef __linux__ + sa.ss.ss_len = salen; +#endif rlen = recvfrom(TASK_FD(task), AIT_GET_BUF(&b), AIT_LEN(&b), 0, &sa.sa, &salen); rpc = (struct tagRPCCall*) AIT_GET_BUF(&b); if (rlen < sizeof(struct tagRPCCall)) @@ -639,7 +640,7 @@ txRAWPacket(sched_task_t *task) /* send reply */ ret = sendto(TASK_FD(task), buf, wlen, MSG_NOSIGNAL, - &c->cli_sa.sa, c->cli_sa.sa.sa_len); + &c->cli_sa.sa, sizeof c->cli_sa.sa); if (ret == -1) { /* close connection */ schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], @@ -658,13 +659,15 @@ rxRAWPacket(sched_task_t *task) u_short crc; struct tagRPCCall *rpc; sockaddr_t sa; - socklen_t salen; + socklen_t salen = (u_char) MIN(sizeof(sockaddr_t), 0xff); struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; ait_val_t b = AIT_VAL_INIT; /* receive connect packet */ AIT_SET_BUF(&b, NULL, srv->srv_netbuf); - salen = sa.ss.ss_len = (u_char) MIN(sizeof(sockaddr_t), 0xff); +#ifndef __linux__ + sa.ss.ss_len = salen; +#endif rlen = recvfrom(TASK_FD(task), AIT_GET_BUF(&b), AIT_LEN(&b), 0, &sa.sa, &salen); if (sa.sa.sa_family == AF_INET) { struct ip *h; @@ -744,6 +747,7 @@ end: static void * txBPFPacket(sched_task_t *task) { +#ifndef __linux__ rpc_cli_t *c = TASK_ARG(task); rpc_srv_t *s = c->cli_parent; rpc_func_t *f = NULL; @@ -812,6 +816,9 @@ txBPFPacket(sched_task_t *task) schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], TASK_ARG(task), 0, NULL, 0); } +#else + rpc_SetErr(ENOTSUP, "Feature isn't supported on Linux!"); +#endif taskExit(task, NULL); } @@ -819,6 +826,7 @@ txBPFPacket(sched_task_t *task) static void * rxBPFPacket(sched_task_t *task) { +#ifndef __linux__ rpc_srv_t *srv = TASK_ARG(task); rpc_cli_t *c = NULL; int len, rlen, noreply; @@ -902,6 +910,10 @@ rxBPFPacket(sched_task_t *task) end: AIT_FREE_VAL(&b); schedReadSelf(task); +#else + rpc_SetErr(ENOTSUP, "Feature isn't supported on Linux!"); +#endif + taskExit(task, NULL); } @@ -1333,7 +1345,7 @@ rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s return -1; } if (bind(srv->srv_blob.server.cli_sock, &srv->srv_blob.server.cli_sa.sa, - srv->srv_blob.server.cli_sa.sa.sa_len) == -1) { + sizeof srv->srv_blob.server.cli_sa.sa) == -1) { LOGERR; close(srv->srv_blob.server.cli_sock); AIT_FREE_VAL(&srv->srv_blob.dir); @@ -1573,7 +1585,7 @@ rpc_srv_initServer(u_char InstID, int concurentClients goto err; } if (bind(srv->srv_server.cli_sock, &srv->srv_server.cli_sa.sa, - srv->srv_server.cli_sa.sa.sa_len) == -1) { + sizeof srv->srv_server.cli_sa.sa) == -1) { LOGERR; goto err; } else @@ -1730,6 +1742,7 @@ rpc_srv_execCall(rpc_cli_t * __restrict cli, struct ta rpc_srv_t * rpc_srv_initServer2(u_char InstID, int concurentClients, int netBuf, const char *csIface) { +#ifndef __linux__ int n = 1; rpc_srv_t *srv = NULL; sockaddr_t sa = E_SOCKADDR_INIT; @@ -1856,6 +1869,10 @@ err: /* error condition */ schedEnd(&srv->srv_root); pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); +#else + rpc_SetErr(ENOTSUP, "Feature isn't supported on Linux!"); +#endif + return NULL; }