tail head cat sleep
QR code linking to this page

manページ  — NFSSVC

名称

nfssvc – NFS nfssvc - NFS サービス

内容

ライブラリ

Standard C Library (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 == 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*/
        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() システムコールは BSD 4.4 ではじめて登場しました。

バグ

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

NFSSVC (2) June 9, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.