version 1.15, 2014/01/28 14:05:43
|
version 1.15.6.1, 2014/12/11 01:15:34
|
Line 214 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
Line 214 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
{ |
{ |
struct pollfd pfd; |
struct pollfd pfd; |
int ret = 0, len = 0; |
int ret = 0, len = 0; |
|
ait_val_t v = AIT_VAL_INIT; |
|
struct ether_header *eh; |
|
|
|
if (type == SOCK_BPF && sa) { |
|
AIT_SET_BUF(&v, NULL, blen + sizeof(struct ether_header)); |
|
eh = (struct ether_header*) AIT_GET_BUF(&v); |
|
memcpy(eh->ether_dhost, LLADDR(&sa->sdl), ETHER_ADDR_LEN); |
|
eh->ether_type = htons(RPC_DEFPORT); |
|
memcpy(eh + 1, buf, blen); |
|
blen += sizeof(struct ether_header); |
|
} |
|
|
pfd.fd = sock; |
pfd.fd = sock; |
pfd.events = POLLOUT; |
pfd.events = POLLOUT; |
for (len = blen; len > 0; len -= ret, buf += ret) { |
for (len = blen; len > 0; len -= ret, buf += ret) { |
Line 228 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
Line 239 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
rpc_SetErr(EPIPE, "Disconnected RPC session\n"); |
rpc_SetErr(EPIPE, "Disconnected RPC session\n"); |
else |
else |
LOGERR; |
LOGERR; |
|
if (type == SOCK_BPF) |
|
AIT_FREE_VAL(&v); |
return -1; |
return -1; |
} |
} |
if (type == SOCK_STREAM) |
if (type == SOCK_STREAM) |
ret = send(sock, buf, len, flags); |
ret = send(sock, buf, len, flags); |
else if (sa) | else if (type == SOCK_BPF && sa) { |
| ret = write(sock, AIT_GET_BUF(&v), AIT_LEN(&v)); |
| } else if (sa) |
ret = sendto(sock, buf, len, flags, &sa->sa, sa->sa.sa_len); |
ret = sendto(sock, buf, len, flags, &sa->sa, sa->sa.sa_len); |
else { |
else { |
rpc_SetErr(EINVAL, "Invalid argument(s)!"); |
rpc_SetErr(EINVAL, "Invalid argument(s)!"); |
|
if (type == SOCK_BPF) |
|
AIT_FREE_VAL(&v); |
return -1; |
return -1; |
} |
} |
if (ret == -1) { |
if (ret == -1) { |
LOGERR; |
LOGERR; |
|
if (type == SOCK_BPF) |
|
AIT_FREE_VAL(&v); |
return -1; |
return -1; |
} |
} |
if (!ret) /* EOF */ | if (!ret) { /* EOF */ |
| if (type == SOCK_BPF) |
| AIT_FREE_VAL(&v); |
return 0; |
return 0; |
|
} |
} |
} |
ret = blen - len; |
ret = blen - len; |
if (ret != blen) { |
if (ret != blen) { |
rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, " |
rpc_SetErr(EPROCUNAVAIL, "RPC request, should be send %d bytes, " |
"really sended %d bytes", len, ret); | "really sended %d bytes", blen, ret); |
| if (type == SOCK_BPF) |
| AIT_FREE_VAL(&v); |
return -1; |
return -1; |
} |
} |
|
|
|
if (type == SOCK_BPF) |
|
AIT_FREE_VAL(&v); |
return ret; |
return ret; |
} |
} |