Netcompo WAN制御 説明書
目次 前ページ次ページ

上へ第8章 環境構築7 TLI編

8.4 ネットワーク・セレクションとネーム・トゥ・アドレス・マッピング

ここでは、TLIアプリケーションのメディアとプロトコルの依存性を解消するネットワーク・セレクション機能と、ネーム・トゥ・アドレス・マッピング機能について説明します。
ネットワーク・セレクションは、現在のシステム環境で利用可能なネットワークへの標準インタフェースを提供します。また、ネーム・トゥ・アドレス・マッピングを使用することにより、アプリケーションはトランスポート固有のアドレスを変換することができます。

8.4.1 ネットワーク・セレクション

ネットワーク・アプリケーションが異った環境でも移植可能にするためには、アプリケーション・プロセスが、現状の環境で使用できる様々なトランスポート・プロバイダに対して、標準的なインタフェースを持つことが必要です。
ネットワーク・セレクションは、ユーザ・アプリケーションがトランスポート・レベルでネットワークを選択できるように、標準的なインタフェースを提供します。これによりアプリケーションは、プロトコルやメディアに依存せずに実行できるようになります。ユーザがトランスポートを選択できるネットワーキング・サービス・アプリケーションは、ここで説明する標準インタフェースを使用します。
ネットワーク・セレクションは、アプリケーションのクライアントが他のマシン上のアプリケーションとの通信を開始する時に使用されます。また、アプリケーションのサーバ部分がサービスを提供する時にも使用されます。

単一のネットワークに接続されたマシン上では、ネットワーク・セレクションにより、管理者やユーザによるアプリケーション独自の操作を必要とせずに、アプリケーションがネットワークを使うことができます。
複数のネットワークに接続されたマシン上では、ネットワーク・セレクションにより、アプリケーションは通信が成功するまで異なるネットワークを順番に調べることができます。これはさらに、システム管理者が設定した省略時の順序や、ユーザの好みの順序で行うことも可能です。また、サーバ側で複数のネットワークからの要求を受けつけることもできます。
ネットワークの選択は、アプリケーションの責任で行わなければなりません。ネットワーク・セレクション機構によって、この選択を一様で単純に行うことができます。

8.4.1.1 ネットワーク・セレクションの動作

ネットワーク・セレクションの構成要素は、以下のとおりです。

ネットワーク・セレクションのアプリケーション・プログラミング・インタフェースは、ネットワーク設定データベースへのアクセス・ルーチンで構成されています。

8.4.1.2 /etc/netconfigファイル

/etc/netconfigファイルは、そのマシン上のすべてのネットワークについて記述されているデータベースです。このファイルは、システム管理者によって管理されます。通常、このファイルは変更してはいけません。/etc/netconfigファイルのエントリは以下に示すフィールドから構成されます。

network_id

semantics

flags

protofamily

protoname

device

nametoaddr_libs

network_id

トランスポート・プロバイダを識別するために使われる文字列です。トランスポート・プロバイダの名前を必要とするアプリケーションは、このフィールドからその名前を取得します。
network_idは、1文字以上の非ヌル文字で構成されています。最大文字数の制限はありませんが、1行の最大文字数に制限があります。このフィールドはローカルでは重要なもので、ローカルのシステム管理者は命名の権限を持ち、システム上のすべてのnetwork_idを一意にすることを保証する責任を持ちます。ただし、network_idを意識しているアプリケーションもありますので、システムで提供されているnetwork_idのエントリの変更はしないでください。
X.25-TLIでは、x25またはx25pvcを使用します。また、HDLC-TLIでは、hdlcabmまたはhdlcnrmを使用します。

semantics

トランスポート・プロバイダの「セマンティクス」つまり、サポートしているサービスのセットを識別する文字列で、提供されるサービス・インタフェースを識別します。これは、アプリケーションがネットワークにアクセスする場合に使用されるAPI(アプリケーション・プログラミング・インタフェース)と密接に関連していますが、同じではありません。通常アプリケーションは、適当なSTREAMSモジュール(例えば、timodなど)をプッシュし、また適当なユーザ・レベル・ライブラリ(例えば、TLIライブラリなど)を使用することにより、そのAPIを指定します。
semanticsフィールドは必須です。
セマンティクスには以下のものがありますが、X.25-TLIおよびHDLC-TLIでは、tpi_cotsを使用します。
tpi_clts     コネクションレス型のトランスポート・プロバイダ・インタフェース
tpi_cots     コネクション型のトランスポート・プロバイダ・インタフェース
tpi_cots_ord  コネクション型で合法的解放のトランスポート・プロバイダ・インタフェース
バーチャル・サーキットの確立のように特定のセマンティクスを必要とするアプリケーションは、このフィールドを使ってそのセマンティクスをトランスポート・プロバイダが持つかどうかを調べることができます。

