--- libaitrpc/src/aitrpc.c 2015/06/28 21:40:45 1.18.2.1 +++ libaitrpc/src/aitrpc.c 2024/03/20 16:32:35 1.21.4.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitrpc.c,v 1.18.2.1 2015/06/28 21:40:45 misho Exp $ +* $Id: aitrpc.c,v 1.21.4.1 2024/03/20 16:32:35 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 - 2024 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -51,25 +51,6 @@ SUCH DAMAGE. int rpc_Errno; char rpc_Error[STRSIZ]; -inline int -rpc_funcs_cmp(struct tagRPCFunc *a, struct tagRPCFunc *b) -{ - int ret; - - assert(a && b); - - ret = AIT_KEY(&a->func_name) - AIT_KEY(&b->func_name); - - if (ret < 0) - return -1; - else if (ret > 0) - return 1; - - return ret; -} - -AVL_GENERATE(tagRPCFuncs, tagRPCFunc, func_node, rpc_funcs_cmp); - #pragma GCC visibility pop // rpc_GetErrno() Get error code of last operation @@ -157,20 +138,24 @@ rpc_Read(int sock, int type, int flags, sockaddr_t * _ sockaddr_t sa2; socklen_t salen; int ret = 0, hlen, cx = 0; - struct ether_header *eh; - struct bpf_hdr *h; - ether_addr_t bcst = {{ [0 ... sizeof bcst - 1] = 0xff }}; u_char *buf = AIT_GET_BUF(pkt); size_t blen = AIT_LEN(pkt); struct tagRPCCall *rpc = (struct tagRPCCall *) buf; +#ifndef __linux__ + struct ether_header *eh; + struct bpf_hdr *h; ait_val_t v = AIT_VAL_INIT; +#endif try2read: pfd.fd = sock; pfd.events = POLLIN | POLLPRI; memset(buf, 0, blen); memset(&sa2, 0, sizeof sa2); - salen = sa2.ss.ss_len = sizeof(sockaddr_t); + salen = E_SOCKADDR_MAX; +#ifndef __linux__ + sa2.ss.ss_len = salen; +#endif if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { if (ret) @@ -187,6 +172,7 @@ try2read: case SOCK_EXT: ret = read(sock, buf, blen); break; +#ifndef __linux__ case SOCK_BPF: if (!sa) { rpc_SetErr(EINVAL, "Invalid argument(s)!"); @@ -236,6 +222,7 @@ try2read: AIT_FREE_VAL(&v); } break; +#endif case SOCK_RAW: case SOCK_DGRAM: if (!sa) { @@ -266,8 +253,13 @@ try2read: /* check RPC packet header */ if (type == SOCK_RAW) { +#ifdef IPV6_REMOVE_HEADER hlen = sa->sa.sa_family == AF_INET ? sizeof(struct ip) : sizeof(struct ip6_hdr); +#else + hlen = sa->sa.sa_family == AF_INET ? + sizeof(struct ip) : 0; +#endif ret -= hlen; if (ret > 0) memmove(buf, buf + hlen, blen - hlen); @@ -311,8 +303,10 @@ rpc_Write(int sock, int type, int flags, sockaddr_t * struct pollfd pfd; int ret = 0; u_char *buf = AIT_GET_BUF(pkt); +#ifndef __linux__ ait_val_t v = AIT_VAL_INIT; struct ether_header *eh; +#endif pfd.fd = sock; @@ -333,6 +327,7 @@ rpc_Write(int sock, int type, int flags, sockaddr_t * case SOCK_EXT: ret = write(sock, buf, blen); break; +#ifndef __linux__ case SOCK_BPF: if (!sa) { rpc_SetErr(EINVAL, "Invalid argument(s)!"); @@ -350,6 +345,7 @@ rpc_Write(int sock, int type, int flags, sockaddr_t * AIT_FREE_VAL(&v); break; +#endif case SOCK_RAW: case SOCK_DGRAM: if (!sa) { @@ -357,7 +353,7 @@ rpc_Write(int sock, int type, int flags, sockaddr_t * return -1; } - ret = sendto(sock, buf, blen, flags, &sa->sa, sa->sa.sa_len); + ret = sendto(sock, buf, blen, flags, &sa->sa, e_addrlen(sa)); break; default: rpc_SetErr(EINVAL, "Invalid argument(s)!"); @@ -377,4 +373,16 @@ rpc_Write(int sock, int type, int flags, sockaddr_t * } return ret; +} + +/* + * rpc_pktFreeSpace() - Get free space for payload into RPC packet + * + * @c = RPC client + * return: remains free bytes from packet + */ +size_t +rpc_pktFreeSpace(rpc_cli_t * __restrict c) +{ + return (sizeof(struct tagRPCCall) + ait_resideVars(RPC_RETVARS(c))); }