]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/win32/stored/postest/postest.cpp
Restore win32 dir from Branch-5.2 and update it
[bacula/bacula] / bacula / src / win32 / stored / postest / postest.cpp
1 #ifdef HAVE_WIN32
2 #include <windows.h>
3 typedef int __daddr_t;
4 #else
5 #define tape_open open
6 #define tape_write write
7 #define tape_ioctl ioctl
8 #define tape_close close
9
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;
14 #endif
15
16 #include <unistd.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <fcntl.h>
20 #include <malloc.h>
21 #include <sys/mtio.h>
22 #include <errno.h>
23 #include <string.h>
24
25 char *szCommands[] =
26 {
27    "MTRESET",
28    "MTFSF",
29    "MTBSF",
30    "MTFSR",
31    "MTBSR",
32    "MTWEOF",
33    "MTREW",
34    "MTOFFL",
35    "MTNOP",
36    "MTRETEN",
37    "MTBSFM",
38    "MTFSFM ",
39    "MTEOM",
40    "MTERASE",
41    "MTRAS1",
42    "MTRAS2",
43    "MTRAS3",
44    "UNKNOWN_17",
45    "UNKNOWN_18",
46    "UNKNOWN_19",
47    "MTSETBLK",
48    "MTSETDENSITY",
49    "MTSEEK",
50    "MTTELL",
51    "MTSETDRVBUFFER",
52    "MTFSS",
53    "MTBSS",
54    "MTWSM",
55    "MTLOCK",
56    "MTUNLOCK",
57    "MTLOAD",
58    "MTUNLOAD",
59    "MTCOMPRESSION",
60    "MTSETPART",
61    "MTMKPART",
62 };
63
64 #define NUMBER_COMMANDS (sizeof(szCommands) / sizeof(szCommands[0]))
65
66 typedef  struct _SCRIPT_ENTRY {
67    short       Command;
68    int         Count;
69    PUCHAR      pszDescription;
70    ULONG       ExpectedFile;
71    ULONGLONG   ExpectedBlock;
72 }  SCRIPT_ENTRY, *PSCRIPT_ENTRY;
73
74 SCRIPT_ENTRY   TestScript[] = 
75 {
76    { MTREW, 1, 0, 0 },
77    { MTFSF, 2, 0, 0 },
78    { MTBSR, 1, 0, 0 },
79    { MTBSR, 3, 0, 0 },
80    { MTFSR, 6, 0, 0 },
81    { MTREW, 1, 0, 0 },
82    { MTFSF, 3, 0, 0 },
83    { MTFSR, 8, 0, 0 },
84    { MTFSF, 1, 0, 0 },
85    { MTBSF, 1, 0, 0 }
86 };
87
88 #define SCRIPT_LENGTH (sizeof(TestScript) / sizeof(TestScript[0]))
89
90 void printpos(int fd, ULONG ulFile, ULONG ulBlock);
91
92 void
93 run_script(int fd, PSCRIPT_ENTRY entries, size_t count)
94 {
95    mtop  op;
96
97    for (size_t idxScript = 0; idxScript < count; idxScript++)
98    {
99       PSCRIPT_ENTRY   pEntry = &entries[idxScript];
100
101       fprintf(stderr, "%s %d: ", szCommands[pEntry->Command], pEntry->Count);
102
103       op.mt_op = pEntry->Command;
104       op.mt_count = pEntry->Count;
105
106       int iResult = tape_ioctl(fd, MTIOCTOP, &op);
107
108       if (iResult >= 0)
109       {
110          printpos(fd, pEntry->ExpectedFile, (ULONG)pEntry->ExpectedBlock);
111       }
112       else
113       {
114          fprintf(stderr, "tape_ioctl returned %d, error = %s\n", errno, strerror(errno));
115       }
116    }
117 }
118
119 void
120 weof(int fd)
121 {
122    mtop   op;
123
124    op.mt_op = MTWEOF;
125    op.mt_count = 1;
126
127    if (tape_ioctl(fd, MTIOCTOP, &op) != 0)
128    {
129       fprintf(stderr, "tape_ioctl return error %d - %s", errno, strerror(errno));
130    }
131 }
132
133 void
134 wdata(int fd, ULONG ulBufferNumber, void *pBuffer, size_t size)
135 {
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);
140
141    UCHAR    ucChar = (UCHAR)ulBufferNumber;
142    UCHAR    ucIncrement = (UCHAR)(ulBufferNumber >> 8);
143
144    if (ucIncrement == 0)
145    {
146       ucIncrement++;
147    }
148
149    for (size_t index = 4; index < size; index++)
150    {
151       ((PUCHAR)pBuffer)[index] = ucChar;
152       ucChar += ucIncrement;
153    }
154
155    
156    if (tape_write(fd, pBuffer, (UINT)size) < 0)
157    {
158       fprintf(stderr, "tape_write returned error %d - %s", errno, strerror(errno));
159    }
160 }
161
162 void
163 printpos(int fd, ULONG ulExpectedFile, ULONG ulExpectedBlock)
164 {
165    mtget  st;
166
167    tape_ioctl(fd, MTIOCGET, &st);
168    if (tape_ioctl(fd, MTIOCGET, &st) != 0)
169    {
170       fprintf(stderr, "tape_ioctl(MTIOCGET) returned error %d - %s\n", errno, strerror(errno));
171    }
172
173    mtpos pos;
174
175    if (tape_ioctl(fd, MTIOCPOS, &pos) != 0)
176    {
177       fprintf(stderr, "tape_ioctl(MTIOCPOS) returned error %d - %s\n", errno, strerror(errno));
178    }
179
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" : "");
190 }
191
192 void
193 rewind(int fd)
194 {
195    mtop  op;
196
197    op.mt_op = MTREW;
198    op.mt_count = 1;
199
200    if (tape_ioctl(fd, MTIOCTOP, &op) != 0)
201    {
202       fprintf(stderr, "tape_ioctl return error %d - %s", errno, strerror(errno));
203    }
204 }
205
206 #define  BLOCK_SIZE  32768
207
208 int
209 main(int argc, char **argv)
210 {
211    PUCHAR pBuffer;
212    ULONG ulBlockNumber = 0;
213    ULONG filenumber = 0;
214    int index;
215
216    OSDependentInit();
217
218    int fd = tape_open(argv[1], O_RDWR, 0);
219
220    if (fd == -1)
221    {
222       fprintf(stderr, "tape_open return error %d - %s", errno, strerror(errno));
223       exit(1);
224    }
225    pBuffer = (PUCHAR)malloc(BLOCK_SIZE);
226
227    rewind(fd);
228
229    printpos(fd, 0, 0);
230
231    fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
232
233    for (index = 0; index < 10; index++)
234    {
235       wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
236    }
237
238    weof(fd);
239    filenumber++;
240    ulBlockNumber++;
241
242    fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
243
244    for (index = 0; index < 5; index++)
245    {
246       wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
247    }
248
249    weof(fd);
250    filenumber++;
251    ulBlockNumber++;
252
253    fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
254
255       for (index = 0; index < 11; index++)
256    {
257       wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
258    }
259
260    weof(fd);
261    filenumber++;
262    ulBlockNumber++;
263
264    fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
265
266    for (index = 0; index < 8; index++)
267    {
268       wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
269    }
270
271    weof(fd);
272    filenumber++;
273    ulBlockNumber++;
274
275    fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
276    for (index = 0; index < 12; index++)
277    {
278       wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
279    }
280
281    weof(fd);
282    filenumber++;
283    ulBlockNumber++;
284
285    fprintf(stderr, "file = %d, first block = %d\n", filenumber, ulBlockNumber);
286    for (index = 0; index < 7; index++)
287    {
288       wdata(fd, ulBlockNumber++, pBuffer, BLOCK_SIZE);
289    }
290
291    weof(fd);
292    filenumber++;
293    ulBlockNumber++;
294
295    run_script(fd, TestScript, SCRIPT_LENGTH);
296    tape_close(fd);
297    free(pBuffer);
298    return 0;
299 }