ADDR2ASCII(3)

名称
addr2ascii, ascii2addr - 一般的なアドレスフォーマットルーチン

ライブラリ
libc

書式
<sys/types.h> <netinet/in.h> <arpa/inet.h> char * addr2ascii(int af, const void *addrp, int len, char *buf) int ascii2addr(int af, const char *ascii, void *result)

解説
ルーチン addr2ascii() と ascii2addr() は、バイナリ形式と、アドレスファミリに適切な印字可能な形式との間で ネットワークアドレスを変換するのに使用されます。 両方の関数とも、変換プロセスで使用されるアドレスファミリを指定する af 引数を使用します (現時点では、 AF_INET および AF_LINK アドレスファミリだけがサポートされています)。

addr2ascii() 関数は、バイナリのネットワーク形式のアドレスを印字可能な形式に 変換するのに使用されます。 af の他に、 3 つの引数を持ちます。 addrp 引数は、変換するネットワークアドレスへのポインタです。 len 引数は、アドレスの長さです。 buf 引数は、結果を保持するために呼び出し元が割り振る バッファへのオプションのポインタです。 ヌルポインタが渡されると、 addr2ascii() は静的に割り振られたバッファを使用します。

ascii2addr() 関数は、 addr2ascii() と逆の操作を実行します。 af に加えて、2 つのパラメータ ascii と result を使用します。 ascii パラメータは、バイナリに変換される文字列へのポインタです。 result パラメータは、指定されたファミリに適切なネットワークアドレス構造体への ポインタです。

指定されたファミリにおいて使用されるバイナリアドレスとして 適切な構造体は次のとおりです。

AF_INET
    struct in_addr (in <netinet/in.h>)
AF_LINK
    struct sockaddr_dl (in <net/if_dl.h>)

戻り値
addr2ascii() 関数は、渡されたバッファのアドレス、または NULL ポインタが渡された場合は静的バッファのアドレスを返します。 処理が失敗した場合は、ヌルポインタを返します。 ascii2addr() 関数は、バイナリアドレスの長さ (バイト単位) を返します。 処理が失敗した場合は -1 を返します。

例
inet(3) 関数 inet_ntoa() と inet_aton() は次のように実装することができます。

    #include <sys/types.h>
    #include <sys/socket.h>
    #Include <netinet/in.h>
    #include <arpa/inet.h>
    char *
    inet_ntoa(struct in_addr addr)
    {
            return addr2ascii(AF_INET, &addr, sizeof addr, 0);
    }
    int
    inet_aton(const char *ascii, struct in_addr *addr)
    {
            return (ascii2addr(AF_INET, ascii, addr)
                == sizeof(*addr));
    }

実際には、これは実行できません。 addr2ascii() と ascii2addr() は、他の方法でなく、 inet(3) 関数で実装されているからです。

エラー
処理失敗が返されたとき、 errno に次の値の 1 つの設定されます。

[ENAMETOOLONG]
    addr2ascii() ルーチンは、 af によって渡されたアドレスファミリに不適切なパラメータ len を渡されました。

[EPROTONOSUPPORT]
    いずれかのルーチンに、 AF_INET または AF_LINK ではない af パラメータが渡されました。

[EINVAL]
    ascii2addr() に渡された文字列は、 アドレスファミリ af について不適切にフォーマットされていました。

関連項目
inet(3), linkaddr(3), inet(4)

歴史
これに近いインタフェースは、もともと Craig Partridge によって 提案されました。 このインタフェース自体は、 INRIA の IPv6 の実装により、はじめて登場しました。

作者
コードとドキュメントは MIT Laboratory for Computer Science の Garrett A. Wollman によるものです。

バグ
オリジナルの実装は IPv6 をサポートしていました。 このサポートは、そのうち復活されるはずです。 NRL の実装には、 AF_ISO および AF_NS アドレスファミリのサポートも含まれていました。

このインタフェースの一般性については、いくらか疑問があります。 本当に一般的なインタフェースであれば、バッファを動的に割り当てることが できるよう、使用されるバッファの長さを決定する手段を備えているでしょうし、 バイナリアドレスを保持するのには必ず “struct sockaddr” を要求するでしょう。 残念ながら、これは既存のやり方と互換性がありません。 この制限のため、任意のアドレスファミリからネットワークアドレスを 印字するルーチンは、必要な最大バッファ長や、 バイナリアドレスとして使用するアドレスの適切な部分といった 内部的な知識を依然として持っていなければなりません。