この章の目次にもどる
前頁:1.5 メモリ管理にもどる
次頁:1.7 イベント管理にすすむ

1.6 ファイル管理

1.6.1 ファイル管理機能の概要

概要

ファイル管理機能ではフロッピーディスク ( FD )、 ハードディスク ( HD ) 等の上に作成されるファイルシステムの論理構造、 およびファイルを取り扱うためのシステムコール群を規定している。

ファイルシステムを実現する上での各種の物理構造やデータ構造は、 インプリメントに依存するが、 交換用媒体としてのフロッピーディスクに関しては互換性を保つために物理構造の詳細が規定されている。

ファイルシステムは、実身 / 仮身モデルを基本とした構造となっており、 以下のような特徴を持つ。

ファイルは時系列上において複数のユーザにより使用され、 さらにネットワーク環境では複数のユーザにより同時に使用されるためファイルのアクセス管理をきめ細かく行ない、 高いレベルの保護機構を提供している。

ファイルとリンク

ファイルはデータを保持するための容器または保持されたデータ自体であり、 1 つのファイルは可変長の順序付けられたレコードの列から構成される。

リンクはファイルを参照するための手掛かりとなる一種のポインタであり、 参照するファイルを示すデータとリンク独自のいくつかの属性データをひとまとめにしたデータ構造である。

リンクは、 1 つのレコードとして任意のファイルの中に埋め込まれて存在する。 1 つのファイルを示すリンクは複数個存在しても良く、 これにより全体としてネットワーク状の任意のファイル間の参照関係が定義される。

実身 / 仮身モデルとの対応において、 ファイルは実身に、リンクは仮身に 1 対 1 に対応することになる。 実身 / 仮身モデルでは、 ユーザとのビジュアルインタフェースを基本としており、 その意味で、特に仮身はリンクのビジュアル表現とみなすことができる。

ファイルの参照は基本的にリンクを通して直接行なわれるため、 ファイルの名前は絶対的な意味を持たず、 1つの検索キーとして使用される。 ファイル名としては最大20文字の任意のファイル名が付けられるが、 同一のファイル名が存在しても構わない。

ファイルとリンク
図 6 : ファイルとリンク

1.6.2 ファイルシステム構成

ファイルシステム

ファイルシステムはファイルを管理するための 1 つの物理的な単位であり、 1つの機器上の以下のような記憶媒体上に構築され、物理的なサイズの上限を持つ。

ファイルシステムには、必ず 1 つのルートファイルが存在し、 そのルートファイルに含まれるリンクを順次たどっていくことにより、 そのファイルシステム内の全てのファイルに基本的に到達可能である。 ルートファイルは、実身 / 仮身モデルとの対応においてデバイス実身に対応する。

ファイル間のリンクによる参照関係は、 基本的に 1 つのファイルシステム内で定義され整合が取られるが、 他のファイルシステムに存在するファイルを参照するための間接的なリンクを持つことができ、 これを特に間接リンクと呼ぶ。 間接リンクによる参照の場合は、 参照先の他のファイルシステムの変更に対する整合は取られないため、 参照先のファイルの存在は保証されない場合があるため注意が必要である。

ファイルシステムの生成時には、 ファイルシステム名、およびデバイス所在名が設定される。

ファイルシステム名はルートファイルの名称としても設定される最大 20 文字の名前であり、 システムおよびユーザがファイルシステムを絶対的に識別するために使用される。 ファイルシステム名が同一のファイルシステムは、同一とみなされるため、 ファイルシステム名はユニークでなければいけない。

デバイス所在名は、 ファイルシステムが格納されている物理デバイスを示す最大20文字の名前であり、 ネットワーク経由で他のマシンをアクセスする場合や、 フロッピー等の装着を求める場合に使用される。 通常、 デバイス所在名としてはハードディスク等の機器に固定的に付属しているデバイスの場合にはその媒体の一般名称 ( 即ち「ハードディスク」等 ) が使用され、 フロッピーディスク等の取り外し可能な媒体の場合にはその媒体の一般名称 ( 即ち「フロッピーディスク」等 ) が使用される。

ファイルシステムの構成
図 7 : ファイルシステムの構成

ファイルシステムの接続

システムのスタートアップ時には、 ファイルシステムは 1 つも存在していない状態であり、 接続操作を行なうことにより初めて、 ファイルシステムとして使用することが可能となる。 従って、 通常はシステムの初期化処理として最低限のファイルシステムの接続を行なう必要がある。

ファイルシステムの接続は、 接続するファイルシステムが存在する論理デバイス名と、 接続名を指定して行なわれる。接続名は接続したファイルシステムを識別するための最大 8 文字の名前であり、 接続したファイルシステムのルートファイルを示す絶対パス名称として使用される。 また、接続時には接続したファイルシステムのルートファイルへのリンクが得られる。

従って、接続時に得られたリンク、または接続名を使用することにより、 接続したファイルシステム上のルートファイルをアクセスすることが可能となり、 ルートファイルから順次リンクをたどることにより、 接続したファイルシステム上の任意のファイルをアクセスすることが可能となる。

ファイルシステムの切断は、 切断するファイルシステムの論理デバイス名を指定して行なわれ、 これにより切断したファイルシステム上のファイルを示すリンクを通したファイルのアクセスはできない状態となり、 この状態を切断状態と呼ぶ。

実身 / 仮身モデルとの対応において、切断状態のリンクは虚身に対応することになる。

ファイルシステムの接続は、 単にファイルシステムの存在をファイル管理機能に動的に登録するだけの機能であり、 構造を持たない平坦な接続である。 従って、複数のファイルシステムをまたがるネットワーク状の静的なファイル参照構造は、 異なるファイルシステム上のファイルを参照する間接リンクを利用して構築することになる。

ファイルシステムの接続
図 8 : ファイルシステムの接続

ファイルID

1 つのファイルシステム内の全てのファイルには、 生成時にファイルIDと呼ばれるユニークな番号が付けられ、 内部的に識別される。ファイルIDは 0 〜 ( 最大ファイルID ) の範囲の値であり、 最大ファイルID(即ち、最大のファイル数)はファイルシステムの生成時に規定される。 ファイルIDは 16 ビットの数値で表わされるため、 最大ファイルIDは 65535 を越えることはできない。

ファイルシステムのルートファイルは常に 0 のファイル ID を持つ。

リンク

リンクは、ファイルをアクセスするための手掛かりとなる一種のポインタであり、 参照するファイルが存在するファイルシステム名、ファイルID 、 およびリンクとしてのいくつかの属性データを保持しているデータ構造である。

リンクは、ビジュアルな操作環境では、仮身として表示される。

リンクは単なるポインタとしての動的なデータであるが、 ファイル内に 1 つのレコードとして格納することにより固定的な存在となる。 このように格納されたリンクを特に固定 ( フィックスド ) リンクと呼ぶ。固定リンクはファイルシステム名を持たないため、 同一のファイルシステム内のファイルの参照のみ可能であり、 ファイルから固定リンクを取り出した時点で、 そのファイルの属するファイルシステム名がリンクのデータ構造として設定されることになる。

このため、 異なるファイルシステムを参照するリンクを固定リンクとしてファイル内に格納する場合は、 あらかじめ、格納するファイルシステム内にリンクファイルと呼ばれる特殊なファイルを生成し、 そのリンクファイルを示すリンクを固定リンクとして格納する必要がある。

リンクファイルは、参照するファイルの存在するファイルシステム名、 ファイルID、ファイル名、および生成日時 を保持している特殊なファイルであり、 リンクファイルへのアクセスは、 参照している異なるファイルシステム内のファイルへのアクセスと自動的に解釈される。 リンクファイルを示すリンクを特に間接リンクと呼び、 通常のファイルを示すリンクを直接リンクと呼ぶ。

多重の間接リンク、 即ち 2 つ以上のリンクファイルを経由したファイルの参照はサポートされないため、 アクセスした時点でファイルは存在しないというエラーになる。

間接リンクによるリンクファイル経由によるファイルの参照は、 以下のように行なわれる。

間接リンク/リンクファイル
図 9 : 間接リンク/リンクファイル

作業ファイル

あるプロセスが現在処理の対象としているファイルをそのプロセスの作業ファイルと呼ぶ。 プロセスはシステムコールにより任意のファイルを作業ファイルとすることが可能である。

作業ファイルはプロセスの実行環境として保持されており、 生成した子プロセスに継承される。

作業ファイルは未定義とすることも可能であり、 システムで最初に生成されたプロセスの作業ファイルは未定義状態となっている。

パス名

ファイルの参照は基本的にリンクにより直接的に行なわれるが、 バッチ的なアプリケーション等では、 リンクをインタラクティブに順番にたどることができないため、 直接的にたどるべきリンクの列を指定することによりファイルを参照することになる。

このためのリンクの列として、 各リンクの参照するファイル名を順番に並べたものを、 パス名と呼ぶ。この場合、ファイル名だけでは一意性が保証されないため、 その出現順をファイル名に付加して使用する。

出現順は、 1 つのファイル内に同一のファイル名を持つファイルを参照するリンクが n 個存在する場合に先頭から付けられた 0 〜 n-1 の連続番号である。 出現順を省略した場合は 0、即ち最初とみなされる。

図 10 : パス名の出現順

パス名は以下に示す構文を持ち、 最大 256 文字までの 1 つの文字列として取り扱われる。

    [パス名]     ::=[特殊参照]|[特殊参照] / [単純パス名]|[単純パス名]
    [単純パス名] ::=[単純パス名] / [参照指定]| [参照指定]
    [参照指定]   ::=[ファイル名] |[ファイル名]:[出現順]
    [特殊参照]   ::=  / [接続名]| ≡
    [出現順]     ::= 数値
    [ファイル名] ::= 文字列 (最大20文字)
    [接続名]     ::= 文字列 (最大8文字)

    特殊参照は以下の意味を持つ。
      / [接続名] -- 指定した接続名で接続したファイルシステムのルートファイルを示す。
      ≡         -- 作業ファイルを示す。

/ ≡ : の記号は、それぞれ以下に示す特殊コードであるため、 ファイル名としては空白を含めた表示可能なすべての文字が使用可能である。 パス名の文字列の最後に / が存在していた場合は、 それは無視されるものとする。

    /  TC_FDLM     0xff21
    :  TC_FSEP     0xff22
    ≡  TC_FOWN     0xff23

/ [接続名]で始まるパス名は、 そのファイルシステムのルートファイルからのパス名であり、 絶対パス名と呼ぶ。 それ以外の場合は現在の作業ファイルからの相対的なパス名であり、 相対パス名と呼ぶ。

パス名としては以下のようなものがあげられる。

    /最新/プロジェクト/ソフトウェア仕様/核仕様/ファイル管理

    外部仕様/第10章/例:1

    ≡

1.6.3 ファイルの構成

ファイルのタイプ

ファイルには、大きく以下の2種類のタイプが存在し、 単にファイルと言った場合は、通常ファイルを意味する。

通常ファイル :
データの保存場所としての通常の意味でのファイルである。
リンクファイル :
別のファイルシステム内のファイルを間接的に参照するために使用される特殊なファイルであり、このファイルを示すリンクは間接リンクである。

なお、FD、HD、プリンタ、通信ライン等の物理的なデバイスは、 ファイルとしてではなく独立したデバイスとして取り扱う。 これらのデバイスはユニークな名前によりシステムに登録され、 その名前を使用してアクセスされる。

通常ファイルの構成

( 通常 ) ファイルは、 任意バイト長のレコードの順序付けられた列、 即ちレコードストリームにより構成され、 各レコードは、以下の要素により構成される。

レコードタイプは、レコードのタイプを示す 0 〜 31 の値である。

0 :リンクレコード

他のファイルへのリンクを格納するレコードであり、 その内容はファイル管理機能により直接的に取り扱われ、 アプリケーションからの直接的な操作は限定される。

1 〜31 : データレコード

システムとして規定されるレコードタイプであるが、 その内容に関してはファイル管理機能としては特に関知せず、 単なるバイト列として取り扱う。

レコードサブタイプは、レコードタイプに応じて使用される補助的なタイプ指定や、 キーワードに使用される 16 ビットの符号無し数値である。

レコードサイズは、レコード本体のバイト数を示す32ビットのデータである。 リンクレコードの場合はレコードサイズ情報を持たないが、 レコードの入出力に必要な領域のサイズである LINK 構造体のサイズ (52バイト) をレコードサイズとする。 ただし、このリンクレコードのサイズは、 ファイル管理情報としての総バイト数には、 カウントされない。

レコード本体は、レコードサイズで示されたバイト数のデータ列であり、 その内容はレコードタイプに依存して決められている。 リンクレコードの場合はレコード本体は特殊な取り扱いとなる。

番号 / 現在レコード

ファイルの各レコードには、先頭のレコードを 0 としたレコードの順番に従った連続番号が付けられており、 これをレコード番号と呼ぶ。 レコード番号はレコードの順番を示しているためレコードの挿入 / 削除により動的に変化する。

