.\" Copyright (C) 2014 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH INET_NET_PTON 3 2020\-06\-09 Linux "Linux Programmer's Manual" .SH 名前 inet_net_pton, inet_net_ntop \- インターネットのネットワーク番号の変換 .SH 書式 .nf \fB#include \fP .PP \fBint inet_net_pton(int \fP\fIaf\fP\fB, const char *\fP\fIpres\fP\fB,\fP \fB void *\fP\fInetp\fP\fB, size_t \fP\fInsize\fP\fB);\fP \fBchar *inet_net_ntop(int \fP\fIaf\fP\fB, const void *\fP\fInetp\fP\fB, int \fP\fIbits\fP\fB,\fP \fB char *\fP\fIpres\fP\fB, size_t \fP\fIpsize\fP\fB);\fP .fi .PP \fI\-lresolv\fP でリンクする。 .PP .RS -4 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): .RE .PP \fBinet_net_pton\fP(), \fBinet_net_ntop\fP(): .ad l .RS 4 .PD 0 .TP 4 glibc 2.20 以降: _DEFAULT_SOURCE .TP 4 glibc 2.20 より前: _BSD_SOURCE || _SVID_SOURCE .PD .RE .ad b .SH 説明 これらの関数は (印字可能な) 表記形式とネットワーク形式 (バイナリー形式) 間の変換を行う。 .PP どちらの関数でも \fIaf\fP は変換を行うアドレスファミリーを指定する。 サポートされている値は \fBAF_INET\fP だけである。 .SS inet_net_pton() \fBinet_net_pton\fP() 関数は、 表記形式でインターネットネットワーク番号を格納した NULL 終端された文字列である \fIpres\fP をネットワーク形式に変換する。 ネットワークバイトオーダーの変換結果は \fInetp\fP が指すバッファーに格納される (\fInetp\fP 引数は通常 \fIin_addr\fP 構造体を指している)。 \fInsize\fP 引数は \fInetp\fP で利用可能なバイト数を示す。 .PP 成功すると \fBinet_net_pton\fP() は \fInetp\fP に格納した結果のネットワーク番号フィールドのビット数を返す。 入力の表記形式と返り値に関する議論は「注意」の節を参照。 .PP \fI注意\fP: \fInetp\fP が指すバッファーは \fBinet_net_pton\fP() の呼び出し前に 0 で埋めるべきである。 呼び出しではネットワーク番号で必要なバイトだけが書き込まれ、 そのバイト数は完全なネットワークアドレスのバイト数よりも少ないこともある。 .SS inet_net_ntop() \fBinet_net_ntop\fP() 関数は \fInetp\fP が指すバッファーのネットワーク番号を表記形式に変換する。 \fI*netp\fP はネットワークバイトオーダーでの値として解釈される。 \fIbits\fP 引数は \fI*netp\fP のネットワーク番号のビット数を指定する。 .PP NULL 終端された表記形式の文字列は \fIpres\fP が指すバッファーに格納される。 \fIpsize\fP 引数は \fIpres\fP で利用可能なバイト数を指定する。 表記形式は CIDR 形式、 つまり、 ネットワークアドレスを表すドット区切りの 10 進数に、 スラッシュとネットワーク番号のビットサイズが続く形式である。 .SH 返り値 成功すると \fBinet_net_pton\fP() はネットワーク番号のビット数を返す。 エラーの場合、 \-1 を返し、 \fIerrno\fP にエラーを示す値を設定する。 .PP 成功すると \fBinet_net_ntop\fP() は \fIpres\fP を返す。 エラーの場合、 NULL を返し、 \fIerrno\fP にエラーを示す値がセットされる。 .SH エラー .TP \fBEAFNOSUPPORT\fP \fIaf\fP に \fBAF_INET\fP 以外の値が指定された。 .TP \fBEMSGSIZE\fP 出力バッファーのサイズが十分でなかった。 .TP \fBENOENT\fP (\fBinet_net_pton\fP() の場合) \fIpres\fP が正しい表記形式ではなかった。 .SH 準拠 関数 \fBinet_net_pton\fP() と \fBinet_net_ntop\fP() は非標準だが、多くのシステムで利用可能である。 .SH 注意 .SS "inet_net_pton() の入力の表記形式" ネットワーク番号は、 16 進数値、またはドット区切りの 10 進数表記で指定できる。 .PP .\" If the hexadecimal string is short, the remaining nibbles are zeroed. 先頭に "0x" か "0X" がある場合 16 進数値となる。 16 進数はネットワークバイトオーダーの左から右へ半オクテット (4 ビット) ずつ順番に埋められる。 .PP ドット区切りの 10 進数表記では、 最大 4 つのオクテットをドット区切りの 10 進数で指定する。 したがって、 以下の形式を指定できる。 .PP a.b.c.d a.b.c a.b a .PP .\" Reading other man pages, some other implementations treat .\" 'c' in a.b.c as a 16-bit number that populates right-most two bytes .\" 'b' in a.b as a 24-bit number that populates right-most three bytes 各部分は 0 から 255 の範囲の数字で、ネットワーク番号の各バイトに左から右にネットワークバイトオーダー (ビッグエンディアン) で順番に埋められる。 省略された部分があれば、 対応するネットワーク番号のバイトは 0 となる。 .PP 16 進数とドット区切りの 10 進数形式のどちらの場合も、 ネットワーク番号の後ろにスラッシュと 0 から 32 の範囲の数字をオプションで付けることができる。 この数字はネットワーク番号のビット単位のサイズを示すものである。 .SS "inet_net_pton() の返り値" \fBinet_net_pton\fP() の返り値はネットワーク番号フィールドのビット数である。 入力の表記形式の文字列がスラッシュとサイズの明示的な値で終わっている場合、 指定されたサイズが \fBinet_net_pton\fP() の返り値となる。 そうでない場合は、 返り値 \fIbits\fP が以下のようにして推測される。 .IP * 3 ネットワーク番号の最上位バイトが 240 以上の場合、 \fIbits\fP は 32 となる。 .IP * 3 それ以外で、 ネットワーク番号の最上位バイトが 224 以上の場合、 \fIbits\fP は 4 となる。 .IP * 3 それ以外で、 ネットワーク番号の最上位バイトが 192 以上の場合、 \fIbits\fP は 24 となる。 .IP * 3 それ以外で、 ネットワーク番号の最上位バイトが 128 以上の場合、 \fIbits\fP は 16 となる。 .IP * それ以外の場合、 \fIbits\fP は 8 となる。 .PP 上記の手順から得られる \fIbits\fP の値が 8 以上だが、 ネットワーク番号で指定されたオクテット数が \fIbits/8\fP より大きい場合、 \fIbits\fP には実際に指定されたオクテット数を 8 倍した値が設定される。 .SH 例 以下のプログラムは \fBinet_net_pton\fP() と \fBinet_net_ntop\fP() の使用例を示すものである。 \fBinet_net_pton\fP() を使って、 コマンドラインの最初の引数で渡された表記形式のネットワークアドレスをバイナリー形式に変換し、 \fIinet_net_pton\fP() の返り値を出力する。 それから \fBinet_net_ntop\fP() を使ってバイナリー形式を表記形式に再度戻して、結果の文字列を出力する。 .PP \fBinet_net_pton\fP() が \fInetp\fP 引数のすべてのバイトに書き込むわけではないことを示すため、 プログラムにはオプションで 2 番目のコマンドライン引数を指定することができ、 その引数の数字を使って \fBinet_net_pton\fP() を呼び出す前にバッファーを初期化する。 出力の最終行として、 ユーザーがどのバイトが \fBinet_net_pton\fP() によって変更されなかったかを確認できるように、 プログラムは \fBinet_net_pton\fP() が返したバッファーの全バイトを表示する。 .PP この実行例では、 \fBinet_net_pton\fP() が推測したネットワーク番号のビット数を表示する。 .PP .in +4n .EX $ \fB./a.out 193.168\fP inet_net_pton() returned: 24 inet_net_ntop() yielded: 193.168.0/24 Raw address: c1a80000 .EE .in .PP \fBinet_net_pton\fP() が結果のバッファーの未使用バイトを 0 埋めしないことを確認する。 .PP .in +4n .EX $ \fB./a.out 193.168 0xffffffff\fP inet_net_pton() returned: 24 inet_net_ntop() yielded: 193.168.0/24 Raw address: c1a800ff .EE .in .PP 表記形式の文字列で渡されたバイト数が推測した値より大きい場合、 \fBinet_net_pton\fP() が推測するネットワーク番号のサイズを広げることを確認する。 .PP .in +4n .EX $ \fB./a.out 193.168.1.128\fP inet_net_pton() returned: 32 inet_net_ntop() yielded: 193.168.1.128/32 Raw address: c1a80180 .EE .in .PP ネットワーク番号のサイズが明示的に指定すると、推測されるネットワーク番号のサイズが上書きされる (ただし、 明示的に指定された残りのバイトは \fBinet_net_pton\fP() で使用され、結果のバッファーに書き込まれる)。 .PP .in +4n .EX $ \fB./a.out 193.168.1.128/24\fP inet_net_pton() returned: 24 inet_net_ntop() yielded: 193.168.1/24 Raw address: c1a80180 .EE .in .SS プログラムのソース .EX /* "\-lresolv" でリンクする */ #include #include #include #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e } while (0) int main(int argc, char *argv[]) { char buf[100]; struct in_addr addr; int bits; if (argc < 2) { fprintf(stderr, "Usage: %s presentation\-form [addr\-init\-value]\en", argv[0]); exit(EXIT_FAILURE); } /* argv[2] (数値) が指定されると、その数字を使って inet_net_pton() に渡す出力バッファーを初期化する。これにより inet_net_pton() が ネットワーク番号に必要なバイトだけを書き込むことを確認できるよう にする。 argv[2] が指定されなかった場合、バッファーは 0 で初期化 する (これが推奨される方法である)。 */ addr.s_addr = (argc > 2) ? strtod(argv[2], NULL) : 0; /* argv[1] の表記形式のネットワーク番号をバイナリー形式に変換する */ bits = inet_net_pton(AF_INET, argv[1], &addr, sizeof(addr)); if (bits == \-1) errExit("inet_net_ntop"); printf("inet_net_pton() returned: %d\en", bits); /* inet_net_pton() が返した \(aqbits\(aq を使って、 バイナリー形式を表記形式に変換する */ if (inet_net_ntop(AF_INET, &addr, bits, buf, sizeof(buf)) == NULL) errExit("inet_net_ntop"); printf("inet_net_ntop() yielded: %s\en", buf); /* \(aqaddr\(aq を名前の形で (ネットワークバイトオーダーで) 表示する。 これにより inet_net_ntop() が表示しないバイトを確認できる。 これらのバイトの一部は inet_net_ntop() では変更されない場合があり、 その場合 argv[2] で指定された初期値のままになる。 */ printf("Raw address: %x\en", htonl(addr.s_addr)); exit(EXIT_SUCCESS); } .EE .SH 関連項目 \fBinet\fP(3), \fBnetworks\fP(5) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は \%https://www.kernel.org/doc/man\-pages/ に書かれている。