flags

flagsフィールドには、トランスポート・プロバイダの2値(「真」と「偽」)属性が格納されます。flagsは、それぞれに対応する属性の値を示している文字を組み合わせた文字列です。文字が存在すれば、属性は「真」であり、文字が存在しなければ、属性は「偽」です。ハイフン(-)は、属性が存在しないことを意味します。現在認識される文字は以下のとおりです。
v    ビジブル・ネットワーク。環境変数NETPATHが設定されていない場合、検索するネットワ
     ークの省略時に設定されるリストを作成するために使用されます。vフラグがどのように
     使用されるかについては、「8.4.1.3 NETPATH環境変数」を参照してください。

protofamily

トランスポート・プロバイダのプロトコル・ファミリの名前で、例えば、x25などです。protofamilyprotonameの各フィールドは、プロトコル固有のアプリケーションのために用意されています。
protofamilyは、1文字以上の非ヌル文字で構成されています。最大文字数の制限はありませんが、1行の最大文字数に制限があります。protofamilyフィールドで(-)が使用された場合、対応するプロトコル・ファミリ識別子がなく、そのトランスポート・プロバイダは実験的なものであることを示します。
X.25-TLIでは、x25を使用します。またHDLC-TLIでは、dliを使用します。

protoname

トランスポート・プロバイダのプロトコル名で、protofamilyの詳細なプロトコル情報を示します。例えば、x25pvcやhdlcabmなどです。詳細なプロトコル情報を持たないprotofamilyの場合、protonameフィールドにはハイフン(-)が入ります。protonameは、1文字以上の非ヌル文字で構成されています。最大文字数の制限はありませんが、1行の最大文字数に制限があります。
X.25-TLIでは、x25またはx25pvcを使用します。またHDLC-TLIでは、hdlcabmまたはhdlcnrmを使用します。

device

トランスポート・プロバイダでリモート・マシンに接続する時に使用されるデバイスの絶対パス名です。通常、このデバイスは/devディレクトリにあります。deviceは必ず指定してください。
X.25-TLIでは、protonameがx25の場合、deviceは/dev/tpi/nlcovcとなり、protonameがx25pvcの場合は/dev/tpi/nlcopvcとなります。またHDLC-TLIでは、protonameがhdlcabmの場合、deviceは/dev/tpi/hdlcabmとなり、protonameがhdlcnrmの場合は、/dev/tpi/hdlcnrmとなります。

nametoaddr_libs

nametoaddr_libsは、ディレクトリ・サービス(ネーム・トゥ・アドレス・マッピング・サービス)をサポートします。このサービスは、ネーム・トゥ・アドレス・マッピング機能により実現されます。トランスポートにこのようなライブラリが提供されていない場合(すなわちnametoaddr_libsフィールドにハイフンのみがある場合)は、ネットワーク・セレクション要求は失敗します。
nametoaddr_libsフィールドは、動的にリンクされるライブラリ名をコンマで区切って並べたもので構成されています。文字のコンマは"\,"、バックスラッシュは"\\"として指定されます。
X.25-TLIではx25.soを使用し、HDLC-TLIではhdlc.soを使用します。

/etc/netconfigファイルの第一文字が"#"で始まる行は、コメント行です。また、1行の文字数は1024以内でなければなりません。
/etc/netconfigファイルの各フィールドは、netconfig構造体の要素に対応します。ネットワーク・セレクション・ライブラリ・ルーチンの返すポインタは、netconfig構造体形式のnetconfigエントリへのポインタです。netconfig構造体は、以下のとおりです。

struct netconfig {
        char            *nc_netid;              /* network identifier            */
        unsigned int    nc_semantics;           /* semantics of protocol         */
        unsigned int    nc_flag;                /* flags for the protocol        */
        char            *nc_protofmly;          /* protocol family name          */
        char            *nc_proto;              /* protocol name                 */
        char            *nc_device;             /* device name for network id    */
        unsigned int    nc_nlookups;            /* # of entries in nc_lookups    */
        char            **nc_lookups;           /* list of lookup directories    */
        unsigned int    nc_unused[8];
};
正しいネットワークIDはシステム管理者によって決められます。システム管理者は、ネットワークIDがローカルには一意に決まるようにしなければなりません。もしそうでないと、ネットワーク・セレクションのルーチンが正常に動作できないことがあります。例えばx25というネットワークIDのnetconfigエントリが2つあると、getnetconfigent("x25")がどのネットワークを使うのかわからなくなってしまいます。
注意:
WAN制御で使用するnetconfigファイルのエントリは、製品のインストール時に自動的に作成されるため、新たにエントリを作成する必要はありません。

