|
version 1.5.6.4, 2012/05/15 22:47:10
|
version 1.13.4.1, 2013/12/12 23:21:38
|
|
Line 12 terms:
|
Line 12 terms:
|
| All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
| |
|
| Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 | Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 |
| by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
| |
|
| Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
|
Line 51 SUCH DAMAGE.
|
Line 51 SUCH DAMAGE.
|
| int rpc_Errno; |
int rpc_Errno; |
| char rpc_Error[STRSIZ]; |
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 |
#pragma GCC visibility pop |
| |
|
| // rpc_GetErrno() Get error code of last operation |
// rpc_GetErrno() Get error code of last operation |
| inline int | int |
| rpc_GetErrno() |
rpc_GetErrno() |
| { |
{ |
| return rpc_Errno; |
return rpc_Errno; |
| } |
} |
| |
|
| // rpc_GetError() Get error text of last operation |
// rpc_GetError() Get error text of last operation |
| inline const char * | const char * |
| rpc_GetError() |
rpc_GetError() |
| { |
{ |
| return rpc_Error; |
return rpc_Error; |
| } |
} |
| |
|
| // rpc_SetErr() Set error to variables for internal use!!! |
// rpc_SetErr() Set error to variables for internal use!!! |
| inline void | void |
| rpc_SetErr(int eno, char *estr, ...) |
rpc_SetErr(int eno, char *estr, ...) |
| { |
{ |
| va_list lst; |
va_list lst; |
| |
|
| rpc_Errno = eno; |
rpc_Errno = eno; |
| memset(rpc_Error, 0, STRSIZ); | memset(rpc_Error, 0, sizeof rpc_Error); |
| va_start(lst, estr); |
va_start(lst, estr); |
| vsnprintf(rpc_Error, STRSIZ, estr, lst); | vsnprintf(rpc_Error, sizeof rpc_Error, estr, lst); |
| va_end(lst); |
va_end(lst); |
| } |
} |
| |
|
|
Line 88 rpc_SetErr(int eno, char *estr, ...)
|
Line 107 rpc_SetErr(int eno, char *estr, ...)
|
| * @s = active session |
* @s = active session |
| * return: -1, 1, 2, 3 are errors or 0 ok |
* return: -1, 1, 2, 3 are errors or 0 ok |
| */ |
*/ |
| inline int | int |
| rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s) |
rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s) |
| { |
{ |
| if (!p || !s) |
if (!p || !s) |
|
Line 96 rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
Line 115 rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
| |
|
| if (p->sess_version != s->sess_version) |
if (p->sess_version != s->sess_version) |
| return 1; |
return 1; |
| if (ntohl(p->sess_program) != s->sess_program) | if (p->sess_instance != s->sess_instance) |
| return 2; |
return 2; |
| if (p->sess_process != s->sess_process) |
|
| return 3; |
|
| |
|
| return 0; |
return 0; |
| } |
} |
|
Line 111 rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
Line 128 rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
| * @s = host session |
* @s = host session |
| * return: -1 error or 0 ok |
* return: -1 error or 0 ok |
| */ |
*/ |
| inline int | int |
| rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s) |
rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s) |
| { |
{ |
| if (!p || !s) |
if (!p || !s) |
| return -1; |
return -1; |
| |
|
| p->sess_version = s->sess_version; |
p->sess_version = s->sess_version; |
| p->sess_program = htonl(s->sess_program); | p->sess_instance = s->sess_instance; |
| p->sess_process = s->sess_process; | |
| |
|
| return 0; |
return 0; |
| } |
} |
| |
|
| /* |
/* |
| * rpc_register_srvServices() - Register internal service functions | * rpc_Read() - RPC read operation |
| * |
* |
| * @srv = RPC server instance | * @sock = socket |
| * return: -1 error or 0 ok | * @type = type of socket |
| | * @flags = receive flags |
| | * @sa = check client address, if you use udp protocol |
| | * @buf = buffer |
| | * @blen = buffer length |
| | * return: -1 error or >-1 readed bytes into buffer |
| */ |
*/ |
| int | ssize_t |
| rpc_register_srvServices(rpc_srv_t * __restrict srv) | rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, |
| | u_char * __restrict buf, size_t blen) |
| { |
{ |
| if (!srv) | struct pollfd pfd; |
| return -1; | sockaddr_t sa2; |
| | socklen_t salen; |
| | int ret = 0, len; |
| |
|
| rpc_srv_registerCall(srv, crcFletcher16((u_short*) CALL_SRVSHUTDOWN, | pfd.fd = sock; |
| strlen(CALL_SRVSHUTDOWN) / 2), CALL_SRVSHUTDOWN, 0); | pfd.events = POLLIN | POLLPRI; |
| rpc_srv_registerCall(srv, crcFletcher16((u_short*) CALL_SRVCLIENTS, | memset(buf, 0, blen); |
| strlen(CALL_SRVCLIENTS) / 2), CALL_SRVCLIENTS, 1); | memset(&sa2, 0, sizeof sa2); |
| rpc_srv_registerCall(srv, crcFletcher16((u_short*) CALL_SRVSESSIONS, | salen = sa2.ss.ss_len = sizeof(sockaddr_t); |
| strlen(CALL_SRVSESSIONS) / 2), CALL_SRVSESSIONS, 4); | |
| rpc_srv_registerCall(srv, crcFletcher16((u_short*) CALL_SRVCALLS, | |
| strlen(CALL_SRVCALLS) / 2), CALL_SRVCALLS, 1); | |
| |
|
| return 0; | for (len = blen; len > 0; len -= ret, buf += ret) { |
| | if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
| | pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
| | if (ret) |
| | LOGERR; |
| | else |
| | rpc_SetErr(ETIMEDOUT, "Timeout reached! Server not respond"); |
| | return -1; |
| | } |
| | if (type == SOCK_STREAM) |
| | ret = recv(sock, buf, len, flags); |
| | else { |
| | ret = recvfrom(sock, buf, len, flags, &sa2.sa, &salen); |
| | if (ret > -1 && sa && e_addrcmp(sa, &sa2, 42)) { |
| | rpc_SetErr(ERPCMISMATCH, |
| | "Received RPC response from unknown address"); |
| | return -1; |
| | } |
| | } |
| | if (ret == -1) { |
| | LOGERR; |
| | return -1; |
| | } |
| | } |
| | ret = blen - len; |
| | |
| | return ret; |
| | } |
| | |
| | /* |
| | * rpc_Write() - RPC write operation |
| | * |
| | * @sock = socket |
| | * @type = type of socket |
| | * @flags = send flags |
| | * @sa = send to client address, if you use udp protocol |
| | * @buf = buffer |
| | * @blen = buffer length |
| | * return: -1 error or >-1 written bytes into buffer |
| | */ |
| | ssize_t |
| | rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, |
| | u_char * __restrict buf, size_t blen) |
| | { |
| | struct pollfd pfd; |
| | int ret = 0, len = 0; |
| | |
| | pfd.fd = sock; |
| | pfd.events = POLLOUT; |
| | for (len = blen; len > 0; len -= ret, buf += ret) { |
| | if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
| | pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
| | #if 0 |
| | if (!ret) |
| | continue; |
| | #endif |
| | if (ret > 0) |
| | rpc_SetErr(EPIPE, "Disconnected RPC session\n"); |
| | else |
| | LOGERR; |
| | return -1; |
| | } |
| | if (type == SOCK_STREAM) |
| | ret = send(sock, buf, len, flags); |
| | else if (sa) |
| | ret = sendto(sock, buf, len, flags, &sa->sa, sa->sa.sa_len); |
| | else { |
| | rpc_SetErr(EINVAL, "Invalid argument(s)!"); |
| | return -1; |
| | } |
| | if (ret == -1) { |
| | LOGERR; |
| | return -1; |
| | } |
| | } |
| | ret = blen - len; |
| | if (ret != blen) { |
| | rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, " |
| | "really sended %d bytes", len, ret); |
| | return -1; |
| | } |
| | |
| | return ret; |
| } |
} |