LINK_ADDR(3)

名称
link_addr, link_ntoa - リンクレベルアクセス用基本アドレス指定ルーチン

ライブラリ
libc

書式
#include <sys/types.h> #include <sys/socket.h> #include <net/if_dl.h> void link_addr(const char *addr, struct sockaddr_dl *sdl) char * link_ntoa(const struct sockaddr_dl *sdl)

解説
link_addr() ルーチンは、リンクレベルアドレスを表す文字列を解釈し、 システムコールで使用するのに適したバイナリ情報を返します。 link_ntoa() ルーチンは、リンクレベルアドレスを引数に取り、リンクレベルアドレス自身、 存在する場合はそのインタフェース名や番号などを含んだ、現在の情報を示す ASCII 文字列を返します。 この機能はまだ試用段階であり、変更される可能性があります。

link_addr() に対して、文字列 addr には、 ifconfig(8) の第一引数となりうる “name unit-number” という形の任意指定のネットワークインタフェース識別子を含むことができ、 その後にコロン、そしてピリオドで区切られた 16 進数の組の形の インタフェースアドレスが続きます。 それぞれの組はアドレスの 1 バイトを示しており、 アドレスバイトは左から右へ、低位のバイトから高位のバイトへと占められます。

つまり le0:8.0.9.13.d.30 は 1 つ目の Lance イーサネットインタフェースへ転送される イーサネットアドレスを表します。

これらの関数を直接使うのは避けられる傾向があり、むしろ addr2ascii(3) インタフェースが使われます。 しかし、このインタフェースはまだ広くは実装されていないので、 移植性のあるプログラムでは、このインタフェースに依存するわけにはいきません。

戻り値
link_ntoa() は、常にヌルで終了する文字列を返します。 link_addr() 関数は戻り値を返しません ( バグ 参照のこと)。

関連項目
addr2ascii(3)

歴史
link_addr() および link_ntoa() 関数は 4.3-RenoBSD で登場しました。

バグ
link_ntoa() の戻り値は静的なメモリ領域にあります。

関数 link_addr() は、不適切な形式の入力を診断する機能が必要であり、 これを認識するあいまいでない方法が必要となります。

リンクソケットアドレスの sdl_len フィールドが 0 の場合、 link_ntoa() は、インタフェースアドレスバイトの前にコロンを挿入しません。 変換されたアドレスが、最初のコロンが挿入されずに link_addr() に渡された場合、この関数はアドレスを正しく解釈しないでしょう。