NFSSVC(2)

名称
nfssvc - NFS nfssvc - NFS サービス

ライブラリ
libc

書式
<sys/param.h> <sys/mount.h> <sys/time.h> <nfs/rpcv2.h> <nfs/nfs.h> <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 struct を
    					 * 指すポインタ
    					 */
    	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() はとりわけ注意を払って使用しなくてはなりません。