UDFファイルシステムの応用プムグラムインタフェース

標準情報(TR)  TR X 0041:2001


ユニバーサルディスクフォーマット(UDF)に基づくファイルシステムの応用プログラムインタフェース

Application Program Interface for UDF based File Systems



序文

この標準情報(TR)は, 財団法人光産業技術振興協会(OITDA)が受託した"光ディスクシステムの相互運用性確保のための標準化"の新規産業支援型国際標準開発事業(1998〜2000年度)の成果をもとに工業標準化の促進に関連して特に重要と判断される技術情報をまとめ, 日本工業標準調査会の審議を経て, タイプUの標準情報(TR)として公表するものである。


1. 適用範囲

この標準情報(TR)は, 標準情報TR X 0035:2000 [ユニバーサルディスクフォーマット(UDF) 2.00]及び標準情報TR X 0040:2001 [ユニバーサルディスクフォーマット(UDF)のセキュリティ拡張]に適合するファイルを対象とし, 主としてそのファイルに対する書込み及び読出しの操作を行うための応用プラグラムインタフェース(API)を規定する。


2. 引用規定

次の規格などは,この標準情報(TR)に引用されることによって,この標準情報(TR)の規定の一部を構成する。

JIS X 0607:2001 非逐次記録を用いる追記形及び書換形の情報交換用媒体のボリューム及びファイルの構造
 備考1 ISO/IEC 13346:1999 Volume and file structure of write-once and rewritable media using non-sequential recording for information interchange が, この規格に一致している。
 備考2 ECMA 167 3rd Edition, Volume and file structure of write-once and rewritable media using non-sequential recording for information interchange も, この規格に一致している。

JIS X 3030-1994 移植可能なオペレーティングシステムのインタフェース(POSIX) 第1部 応用プログラム向けのインタフェース(API) [プログラム言語C]
 備考 ISO/IEC 9945-1:1990 Portable Operating System Interface (POSIX) -- Part 1: System Application Program Interface (API) [C Language] が,この規格に一致している。

TR X 0035:2000 ユニバーサルディスクフォーマット(UDF) 2.00
 備考1 Universal Disk Format Specification Revision 2.00, OSTA, 1998-04 が, この規定に一致している。
 備考2 Universal Disk Format Specification Revision 2.01, OSTA, 2000-03 は, この規定の一部を修正している。

TR X 0040:2001 ユニバーサルディスクフォーマット(UDF)のセキュリティ拡張


3. 定義

この標準情報(TR)では, TR X 0035(UDF 2.0)及びTR X 0040(UDFのセキュリティ拡張)での定義を適用する。


4. 記法

関数が誤り番号として返す記号定数の記法は, JIS X 30302.4(誤り番号)に従う。


5. JIS X 3030に従う操作

表5.1に示す操作に関しては,JIS X 3030において規定されるAPIに従う。

表5.1 JIS X 3030に従う操作
項目操作関数名
5.1.2 ディレクトリ操作 opendir()
readdir()
rewinddir()
closedir()
5.2.1 現行の作業ディレクトリの変更 chdir()
5.2.2 作業ディレクトリのパス名の取得 getcwd()
5.3.1 ファイルのオープン open()
5.3.2 新規ファイルの生成又は既存のファイルの書換え creat()
5.3.3 ファイル生成マスクの設定 umask()
5.3.4 ファイルのリンク link()
5.4.1 ディレクトリの生成 mkdir()
5.4.2 特殊ファイルの生成 mkfifo()
5.5.1 ディレクトリエントリの削除 unlink()
5.5.2 ディレクトリの削除 rmdir()
5.5.3 ファイル名の変更 rename()
5.6.2 ファイル状態の取得 stat()
fstat()
5.6.3 ファイルのアクセス許可条件の試験 access()
5.6.4 ファイルモードの変更 chmod()
5.6.5 ファイルの所有者及びグループの変更 chown()
5.6.6 ファイルのアクセス時刻及び更新時刻の設定 utime()
6.3.1 ファイル記述子の解放 close()
6.4.1 ファイルからの読出し read()
6.4.2 ファイルへの書込み write()
6.5.2 ファイルの制御 fcntl()
6.5.3 読出し・書込みのファイルオフセットの再位置付け lseek()


6. UDF固有の操作

UDF固有の操作に関するAPIを規定する。


6.1 ヘッダ及びデータ構造

ヘッダ<udf.h>は, UDFファイルシステム固有関数が扱う構造体定義を含む。各構造体定義の詳細については, TR X 0035を参照されたい。

6.1.1 <udf.h>ファイルエントリ

udfgetent()関数によって返されるUDFファイルエントリ構造体udfentの定義を含む。 表6.16.4に関連する構造体の定義を示す。