また、システム管理者はnetconfigデータベースのエントリの順序を決めなければなりません。/etc/netconfigファイルからエントリを取り出すルーチンは、ファイルの先頭から順番にエントリを返します。したがって、netconfigファイルの順序は、次で述べるルーチンにとっての、省略時のネットワーク検索パスとなります。
/etc/netconfigファイルとnetconfig構造体については、「8.5 マニュアル・ページ」のnetconfig(4)でさらに詳しく説明します。

8.4.1.3 NETPATH環境変数

多くの場合、ユーザはネットワーク操作でどのネットワークが使用されるかには関心がありません。一般的に、アプリケーションはシステム管理者が決めた省略時のネットワーク検索パスを用いて、有効なネットワークを決めます。しかし、アプリケーションの行う選択にユーザが関与したい場合は、シェル変数NETPATHと、後述のルーチンを使ってインタフェースを変更することができます。これらのルーチンはNETPATH変数で指定されたネットワークだけをアクセスします。

NETPATHはPATH変数に類似したもので、コロンで区切られたネットワークIDのリストで構成されています。各ネットワークIDは、netconfigファイルの各レコードのnetwork_idフィールドと対応しています。また、コロンを区切り記号ではなく文字そのものとして使いたい場合は“\:"とします。同様にバックスラッシュは“\\"です。NETPATHの空の要素(先頭がコロンの場合、最後がコロンの場合、または続けて2つコロンが並ぶ場合)は、空の文字列が有効なネットワークIDではないため、有効なエントリとはなりません。(NETPATHについてはenviron(5)でも説明されています。)
NETPATH環境変数は、個々のユーザ環境で定義しなければなりません。

ユーザとシステム管理者は、netconfigに直接アクセスするルーチン(後述の「直接netconfigをアクセスするルーチン」を参照)と、NETPATH環境変数を用いてnetconfigにアクセスするルーチン(後述の「NETPATHを通してnetconfigにアクセスするルーチン」を参照)とでは省略時のネットワーク・セットが異なることに注意してください。
netconfigに直接アクセスするルーチンの場合、/etc/netconfigファイルの内容のすべてが、省略時に設定されるネットワーク・セットです。NETPATHを用いてnetconfigをアクセスするルーチンに対する省略時ネットワーク・セットは、/etc/netconfigファイルのビジブル・ネットワークです。システム管理者がnetconfigエントリのflagsフィールドにvフラグを指定した場合、ネットワークはビジブルであると言います。NETPATHが設定されていない場合、これらのビジブル・ネットワークが、アクセス・ルーチンの2番目のグループに対する省略時サーチ・パスになります。

◆ネットワーク・セレクションAPI

ネットワーク・セレクションのAPIは、2つのネットワーク・データベースへのアクセス・ライブラリ・ルーチンのセットで構成されています。1つは、NETPATH環境変数で識別されたnetconfigエントリのみにアクセスします。下記に示すこれらのルーチンについては、後述の「NETPATHを通してnetconfigにアクセスするルーチン」と、「8.5 マニュアル・ページ」のgetnetpath(3N)で説明します。

アプリケーションが使用するトランスポートの選択に、ユーザの意思を反映させるためには、上記のルーチンを使用してください。
トランスポートの選択に、ユーザの意思を反映させたくない場合は、netconfigに直接アクセスする下記のルーチンを使用してください。これらのルーチンについては、後述の「直接netconfigをアクセスするルーチン」と、「8.5 マニュアル・ページ」のgetnetconfig(3N)で説明します。

◆NETPATHを通してnetconfigにアクセスするルーチン

ここで述べる3つのルーチンは、ネットワーク・コンフィグレーション・データベースに、NETPATH環境変数を通して間接的にアクセスします。したがって、ユーザはアプリケーションが使うネットワーク(複数の場合もある)を指定することができます。さらに、複数のネットワークを指定した場合には、アプリケーションが試みる順序も指定することができます。これらのルーチンは次のような構文です。

#include <netconfig.h>
void *
setnetpath(void)
struct netconfig *
getnetpath(void *handlep)
int
endnetpath(void *handlep)

setnetpath

setnetpath( )を呼び出すと、データベース・ルーチンが初期化され、NETPATH変数が指定するエントリ含むデータベースへのポインタが返されます。このポインタはハンドル(handlep)と呼ばれ、getnetpath( )によってデータベースの中を動く時に使われます。
最初にgetnetpath( )が呼ばれる前に、必ずsetnetpath( )が呼ばれなければなりません。また、それ以外の時に呼ばれることもあります。setnetpath( )は、netconfigデータベースがない場合はNULLを返します。setnetpath( )は引き数をとりません。

getnetpath

