6 #define tape_write write
7 #define tape_ioctl ioctl
8 #define tape_close close
10 typedef unsigned char UCHAR, *PUCHAR;
11 typedef unsigned int UINT, *PUINT;
12 typedef unsigned long ULONG, *PULONG;
13 typedef unsigned long long ULONGLONG, *PULONGLONG;
64 #define NUMBER_COMMANDS (sizeof(szCommands) / sizeof(szCommands[0]))
66 typedef struct _SCRIPT_ENTRY {
69 PUCHAR pszDescription;
71 ULONGLONG ExpectedBlock;
72 } SCRIPT_ENTRY, *PSCRIPT_ENTRY;
74 SCRIPT_ENTRY TestScript[] =
88 #define SCRIPT_LENGTH (sizeof(TestScript) / sizeof(TestScript[0]))
90 void printpos(int fd, ULONG ulFile, ULONG ulBlock);
93 run_script(int fd, PSCRIPT_ENTRY entries, size_t count)
97 for (size_t idxScript = 0; idxScript < count; idxScript++)
99 PSCRIPT_ENTRY pEntry = &entries[idxScript];
101 fprintf(stderr, "%s %d: ", szCommands[pEntry->Command], pEntry->Count);
103 op.mt_op = pEntry->Command;
104 op.mt_count = pEntry->Count;
106 int iResult = tape_ioctl(fd, MTIOCTOP, &op);
110 printpos(fd, pEntry->ExpectedFile, (ULONG)pEntry->ExpectedBlock);
114 fprintf(stderr, "tape_ioctl returned %d, error = %s\n", errno, strerror(errno));
127 if (tape_ioctl(fd, MTIOCTOP, &op) != 0)
129 fprintf(stderr, "tape_ioctl return error %d - %s", errno, strerror(errno));
134 wdata(int fd, ULONG ulBufferNumber, void *pBuffer, size_t size)
136 ((PUCHAR)pBuffer)[0] = (UCHAR)ulBufferNumber;
137 ((PUCHAR)pBuffer)[1] = (UCHAR)(ulBufferNumber >> 8);
138 ((PUCHAR)pBuffer)[2] = (UCHAR)(ulBufferNumber >> 16);
139 ((PUCHAR)pBuffer)[3] = (UCHAR)(ulBufferNumber >> 24);
141 UCHAR ucChar = (UCHAR)ulBufferNumber;
142 UCHAR ucIncrement = (UCHAR)(ulBufferNumber >> 8);
144 if (ucIncrement == 0)
149 for (size_t index = 4; index < size; index++)
151 ((PUCHAR)pBuffer)[index] = ucChar;
152 ucChar += ucIncrement;
156 if (tape_write(fd, pBuffer, (UINT)size) < 0)
158 fprintf(stderr, "tape_write returned error %d - %s", errno, strerror(errno));
163 printpos(int fd, ULONG ulExpectedFile, ULONG ulExpectedBlock)
167 tape_ioctl(fd, MTIOCGET, &st);
168 if (tape_ioctl(fd, MTIOCGET, &st) != 0)
170 fprintf(stderr, "tape_ioctl(MTIOCGET) returned error %d - %s\n", errno, strerror(errno));
175 if (tape_ioctl(fd, MTIOCPOS, &pos) != 0)
177 fprintf(stderr, "tape_ioctl(MTIOCPOS) returned error %d - %s\n", errno, strerror(errno));
180 fprintf( stderr, "File = %d s/b %d, Block = %d, s/b %d, Absolute = %d, Flags =%s%s%s%s%s%s%s%s\n",
181 st.mt_fileno, ulExpectedFile, st.mt_blkno, ulExpectedBlock, pos.mt_blkno,
182 GMT_EOF(st.mt_gstat) ? " EOF" : "",
183 GMT_BOT(st.mt_gstat) ? " BOT" : "",
184 GMT_EOT(st.mt_gstat) ? " EOT" : "",
185 GMT_EOD(st.mt_gstat) ? " EOD" : "",
186 GMT_WR_PROT(st.mt_gstat) ? " WR_PROT" : "",
187 GMT_ONLINE(st.mt_gstat) ? " ONLINE" : "",
188 GMT_DR_OPEN(st.mt_gstat) ? " DR_OPEN" : "",
189 GMT_IM_REP_EN(st.mt_gstat) ? " IM_REP_EN" : "");
200 if (tape_ioctl(fd, MTIOCTOP, &op) != 0)
202 fprintf(stderr, "tape_ioctl return error %d - %s", errno, strerror(errno));
206 #define BLOCK_SIZE 32768
209 main(int argc, char **argv)
212 ULONG ulBlockNumber = 0;
213 ULONG filenumber = 0;
218 int fd = tape_open(argv[1], O_RDWR, 0);
222 fprintf(stderr, "tape_open return error %d - %s", errno, strerror(errno));
225 pBuffer = (PUCHAR)malloc(BLOCK_SIZE);
231 fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
233 for (index = 0; index < 10; index++)
235 wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
242 fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
244 for (index = 0; index < 5; index++)
246 wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
253 fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
255 for (index = 0; index < 11; index++)
257 wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
264 fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
266 for (index = 0; index < 8; index++)
268 wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
275 fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
276 for (index = 0; index < 12; index++)
278 wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
285 fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
286 for (index = 0; index < 7; index++)
288 wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
295 run_script(fd, TestScript, SCRIPT_LENGTH);