version 1.10, 2013/05/30 09:22:01
|
version 1.10.10.1, 2013/08/23 13:13:07
|
Line 139 rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
Line 139 rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
|
|
return 0; |
return 0; |
} |
} |
|
|
|
/* |
|
* rpc_Read() - RPC read operation |
|
* |
|
* @sock = socket |
|
* @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 |
|
*/ |
|
ssize_t |
|
rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, |
|
u_char * __restrict buf, size_t blen) |
|
{ |
|
struct pollfd pfd; |
|
sockaddr_t sa2; |
|
socklen_t salen; |
|
int ret = 0, len; |
|
|
|
pfd.fd = sock; |
|
pfd.events = POLLIN | POLLPRI; |
|
memset(buf, 0, blen); |
|
memset(&sa2, 0, sizeof sa2); |
|
salen = sa2.ss.ss_len = sizeof(sockaddr_t); |
|
|
|
if (type == SOCK_STREAM) { |
|
for (len = blen; len > 0; len -= ret, buf += ret) { |
|
if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
|
pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
|
LOGERR; |
|
return -1; |
|
} else |
|
ret = recv(sock, buf, len, flags); |
|
if (ret == -1) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} |
|
if (ret > -1) |
|
ret = blen - len; |
|
} else { |
|
do { |
|
if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
|
pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
|
LOGERR; |
|
return -1; |
|
} else |
|
ret = recvfrom(sock, buf, blen, flags, &sa2.sa, &salen); |
|
if (ret < 0) { |
|
LOGERR; |
|
return -1; |
|
} |
|
if (e_addrcmp(sa, &sa2, 42)) |
|
rpc_SetErr(ERPCMISMATCH, "Received RPC response from unknown address"); |
|
else |
|
break; |
|
} while (42); |
|
} |
|
|
|
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; |
|
|
|
if (type == SOCK_STREAM) { |
|
for (len = blen; len > 0; len -= ret, buf += ret) { |
|
if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
|
pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
|
LOGERR; |
|
return -1; |
|
} else |
|
ret = send(sock, buf, len, flags); |
|
if (ret == -1) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} |
|
if (ret > -1) |
|
ret = blen - len; |
|
} else if (sa) { |
|
if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
|
pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
|
LOGERR; |
|
return -1; |
|
} else |
|
ret = sendto(sock, buf, blen, flags, &sa->sa, sa->sa.sa_len); |
|
} else { |
|
rpc_SetErr(EINVAL, "Invalid argument(s)!"); |
|
return -1; |
|
} |
|
if (ret == -1) { |
|
LOGERR; |
|
return -1; |
|
} else if (ret != blen) { |
|
rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, " |
|
"really sended %d bytes", len, ret); |
|
return -1; |
|
} |
|
|
|
return ret; |
|
} |