getnetpath( )は、最初に呼び出された時、NETPATH変数の最初の要素に対応するnetconfigデータベース・エントリへのポインタ(ハンドルによって示されるポインタ)を返します。NETPATHの要素は、左から右へと読まれます。netconfigエントリは、netconfig構造体の形をしています。これ以後の呼出しのたびに、getnetpath( )はNETPATH変数の次の要素に対応するnetconfigエントリへのポインタを返します。getnetpath( )は、ファイルが終わりになるとNULLを返します。setnetpath( )を呼び出していない状態でgetnetpath( )を呼び出すと、エラーとなります。getnetpath( )はハンドルを引数としてとります。
getnetpath( )は、正しくないNETPATHの要素を単に無視します。NETPATHの要素が正しくないとは、netconfigデータベースに対応するエントリがないことを意味します。NETPATH変数が設定されないときには、getnetpath( )はNETPATHが「省略時」の列すなわちnetconfigデータベースの「ビジブル(visible)」ネットワークを順に検索します。この場合の順序は、netconfigファイルの順序と同じです。

endnetpath

endnetpath( )は、処理が終了してNETPATH変数の要素へのデータベース・ポインタを「解放」する時に呼出します。正常終了したときは0を、異常終了したときは-1を返します。endnetpath( )は、setnetpath( )がそれ以前に呼び出されていない時には異常終了します。endnetpath( )は、ハンドルを引数としてとります。

◆直接netconfigをアクセスするルーチン

以下の5つのルーチンは、ネットワーク構成データベースファイル/etc/netconfigをアクセスします。それらの構文は次のとおりです。

#include netconfig.h

void *
setnetconfig(void)

struct netconfig *
getnetconfig(void *handlep)

int
endnetconfig(void *handlep)

struct netconfig *
getnetconfigent(const char *netid)

void
freenetconfigent(struct netconfig *netconfigp)

setnetconfig

setnetconfig( )を呼び出すことにより、データベース・ルーチンが初期化されます。そして、getnetconfig( )によって、データベースの中を動く時に使われるデータベース・ポインタが返されます。このデータベース・ポインタはハンドル(handlep)と呼ばれます。setnetconfig( )は、呼び出されるたびに異なるデータベース・ポインタを返します。getnetconfig( )は、呼び出されるたびにsetnetconfig( )の返すハンドルに応じてnetconfigの次のエントリを返します。

getnetconfig

最初の呼出しでは、getnetconfig( )はnetconfigデータベースの最初のエントリを返します。このエントリはnetconfig構造体の形をしています。これ以後の呼出しでは、getnetconfig( )はデータベースのエントリを順番に返します。したがって、これを用いてnetconfigファイル全体を探すことができます。getnetconfig( )は、ファイルが終わりになるとNULLを返します。

endnetconfig

endnetconfig( )は、処理が終了してデータベース・ポインタを「解放」する時に呼出します。endnetconfig( )は、setnetconfig( )より前に呼ばれてはなりません。endnetconfig( )は、正常終了すると0を、異常終了すると-1を返します(例えば、setnetconfig( )が前に呼ばれていない時などには、異常終了します)。

getnetconfigent

getnetconfigent( )は、netidに対応するnetconfig構造体へのポインタを返します。netidが正しくない時、つまりnetconfigデータベースのエントリの名前でない時は、NULLを返します。

freenetconfigent

freenetconfigent( )は、getnetconfig( )の返す構造体を解放します。

8.4.1.4 プログラム例

以下に示すプログラム例には、ネットワーク・セレクション機構の使い方が示されています。

◆すべての「ビジブル(visible)」なnetconfigエントリのループ

この例では、setnetpath( )はネットワーク・セレクションの初期化を行い、データベース・ポインタを返します。
NETPATH環境変数が設定されていない時には、省略時の解釈により、getnetpath( )は/etc/netconfigファイルの「ビジブル(visible)」なエントリ(すなわち、vフラグのついたエントリ)を1つずつ返します。エントリはファイルに現れる順に返されます。

void *handlep;
struct netconfig *netconfigp;
if ((handlep = setnetpath()) == NULL) {
        fprintf(stderr, "%s: ERROR: network selection not set\n", argv[0]);
        exit(1);
}
while ((netconfigp = getnetpath(handlep)) != NULL) {
        /*
         *   the netconfigp now describes a transport provider
         */
}
endnetpath(handlep);

◆ユーザ定義のnetconfigエントリのループ

トランスポート・プロバイダの名前をコロンでつなげたリストをNETPATH環境変数に設定することで、ユーザがループを制御することができます。トランスポート・プロバイダの名前は/etc/netconfigファイルの最初のフィールドです。NETPATHの値が次のように設定されているとします。

    NETPATH=x25:x25pvc

この時、ループはまずx25に対応するエントリを返し、次にx25pvcに対応するエントリを返します。NETPATH環境変数によって、クライアント側のアプリケーションがサービスへの接続を試みる順序を、ユーザが決めることができます。またこれによって、サービスがどのトランスポート・プロバイダをループで探しバインドするかを、サーバ・マシンの管理者が制限することもできます。

