Hide Forgot
Description of problem: getservbyname("nfsrdma", "tcp") should return name 'nfsrdma' port 20049 proto 'tcp' since that is one of the 3 nfsrdma entries in /etc/services $ grep nfsrdma /etc/services nfsrdma 20049/tcp # Network File System (NFS) over RDMA nfsrdma 20049/udp # Network File System (NFS) over RDMA nfsrdma 20049/sctp # Network File System (NFS) over RDMA but these are the values being returned name 'nfsrdma' port 20814 proto 'tcp' and you will note port 20814 does not exist in /etc/sevices Version-Release number of selected component (if applicable): glibc-2.17-105.el7.x86_64 How reproducible: 100% Steps to Reproduce: 1.Use the following reproducer #include <stdio.h> #include <netdb.h> main() { struct servent *sv = getservbyname("nfsrdma", "tcp"); if (sv) printf("name '%s' port %d proto '%s'\n", sv->s_name, sv->s_port, sv->s_proto); }
The returned port number is in network byte order. Use this instead: #include <stdio.h> #include <netdb.h> main() { struct servent *sv = getservbyname("nfsrdma", "tcp"); if (sv) printf("name '%s' port %d proto '%s'\n", sv->s_name, ntohs(sv->s_port), sv->s_proto); } It's unfortunate the two numbers are so close together, otherwise it would be easier to spot the mistake.
(In reply to Florian Weimer from comment #2) > The returned port number is in network byte order. Use this instead: > > #include <stdio.h> > #include <netdb.h> > > main() > { > struct servent *sv = getservbyname("nfsrdma", "tcp"); > > if (sv) > printf("name '%s' port %d proto '%s'\n", > sv->s_name, ntohs(sv->s_port), sv->s_proto); > } > > It's unfortunate the two numbers are so close together, otherwise it would > be easier to spot the mistake. Ah... Perfect... Thanks you!!!