最後のレコードの次に仮想的にレコードが存在しているものと考え、 このレコードを終端レコードと呼ぶ。 N 個のレコードがある場合、終端レコードはレコード番号 N を持つことになる。

オープンしたファイルに対しては現在、 アクセスの対象としているレコードを示す現在レコードが定義され、 現在レコードのレコードに対してデータアクセスが行なわれる。 現在レコードはレコード番号の指定、 レコードタイプによる検索等により移動させることができる。

現在レコードはレコードの挿入 / 削除によっても変化せず、 現在レコードに対応するレコード番号が変化することになる。

レコード番号/現在レコード
図 11 : レコード番号/現在レコード

リンクファイルの構成

リンクファイルは、 異なるファイルシステム内に存在するファイルを間接的に参照するために生成され使用されるファイルであり、 アプリケーションデータは存在せず、以下に示す管理用データのみが保存されている。

1.6.4 ファイルのアクセス管理

ファイルのアクセス管理

ファイルのアクセス管理はファイルをアクセスできるユーザを特定、 または制限することにより、 ファイルの機密保護や不慮の改変/削除から保護するための機構であり、 ファイルをアクセスするプロセスが持つユーザ情報と、 各ファイルに設定されたアクセス管理情報を照らし合わせることによりファイルアクセスの可否を決定することになる。

ユーザ情報

各ユーザには、以下に示すユーザ情報が設定される。

隠しユーザ名、隠しグループ名は、英数字 4 文字程度を暗号化して、 2 文字にコード化したものであり、ユーザ名、グループ名と合わせて、 それぞれ 14 文字の名前として使用される。 隠し名は同一名の衝突を避けるとともに、暗証コードとしての役割を持っている。

隠し名の暗号化アルゴリズムはインプリメントに依存した非公開のものであり、 また個々の機器毎に異なる暗号化がされる必要がある。

これらのユーザ情報はシステム動作開始時に使用者のデフォールト値から読み込まれ、 初期プロセスのユーザ情報となる。 このユーザ情報は子プロセスに継承され、 そのプロセスがファイルをアクセスする際のユーザ情報として使用される。

ファイルのアクセス管理情報

各ファイルには以下のアクセス管理情報が設定される。

アクセスモードの、RWE は以下の意味を持つ。

    R -- ファイルの読出しの可否
    W -- ファイルへの書込み / 変更の可否
    E -- ファイルの実行またはファイル内のリンクの検索の可否

ファイルの所有者名は、そのファイルを生成したユーザ名が自動的に設定され、 生成した後は一切変更することはできない。また、グループ名、アクセスモードは、 ファイルの生成時に指定することができる。グループ名は、 そのユーザが所属する最大 4 つのグループのなかの 1 つを指定することになる。

即ち、ファイルの生成時には、以下のものを指定することができる。

ユーザ毎にデフォールトアクセスモードが定義されており、 ファイルの生成時にデフォールトとして適用させることができる。 このデフォールトアクセスモードはユーザー固有の情報として格納されている内容が使用されるが、 実行時に変更することも可能である。 変更した内容はそのユーザの全プロセスに対して有効となる。

また、ファイルの所有者名、 グループ名の最初の 1 バイトが 0 の場合は、 所有者またはグループが存在しないことを意味し、 その場合は所有者アクセスモード、 グループアクセスレベルは誰にも適用されないことになる。

ファイルに設定されたアクセス管理情報は、 その所有者のみが変更できる (ただし、所有者名は一切変更できない) 。 所有者がないファイルの場合は、 例外的にレベル 0 のユーザーであればアクセス管理情報を変更することができる。

書込不可属性は、ファイルの内容の変更を禁止する属性であり、 この属性が ON の状態ではすべての変更操作は所有者を含めた全てのユーザに対して禁止される。

削除不可属性は、ファイルの削除を禁止する属性であり、 この属性が ON の状態では、 ファイルの削除は所有者を含めた全てのユーザに対して禁止される。

削除不可属性が設定されていないファイルの削除は、 特にアクセス権を必要としないが、 ファイルはどこからも参照されていない場合にのみ削除可能であるため、 実際には削除すべきファイルへの固定リンクを含むすべてのファイルの書込みアクセス権がない限り削除できないことになる。

なお、ファイルシステムの接続操作においては、 書込不可の接続指定が可能であり、 この場合はそのファイルシステムに対するいかなる変更操作も禁止される。 同様に物理的に「書き込み不可」となっているフロッピーディスク等の場合も、 いかなる変更操作も禁止される。

ファイルのアクセスチェック

ファイルのアクセスチェックは、そのユーザが所有者であれば、 所有者アクセスモード、グループに所属していればグループアクセスレベル、 その他の場合は一般アクセスレベルが適用される。

ファイルの所有者名、グループ名の隠し名が0の場合は、 隠し名のマッチングは行なわないものとする。 即ち、プロセスのユーザ情報にある所有者名、 グループ名のそれぞれ 12 文字のみのマッチングにより同一性を判断することになる。

レベル 0 のユーザは、基本的にすべてのファイルの RWE が可能 ( 書込不可属性が付けられた場合には W はできない) となるが、所有者としての権利はないため、アクセスモード、 アクセス属性等を変更することはできない。

例:

    所有者 :                 佐藤
    所有グループ :           プロジェクトA
    所有者アクセスモード :   R W E 可能
    グループアクセスレベル : R レベル 13, W レベル 10, E レベル 13
    一般アクセスレベル :     R レベル  3, W レベル  1, E レベル  5

上記の例の場合、「プロジェクトA」に所属するレベル 0 〜 10 のユーザは、 RWE 可能であり、 レベル 11 〜 13 のユーザは、RE 可能で、 レベル 14, 15 のユーザは一切のアクセスは禁止される。
また、「プロジェクトA」に属さないユーザに対しては、 レベル 0、1 は RWE 可能であり、レベル 2、3 は RE 可能、 レベル 4、5 は 3 のみ可能、 レベル 6 〜 15 は一切のアクセスが禁止される。

アクセス管理のレベル

フロッピーディスクは、通常データの交換媒体として使用されることが多く、 フロッピーディスク上のファイルに対してはアクセス管理はない方が都合が良い場合が多い。 ただし、交換の相手を特定したい場合や、 共用的に使用する場合にはアクセス管理が有効な場合もある。

このために、 ファイルシステム単位で以下の 3 種類のアクセス管理のレベルを設定することができるようにする。 このアクセス管理のレベルは、 そのファイルシステム上のすべてのファイルに対して適用され、 ファイルを生成する場合、およびファイルのアクセス管理情報を変更する場合に、 以下に示したルールに従ってアクセス管理情報の設定が行なわれる。

従って、 ファイルの通常のアクセスチェックに関してはレベルの区別なく行なわれるが、 所有者のチェックに関しては、 レベル0のファイルシステムは特別に取り扱われ、 誰でも所有者としての権利を持つことになる。

a. レベル 0 -- アクセス管理は一切行なわれない

常に以下の内容のアクセス管理情報が設定される。

     所有者名、隠し名       : 0 (なし)
     グループ名、隠し名     : 0 (なし)
     所有者アスセス         : 0 (RWE不可)
     グループアクセスレベル : 0 (RWE不可)
     一般アクセスレベル     : 0x0fff (誰でもRWE可)
     
b. レベル 1 -- アクセス管理は部分的に行なわれる

所有者名/グループ名の隠し名は常に 0 に設定される。

c. レベル 2 -- アクセス管理は完全に行なわれる

完全なアクセス管理情報が設定される。

一般にフロッピーディスク等の取り外し可能媒体に対しては、 レベル 0 またはレベル 1 とし、 ハードディスク等の機器に固定的に付属するものに関してはレベル 2 とする。 取り外し可能媒体に対してレベル 2 を設定した場合は、 暗号化が機器毎に異なるため事実上 1 つの機器でしか使用できなくなる。

このアクセス管理レベルはファイルシステムを生成する時点で、 ファイルシステムの管理情報として設定される。

1.6.5 ファイルの操作

プロセスの環境

ファイルはプロセスによりアクセスされるが、 オープンしたファイルに対しては各プロセス毎で定義されるファイルディスクリプタ (fd > 0 ) という正の整数値が割り当てられ、 そのファイルディスクリプタを使用して実際のファイルアクセスを行なう。

プロセスの終了時には、オープンしたファイルはすべて自動的にクローズされる。

また、オープンしたファイルに対しては、 現在対象としているレコードを示す現在レコードが定義される。

ファイルディスクリプタ、現在レコード位置は、 そのプロセス固有のものとして定義され、子プロセスには特に継承されない。

プロセスの環境として作業ファイル、ユーザ管理情報は子プロセスに継承される。 また、デフォールトアクセスモードはユーザ毎に定義され、 変更した場合は同一ユーザーのすべてのプロセスに対して即時に有効となる。

ファイルの参照カウント

ファイルには、 そのファイルを参照している同一ファイルシステム内の固定リンクの数を示す参照カウントが存在する。 参照カウントはファイルを生成した時点では 0 であり、 ファイルに対する固定リンクを生成した時点、 即ち、リンクをファイル内に格納した時点で +1 される。 逆に固定リンクが削除された時点で参照カウントは -1 される。

参照カウントは、同一ファイルシステム内での参照を示すため、 リンクファイルを経由したファイルの参照は、 参照カウントに反映されないことになる。 なお、リンクファイル自体にも参照カウントは適用される。

ファイルの削除は参照カウント 0 のファイルに対してのみ可能である。 削除したファイルに固定リンクが含まれていた場合は、 その固定リンクが参照しているファイルの参照カウントが -1 されるが、 その結果 0 となった場合でも、 そのファイルは削除されない。 なお、固定リンクが含まれているファイルの削除は、 削除時に強制削除の指定を行なった時のみ可能となる。

リンクファイルの削除も同様であり、 リンクファイル自体の参照カウントが 0 の場合に削除可能となる。 なお、リンクファイルの参照先のファイルは、リンクファイル経由で削除することはできない。

ファイルシステムのルートファイルは例外的に参照カウントが最初から 1 となっており、 決して削除することができないようになっている。

参照カウント 0 のファイルは、 そのファイルを参照する固定リンクを持たないため、 動的なリンクが失われてしまうと、通常の方法ではアクセスできないことになるが、 ファイルシステム内の全てのファイルに対するリンクを取り出す方法によりアクセスすることは可能である。

ファイルのアクセス

ファイルは、読込み(READ) / 書込み(WRITE) / 更新(UPDATE) のいずれかを指定してオープンするが、 オープン時に他からの同一ファイルの同時オープンを制限するための以下のモード指定が可能である。 デフォールトは共有モードとなるが、通常は排他書込モードとすることが安全である。

排他モード :
他からのいかなる同時オープンを一切禁止するモード。
排他書込モード :
他からの書込み / 更新の同時オープンを一切禁止するモード。
共有モード :
他からのいかなる同時オープンも禁止しないモード。

以下に既にオープンされているモードに対して新規に同時オープンできるモードの組み合わせを示す。 新規の同時オープンが不可の場合はオープン時にエラーとなる。

ファイルのオープンモード
図 12 : ファイルのオープンモード

また、 オープンしたファイルのレコード単位で他からのアクセスを禁止するためのレコードロック機能が用意されている。

ロックしたレコードに対する他からのアクセスは以下のようになる。

既にロックされているレコードをロックしようとした場合はエラーとなるか、 またはロックが解かれるまで待たされることになる。

1.6.6 ファイルの詳細情報

ファイルシステムの管理情報

個々のファイルシステムに対して、以下の内容の管理情報を読み出すことができる。

    typedef struct {
        H       fs_bsize;           /* 論理ブロックのバイト数 */
        UH      fs_nfile;           /* 最大ファイル数 */
        H       fs_lang;            /* ファイルシステムでの使用言語 */
        H       fs_level;           /* ファイルシステムのアクセス管理レベル */
        W       fs_nblk;            /* 全体のブロック数 */
        W       fs_nfree;           /* 未使用ブロックの総数 */
        STIME   fs_mtime;           /* 最新のシステムブロックの更新日時 */
        STIME   fs_ctime;           /* ファイルシステムの生成日時 */
        TC      fs_name[L_FSNM];    /* ファイルシステム名 */
        TC      fs_locat[L_DLNM];   /* デバイス所在名 */
    } FS_STATE;

ファイルシステムの管理情報はファイルシステムの生成時 ( フォーマット時 ) に設定され、 以後は未使用ブロックの総数 (fs_nfree) と、 最新のシステムブロックの更新日時 ( fs_mtime)、 ファイルシステム名、およびデバイス所在名を除いて変更されることはない。

ファイルの管理情報

個々のファイルに対して以下の内容の管理情報を読み出すことができる。 但し、リンクファイルの場合はリンクファイルが参照するファイルの管理情報となり、 リンクファイル自体の管理情報は読み出すことはできない。

