付録E.3 EasyMTテープでの作成方法

EasyMTは,E.2で示した可変長ブロックテープを使用して,ボリューム名やファイル名によるテープ管理をするプログラムプロダクトです。

<この項の構成>
(1) 主な媒体
(2) ファイル名の例
(3) ファイル名の作成
(4) 概略
(5) 作成例

(1) 主な媒体

DAT,CGMT,OMT

(2) ファイル名の例

/dev/dat/vdat010(内蔵DAT),
/dev/cgmt/vcgmt160(カートリッジ磁気テープ),
/dev/omt/vomt055(オープンリール磁気テープ)

(3) ファイル名の作成

可変長ブロックデバイスは,導入時には作成されていません。そのため,事前に作成する必要があります。

スーパユーザが,次のコマンドを実行します。

/etc/mknod /dev/dat/vdat010 c 119 0x010001
/bin/chmod 0666 /dev/dat/vdat010
(説明)
通常はこのコマンドを実行すれば,内蔵DATに対する可変長ブロックアクセスデバイスが作成されます。
/dev/dat/vdat010
デバイス名称
c
キャラクタスペシャルファイル
119
メジャー番号(DATの可変長ブロック使用を示します)
0x010001
マイナー番号(内蔵DATを圧縮モードで使用することを示します)
なお,用語,概念などについては,次のmanを参照してください。
mknod及びchmod:man 1m mknod及びman chmod
メジャー番号,マイナー番号,及びデバイス名称の命名規則:man 6 mt

(4) 概略

EasyMTでは,次のようなヘッダ形式があります。

シンボル意味
EMTVOL_ELEasyMTラベル
EMTVOL_SL標準ラベル
EMTVOL_JLJISコードラベル
EMTVOL_NLラベルなし

データベース作成ユティリティ(pdload)では,まずヘッダを読み込み,認識できる形式のものを読みます。認識できない場合やラベルなしの場合は,エラーとします。

EasyMTでは,次のようなレコード形式があります。

シンボル意味ブロック指定レコード指定ラベル指定
F固定長非ブロックレコードNFSL又はEL
FB固定長ブロックレコードB
V可変長非ブロックレコードNV
VB可変長ブロックレコードB
U不定長NU

データベース作成ユティリティ(pdload)では,上記のすべての型に対応します。しかし,ブロック長,レコード長,及びデータ長のうち,最長のものの最大値は次のようになります。

作成機種最大値
3050RXグループ32キロバイト(32768バイト)
3500シリーズ
HITAC-Mシリーズ32キロバイト-8(32760バイト)

F及びFBのレコード形式は,1レコードの長さが固定なので,入力がバイナリファイルで行の構成列がすべて固定長の表,又はFIX表の場合だけ使用できます。入力がアスキーファイルの場合は,データ長がすべて同じ場合だけ使用できます。

データベース作成ユティリティ(pdload)の入力としては,次の2種類のファイルが扱えます。

(a) バイナリ形式ファイル

レコード形式には,次の種類があります。

・F(固定長非ブロックレコード)

[図データ]

・FB(固定長ブロックレコード)

[図データ]

データ長(レコード長)には,1行の長さを指定します。

行の構成列がすべて固定長の表,又はFIX表の場合だけF/FBを指定できます。

・V(可変長非ブロックレコード)

[図データ]

・VB(可変長ブロックレコード)

[図データ]

・U(不定長)

[図データ]

(b) DAT形式ファイル

DAT形式のファイルは,1行1レコード(NL文字まで)にします。通常レコード形式はV,VB,又はUのどれかの形式にします。データ長がすべて同じ場合だけ,F又はFBが使用できます。

データ長には,NL(LF : 0x0a, '¥n')を含みます。NLを含まないレコードは,エラーとなります。

[図データ]

以上のことをまとめると,データ長,レコード長,及びブロック長の最大・最小値は次のようになります。