表6.1 udfent構造体
メンバの型メンバ名意味
tag desc_tag 記述子のタグID(261:基本, 266:拡張)
Uint32 uid ファイルの所有者の利用者ID
Uint32 gid ファイルの所有者のグループID
Uint32 perm アクセス許可条件
Uint16 file_link_cnt リンク数
Uint8 rec_fmt レコード形式
Uint8 rec_disp_attr レコード表示属性
Uint32 rec_len 各レコード長(バイト数)
Uint64 info_len ファイル長(バイト数)
Uint64 obj_size 全ストリーム込みのファイル長(バイト数)
Uint64 lblk_rec 記録された論理ブロック数
timestamp acstime ファイルの参照日時
timestamp modtime ファイルの更新日時
timestamp crttime ファイルの生成日時
timestamp atrtime ファイル属性の更新日時
Uint32 checkpoint チェックポイント
regid impl_id 実装ID
Uint64 uniq_id 一意ID

表6.2 udftag構造体
メンバの型メンバ名意味
Uint16 tag_id タグID
Uint16 desc_ver 記述子の版数
Uint8 tag_chksum udftag構造体のチェックサム
Uint8 pad1 予約(#00)
Uint16 tag_serno 記述子集合のID
Uint16 desc_crc この記述子のCRC
Uint16 desc_crc_len CRC長
Uint16 tag_loc この記述子の位置(論理ブロック番号)

表6.3 timestamp構造体
メンバの型メンバ名意味
Uint16 type_timezone 解釈(Type=0:UTC, 1:local, 2:送り手と受け手とで合意が必要)
Uint16 year 年(1〜9999)
Uint8 month 月(1〜12)
Uint8 day 日(1〜31)
Uint8 hour 時(0〜23)
Uint8 min 分(0〜59)
Uint8 sec 秒(type 2:0〜60, 他:0〜59)
Uint8 centisec 100分の1秒(0〜99)
Uint8 microsec100 100マイクロ秒(0〜99)
Uint8 microsec マイクロ秒(0〜99)

表6.4 egid構造体
メンバの型メンバ名意味
Uint8flags属性
Uint8[23]id実装識別子
Uint8[8]id_suffix付加情報

6.1.2 <udf.h>拡張属性

関数udfgetxattr()によって返される拡張属性構造体udfxattrの定義を含む。表6.5に構造体の定義を示す。

表6.5 udfxattr構造体
メンバの型メンバ名意味
Uint32 attr_type 拡張属性の種別
Uint8 attr_subtype 拡張属性の副種別
Uint8 pad1 予約(#00)
Uint32 attr_len 拡張属性全体の大きさ
Uint8[] attr_data 拡張属性データ部

6.1.3 <udf.h>日時

関数udfsettime()によって設定する日時構造体udftimeの定義を含む。表6.6に構造体の定義を示す。

表6.6 udftime構造体
メンバの型メンバ名意味
timestamp acstime ファイルの参照日時
timestamp modtime ファイルの更新日時
timestamp crttime ファイルの生成日時
timestamp atrtime ファイル属性の更新日時

6.1.4 <udf.h>許可条件

関数 udfsetperm()によって設定する許可条件の値は, 次のマスク及びビットによって符号化される。

S_IXWRADO他人に対する実行,書込み,読出し,属性変更及び削除の許可条件マスク
S_IXOTH他人に対する実行許可ビット… ビット0
S_IWOTH他人に対する書込み許可ビット… ビット1
S_IROTH他人に対する読出し許可ビット… ビット2
S_IAOTH他人に対する属性変更許可ビット… ビット3
S_IDOTH他人に対する削除許可ビット… ビット4

S_IXWRADGグループに対する実行,書込み,読出し,属性変更及び削除の許可条件マスク
S_IXOTGグループに対する実行許可ビット… ビット5
S_IWOTGグループに対する書込み許可ビット… ビット6
S_IROTGグループに対する読出し許可ビット… ビット7
S_IAOTGグループに対する属性変更許可ビット… ビット8
S_IDOTGグループに対する削除許可ビット… ビット9

S_IXWRADU本人に対する実行,書込み,読出し,属性変更及び削除の許可条件マスク
S_IXOTU本人に対する実行許可ビット… ビット10
S_IWOTU本人に対する書込み許可ビット… ビット11
S_IROTU本人に対する読出し許可ビット… ビット12
S_IAOTU本人に対する属性変更許可ビット… ビット13
S_IDOTU本人に対する削除許可ビット… ビット14


6.2 UDFファイル属性情報の取得

6.2.1 UDFファイルエントリの取得

udfgetent()関数

6.2.1.1 形式

#include <udf.h>
int udfgetent(int fildes, struct udfent *buf);

6.2.1.2 機能

udfgetent()関数は, オープンファイル記述子fildesで指定されたファイルに関するファイルエントリ情報を取得し, 引き数bufで指定された領域に書き込む。

UDFファイルエントリ情報の形式には, ファイルエントリ型及び拡張ファイルエントリ型がある。この関数が返却値を返した後, desc_tag構造体中のtag_idの内容を参照して, 値が261の場合にはファイルエントリ型が, 値が266の場合には拡張ファイルエントリ型が設定されていることを意味する。obj_size及びcrttimeは, 拡張ファイルエントリ型の場合だけ値が設定される。

6.2.1.3 返却値

成功時に値0を返す。そうでなければ-1を返し, errnoに失敗を示す値が設定される。

6.2.1.4 誤り

次の状態が発生した場合, udfgetent()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子でない。

6.2.2 UDF拡張属性の取得

udfgetxattr()関数

6.2.2.1 形式

#include <udf.h>
int udfgetxattr(int fildes, Uint32 atype, struct udfxattr *buf);

6.2.2.2 機能

udfgetxattr()関数は,オープンファイル記述子fildesで指定されたファイルに関する拡張属性情報のうち, 引き数atypeで指定された属性種別に合致する拡張属性情報を取得し, 引き数 bufで指定された領域に書き込む。

atypeに0を指定すると, すべての拡張属性情報を取得する。bufに0を指定すると, atypeで指定された属性種別に合致する拡張属性情報の大きさ(バイト数)が関数の返却値として返されるので, あらかじめ必要な領域の大きさが分からない場合に利用できる。atype及びbufに0を指定すると, すべての拡張属性情報の領域の総和が関数の返却値として返される。

6.2.2.3 返却値

bufの値が非0の場合には, 成功時に値0を返す。そうでなければ-1を返し, errnoに失敗を示す値が設定される。

bufの値が0の場合には, 指定された属性種別をもつ拡張属性領域の大きさをバイト数で返す。指定された属性種別が見つからなかった場合には, -1を返す。

6.2.2.4 誤り

次の状態が発生した場合, udfgetxattr()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。
[EINVAL] atypeで指定された値が, 妥当な属性種別ではない。


6.3 UDFファイル属性情報の設定

6.3.1 アクセス権の設定

udfsetperm()関数

6.3.1.1 形式

#include <udf.h>
int udfsetperm(int fildes, Uint32 perm);

6.3.1.2 機能

udfsetperm()関数は, オープンファイル記述子fildesで指定されたファイルのファイルエントリ又は拡張ファイルエントリ中に設定されている許可条件を,引き数permで指定された許可条件で置き換える(6.1.4を参照)。

6.3.1.3 返却値

成功時に値0を返す。そうでなければ-1を返し, errnoに失敗を示す値が設定される。

6.3.1.4 誤り

次の状態が発生した場合, udfsetperm()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。
[EPERM] 呼出し元プロセスが, 適切な権限をもっていない。

6.3.2 日時の設定

udfsettime()関数

6.3.2.1 形式

#include <udf.h>
int udfsettime(int fildes, struct udftime *timebuf);

6.3.2.2 機能

udfsettime()関数は, オープンファイル記述子fildesで指定されたファイルのファイルエントリ又は拡張ファイルエントリ中に設定されている日時情報を, 引き数配列timebufで指定された日時で置き換える。ファイルの所有者及び適切な権限をもつプロセスだけが, udfsettime()関数の使用を許される。

6.3.2.3 返却値

成功時に値0を返す。そうでなければ-1を返し, errnoに失敗を示す値が設定される。

6.3.2.4 誤り

次の状態が発生した場合, udfsettime()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。
[EPERM] 呼出し元プロセスが, 適切な権限をもっていない


7. セキュリティ拡張操作

ここで規定する関数は, TR X 0040 [ユニバーサルディスクフォーマット(UDF)のセキュリティ拡張]が規定する操作を実行する。


7.1 ヘッダ及びデータ構造

ヘッダ<udfse.h>は, セキュリティ拡張操作関数が扱う構造体定義を含む。

7.1.1 <udfse.h>アクセスログ記述子

segetlog()関数によって返されるアクセスログ記述子構造体aldescの定義を含む。表7.1及び表7.2に関連する構造体の定義を示す。

表7.1 aldesc構造体
メンバの型メンバ名意味
timestamp optime 操作日時
envspec envspec 利用環境
Uint32 op 操作
Uint32 uidtype 利用者識別子の種別
Uint32 uidlen 利用者識別子の長さ
Uint8[] uid 利用者識別子

表7.2 envspec構造体
メンバの型メンバ名意味
Uint8[64] systemid システム識別子
Uint8[64] deviceid 記憶装置識別子
Uint8[192] mediaid 記憶媒体識別子
Uint8[16] lsn 論理セクタ番号
Uint8[48] padding 将来拡張用に予約


7.2 ログの操作

ここで規定する関数は,種別1アクセスログストリーム(TR X 00404.1.2.1を参照)を扱う操作を実行する。

7.2.1 ログの取得

segetlog()関数

7.2.1.1 形式

#include <udfse.h>
int segetlog(int fildes, int logno, int loglen, struct aldesc *logbuf);

7.2.1.2 機能

ログを読み取り, aldesc構造体(7.1.1を参照)に記憶して返却する。引き数lognoは読出すログのログ番号を, 引き数logbufはログの読出し用のバッファを,引き数loglenはaldesc構造体の長さを, 設定する。

7.2.1.3 返却値

成功時には値0を返す。そうでなければ値-1を返し, errnoに失敗を示す値が設定される。失敗時には, logbufの内容は保証されない。

7.2.1.4 誤り

次の状態が発生した場合, segetlog()関数は-1を返し, errnoに対応する値が設定される。

[EINVAL] 引き数loglenが, aldesc構造体の大きさよりも小さい。


7.3 ライセンスの操作

ここで規定する関数は, 種別1ライセンスストリーム(TR X 00405.1.1.1を参照)を扱う操作を実行する。

7.3.1 ライセンス一覧の取得

segetlicenselist()関数

7.3.1.1 形式

int segetlicenselist(int fildes, int bufnum, int buf[], int *num);

7.3.1.2 機能

ライセンスが設定されている操作の一覧を取得する。この機能は, コンテンツごとに使用する。引き数fildesはコンテンツのオープンファイル記述子を, 引き数bufnumはライセンス一覧取得用のバッファ長を, 引き数bufはライセンス一覧取得用のバッファを, 引き数numは登録済み操作数を, 設定する。

7.3.1.3 返却値

成功時には値0を返す。そうでなければ値-1を返し, errnoに失敗を示す値が設定される。失敗時には, bufの内容は保証されない。

7.3.1.4 誤り

次の状態が発生した場合, segetlicenselist()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。

7.3.2 ライセンスの追加

seaddlicense()関数

7.3.2.1 形式

int seaddlicense(int fildes, int operation, int buflen, char *bufp);

7.3.2.2 機能

ライセンスを追加する。この機能はコンテンツごとに, かつ操作ごとに使用する。引き数fildesはコンテンツのオープンファイル記述子を, 引き数operationは操作番号(1:Play, 2:将来拡張用)を, 引き数buflenはライセンス設定用のバッファ長を,引き数bufpはライセンス設定用のバッファを, 設定する。

7.3.2.3 返却値

成功時には値0を返す。そうでなければ値-1を返し, errnoに失敗を示す値が設定される。失敗時には, bufの内容は保証されない。

7.3.2.4 誤り

次の状態が発生した場合, seaddlicense()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。
[EINVAL] operationで指定された値が, 妥当な操作番号ではない。

7.3.3 ライセンスの削除

sedellicense()関数

7.3.3.1 形式

int sedellicense(int fildes, int operation);

7.3.3.2 機能

ライセンスを削除する。この機能はコンテンツごとに, かつ操作ごとに使用する。引き数fildesはコンテンツのオープンファイル記述子を, 引き数operationは操作番号(1:Play, 2:将来拡張用)を設定する。

7.3.3.3 返却値

成功時には値0を返す。そうでなければ値-1を返し, errnoに失敗を示す値が設定される。失敗時には, bufの内容は保証されない。

7.3.3.4 誤り

次の状態が発生した場合, sedellicense()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。
[EINVAL] operationで指定された値が, 妥当な操作番号ではない。

7.3.4 ライセンスの設定

sesetlicense()関数

7.3.4.1 形式

int sesetlicense(int fildes, int operation);

7.3.4.2 機能

必要とされるすべてのデバイスで, 順次ライセンスに適合するかどうかのチェックを受ける。すべてのチェックにパスすると, 最後にチェックしたデバイスに暗号化コンテンツを復号するための鍵が設定される。この機能はコンテンツごとに, かつ操作ごとに使用する。引き数fildesはコンテンツのオープンファイル記述子を, 引き数operationは操作番号(1:Play, 2:将来拡張用)を, 設定する。

7.3.4.3 返却値

成功時には値0を返す。そうでなければ値-1を返し, errnoに失敗を示す値が設定される。失敗時には, bufの内容は保証されない。

7.3.4.4 誤り

次の状態が発生した場合, sesetlicense()関数は-1を返し, errnoに対応する値が設定される。

[EBADF] 引き数fildesが, 妥当なオープンファイル記述子ではない。
[EINVAL] operationで指定された値が, 妥当な操作番号ではない。