◆すべてのnetconfigエントリのループ

アプリケーションはNETPATH変数を無視して、vフラグに関係なくnetconfigファイルのすべてのエントリをループすることもできます。

void *handlep;
struct netconfig *netcfp;
if ((handlep = setnetconfig()) == NULL) {
        fprintf(stderr, "%s: ERROR: network selection not set\n", argv[0]);
        exit(1);
}
/*
 *   transport provider information is described in netcfp
 *   process_transport is a user-supplied routine that
 *   tries to connect to a server over transport netcfp
 */
while ((netcfp = getnetconfig(handlep)) != NULL) {
        if (process_transport(netcfp) == SUCCESS) {
                break;
        }
}
endnetconfig(handlep);

◆単一のトランスポートプロバイダの指定

次のような呼出しをすると、1つの名前が付けられたトランスポート・プロバイダの情報が得られます。

/*
 *   assume x25 is a netid on this machine
 */
struct netconfig *netcfp;
if ((netcfp = getnetconfigent("x25")) == NULL) {
        fprintf(stderr, "%s: ERROR: no information about x25\n");
        exit(1);
}
process_transport(netcfp);
freenetconfigent(netcfp);

8.4.2 ネーム・トゥ・アドレス・マッピング

ネーム・トゥ・アドレス・マッピングの機能を使って、アプリケーションはあるマシン上のサービスのアドレスを、トランスポートに依存しない方法で得ることができます。ネーム・トゥ・アドレス・マッピングの機能は次のルーチンからなります。

ライブラリは次のようなものです。

x25.so   X.25プロトコルのためのネーム・トゥ・アドレス・マッピング・ルーチンにより構成されています。

hdlc.so  HDLCプロトコルのためのネーム・トゥ・アドレス・マッピング・ルーチンにより構成されています。

ルーチンについては、「8.4.2.2 ネーム・トゥ・アドレス・マッピング・ルーチンの使用法」、および「8.5 マニュアルページ」のnetdir(3N)で、netconfig構造体については、「8.5 マニュアルページ」のnetconfig(4)で、それぞれ説明します。

8.4.2.1 ネーム・トゥ・アドレス・マッピング・ライブラリ

それぞれのライブラリに関連するファイルは、管理者によって作成され、管理されなければなりません。

x25.so

このライブラリルーチンは、WAN制御で有効な、/etc/opt/FJSVwan/etc/x25/hostsと/etc/opt/FJSVwan/etc/x25/servicesファイルの定義情報からアドレスを作成します。
/etc/opt/FJSVwan/etc/x25/hostsファイルは、ホスト名、ネットワーク名、アドレス情報、代表選択機能の4つのフィールドから構成されます。例を示すと次のようになります。

 # host_name network_name address the_key_number_flag
 host1   network1        1111111        -
 host2   network1        2222222        -
 host3   network3        3333333        -

/etc/opt/FJSVwan/etc/x25/servicesファイルは、サービス名、サブアドレス、プロトコルID(比較データ/マスクデータ)の3つのフィールドから構成されます。例を示すと次のようになります。

 # service_name sub_address cmp_protocol_id/mask_protocol_id
 service1           -        0xcc/0xff
 service2           -        -
 service3           -        0x1234/0xffff

アプリケーションが、個々のホスト上のサービス・アドレスを要求するためにこのライブラリを使用する時、ホスト名は/etc/opt/FJSVwan/etc/x25/hostsファイル、サービス名は/etc/opt/FJSVwan/etc/x25/servicesファイルになければなりません。もし、どちらかがない場合、ネーム・トゥ・アドレス・マッピング・ルーチンによりエラーが返されます(指定ホスト名がない場合はND_NOHOST、指定サービス名がない場合はND_NOSERV等)。その他のエラーについては、<netdir.h>を参照してください。
また、X.25の環境定義方法および詳細については、「2.3 メニューによる設定」または「第5章 環境構築4 X.25」を参照してください。

hdlc.so

このライブラリ・ルーチンは、WAN制御で有効な、/etc/opt/FJSVwan/etc/hdlc/hostsと/etc/opt/FJSVwan/etc/hdlc/servicesファイルの定義情報からアドレスを作成します。
/etc/opt/FJSVwan/etc/hdlc/hostsファイルは、ホスト名、ネットワーク名、アドレス情報(局アドレス/ダイアル番号)、代表選択機能の4つのフィールドから構成されます。ISDNを使用して通信を行う場合は、アドレス情報として、局アドレス/ダイアル番号/サブアドレス/サブアドレス種別1/サブアドレス種別2/AFIコードの形式をとります。例を示すと次のようになります。

 # host_name network_name address(/dialno.(/subaddr/subaddrkind1/subaddrkind2/AFI_code)) linemode
 host1   network1        03                       0
 host2   network1        01                       0
 host3   network2        -/1111111                0
 host4   network2        01/2222222               0
 host5   network3        01/3333333/111/0/0/50    0