ファイル名 :
20文字のファイル名であり変更可能である。
参照カウント :
ファイルを参照している同一ファイルシステム内の固定リンクの数である。
ファイル管理情報 :
以下に示す各種の管理情報である。
    typedef struct {
        UH      f_type;           /* ファイルタイプ/所有者アクセスモード */
        UH      f_atype;          /* アプリケーションタイプ */
        TC      f_owner[L_USRNM]; /* ファイル所有者名 (隠し名は常に0) */
        TC      f_group[L_USRNM]; /* 所有グループ名   (隠し名は常に0) */
        UH      f_grpacc;         /* グループアクセスレベル */
        UH      f_pubacc;         /* 一般アクセスレベル */
        H       f_nlink;          /* 含まれているリンク数 */
        H       f_index;          /* インデックスレベル */
        W       f_size;           /* ファイルの総バイト数 */
        W       f_nblk;           /* 総使用論理ブロック数 */
        W       f_nrec;           /* 総レコード数 */
        STIME   f_ltime;          /* ファイルの保存期限(日時) */
        STIME   f_atime;          /* 最新のアクセス日時 */
        STIME   f_mtime;          /* 最新の更新日時 */
        STIME   f_ctime;          /* ファイルの作成日時 */
    } F_STATE;
ファイルの所在情報 :
各ファイルが属するファイルシステムの情報であり、 この内容はファイルシステムの管理情報の一部である。
    typedef struct {
        STIME   fs_ctime;           /* ファイルシステムの生成日時 */
        TC      fs_name[L_FSNM];    /* ファイルシステム名 */
        TC      fs_locat[L_DLNM];   /* デバイス所在名 */
        TC      fs_dev[L_DEVNM];    /* 論理デバイス名 */
    } F_LOCATE;
リンクファイル情報 :
リンクファイルに対してはリンクファイル自体に保持されている以下の参照先のファイルの情報が得られる。 この情報は参照先のファイルシステムが接続されていない場合でも取り出すことが可能である。
    typedef struct {
        STIME   f_ctime;            /* リンクファイル自体の生成日時 */
        UH      f_atype;            /* 参照ファイルのアプリタイプ */
        TC      f_name[L_FNM];      /* 参照ファイル名 */
        UH      f_id;               /* 参照ファイルID */
        STIME   rf_ctime;           /* 参照ファイルの生成日時 */
        TC      fs_name[L_FSNM];    /* ファイルシステム名 */
        TC      fs_locat[L_DLNM];   /* ファイルシステムのデバイス所在名 */
    } F_LINK;

リンクの構造

ファイルをアクセスするために使用される、リンクは以下のデータ構造となる。

    typedef struct {
        TC  fs_name[L_FSNM];    /* ファイルシステム名 */
        UH  f_id;               /* ファイル ID */
        UH  atr1;               /* 属性データ1 */
        UH  atr2;               /* 属性データ2 */
        UH  atr3;               /* 属性データ3 */
        UH  atr4;               /* 属性データ4 */
        UH  atr5;               /* 属性データ5 */
    } LINK;

ファイル管理ではファイルシステム名とファイルIDのみを使用して実際のファイルアクセスが行なわれる。

通常、リンクはファイル管理機能から得られたものを使用するが、 アプリケーションがファイルシステム名とファイルIDを直接設定してリンクを作成することも可能である。

例えばファイルシステムのルートファイルへのリンクは、ファイル ID = 0 であるため、 ファイルシステム名が判っていればアプリケーションで直接リンクを作成することが可能となる。

1.6.7 データ/定数の定義

□ 各種名前の長さ(文字数)

#define L_FSNM      20      /* ファイルシステム名 */
#define L_DLNM      20      /* デバイス所在名 */
#define L_DEVNM     8       /* 論理デバイス名 */
#define L_CONNM     8       /* 接続名 */
#define L_USRNM     (12+2)  /* ユーザ(グループ)名 + 隠し名 */
#define L_FNM       20      /* ファイル名 */
#define L_PATHNM    256     /* パス名 */

□ 各種サイズ

#define N_GRP       4       /* 所属グループ数 */

□ パス名の特殊記号

#define TC_FDLM     0xff21      /* '/'  パス名の区切り */
#define TC_FSEP     0xff22      /* ':'  出現順の区切り */
#define TC_FOWN     0xff23      /* '≡'  自分自身(作業ファイル) */

□ get_lnk()

#define F_NORM      0x0000      /* 通常指定 */
#define F_BASED     0x0001      /* ベース指定 */
#define F_DIRECT    0x0002      /* 直接取り出し指定 */

□ opn_fil()

#define F_READ      0x0004      /* 読み込み専用オープン */
#define F_WRITE     0x0002      /* 書き込み専用オープン */
#define F_UPDATE    0x0006      /* 更新用(読込/書込)オープン */
#define F_EXCL      0x0100      /* 排他モード */
#define F_WEXCL     0x0200      /* 排他書き込みモード */

□ cre_fil()/cre_lnk()

#define F_FLOAT     0x0000      /* 固定リンクとしない */
#define F_FIX       0x0001      /* 固定リンクとする */
#define F_FILEID    0x0002      /* ファイル ID 指定 */

□ fnd_rec()/fnd_lnk()

#define F_FWD       0x0000      /* 前向きサーチ */
#define F_NFWD      0x0001      /* 前向きサーチ(次から) */
#define F_BWD       0x0002      /* 後向きサーチ */
#define F_NBWD      0x0003      /* 後向きサーチ(手前から) */
#define F_TOPEND    0x0004      /* 先頭から終端 */
#define F_ENDTOP    0x0005      /* 終端から先頭 */
#define F_SFILE     0x4000      /* 同一ファイル    */
#define F_SNAME     0x2000      /* 同一ファイル名  */
#define F_SATR1     0x1000      /* 同一属性データ1 */
#define F_SATR2     0x0800      /* 同一属性データ2 */
#define F_SATR3     0x0400      /* 同一属性データ3 */
#define F_SATR4     0x0200      /* 同一属性データ4 */
#define F_SATR5     0x0100      /* 同一属性データ5 */

□ loc_rec()

#define F_UNLOCK    0x0000      /* アンロック */
#define F_LOCK      0x0001      /* ロック */
#define F_TSLOCK    0x0002      /* テスト & ロック */
#define F_CKLOCK    0x0003      /* ロック状態のチェック */

□ map_rec()

#define F_READ      0x0004      /* R アクセス */
#define F_WRITE     0x0002      /* W アクセス */
#define F_EXCUTE    0x0001      /* E アクセス */
#define F_COMMON    0x0100      /* 共有メモリー空間にマップ */
#define F_SYSTEM    0x0300      /* システムメモリー空間にマップ */

□ chk_fil()

#define F_READ      0x0004      /* R アクセスチェック */
#define F_WRITE     0x0002      /* W アクセスチェック */
#define F_EXCUTE    0x0001      /* E アクセスチェック */
#define F_EXIST     0x0000      /* ファイルの存在チェック */
#define F_PASWD     0x0008      /* パスワードの有無 */

□ chg_fat()

#define F_SETRONLY  0x0001      /* 書込不可属性のセット  */
#define F_RSTRONLY  0x0002      /* 書込不可属性のリセット*/
#define F_SETPERM   0x0003      /* 削除不可属性のセット  */
#define F_RSTPERM   0x0004      /* 削除不可属性のリセット*/
#define F_SETA1     0x0005      /* アプリ属性1のセット   */
#define F_RSTA1     0x0006      /* アプリ属性1のリセット */
#define F_SETA2     0x0007      /* アプリ属性2のセット   */
#define F_RSTA2     0x0008      /* アプリ属性2のリセット */

□ att_fls()

#define FS_SYNC     0x0000      /* 同期指定 */
#define FS_ASYN     0x0002      /* 非同期指定 */
#define FS_RONLY    0x0001      /* 書き込み禁止 */

□ lst_fls()

#define F_GETDEV    (-1)        /* 対応するデバイス名を得る */
#define F_GETNAM    (-2)        /* 対応する接続名を得る */

□ syn_lnk()

#define F_SYNC      0       /* 一致している */
#define F_DNAME     1       /* ファイル名が異なっていた */
#define F_DDATE     2       /* 生成日時が異なっていた */
#define F_DBOTH     3       /* ファイル名と生成日時が異なる */

□ リンク

typedef struct {
    TC  fs_name[L_FSNM];    /* ファイルシステム名 */
    UH  f_id;               /* ファイル ID */
    UH  atr1;               /* 属性データ1 */
    UH  atr2;               /* 属性データ2 */
    UH  atr3;               /* 属性データ3 */
    UH  atr4;               /* 属性データ4 */
    UH  atr5;               /* 属性データ5 */
} LINK;

□ ファイルアクセスモード

typedef struct {
    UH  f_ownacc;       /* 所有者アクセスモード */
    UH  f_grpacc;       /* グループアクセスレベル */
    UH  f_pubacc;       /* 一般アクセスレベル */
    H   f_grpno;        /* グループ番号 */
} A_MODE;

□ デフォルトファイルアクセスモード

typedef struct {
    UH  f_ownacc;       /* 所有者アクセスモード */
    UH  f_grpacc;       /* グループアクセスレベル */
    UH  f_pubacc;       /* 一般アクセスレベル */
    H   f_grpno;        /* グループ番号 */
    UH  f_gacc[N_GRP];  /* グループアクセスレベル */
} DA_MODE;

□ ファイル日時

typedef struct {
    STIME   f_ltime;        /* ファイルの保存期限(日時) */
    STIME   f_atime;        /* 最新のアクセス日時 */
    STIME   f_mtime;        /* 最新の更新日時 */
} F_TIME;

□ ファイル管理情報

typedef struct {
    UH      f_type;             /* ファイルタイプ/所有者アクセスモード */
    UH      f_atype;            /* アプリケーションタイプ */
    TC      f_owner[L_USRNM];   /* ファイル所有者名 (隠し名は常に0) */
    TC      f_group[L_USRNM];   /* 所有グループ名   (隠し名は常に0) */
    UH      f_grpacc;           /* グループアクセスレベル */
    UH      f_pubacc;           /* 一般アクセスレベル */
    H       f_nlink;            /* 含まれているリンク数 */
    H       f_index;            /* インデックスレベル */
    W       f_size;             /* ファイルの総バイト数 */
    W       f_nblk;             /* 総使用論理ブロック数 */
    W       f_nrec;             /* 総レコード数 */
    STIME   f_ltime;            /* ファイルの保存期限(日時) */
    STIME   f_atime;            /* 最新のアクセス日時 */
    STIME   f_mtime;            /* 最新の更新日時 */
    STIME   f_ctime;            /* ファイルの作成日時 */
} F_STATE;

□ ファイルタイプ(f_type)

#define F_FILE      0x1000      /* 通常ファイル */
#define F_APLATR1   0x0040      /* アプリケーション属性1 */
#define F_APLATR2   0x0080      /* アプリケーション属性2 */
#define F_RONLY     0x0010      /* 書込不可属性 */
#define F_PERM      0x0020      /* 削除不可属性 */
#define F_OWNACC    0x0007      /* 所有者アクセス属性(RWE) */
#define F_OWNACR    0x0004      /* 所有者のRアクセス属性   */
#define F_OWNACW    0x0002      /* 所有者のWアクセス属性   */
#define F_OWNACE    0x0001      /* 所有者のEアクセス属性   */
#define F_NOCHG     0x8000      /* 変更しない */

□ ファイル所在情報

typedef struct {
    STIME   fs_ctime;           /* ファイルシステムの生成日時 */
    TC      fs_name[L_FSNM];    /* ファイルシステム名 */
    TC      fs_locat[L_DLNM];   /* デバイス所在名 */
    TC      fs_dev[L_DEVNM];    /* 論理デバイス名 */
} F_LOCATE;

□ リンク情報

typedef struct {
    STIME   f_ctime;            /* リンクファイル自体の生成日時 */
    UH      f_atype;            /* 参照ファイルのアプリタイプ */
    TC      f_name[L_FNM];      /* 参照ファイル名 */
    UH      f_id;               /* 参照ファイルID */
    STIME   rf_ctime;           /* 参照ファイルの生成日時 */
    TC      fs_name[L_FSNM];    /* ファイルシステム名 */
    TC      fs_locat[L_DLNM];   /* ファイルシステムのデバイス所在名 */
} F_LINK;

□ ファイルシステム管理情報

typedef struct {
    H       fs_bsize;           /* 論理ブロックのバイト数 */
    UH      fs_nfile;           /* 最大ファイル数 */
    H       fs_lang;            /* ファイルシステムでの使用言語 */
    H       fs_level;           /* ファイルシステムのアクセス管理レベル */
    W       fs_nblk;            /* 全体のブロック数 */
    W       fs_nfree;           /* 未使用ブロックの総数 */
    STIME   fs_mtime;           /* 最新のシステムブロックの更新日時 */
    STIME   fs_ctime;           /* ファイルシステムの生成日時 */
    TC      fs_name[L_FSNM];    /* ファイルシステム名 */
    TC      fs_locat[L_DLNM];   /* デバイス所在名 */
} FS_STATE;

