VOP_SYMLINK(9) FreeBSD 一般コマンドマニュアル

VOP_SYMLINK

前のページ 上に戻る 次のページ

VOP_SYMLINK


     #include <sys/param.h>
     #include <sys/vnode.h>
     #include <sys/namei.h>

     int
     VOP_CREATE(struct vnode *dvp, struct vnode **vpp,
             struct componentname *cnp, struct vattr *vap);

     int
     VOP_MKNOD(struct vnode *dvp, struct vnode **vpp,
             struct componentname *cnp, struct vattr *vap);

     int
     VOP_MKDIR(struct vnode *dvp, struct vnode **vpp,
             struct componentname *cnp, struct vattr *vap);

     int
     VOP_SYMLINK(struct vnode *dvp, struct vnode **vpp,
             struct componentname *cnp, struct vattr *vap, char *target);


解説

     これらのエントリポイントは、新しいファイル、ソケット、FIFO、デバイス、
     ディレクトリまたはシンボリックリンクを、指定されたディレクトリの中に作成
     します。

     引数は以下の通りです。

     dvp     ディレクトリのロックされた vnode。

     vpp     作成結果のロックされた vnode が格納されるべき、変数のアドレス。

     cnp     生成された要素のパス名。

     vap     新しいオブジェクトの作成時に使用されるべき属性。

     target  シンボリックリンクの対象のパス名。

     これらのエントリポイントは、オブジェクトの生成中に VOP_LOOKUP(9) の後に呼
     び出されます。通常、 VOP_LOOKUP(9) は SAVENAME フラグを cnp->cn_flags 中
     に設定して、 cnp->cn_pnbuf で指されるメモリを正当なままに保ちます。ファイ
     ルの作成時にエラーが検出された場合には、このメモリは開放されます。ファイ
     ルがうまく作成された場合には、 cnp に SAVESTART フラグが指定されていなけ
     れば、開放されます。


ロック

     ディレクトリ dvp は入る時にロックされ、戻る時にもロックされ続けてなければ
     なりません。呼び出しが成功の場合には、新しいオブジェクトがロックされて返
     されます。


戻り値

     成功時には、新しいオブジェクトの vnode が *vpp に置かれ、0 が返されます。
     そうでない場合には、適切なエラーが返されます。
             mode |= IFREG;

         error = SOMEFS_VALLOC(dvp, mode, cnp->cn_cred, &vp);
         if (error) {
             free(cnp->cn_pnbuf, M_NAMEI);
             vput(dvp);
             return error;
         }

         /*
          * 新しい vnode のパーミッションを更新します。
          * これには、ディレクトリからのグループのコピーを含みます。
          */
         ...;

     #ifdef QUOTA
         /*
          * できる限りクォータ情報をチェックします。
          */
         ...;
     #endif

         /*
          * ディレクトリに新しい vnode を入れ、ディレクトリ内容が変更される
          * 前に vnode がディスクをアクセスしない様に注意します。
          */
         error = ...;

         if (error)
             goto bad;

         if ((cnp->cn_flags & SAVESTART) == 0)
             free(cnp->cn_pnbuf, M_NAMEI);
         vput(dvp);
         *vpp = vp;

         return 0;

     bad:
         /*
          * inode またはディレクトリの更新の試みで書き込みエラーが
          * 発生したため inode の割り当てを開放しなければなりません。
          */
         free(cnp->cn_pnbuf, M_NAMEI);
         vput(vp);

         /*
          * vp のためのファイルシステム資源を開放。
          */
         ...;

         vput(dvp);


作者

     このマニュアルページは Doug Rabson が書きました。

FreeBSD 4.4                      July 24, 1996                     FreeBSD 4.4

ABELNET VPSサービス