/etc/opt/FJSVwan/etc/hdlc/servicesファイルは、サービス名、オプション名、相手ホスト名、xid名(送信id、受信id)の4つのフィールドから構成されます。例を示すと次のようになります。

 # service_name option_name host_name send_xid_name,receive_xid_name
 service1           -          host2      -,-
 service2           -          host1      -,-
 service3           -          host4      xid1,-
 service4        optperm1      host3      -,xid1

アプリケーションが、個々のホスト上のサービス・アドレスを要求するためにこのライブラリを使用する時、ホスト名は/etc/opt/FJSVwan/etc/hdlc/hostsファイルに、サービス名は/etc/opt/FJSVwan/etc/hdlc/servicesファイルに定義されていなければなりません。どちらかがない場合、ネーム・トゥ・アドレス・マッピング・ルーチンによりエラーが返されます(ND_NOHOST:指定ホスト名が見つからない、ND_NOSERV:指定サービス名が見つからない等)。その他のエラーについては、<netdir.h>を参照してください。
また、HDLCの環境定義方法および詳細については、「2.3 メニューによる設定」または「第4章 環境構築3 HDLC」を参照してください。

8.4.2.2 ネーム・トゥ・アドレス・マッピングの使用法

int
netdir_getbyname(netconfig, nd_hosttserv, nd_addrlist)
const struct netconfig       *netconfig;
const struct nd_hostserv     *nd_hostserv;
struct nd_addrlist           **nd_addrlist
int
netdir_getbyaddr(netconfig, nd_hostservlist, netaddr)
const struct netconfig       *netconfig;
struct nd_hostservlist       **nd_hostservlist;
const struct netbuf          *netaddr;
void
netdir_free(ptr, type)
void                    *ptr;
const int               type;
int
netdir_options(netconfig, option, fd, pointer_to_args)
const struct netconfig  *netconfig;
const int               option;
const int               fd;
char                    *pointer_to_args;
void
netdir_perror(s)
char                    *s;
char *
netdir_sperror(void)

◆netdir_getbyname

netdir_getbyname( )ルーチンは、nd_hostserv構造体で指定されているマシン名とサービス名から、netconfig構造体で示されているトランスポートによって解釈される型のアドレスの集合へとマップします。nd_addrlistパラメタはアドレスへのポインタを返します。getnetpath(3N)の呼出しによって返されるnetconfig構造体を引数として、繰り返しnetdir_getbyname( )ルーチンを呼ぶことによって、マシンとすべての有効なトランスポート上のサービスの、すべてのアドレスを探すことが出来ます。
netdir_getbyname( )によって得られるアドレスの集合は、以下の構造体で示されます。

