POSIX 2018 で自分自身の FQDN をクエリする方法

POSIX 2018 で自分自身の FQDN をクエリする方法

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);
}

結果はシステムとリゾルバの構成に大きく依存します。

関連情報