POSIXのIssue 7が削除されたため、マシンの正規ホスト名を取得することがgethostbyname
できなくなりました。代わりに使用しようとしましたが、次のように指定されました。gethostbyname("my_hostname")
getnameinfo
/etc/hosts
127.0.0.1 localhost
127.0.0.1 my_hostname.fqdn my_hostname
戻ってきましたlocalhost
(当然です)。ただし、gethostbyname("my_hostname")
戻りますmy_hostname.fqdn
(少なくとも musl と glibc の両方で)。
問題 7 の私のユースケースに適切な代替手段はありますか、それとも運が悪いのでしょうか?
答え1
Solaris のマニュアルページから:
DESCRIPTION
These functions are used to obtain entries describing hosts.
An entry can come from any of the sources for hosts speci-
fied in the /etc/nsswitch.conf file. See nsswitch.conf(4).
These functions have been superseded by
getipnodebyname(3SOCKET), getipnodebyaddr(3SOCKET), and
getaddrinfo(3SOCKET), which provide greater portability to
applications when multithreading is performed or technolo-
gies such as IPv6 are used. For example, the functions
described in the following cannot be used with applications
targeted to work with IPv6.
ご覧のとおり、この関数はgetaddrinfo()
POSIX 標準にも含まれており、サポートされています...
答え2
現在のPOSIX準拠の方法で、現在のホストの「正規の」FQDNを判定するには、次のようにします。gethostname()
設定されたホスト名を決定するには、getaddrinfo()
対応するアドレス情報を決定します。
エラーを無視する:
char buf[256];
struct addrinfo *res, *cur;
struct addrinfo hints = {0};
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_CANONNAME;
hints.ai_socktype = SOCK_DGRAM;
gethostname(buf, sizeof(buf));
getaddrinfo(buf, 0, &hints, &res);
for (cur = res; cur; cur = cur->ai_next) {
printf("Host name: %s\n", cur->ai_canonname);
}
結果はシステムとリゾルバの構成に大きく依存します。