struct x25addr {
        ushort      family;                 /* Address family                  */
        ushort      resv0;                  /* reserved                        */
        t_scalar_t  nwid;                   /* Network ID                      */
        ushort      addrlen;                /* Address effective length        */
        ushort      resv1;                  /* reserved                        */
        char        addr[MAXX25ADDR];       /* DTE address                     */
        ushort      subaddrlen;             /* Sub address effective length    */
        ushort      resv2;                  /* reserved                        */
        char        subaddr[MAXX25SUBADDR]; /* Sub address field               */
        ushort      proidlen;               /* Protocol-ID effective length    */
        ushort      resv3;                  /* reserved                        */
        char        proidmsk[MAXPROID];     /* Protocol-ID mask data           */
        char        proidcmp[MAXPROID];     /* Protocol-ID compare data        */
};
struct hdlcaddr {
        struct hdlcaddr_s addr;             /* essential addrress              */
        struct hdlcaddr_o optaddr;          /* essential addrress              */
        ushort      rxidlen;                /* receive XID effective length    */
        ushort      sxidlen;                /* send XID effective length       */
        char        rxid[MAXXID];           /* receive XID                     */
        char        sxid[MAXXID];           /* send XID                        */
        ushort      optprmlen;              /* effective option para length    */
        ushort      resv7;                  /* reserved                        */
        char        hdlcopt[MAXOPTLEN];     /* option parameter                */
};
struct hdlcaddr_s {
        ushort      family;                 /* address family                  */
        ushort      linemode;               /* linemode                        */
        t_scalar_t  nwid;                   /* Network ID                      */
        char        addrflag;               /* address flag                    */
        char        addr;                   /* terminal address                */
        char        sabmlen;                /* SABM effect length              */
        char        sabm;                   /* SABM mode                       */
        ushort      diallen;                /* Dial effective length           */
        ushort      resv2;                  /* reserved                        */
        char        dialno[MAXDIALNO];      /* Dial number                     */
        ushort      subaddrlen;             /* Sub address length for ISDN     */
        ushort      resv3;                  /* reserved                        */
        char        subaddr[MAXHDLCSUBADDR];/* Sub address for ISDN            */
        char        subaddrflag1;           /* Sub address kind flag1 For ISDN */
        char        subaddrkind1;           /* Sub address kind1 for ISDN      */
        char        subaddrflag2;           /* Sub address kind flag2 for ISDN */
        char        subaddrkind2;           /* Sub address kind2 for ISDN      */
        char        afiflag;                /* AFI flag for ISDN               */
        char        aficode;                /* AFI code for ISDN               */
        ushort      resv4;                  /* reserved                        */
        unsigned char   hdlcrsv[4];
};
struct hdlcaddr_o {
        t_scalar_t  optnwid;                /* option Network-ID                     */
        char        optaflag;               /* address flag                          */
        char        optaddr;                /* option terminal address               */
        ushort      resv5;                  /* reserved                              */
        ushort      optdiallen;             /* option dial effect length             */
        ushort      resv6;                  /* reserved                              */
        char        optdialno[MAXDIALNO];   /* option dial no                        */
        ushort      optsubadlen;            /* option sub address length for ISDN    */
        ushort      resv7;                  /* reserved                              */
        char        optsubaddr[MAXHDLCSUBADDR];
                                            /* option sub address for ISDN           */
        char        optsubadflag1;          /* option sub address kind flag1 for ISDN*/
        char        optsubadkind1;          /* option sub address kind1 for ISDN     */
        char        optsubadflag2;          /* option sub address kind flag2 for ISDN*/
        char        optsubadkind2;          /* option sub address kind2 for ISDN     */
        char        optafiflag;             /* option AFI flag for ISDN              */
        char        optaficode;             /* option AFI code for ISDN              */
        ushort      resv8;                  /* reserved                              */
        unsigned char    hdlcrsv[4];
};

netdir_getbyname( )は特殊ホスト名を受け付けます。これらのホスト名は<netdir.h>で定義されています。WAN制御では、以下の特殊ホスト名をサポートします。

HOST_ANY 

トランスポート・プロバイダがアクセス可能なホストをすべて表します。HOST_ANYを使うことによって、アプリケーションが特定のホスト名を指定しなくても、必要なサービスを指定することができます。

netdir_getbyname( )呼出し時にnd_hostserv構造体に設定するマシン名とサービス名は、それぞれ/etc/opt/FJSVwan/etc/transport/hosts,/etc/opt/FJSVwan/etc/transport/servicesに定義されていなければなりません。transportの部分は、トランスポート・プロバイダのローカルな名前であり、hdlcまたはx25となります。
復帰情報となるアドレス構造体はnetdir_getbyname( )が割り当てますが、その領域の解放は呼出し元であるアプリケーションが行なわなければなりません。解放には後述するnetdir_free( )ルーチンを使用してください。

◆netdir_getbyaddr

netdir_getbyaddr( )ルーチンは、アドレスをマシン名とサービス名へとマップします。netbufパラメタにアドレスを与えると、このルーチンはそのアドレスをつくり出すようなマシン名とサービス名の対のリストを返します。マシン名とサービス名の対のリストへのポインタは、nd_hostservlistパラメタで返されます。
netdir_getbyaddr( )呼出し時にアドレス構造体に設定されているアドレス情報は、/etc/opt/FJSVwancm/etc/networksに定義されているネットワークID、/etc/opt/FJSVwan/etc/transport/hostsに定義されているアドレス、サブアドレス、ホスト名、/etc/opt/FJSVwan/etc/transport/servicesに定義されているホスト名(HDLCのみ)、プロトコルID(X.25のみ)でなければなりません。transportの部分は、トランスポート・プロバイダのローカルな名前であり、hdlcまたはx25となります。
入力情報となるアドレス構造体は、netdir_getbyname( )で説明したx25addr構造体およびhdlcaddr構造体を参照してください。
復帰情報となるnd_hostservlist構造体はnetdir_getbyaddr( )が割り当てますが、その領域の解放は呼出し元であるアプリケーションが行なわなければなりません。解放には後述するnetdir_free( )ルーチンを使用してください。

◆netdir_free

netdir_free( )ルーチンは、ネーム・トゥ・アドレス・マッピングルーチンによって割り当てられた構造体を解放します。指定できるパラメタの組合せ(解放する構造体のタイプと、解放する構造体へのポインタ)は、以下のとおりです。

ND_HOSTSERVLIST netdir_getbyaddr( )によって割り付けられたnd_hostservlist構造体へのポインタ
ND_ADDRLIST    netdir_getbyname( )によって割り付けられたnd_addrlist構造体へのポインタ
ND_ADDR      netbuf構造体へのポインタ
ND_HOSTSERV    nd_hostserv構造体へのポインタ

