[centos-users 648] テープデバイスへアクセスするアプリケーションの開発

YACKY yacky891 @ gmail.com
2008年 1月 23日 (水) 17:41:54 JST


YACKYと申します。
お世話になります。

現在標題の簡単なアプリケーションをC言語で作成しているのですが
write時に「Invalid argument」のエラーが発生してテープデバイスに
書き込みが出来ません。

1. /dev/tapeをopenする(O_RDWR)
2. 1で取得したファイルディスクリプタにbuf、lenを渡してwrite
3. ioctlでEOFを書き込む
4. closeする

ご教授の程、よろしくお願い致します。

///////////////////////////////////////////////
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mtio.h>

#ifndef DEFTAPE
#define DEFTAPE "/dev/tape"     /* default tape device */
#endif /* DEFTAPE */
#define MODE_READ 0
#define MODE_WRITE 1

static char *tape_name;

int main(int argc, char **argv) {
    int mode;   /* 0:READ 1:WRITE */

    if (argc != 2) {
        puts("引数が足りません");
        exit(1);
    }
    if (*argv[1] == 'r') {
        puts("READ");
        mode = MODE_READ;
    } else if (*argv[1] == 'w') {
        puts("WRITE");
        mode = MODE_WRITE;
    } else {
        puts("引数エラー");
        exit(1);
    }

    // MTファイルディスクリプタ
    int mtfd;
    // オープンモード
    int oflags;
    // バッファ
    char *buf;
    int len=10;

    // テープ操作
    struct mtop mtop_cmd;

    int rinf = 1;

    // tapenameを設定
    tape_name = DEFTAPE;

    // バッファ初期化
    buf = malloc(len + 1);

    // オープンモードを設定
    if (mode == MODE_READ) {
        oflags = O_RDONLY;
        puts("リードオンリー設定");
    } else {
        oflags = O_RDWR;
        puts("リードライト設定");
        //oflags = O_WRONLY;
        int i;
        for (i = 0; i < len; i++) {
            buf[i] = 'X';
        }
    }

    // オープン
    if ((mtfd = open(tape_name, oflags)) < 0) {
        perror(tape_name);
        rinf = -1;
        exit(rinf);
    }

    printf("%d\n", mtfd);

    if (mode == MODE_READ) {
        // 読み込み
        if ((rinf = read(mtfd, buf, len)) <= 0) {
            if (rinf != -1) {
                rinf = 0;
            } else {
                perror("read");
                rinf = -3;
                exit(rinf);
            }

        } else {
            int i;
            for (i = 0; i < len; i++) {
                printf("%c\n", buf[i]);
            }
        }
    } else {
        // 書き込み
        if ((rinf = write(mtfd, buf, len)) < 0) {
        //if ((rinf = write(mtfd, buf, len)) <= 0) {
            if (rinf != -1) {
                rinf = 0;
            } else {
                perror("write");
                rinf = -4;
                exit(rinf);
            }
        } else {
            // EOT追加
            memset(&mtop_cmd, 0x00, sizeof(mtop_cmd));
            mtop_cmd.mt_op = MTWEOF;
            mtop_cmd.mt_count = 2;
            ioctl(mtfd, MTIOCTOP, &mtop_cmd);
        }
    }
    // クローズ
    if (close(mtfd) == -1) {
        perror("close");
        rinf = -5;
        exit(rinf);
    }

    return rinf;
}
///////////////////////////////////////////////



centos-users メーリングリストの案内