【3050RXグループ・3500シリーズで作成する場合】
レコード形式データ長レコード長ブロック長
minmaxminmaxminmax
F/FB132768132768132768
V/VB132760532764932768
U132768132768
【HITAC-Mシリーズで作成する場合】
レコード形式データ長レコード長ブロック長
minmaxminmaxminmax
F/FB132760132760132760
V/VB132752532756932760
U132760132760

(5) 作成例

3050RXグループ又は3500シリーズでEasyMT提供関数を使用して,データベース作成ユティリティ(pdload)用入力ファイルを作成する例を示します。

なお,EasyMTの定義は,MT属性定義ファイルで指定するものとします。

(a) プログラム例

MT属性定義ファイルは,第1引数(argv[1])で指定します。

エラー処理は,必要に応じて指定してください。

#include    <stdio.h>
#include    <stdlib.h>
#include    <unistd.h>
#include    "easymt.h"
#define     PROC_BUFSIZ     1024 * 32
char        buf[PROC_BUFSIZ];
int         data_len;               /* データ長 */
    :
void main(int argc, char *argv[])
{
    EmtDescr_t* emt_fp;
    if (EmtInit(NULL, argv[1])) {
        printf("EmtInit失敗, ,EmtErrno=%i¥n", EmtErrno);
        exit(EXIT_FAILURE);
    }
    if (emt_fp = EmtAlloc(NULL, argv[1])) {
    } else {
        printf("EmtAlloc失敗, ,EmtErrno=%i¥n", EmtErrno);
        exit(EXIT_FAILURE);
    }
    if (EmtFopen(emt_fp, NULL)) {
        printf("EmtFopen失敗, ,EmtErrno=%i¥n", EmtErrno);
        goto proc_free;
    }
    while(データがある間) {
            :

ここでbufにデータを作成する。data_lenにデータ長を代入。
DAT形式データの場合はNL(0x0a)をデータ内に含みます。

            :
        rc = EmtWrite(emt_fp, buf, data_len);
        if (rc != data_len) {
            printf("EmtWrite失敗,EmtErrno=%i¥n", EmtErrno);
            goto proc_close;
        }
    }
proc_close:
    if (EmtFclose(emt_fp)) {
        printf("EmtFclose失敗,EmtErrno=%i¥n", EmtErrno);
        goto proc_free;
    }
proc_free:
    if (EmtFree(emt_fp)) {
        printf("EmtFree失敗,EmtErrno=%i¥n", EmtErrno);
        exit(EXIT_FAILURE);
    }
}

(b) MT属性定義ファイルの例

定義ファイルで「=」の直後が空白のものは,その値を省略したことになります。

デバイス名:
/dev/dat/vdat010
バッファ面数:
2
ボリューム名:
HiRDB
ラベルタイプ:
標準ラベル(SL)
ファイル名称:
input_data
オープンモード:
書き込み指定
レコードタイプ:
VBの最大値
(Mシリーズでも扱えるように最大値を32キロバイト-8(32760バイト)にしたもの)
これで,データ長はレコード長-4(32752バイト)まで扱えることになります。

MT属性定義ファイルのうち,以下のエントリはpdloadの制御情報ファイルのsource文エントリと対応します。

MT属性定義ファイルエントリpdload制御情報ファイルsource文エントリ最大文字数
volname=vol=6
filename=file=17
注※
MTをHITAC-Mシリーズで作成する場合,filenameは44文字まで指定できますが,そのうち有効な文字数はfilenameの終わりから17文字までです。それを指定してください。

bufnoエントリは単に,書き込み時にバッファ面数を何面使うかの指定なので,pdloadの指定と合わせる必要はありません。

上記のようなファイルを作成する場合の定義例を次に示します。

#/*-------------------------------------------------------
#   (1) 動作に対する指定
#/*-------------------------------------------------------
devname=/dev/dat/vdat010
blking=OFF
bufno=2
#/*-------------------------------------------------------
#   (2) volume属性に関する指定
#/*-------------------------------------------------------
volname=HiRDB
voltype=SL
#/*-------------------------------------------------------
#   (3) file属性に関する指定
#/*-------------------------------------------------------
filename=input_data
openmode=EMT_WRONLY
blklen=32760
reclen=32756
blktype=B
rectype=V