□ 使用言語

#define F_JPN       0x0021      /* 日本語 (日本語文字族) */
#define F_ENG       0x0080      /* 英語 (ラテン文字族1) */

□ ファイルシステム接続情報

typedef struct {
    TC  a_name[L_CONNM];    /* 接続名 */
    TC  dev[L_DEVNM];       /* 論理デバイス名 */
} F_ATTACH;

1.6.8 システムコール

関数のパラメータの説明では、以下に示す記述方法を使用している。

    ( x ‖ y ‖ z ) -- x, y, z のいずれか1つを意味する。
    |               -- OR で指定可能なことを意味する。
    [ ]             -- 省略可能なことを意味する。
    例: mode  := (F_NORM ‖ F_BASED) | [F_DIRECT]  の場合、
        mode の指定は、以下の 4 種のいずれか 1 つとなる。

            F_NORM
            F_BASED
            F_NORM | F_DIRECT
            F_BASED | F_DIRECT
get_lnk
 
ファイルのリンク獲得

【形式】

WERR    get_lnk(TC *path, LINK *lnk, W mode)

【パラメータ】

TC      *path   対象パス名
        NULL    作業ファイルを対象

LINK    *lnk    獲得したリンクの格納領域    (出力)
                作業ファイル指定            (入力:F_BASED 指定時)

W   mode    リンク獲得モード
        ( F_NORM ‖ F_BASED ) | [ F_DIRECT ]
        F_NORM      通常指定
        F_BASED     作業ファイル指定
        F_DIRECT    直接リンク獲得指定

【リターン値】

=0    正常(通常ファイルのリンク)
=1    正常(リンクファイルのリンク:F_DIRECT 指定なし)
=2    正常(リンクファイルが参照する通常ファイルのリンク:F_DIRECT 指定時)
<0    エラー(エラーコード)

【解説】

パス名で指定したファイルのリンクを獲得する。 パス名の指定が NULL の時は現在の作業ファイルのリンクを獲得する。

パス名が相対パス名のとき、F_NORM 指定のときは現在の作業ファイルをベースとするが、 F_BASED 指定のときは lnk で指定したファイルを作業ファイルとみなしてベースとする。

指定したファイルがリンクファイルのとき、 F_DIRECT 指定なしのときはリンクファイル自体へのリンクを獲得する。 このとき、得られたリンクファイルが参照する通常ファイルの存在は保証されない。

F_DIRECT 指定のときはリンクファイルが参照する通常ファイルへの直接のリンクを獲得する。

ファイルのリンクを取り出すためには、 パス名に含まれる各ファイルに対しての実行 / サーチ(E)アクセス権が必要となるが、 対象ファイル自体の実行 / サーチ(E)アクセス権は必要ない。

【エラーコード】

ER_ACCES    : パス名(path)内の経路ファイルのアクセス権(E)がない。
ER_ADR      : アドレス(path,lnk)のアクセスは許されていない。
ER_FNAME    : パス名(path)が空、不正、または長すぎる。
ER_IO       : 入出力エラーが発生した。
ER_NOFS     : パス名(path)内のファイル、リンクファイルの参照ファイル
              (F_DIRECT指定時)の属するファイルシステムは接続されていない。
ER_NOEXS    : パス名(path)内のファイル、リンクファイルの参照ファイル
              (F_DIRECT指定時)は存在していない、または作業ファイルが未定義。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(mode が不正)。
chg_wrk
 
作業ファイル変更

【形式】

ERR chg_wrk(LINK *lnk)

【パラメータ】

LINK    *lnk    変更する作業ファイル
        NULL    作業ファイルを未定義とする

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したファイルを自プロセスの作業ファイルとする。

作業ファイルとするためには、そのファイルに対しての実行 / サーチ(E)アクセス権が必要となる。

【エラーコード】

ER_ACCES    : ファイル(lnk)のアクセス権(E)がない。
ER_ADR      : アドレス(lnk)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
cre_fil
 
ファイル生成

【形式】

WERR    cre_fil(LINK *lnk, TC *name, A_MODE *mode, UH atype, W opt)

【パラメータ】

LINK    *lnk    生成したファイルのリンク格納領域(出力)
        ファイルシステム指定        (入力:F_FLOAT 指定時)
        親ファイル指定              (入力:F_FIX 指定時)
        生成ファイル指定            (入力:F_FILEID 指定時)

TC      *name   ファイル名(0または最大ファイル名文字数まで有効)

A_MODE  *mode   アクセスモード
        NULL    デフォールトアクセスモード適用

UH      atype   ファイルアプリケーションタイプ

W       opt     生成属性
        ( FLOAT ‖ F_FIX ‖ F_FILEID )
        F_FLOAT     浮動リンク指定
        F_FIX       固定リンク指定
        F_FILEID    ファイルID指定

【リターン値】

>0    正常(ファイルディスクプリタ)
<0    エラー(エラーコード)

【解説】

lnk で指定したファイル ( リンクファイルのときはリンクファイルが参照する通常ファイル ) が存在するファイルシステム上に新規に通常ファイルを生成し、 更新用にオープンする。

生成したファイルのリンクの属性データはすべて 0 に設定され、 lnk で指定した領域に格納される。

F_FLOAT 指定のときは、単純にファイルを生成する。 生成したファイルの参照カウントは 0 となる。 この場合、lnk で指定した内容のファイルシステム名のみが有効でありファイルIDは無視されるため lnk で指定したファイルは存在していなくてもよい。

F_FIX 指定のときは、生成したファイルのリンクを lnk で指定したファイルの最後のレコード位置にリンクレコード (サブタイプ = 0 ) として追加る。 生成したファイルの参照カウントは 1 となる。 この場合、lnk で指定したファイルは存在し、 かつ書き込みオープンできなくてはいけない。

F_FILEID 指定のときは、lnk で指定した内容のファイルIDと同じファイルIDのファイルを生成する。 生成したファイルの参照カウントは 0 となる。 この場合、lnk で指定したファイルは存在していてはいけない。

A_MODE は生成したファイルのアクセスモードを指定する。 ファイルの所有者はファイルを生成したプロセスのユーザとなる。

生成したファイルの所有者アクセスモードが書き込み不可のときでも、 ファイルは更新用にオープンされる。 この状態ではレコードは 1 つも存在しないため現在レコードは終端レコードであり、 そのレコード番号は0となる。

【エラーコード】

ER_ACCES    : ファイル(lnk)のアクセス権(W)がない(F_FIX指定時)。
ER_ADR      : アドレス(lnk,name,mode)のアクセスは許されていない。
ER_BUSY     : ファイル(lnk)は既に排他的にオープンされている為、
              同時にファイルをオープンすることができなかった(F_FIX指定時)。
ER_EXS      : ファイル(lnk)は既に存在している(F_FILEID指定時)。
ER_FNAME    : ファイル名(name)は空または不正である。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : 最大ファイル数を越えた、
              または同時オープン可能な最大ファイル数を越えた。
ER_NODSK    : ディスクの領域が不足した。
ER_NOEXS    : ファイル(lnk)は存在していない(F_FIX指定時)。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(f_grpno<0,>4 ,opt が不正)。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である。
ER_SZOVR    : ファイル(lnk)のサイズがシステムの制限を越えた(F_FIX指定時)。
cre_lnk
 
リンクファイルの生成

【形式】

ERR cre_lnk(LINK *lnk, F_LINK *ref, W opt)

【パラメータ】

LINK    *lnk    生成したファイルのリンク格納領域(出力)
        ファイルシステム指定        (入力:F_FLOAT 指定時)
        親ファイル指定              (入力:F_FIX 指定時)
        生成ファイル指定            (入力:F_FILEID 指定時)

F_LINK  *ref    生成するリンクファイルの内容

W       opt     生成属性
        ( F_FLOAT ‖ F_FIX ‖ F_FILEID )
F_FLOAT :
浮動リンク指定

生成したリンクファイルのリンクを単に lnk に戻す。 この場合、 生成したリンクファイルの参照カウントは 0 となる。 この指定を行なった場合は、lnk のファイルシステム名のみが使用され、 ファイルIDで示されるファイルは実際に存在しなくてもよい。

F_FIX :
固定リンク指定

生成したリンクファイルのリンクを、 lnk で指定したファイルの適当な位置のレコードとして追加する。 追加されるレコードの位置は保証されない。 この場合、 生成したリンクファイルの参照カウントは 1 となる。 追加されるリンクレコードのサブタイプは 0 であり、 属性データはすべて 0 となる。 この指定を行なった場合は、lnk で指定したファイルは存在し、 かつ F_WRITE オープンできなくてはいけない。

F_FILEID :
ファイルID指定

lnk で指定したファイルIDを持つリンクファイルを生成し、 生成したリンクファイルのリンクを単に lnk に戻す。 この場合、生成したリンクファイルの参照カウントは 0 となる。 この指定を行なった場合は、lnk で指定したファイルIDを持つファイルが既に存在していた場合(リンクファイルも含む)は、 エラー ( ER_EXS ) となる。

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

lnk で指定したファイル ( リンクファイルのときはリンクファイルが参照する通常ファイル ) が存在するファイルシステム上に新規に ref で指定した内容のリンクファイルを生成する。

生成したリンクファイルのリンクの属性データはすべて 0 に設定され、 lnk で指定した領域に格納される。

F_FLOAT, F_FIX, F_FILEID の意味は cre_fil() と同一である。

生成したリンクファイルの内容は ref で指定した内容となるが、 その生成日時は、ref->f_ctime ではなく、 本システムコールを実行した日時となる。

ref で指定したファイルの実際の存在はチェックされない。

ref->fs_namelnk で指定したファイルシステム名と同一のときはリンクファイルは生成できないためエラーとなる。

【エラーコード】

ER_ACCES    : ファイル(lnk)のアクセス権(W)がない(F_FIX指定時)。
ER_ADR      : アドレス(lnk,ref)のアクセスは許されていない。
ER_BUSY     : ファイル(lnk)は既に排他的にオープンされている為、同時にファイルを
              オープンすることができなかった(F_FIX指定時)。
ER_EXS      : ファイル(lnk)は既に存在している(F_FILEID指定時)。
ER_FNAME    : ファイル名(ref->f_name)ファイルシステム名(ref->fs_name)
              は空または不正である。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : 最大ファイル数を越えた。
ER_NODSK    : ディスクの領域が不足した。
ER_NOEXS    : ファイル(lnk)は存在していない(F_FIX指定時)。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(opt が不正、同一ファイルシステム)。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である(F_FIX指定時)。
ER_SZOVR    : ファイル(lnk)のサイズがシステムの制限を越えた(F_FIX指定時)。
gen_fil
 
ファイルの直接生成

【形式】

WERR    gen_fil(LINK *lnk, TC *name, F_STATE *stat, F_LINK *ref, W opt)

【パラメータ】

LINK    *lnk    生成したファイルのリンク格納領域(出力)
        ファイルシステム指定        (入力:F_FLOAT 指定時)
        親ファイル指定              (入力:F_FIX 指定時)
        生成ファイル指定            (入力:F_FILEID 指定時)

TC      *name   ファイル名(0または最大ファイル文字数まで有効)
        (通常ファイル生成時のみ有効で、このとき name が NULL ならばエラーとなる)
        (リンクファイルの生成の場合は一切参照されない)

F_STATE *stat   生成するファイルの内容

F_LINK  *ref    生成するリンクファイルの内容
        (リンクファイル生成時のみ有効)

W       opt     生成属性
        ( F_FLOAT ‖ F_FIX ‖ F_FILEID )
        F_FLOAT     浮動リンク指定
        F_FIX       固定リンク指定
        F_FILEID    ファイルID指定

【リターン値】

>0    正常(ファイルディスクプリタ:通常ファイル生成時)
=0    正常(リンクファイル生成時)
<0    エラー(エラーコード)

【解説】

lnk で指定したファイル ( リンクファイルのときはリンクファイルが参照する通常ファイル ) が存在するファイルシステム上に新規に通常ファイルまたはリンクファイルを生成し、 通常ファイルのときは更新用にオープンする。

生成したリンクファイルのリンクの属性データはすべて 0 に設定され、 lnk で指定した領域に格納される。

F_FLOAT, F_FIX, F_FILEID の意味は cre_fil() と同一である。

生成したファイルの内容は stat で指定し、 stat->f_type により通常ファイルかリンクファイルか区別される。

通常ファイル生成のときは、name で指定した名前の通常ファイルを生成し、生成したファイルの管理情報を stat で指定した内容に設定する。 ただし、f_nlink, f_index, f_size, f_nblk, f_nrec の値は無視されファイルの生成時に初期化される。

リンクファイル生成のときは、stat の他の内容はすべて無視され、 ref の内容のリンクファイルを生成する、 cre_lnk() と同様の動作であるが、 ref->f_ctime も有効となる。

