|
From: Petr V. <pv...@su...> - 2020-05-18 21:38:51
|
Hi Steve,
any idea, why this simple source works with recent libtirpc but don't with
glibc implementation (tested on 2.22 and 2.19, on different distros)?
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
#define PROCNUM 1
#define VERSNUM 1
int main(int argn __attribute__ ((unused)), char *argc[])
{
int progNum = atoi(argc[2]);
int port = 600;
pmap_unset(progNum, VERSNUM);
return !pmap_set(progNum, VERSNUM, IPPROTO_UDP, port);
}
$ rpc_pmap_set 10.0.0.2 536875000
Cannot register service: RPC: Unable to receive; errno = Connection refused
rpcbind is running
$ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100024 1 udp 53081 status
100024 1 tcp 51885 status
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 49535 nlockmgr
100021 3 udp 49535 nlockmgr
100021 4 udp 49535 nlockmgr
100021 1 tcp 43869 nlockmgr
100021 3 tcp 43869 nlockmgr
100021 4 tcp 43869 nlockmgr
glibc strace:
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 5
bind(5, {sa_family=AF_INET, sin_port=htons(769), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(769), sin_addr=inet_addr("0.0.0.0")}, [16]) = 0
setsockopt(5, SOL_IP, IP_PKTINFO, [1], 4) = 0
futex(0x7fc08689ee80, FUTEX_WAKE_PRIVATE, 2147483647) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE) = 6
bind(6, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(6, {sa_family=AF_NETLINK, pid=2289, groups=00000000}, [12]) = 0
sendto(6, "\24\0\0\0\22\0\1\3\"\362\302^\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(6, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\374\4\0\0\20\0\2\0\"\362\302^\361\10\0\0\0\0\4\3\1\0\0\0I\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 2596
recvmsg(6, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\"\362\302^\361\10\0\0\0\0\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
sendto(6, "\24\0\0\0\26\0\1\3#\362\302^\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(6, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"L\0\0\0\24\0\2\0#\362\302^\361\10\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 164
recvmsg(6, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"H\0\0\0\24\0\2\0#\362\302^\361\10\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 216
recvmsg(6, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0#\362\302^\361\10\0\0\0\0\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(6) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_UDP) = 6
bind(6, {sa_family=AF_INET, sin_port=htons(769), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (Address already in use)
bind(6, {sa_family=AF_INET, sin_port=htons(770), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
setsockopt(6, SOL_IP, IP_RECVERR, [1], 4) = 0
sendto(6, "\31|\347?\0\0\0\0\0\0\0\2\0\1\206\240\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0"..., 56, 0, {sa_family=AF_INET, sin_port=htons(111), sin_addr=inet_addr("127.0.0.1")}, 16) = 56
poll([{fd=6, events=POLLIN}], 1, 5000) = 1 ([{fd=6, revents=POLLERR}])
recvmsg(6, {msg_name(16)={sa_family=AF_INET, sin_port=htons(111), sin_addr=inet_addr("127.0.0.1")}, msg_iov(1)=[{"\31|\347?\0\0\0\0\0\0\0\2\0\1\206\240\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0"..., 56}], msg_controllen=48, [{cmsg_len=48, cmsg_level=SOL_IP, cmsg_type=11, ...}], msg_flags=MSG_ERRQUEUE}, MSG_ERRQUEUE) = 56
write(2, "Cannot register service: RPC: Un"..., 76Cannot register service: RPC: Unable to receive; errno = Connection refused
) = 76
close(6) = 0
libtirpc strace:
openat(AT_FDCWD, "/etc/netconfig", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=767, ...}) = 0
read(5, "#\n# The network configuration fi"..., 4096) = 767
close(5) = 0
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) = 5
openat(AT_FDCWD, "/etc/bindresvport.blacklist", O_RDONLY) = 6
fstat(6, {st_mode=S_IFREG|0644, st_size=415, ...}) = 0
read(6, "#\n# This file contains a list of"..., 4096) = 415
read(6, "", 4096) = 0
close(6) = 0
getpid() = 2609
bind(5, {sa_family=AF_INET, sin_port=htons(665), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(5, 128) = -1 EOPNOTSUPP (Operation not supported)
getsockname(5, {sa_family=AF_INET, sin_port=htons(665), sin_addr=inet_addr("0.0.0.0")}, [128->16]) = 0
getsockopt(5, SOL_SOCKET, SO_TYPE, [2], [4]) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(665), sin_addr=inet_addr("0.0.0.0")}, [128->16]) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(665), sin_addr=inet_addr("0.0.0.0")}, [128->16]) = 0
getsockopt(5, SOL_SOCKET, SO_TYPE, [2], [4]) = 0
getsockname(5, {sa_family=AF_INET, sin_port=htons(665), sin_addr=inet_addr("0.0.0.0")}, [128->16]) = 0
setsockopt(5, SOL_IP, IP_PKTINFO, [1], 4) = 0
prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=4*1024}) = 0
openat(AT_FDCWD, "/etc/netconfig", O_RDONLY) = 6
fstat(6, {st_mode=S_IFREG|0644, st_size=767, ...}) = 0
read(6, "#\n# The network configuration fi"..., 4096) = 767
close(6) = 0
socket(AF_UNIX, SOCK_STREAM, 0) = 6
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
getpeername(6, 0x7ffeee229180, [128]) = -1 ENOTCONN (Transport endpoint is not connected)
connect(6, {sa_family=AF_UNIX, sun_path="/run/rpcbind.sock"}, 19) = 0
getsockname(6, {sa_family=AF_UNIX}, [128->2]) = 0
getsockopt(6, SOL_SOCKET, SO_TYPE, [1], [4]) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
getpid() = 2609
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
geteuid() = 0
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
write(6, "\200\0\0P\257\350m\234\0\0\0\0\0\0\0\2\0\1\206\240\0\0\0\3\0\0\0\1\0\0\0\0"..., 84) = 84
poll([{fd=6, events=POLLIN}], 1, 60000) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\200\0\0\34\257\350m\234\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1", 9000) = 32
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
close(6) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
Thanks a lot for a tip.
Kind regards,
Petr
|