EN JA
NFSSVC(2)
NFSSVC(2) FreeBSD System Calls Manual NFSSVC(2)

名称

nfssvcNFS nfssvc - NFS サービス

ライブラリ

Standard C Library (libc, -lc)

書式

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

int
nfssvc( int flags, void *argstructp);

解説

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

クライアント側では、 nfsiod(8) は、 flags 引数を NFSSVC_BIOD に設定し、 argstructpNULL に設定して nfssvc() を呼び出し、ブロック入出力サーバデーモンとしてカーネルに入ります。 NQNFS の場合、 mount_nfs(8) は、 NFSSVC_MNTD フラグを、また、オプションで NFSSVC_GOTAUTHNFSSVC_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 == ENEEDAUTHnfssvc() から戻ります。 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*/ 
 uint32_t 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; /* 検証機能からのタイムスタンプ */ 
 uint32_t 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() は、とりわけ注意を払って使用しなくてはなりません。
June 9, 1993 FreeBSD