本システムコールはファイルシステムの復元などの特殊な用途に使用されるため、 ユーザレベル 0 のプロセスでのみ実行可能である。

通常ファイルを生成したときはファイルは更新用にオープンされる。 この状態ではレコードは 1 つも存在しないため現在レコードは終端レコードであり、 そのレコード番号は 0 となる。

【エラーコード】

ER_ACCES    : レベル0のユーザでない。
ER_ADR      : アドレス(lnk,ref,name,stat)のアクセスは許されていない。
ER_BUSY     : ファイル(lnk)は既に排他的にオープンされている為、同時にファイルを
              オープンすることができなかった(F_FIX指定時)。
ER_EXS      : ファイル(lnk)は既に存在している(F_FILEID指定時)。
ER_FNAME    : ファイル名(name)、ファイル名(ref->f_name)、
              ファイルシステム名(ref->fs_name)は空または不正である。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : 最大ファイル数を越えた、または同時オープン可能な最大ファイル数を
              越えた。
R_NODSK     : ディスクの領域が不足した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である
              (opt が不正、同一ファイルシステム、ref, stat の内容が不正)。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である。
ER_SZOVR    : ファイル(lnk)のサイズがシステムの制限を越えた(F_FIX指定時)。
opn_fil
 
ファイルのオープン

【形式】

WERR    opn_fil(LINK *lnk, W o_mode, TC *pwd)

【パラメータ】

LINK    *lnk    対象ファイル

W       o_mode  オープンモード
        ( F_READ ‖ F_WRITE ‖ F_UPDATE ) | [ F_EXCL ‖ F_WEXCL ]
        F_READ      読み込み用オープン
        F_WRITE     書き込み用オープン
        F_UPDATE    更新(読み込み/書き込み)用オープン
        F_EXCL      排他モード
        F_WEXCL     排他書き込みモード

TC      *pwd    パスワード
        NULL        パスワード指定なし

【リターン値】

>0    正常(ファイルディスクリプタ)
<0    エラー(エラーコード)

【解説】

lnk で指定したファイルを指定したモードでオープンする。 ファイルをオープンするためにはオープンモードに対応するアクセス権が必要である。

pwd はファイルにパスワードが設定されている場合に有効であり、 パスワードが一致しない場合はエラーとなる。

オープンしたファイルの先頭レコードが現在レコードとなる。 レコードが 1 つも存在しないときは終端レコードが現在レコードとなる。

【エラーコード】

ER_ACCES    : ファイル(lnk)のアクセス権(o_modeに対応)がない。
ER_ADR      : アドレス(lnk,pwd)のアクセスは許されていない。
ER_BUSY     : ファイル(lnk)は既に排他的にオープンされている為、同時にファイルを
              オープンすることができなかった。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : 同時オープン可能な最大ファイル数を越えた。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(o_modeが不正)。
ER_PWD      : ファイル(lnk)の合言葉が不一致である。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である。
cls_fil
 
ファイルのクローズ

【形式】

ERR cls_fil(W fd)

【パラメータ】

W   fd  ファイルディスクリプタ

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルをクローズする。
ファイルをオープンしたプロセスが終了したときには、自動的にそのファイルはクローズされる。

【エラーコード】

ER_FD       : ファイルディスクリプタは存在していない。
ER_IO       : 入出力エラーが発生した。
del_fil
 
ファイルの削除

【形式】

WERR    del_fil(LINK *org, LINK *lnk, W force)

【パラメータ】

LINK    *org    削除対象ファイルの親ファイル
        NULL    親ファイル指定なし

LINK    *lnk    削除対象ファイル

W       force   強制削除指定
=0 :
削除対象ファイルがリンクレコードを含むときはエラーとして削除しない。
≠0 :
削除対象ファイルがリンクレコードを含むときも削除し、 含まれるリンクレコードが示すファイルの参照カウントを -1 し、 その結果、参照カウントが 0 となったリンクレコードの数をリターン値とする。

【リターン値】

≧0    正常(削除した結果参照カウント0となったリンクレコードの数)
<0    エラー(エラーコード)

【解説】

org で指定した親ファイル内の lnk で指定したファイルを示すリンクレコードを削除し、 そのファイルの参照カウントを -1 する。 その結果、参照カウントが 0 になった場合には、lnk で指定されたファイル自体を削除する。 この場合、親ファイルの書き込み(W)アクセス権が必要となる。

親ファイルの指定なし ( org = NULL ) のときは、 lnk で指定したファイルの参照カウントが 0 の場合にファイルを削除する。 参照カウントが 0 でない場合はエラーとなる。

削除対象ファイルががリンクファイルのときは、 リンクファイル自体が削除の対象となり、 リンクファイルの参照先のファイルは削除されることはない。

削除対象ファイルが以下のいずれかのときは削除されずにエラーとなる。

書込不可属性がセットされていた場合でも削除可能である。

【エラーコード】

ER_ACCES    : ファイル(org)のアクセス権(W)がない(org≠NULLの時)。
ER_ADR      : アドレス(org,lnk)のアクセスは許されていない。
ER_BUSY     : ファイル(org)は既に排他的にオープンされている為、
              同時にファイルをオープンすることができなかった(org≠NULLの時)。
            : ファイル(lnk)はオープン中である、または作業ファイルである。
            : ファイル(lnk)の参照カウントは0でない(org=NULLの時)。
            : ファイル(lnk)を示すリンクレコードは他のオープンで現在レコード
              として使用されている(org=NULLの時)。
ER_IO       : 入出力エラーが発生した。
ER_LOCK     : ファイル(lnk)を示すリンクレコードは、他からロックされている
              (org≠ NULLの時)。
ER_NOEXS    : ファイル(org,lnk)は存在していない(または、org内に指定された
              ファイル(lnk)を示すリンクレコードが存在しない)。
