2008年1月25日

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

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;
}
///////////////////////////////////////////////

投稿者 xml-rpc : 2008年1月25日 10:20
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69020
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。