◆netdir_options

netdir_options( )ルーチンは、トランスポート独自の機能へのインタフェースとなります。netconfig構造体は、トランスポート・プロバイダを指定します。option引数はトランスポート独自のアクションを指定します。3番目の引数はファイル記述子(これはWAN制御で使用するオプションでは使用されません。)です。4番目の引数はオペレーションを指定するデータへのポインタです。次の値がoptionとして使われます。

ND_GET_PARM 

指定されたオプション名に対応する通信パス単位の制御情報を、トランスポートプロバイダ(HDLCおよびX.25)が認識できる形式に変換し、netbuf構造体形式で通知します。ファイル記述子fdは、使用しません。pointer_to_argsには、以下に示すpar_options構造体へのポインタを設定します。par_options構造体は<fnetif.h>で定義されています。
   struct par_options {
       char      *optname
       struct netbuf *netbuf
   };
netdir_options( )呼出し時に、optnameにはオプション名を指定します。指定されるオプション名は、/etc/opt/FJSVwan/etc/transport/optionsに定義されているオプション名でなければなりません。transportの部分は、トランスポート・プロバイダのローカルな名前であり、hdlcまたはx25となります。このトランスポート・プロバイダは文字列のアドレスをとります(これは/etc/netconfigファイルのnetwork_idフィールドで指定されます)。netbufには、関数が正常終了した時には、netbuf構造体のポインタが設定され、異常時は不定値が設定されます。

復帰情報となるnetbuf構造体(オプション・バッファ領域を含む)は、netdir_options( )が割り当てますが、その領域の解放は呼出し元であるアプリケーションが行なわなければなりません。解放にはnetdir_free( )ルーチンを使用してください。

◆netdir_perror

netdir_perror( )ルーチンは、ネーム・トゥ・アドレス・マッピング・ルーチンが異常終了した理由を説明するエラー・メッセージを標準出力へ出力します。引数で与えられる文字列が、エラー・メッセージの前に出力されます。

◆netdir_sperror

netdir_sperror( )ルーチンは、ネーム・トゥ・アドレス・マッピング・ルーチンが異常終了した理由を説明するエラー・メッセージの文字列を返します。

8.4.2.3 プログラム例

ネットワーク・セレクションとネーム・トゥ・アドレス・マッピングの使用法としてのプログラム例を示します。

#include <string.h>
#include <netconfig.h>
#include <netdir.h>
#include <tiuser.h>
main(int argc, char **argv)
{
        /*** The following is a segment of a procedure. ***/
        struct nd_hostserv   nd_hostserv;    /* containts host and service information */
        struct netconfig     *netconfigp;    /* contains information about each network */
        struct nd_addrlist   *nd_addrlistp;  /* list of address for the service        */
        struct netbuf        *netbufp;       /* the address of service                 */
        int                  i;              /* counts the number of addresses         */
        void                 *handlep;       /* a handle into network selection        */
        /*
         *   Set the host structure to reference the "date" service machine "gandalf"
         */
        nd_hostserv.h_host = strdup("gandalf");
        nd_hostserv.h_serv = strdup("date");
        /*
         *   Initialize the network selection mechanism
         */
        if((handlep = setnetpath()) == NULL) {
                nc_perror(argv[0]);
                exit(1);
        }
        /*
         *   Loop through the transport providers.
         */
        while((netconfigp = getnetpath(handlep)) != NULL) {
                /*
                 *   Print out the information associated with the transport
                 *   provider described in the "netconfig" structure
                 */
                printf("Transport provider name %s \n", netconfigp->nc_netid);
                printf("Transport protocol family %s \n", netconfigp->nc_protofmly);
                printf("The transport device file %s \n", netconfigp->nc_device);
                switch(netconfigp->nc_semantics) {
                        case NC_TPI_COTS :
                                printf("virtual circuit\n");
                                break;
                        case NC_TPI_COTS_ORD :
                                printf("virtual circuit with orderly release\n");
                                break;
                        case NC_TPI_CLTS :
                                printf("datagram\n");
                                break;
                }
                /*
                 *   Get the address for services "date" on machine "gandalf"
                 *   over the transport provider specified in the netconfgi structure.
                 */
                if(netdir_getbyname(netconfigp, &nd_hostserv, &nd_addrlistp) != 0) {
                        printf("Cannot determine the address for the service\n\n");
                        netdir_perror(argv[0]);
                        continue;
                }
                printf("There are %d addresses for the date service on gandalf:\n",
                                             nd_addrlistp->n_cnt);
                netdir_free( nd_addrlistp, ND_ADDRLIST );
        }
        endnetpath(handlep);
}

目次 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2002