ER_NOFS     : ファイル(org,lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PERM     : ファイル(lnk)は削除不可である(削除不可属性がセットされている)。
ER_REC      : ファイル(lnk)は リンクレコードを含んでいる(force=0の時)。
ER_RONLY    : ファイル(org)は書込不可である、
              または属するファイルシステムは書込不可である(org≠NULLの時)。
            : ファイル(lnk)の属するファイルシステムは書込不可である。
see_rec
 
現在レコード移動

【形式】

ERR see_rec(W fd, W offset, W mode, W *recnum)

【パラメータ】

W   fd      ファイルディスクリプタ

W   offset  移動オフセット

W   mode    移動モード
        =0  現在レコード番号 + offset のレコード番号位置に移動。
        >0    offset のレコード番号位置に移動。
               offset≧0でなくてはいけない。
        <0    終端レコード番号 + offset のレコード番号位置に移動。
               offset≦0でなくてはいけない。

W   *recnum 移動後の現在レコード番号の格納領域
            NULL    格納しない

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコード位置を指定した位置に移動する。

定した移動先が存在するレコードの範囲を越える場合はエラーとなり、 現在レコードは変化しない。

【エラーコード】

ER_ADR      : アドレス(recnum)のアクセスは許されていない。
ER_FD       : ファイルディスクリプタは存在していない。
ER_IO       : 入出力エラーが発生した。
ER_REC      : 存在するレコードの範囲を越えた。
fnd_rec
 
レコード検索

【形式】

WERR    fnd_rec(W fd, W mode, UW typemask, UH subtype, W *recnum)

【パラメータ】

W   fd         ファイルディスクリプタ

W   mode       検索モード(検索開始位置/方向の指定)
        ( F_FWD ‖ F_NFWD ‖ F_BWD ‖ F_NBWD ‖ F_TOPEND ‖ F_ENDTOP )
        F_FWD     現在レコードから終端レコードまで
        F_NFWD    現在レコードの次のレコードからから終端レコードまで
        F_BWD     現在レコードから先頭レコードまで
        F_NBWD    現在レコードの前のレコードから先頭レコードまで
        F_TOPEND  先頭レコードから終端レコードまで
        F_ENDTOP  終端レコードから先頭レコードまで

UW  typemask   検索対象レコードタイプのビットマスク
        LSB タイプ 0 に対応
        MSB タイプ 31 に対応

UH  subtype    検索対象レコードサブタイプ
        0  全サブタイプが対象(サブタイプのチェックなし)

W   *recnum    検索結果の現在レコード番号の格納領域
        NULL 格納しない

【リターン値】

≧0    正常(検索したレコードタイプ)
<0    エラー(エラーコード)

【解説】

オープンしたファイル内の指定したレコードを検索し、見つけたレコードを現在レコードとする。

対象レコードが見つからなかったときはエラーとなり、現在レコードは変化しない。

【エラーコード】

ER_ADR      : アドレス(recnum)のアクセスは許されていない。
ER_FD       : ファイルディスクリプタは存在していない。
ER_IO       : 入出力エラーが発生した。
ER_PAR      : パラメータが不正である(modeが不正)。
ER_REC      : 指定した検索条件に合うレコードは存在しない
              (typemask=0の場合も含む)。
fnd_lnk
 
リンクレコード検索

【形式】

ERR fnd_lnk(W fd, W mode, LINK *lnk, UH subtype, W *recnum)

【パラメータ】

W   fd        ファイルディスクリプタ

W   mode      検索モード(検索開始位置/方向/内容の指定)
        ( F_FWD ‖ F_NFWD ‖ F_BWD ‖ F_NBWD ‖ F_TOPEND ‖ F_ENDTOP )
        | [ F_SFILE ] | [ F_SNAME ]
        | [ F_SATR1 ] | [ F_SATR2 ] | [F_SATR3 ] |
                        [ F_SATR4 ] | [ F_SATR5 ]
        F_FWD〜F_ENDTOP   fnd_rec()と同じ
        F_SFILE   lnk と同一のファイルを示すリンクレコード
        F_SNAME   lnk と同一のファイル名のファイルを示すリンクレコード
        F_SATR1   lnk と同一の属性データ1を持つリンクレコード
        F_SATR2   lnk と同一の属性データ2を持つリンクレコード
        F_SATR3   lnk と同一の属性データ3を持つリンクレコード
        F_SATR4   lnk と同一の属性データ4を持つリンクレコード
        F_SATR5   lnk と同一の属性データ5を持つリンクレコード

LINK  *lnk    検索対象リンク
        F_SFILE〜F_SATR5 を指定したときのみ有効

UH  subtype   検索対象レコードサブタイプ
        0  全サブタイプが対象(サブタイプのチェックなし)

W   *recnum   検索結果の現在レコード番号の格納領域
        NULL  格納しない

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイル内の指定したリンクレコードを検索し、 見つけたリンクレコードを現在レコードとする。

対象レコードが見つからなかったときはエラーとなり、現在レコードは変化しない。

【エラーコード】

ER_ADR      : アドレス(lnk,recnum)のアクセスは許されていない
              (lnkは検索条件を指定した場合のみアクセスされる)。
ER_FD       : ファイルディスクリプタは存在していない。
ER_IO       : 入出力エラーが発生した。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_PAR      : パラメータが不正である(mode が不正)。
ER_REC      : 指定した検索条件に合うレコードは存在しない。
rea_rec
 
レコード読み込み

【形式】

WERR    rea_rec(W fd, W offset, B *buf, W size, W *r_size, UH *subtype)

【パラメータ】

W   fd          ファイルディスクリプタ

W   offset      読み込み開始バイト位置(≧0)

B   *buf        読み込みデータ格納領域
                NULL    格納しない

W   size        読み込みデータ格納領域のバイトサイズ(≧0)

W   *r_size     開始バイト位置からの残りバイトサイズ
                (レコードサイズ − offset)の格納領域
                NULL    格納しない

UH  *subtype    レコードサブタイプの格納領域
                NULL    格納しない

【リターン値】

≧0    正常(現在レコードのレコードタイプ)
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードを読み込む。

レコードサイズ < offset + size のときは、 buf には ( レコードサイズ - offset) バイトのデータのみ読み込まれて格納される。

offset ≧ レコードサイズbuf = NULL、 または size = 0 のときは buf には何も格納されずに *r_size、*subtype に対応する値が格納される。 これは、レコードサイズやサブタイプのみを取り出す場合に使用される。

現在レコードがリンクレコードのときは、 LINK 構造体全体の内容が buf に読み出され、*r_size には LINK 構造体のサイズが格納される。 この場合、offset = 0size ≧ LINK 構造体のサイズ ( または size = 0 ) でなくてはいけない。

現在レコードが終端レコードのとき、 または他プロセスからロックされているときはエラーとなる。

【エラーコード】

ER_ADR      : アドレス(buf,r_size,subtype)のアクセスは許されていない。
ER_ENDR     : 現在レコードは終端レコードである。
ER_FD       : ファイルディスクリプタは存在していない、
              または F_WRITE オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LOCK     : 現在レコードは他からロックされている。
ER_PAR      : パラメータが不正である(size<0,offset<0,
              リンクレコードでoffset,sizeが不正)。
wri_rec
 
レコード書き込み

【形式】

ERR wri_rec(W fd, W offset, B *buf, W size, W *r_size, UH *subtype, UW units)

【パラメータ】

W   fd        ファイルディスクリプタ

W   offset    書き込み開始バイト位置(−1≦ offset < レコードサイズ)
              -1:レコードの最後への書き込み(追加)

B   *buf      書き込みデータへのポインタ
              NULL  書き込まない

W   size      書き込みデータのバイトサイズ(≧0)

W   *r_size   開始バイト位置からの残りバイトサイズ
              (書き込み後のレコードサイズ − offset)の格納領域
              NULL  格納しない

UH  *subtype  変更するレコードサブタイプへのポインタ
              NULL  変更しない

UW   units    ブロック獲得単位(Kバイト)
              0  任意

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードに書き込む。

レコードサイズ < offset + size のときは、 書き込み後にレコードサイズは増加する。

units はレコードサイズが増加したために必要となった追加ブロックの獲得の単位をKバイト単位で指定するもので、units サイズ以上 ( size 以下 ) の連続ブロック領域を割り当てることを指定する。

units = 0 はブロックの割り当て方法は任意であることを意味する。

size = 0、または buf = NULL のときは、 データの書き込みは行なわないが subtype ≠ NULL であればレコードサブタイプは変更する。

buf = NULLレコードサイズ < offset + size のときは、レコードサイズを増加するが増加した部分のデータは不定となる。 これは units 指定と組み合わせてレコードの追加ブロック領域をあらかじめ確保するときに使用する。

offset = -1 のときは、 常にその時点のレコードの最後にデータを書き込み、*r_size には size の値が格納される。 同一レコードを複数のプロセスがオープンして同時に書き込む場合でもこの指定により別のプロセスが書き込んだデータを上書きしないことが保証される。

現在レコードがリンクレコードのときは buf の内容は LINK 構造体となるが、属性データ部分のみが書き込まれ、 参照するファイル自体を変更することはできない。 この場合、offset = 0size ≧ LINK 構造体のサイズ ( または size = 0)でなくてはいけない。

現在レコードが終端レコードのとき、 または他プロセスからロックされているときはエラーとなる。

【エラーコード】

ER_ADR      : アドレス(buf,r_size,subtype)のアクセスは許されていない。
ER_ENDR     : 現在レコードは終端レコードである。
ER_FD       : ファイルディスクリプタは存在していない、または F_READ
              オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LOCK     : 現在レコードは他からロックされている。
ER_NODSK    : ディスクの領域が不足した、または指定された連続ブロック領域が獲得
              できなかった。
ER_PAR      : パラメータが不正である(size<0,offsetが不正,リンクレコードで
              offset,sizeが不正)。
ER_SZOVR    : ファイルのサイズがシステムの制限を越えた。
ins_rec
 
レコード挿入

【形式】

ERR ins_rec(W fd, B *buf, W size, W type, UH subtype, UW units)

【パラメータ】

W    fd        ファイルディスクリプタ

B    *buf      挿入レコードのデータへのポインタ
               NULL    データは書き込まない

W    size      挿入レコードのバイトサイズ(≧0)

W    type      挿入レコードのレコードタイプ

UH   subtype   挿入レコードのレコードサブタイプ

UW   units     ブロック獲得単位(Kバイト)
               0  任意

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードの直前に新規のレコードを挿入する。

units は挿入したレコードで必要とするブロックの獲得の単位を K バイト単位で指定するもので、units サイズ以上 ( size 以下 ) の連続ブロック領域を割り当てることを指定する。 units = 0はブロックの割り当て方法は任意であることを意味する。

buf = NULL のときは、挿入したレコードのサイズは size となるが、そのデータは不定となる。 これは units 指定と組み合わせて、 レコードのブロック領域をあらかじめ確保するために使用する。

現在レコードがリンクレコードのときは buf の内容は LINK 構造体となるが、 属性データ部分のみが書き込まれ、参照するファイル自体を変更することはできない。 この場合、offset = 0size ≧LINK 構造体のサイズ (または size = 0 ) でなくてはいけない。

type = 0 のときはリンクレコードの挿入であり、 buf の内容は LINK 構造体となる。 リンクレコードの挿入により、そのリンクの示すファイルの参照カウントは +1 される。 この場合、buf ≠ NULLsize = LINK 構造体のサイズ、 かつリンクの示すファイルは同一ファイルシステム上に存在していなくてはいけない。

【エラーコード】

ER_ADR      : アドレス(buff)のアクセスは許されていない。
ER_FD       : ファイルディスクリプタは存在していない、
              または F_READ オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : リンクの参照先のファイルの参照カウントがシステムの制限(255)を越えた。
ER_NODSK    : ディスクの領域が不足した、または指定された連続ブロック領域が
              獲得できなかった。
ER_NOEXS    : リンクの参照先のファイルは存在していない。
ER_PAR      : パラメータが不正である(type が不正、size<0、units が不正、
              type=0の時の size,buff が不正)。
ER_REC      : リンクは別ファイルシステムを参照している。
ER_SZOVR    : ファイルのサイズがシステムの制限を越えた。
apd_rec
 
レコード追加

【形式】

ERR apd_rec(W fd, B *buf, W size, W type, UH subtype, UW units)

【パラメータ】

W   fd      ファイルディスクリプタ

B   *buf    追加レコードのデータへのポインタ
            NULL    データは書き込まない

W   size    追加レコードのバイトサイズ(≧0)

W   type    追加レコードのレコードタイプ

U   subtype 追加レコードのレコードサブタイプ

UW  units   ブロック獲得単位(Kバイト)
            0  任意

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルの最後に新規のレコードを挿入する。

本システムコールは、現在レコードの位置の関係なく常に最後のレコード ( 終端レコードの直前 ) にレコードを挿入する点を除いて ins_rec() と同一である。

【エラーコード】

ER_ADR      : アドレス(buff)のアクセスは許されていない。
ER_FD       : ファイルディスクリプタは存在していない、または F_READ
              オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : リンクの参照先のファイルの参照カウントがシステムの制限
              (255)を越えた。
ER_NODSK    : ディスクの領域が不足した、または指定された連続ブロック領域
              が獲得できなかった。
ER_NOEXS    : リンクの参照先のファイルは存在していない。
ER_PAR      : パラメータが不正である(type が不正、size<0、units が不正、
              type =0の時の size,buff が不正)。
ER_REC      : リンクは別ファイルシステムを参照している。
ER_SZOVR    : ファイルのサイズがシステムの制限を越えた。
del_rec
 
レコード削除

【形式】

WERR    del_rec(W fd)

【パラメータ】

W   fd  ファイルディスクリプタ

【リターン値】

=1    正常(リンクレコードを削除した結果、参照カウント=0となった)
=0    正常(上記以外)
<0 エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードを削除し、 削除した次のレコードに現在レコードをを移動する。

削除したレコードがリンクレコードのときは、 リンクレコードが示すファイルの参照カウントは -1 され、 その結果参照カウントが0となった場合はリターン値は 1 となる。

現在レコードが終端レコードのとき、 他プロセスからロックされているとき、 または他のオープンで現在レコードとなっているときはエラーとなる。

【エラーコード】

ER_BUSY     : 他のオープンで現在レコードとして使用されている。
ER_ENDR     : 現在レコードは終端レコードである。
ER_FD       : ファイルディスクリプタは存在していない、
              または F_READ オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LOCK     : 現在レコードは他からロックされている。
ER_NOSPC    : システムのメモリ領域が不足した。
trc_rec
 
レコードサイズ縮小

【形式】

ERR trc_rec(W fd, W size)

【パラメータ】

W   fd      ファイルディスクリプタ

W   size    縮小するレコードバイトサイズ(≧0)

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードのレコードサイズを size バイトに縮小する。 レコードサイズ≦ size のときは何もしない。

現在レコードが終端レコードのとき、 リンクレコードのとき、または他プロセスからロックされているときはエラーとなる。

【エラーコード】

ER_ENDR     : 現在レコードは終端レコードである。
ER_FD       : ファイルディスクリプタは存在していない、
              または F_READ オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LOCK     : 現在レコードは他からロックされている。
ER_PAR      : パラメータが不正である(size<0)。
ER_REC      : 現在レコードはリンクレコードである。
xch_fil
 
ファイルの内容交換

【形式】

ERR xch_fil(W fd_1, W fd_2)

【パラメータ】

W   fd_1    ファイルディスクリプタ 1

W   fd_2    ファイルディスクリプタ 2

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンした 2 つのファイルの内容を交換する。

交換するのはファイルのデータ部分であり、 ファイルの管理情報はアクセス日付と更新日付を除いて元のままとなる。

交換する 2 つのファイルは、同一のファイルシステムに存在し、 かつ排他モードで更新用オープンしてなくてはいけない。

交換後の現在レコードは、それぞれ先頭レコードとなる。

【エラーコード】

ER_FD       : ファイルディスクリプタは存在していない、または (F_UPDATE|F_EXCL)
              でない オープンである。
ER_IO       : 入出力エラーが発生した。
ER_LOCK     : 現在レコードは他からロックされている
              (レコードにロックがかかっている)。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(fd_1とfd_2は同一ファイル)。
ER_XFS      : ファイル(fd_1,fd_2)は異なるファイルシステムに属している。
loc_rec
 
レコードロック

【形式】

ERR loc_rec(W fd, W mode)

【パラメータ】

W   fd      ファイルディスクリプタ

W   mode    ロックモード
        ( F_UNLOCK ‖ F_LOCK ‖ F_TSLOCK ‖ F_CKLOCK )
        F_LOCK      ロック設定(待ち)
        F_UNLOCK    ロック解除
        F_TSLOCK    ロック設定(待ちなし)
        F_CKLOCK    ロック状態チェック

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードに対するロック操作を行なう。

F_LOCK ロック設定(待ち)
他プロセスからロックされていたときはロックが解除されるまで待つ(待ちはプロセス優先度順で同一優先度の場合は待ちに入った順)。自プロセスの同一ファイルディスクリプタからロックしていた場合は何もせずに正常終了。自プロセスの他ファイルディスクリプタからロックしていた場合はエラー。
F_UNLOCK ロック解除
レコードがロックされていない場合は何もせずに正常終了。自プロセスの同一ファイルディスクリプタからロックした場合のみ解除可能で、その他の場合はエラー。
F_TSLOCK ロック設定(待ちなし)
他プロセスまたは他ファイルディスクリプタからロックされていたときはエラー。
F_CKLOCK ロック状態チェック
他プロセスまたは他ファイルディスクリプタからロックされていたときはエラー、そうでないときは何もせずに正常終了。

ロックしたレコードは、ロックしたファイルディスクリプタ以外からの読み込み、書き込み、サイズ変更、および削除が禁止される。

ファイルをクローズ時にはオープンしたプロセスで設定したロックは解除される。

【エラーコード】

ER_ENDR     : 現在レコードは終端レコードである。
ER_FD       : ファイルディスクリプタは存在していない。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : 同時にロック可能なレコードの最大数を越えた。
ER_LOCK     : 現在レコードは他からロックされている現在レコードは既に他からロッ
              クされている(F_TSLOCK/F_CKLOCK指定時)。
            : 自プロセスの他ファイルディスクリプタから既にロックされている
              (F_LOCK指定時)。
            : 他ファイルディスクリプタからのロックであり解除できない
              (F_UNLOCK指定時)。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された(F_LOCK指定時)。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(modeが不正)。
chk_fil
 
ファイルアクセス権チェック

【形式】

WERR    chk_fil(LINK *lnk, W mode, TC *pwd)

【パラメータ】

LINK    *lnk    対象ファイル

W       mode    チェックモード
        ( [ F_READ ] | [ F_WRITE ] | [ F_EXCUTE ] ) ‖ [ F_EXIST ]
        F_READ    読み込み(R)アクセス権チェック
        F_WRITE   書き込み(W)アクセス権チェック
        F_EXCUTE  実行/サーチ(E)アクセス権チェック
        F_EXIST   ファイルの存在チェック

TC      *pwd    パスワード(F_READ または F_WRITE 指定時のみ有効)
        NULL    パスワード指定なし

【リターン値】

≧0    正常(ファイルのアクセス情報:F_EXIST 指定時)
=0    正常(F_EXIST 以外指定時)
<0    エラー(エラーコード)

【解説】

指定したファイルの指定したアクセスが可能か否かのチェックを行なう。

F_READ、F_WRITE、F_EXCUTE の組み合わせで指定したアクセスが不可のときはエラーとなる。パスワードは F_READ、または F_WRITE を指定したときのみチェックされる。

F_EXIST 指定のときは、ファイルが存在しない場合はエラーとなり、存在する場合は以下のアクセス情報をリターン値として戻す。

    0.....0 BAPO SRWE

        B: アプリケーション属性2  (1:ON、0:OFF)
        A: アプリケーション属性1  (1:ON、0:OFF)
        P: 削除不可属性           (1:ON、0:OFF)
        O: 書込不可属性           (1:ON、0:OFF)
        S: パスワードの有無       (1:有、0:無 )
        R: 読み込み(R)アクセス権  (1:有、0:無 )
        W: 書き込み(W)アクセス権  (1:有、0:無 )
        E: 実行/サーチ(E)アクセス権  (1:有、0:無 )

【エラーコード】

ER_ACCES    : ファイル(lnk)のアクセス権(F_EXIST以外指定時)がない。
ER_ADR      : アドレス(lnk)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(modeが不正)。
ER_PWD      : ファイル(lnk)の合言葉が不一致である(F_READ/F_WRITE指定時)。
ER_RONLY    : ファイル(F_WRITE指定時)の書込不可属性が設定されている、
              または属するファイルシステムは書込不可である。
chg_fmd
 
ファイルアクセスモード変更

【形式】

ERR chg_fmd(LINK *lnk, A_MODE *mode)

【パラメータ】

LINK    *lnk    対象ファイル

A_MODE  *mode   変更するアクセスモード

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したファイルのアクセスモードを変更する。

アクセスモードの以下のそれぞれのデータに対して F_NOCHG 指定を行うと、その項目は変更しないことを意味する。

アクセスモードの変更は、ファイルシステムのアクセスレベルが 0 のときは誰でも変更可能であるが、アクセスレベルが 0 でないときはファイルの所有者のプロセスのみ変更可能となる。

すでにオープンされているファイルのアクセスモードを変更した場合、その変更はすでにオープンされているものには影響を与えない。

【エラーコード】

ER_ACCES    : ファイル(lnk)の所有者でない、またはレベル0のユーザでない。
ER_ADR      : アドレス(lnk,mode)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(modeの内容が不正)。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である。
chg_fat
 
ファイルのアクセス属性変更

【形式】

ERR chg_fat(LINK *lnk, W attr)

【パラメータ】

LINK    *lnk    対象ファイル

W       attr    変更するアクセス属性
        ( F_SETRONLY ‖ F_RSTRONLY ‖ F_SETPERM ‖ F_RSTPERM ‖
            F_SETA1 ‖ F_RSTA1  ‖ F_SETA2   ‖ F_RSTA2 )
        F_SETRONLY  書き込み不可属性のセット
        F_RSTRONLY  書き込み不可属性のリセット
        F_SETPERM   削除不可属性のセット
        F_RSTPERM   削除不可属性のリセット
        F_SETA1     アプリケーション属性1のセット
        F_RSTA1     アプリケーション属性1のリセット
        F_SETA2     アプリケーション属性2のセット
        F_RSTA2     アプリケーション属性2のリセット

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したファイルのアクセス属性を変更する。

アクセスモードの変更は、ファイルシステムのアクセスレベルが 0 のときは誰でも変更可能であるが、アクセスレベルが 0 でないときはファイルの所有者のプロセスのみ変更可能となる。

すでにオープンされているファイルのアクセスモードを変更した場合、その変更はすでにオープンされているものには影響を与えない。

【エラーコード】

ER_ACCES    : ファイル(lnk)の所有者でない、またはレベル0のユーザでない。
ER_ADR      : アドレス(lnk)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(attrが不正)。
ER_RONLY    : ファイル(lnk)は書込不可である、または属する
              ファイルシステムは書込不可である。
chg_fpw
 
ファイルパスワード変更

【形式】

ERR chg_fpw(W fd, TC *pwd)

【パラメータ】

W   fd      ファイルディスクリプタ

TC  *pwd    パスワード(TNULL、または最大パスワード文字数まで有効)
     NULL   パスワード解除

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしたファイルのパスワードを変更する。

パスワードの変更は、ファイルシステムのアクセスレベルが 0 のときは誰でも変更可能であるが、アクセスレベルが 0 でないときはファイルの所有者のプロセスのみ変更可能となる。
ただし、ファイルの所有者が定義されていない場合は、ユーザーレベル 0 のプロセスからも変更可能となる。

【エラーコード】

ER_ACCES    : ファイルの所有者ではない、またはレベル0のユーザでない。
ER_FD       : ファイルディスクリプタは存在していない。
ER_ADR      : アドレス(pwd)のアクセスは許されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_IO       : 入出力エラーが発生した。
ER_RONLY    : ファイルは書き込み不可である。
              または属するファイルシステムは書き込み不可である。
chg_fnm
 
ファイル名変更

【形式】

ERR chg_fnm(LINK *lnk, TC *name)

【パラメータ】

LINK    *lnk    対象ファイル

TC      *name   変更するファイル名(TNULL、または最大ファイル名文字数まで有効)

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したファイルのファイル名を変更する。

ファイル名の変更は、ファイルシステムのアクセスレベルが 0 のときは誰でも変更可能であるが、アクセスレベルが 0 でないときはファイルの所有者のプロセスのみ変更可能となる。

書き込み不可属性、または削除不可属性のセットされているファイルのファイル名の変更はできない。

指定したファイルがリンクファイルのときは、参照先のファイル名およびリンクファイル内に保持されている参照ファイル名の両方が変更される。

【エラーコード】

ER_ACCES    : ファイル(lnk)の所有者でない、またはレベル0のユーザでない。
ER_ADR      : アドレス(lnk,name)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_FNAME    : ファイル名(name)は空または不正である。
ER_PERM     : ファイル(lnk)は削除不可である(削除不可属性がセットされている)。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である。
chg_ftm
 
ファイル日時変更

【形式】

ERR chg_ftm(LINK *lnk, F_TIME *times)

【パラメータ】

LINK    *lnk    対象ファイル

F_TIME  *times  変更する日時
        NULL    現在日時に設定

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したファイルの保存期限、最新アクセス日時、および最新更新日時を変更する。

F_TIME のそれぞれの値が ≦0のときはその項目は変更しない。

ファイル日時の変更は、ファイルシステムのアクセスレベルが 0 のときは誰でも変更可能であるが、アクセスレベルが 0 でないときはファイルの所有者のプロセスのみ変更可能となる。

【エラーコード】

ER_ACCES    : ファイル(lnk)の所有者でない、またはレベル0のユーザでない。
ER_ADR      : アドレス(lnk,times)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_RONLY    : ファイル(lnk)は書込不可である、
              または属するファイルシステムは書込不可である。
fil_sts
 
ファイル情報の取得

【形式】

WERR    fil_sts(LINK *lnk, TC *name, F_STATE *stat, F_LOCATE *locat)

【パラメータ】

LINK    *lnk    対象ファイル

TC      *name   ファイル名の格納領域(最大ファイル名+1文字分の領域)
                NULL    格納しない

F_STATE *stat   ファイル管理情報の格納領域
                NULL    格納しない

F_LOCATE *locat ファイル所在情報の格納領域
                NULL    格納しない

【リターン値】

≧0    正常(ファイルの参照カウント)
<0    エラー(エラーコード)

【解説】

指定したファイルの情報を取り出す。

【エラーコード】

ER_ADR      : アドレス(lnk,name,stat,locat)のアクセスは許されていない。
ER_FD       : ファイルディスクリプタは存在していない(ofl_stsの場合)。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない(fil_stsの場合)。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない
               (fil_stsの場合)。
ER_NOSPC    : システムのメモリ領域が不足した。
ofl_sts
 
ファイル情報の取得

【形式】

WERR    ofl_sts(W fd, TC *name, F_STATE *stat, F_LOCATE *locat)

【パラメータ】

W         fd      ファイルディスクリプタ

TC        *name   ファイル名の格納領域(最大ファイル名+1文字分の領域)
                  NULL    格納しない

F_STATE   *stat   ファイル管理情報の格納領域
                  NULL    格納しない

F_LOCATE  *locat  ファイル所在情報の格納領域
                  NULL    格納しない

【リターン値】

≧0    正常(ファイルの参照カウント)
<0    エラー(エラーコード)

【解説】

オープンしたファイルの情報を取り出す。

【エラーコード】

ER_ADR      : アドレス(lnk,name,stat,locat)のアクセスは許されていない。
ER_FD       : ファイルディスクリプタは存在していない(ofl_stsの場合)。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない(fil_stsの場合)。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない
              (fil_stsの場合)。
ER_NOSPC    : システムのメモリ領域が不足した。
lnk_sts
 
リンクファイル情報の取得

【形式】

WERR    lnk_sts(LINK *lnk, F_LINK *stat)

【パラメータ】

LINK    *lnk    対象リンクファイル

F_LINK  *stat   リンクファイル情報の格納領域
                NULL    格納しない

【リターン値】

≧0    正常(リンクファイルの参照カウント)
<0    エラー(エラーコード)

【解説】

指定したリンクファイルのリンクファイル情報を取り出す。

指定したファイルがリンクファイルでないときはエラーとなる。

【エラーコード】

ER_ADR      : アドレス(lnk,stat)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOLNK    : リンクファイルではない。
ER_NOSPC    : システムのメモリ領域が不足した。
syn_lnk
 
リンクファイルの同期

【形式】

WERR    syn_lnk(LINK *lnk, W opt)

【パラメータ】

LINK    *lnk   対象リンクファイル

W       opt    同期属性
               =0  チェックのみ
               ≠0  チェックおよび更新

【リターン値】

≧0    正常(同期状態)
<0    エラー(エラーコード)

【解説】

指定したリンクファイルが保持しているファイル名、生成日時と、参照先のファイルの実際のファイル名、生成日時が一致しているかどうかをチェックする。

opt = 0 のときはチェックのみを行ない、opt ≠ 0 のときは異なっていた場合は、指定したリンクファイルが保持している情報を参照先のファイルの実際のファイル名、生成日時と一致するように更新する。

リターン値は以下の同期状態となる。

    F_SYNC      一致している。
    F_DNAME     ファイル名が異なっていた
    F_DDATE     生成日時が異なっていた
    F_DBOTH     ファイル名と生成日時の両方が共に異なっていた

指定したファイルがリンクファイルでないときはエラーとなる。

【エラーコード】

ER_ADR      : アドレス((lnk))のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : ファイル(lnk)は存在していない。
ER_NOFS     : ファイル(lnk)またはファイル(lnk)の参照先のファイルの属する
              ファイルシステムは接続されていない。
ER_NOLNK    : リンクファイルではない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_RONLY    : ファイル(lnk)は書込不可である、または属するファイルシステム
              は書込不可である。
get_dfm
 
デフォールトアクセスモードの取得

【形式】

ERR get_dfm(DA_MODE *mode)

【パラメータ】

DA_MODE *mode   デフォールトアクセスモードの格納領域
        typedef struct {
            UH  f_ownacc;       /* 所有者アクセスモード */
            UH  f_grpacc;       /* グループアクセスレベル */
            UH  f_pubacc;       /* 一般アクセスレベル */
            H   f_grpno;        /* グループ番号(0〜4) */
            UH  f_gacc[N_GRP];  /* グループアクセスレベル */
        } DA_MODE;

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自ユーザのデフォールトアクセスモードを取り出す。

デフォールトアクセスモードは、 ファイルの生成時にアクセスモードを指定しなかったときに適用されるデフォールトのアクセスモードであり、ユーザごとに定義される。

f_gacc[4] は、ユーザの所属するグループのそれぞれに対して設定されているグループアクセスレベルを示す単なる参照用のデータであり、f_grpacc が実際のグループアクセスレベルとして適用される。

【エラーコード】

ER_ADR      : アドレス(mode)のアクセスは許されていない。
set_dfm
 
デフォールトアクセスモードの設定

【形式】

ERR set_dfm(DA_MODE *mode)

【パラメータ】

DA_MODE *mode   設定するデフォールトアクセスモード

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自ユーザのデフォールトアクセスモードを設定する。

変更したデフォールトアクセスモードは、同一ユーザの全プロセスに対して有効となる。

【エラーコード】

ER_ADR      : アドレス(mode)のアクセスは許されていない。
ER_PAR      : パラメータが不正である(mode の内容が不正)。
att_fls
 
ファイルシステムの接続

【形式】

ERR att_fls(TC *dev, TC *name, LINK *lnk, UW mode)

【パラメータ】

TC      *dev    デバイス名

TC      *name   接続名(TNULL、または最大接続名文字数まで有効)

LINK    *lnk    接続したファイルシステムのルートファイルのリンクの格納領域
                NULL   格納しない

UW      mode    接続モード
                ( FS_SYNC ‖ FS_ASYN ‖ FS_RONLY )
FS_SYNC 同期書き込み
ファイルへの書き込みは書き込みのシステムコールを実行した時点 で必ず行われる。
FS_ASYN 非同期書き込み
ファイルへの書き込みは書き込みのシステムコールを実行した時点 で行われるとは限らない。
FS_RONLY 書き込み禁止
ファイルへの書き込みはすべて禁止される。

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したデバイス上に存在するファイルシステムを指定した接続名でシステムに接続する。

接続名は、接続したファイルシステムのルートファイルを絶対パス名により指定するために使用され、すでに接続済みの接続名と同じであってはいけない。

すでに接続済みのファイルシステムを再度接続しようとしたとき、また、接続しようとしたファイルシステムのファイルシステム名と同一のファイルシステム名を持つファイルシステムがすでに接続されていたときエラーとなる。

ファイルシステムを接続するには、デバイスに対する接続アクセス権が必要となる。

【エラーコード】

ER_ACCES    : 論理デバイス(dev)のアクセス権(接続)がない。
ER_ADR      : アドレス(dev,name,lnk)のアクセスは許されていない。
ER_BUSY     : 論理デバイス(dev)は既にオープンされている、または接続されている。
ER_EXS      : 接続名(name)は既に存在しているまたは同一のファイルシステム名
              のファイルシステムが既に接続されている。
ER_FNAME    : ファイル名(name)は空または不正である。
ER_IO       : 入出力エラーが発生した。
ER_LIMIT    : 同時接続可能な最大ファイルシステム数を越えた。
ER_NODEV    : デバイス(dev)へのアクセスができない。
ER_NOEXS    : デバイス(dev)は登録されていない、またはブロック型デバイスでない。
ER_NOMDA    : デバイス(dev)のメディアが存在しない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_TRON     : TRON形式のファイルシステムではない。
det_fls
 
ファイルシステムの切断

【形式】

ERR det_fls(TC *dev, W eject)

【パラメータ】

TC  *dev    デバイス名

W   eject   イジェクト指定
            =0  イジェクトしない
            ≠0  イジェクトする(イジェクト不可能なデバイスの時は無視)

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したデバイス上の接続済みのファイルシステムをシステムから切り離す。この時、メモリ上に一時的に保持されている内容等があればファイルシステム上にすべて書き出す。

切断の対象となるファイルシステム内のファイルがオープンされているとき、または作業ファイルとしているプロセスが存在しているときは、切断できない。

ファイルシステムを切断するには、デバイスに対する接続アクセス権が必要となる。

【エラーコード】

ER_ACCES    : 論理デバイス(dev)のアクセス権(接続)がない。
ER_ADR      : アドレス(dev)のアクセスは許されていない。
ER_BUSY     : ファイルシステムは使用中である。
ER_IO       : 入出力エラーが発生した。
ER_NOEXS    : デバイス(dev)は登録されていない、またはブロック型デバイスでない。
ER_NOFS     : 論理デバイス(dev)上の属するファイルシステムは接続されていない。
ER_NOMDA    : デバイスのメディアが存在しない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_RONLY    : ファイルは書込不可である、または属するファイルシステムは
              書込不可である。
syn_fls
 
ファイルシステムの同期

【形式】

ERR syn_fls(VOID)

【パラメータ】

なし

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

メモリ上に一時的に保持されていた内容等をファイルシステム上にすべて書き出し、ファイルシステム全体を矛盾ないように更新する。
接続されているすべてのファイルシステムに対して行う。

【エラーコード】

ER_IO       : 入出力エラーが発生した。
ER_NOMDA    : デバイスのメディアが存在しない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_RONLY    : ファイルは書込不可である、または属するファイルシステムは
              書込不可である。
fls_sts
 
ファイルシステム管理情報の取得

【形式】

WERR    fls_sts(TC *dev, FS_STATE *buff)

【パラメータ】

TC       *dev    デバイス名

FS_STATE *buff   ファイルシステム管理情報の格納領域

【リターン値】

≧0    正常(ファイルシステムの接続モード)
       ( 0:ファイルシステムは書込可、1:ファイルシステムは書込不可)
<0    エラー(エラーコード)

【解説】

指定したデバイス上の接続済みのファイルシステムの管理情報を取り出す。

ファイルシステムの管理情報を取り出すためには、デバイスに対する接続アクセス権が必要となる。

【エラーコード】

ER_ACCES    : 論理デバイス(dev)のアクセス権(接続)がない。
ER_ADR      : アドレス(dev,buf)のアクセスは許されていない。
ER_BUSY     : 論理デバイスは既にオープンされている
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイス(dev)へのアクセスができない。
ER_NOEXS    : デバイス(dev)は登録されていない、またはブロック型デバイスでない。
ER_NOMDA    : デバイス(dev)のメディアが存在しない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_TRON     : TRON形式のファイルシステムではない。
chg_fls
 
ファイルシステム情報の変更

【形式】

ERR chg_fls(TC *dev, TC *fs_name, TC *fs_locate)

【パラメータ】

TC   *dev       デバイス名
                NULL の場合エラーとなる

TC   *fs_name   変更するファイルシステム名
                NULL  変更しない

TC   *fs_locate 変更するデバイス所在名
                NULL  変更しない

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

指定したデバイス上の接続済みのファイルシステムのファイルシステム名およびデバイス所在名を変更する。

ファイルシステム情報を変更するには、 デバイスに対する接続アクセス権、および書込みアクセス権が必要となる。

【エラーコード】

ER_ACCES    : 論理デバイス(dev)のアクセス権(接続、書込)がない。
ER_ADR      : アドレス(dev,fs_name,fs_locate)のアクセスは許されていない。
ER_BUSY     : 論理デバイスは既にオープンされている
ER_EXS      : 指定したファイルシステム名のファイルシステムは既に存在している
              (接続されている)。
ER_FNAME    : ファイルシステム名は空、または不正
ER_IO       : 入出力エラーが発生した。
ER_NODEV    : デバイス(dev)へのアクセスができない。
ER_NOEXS    : デバイス(dev)は登録されていない、またはブロック型デバイスでない。
ER_NOMDA    : デバイス(dev)のメディアが存在しない。
ER_NOSPC    : システムのメモリ領域が不足した。
ER_RONLY    : ファイルは書込不可である、または属するファイルシステムは
              書込不可である。
ER_TRON     : TRON形式のファイルシステムではない。
get_nlk
 
リンクの順次取得

【形式】

WERR    get_nlk(LINK *lnk)

【パラメータ】

LINK    *lnk    開始ファイルのリンク (入力)
                次のファイルのリンクの格納領域 (出力)

【リターン値】

≧0    正常(取り出したファイルの参照カウント)
<0    エラー(エラーコード)

【解説】

指定した開始ファイルのファイルIDより大きなファイルIDを持つファイルのうち最小のファイルIDを持つファイルへのリンクを取り出す。

開始ファイルのファイルIDは実際には存在しないファイルでも良い。 取り出したファイルのリンクの属性データはすべて 0 となる。

本システムコールにより、ファイルシステム上に存在するすべてのファイル(参照カウント = 0 のファイルも含む)へのリンクを取り出すことができる。

【エラーコード】

ER_ADR      : アドレス(lnk)のアクセスは許されていない。
ER_IO       : 入出力エラーが発生した。
ER_NOFS     : ファイル(lnk)の属するファイルシステムは接続されていない。
ER_NOEXS    : ファイル(lnk)より大きなファイルIDを持つファイルは存在していない。
ER_NOSPC    : システムのメモリ領域が不足した。
lst_fls
 
ファイルシステムの取得

【形式】

WERR    lst_fls(F_ATTACH *buff, W cnt)

【パラメータ】

F_ATTACH *buff    ファイルシステム接続情報の格納領域(配列)
        typedef struct {
            TC  a_name[L_CONNM];    /* 接続名 */
            TC  dev[L_DEVNM];       /* 論理デバイス名 */
        } F_ATTACH;

W   cnt > 0      接続されている全てのファイルシステムの接続情報を
                  buff に取り出す。cnt は buff の要素数を示す。
    = F_GETDEV   buff->a_name[] に設定した接続名に対応する
                  デバイス名を buff->dev[] に取り出す。
    = F_GETNAM   buff->dev[] に設定したデバイス名に対応する
                  接続名を buff->a_name[] に取り出す。

【リターン値】

=1    正常(F_GETDEV, F_FETNAM 指定時)
≧0    正常(接続済みのファイルシステム数)
<0    エラー(エラーコード)

【解説】

接続済みのファイルシステムの接続名とデバイス名と取り出す。

接続されているファイルシステムの数が指定した要素数(cnt)より多い場合は、最初の要素数(cnt)個のみを取り出す。

【エラーコード】

ER_ADR      : アドレス(buff)のアクセスは許されていない。
ER_NOFS     : ファイルシステムは接続されていない(cnt=−1,−2の時)。
ER_PAR      : パラメータが不正である(cnt=0,<−2)。
map_rec
 
レコードのマップ

【形式】

WERR    map_rec(W fd, W offset, B **addr, W size, W mode)

【パラメータ】

W   fd      ファイルディスクリプタ

W   offset  マップ開始バイトオフセット

B   **addr  マップされたメモリアドレスの格納領域

W   size    マップするバイトサイズ

W   mode    マップモード
    ( [ F_READ ] | [ F_WRITE ] | [ F_EXCUTE ] ) | [ F_COMMON ‖ F_SYSTEM ]
        F_READ      読み込み用マップ
        F_WRITE     書き込み用マップ
        F_EXECUTE   実行用マップ
        F_COMMON    共有メモリー空間にマップ
        F_SYSTEM    システムメモリー空間にマップ

【リターン値】

>0    正常(マップID)
<0    エラー(エラーコード)

【解説】

オープンしたファイルの現在レコードの offset から size バイトをメモリー空間上にマップする。マップされたレコードの内容はメモリーとしてアクセスすることができる。

F_COMMON を指定した場合には、共有メモリー空間上にマップされる。この場合、すべてのプロセスからアクセス可能となる。 F_SYSTEM を指定した場合には、システムメモリー空間上にマップされる。この場合、すべてのシステムプロセスからアクセス可能となる。マップしたプロセス自身であっても、一般のアプリケーションプロセスからはアクセスできない。したがって、アプリケーションプロセスからはこの指定を使用すべきではない。 F_COMMON,F_SYSTEM のいずれも指定しなければ、マップしたプロセスのローカルメモリー空間上にマップされる。この場合、マップしたプロセス以外からアクセスすることは出来ない。

マップされるアドレスはシステムで決定され、アプリケーション側から指定することはできない。

マップモードの指定はオープンしたモードに矛盾してはいけない。(ER_FD)

リンクレコードはマップできない。(ER_REC)

マップ中は、次の操作は禁止され ER_BUSY となる。

インプリメントに依存して以下の制限がつけられる場合がある。

【エラーコード】

ER_FD       : ファイルディスクリプタは存在していない。
            : マップモードとオープンモードが矛盾している。
ER_REC      : 現在レコードはリンクレコードである。
ER_ADR      : アドレス(addr)のアクセスは許されていない。
ER_ENDR     : 現在レコードは終端レコードである。
ER_LOCK     : 現在レコードは他からロックされている。
ER_IO       : 入出力エラーが発生した。
ER_PAR      : パラメータが不正である。
ER_NOSPT    : システムの制限によりマップできない。
ump_rec
 
レコードのアンマップ

【形式】

ERR ump_rec(W fd, W mapid)

【パラメータ】

W   fd      ファイルディスクリプタ

W   mapid   マップID

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

オープンしているファイルのマップIDで指定したマップを解除する。 ファイルのクローズ時にはオープンしたプロセスで設定したマップは解除される。

【エラーコード】

ER_FD       : ファイルディスクリプタは存在していない。
ER_NOEXS    : マップIDは存在していない。
ER_IO       : 入出力エラーが発生した。
chg_fsm
 
ファイルシステム接続モードの変更

【形式】

WERR    chg_fsm( TC *dev, UW mode )

【パラメータ】

TC  *dev    論理デバイス名

UW  mode    接続モード (att_fls の mode と同じ)
            ( FS_SYNC ‖ FS_ASYN ‖ FS_RONLY )
            FS_SYNC     同期
            FS_ASYN     非同期
            FS_RONLY    書き込み禁止

【リターン値】

≧0    正常(変更前の接続モード)
<0    エラー(エラーコード)

【解説】

dev のデバイスの接続状態を mode で指定した接続モードに変更する。 dev はすでに接続されているデバイスでなければならない。 リターン値に変更前の接続モードを返す。

接続モードを変更するためには、dev に対する接続アクセス権が必要である。

接続モード変更前が書き込み可であった場合、書き込み禁止に変更しても変更前に行われた map_rec() による書き込みモードのレコードマップはそのまま有効となり、書き込みも行われる。 F_WRITE または F_UPDATE でオープンしているファイルがあるとき、接続モードを書き込み禁止にすると、そのファイルに対する wri_rec() 等の書き込みが ER_RONLY となる。

【エラーコード】

ER_ACCES    : 論理デバイス(dev)に接続アクセス権がない。
ER_ADR      : アドレス(dev)のアクセスが許されていない。
ER_IO       : 入出力エラーが発生した。
ER_PAR      : パラメータが不正である。
ER_NOFS     : 論理デバイス(dev)は、ファイルシステムとして接続されていない。

この章の目次にもどる
前頁:1.5 メモリ管理にもどる
次頁:1.7 イベント管理にすすむ