スポンサーリンク

NFSSVC(2) FreeBSD システムコールマニュアル NFSSVC(2)

名称

nfssvc − NFS nfssvc - NFS サービス

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <sys/param.h>
#include <sys/mount.h>
#include <sys/time.h>
#include <nfs/rpcv2.h>
#include <nfs/nfs.h>
#include <unistd.h>

int

nfssvc(int flags, void *argstructp);

解説

nfssvc() システムコールは、NFS デーモンが、情報をカーネルの中に渡したり カーネルから外に渡したりするのに使用され、また、 NFS デーモンがサーバデー モンとしてカーネルに入るのにも使用されます。 flags 引数は、カーネル内でど のような処理を実行するかを示すいくつかのビットで構成されており、 argstructp は、flags 引数でどのビットが設定されたかに従って 3 つある構造 体のうちの 1 つを指します。

クライアント側では、 nfsiod(8)flags 引数を NFSSVC_BIOD に設定し、 argstructp を NULL に設定して nfssvc() を呼び出し、ブロック入出力サーバ デーモンとしてカーネルに入ります。 NQNFS の場合、 mount_nfs(8) は NFSSVC_MNTD フラグを、また、オプションで NFSSVC_GOTAUTH と NFSSVC_AUTHINFAIL の論理和 (or) を取ったものを設定し、次の構造体を指すポ インタとともに nfssvc() を呼び出します。

struct nfsd_cargs {

char

*ncd_dirp;

/* マウントディレクトリパス */

uid_t

ncd_authuid;

/* 実効 uid */

int

ncd_authtype;

/* 認証のタイプ */

int

ncd_authlen;

/* 認証文字列の長さ */

u_char

*ncd_authstr;

/* 認証文字列 */

int

ncd_verflen;

/* および検証機能 */

u_char

*ncd_verfstr;

NFSKERBKEY_T

ncd_key;

/* セッションキー */

};

最初の呼び出しでは、マウントポイントに対するサービスを指定する NFSSVC_MNTD フラグだけが設定されています。マウントポイントが Kerberos を 使用している場合、クライアント側がユーザ用の ‘‘rcmd’’ 認証チケットを要求 するたびに、 mount_nfs(8) ユーティリティは、 errno == ENEEDAUTH で nfssvc() から戻ります。 mount_nfs(8) ユーティリティは、Kerberos チケット を取得しようとし、成功すると、 nfsd_cargs 構造体の ncd_authstr フィールド にチケットを入れ、 ncd_authlen フィールドと ncd_authtype フィールドを設定 した後で、フラグ NFSSVC_MNTD および NFSSVC_GOTAUTH を指定して nfssvc() を 呼び出します。 mount_nfs(8) がチケットを取得するのに失敗した場合、 nfssvc() は、フラグ NFSSVC_MNTD, NFSSVC_GOTAUTH および NFSSVC_AUTHINFAIL を指定して呼び出されて、認証の試みが失敗したことを示します。

サーバ側では、 nfssvc() がフラグ NFSSVC_NFSD と次の構造体を指すポインタと ともに呼び出されて、 nfsd(8) デーモンとしてカーネルに入ります。

struct nfsd_srvargs {

struct nfsd

*nsd_nfsd;

/* カーネル内の nfsd 構造体へのポインタ */

uid_t

nsd_uid;

/* cred にマップされる実効 uid*/

u_int32t

nsd_haddr;

/* クライアントの IP アドレス */

struct ucred

nsd_cr;

/* cred。uid のマップ宛先 */

int

nsd_authlen;

/* 認証文字列の長さ (戻り) */

u_char

*nsd_authstr;

/* 認証文字列 (戻り) */

int

nsd_verflen;

/* および検証機能 */

u_char

*nsd_verfstr;

struct timeval

nsd_timestamp;

/* 検証機能からのタイムスタンプ */

u_int32t

nsd_ttl;

/* 証書の持続時間 (秒) */

NFSKERBKEY_T

nsd_key;

/* セッションキー */

};

nfsd(8) ユーティリティは、Kerberos 認証チケットを受信するたびに、 nfssvc() から errno == ENEEDAUTH で戻ります。 nfsd(8) は、チケットを認証 し、フィールド nsd_uid で指定された ‘‘user id’’ 用の一連の証書をサーバ上 で生成しようとします。これを行うには、最初に Kerberos チケットを認証して から、 Kerberos の主体名 (principal) をローカル名にマップし、 getpwnam(3)getgrouplist(3) 経由でそのユーザについての一連の証書を得ます。正常に完 了すると、 nfsd(8) ユーティリティは、 NFSSVC_NFSD フラグと NFSSVC_AUTHIN フラグを設定して nfssvc() を呼び出し、 nsd_cr 内の証書のマッピングをカー ネルに渡し、そのクライアント用のサーバソケット上でマップがキャッシュされ るようにします。認証が失敗した場合、 nfsd(8) はフラグ NFSSVC_NFSD および NFSSVC_AUTHINFAIL を設定して nfssvc() を呼び出し、認証が失敗したことを示 します。

nfsd(8) マスタサーバデーモンは、フラグ NFSSVC_ADDSOCK および次の構造体を 指すポインタを設定して nfssvc() を呼び出し、 nfsd(8) デーモンがサービスを 行えるようにサーバ側の NFS ソケットをカーネルに渡します。

struct nfsd_args {

int

sock;

/* サービスを行うソケット */

caddr_t

name;

/* 接続指向のソケットのクライアントアドレス */

int

namelen;/* 名前の長さ */

};

戻り値

通常、 nfssvc() は、サーバがシグナルによって終了されるときを除いて戻りま せん。このときには、値 0 が返されます。そうでない場合は、-1 が返され、エ ラーを指定するためにグローバル変数 errno が設定されます。

エラー

       [ENEEDAUTH]

この特殊なエラー値は、実際には認証サポート用、特に、前 述した Kerberos 用に使用されます。

[EPERM]
呼び出し側がスーパユーザではありません。

関連項目

mount_nfs(8), nfsd(8), nfsiod(8)

歴史

nfssvc() システムコールは 4.4BSD ではじめて登場しました。

バグ

nfssvc() システムコールは NFS サポート用に特別に設計されています。そのよ うなものですから、NFS の要求定義に特に従ったものになっています。本来なら ば、認証サポートが必要であることを示す値を返す必要があります。なぜなら、 ENEEDAUTH は本来ならエラーではないからです。引数である構造体のいくつかの フィールドは正当なものであると仮定されており、直前の呼び出しから変更され ないことが時々あります。このようであるので、 nfssvc() はとりわけ注意を 払って使用しなくてはなりません。

FreeBSD 10.0 June 9, 1993 FreeBSD 10.0

スポンサーリンク