test_read_format_rar.c revision 305188
1/*-
2 * Copyright (c) 2003-2007 Tim Kientzle
3 * Copyright (c) 2011 Andres Mejia
4 * Copyright (c) 2011-2012 Michihiro NAKAJIMA
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27#include "test.h"
28
29#include <locale.h>
30
31DEFINE_TEST(test_read_format_rar_basic)
32{
33  char buff[64];
34  const char reffile[] = "test_read_format_rar.rar";
35  const char test_txt[] = "test text document\r\n";
36  int size = sizeof(test_txt)-1;
37  struct archive_entry *ae;
38  struct archive *a;
39
40  extract_reference_file(reffile);
41  assert((a = archive_read_new()) != NULL);
42  assertA(0 == archive_read_support_filter_all(a));
43  assertA(0 == archive_read_support_format_all(a));
44  assertA(0 == archive_read_open_filename(a, reffile, 10240));
45
46  /* First header. */
47  assertA(0 == archive_read_next_header(a, &ae));
48  assertEqualString("test.txt", archive_entry_pathname(ae));
49  assertA((int)archive_entry_mtime(ae));
50  assertA((int)archive_entry_ctime(ae));
51  assertA((int)archive_entry_atime(ae));
52  assertEqualInt(20, archive_entry_size(ae));
53  assertEqualInt(33188, archive_entry_mode(ae));
54  assertA(size == archive_read_data(a, buff, size));
55  assertEqualMem(buff, test_txt, size);
56  assertEqualInt(archive_entry_is_encrypted(ae), 0);
57  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
58
59  /* Second header. */
60  assertA(0 == archive_read_next_header(a, &ae));
61  assertEqualString("testlink", archive_entry_pathname(ae));
62  assertA((int)archive_entry_mtime(ae));
63  assertA((int)archive_entry_ctime(ae));
64  assertA((int)archive_entry_atime(ae));
65  assertEqualInt(0, archive_entry_size(ae));
66  assertEqualInt(41471, archive_entry_mode(ae));
67  assertEqualString("test.txt", archive_entry_symlink(ae));
68  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
69  assertEqualInt(archive_entry_is_encrypted(ae), 0);
70  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
71
72  /* Third header. */
73  assertA(0 == archive_read_next_header(a, &ae));
74  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
75  assertA((int)archive_entry_mtime(ae));
76  assertA((int)archive_entry_ctime(ae));
77  assertA((int)archive_entry_atime(ae));
78  assertEqualInt(20, archive_entry_size(ae));
79  assertEqualInt(33188, archive_entry_mode(ae));
80  assertA(size == archive_read_data(a, buff, size));
81  assertEqualMem(buff, test_txt, size);
82  assertEqualInt(archive_entry_is_encrypted(ae), 0);
83  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
84
85  /* Fourth header. */
86  assertA(0 == archive_read_next_header(a, &ae));
87  assertEqualString("testdir", archive_entry_pathname(ae));
88  assertA((int)archive_entry_mtime(ae));
89  assertA((int)archive_entry_ctime(ae));
90  assertA((int)archive_entry_atime(ae));
91  assertEqualInt(0, archive_entry_size(ae));
92  assertEqualInt(16877, archive_entry_mode(ae));
93  assertEqualInt(archive_entry_is_encrypted(ae), 0);
94  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
95
96  /* Fifth header. */
97  assertA(0 == archive_read_next_header(a, &ae));
98  assertEqualString("testemptydir", archive_entry_pathname(ae));
99  assertA((int)archive_entry_mtime(ae));
100  assertA((int)archive_entry_ctime(ae));
101  assertA((int)archive_entry_atime(ae));
102  assertEqualInt(0, archive_entry_size(ae));
103  assertEqualInt(16877, archive_entry_mode(ae));
104  assertEqualInt(archive_entry_is_encrypted(ae), 0);
105  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
106
107  /* Test EOF */
108  assertA(1 == archive_read_next_header(a, &ae));
109  assertEqualInt(5, archive_file_count(a));
110  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
111  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
112}
113
114DEFINE_TEST(test_read_format_rar_subblock)
115{
116  char buff[64];
117  const char reffile[] = "test_read_format_rar_subblock.rar";
118  const char test_txt[] = "test text document\r\n";
119  int size = sizeof(test_txt)-1;
120  struct archive_entry *ae;
121  struct archive *a;
122
123  extract_reference_file(reffile);
124  assert((a = archive_read_new()) != NULL);
125  assertA(0 == archive_read_support_filter_all(a));
126  assertA(0 == archive_read_support_format_all(a));
127  assertA(0 == archive_read_open_filename(a, reffile, 10240));
128
129  /* First header. */
130  assertA(0 == archive_read_next_header(a, &ae));
131  assertEqualString("test.txt", archive_entry_pathname(ae));
132  assertA((int)archive_entry_mtime(ae));
133  assertA((int)archive_entry_ctime(ae));
134  assertA((int)archive_entry_atime(ae));
135  assertEqualInt(20, archive_entry_size(ae));
136  assertEqualInt(33188, archive_entry_mode(ae));
137  assertA(size == archive_read_data(a, buff, size));
138  assertEqualMem(buff, test_txt, size);
139  assertEqualInt(archive_entry_is_encrypted(ae), 0);
140  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
141
142  /* Test EOF */
143  assertA(1 == archive_read_next_header(a, &ae));
144  assertEqualInt(1, archive_file_count(a));
145  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
146  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
147}
148
149DEFINE_TEST(test_read_format_rar_noeof)
150{
151  char buff[64];
152  const char reffile[] = "test_read_format_rar_noeof.rar";
153  const char test_txt[] = "test text document\r\n";
154  int size = sizeof(test_txt)-1;
155  struct archive_entry *ae;
156  struct archive *a;
157
158  extract_reference_file(reffile);
159  assert((a = archive_read_new()) != NULL);
160  assertA(0 == archive_read_support_filter_all(a));
161  assertA(0 == archive_read_support_format_all(a));
162  assertA(0 == archive_read_open_filename(a, reffile, 10240));
163
164  /* First header. */
165  assertA(0 == archive_read_next_header(a, &ae));
166  assertEqualString("test.txt", archive_entry_pathname(ae));
167  assertA((int)archive_entry_mtime(ae));
168  assertA((int)archive_entry_ctime(ae));
169  assertA((int)archive_entry_atime(ae));
170  assertEqualInt(20, archive_entry_size(ae));
171  assertEqualInt(33188, archive_entry_mode(ae));
172  assertA(size == archive_read_data(a, buff, size));
173  assertEqualMem(buff, test_txt, size);
174  assertEqualInt(archive_entry_is_encrypted(ae), 0);
175  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
176
177  /* Test EOF */
178  assertA(1 == archive_read_next_header(a, &ae));
179  assertEqualInt(1, archive_file_count(a));
180  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
181  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
182}
183
184DEFINE_TEST(test_read_format_rar_unicode_UTF8)
185{
186  char buff[30];
187  const char reffile[] = "test_read_format_rar_unicode.rar";
188  const char test_txt[] = "kanji";
189  struct archive_entry *ae;
190  struct archive *a;
191
192  if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
193	skipping("en_US.UTF-8 locale not available on this system.");
194	return;
195  }
196
197  extract_reference_file(reffile);
198  assert((a = archive_read_new()) != NULL);
199  assertA(0 == archive_read_support_filter_all(a));
200  assertA(0 == archive_read_support_format_all(a));
201  assertA(0 == archive_read_open_filename(a, reffile, 10240));
202
203  /* First header. */
204  assertA(0 == archive_read_next_header(a, &ae));
205#if defined(__APPLE__)
206#define f1name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
207      "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82\xA9"\
208      "\xE3\x83\xAB\xE3\x82\xBF\xE3\x82\x99/\xE6\x96\xB0\xE8\xA6\x8F"\
209      "\xE3\x83\x86\xE3\x82\xAD\xE3\x82\xB9\xE3\x83\x88 "\
210      "\xE3\x83\x88\xE3\x82\x99\xE3\x82\xAD\xE3\x83\xA5\xE3\x83\xA1"\
211      "\xE3\x83\xB3\xE3\x83\x88.txt" /* NFD */
212#else
213#define f1name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
214      "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82\xA9"\
215      "\xE3\x83\xAB\xE3\x83\x80/\xE6\x96\xB0\xE8\xA6\x8F"\
216      "\xE3\x83\x86\xE3\x82\xAD\xE3\x82\xB9\xE3\x83\x88 "\
217      "\xE3\x83\x89\xE3\x82\xAD\xE3\x83\xA5\xE3\x83\xA1"\
218      "\xE3\x83\xB3\xE3\x83\x88.txt" /* NFC */
219#endif
220  assertEqualUTF8String(f1name, archive_entry_pathname(ae));
221  assertA((int)archive_entry_mtime(ae));
222  assertEqualInt(0, archive_entry_size(ae));
223  assertEqualInt(33188, archive_entry_mode(ae));
224
225  /* Second header. */
226  assertA(0 == archive_read_next_header(a, &ae));
227#if defined(__APPLE__)
228#define f2name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
229      "\xE6\xBC\xA2\xE5\xAD\x97\xE9\x95\xB7\xE3\x81\x84\xE3\x83\x95"\
230      "\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8Dlong-filename-in-"\
231      "\xE6\xBC\xA2\xE5\xAD\x97.txt" /* NFD */
232#else
233#define f2name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
234      "\xE6\xBC\xA2\xE5\xAD\x97\xE9\x95\xB7\xE3\x81\x84\xE3\x83\x95"\
235      "\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8Dlong-filename-in-"\
236      "\xE6\xBC\xA2\xE5\xAD\x97.txt" /* NFC */
237#endif
238  assertEqualUTF8String(f2name, archive_entry_pathname(ae));
239  assertA((int)archive_entry_mtime(ae));
240  assertEqualInt(5, archive_entry_size(ae));
241  assertEqualInt(33188, archive_entry_mode(ae));
242  assertEqualIntA(a, 5, archive_read_data(a, buff, 5));
243  assertEqualMem(buff, test_txt, 5);
244  assertEqualInt(archive_entry_is_encrypted(ae), 0);
245  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
246
247  /* Third header. */
248  assertA(0 == archive_read_next_header(a, &ae));
249#if defined(__APPLE__)
250#define f3name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
251      "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82"\
252      "\xA9\xE3\x83\xAB\xE3\x82\xBF\xE3\x82\x99" /* NFD */
253#else
254#define f3name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
255      "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x95\xE3\x82"\
256      "\xA9\xE3\x83\xAB\xE3\x83\x80" /* NFC */
257#endif
258  assertEqualUTF8String(f3name, archive_entry_pathname(ae));
259  assertA((int)archive_entry_mtime(ae));
260  assertEqualInt(0, archive_entry_size(ae));
261  assertEqualInt(16877, archive_entry_mode(ae));
262
263  /* Fourth header. */
264  assertA(0 == archive_read_next_header(a, &ae));
265#if defined(__APPLE__)
266#define f4name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88" /* NFD */
267#else
268#define f4name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88" /* NFC */
269#endif
270  assertEqualUTF8String(f4name, archive_entry_pathname(ae));
271  assertA((int)archive_entry_mtime(ae));
272  assertEqualInt(0, archive_entry_size(ae));
273  assertEqualInt(16877, archive_entry_mode(ae));
274
275  /* Fifth header, which has a symbolic-link name in multi-byte characters. */
276  assertA(0 == archive_read_next_header(a, &ae));
277#if defined(__APPLE__)
278#define f5name "\xE8\xA1\xA8\xE3\x81\x9F\xE3\x82\x99\xE3\x82\x88/"\
279      "\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB" /* NFD */
280#else
281#define f5name "\xE8\xA1\xA8\xE3\x81\xA0\xE3\x82\x88/"\
282      "\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB" /* NFC */
283#endif
284  assertEqualUTF8String(f5name, archive_entry_pathname(ae));
285  assertEqualUTF8String(
286      "\xE6\xBC\xA2\xE5\xAD\x97\xE9\x95\xB7\xE3\x81\x84\xE3\x83\x95"
287      "\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8Dlong-filename-in-"
288      "\xE6\xBC\xA2\xE5\xAD\x97.txt", archive_entry_symlink(ae));
289  assertA((int)archive_entry_mtime(ae));
290  assertEqualInt(0, archive_entry_size(ae));
291  assertEqualInt(41453, archive_entry_mode(ae));
292  assertEqualInt(archive_entry_is_encrypted(ae), 0);
293  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
294  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
295
296  /* Sixth header */
297  assertA(0 == archive_read_next_header(a, &ae));
298  assertEqualUTF8String(
299    "abcdefghijklmnopqrs\xE3\x83\x86\xE3\x82\xB9\xE3\x83\x88.txt",
300    archive_entry_pathname(ae));
301  assertA((int)archive_entry_mtime(ae));
302  assertEqualInt(16, archive_entry_size(ae));
303  assertEqualInt(33204, archive_entry_mode(ae));
304  assertEqualInt(archive_entry_is_encrypted(ae), 0);
305  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
306  assertEqualIntA(a, 16, archive_read_data(a, buff, sizeof(buff)));
307
308  /* Test EOF */
309  assertA(1 == archive_read_next_header(a, &ae));
310  assertEqualInt(6, archive_file_count(a));
311  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
312  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
313}
314
315DEFINE_TEST(test_read_format_rar_unicode_CP932)
316{
317  char buff[30];
318  const char reffile[] = "test_read_format_rar_unicode.rar";
319  const char test_txt[] = "kanji";
320  struct archive_entry *ae;
321  struct archive *a;
322
323  if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
324    NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
325	skipping("CP932 locale not available on this system.");
326	return;
327  }
328
329  extract_reference_file(reffile);
330  assert((a = archive_read_new()) != NULL);
331  assertA(0 == archive_read_support_filter_all(a));
332  assertA(0 == archive_read_support_format_all(a));
333  /* Specify the charset of symbolic-link file name. */
334  if (ARCHIVE_OK != archive_read_set_options(a, "rar:hdrcharset=UTF-8")) {
335	skipping("This system cannot convert character-set"
336	    " from UTF-8 to CP932.");
337	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
338	return;
339  }
340  assertA(0 == archive_read_open_filename(a, reffile, 10240));
341
342  /* First header. */
343  assertA(0 == archive_read_next_header(a, &ae));
344  assertEqualString("\x95\x5c\x82\xbe\x82\xe6/\x90\x56\x82\xb5\x82\xa2"
345      "\x83\x74\x83\x48\x83\x8b\x83\x5f/\x90\x56\x8b\x4b\x83\x65\x83\x4c"
346      "\x83\x58\x83\x67 \x83\x68\x83\x4c\x83\x85\x83\x81\x83\x93\x83\x67.txt",
347      archive_entry_pathname(ae));
348  assertA((int)archive_entry_mtime(ae));
349  assertEqualInt(0, archive_entry_size(ae));
350  assertEqualInt(33188, archive_entry_mode(ae));
351  assertEqualInt(archive_entry_is_encrypted(ae), 0);
352  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
353
354  /* Second header. */
355  assertA(0 == archive_read_next_header(a, &ae));
356  assertEqualString("\x95\x5c\x82\xbe\x82\xe6/\x8a\xbf\x8e\x9a"
357      "\x92\xb7\x82\xa2\x83\x74\x83\x40\x83\x43\x83\x8b\x96\xbc\x6c"
358      "\x6f\x6e\x67\x2d\x66\x69\x6c\x65\x6e\x61\x6d\x65\x2d\x69\x6e"
359      "\x2d\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
360  assertA((int)archive_entry_mtime(ae));
361  assertEqualInt(5, archive_entry_size(ae));
362  assertEqualInt(33188, archive_entry_mode(ae));
363  assertEqualInt(archive_entry_is_encrypted(ae), 0);
364  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
365  assertA(5 == archive_read_data(a, buff, 5));
366  assertEqualMem(buff, test_txt, 5);
367
368  /* Third header. */
369  assertA(0 == archive_read_next_header(a, &ae));
370  assertEqualString("\x95\x5c\x82\xbe\x82\xe6/"
371      "\x90\x56\x82\xb5\x82\xa2\x83\x74\x83\x48\x83\x8b\x83\x5f",
372      archive_entry_pathname(ae));
373  assertA((int)archive_entry_mtime(ae));
374  assertEqualInt(0, archive_entry_size(ae));
375  assertEqualInt(16877, archive_entry_mode(ae));
376  assertEqualInt(archive_entry_is_encrypted(ae), 0);
377  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
378
379  /* Fourth header. */
380  assertA(0 == archive_read_next_header(a, &ae));
381  assertEqualString("\x95\x5c\x82\xbe\x82\xe6", archive_entry_pathname(ae));
382  assertA((int)archive_entry_mtime(ae));
383  assertEqualInt(0, archive_entry_size(ae));
384  assertEqualInt(16877, archive_entry_mode(ae));
385  assertEqualInt(archive_entry_is_encrypted(ae), 0);
386  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
387
388  /* Fifth header, which has a symbolic-link name in multi-byte characters. */
389  assertA(0 == archive_read_next_header(a, &ae));
390  assertEqualString("\x95\x5c\x82\xbe\x82\xe6/"
391      "\x83\x74\x83\x40\x83\x43\x83\x8B", archive_entry_pathname(ae));
392  assertEqualString("\x8a\xbf\x8e\x9a"
393      "\x92\xb7\x82\xa2\x83\x74\x83\x40\x83\x43\x83\x8b\x96\xbc\x6c"
394      "\x6f\x6e\x67\x2d\x66\x69\x6c\x65\x6e\x61\x6d\x65\x2d\x69\x6e"
395      "\x2d\x8a\xbf\x8e\x9a.txt", archive_entry_symlink(ae));
396  assertA((int)archive_entry_mtime(ae));
397  assertEqualInt(0, archive_entry_size(ae));
398  assertEqualInt(41453, archive_entry_mode(ae));
399  assertEqualInt(archive_entry_is_encrypted(ae), 0);
400  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
401  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
402
403  /* Sixth header */
404  assertA(0 == archive_read_next_header(a, &ae));
405  assertEqualUTF8String(
406    "abcdefghijklmnopqrs\x83\x65\x83\x58\x83\x67.txt",
407    archive_entry_pathname(ae));
408  assertA((int)archive_entry_mtime(ae));
409  assertEqualInt(16, archive_entry_size(ae));
410  assertEqualInt(33204, archive_entry_mode(ae));
411  assertEqualInt(archive_entry_is_encrypted(ae), 0);
412  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
413  assertEqualIntA(a, 16, archive_read_data(a, buff, sizeof(buff)));
414
415  /* Test EOF */
416  assertA(1 == archive_read_next_header(a, &ae));
417  assertEqualInt(6, archive_file_count(a));
418  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
419  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
420}
421
422DEFINE_TEST(test_read_format_rar_compress_normal)
423{
424  const char reffile[] = "test_read_format_rar_compress_normal.rar";
425  char file1_buff[20111];
426  int file1_size = sizeof(file1_buff);
427  const char file1_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
428                                "</P>\n"
429                                "</BODY>\n"
430                                "</HTML>";
431  char file2_buff[20];
432  int file2_size = sizeof(file2_buff);
433  const char file2_test_txt[] = "test text document\r\n";
434  struct archive_entry *ae;
435  struct archive *a;
436
437  extract_reference_file(reffile);
438  assert((a = archive_read_new()) != NULL);
439  assertA(0 == archive_read_support_filter_all(a));
440  assertA(0 == archive_read_support_format_all(a));
441  assertA(0 == archive_read_open_filename(a, reffile, 10240));
442
443  /* First header. */
444  assertA(0 == archive_read_next_header(a, &ae));
445  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
446  assertA((int)archive_entry_mtime(ae));
447  assertA((int)archive_entry_ctime(ae));
448  assertA((int)archive_entry_atime(ae));
449  assertEqualInt(file1_size, archive_entry_size(ae));
450  assertEqualInt(33188, archive_entry_mode(ae));
451  assertEqualInt(archive_entry_is_encrypted(ae), 0);
452  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
453  assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
454  assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
455                 file1_test_txt, sizeof(file1_test_txt) - 1);
456
457    /* Second header. */
458  assertA(0 == archive_read_next_header(a, &ae));
459  assertEqualString("testlink", archive_entry_pathname(ae));
460  assertA((int)archive_entry_mtime(ae));
461  assertA((int)archive_entry_ctime(ae));
462  assertA((int)archive_entry_atime(ae));
463  assertEqualInt(0, archive_entry_size(ae));
464  assertEqualInt(41471, archive_entry_mode(ae));
465  assertEqualInt(archive_entry_is_encrypted(ae), 0);
466  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
467  assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
468  assertEqualIntA(a, 0, archive_read_data(a, file1_buff, 30));
469
470  /* Third header. */
471  assertA(0 == archive_read_next_header(a, &ae));
472  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
473  assertA((int)archive_entry_mtime(ae));
474  assertA((int)archive_entry_ctime(ae));
475  assertA((int)archive_entry_atime(ae));
476  assertEqualInt(file2_size, archive_entry_size(ae));
477  assertEqualInt(33188, archive_entry_mode(ae));
478  assertEqualInt(archive_entry_is_encrypted(ae), 0);
479  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
480  assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
481  assertEqualMem(&file2_buff[file2_size + 1 - sizeof(file2_test_txt)],
482                 file2_test_txt, sizeof(file2_test_txt) - 1);
483
484  /* Fourth header. */
485  assertA(0 == archive_read_next_header(a, &ae));
486  assertEqualString("testdir/LibarchiveAddingTest.html",
487                    archive_entry_pathname(ae));
488  assertA((int)archive_entry_mtime(ae));
489  assertA((int)archive_entry_ctime(ae));
490  assertA((int)archive_entry_atime(ae));
491  assertEqualInt(file1_size, archive_entry_size(ae));
492  assertEqualInt(33188, archive_entry_mode(ae));
493  assertEqualInt(archive_entry_is_encrypted(ae), 0);
494  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
495  assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
496  assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
497                 file1_test_txt, sizeof(file1_test_txt) - 1);
498
499  /* Fifth header. */
500  assertA(0 == archive_read_next_header(a, &ae));
501  assertEqualString("testdir", archive_entry_pathname(ae));
502  assertA((int)archive_entry_mtime(ae));
503  assertA((int)archive_entry_ctime(ae));
504  assertA((int)archive_entry_atime(ae));
505  assertEqualInt(0, archive_entry_size(ae));
506  assertEqualInt(16877, archive_entry_mode(ae));
507  assertEqualInt(archive_entry_is_encrypted(ae), 0);
508  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
509
510  /* Sixth header. */
511  assertA(0 == archive_read_next_header(a, &ae));
512  assertEqualString("testemptydir", archive_entry_pathname(ae));
513  assertA((int)archive_entry_mtime(ae));
514  assertA((int)archive_entry_ctime(ae));
515  assertA((int)archive_entry_atime(ae));
516  assertEqualInt(0, archive_entry_size(ae));
517  assertEqualInt(16877, archive_entry_mode(ae));
518  assertEqualInt(archive_entry_is_encrypted(ae), 0);
519  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
520
521  /* Test EOF */
522  assertA(1 == archive_read_next_header(a, &ae));
523  assertEqualInt(6, archive_file_count(a));
524  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
525  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
526}
527
528/* This test is for sufficiently large files that would have been compressed
529 * using multiple lzss blocks.
530 */
531DEFINE_TEST(test_read_format_rar_multi_lzss_blocks)
532{
533  const char reffile[] = "test_read_format_rar_multi_lzss_blocks.rar";
534  const char test_txt[] = "-bottom: 0in\"><BR>\n</P>\n</BODY>\n</HTML>";
535  int size = 20131111, offset = 0;
536  char buff[64];
537  struct archive_entry *ae;
538  struct archive *a;
539
540  extract_reference_file(reffile);
541  assert((a = archive_read_new()) != NULL);
542  assertA(0 == archive_read_support_filter_all(a));
543  assertA(0 == archive_read_support_format_all(a));
544  assertA(0 == archive_read_open_filename(a, reffile, 10240));
545
546  /* First header. */
547  assertA(0 == archive_read_next_header(a, &ae));
548  assertEqualString("multi_lzss_blocks_test.txt", archive_entry_pathname(ae));
549  assertA((int)archive_entry_mtime(ae));
550  assertA((int)archive_entry_ctime(ae));
551  assertA((int)archive_entry_atime(ae));
552  assertEqualInt(size, archive_entry_size(ae));
553  assertEqualInt(33188, archive_entry_mode(ae));
554  assertEqualInt(archive_entry_is_encrypted(ae), 0);
555  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
556  while (offset + (int)sizeof(buff) < size)
557  {
558    assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
559    offset += sizeof(buff);
560  }
561  assertA(size - offset == archive_read_data(a, buff, size - offset));
562  assertEqualMem(buff, test_txt, size - offset);
563
564  /* Test EOF */
565  assertA(1 == archive_read_next_header(a, &ae));
566  assertEqualInt(1, archive_file_count(a));
567  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
568  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
569}
570
571DEFINE_TEST(test_read_format_rar_compress_best)
572{
573  const char reffile[] = "test_read_format_rar_compress_best.rar";
574  char file1_buff[20111];
575  int file1_size = sizeof(file1_buff);
576  const char file1_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
577                                "</P>\n"
578                                "</BODY>\n"
579                                "</HTML>";
580  char file2_buff[20];
581  int file2_size = sizeof(file2_buff);
582  const char file2_test_txt[] = "test text document\r\n";
583  struct archive_entry *ae;
584  struct archive *a;
585
586  extract_reference_file(reffile);
587  assert((a = archive_read_new()) != NULL);
588  assertA(0 == archive_read_support_filter_all(a));
589  assertA(0 == archive_read_support_format_all(a));
590  assertA(0 == archive_read_open_filename(a, reffile, 10240));
591
592  /* First header. */
593  assertA(0 == archive_read_next_header(a, &ae));
594  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
595  assertA((int)archive_entry_mtime(ae));
596  assertA((int)archive_entry_ctime(ae));
597  assertA((int)archive_entry_atime(ae));
598  assertEqualInt(file1_size, archive_entry_size(ae));
599  assertEqualInt(33188, archive_entry_mode(ae));
600  assertEqualInt(archive_entry_is_encrypted(ae), 0);
601  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
602  assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
603  assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
604                 file1_test_txt, sizeof(file1_test_txt) - 1);
605
606    /* Second header. */
607  assertA(0 == archive_read_next_header(a, &ae));
608  assertEqualString("testlink", archive_entry_pathname(ae));
609  assertA((int)archive_entry_mtime(ae));
610  assertA((int)archive_entry_ctime(ae));
611  assertA((int)archive_entry_atime(ae));
612  assertEqualInt(0, archive_entry_size(ae));
613  assertEqualInt(41471, archive_entry_mode(ae));
614  assertEqualInt(archive_entry_is_encrypted(ae), 0);
615  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
616  assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
617  assertEqualIntA(a, 0, archive_read_data(a, file1_buff, 30));
618
619  /* Third header. */
620  assertA(0 == archive_read_next_header(a, &ae));
621  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
622  assertA((int)archive_entry_mtime(ae));
623  assertA((int)archive_entry_ctime(ae));
624  assertA((int)archive_entry_atime(ae));
625  assertEqualInt(file2_size, archive_entry_size(ae));
626  assertEqualInt(33188, archive_entry_mode(ae));
627  assertEqualInt(archive_entry_is_encrypted(ae), 0);
628  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
629  assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
630  assertEqualMem(&file2_buff[file2_size + 1 - sizeof(file2_test_txt)],
631                 file2_test_txt, sizeof(file2_test_txt) - 1);
632
633  /* Fourth header. */
634  assertA(0 == archive_read_next_header(a, &ae));
635  assertEqualString("testdir/LibarchiveAddingTest.html",
636                    archive_entry_pathname(ae));
637  assertA((int)archive_entry_mtime(ae));
638  assertA((int)archive_entry_ctime(ae));
639  assertA((int)archive_entry_atime(ae));
640  assertEqualInt(file1_size, archive_entry_size(ae));
641  assertEqualInt(33188, archive_entry_mode(ae));
642  assertEqualInt(archive_entry_is_encrypted(ae), 0);
643  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
644  assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
645  assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
646                 file1_test_txt, sizeof(file1_test_txt) - 1);
647
648  /* Fifth header. */
649  assertA(0 == archive_read_next_header(a, &ae));
650  assertEqualString("testdir", archive_entry_pathname(ae));
651  assertA((int)archive_entry_mtime(ae));
652  assertA((int)archive_entry_ctime(ae));
653  assertA((int)archive_entry_atime(ae));
654  assertEqualInt(0, archive_entry_size(ae));
655  assertEqualInt(16877, archive_entry_mode(ae));
656  assertEqualInt(archive_entry_is_encrypted(ae), 0);
657  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
658
659  /* Sixth header. */
660  assertA(0 == archive_read_next_header(a, &ae));
661  assertEqualString("testemptydir", archive_entry_pathname(ae));
662  assertA((int)archive_entry_mtime(ae));
663  assertA((int)archive_entry_ctime(ae));
664  assertA((int)archive_entry_atime(ae));
665  assertEqualInt(0, archive_entry_size(ae));
666  assertEqualInt(16877, archive_entry_mode(ae));
667  assertEqualInt(archive_entry_is_encrypted(ae), 0);
668  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
669
670  /* Test EOF */
671  assertA(1 == archive_read_next_header(a, &ae));
672  assertEqualInt(6, archive_file_count(a));
673  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
674  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
675}
676
677/* This is a test for RAR files compressed using a technique where compression
678 * switches back and forth to and from ppmd and lzss decoding.
679 */
680DEFINE_TEST(test_read_format_rar_ppmd_lzss_conversion)
681{
682  const char reffile[] = "test_read_format_rar_ppmd_lzss_conversion.rar";
683  const char test_txt[] = "gin-bottom: 0in\"><BR>\n</P>\n</BODY>\n</HTML>";
684  int size = 241647978, offset = 0;
685  char buff[64];
686  struct archive_entry *ae;
687  struct archive *a;
688
689  extract_reference_file(reffile);
690  assert((a = archive_read_new()) != NULL);
691  assertA(0 == archive_read_support_filter_all(a));
692  assertA(0 == archive_read_support_format_all(a));
693  assertA(0 == archive_read_open_filename(a, reffile, 10240));
694
695  /* First header. */
696  assertA(0 == archive_read_next_header(a, &ae));
697  assertEqualString("ppmd_lzss_conversion_test.txt",
698                    archive_entry_pathname(ae));
699  assertA((int)archive_entry_mtime(ae));
700  assertA((int)archive_entry_ctime(ae));
701  assertA((int)archive_entry_atime(ae));
702  assertEqualInt(size, archive_entry_size(ae));
703  assertEqualInt(33188, archive_entry_mode(ae));
704  assertEqualInt(archive_entry_is_encrypted(ae), 0);
705  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
706  while (offset + (int)sizeof(buff) < size)
707  {
708    assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
709    offset += sizeof(buff);
710  }
711  assertA(size - offset == archive_read_data(a, buff, size - offset));
712  assertEqualMem(buff, test_txt, size - offset);
713
714  /* Test EOF */
715  assertA(1 == archive_read_next_header(a, &ae));
716  assertEqualInt(1, archive_file_count(a));
717  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
718  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
719}
720
721DEFINE_TEST(test_read_format_rar_binary)
722{
723  const char reffile[] = "test_read_format_rar_binary_data.rar";
724  char *file1_buff = malloc(1048576);
725  int file1_size = 1048576;
726  const char file1_test_txt[] = "\x37\xef\xb2\xbe\x33\xf6\xcc\xcb\xee\x2a\x10"
727                                "\x9d\x2e\x01\xe9\xf6\xf9\xe5\xe6\x67\x0c\x2b"
728                                "\xd8\x6b\xa0\x26\x9a\xf7\x93\x87\x42\xf1\x08"
729                                "\x42\xdc\x9b\x76\x91\x20\xa4\x01\xbe\x67\xbd"
730                                "\x08\x74\xde\xec";
731  char file2_buff[32618];
732  int file2_size = sizeof(file2_buff);
733  const char file2_test_txt[] = "\x00\xee\x78\x00\x00\x4d\x45\x54\x41\x2d\x49"
734                                "\x4e\x46\x2f\x6d\x61\x6e\x69\x66\x65\x73\x74"
735                                "\x2e\x78\x6d\x6c\x50\x4b\x05\x06\x00\x00\x00"
736                                "\x00\x12\x00\x12\x00\xaa\x04\x00\x00\xaa\x7a"
737                                "\x00\x00\x00\x00";
738  struct archive_entry *ae;
739  struct archive *a;
740
741  extract_reference_file(reffile);
742  assert((a = archive_read_new()) != NULL);
743  assertA(0 == archive_read_support_filter_all(a));
744  assertA(0 == archive_read_support_format_all(a));
745  assertA(0 == archive_read_open_filename(a, reffile, 10240));
746
747  /* First header. */
748  assertA(0 == archive_read_next_header(a, &ae));
749  assertEqualString("random_data.bin", archive_entry_pathname(ae));
750  assertA((int)archive_entry_mtime(ae));
751  assertA((int)archive_entry_ctime(ae));
752  assertA((int)archive_entry_atime(ae));
753  assertEqualInt(file1_size, archive_entry_size(ae));
754  assertEqualInt(33188, archive_entry_mode(ae));
755  assertEqualInt(archive_entry_is_encrypted(ae), 0);
756  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
757  assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
758  assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
759                 file1_test_txt, sizeof(file1_test_txt) - 1);
760
761    /* Second header. */
762  assertA(0 == archive_read_next_header(a, &ae));
763  assertEqualString("LibarchiveAddingTest.odt", archive_entry_pathname(ae));
764  assertA((int)archive_entry_mtime(ae));
765  assertA((int)archive_entry_ctime(ae));
766  assertA((int)archive_entry_atime(ae));
767  assertEqualInt(file2_size, archive_entry_size(ae));
768  assertEqualInt(33188, archive_entry_mode(ae));
769  assertEqualInt(archive_entry_is_encrypted(ae), 0);
770  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
771  assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
772  assertEqualMem(&file2_buff[file2_size + 1 - sizeof(file2_test_txt)],
773                 file2_test_txt, sizeof(file2_test_txt) - 1);
774
775  /* Test EOF */
776  assertA(1 == archive_read_next_header(a, &ae));
777  assertEqualInt(2, archive_file_count(a));
778  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
779  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
780
781  free(file1_buff);
782}
783
784DEFINE_TEST(test_read_format_rar_windows)
785{
786  char buff[441];
787  const char reffile[] = "test_read_format_rar_windows.rar";
788  const char test_txt[] = "test text file\r\n";
789  int size = sizeof(test_txt)-1;
790  struct archive_entry *ae;
791  struct archive *a;
792
793  extract_reference_file(reffile);
794  assert((a = archive_read_new()) != NULL);
795  assertA(0 == archive_read_support_filter_all(a));
796  assertA(0 == archive_read_support_format_all(a));
797  assertA(0 == archive_read_open_filename(a, reffile, 10240));
798
799  /* First header. */
800  assertA(0 == archive_read_next_header(a, &ae));
801  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
802  assertA((int)archive_entry_mtime(ae));
803  assertA((int)archive_entry_ctime(ae));
804  assertA((int)archive_entry_atime(ae));
805  assertEqualInt(16, archive_entry_size(ae));
806  assertEqualInt(33188, archive_entry_mode(ae));
807  assertEqualInt(archive_entry_is_encrypted(ae), 0);
808  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
809  assertA(size == archive_read_data(a, buff, size));
810  assertEqualMem(buff, test_txt, size);
811
812  /* Second header. */
813  assertA(0 == archive_read_next_header(a, &ae));
814  assertEqualString("test.txt", archive_entry_pathname(ae));
815  assertA((int)archive_entry_mtime(ae));
816  assertA((int)archive_entry_ctime(ae));
817  assertA((int)archive_entry_atime(ae));
818  assertEqualInt(16, archive_entry_size(ae));
819  assertEqualInt(33188, archive_entry_mode(ae));
820  assertEqualInt(archive_entry_is_encrypted(ae), 0);
821  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
822  assertA(size == archive_read_data(a, buff, size));
823  assertEqualMem(buff, test_txt, size);
824
825  /* Third header. */
826  assertA(0 == archive_read_next_header(a, &ae));
827  assertEqualString("testshortcut.lnk", archive_entry_pathname(ae));
828  assertA((int)archive_entry_mtime(ae));
829  assertA((int)archive_entry_ctime(ae));
830  assertA((int)archive_entry_atime(ae));
831  assertEqualInt(sizeof(buff), archive_entry_size(ae));
832  assertEqualInt(33188, archive_entry_mode(ae));
833  assertEqualInt(archive_entry_is_encrypted(ae), 0);
834  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
835  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
836
837  /* Fourth header. */
838  assertA(0 == archive_read_next_header(a, &ae));
839  assertEqualString("testdir", archive_entry_pathname(ae));
840  assertA((int)archive_entry_mtime(ae));
841  assertA((int)archive_entry_ctime(ae));
842  assertA((int)archive_entry_atime(ae));
843  assertEqualInt(0, archive_entry_size(ae));
844  assertEqualInt(16877, archive_entry_mode(ae));
845  assertEqualInt(archive_entry_is_encrypted(ae), 0);
846  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
847
848  /* Fifth header. */
849  assertA(0 == archive_read_next_header(a, &ae));
850  assertEqualString("testemptydir", archive_entry_pathname(ae));
851  assertA((int)archive_entry_mtime(ae));
852  assertA((int)archive_entry_ctime(ae));
853  assertA((int)archive_entry_atime(ae));
854  assertEqualInt(0, archive_entry_size(ae));
855  assertEqualInt(16877, archive_entry_mode(ae));
856  assertEqualInt(archive_entry_is_encrypted(ae), 0);
857  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
858
859  /* Test EOF */
860  assertA(1 == archive_read_next_header(a, &ae));
861  assertEqualInt(5, archive_file_count(a));
862  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
863  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
864}
865
866DEFINE_TEST(test_read_format_rar_multivolume)
867{
868  const char *reffiles[] =
869  {
870    "test_read_format_rar_multivolume.part0001.rar",
871    "test_read_format_rar_multivolume.part0002.rar",
872    "test_read_format_rar_multivolume.part0003.rar",
873    "test_read_format_rar_multivolume.part0004.rar",
874    NULL
875  };
876  int file1_size = 241647978, offset = 0;
877  char buff[64];
878  const char file1_test_txt[] = "gin-bottom: 0in\"><BR>\n</P>\n</BODY>\n"
879                                "</HTML>";
880  char file2_buff[20111];
881  int file2_size = sizeof(file2_buff);
882  const char file2_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
883                                "</P>\n"
884                                "</BODY>\n"
885                                "</HTML>";
886  char file3_buff[20];
887  int file3_size = sizeof(file3_buff);
888  const char file3_test_txt[] = "test text document\r\n";
889  struct archive_entry *ae;
890  struct archive *a;
891
892  extract_reference_files(reffiles);
893  assert((a = archive_read_new()) != NULL);
894  assertA(0 == archive_read_support_filter_all(a));
895  assertA(0 == archive_read_support_format_all(a));
896  assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
897
898  /* First header. */
899  assertA(0 == archive_read_next_header(a, &ae));
900  assertEqualString("ppmd_lzss_conversion_test.txt",
901                    archive_entry_pathname(ae));
902  assertA((int)archive_entry_mtime(ae));
903  assertA((int)archive_entry_ctime(ae));
904  assertA((int)archive_entry_atime(ae));
905  assertEqualInt(file1_size, archive_entry_size(ae));
906  assertEqualInt(33188, archive_entry_mode(ae));
907  assertEqualInt(archive_entry_is_encrypted(ae), 0);
908  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
909  while (offset + (int)sizeof(buff) < file1_size)
910  {
911    assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
912    offset += sizeof(buff);
913  }
914  assertA(file1_size - offset ==
915    archive_read_data(a, buff, file1_size - offset));
916  assertEqualMem(buff, file1_test_txt, file1_size - offset);
917
918  /* Second header. */
919  assertA(0 == archive_read_next_header(a, &ae));
920  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
921  assertA((int)archive_entry_mtime(ae));
922  assertA((int)archive_entry_ctime(ae));
923  assertA((int)archive_entry_atime(ae));
924  assertEqualInt(file2_size, archive_entry_size(ae));
925  assertEqualInt(33188, archive_entry_mode(ae));
926  assertEqualInt(archive_entry_is_encrypted(ae), 0);
927  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
928  assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
929  assertEqualMem(&file2_buff[file2_size - sizeof(file2_test_txt) + 1],
930                 file2_test_txt, sizeof(file2_test_txt) - 1);
931
932  /* Third header. */
933  assertA(0 == archive_read_next_header(a, &ae));
934  assertEqualString("testlink", archive_entry_pathname(ae));
935  assertA((int)archive_entry_mtime(ae));
936  assertA((int)archive_entry_ctime(ae));
937  assertA((int)archive_entry_atime(ae));
938  assertEqualInt(0, archive_entry_size(ae));
939  assertEqualInt(41471, archive_entry_mode(ae));
940  assertEqualInt(archive_entry_is_encrypted(ae), 0);
941  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
942  assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
943  assertEqualIntA(a, 0, archive_read_data(a, file2_buff, 30));
944
945  /* Fourth header. */
946  assertA(0 == archive_read_next_header(a, &ae));
947  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
948  assertA((int)archive_entry_mtime(ae));
949  assertA((int)archive_entry_ctime(ae));
950  assertA((int)archive_entry_atime(ae));
951  assertEqualInt(file3_size, archive_entry_size(ae));
952  assertEqualInt(33188, archive_entry_mode(ae));
953  assertEqualInt(archive_entry_is_encrypted(ae), 0);
954  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
955  assertA(file3_size == archive_read_data(a, file3_buff, file3_size));
956  assertEqualMem(&file3_buff[file3_size + 1 - sizeof(file3_test_txt)],
957                 file3_test_txt, sizeof(file3_test_txt) - 1);
958
959  /* Fifth header. */
960  assertA(0 == archive_read_next_header(a, &ae));
961  assertEqualString("testdir/LibarchiveAddingTest.html",
962                    archive_entry_pathname(ae));
963  assertA((int)archive_entry_mtime(ae));
964  assertA((int)archive_entry_ctime(ae));
965  assertA((int)archive_entry_atime(ae));
966  assertEqualInt(file2_size, archive_entry_size(ae));
967  assertEqualInt(33188, archive_entry_mode(ae));
968  assertEqualInt(archive_entry_is_encrypted(ae), 0);
969  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
970  assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
971  assertEqualMem(&file2_buff[file2_size - sizeof(file2_test_txt) + 1],
972                 file2_test_txt, sizeof(file2_test_txt) - 1);
973
974  /* Sixth header. */
975  assertA(0 == archive_read_next_header(a, &ae));
976  assertEqualString("testdir", archive_entry_pathname(ae));
977  assertA((int)archive_entry_mtime(ae));
978  assertA((int)archive_entry_ctime(ae));
979  assertA((int)archive_entry_atime(ae));
980  assertEqualInt(0, archive_entry_size(ae));
981  assertEqualInt(16877, archive_entry_mode(ae));
982  assertEqualInt(archive_entry_is_encrypted(ae), 0);
983  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
984
985  /* Seventh header. */
986  assertA(0 == archive_read_next_header(a, &ae));
987  assertEqualString("testemptydir", archive_entry_pathname(ae));
988  assertA((int)archive_entry_mtime(ae));
989  assertA((int)archive_entry_ctime(ae));
990  assertA((int)archive_entry_atime(ae));
991  assertEqualInt(0, archive_entry_size(ae));
992  assertEqualInt(16877, archive_entry_mode(ae));
993  assertEqualInt(archive_entry_is_encrypted(ae), 0);
994  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
995
996  /* Test EOF */
997  assertA(1 == archive_read_next_header(a, &ae));
998  assertEqualInt(7, archive_file_count(a));
999  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1000  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1001}
1002
1003DEFINE_TEST(test_read_format_rar_multivolume_skip)
1004{
1005  const char *reffiles[] =
1006  {
1007    "test_read_format_rar_multivolume.part0001.rar",
1008    "test_read_format_rar_multivolume.part0002.rar",
1009    "test_read_format_rar_multivolume.part0003.rar",
1010    "test_read_format_rar_multivolume.part0004.rar",
1011    NULL
1012  };
1013  int file1_size = 241647978;
1014  int file2_size = 20111;
1015  int file3_size = 20;
1016  struct archive_entry *ae;
1017  struct archive *a;
1018
1019  extract_reference_files(reffiles);
1020  assert((a = archive_read_new()) != NULL);
1021  assertA(0 == archive_read_support_filter_all(a));
1022  assertA(0 == archive_read_support_format_all(a));
1023  assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1024
1025  /* First header. */
1026  assertA(0 == archive_read_next_header(a, &ae));
1027  assertEqualString("ppmd_lzss_conversion_test.txt",
1028                    archive_entry_pathname(ae));
1029  assertA((int)archive_entry_mtime(ae));
1030  assertA((int)archive_entry_ctime(ae));
1031  assertA((int)archive_entry_atime(ae));
1032  assertEqualInt(file1_size, archive_entry_size(ae));
1033  assertEqualInt(33188, archive_entry_mode(ae));
1034  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1035  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1036
1037  /* Second header. */
1038  assertA(0 == archive_read_next_header(a, &ae));
1039  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1040  assertA((int)archive_entry_mtime(ae));
1041  assertA((int)archive_entry_ctime(ae));
1042  assertA((int)archive_entry_atime(ae));
1043  assertEqualInt(file2_size, archive_entry_size(ae));
1044  assertEqualInt(33188, archive_entry_mode(ae));
1045  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1046  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1047
1048  /* Third header. */
1049  assertA(0 == archive_read_next_header(a, &ae));
1050  assertEqualString("testlink", archive_entry_pathname(ae));
1051  assertA((int)archive_entry_mtime(ae));
1052  assertA((int)archive_entry_ctime(ae));
1053  assertA((int)archive_entry_atime(ae));
1054  assertEqualInt(0, archive_entry_size(ae));
1055  assertEqualInt(41471, archive_entry_mode(ae));
1056  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1057  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1058  assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
1059
1060  /* Fourth header. */
1061  assertA(0 == archive_read_next_header(a, &ae));
1062  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
1063  assertA((int)archive_entry_mtime(ae));
1064  assertA((int)archive_entry_ctime(ae));
1065  assertA((int)archive_entry_atime(ae));
1066  assertEqualInt(file3_size, archive_entry_size(ae));
1067  assertEqualInt(33188, archive_entry_mode(ae));
1068  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1069  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1070
1071  /* Fifth header. */
1072  assertA(0 == archive_read_next_header(a, &ae));
1073  assertEqualString("testdir/LibarchiveAddingTest.html",
1074                    archive_entry_pathname(ae));
1075  assertA((int)archive_entry_mtime(ae));
1076  assertA((int)archive_entry_ctime(ae));
1077  assertA((int)archive_entry_atime(ae));
1078  assertEqualInt(file2_size, archive_entry_size(ae));
1079  assertEqualInt(33188, archive_entry_mode(ae));
1080  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1081  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1082
1083  /* Sixth header. */
1084  assertA(0 == archive_read_next_header(a, &ae));
1085  assertEqualString("testdir", archive_entry_pathname(ae));
1086  assertA((int)archive_entry_mtime(ae));
1087  assertA((int)archive_entry_ctime(ae));
1088  assertA((int)archive_entry_atime(ae));
1089  assertEqualInt(0, archive_entry_size(ae));
1090  assertEqualInt(16877, archive_entry_mode(ae));
1091  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1092  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1093
1094  /* Seventh header. */
1095  assertA(0 == archive_read_next_header(a, &ae));
1096  assertEqualString("testemptydir", archive_entry_pathname(ae));
1097  assertA((int)archive_entry_mtime(ae));
1098  assertA((int)archive_entry_ctime(ae));
1099  assertA((int)archive_entry_atime(ae));
1100  assertEqualInt(0, archive_entry_size(ae));
1101  assertEqualInt(16877, archive_entry_mode(ae));
1102  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1103  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1104
1105  /* Test EOF */
1106  assertA(1 == archive_read_next_header(a, &ae));
1107  assertEqualInt(7, archive_file_count(a));
1108  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1109  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1110}
1111
1112DEFINE_TEST(test_read_format_rar_sfx)
1113{
1114  char buff[441];
1115  const char reffile[] = "test_read_format_rar_sfx.exe";
1116  const char test_txt[] = "test text file\r\n";
1117  int size = sizeof(test_txt)-1;
1118  struct archive_entry *ae;
1119  struct archive *a;
1120
1121  extract_reference_file(reffile);
1122  assert((a = archive_read_new()) != NULL);
1123  assertA(0 == archive_read_support_filter_all(a));
1124  assertA(0 == archive_read_support_format_all(a));
1125  assertA(0 == archive_read_open_filename(a, reffile, 10240));
1126
1127  /* First header. */
1128  assertA(0 == archive_read_next_header(a, &ae));
1129  assertEqualString("test.txt", archive_entry_pathname(ae));
1130  assertA((int)archive_entry_mtime(ae));
1131  assertA((int)archive_entry_ctime(ae));
1132  assertA((int)archive_entry_atime(ae));
1133  assertEqualInt(16, archive_entry_size(ae));
1134  assertEqualInt(33188, archive_entry_mode(ae));
1135  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1136  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1137  assertA(size == archive_read_data(a, buff, size));
1138  assertEqualMem(buff, test_txt, size);
1139
1140  /* Second header. */
1141  assertA(0 == archive_read_next_header(a, &ae));
1142  assertEqualString("testshortcut.lnk", archive_entry_pathname(ae));
1143  assertA((int)archive_entry_mtime(ae));
1144  assertA((int)archive_entry_ctime(ae));
1145  assertA((int)archive_entry_atime(ae));
1146  assertEqualInt(sizeof(buff), archive_entry_size(ae));
1147  assertEqualInt(33188, archive_entry_mode(ae));
1148  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1149  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1150  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1151
1152  /* Third header. */
1153  assertA(0 == archive_read_next_header(a, &ae));
1154  assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
1155  assertA((int)archive_entry_mtime(ae));
1156  assertA((int)archive_entry_ctime(ae));
1157  assertA((int)archive_entry_atime(ae));
1158  assertEqualInt(16, archive_entry_size(ae));
1159  assertEqualInt(33188, archive_entry_mode(ae));
1160  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1161  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1162  assertA(size == archive_read_data(a, buff, size));
1163  assertEqualMem(buff, test_txt, size);
1164
1165  /* Fourth header. */
1166  assertA(0 == archive_read_next_header(a, &ae));
1167  assertEqualString("testdir", archive_entry_pathname(ae));
1168  assertA((int)archive_entry_mtime(ae));
1169  assertA((int)archive_entry_ctime(ae));
1170  assertA((int)archive_entry_atime(ae));
1171  assertEqualInt(0, archive_entry_size(ae));
1172  assertEqualInt(16877, archive_entry_mode(ae));
1173  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1174  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1175
1176  /* Fifth header. */
1177  assertA(0 == archive_read_next_header(a, &ae));
1178  assertEqualString("testemptydir", archive_entry_pathname(ae));
1179  assertA((int)archive_entry_mtime(ae));
1180  assertA((int)archive_entry_ctime(ae));
1181  assertA((int)archive_entry_atime(ae));
1182  assertEqualInt(0, archive_entry_size(ae));
1183  assertEqualInt(16877, archive_entry_mode(ae));
1184  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1185  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1186
1187  /* Test EOF */
1188  assertA(1 == archive_read_next_header(a, &ae));
1189  assertEqualInt(5, archive_file_count(a));
1190  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1191  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1192}
1193
1194DEFINE_TEST(test_read_format_rar_multivolume_stored_file)
1195{
1196  const char *reffiles[] =
1197  {
1198    "test_rar_multivolume_single_file.part1.rar",
1199    "test_rar_multivolume_single_file.part2.rar",
1200    "test_rar_multivolume_single_file.part3.rar",
1201    NULL
1202  };
1203  char file_buff[20111];
1204  int file_size = sizeof(file_buff);
1205  const char file_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1206                                "</P>\n"
1207                                "</BODY>\n"
1208                                "</HTML>";
1209  struct archive_entry *ae;
1210  struct archive *a;
1211
1212  extract_reference_files(reffiles);
1213  assert((a = archive_read_new()) != NULL);
1214  assertA(0 == archive_read_support_filter_all(a));
1215  assertA(0 == archive_read_support_format_all(a));
1216  assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1217
1218  /* First header. */
1219  assertA(0 == archive_read_next_header(a, &ae));
1220  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1221  assertA((int)archive_entry_mtime(ae));
1222  assertA((int)archive_entry_ctime(ae));
1223  assertA((int)archive_entry_atime(ae));
1224  assertEqualInt(file_size, archive_entry_size(ae));
1225  assertEqualInt(33188, archive_entry_mode(ae));
1226  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1227  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1228  assertA(file_size == archive_read_data(a, file_buff, file_size));
1229  assertEqualMem(&file_buff[file_size - sizeof(file_test_txt) + 1],
1230                 file_test_txt, sizeof(file_test_txt) - 1);
1231
1232  /* Test EOF */
1233  assertA(1 == archive_read_next_header(a, &ae));
1234  assertEqualInt(1, archive_file_count(a));
1235  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1236  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1237}
1238
1239DEFINE_TEST(test_read_format_rar_multivolume_stored_file_skip)
1240{
1241  const char *reffiles[] =
1242  {
1243    "test_rar_multivolume_single_file.part1.rar",
1244    "test_rar_multivolume_single_file.part2.rar",
1245    "test_rar_multivolume_single_file.part3.rar",
1246    NULL
1247  };
1248  int file_size = 20111;
1249  struct archive_entry *ae;
1250  struct archive *a;
1251
1252  extract_reference_files(reffiles);
1253  assert((a = archive_read_new()) != NULL);
1254  assertA(0 == archive_read_support_filter_all(a));
1255  assertA(0 == archive_read_support_format_all(a));
1256  assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1257
1258  /* First header. */
1259  assertA(0 == archive_read_next_header(a, &ae));
1260  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1261  assertA((int)archive_entry_mtime(ae));
1262  assertA((int)archive_entry_ctime(ae));
1263  assertA((int)archive_entry_atime(ae));
1264  assertEqualInt(file_size, archive_entry_size(ae));
1265  assertEqualInt(33188, archive_entry_mode(ae));
1266  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1267  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1268
1269  /* Test EOF */
1270  assertA(1 == archive_read_next_header(a, &ae));
1271  assertEqualInt(1, archive_file_count(a));
1272  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1273  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1274}
1275
1276DEFINE_TEST(test_read_format_rar_multivolume_seek_data)
1277{
1278  const char *reffiles[] =
1279  {
1280    "test_rar_multivolume_single_file.part1.rar",
1281    "test_rar_multivolume_single_file.part2.rar",
1282    "test_rar_multivolume_single_file.part3.rar",
1283    NULL
1284  };
1285  char buff[64];
1286  int file_size = 20111;
1287  const char file_test_txt1[] = "d. \n</P>\n<P STYLE=\"margin-bottom: 0in\">"
1288                                "<BR>\n</P>\n</BODY>\n</HTML>";
1289  const char file_test_txt2[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4."
1290                                "0 Transitional//EN\">\n<";
1291  const char file_test_txt3[] = "mplify writing such tests,\ntry to use plat"
1292                                "form-independent codin";
1293  const char file_test_txt4[] = "lString</TT> in the example above)\ngenerat"
1294                                "e detailed log message";
1295  const char file_test_txt5[] = "SS=\"western\">make check</TT> will usually"
1296                                " run\n\tall of the tests.";
1297  struct archive_entry *ae;
1298  struct archive *a;
1299
1300  extract_reference_files(reffiles);
1301  assert((a = archive_read_new()) != NULL);
1302  assertA(0 == archive_read_support_filter_all(a));
1303  assertA(0 == archive_read_support_format_all(a));
1304  assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1305
1306  /* First header. */
1307  assertA(0 == archive_read_next_header(a, &ae));
1308  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1309  assertA((int)archive_entry_mtime(ae));
1310  assertA((int)archive_entry_ctime(ae));
1311  assertA((int)archive_entry_atime(ae));
1312  assertEqualInt(file_size, archive_entry_size(ae));
1313  assertEqualInt(33188, archive_entry_mode(ae));
1314  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1315  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1316
1317  /* Seek to the end minus 64 bytes */
1318  assertA(file_size - (int)sizeof(buff) ==
1319    archive_seek_data(a, file_size - (int)sizeof(buff), SEEK_SET));
1320  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1321  assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1322
1323  /* Seek back to the beginning */
1324  assertA(0 == archive_seek_data(a, 0, SEEK_SET));
1325  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1326  assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1327
1328  /* Seek to the middle of the combined data block */
1329  assertA(10054 == archive_seek_data(a, 10054, SEEK_SET));
1330  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1331  assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1332
1333  /* Seek to 32 bytes before the end of the first data sub-block */
1334  assertA(6860 == archive_seek_data(a, 6860, SEEK_SET));
1335  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1336  assertEqualMem(buff, file_test_txt4, sizeof(file_test_txt4) - 1);
1337
1338  /* Seek to 32 bytes before the end of the second data sub-block */
1339  assertA(13752 == archive_seek_data(a, 13752, SEEK_SET));
1340  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1341  assertEqualMem(buff, file_test_txt5, sizeof(file_test_txt5) - 1);
1342
1343  /* Use various combinations of SEEK_SET, SEEK_CUR, and SEEK_END */
1344  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1345  assertEqualInt(0, archive_seek_data(a, 0, SEEK_SET));
1346  assertEqualInt(0, archive_seek_data(a, 0, SEEK_CUR));
1347  assertEqualInt(-1, archive_seek_data(a, -10, SEEK_CUR));
1348  assertEqualInt(10, archive_seek_data(a, 10, SEEK_CUR));
1349  assertEqualInt(-1, archive_seek_data(a, -20, SEEK_CUR));
1350  assertEqualInt(10, archive_seek_data(a, 0, SEEK_CUR));
1351  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1352  assertEqualInt(file_size - 20, archive_seek_data(a, -20, SEEK_END));
1353  assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_END));
1354  assertEqualInt(file_size + 40, archive_seek_data(a, 0, SEEK_CUR));
1355  assertEqualInt(file_size + 40 + 20, archive_seek_data(a, 20, SEEK_CUR));
1356  assertEqualInt(file_size + 40 + 20 + 20, archive_seek_data(a, 20, SEEK_CUR));
1357  assertEqualInt(file_size + 20, archive_seek_data(a, 20, SEEK_END));
1358  assertEqualInt(file_size - 20, archive_seek_data(a, -20, SEEK_END));
1359
1360  /*
1361   * Attempt to read from the end of the file. These should return
1362   * 0 for end of file.
1363   */
1364  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1365  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1366  assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1367  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1368
1369  /* Seek to the end minus 64 bytes */
1370  assertA(0 == archive_seek_data(a, 0, SEEK_SET));
1371  assertA(file_size - (int)sizeof(buff) ==
1372    archive_seek_data(a, -(int)sizeof(buff), SEEK_END));
1373  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1374  assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1375
1376  /* The file position should be at the end of the file here */
1377  assertA(file_size == archive_seek_data(a, 0, SEEK_CUR));
1378
1379  /* Seek back to the beginning */
1380  assertA(0 == archive_seek_data(a, -file_size, SEEK_CUR));
1381  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1382  assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1383
1384  /* Seek to the middle of the combined data block */
1385  assertA(10054 == archive_seek_data(a, 10054 - (int)sizeof(buff), SEEK_CUR));
1386  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1387  assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1388
1389  /* Seek to 32 bytes before the end of the first data sub-block */
1390  assertA(6860 == archive_seek_data(a, 6860 - (10054 + (int)sizeof(buff)),
1391                                    SEEK_CUR));
1392  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1393  assertEqualMem(buff, file_test_txt4, sizeof(file_test_txt4) - 1);
1394
1395  /* Seek to 32 bytes before the end of the second data sub-block */
1396  assertA(13752 == archive_seek_data(a, 13752 - file_size, SEEK_END));
1397  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1398  assertEqualMem(buff, file_test_txt5, sizeof(file_test_txt5) - 1);
1399
1400  /* Test EOF */
1401  assertA(1 == archive_read_next_header(a, &ae));
1402  assertEqualInt(1, archive_file_count(a));
1403  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1404  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1405}
1406
1407DEFINE_TEST(test_read_format_rar_multivolume_seek_multiple_files)
1408{
1409  const char *reffiles[] =
1410  {
1411    "test_rar_multivolume_multiple_files.part1.rar",
1412    "test_rar_multivolume_multiple_files.part2.rar",
1413    "test_rar_multivolume_multiple_files.part3.rar",
1414    "test_rar_multivolume_multiple_files.part4.rar",
1415    "test_rar_multivolume_multiple_files.part5.rar",
1416    "test_rar_multivolume_multiple_files.part6.rar",
1417    NULL
1418  };
1419  char buff[64];
1420  int file_size = 20111;
1421  const char file_test_txt1[] = "d. \n</P>\n<P STYLE=\"margin-bottom: 0in\">"
1422                                "<BR>\n</P>\n</BODY>\n</HTML>";
1423  const char file_test_txt2[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4."
1424                                "0 Transitional//EN\">\n<";
1425  const char file_test_txt3[] = "mplify writing such tests,\ntry to use plat"
1426                                "form-independent codin";
1427  const char file_test_txt4[] = "\nfailures. \n</P>\n<H1 CLASS=\"western\"><"
1428                                "A NAME=\"Life_cycle_of_a_te";
1429  const char file_test_txt5[] = "LE=\"margin-bottom: 0in\">DO use runtime te"
1430                                "sts for platform\n\tfeatu";
1431  const char file_test_txt6[] = "rough test suite is essential\nboth for ver"
1432                                "ifying new ports and f";
1433  const char file_test_txt7[] = "m: 0in\">Creates a temporary directory\n\tw"
1434                                "hose name matches the na";
1435  const char file_test_txt8[] = "lt\ninput file and verify the results. Thes"
1436                                "e use <TT CLASS=\"weste";
1437  struct archive_entry *ae;
1438  struct archive *a;
1439
1440  extract_reference_files(reffiles);
1441  assert((a = archive_read_new()) != NULL);
1442  assertA(0 == archive_read_support_filter_all(a));
1443  assertA(0 == archive_read_support_format_all(a));
1444  assertA(0 == archive_read_open_filenames(a, reffiles, 10240));
1445
1446  /* First header. */
1447  assertA(0 == archive_read_next_header(a, &ae));
1448  assertEqualString("LibarchiveAddingTest2.html", archive_entry_pathname(ae));
1449  assertA((int)archive_entry_mtime(ae));
1450  assertA((int)archive_entry_ctime(ae));
1451  assertA((int)archive_entry_atime(ae));
1452  assertEqualInt(file_size, archive_entry_size(ae));
1453  assertEqualInt(33188, archive_entry_mode(ae));
1454  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1455  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1456
1457  /* Attempt to read past end of file */
1458  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1459  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1460  assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1461  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1462
1463  /* Seek to the end minus 64 bytes */
1464  assertA(file_size - (int)sizeof(buff) ==
1465    archive_seek_data(a, -(int)sizeof(buff), SEEK_END));
1466  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1467  assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1468
1469  /* Seek back to the beginning */
1470  assertA(0 == archive_seek_data(a, -file_size, SEEK_END));
1471  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1472  assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1473
1474  /* Seek to the middle of the combined data block */
1475  assertA(10054 == archive_seek_data(a, 10054 - (int)sizeof(buff), SEEK_CUR));
1476  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1477  assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1478
1479  /* Seek to 32 bytes before the end of the first data sub-block */
1480  assertA(7027 == archive_seek_data(a, 7027 - (10054 + (int)sizeof(buff)),
1481                                    SEEK_CUR));
1482  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1483  assertEqualMem(buff, file_test_txt4, sizeof(file_test_txt4) - 1);
1484
1485  /* Seek to 32 bytes before the end of the second data sub-block */
1486  assertA(14086 == archive_seek_data(a, 14086 - file_size, SEEK_END));
1487  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1488  assertEqualMem(buff, file_test_txt5, sizeof(file_test_txt5) - 1);
1489
1490  /* Attempt to read past end of file */
1491  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1492  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1493  assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1494  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1495
1496  /* Second header. */
1497  assertA(0 == archive_read_next_header(a, &ae));
1498  assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
1499  assertA((int)archive_entry_mtime(ae));
1500  assertA((int)archive_entry_ctime(ae));
1501  assertA((int)archive_entry_atime(ae));
1502  assertEqualInt(file_size, archive_entry_size(ae));
1503  assertEqualInt(33188, archive_entry_mode(ae));
1504  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1505  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1506
1507  /* Attempt to read past end of file */
1508  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1509  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1510  assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1511  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1512
1513  /* Seek to the end minus 64 bytes */
1514  assertA(file_size - (int)sizeof(buff) ==
1515    archive_seek_data(a, file_size - (int)sizeof(buff), SEEK_SET));
1516  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1517  assertEqualMem(buff, file_test_txt1, sizeof(file_test_txt1) - 1);
1518
1519  /* Seek back to the beginning */
1520  assertA(0 == archive_seek_data(a, 0, SEEK_SET));
1521  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1522  assertEqualMem(buff, file_test_txt2, sizeof(file_test_txt2) - 1);
1523
1524  /* Seek to the middle of the combined data block */
1525  assertA(10054 == archive_seek_data(a, 10054 - (int)sizeof(buff), SEEK_CUR));
1526  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1527  assertEqualMem(buff, file_test_txt3, sizeof(file_test_txt3) - 1);
1528
1529  /* Seek to 32 bytes before the end of the first data sub-block */
1530  assertA(969 == archive_seek_data(a, 969 - (10054 + (int)sizeof(buff)), SEEK_CUR));
1531  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1532  assertEqualMem(buff, file_test_txt6, sizeof(file_test_txt4) - 1);
1533
1534  /* Seek to 32 bytes before the end of the second data sub-block */
1535  assertA(8029 == archive_seek_data(a, 8029 - file_size, SEEK_END));
1536  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1537  assertEqualMem(buff, file_test_txt7, sizeof(file_test_txt5) - 1);
1538
1539  /* Seek to 32 bytes before the end of the third data sub-block */
1540  assertA(15089 == archive_seek_data(a, 15089 - file_size, SEEK_END));
1541  assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
1542  assertEqualMem(buff, file_test_txt8, sizeof(file_test_txt5) - 1);
1543
1544  /* Attempt to read past end of file */
1545  assertEqualInt(file_size, archive_seek_data(a, 0, SEEK_END));
1546  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1547  assertEqualInt(file_size + 40, archive_seek_data(a, 40, SEEK_CUR));
1548  assertA(0 == archive_read_data(a, buff, sizeof(buff)));
1549
1550  /* Test EOF */
1551  assertA(1 == archive_read_next_header(a, &ae));
1552  assertEqualInt(2, archive_file_count(a));
1553  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1554  assertEqualInt(ARCHIVE_OK, archive_read_free(a));
1555}
1556
1557static void
1558test_read_format_rar_multivolume_uncompressed_files_helper(struct archive *a)
1559{
1560  char buff[64];
1561
1562  /* Do checks for seeks/reads past beginning and end of file */
1563  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1564  memset(buff, 0, sizeof(buff));
1565  assertEqualIntA(a, -1, archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_SET));
1566  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_CUR));
1567  assertEqualIntA(a, (sizeof(buff)-1),
1568    archive_read_data(a, buff, (sizeof(buff)-1)));
1569  assertEqualIntA(a, (sizeof(buff)-1), archive_seek_data(a, 0, SEEK_CUR));
1570  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD "
1571                        "HTML 4.0 Transitional//EN\">\n", buff);
1572  memset(buff, 0, sizeof(buff));
1573  assertEqualIntA(a, -1, archive_seek_data(a, -(((int)sizeof(buff)-1)*2), SEEK_CUR));
1574  assertEqualIntA(a, (sizeof(buff)-1), archive_seek_data(a, 0, SEEK_CUR));
1575  assertEqualIntA(a, (sizeof(buff)-1),
1576    archive_read_data(a, buff, (sizeof(buff)-1)));
1577  assertEqualIntA(a, ((sizeof(buff)-1)*2), archive_seek_data(a, 0, SEEK_CUR));
1578  assertEqualStringA(a, "<HTML>\n<HEAD>\n\t<META HTTP-EQUIV=\"CONTENT-TYPE\" "
1579                        "CONTENT=\"text/ht", buff);
1580  memset(buff, 0, sizeof(buff));
1581  assertEqualIntA(a, -1, archive_seek_data(a, -(20111+32), SEEK_END));
1582  assertEqualIntA(a, ((sizeof(buff)-1)*2), archive_seek_data(a, 0, SEEK_CUR));
1583  assertEqualIntA(a, (sizeof(buff)-1),
1584    archive_read_data(a, buff, (sizeof(buff)-1)));
1585  assertEqualIntA(a, ((sizeof(buff)-1)*3), archive_seek_data(a, 0, SEEK_CUR));
1586  assertEqualStringA(a, "ml; charset=utf-8\">\n\t<TITLE></TITLE>\n\t<META "
1587                        "NAME=\"GENERATOR\" CO", buff);
1588
1589  memset(buff, 0, sizeof(buff));
1590  assertEqualIntA(a, 20111, archive_seek_data(a, 20111, SEEK_SET));
1591  assertEqualIntA(a, 20111, archive_seek_data(a, 0, SEEK_CUR));
1592  assertEqualIntA(a, 0, archive_read_data(a, buff, (sizeof(buff)-1)));
1593  assertEqualIntA(a, 20111, archive_seek_data(a, 0, SEEK_CUR));
1594  assertEqualStringA(a, "", buff);
1595  memset(buff, 0, sizeof(buff));
1596  assertEqualIntA(a, 20111 + (sizeof(buff)-1),
1597    archive_seek_data(a, (sizeof(buff)-1), SEEK_CUR));
1598  assertEqualIntA(a, 0, archive_read_data(a, buff, (sizeof(buff)-1)));
1599  assertEqualIntA(a, 20111 + (sizeof(buff)-1),
1600    archive_seek_data(a, 0, SEEK_CUR));
1601  assertEqualStringA(a, "", buff);
1602  memset(buff, 0, sizeof(buff));
1603  assertEqualIntA(a, 20111 + ((sizeof(buff)-1)*2),
1604    archive_seek_data(a, ((sizeof(buff)-1)*2), SEEK_END));
1605  assertEqualIntA(a, 0, archive_read_data(a, buff, (sizeof(buff)-1)));
1606  assertEqualIntA(a, 20111 + ((sizeof(buff)-1)*2),
1607    archive_seek_data(a, 0, SEEK_CUR));
1608  assertEqualStringA(a, "", buff);
1609}
1610
1611DEFINE_TEST(test_read_format_rar_multivolume_uncompressed_files)
1612{
1613  const char *reffiles[] =
1614  {
1615    "test_rar_multivolume_uncompressed_files.part01.rar",
1616    "test_rar_multivolume_uncompressed_files.part02.rar",
1617    "test_rar_multivolume_uncompressed_files.part03.rar",
1618    "test_rar_multivolume_uncompressed_files.part04.rar",
1619    "test_rar_multivolume_uncompressed_files.part05.rar",
1620    "test_rar_multivolume_uncompressed_files.part06.rar",
1621    "test_rar_multivolume_uncompressed_files.part07.rar",
1622    "test_rar_multivolume_uncompressed_files.part08.rar",
1623    "test_rar_multivolume_uncompressed_files.part09.rar",
1624    "test_rar_multivolume_uncompressed_files.part10.rar",
1625    NULL
1626  };
1627  char buff[64];
1628  ssize_t bytes_read;
1629  struct archive *a;
1630  struct archive_entry *ae;
1631
1632  extract_reference_files(reffiles);
1633  assert((a = archive_read_new()) != NULL);
1634  assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
1635  assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
1636  assertEqualIntA(a, ARCHIVE_OK,
1637                  archive_read_open_filenames(a, reffiles, 10240));
1638
1639  /*
1640   * First header.
1641   */
1642  assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1643  assertEqualStringA(a, "testdir/LibarchiveAddingTest2.html",
1644                     archive_entry_pathname(ae));
1645  assertA((int)archive_entry_mtime(ae));
1646  assertA((int)archive_entry_ctime(ae));
1647  assertA((int)archive_entry_atime(ae));
1648  assertEqualIntA(a, 20111, archive_entry_size(ae));
1649  assertEqualIntA(a, 33188, archive_entry_mode(ae));
1650  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1651  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1652
1653  test_read_format_rar_multivolume_uncompressed_files_helper(a);
1654
1655  /* Read from the beginning to the end of the file */
1656  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1657  do
1658  {
1659    memset(buff, 0, sizeof(buff));
1660    bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
1661  } while (bytes_read > 0);
1662
1663  /* Seek to the end minus (sizeof(buff)-1) bytes */
1664  memset(buff, 0, sizeof(buff));
1665  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1666    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1667  assertEqualIntA(a, (sizeof(buff)-1),
1668    archive_read_data(a, buff, (sizeof(buff)-1)));
1669  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1670                        "</P>\n</BODY>\n</HTML>", buff);
1671
1672  /* Seek back to the beginning */
1673  memset(buff, 0, sizeof(buff));
1674  assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
1675  assertEqualIntA(a, (sizeof(buff)-1),
1676    archive_read_data(a, buff, (sizeof(buff)-1)));
1677  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1678                        "Transitional//EN\">\n", buff);
1679
1680  /* Test that SEEK_SET works correctly between data blocks */
1681  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1682  memset(buff, 0, sizeof(buff));
1683  assertEqualIntA(a, 13164,
1684    archive_seek_data(a, 13164, SEEK_SET));
1685  assertEqualIntA(a, (sizeof(buff)-1),
1686    archive_read_data(a, buff, (sizeof(buff)-1)));
1687  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1688                        "assertEqualMem to test equalit", buff);
1689
1690  memset(buff, 0, sizeof(buff));
1691  assertEqualIntA(a, 0,
1692    archive_seek_data(a, 0, SEEK_SET));
1693  assertEqualIntA(a, (sizeof(buff)-1),
1694    archive_read_data(a, buff, (sizeof(buff)-1)));
1695  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1696                        "Transitional//EN\">\n", buff);
1697
1698  memset(buff, 0, sizeof(buff));
1699  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1700    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1701  assertEqualIntA(a, (sizeof(buff)-1),
1702    archive_read_data(a, buff, (sizeof(buff)-1)));
1703  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1704                        "</P>\n</BODY>\n</HTML>", buff);
1705
1706  memset(buff, 0, sizeof(buff));
1707  assertEqualIntA(a, 13164,
1708    archive_seek_data(a, 13164, SEEK_SET));
1709  assertEqualIntA(a, (sizeof(buff)-1),
1710    archive_read_data(a, buff, (sizeof(buff)-1)));
1711  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1712                        "assertEqualMem to test equalit", buff);
1713
1714  memset(buff, 0, sizeof(buff));
1715  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1716    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1717  assertEqualIntA(a, (sizeof(buff)-1),
1718    archive_read_data(a, buff, (sizeof(buff)-1)));
1719  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1720                        "</P>\n</BODY>\n</HTML>", buff);
1721
1722  memset(buff, 0, sizeof(buff));
1723  assertEqualIntA(a, 0,
1724    archive_seek_data(a, 0, SEEK_SET));
1725  assertEqualIntA(a, (sizeof(buff)-1),
1726    archive_read_data(a, buff, (sizeof(buff)-1)));
1727  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1728                        "Transitional//EN\">\n", buff);
1729
1730  memset(buff, 0, sizeof(buff));
1731  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1732    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1733  assertEqualIntA(a, (sizeof(buff)-1),
1734    archive_read_data(a, buff, (sizeof(buff)-1)));
1735  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1736                        "</P>\n</BODY>\n</HTML>", buff);
1737
1738  memset(buff, 0, sizeof(buff));
1739  assertEqualIntA(a, 13164,
1740    archive_seek_data(a, 13164, SEEK_SET));
1741  assertEqualIntA(a, (sizeof(buff)-1),
1742    archive_read_data(a, buff, (sizeof(buff)-1)));
1743  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1744                        "assertEqualMem to test equalit", buff);
1745
1746  memset(buff, 0, sizeof(buff));
1747  assertEqualIntA(a, 0,
1748    archive_seek_data(a, 0, SEEK_SET));
1749  assertEqualIntA(a, (sizeof(buff)-1),
1750    archive_read_data(a, buff, (sizeof(buff)-1)));
1751  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1752                        "Transitional//EN\">\n", buff);
1753
1754  /* Test that SEEK_CUR works correctly between data blocks */
1755  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1756  memset(buff, 0, sizeof(buff));
1757  assertEqualIntA(a, 13164,
1758    archive_seek_data(a, 13164, SEEK_CUR));
1759  assertEqualIntA(a, (sizeof(buff)-1),
1760    archive_read_data(a, buff, (sizeof(buff)-1)));
1761  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1762                        "assertEqualMem to test equalit", buff);
1763
1764  memset(buff, 0, sizeof(buff));
1765  assertEqualIntA(a, 0,
1766    archive_seek_data(a, -13227, SEEK_CUR));
1767  assertEqualIntA(a, (sizeof(buff)-1),
1768    archive_read_data(a, buff, (sizeof(buff)-1)));
1769  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1770                        "Transitional//EN\">\n", buff);
1771
1772  memset(buff, 0, sizeof(buff));
1773  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1774    archive_seek_data(a, 19985, SEEK_CUR));
1775  assertEqualIntA(a, (sizeof(buff)-1),
1776    archive_read_data(a, buff, (sizeof(buff)-1)));
1777  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1778                        "</P>\n</BODY>\n</HTML>", buff);
1779
1780  memset(buff, 0, sizeof(buff));
1781  assertEqualIntA(a, 13164,
1782    archive_seek_data(a, -6947, SEEK_CUR));
1783  assertEqualIntA(a, (sizeof(buff)-1),
1784    archive_read_data(a, buff, (sizeof(buff)-1)));
1785  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1786                        "assertEqualMem to test equalit", buff);
1787
1788  memset(buff, 0, sizeof(buff));
1789  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1790    archive_seek_data(a, 6821, SEEK_CUR));
1791  assertEqualIntA(a, (sizeof(buff)-1),
1792    archive_read_data(a, buff, (sizeof(buff)-1)));
1793  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1794                        "</P>\n</BODY>\n</HTML>", buff);
1795
1796  memset(buff, 0, sizeof(buff));
1797  assertEqualIntA(a, 0,
1798    archive_seek_data(a, -20111, SEEK_CUR));
1799  assertEqualIntA(a, (sizeof(buff)-1),
1800    archive_read_data(a, buff, (sizeof(buff)-1)));
1801  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1802                        "Transitional//EN\">\n", buff);
1803
1804  memset(buff, 0, sizeof(buff));
1805  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1806    archive_seek_data(a, 19985, SEEK_CUR));
1807  assertEqualIntA(a, (sizeof(buff)-1),
1808    archive_read_data(a, buff, (sizeof(buff)-1)));
1809  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1810                        "</P>\n</BODY>\n</HTML>", buff);
1811
1812  memset(buff, 0, sizeof(buff));
1813  assertEqualIntA(a, 13164,
1814    archive_seek_data(a, -6947, SEEK_CUR));
1815  assertEqualIntA(a, (sizeof(buff)-1),
1816    archive_read_data(a, buff, (sizeof(buff)-1)));
1817  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1818                        "assertEqualMem to test equalit", buff);
1819
1820  memset(buff, 0, sizeof(buff));
1821  assertEqualIntA(a, 0,
1822    archive_seek_data(a, -13227, SEEK_CUR));
1823  assertEqualIntA(a, (sizeof(buff)-1),
1824    archive_read_data(a, buff, (sizeof(buff)-1)));
1825  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1826                        "Transitional//EN\">\n", buff);
1827
1828  /* Test that SEEK_END works correctly between data blocks */
1829  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1830  memset(buff, 0, sizeof(buff));
1831  assertEqualIntA(a, 13164,
1832    archive_seek_data(a, -6947, SEEK_END));
1833  assertEqualIntA(a, (sizeof(buff)-1),
1834    archive_read_data(a, buff, (sizeof(buff)-1)));
1835  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1836                        "assertEqualMem to test equalit", buff);
1837
1838  memset(buff, 0, sizeof(buff));
1839  assertEqualIntA(a, 0,
1840    archive_seek_data(a, -20111, SEEK_END));
1841  assertEqualIntA(a, (sizeof(buff)-1),
1842    archive_read_data(a, buff, (sizeof(buff)-1)));
1843  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1844                        "Transitional//EN\">\n", buff);
1845
1846  memset(buff, 0, sizeof(buff));
1847  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1848    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1849  assertEqualIntA(a, (sizeof(buff)-1),
1850    archive_read_data(a, buff, (sizeof(buff)-1)));
1851  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1852                        "</P>\n</BODY>\n</HTML>", buff);
1853
1854  memset(buff, 0, sizeof(buff));
1855  assertEqualIntA(a, 13164,
1856    archive_seek_data(a, -6947, SEEK_END));
1857  assertEqualIntA(a, (sizeof(buff)-1),
1858    archive_read_data(a, buff, (sizeof(buff)-1)));
1859  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1860                        "assertEqualMem to test equalit", buff);
1861
1862  memset(buff, 0, sizeof(buff));
1863  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1864    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1865  assertEqualIntA(a, (sizeof(buff)-1),
1866    archive_read_data(a, buff, (sizeof(buff)-1)));
1867  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1868                        "</P>\n</BODY>\n</HTML>", buff);
1869
1870  memset(buff, 0, sizeof(buff));
1871  assertEqualIntA(a, 0,
1872    archive_seek_data(a, -20111, SEEK_END));
1873  assertEqualIntA(a, (sizeof(buff)-1),
1874    archive_read_data(a, buff, (sizeof(buff)-1)));
1875  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1876                        "Transitional//EN\">\n", buff);
1877
1878  memset(buff, 0, sizeof(buff));
1879  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1880    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1881  assertEqualIntA(a, (sizeof(buff)-1),
1882    archive_read_data(a, buff, (sizeof(buff)-1)));
1883  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1884                        "</P>\n</BODY>\n</HTML>", buff);
1885
1886  memset(buff, 0, sizeof(buff));
1887  assertEqualIntA(a, 13164,
1888    archive_seek_data(a, -6947, SEEK_END));
1889  assertEqualIntA(a, (sizeof(buff)-1),
1890    archive_read_data(a, buff, (sizeof(buff)-1)));
1891  assertEqualStringA(a, "ertEqualInt,\n\tassertEqualString, "
1892                        "assertEqualMem to test equalit", buff);
1893
1894  memset(buff, 0, sizeof(buff));
1895  assertEqualIntA(a, 0,
1896    archive_seek_data(a, -20111, SEEK_END));
1897  assertEqualIntA(a, (sizeof(buff)-1),
1898    archive_read_data(a, buff, (sizeof(buff)-1)));
1899  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1900                        "Transitional//EN\">\n", buff);
1901
1902  test_read_format_rar_multivolume_uncompressed_files_helper(a);
1903
1904  /*
1905   * Second header.
1906   */
1907  assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
1908  assertEqualStringA(a, "testdir/testsubdir/LibarchiveAddingTest2.html",
1909                     archive_entry_pathname(ae));
1910  assertA((int)archive_entry_mtime(ae));
1911  assertA((int)archive_entry_ctime(ae));
1912  assertA((int)archive_entry_atime(ae));
1913  assertEqualIntA(a, 20111, archive_entry_size(ae));
1914  assertEqualIntA(a, 33188, archive_entry_mode(ae));
1915  assertEqualInt(archive_entry_is_encrypted(ae), 0);
1916  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
1917
1918  test_read_format_rar_multivolume_uncompressed_files_helper(a);
1919
1920  /* Read from the beginning to the end of the file */
1921  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1922  do
1923  {
1924    memset(buff, 0, sizeof(buff));
1925    bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
1926  } while (bytes_read > 0);
1927
1928  /* Seek to the end minus (sizeof(buff)-1) bytes */
1929  memset(buff, 0, sizeof(buff));
1930  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1931    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
1932  assertEqualIntA(a, (sizeof(buff)-1),
1933    archive_read_data(a, buff, (sizeof(buff)-1)));
1934  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1935                        "</P>\n</BODY>\n</HTML>", buff);
1936
1937  /* Seek back to the beginning */
1938  memset(buff, 0, sizeof(buff));
1939  assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
1940  assertEqualIntA(a, (sizeof(buff)-1),
1941    archive_read_data(a, buff, (sizeof(buff)-1)));
1942  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1943                        "Transitional//EN\">\n", buff);
1944
1945  /* Test that SEEK_SET works correctly between data blocks */
1946  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
1947  memset(buff, 0, sizeof(buff));
1948  assertEqualIntA(a, 6162,
1949    archive_seek_data(a, 6162, SEEK_SET));
1950  assertEqualIntA(a, (sizeof(buff)-1),
1951    archive_read_data(a, buff, (sizeof(buff)-1)));
1952  assertEqualStringA(a, "arguments satisfy certain conditions. "
1953                        "If the assertion fails--f", buff);
1954
1955  memset(buff, 0, sizeof(buff));
1956  assertEqualIntA(a, 19347,
1957    archive_seek_data(a, 19347, SEEK_SET));
1958  assertEqualIntA(a, (sizeof(buff)-1),
1959    archive_read_data(a, buff, (sizeof(buff)-1)));
1960  assertEqualStringA(a, " when a block being written out by\n"
1961                        "the archive writer is the sa", buff);
1962
1963  memset(buff, 0, sizeof(buff));
1964  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1965    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1966  assertEqualIntA(a, (sizeof(buff)-1),
1967    archive_read_data(a, buff, (sizeof(buff)-1)));
1968  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
1969                        "</P>\n</BODY>\n</HTML>", buff);
1970
1971  memset(buff, 0, sizeof(buff));
1972  assertEqualIntA(a, 19347,
1973    archive_seek_data(a, 19347, SEEK_SET));
1974  assertEqualIntA(a, (sizeof(buff)-1),
1975    archive_read_data(a, buff, (sizeof(buff)-1)));
1976  assertEqualStringA(a, " when a block being written out by\n"
1977                        "the archive writer is the sa", buff);
1978
1979  memset(buff, 0, sizeof(buff));
1980  assertEqualIntA(a, 6162,
1981    archive_seek_data(a, 6162, SEEK_SET));
1982  assertEqualIntA(a, (sizeof(buff)-1),
1983    archive_read_data(a, buff, (sizeof(buff)-1)));
1984  assertEqualStringA(a, "arguments satisfy certain conditions. "
1985                        "If the assertion fails--f", buff);
1986
1987  memset(buff, 0, sizeof(buff));
1988  assertEqualIntA(a, 0,
1989    archive_seek_data(a, 0, SEEK_SET));
1990  assertEqualIntA(a, (sizeof(buff)-1),
1991    archive_read_data(a, buff, (sizeof(buff)-1)));
1992  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
1993                        "Transitional//EN\">\n", buff);
1994
1995  memset(buff, 0, sizeof(buff));
1996  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
1997    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
1998  assertEqualIntA(a, (sizeof(buff)-1),
1999    archive_read_data(a, buff, (sizeof(buff)-1)));
2000  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2001                        "</P>\n</BODY>\n</HTML>", buff);
2002
2003  memset(buff, 0, sizeof(buff));
2004  assertEqualIntA(a, 6162,
2005    archive_seek_data(a, 6162, SEEK_SET));
2006  assertEqualIntA(a, (sizeof(buff)-1),
2007    archive_read_data(a, buff, (sizeof(buff)-1)));
2008  assertEqualStringA(a, "arguments satisfy certain conditions. "
2009                        "If the assertion fails--f", buff);
2010
2011  memset(buff, 0, sizeof(buff));
2012  assertEqualIntA(a, 19347,
2013    archive_seek_data(a, 19347, SEEK_SET));
2014  assertEqualIntA(a, (sizeof(buff)-1),
2015    archive_read_data(a, buff, (sizeof(buff)-1)));
2016  assertEqualStringA(a, " when a block being written out by\n"
2017                        "the archive writer is the sa", buff);
2018
2019  memset(buff, 0, sizeof(buff));
2020  assertEqualIntA(a, 0,
2021    archive_seek_data(a, 0, SEEK_SET));
2022  assertEqualIntA(a, (sizeof(buff)-1),
2023    archive_read_data(a, buff, (sizeof(buff)-1)));
2024  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2025                        "Transitional//EN\">\n", buff);
2026
2027  memset(buff, 0, sizeof(buff));
2028  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2029    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2030  assertEqualIntA(a, (sizeof(buff)-1),
2031    archive_read_data(a, buff, (sizeof(buff)-1)));
2032  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2033                        "</P>\n</BODY>\n</HTML>", buff);
2034
2035  memset(buff, 0, sizeof(buff));
2036  assertEqualIntA(a, 0,
2037    archive_seek_data(a, 0, SEEK_SET));
2038  assertEqualIntA(a, (sizeof(buff)-1),
2039    archive_read_data(a, buff, (sizeof(buff)-1)));
2040  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2041                        "Transitional//EN\">\n", buff);
2042
2043  memset(buff, 0, sizeof(buff));
2044  assertEqualIntA(a, 19347,
2045    archive_seek_data(a, 19347, SEEK_SET));
2046  assertEqualIntA(a, (sizeof(buff)-1),
2047    archive_read_data(a, buff, (sizeof(buff)-1)));
2048  assertEqualStringA(a, " when a block being written out by\n"
2049                        "the archive writer is the sa", buff);
2050
2051  memset(buff, 0, sizeof(buff));
2052  assertEqualIntA(a, 6162,
2053    archive_seek_data(a, 6162, SEEK_SET));
2054  assertEqualIntA(a, (sizeof(buff)-1),
2055    archive_read_data(a, buff, (sizeof(buff)-1)));
2056  assertEqualStringA(a, "arguments satisfy certain conditions. "
2057                        "If the assertion fails--f", buff);
2058
2059  /* Test that SEEK_CUR works correctly between data blocks */
2060  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2061  memset(buff, 0, sizeof(buff));
2062  assertEqualIntA(a, 6162,
2063    archive_seek_data(a, 6162, SEEK_CUR));
2064  assertEqualIntA(a, (sizeof(buff)-1),
2065    archive_read_data(a, buff, (sizeof(buff)-1)));
2066  assertEqualStringA(a, "arguments satisfy certain conditions. "
2067                        "If the assertion fails--f", buff);
2068
2069  memset(buff, 0, sizeof(buff));
2070  assertEqualIntA(a, 19347,
2071    archive_seek_data(a, 13122, SEEK_CUR));
2072  assertEqualIntA(a, (sizeof(buff)-1),
2073    archive_read_data(a, buff, (sizeof(buff)-1)));
2074  assertEqualStringA(a, " when a block being written out by\n"
2075                        "the archive writer is the sa", buff);
2076
2077  memset(buff, 0, sizeof(buff));
2078  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2079    archive_seek_data(a, 638, SEEK_CUR));
2080  assertEqualIntA(a, (sizeof(buff)-1),
2081    archive_read_data(a, buff, (sizeof(buff)-1)));
2082  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2083                        "</P>\n</BODY>\n</HTML>", buff);
2084
2085  memset(buff, 0, sizeof(buff));
2086  assertEqualIntA(a, 19347,
2087    archive_seek_data(a, -764, SEEK_CUR));
2088  assertEqualIntA(a, (sizeof(buff)-1),
2089    archive_read_data(a, buff, (sizeof(buff)-1)));
2090  assertEqualStringA(a, " when a block being written out by\n"
2091                        "the archive writer is the sa", buff);
2092
2093  memset(buff, 0, sizeof(buff));
2094  assertEqualIntA(a, 6162,
2095    archive_seek_data(a, -13248, SEEK_CUR));
2096  assertEqualIntA(a, (sizeof(buff)-1),
2097    archive_read_data(a, buff, (sizeof(buff)-1)));
2098  assertEqualStringA(a, "arguments satisfy certain conditions. "
2099                        "If the assertion fails--f", buff);
2100
2101  memset(buff, 0, sizeof(buff));
2102  assertEqualIntA(a, 0,
2103    archive_seek_data(a, -6225, SEEK_CUR));
2104  assertEqualIntA(a, (sizeof(buff)-1),
2105    archive_read_data(a, buff, (sizeof(buff)-1)));
2106  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2107                        "Transitional//EN\">\n", buff);
2108
2109  memset(buff, 0, sizeof(buff));
2110  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2111    archive_seek_data(a, 19985, SEEK_CUR));
2112  assertEqualIntA(a, (sizeof(buff)-1),
2113    archive_read_data(a, buff, (sizeof(buff)-1)));
2114  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2115                        "</P>\n</BODY>\n</HTML>", buff);
2116
2117  memset(buff, 0, sizeof(buff));
2118  assertEqualIntA(a, 6162,
2119    archive_seek_data(a, -13949, SEEK_CUR));
2120  assertEqualIntA(a, (sizeof(buff)-1),
2121    archive_read_data(a, buff, (sizeof(buff)-1)));
2122  assertEqualStringA(a, "arguments satisfy certain conditions. "
2123                        "If the assertion fails--f", buff);
2124
2125  memset(buff, 0, sizeof(buff));
2126  assertEqualIntA(a, 19347,
2127    archive_seek_data(a, 13122, SEEK_CUR));
2128  assertEqualIntA(a, (sizeof(buff)-1),
2129    archive_read_data(a, buff, (sizeof(buff)-1)));
2130  assertEqualStringA(a, " when a block being written out by\n"
2131                        "the archive writer is the sa", buff);
2132
2133  memset(buff, 0, sizeof(buff));
2134  assertEqualIntA(a, 0,
2135    archive_seek_data(a, -19410, SEEK_CUR));
2136  assertEqualIntA(a, (sizeof(buff)-1),
2137    archive_read_data(a, buff, (sizeof(buff)-1)));
2138  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2139                        "Transitional//EN\">\n", buff);
2140
2141  memset(buff, 0, sizeof(buff));
2142  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2143    archive_seek_data(a, 19985, SEEK_CUR));
2144  assertEqualIntA(a, (sizeof(buff)-1),
2145    archive_read_data(a, buff, (sizeof(buff)-1)));
2146  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2147                        "</P>\n</BODY>\n</HTML>", buff);
2148
2149  memset(buff, 0, sizeof(buff));
2150  assertEqualIntA(a, 0,
2151    archive_seek_data(a, -20111, SEEK_CUR));
2152  assertEqualIntA(a, (sizeof(buff)-1),
2153    archive_read_data(a, buff, (sizeof(buff)-1)));
2154  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2155                        "Transitional//EN\">\n", buff);
2156
2157  memset(buff, 0, sizeof(buff));
2158  assertEqualIntA(a, 19347,
2159    archive_seek_data(a, 19284, SEEK_CUR));
2160  assertEqualIntA(a, (sizeof(buff)-1),
2161    archive_read_data(a, buff, (sizeof(buff)-1)));
2162  assertEqualStringA(a, " when a block being written out by\n"
2163                        "the archive writer is the sa", buff);
2164
2165  memset(buff, 0, sizeof(buff));
2166  assertEqualIntA(a, 6162,
2167    archive_seek_data(a, -13248, SEEK_CUR));
2168  assertEqualIntA(a, (sizeof(buff)-1),
2169    archive_read_data(a, buff, (sizeof(buff)-1)));
2170  assertEqualStringA(a, "arguments satisfy certain conditions. "
2171                        "If the assertion fails--f", buff);
2172
2173  /* Test that SEEK_END works correctly between data blocks */
2174  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2175  memset(buff, 0, sizeof(buff));
2176  assertEqualIntA(a, 6162,
2177    archive_seek_data(a, -13949, SEEK_END));
2178  assertEqualIntA(a, (sizeof(buff)-1),
2179    archive_read_data(a, buff, (sizeof(buff)-1)));
2180  assertEqualStringA(a, "arguments satisfy certain conditions. "
2181                        "If the assertion fails--f", buff);
2182
2183  memset(buff, 0, sizeof(buff));
2184  assertEqualIntA(a, 19347,
2185    archive_seek_data(a, -764, SEEK_END));
2186  assertEqualIntA(a, (sizeof(buff)-1),
2187    archive_read_data(a, buff, (sizeof(buff)-1)));
2188  assertEqualStringA(a, " when a block being written out by\n"
2189                        "the archive writer is the sa", buff);
2190
2191  memset(buff, 0, sizeof(buff));
2192  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2193    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2194  assertEqualIntA(a, (sizeof(buff)-1),
2195    archive_read_data(a, buff, (sizeof(buff)-1)));
2196  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2197                        "</P>\n</BODY>\n</HTML>", buff);
2198
2199  memset(buff, 0, sizeof(buff));
2200  assertEqualIntA(a, 19347,
2201    archive_seek_data(a, -764, SEEK_END));
2202  assertEqualIntA(a, (sizeof(buff)-1),
2203    archive_read_data(a, buff, (sizeof(buff)-1)));
2204  assertEqualStringA(a, " when a block being written out by\n"
2205                        "the archive writer is the sa", buff);
2206
2207  memset(buff, 0, sizeof(buff));
2208  assertEqualIntA(a, 6162,
2209    archive_seek_data(a, -13949, SEEK_END));
2210  assertEqualIntA(a, (sizeof(buff)-1),
2211    archive_read_data(a, buff, (sizeof(buff)-1)));
2212  assertEqualStringA(a, "arguments satisfy certain conditions. "
2213                        "If the assertion fails--f", buff);
2214
2215  memset(buff, 0, sizeof(buff));
2216  assertEqualIntA(a, 0,
2217    archive_seek_data(a, -20111, SEEK_END));
2218  assertEqualIntA(a, (sizeof(buff)-1),
2219    archive_read_data(a, buff, (sizeof(buff)-1)));
2220  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2221                        "Transitional//EN\">\n", buff);
2222
2223  memset(buff, 0, sizeof(buff));
2224  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2225    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2226  assertEqualIntA(a, (sizeof(buff)-1),
2227    archive_read_data(a, buff, (sizeof(buff)-1)));
2228  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2229                        "</P>\n</BODY>\n</HTML>", buff);
2230
2231  memset(buff, 0, sizeof(buff));
2232  assertEqualIntA(a, 6162,
2233    archive_seek_data(a, -13949, SEEK_END));
2234  assertEqualIntA(a, (sizeof(buff)-1),
2235    archive_read_data(a, buff, (sizeof(buff)-1)));
2236  assertEqualStringA(a, "arguments satisfy certain conditions. "
2237                        "If the assertion fails--f", buff);
2238
2239  memset(buff, 0, sizeof(buff));
2240  assertEqualIntA(a, 19347,
2241    archive_seek_data(a, -764, SEEK_END));
2242  assertEqualIntA(a, (sizeof(buff)-1),
2243    archive_read_data(a, buff, (sizeof(buff)-1)));
2244  assertEqualStringA(a, " when a block being written out by\n"
2245                        "the archive writer is the sa", buff);
2246
2247  memset(buff, 0, sizeof(buff));
2248  assertEqualIntA(a, 0,
2249    archive_seek_data(a, -20111, SEEK_END));
2250  assertEqualIntA(a, (sizeof(buff)-1),
2251    archive_read_data(a, buff, (sizeof(buff)-1)));
2252  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2253                        "Transitional//EN\">\n", buff);
2254
2255  memset(buff, 0, sizeof(buff));
2256  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2257    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2258  assertEqualIntA(a, (sizeof(buff)-1),
2259    archive_read_data(a, buff, (sizeof(buff)-1)));
2260  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2261                        "</P>\n</BODY>\n</HTML>", buff);
2262
2263  memset(buff, 0, sizeof(buff));
2264  assertEqualIntA(a, 0,
2265    archive_seek_data(a, -20111, SEEK_END));
2266  assertEqualIntA(a, (sizeof(buff)-1),
2267    archive_read_data(a, buff, (sizeof(buff)-1)));
2268  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2269                        "Transitional//EN\">\n", buff);
2270
2271  memset(buff, 0, sizeof(buff));
2272  assertEqualIntA(a, 19347,
2273    archive_seek_data(a, -764, SEEK_END));
2274  assertEqualIntA(a, (sizeof(buff)-1),
2275    archive_read_data(a, buff, (sizeof(buff)-1)));
2276  assertEqualStringA(a, " when a block being written out by\n"
2277                        "the archive writer is the sa", buff);
2278
2279  memset(buff, 0, sizeof(buff));
2280  assertEqualIntA(a, 6162,
2281    archive_seek_data(a, -13949, SEEK_END));
2282  assertEqualIntA(a, (sizeof(buff)-1),
2283    archive_read_data(a, buff, (sizeof(buff)-1)));
2284  assertEqualStringA(a, "arguments satisfy certain conditions. "
2285                        "If the assertion fails--f", buff);
2286
2287  test_read_format_rar_multivolume_uncompressed_files_helper(a);
2288
2289  /*
2290   * Third header.
2291   */
2292  assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
2293  assertEqualStringA(a, "LibarchiveAddingTest2.html",
2294                     archive_entry_pathname(ae));
2295  assertA((int)archive_entry_mtime(ae));
2296  assertA((int)archive_entry_ctime(ae));
2297  assertA((int)archive_entry_atime(ae));
2298  assertEqualIntA(a, 20111, archive_entry_size(ae));
2299  assertEqualIntA(a, 33188, archive_entry_mode(ae));
2300  assertEqualInt(archive_entry_is_encrypted(ae), 0);
2301  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
2302
2303  test_read_format_rar_multivolume_uncompressed_files_helper(a);
2304
2305  /* Read from the beginning to the end of the file */
2306  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2307  do
2308  {
2309    memset(buff, 0, sizeof(buff));
2310    bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
2311  } while (bytes_read > 0);
2312
2313  /* Seek to the end minus (sizeof(buff)-1) bytes */
2314  memset(buff, 0, sizeof(buff));
2315  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2316    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2317  assertEqualIntA(a, (sizeof(buff)-1),
2318    archive_read_data(a, buff, (sizeof(buff)-1)));
2319  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2320                        "</P>\n</BODY>\n</HTML>", buff);
2321
2322  /* Seek back to the beginning */
2323  memset(buff, 0, sizeof(buff));
2324  assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
2325  assertEqualIntA(a, (sizeof(buff)-1),
2326    archive_read_data(a, buff, (sizeof(buff)-1)));
2327  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2328                        "Transitional//EN\">\n", buff);
2329
2330  /* Test that SEEK_SET works correctly between data blocks */
2331  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2332  memset(buff, 0, sizeof(buff));
2333  assertEqualIntA(a, 12353,
2334    archive_seek_data(a, 12353, SEEK_SET));
2335  assertEqualIntA(a, (sizeof(buff)-1),
2336    archive_read_data(a, buff, (sizeof(buff)-1)));
2337  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2338                        "extract_reference_file(&quot;test_foo.tar", buff);
2339
2340  memset(buff, 0, sizeof(buff));
2341  assertEqualIntA(a, 0,
2342    archive_seek_data(a, 0, SEEK_SET));
2343  assertEqualIntA(a, (sizeof(buff)-1),
2344    archive_read_data(a, buff, (sizeof(buff)-1)));
2345  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2346                        "Transitional//EN\">\n", buff);
2347
2348  memset(buff, 0, sizeof(buff));
2349  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2350    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2351  assertEqualIntA(a, (sizeof(buff)-1),
2352    archive_read_data(a, buff, (sizeof(buff)-1)));
2353  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2354                        "</P>\n</BODY>\n</HTML>", buff);
2355
2356  memset(buff, 0, sizeof(buff));
2357  assertEqualIntA(a, 12353,
2358    archive_seek_data(a, 12353, SEEK_SET));
2359  assertEqualIntA(a, (sizeof(buff)-1),
2360    archive_read_data(a, buff, (sizeof(buff)-1)));
2361  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2362                        "extract_reference_file(&quot;test_foo.tar", buff);
2363
2364  memset(buff, 0, sizeof(buff));
2365  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2366    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2367  assertEqualIntA(a, (sizeof(buff)-1),
2368    archive_read_data(a, buff, (sizeof(buff)-1)));
2369  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2370                        "</P>\n</BODY>\n</HTML>", buff);
2371
2372  memset(buff, 0, sizeof(buff));
2373  assertEqualIntA(a, 0,
2374    archive_seek_data(a, 0, SEEK_SET));
2375  assertEqualIntA(a, (sizeof(buff)-1),
2376    archive_read_data(a, buff, (sizeof(buff)-1)));
2377  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2378                        "Transitional//EN\">\n", buff);
2379
2380  memset(buff, 0, sizeof(buff));
2381  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2382    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2383  assertEqualIntA(a, (sizeof(buff)-1),
2384    archive_read_data(a, buff, (sizeof(buff)-1)));
2385  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2386                        "</P>\n</BODY>\n</HTML>", buff);
2387
2388  memset(buff, 0, sizeof(buff));
2389  assertEqualIntA(a, 12353,
2390    archive_seek_data(a, 12353, SEEK_SET));
2391  assertEqualIntA(a, (sizeof(buff)-1),
2392    archive_read_data(a, buff, (sizeof(buff)-1)));
2393  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2394                        "extract_reference_file(&quot;test_foo.tar", buff);
2395
2396  memset(buff, 0, sizeof(buff));
2397  assertEqualIntA(a, 0,
2398    archive_seek_data(a, 0, SEEK_SET));
2399  assertEqualIntA(a, (sizeof(buff)-1),
2400    archive_read_data(a, buff, (sizeof(buff)-1)));
2401  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2402                        "Transitional//EN\">\n", buff);
2403
2404  /* Test that SEEK_CUR works correctly between data blocks */
2405  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2406  memset(buff, 0, sizeof(buff));
2407  assertEqualIntA(a, 12353,
2408    archive_seek_data(a, 12353, SEEK_CUR));
2409  assertEqualIntA(a, (sizeof(buff)-1),
2410    archive_read_data(a, buff, (sizeof(buff)-1)));
2411  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2412                        "extract_reference_file(&quot;test_foo.tar", buff);
2413
2414  memset(buff, 0, sizeof(buff));
2415  assertEqualIntA(a, 0,
2416    archive_seek_data(a, -12416, SEEK_CUR));
2417  assertEqualIntA(a, (sizeof(buff)-1),
2418    archive_read_data(a, buff, (sizeof(buff)-1)));
2419  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2420                        "Transitional//EN\">\n", buff);
2421
2422  memset(buff, 0, sizeof(buff));
2423  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2424    archive_seek_data(a, 19985, SEEK_CUR));
2425  assertEqualIntA(a, (sizeof(buff)-1),
2426    archive_read_data(a, buff, (sizeof(buff)-1)));
2427  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2428                        "</P>\n</BODY>\n</HTML>", buff);
2429
2430  memset(buff, 0, sizeof(buff));
2431  assertEqualIntA(a, 12353,
2432    archive_seek_data(a, -7758, SEEK_CUR));
2433  assertEqualIntA(a, (sizeof(buff)-1),
2434    archive_read_data(a, buff, (sizeof(buff)-1)));
2435  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2436                        "extract_reference_file(&quot;test_foo.tar", buff);
2437
2438  memset(buff, 0, sizeof(buff));
2439  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2440    archive_seek_data(a, 7632, SEEK_CUR));
2441  assertEqualIntA(a, (sizeof(buff)-1),
2442    archive_read_data(a, buff, (sizeof(buff)-1)));
2443  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2444                        "</P>\n</BODY>\n</HTML>", buff);
2445
2446  memset(buff, 0, sizeof(buff));
2447  assertEqualIntA(a, 0,
2448    archive_seek_data(a, -20111, SEEK_CUR));
2449  assertEqualIntA(a, (sizeof(buff)-1),
2450    archive_read_data(a, buff, (sizeof(buff)-1)));
2451  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2452                        "Transitional//EN\">\n", buff);
2453
2454  memset(buff, 0, sizeof(buff));
2455  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2456    archive_seek_data(a, 19985, SEEK_CUR));
2457  assertEqualIntA(a, (sizeof(buff)-1),
2458    archive_read_data(a, buff, (sizeof(buff)-1)));
2459  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2460                        "</P>\n</BODY>\n</HTML>", buff);
2461
2462  memset(buff, 0, sizeof(buff));
2463  assertEqualIntA(a, 12353,
2464    archive_seek_data(a, -7758, SEEK_CUR));
2465  assertEqualIntA(a, (sizeof(buff)-1),
2466    archive_read_data(a, buff, (sizeof(buff)-1)));
2467  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2468                        "extract_reference_file(&quot;test_foo.tar", buff);
2469
2470  memset(buff, 0, sizeof(buff));
2471  assertEqualIntA(a, 0,
2472    archive_seek_data(a, -12416, SEEK_CUR));
2473  assertEqualIntA(a, (sizeof(buff)-1),
2474    archive_read_data(a, buff, (sizeof(buff)-1)));
2475  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2476                        "Transitional//EN\">\n", buff);
2477
2478  /* Test that SEEK_END works correctly between data blocks */
2479  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2480  memset(buff, 0, sizeof(buff));
2481  assertEqualIntA(a, 12353,
2482    archive_seek_data(a, -7758, SEEK_END));
2483  assertEqualIntA(a, (sizeof(buff)-1),
2484    archive_read_data(a, buff, (sizeof(buff)-1)));
2485  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2486                        "extract_reference_file(&quot;test_foo.tar", buff);
2487
2488  memset(buff, 0, sizeof(buff));
2489  assertEqualIntA(a, 0,
2490    archive_seek_data(a, -20111, SEEK_END));
2491  assertEqualIntA(a, (sizeof(buff)-1),
2492    archive_read_data(a, buff, (sizeof(buff)-1)));
2493  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2494                        "Transitional//EN\">\n", buff);
2495
2496  memset(buff, 0, sizeof(buff));
2497  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2498    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2499  assertEqualIntA(a, (sizeof(buff)-1),
2500    archive_read_data(a, buff, (sizeof(buff)-1)));
2501  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2502                        "</P>\n</BODY>\n</HTML>", buff);
2503
2504  memset(buff, 0, sizeof(buff));
2505  assertEqualIntA(a, 12353,
2506    archive_seek_data(a, -7758, SEEK_END));
2507  assertEqualIntA(a, (sizeof(buff)-1),
2508    archive_read_data(a, buff, (sizeof(buff)-1)));
2509  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2510                        "extract_reference_file(&quot;test_foo.tar", buff);
2511
2512  memset(buff, 0, sizeof(buff));
2513  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2514    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2515  assertEqualIntA(a, (sizeof(buff)-1),
2516    archive_read_data(a, buff, (sizeof(buff)-1)));
2517  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2518                        "</P>\n</BODY>\n</HTML>", buff);
2519
2520  memset(buff, 0, sizeof(buff));
2521  assertEqualIntA(a, 0,
2522    archive_seek_data(a, -20111, SEEK_END));
2523  assertEqualIntA(a, (sizeof(buff)-1),
2524    archive_read_data(a, buff, (sizeof(buff)-1)));
2525  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2526                        "Transitional//EN\">\n", buff);
2527
2528  memset(buff, 0, sizeof(buff));
2529  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2530    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2531  assertEqualIntA(a, (sizeof(buff)-1),
2532    archive_read_data(a, buff, (sizeof(buff)-1)));
2533  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2534                        "</P>\n</BODY>\n</HTML>", buff);
2535
2536  memset(buff, 0, sizeof(buff));
2537  assertEqualIntA(a, 12353,
2538    archive_seek_data(a, -7758, SEEK_END));
2539  assertEqualIntA(a, (sizeof(buff)-1),
2540    archive_read_data(a, buff, (sizeof(buff)-1)));
2541  assertEqualStringA(a, " 0.2in\">&nbsp; &nbsp; "
2542                        "extract_reference_file(&quot;test_foo.tar", buff);
2543
2544  memset(buff, 0, sizeof(buff));
2545  assertEqualIntA(a, 0,
2546    archive_seek_data(a, -20111, SEEK_END));
2547  assertEqualIntA(a, (sizeof(buff)-1),
2548    archive_read_data(a, buff, (sizeof(buff)-1)));
2549  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2550                        "Transitional//EN\">\n", buff);
2551
2552  test_read_format_rar_multivolume_uncompressed_files_helper(a);
2553
2554  /*
2555   * Fourth header.
2556   */
2557  assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
2558  assertEqualStringA(a, "testdir/LibarchiveAddingTest.html",
2559                     archive_entry_pathname(ae));
2560  assertA((int)archive_entry_mtime(ae));
2561  assertA((int)archive_entry_ctime(ae));
2562  assertA((int)archive_entry_atime(ae));
2563  assertEqualIntA(a, 20111, archive_entry_size(ae));
2564  assertEqualIntA(a, 33188, archive_entry_mode(ae));
2565  assertEqualInt(archive_entry_is_encrypted(ae), 0);
2566  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
2567
2568  test_read_format_rar_multivolume_uncompressed_files_helper(a);
2569
2570  /* Read from the beginning to the end of the file */
2571  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2572  do
2573  {
2574    memset(buff, 0, sizeof(buff));
2575    bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
2576  } while (bytes_read > 0);
2577
2578  /* Seek to the end minus (sizeof(buff)-1) bytes */
2579  memset(buff, 0, sizeof(buff));
2580  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2581    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2582  assertEqualIntA(a, (sizeof(buff)-1),
2583    archive_read_data(a, buff, (sizeof(buff)-1)));
2584  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2585                        "</P>\n</BODY>\n</HTML>", buff);
2586
2587  /* Seek back to the beginning */
2588  memset(buff, 0, sizeof(buff));
2589  assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
2590  assertEqualIntA(a, (sizeof(buff)-1),
2591    archive_read_data(a, buff, (sizeof(buff)-1)));
2592  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2593                        "Transitional//EN\">\n", buff);
2594
2595  /* Test that SEEK_SET works correctly between data blocks */
2596  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2597  memset(buff, 0, sizeof(buff));
2598  assertEqualIntA(a, 5371,
2599    archive_seek_data(a, 5371, SEEK_SET));
2600  assertEqualIntA(a, (sizeof(buff)-1),
2601    archive_read_data(a, buff, (sizeof(buff)-1)));
2602  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2603                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2604
2605  memset(buff, 0, sizeof(buff));
2606  assertEqualIntA(a, 13165,
2607    archive_seek_data(a, 13165, SEEK_SET));
2608  assertEqualIntA(a, (sizeof(buff)-1),
2609    archive_read_data(a, buff, (sizeof(buff)-1)));
2610  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2611                        "assertEqualMem to test equality", buff);
2612
2613  memset(buff, 0, sizeof(buff));
2614  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2615    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2616  assertEqualIntA(a, (sizeof(buff)-1),
2617    archive_read_data(a, buff, (sizeof(buff)-1)));
2618  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2619                        "</P>\n</BODY>\n</HTML>", buff);
2620
2621  memset(buff, 0, sizeof(buff));
2622  assertEqualIntA(a, 13165,
2623    archive_seek_data(a, 13165, SEEK_SET));
2624  assertEqualIntA(a, (sizeof(buff)-1),
2625    archive_read_data(a, buff, (sizeof(buff)-1)));
2626  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2627                        "assertEqualMem to test equality", buff);
2628
2629  memset(buff, 0, sizeof(buff));
2630  assertEqualIntA(a, 5371,
2631    archive_seek_data(a, 5371, SEEK_SET));
2632  assertEqualIntA(a, (sizeof(buff)-1),
2633    archive_read_data(a, buff, (sizeof(buff)-1)));
2634  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2635                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2636
2637  memset(buff, 0, sizeof(buff));
2638  assertEqualIntA(a, 0,
2639    archive_seek_data(a, 0, SEEK_SET));
2640  assertEqualIntA(a, (sizeof(buff)-1),
2641    archive_read_data(a, buff, (sizeof(buff)-1)));
2642  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2643                        "Transitional//EN\">\n", buff);
2644
2645  memset(buff, 0, sizeof(buff));
2646  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2647    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2648  assertEqualIntA(a, (sizeof(buff)-1),
2649    archive_read_data(a, buff, (sizeof(buff)-1)));
2650  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2651                        "</P>\n</BODY>\n</HTML>", buff);
2652
2653  memset(buff, 0, sizeof(buff));
2654  assertEqualIntA(a, 5371,
2655    archive_seek_data(a, 5371, SEEK_SET));
2656  assertEqualIntA(a, (sizeof(buff)-1),
2657    archive_read_data(a, buff, (sizeof(buff)-1)));
2658  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2659                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2660
2661  memset(buff, 0, sizeof(buff));
2662  assertEqualIntA(a, 13165,
2663    archive_seek_data(a, 13165, SEEK_SET));
2664  assertEqualIntA(a, (sizeof(buff)-1),
2665    archive_read_data(a, buff, (sizeof(buff)-1)));
2666  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2667                        "assertEqualMem to test equality", buff);
2668
2669  memset(buff, 0, sizeof(buff));
2670  assertEqualIntA(a, 0,
2671    archive_seek_data(a, 0, SEEK_SET));
2672  assertEqualIntA(a, (sizeof(buff)-1),
2673    archive_read_data(a, buff, (sizeof(buff)-1)));
2674  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2675                        "Transitional//EN\">\n", buff);
2676
2677  memset(buff, 0, sizeof(buff));
2678  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2679    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
2680  assertEqualIntA(a, (sizeof(buff)-1),
2681    archive_read_data(a, buff, (sizeof(buff)-1)));
2682  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2683                        "</P>\n</BODY>\n</HTML>", buff);
2684
2685  memset(buff, 0, sizeof(buff));
2686  assertEqualIntA(a, 0,
2687    archive_seek_data(a, 0, SEEK_SET));
2688  assertEqualIntA(a, (sizeof(buff)-1),
2689    archive_read_data(a, buff, (sizeof(buff)-1)));
2690  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2691                        "Transitional//EN\">\n", buff);
2692
2693  memset(buff, 0, sizeof(buff));
2694  assertEqualIntA(a, 13165,
2695    archive_seek_data(a, 13165, SEEK_SET));
2696  assertEqualIntA(a, (sizeof(buff)-1),
2697    archive_read_data(a, buff, (sizeof(buff)-1)));
2698  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2699                        "assertEqualMem to test equality", buff);
2700
2701  memset(buff, 0, sizeof(buff));
2702  assertEqualIntA(a, 5371,
2703    archive_seek_data(a, 5371, SEEK_SET));
2704  assertEqualIntA(a, (sizeof(buff)-1),
2705    archive_read_data(a, buff, (sizeof(buff)-1)));
2706  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2707                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2708
2709  /* Test that SEEK_CUR works correctly between data blocks */
2710  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2711  memset(buff, 0, sizeof(buff));
2712  assertEqualIntA(a, 5371,
2713    archive_seek_data(a, 5371, SEEK_CUR));
2714  assertEqualIntA(a, (sizeof(buff)-1),
2715    archive_read_data(a, buff, (sizeof(buff)-1)));
2716  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2717                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2718
2719  memset(buff, 0, sizeof(buff));
2720  assertEqualIntA(a, 13165,
2721    archive_seek_data(a, 7731, SEEK_CUR));
2722  assertEqualIntA(a, (sizeof(buff)-1),
2723    archive_read_data(a, buff, (sizeof(buff)-1)));
2724  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2725                        "assertEqualMem to test equality", buff);
2726
2727  memset(buff, 0, sizeof(buff));
2728  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2729    archive_seek_data(a, 6820, SEEK_CUR));
2730  assertEqualIntA(a, (sizeof(buff)-1),
2731    archive_read_data(a, buff, (sizeof(buff)-1)));
2732  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2733                        "</P>\n</BODY>\n</HTML>", buff);
2734
2735  memset(buff, 0, sizeof(buff));
2736  assertEqualIntA(a, 13165,
2737    archive_seek_data(a, -6946, SEEK_CUR));
2738  assertEqualIntA(a, (sizeof(buff)-1),
2739    archive_read_data(a, buff, (sizeof(buff)-1)));
2740  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2741                        "assertEqualMem to test equality", buff);
2742
2743  memset(buff, 0, sizeof(buff));
2744  assertEqualIntA(a, 5371,
2745    archive_seek_data(a, -7857, SEEK_CUR));
2746  assertEqualIntA(a, (sizeof(buff)-1),
2747    archive_read_data(a, buff, (sizeof(buff)-1)));
2748  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2749                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2750
2751  memset(buff, 0, sizeof(buff));
2752  assertEqualIntA(a, 0,
2753    archive_seek_data(a, -5434, SEEK_CUR));
2754  assertEqualIntA(a, (sizeof(buff)-1),
2755    archive_read_data(a, buff, (sizeof(buff)-1)));
2756  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2757                        "Transitional//EN\">\n", buff);
2758
2759  memset(buff, 0, sizeof(buff));
2760  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2761    archive_seek_data(a, 19985, SEEK_CUR));
2762  assertEqualIntA(a, (sizeof(buff)-1),
2763    archive_read_data(a, buff, (sizeof(buff)-1)));
2764  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2765                        "</P>\n</BODY>\n</HTML>", buff);
2766
2767  memset(buff, 0, sizeof(buff));
2768  assertEqualIntA(a, 5371,
2769    archive_seek_data(a, -14740, SEEK_CUR));
2770  assertEqualIntA(a, (sizeof(buff)-1),
2771    archive_read_data(a, buff, (sizeof(buff)-1)));
2772  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2773                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2774
2775  memset(buff, 0, sizeof(buff));
2776  assertEqualIntA(a, 13165,
2777    archive_seek_data(a, 7731, SEEK_CUR));
2778  assertEqualIntA(a, (sizeof(buff)-1),
2779    archive_read_data(a, buff, (sizeof(buff)-1)));
2780  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2781                        "assertEqualMem to test equality", buff);
2782
2783  memset(buff, 0, sizeof(buff));
2784  assertEqualIntA(a, 0,
2785    archive_seek_data(a, -13228, SEEK_CUR));
2786  assertEqualIntA(a, (sizeof(buff)-1),
2787    archive_read_data(a, buff, (sizeof(buff)-1)));
2788  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2789                        "Transitional//EN\">\n", buff);
2790
2791  memset(buff, 0, sizeof(buff));
2792  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2793    archive_seek_data(a, 19985, SEEK_CUR));
2794  assertEqualIntA(a, (sizeof(buff)-1),
2795    archive_read_data(a, buff, (sizeof(buff)-1)));
2796  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2797                        "</P>\n</BODY>\n</HTML>", buff);
2798
2799  memset(buff, 0, sizeof(buff));
2800  assertEqualIntA(a, 0,
2801    archive_seek_data(a, -20111, SEEK_CUR));
2802  assertEqualIntA(a, (sizeof(buff)-1),
2803    archive_read_data(a, buff, (sizeof(buff)-1)));
2804  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2805                        "Transitional//EN\">\n", buff);
2806
2807  memset(buff, 0, sizeof(buff));
2808  assertEqualIntA(a, 13165,
2809    archive_seek_data(a, 13102, SEEK_CUR));
2810  assertEqualIntA(a, (sizeof(buff)-1),
2811    archive_read_data(a, buff, (sizeof(buff)-1)));
2812  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2813                        "assertEqualMem to test equality", buff);
2814
2815  memset(buff, 0, sizeof(buff));
2816  assertEqualIntA(a, 5371,
2817    archive_seek_data(a, -7857, SEEK_CUR));
2818  assertEqualIntA(a, (sizeof(buff)-1),
2819    archive_read_data(a, buff, (sizeof(buff)-1)));
2820  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2821                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2822
2823  /* Test that SEEK_END works correctly between data blocks */
2824  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2825  memset(buff, 0, sizeof(buff));
2826  assertEqualIntA(a, 5371,
2827    archive_seek_data(a, -14740, SEEK_END));
2828  assertEqualIntA(a, (sizeof(buff)-1),
2829    archive_read_data(a, buff, (sizeof(buff)-1)));
2830  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2831                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2832
2833  memset(buff, 0, sizeof(buff));
2834  assertEqualIntA(a, 13165,
2835    archive_seek_data(a, -6946, SEEK_END));
2836  assertEqualIntA(a, (sizeof(buff)-1),
2837    archive_read_data(a, buff, (sizeof(buff)-1)));
2838  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2839                        "assertEqualMem to test equality", buff);
2840
2841  memset(buff, 0, sizeof(buff));
2842  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2843    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2844  assertEqualIntA(a, (sizeof(buff)-1),
2845    archive_read_data(a, buff, (sizeof(buff)-1)));
2846  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2847                        "</P>\n</BODY>\n</HTML>", buff);
2848
2849  memset(buff, 0, sizeof(buff));
2850  assertEqualIntA(a, 13165,
2851    archive_seek_data(a, -6946, SEEK_END));
2852  assertEqualIntA(a, (sizeof(buff)-1),
2853    archive_read_data(a, buff, (sizeof(buff)-1)));
2854  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2855                        "assertEqualMem to test equality", buff);
2856
2857  memset(buff, 0, sizeof(buff));
2858  assertEqualIntA(a, 5371,
2859    archive_seek_data(a, -14740, SEEK_END));
2860  assertEqualIntA(a, (sizeof(buff)-1),
2861    archive_read_data(a, buff, (sizeof(buff)-1)));
2862  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2863                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2864
2865  memset(buff, 0, sizeof(buff));
2866  assertEqualIntA(a, 0,
2867    archive_seek_data(a, -20111, SEEK_END));
2868  assertEqualIntA(a, (sizeof(buff)-1),
2869    archive_read_data(a, buff, (sizeof(buff)-1)));
2870  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2871                        "Transitional//EN\">\n", buff);
2872
2873  memset(buff, 0, sizeof(buff));
2874  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2875    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2876  assertEqualIntA(a, (sizeof(buff)-1),
2877    archive_read_data(a, buff, (sizeof(buff)-1)));
2878  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2879                        "</P>\n</BODY>\n</HTML>", buff);
2880
2881  memset(buff, 0, sizeof(buff));
2882  assertEqualIntA(a, 5371,
2883    archive_seek_data(a, -14740, SEEK_END));
2884  assertEqualIntA(a, (sizeof(buff)-1),
2885    archive_read_data(a, buff, (sizeof(buff)-1)));
2886  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2887                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2888
2889  memset(buff, 0, sizeof(buff));
2890  assertEqualIntA(a, 13165,
2891    archive_seek_data(a, -6946, SEEK_END));
2892  assertEqualIntA(a, (sizeof(buff)-1),
2893    archive_read_data(a, buff, (sizeof(buff)-1)));
2894  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2895                        "assertEqualMem to test equality", buff);
2896
2897  memset(buff, 0, sizeof(buff));
2898  assertEqualIntA(a, 0,
2899    archive_seek_data(a, -20111, SEEK_END));
2900  assertEqualIntA(a, (sizeof(buff)-1),
2901    archive_read_data(a, buff, (sizeof(buff)-1)));
2902  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2903                        "Transitional//EN\">\n", buff);
2904
2905  memset(buff, 0, sizeof(buff));
2906  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2907    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2908  assertEqualIntA(a, (sizeof(buff)-1),
2909    archive_read_data(a, buff, (sizeof(buff)-1)));
2910  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2911                        "</P>\n</BODY>\n</HTML>", buff);
2912
2913  memset(buff, 0, sizeof(buff));
2914  assertEqualIntA(a, 0,
2915    archive_seek_data(a, -20111, SEEK_END));
2916  assertEqualIntA(a, (sizeof(buff)-1),
2917    archive_read_data(a, buff, (sizeof(buff)-1)));
2918  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2919                        "Transitional//EN\">\n", buff);
2920
2921  memset(buff, 0, sizeof(buff));
2922  assertEqualIntA(a, 13165,
2923    archive_seek_data(a, -6946, SEEK_END));
2924  assertEqualIntA(a, (sizeof(buff)-1),
2925    archive_read_data(a, buff, (sizeof(buff)-1)));
2926  assertEqualStringA(a, "rtEqualInt,\n\tassertEqualString, "
2927                        "assertEqualMem to test equality", buff);
2928
2929  memset(buff, 0, sizeof(buff));
2930  assertEqualIntA(a, 5371,
2931    archive_seek_data(a, -14740, SEEK_END));
2932  assertEqualIntA(a, (sizeof(buff)-1),
2933    archive_read_data(a, buff, (sizeof(buff)-1)));
2934  assertEqualStringA(a, "zip)\n&nbsp; {\n&nbsp; &nbsp; "
2935                        "/* ... setup omitted ... */\n&nbsp; ", buff);
2936
2937  test_read_format_rar_multivolume_uncompressed_files_helper(a);
2938
2939  /*
2940   * Fifth header.
2941   */
2942  assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
2943  assertEqualStringA(a, "testdir/testsubdir/LibarchiveAddingTest.html",
2944                     archive_entry_pathname(ae));
2945  assertA((int)archive_entry_mtime(ae));
2946  assertA((int)archive_entry_ctime(ae));
2947  assertA((int)archive_entry_atime(ae));
2948  assertEqualIntA(a, 20111, archive_entry_size(ae));
2949  assertEqualIntA(a, 33188, archive_entry_mode(ae));
2950  assertEqualInt(archive_entry_is_encrypted(ae), 0);
2951  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
2952
2953  test_read_format_rar_multivolume_uncompressed_files_helper(a);
2954
2955  /* Read from the beginning to the end of the file */
2956  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2957  do
2958  {
2959    memset(buff, 0, sizeof(buff));
2960    bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
2961  } while (bytes_read > 0);
2962
2963  /* Seek to the end minus (sizeof(buff)-1) bytes */
2964  memset(buff, 0, sizeof(buff));
2965  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
2966    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
2967  assertEqualIntA(a, (sizeof(buff)-1),
2968    archive_read_data(a, buff, (sizeof(buff)-1)));
2969  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
2970                        "</P>\n</BODY>\n</HTML>", buff);
2971
2972  /* Seek back to the beginning */
2973  memset(buff, 0, sizeof(buff));
2974  assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
2975  assertEqualIntA(a, (sizeof(buff)-1),
2976    archive_read_data(a, buff, (sizeof(buff)-1)));
2977  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2978                        "Transitional//EN\">\n", buff);
2979
2980  /* Test that SEEK_SET works correctly between data blocks */
2981  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
2982  memset(buff, 0, sizeof(buff));
2983  assertEqualIntA(a, 11568,
2984    archive_seek_data(a, 11568, SEEK_SET));
2985  assertEqualIntA(a, (sizeof(buff)-1),
2986    archive_read_data(a, buff, (sizeof(buff)-1)));
2987  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
2988                        "\n\t<TT CLASS=\"west", buff);
2989
2990  memset(buff, 0, sizeof(buff));
2991  assertEqualIntA(a, 0,
2992    archive_seek_data(a, 0, SEEK_SET));
2993  assertEqualIntA(a, (sizeof(buff)-1),
2994    archive_read_data(a, buff, (sizeof(buff)-1)));
2995  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
2996                        "Transitional//EN\">\n", buff);
2997
2998  memset(buff, 0, sizeof(buff));
2999  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3000    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3001  assertEqualIntA(a, (sizeof(buff)-1),
3002    archive_read_data(a, buff, (sizeof(buff)-1)));
3003  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3004                        "</P>\n</BODY>\n</HTML>", buff);
3005
3006  memset(buff, 0, sizeof(buff));
3007  assertEqualIntA(a, 11568,
3008    archive_seek_data(a, 11568, SEEK_SET));
3009  assertEqualIntA(a, (sizeof(buff)-1),
3010    archive_read_data(a, buff, (sizeof(buff)-1)));
3011  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3012                        "\n\t<TT CLASS=\"west", buff);
3013
3014  memset(buff, 0, sizeof(buff));
3015  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3016    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3017  assertEqualIntA(a, (sizeof(buff)-1),
3018    archive_read_data(a, buff, (sizeof(buff)-1)));
3019  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3020                        "</P>\n</BODY>\n</HTML>", buff);
3021
3022  memset(buff, 0, sizeof(buff));
3023  assertEqualIntA(a, 0,
3024    archive_seek_data(a, 0, SEEK_SET));
3025  assertEqualIntA(a, (sizeof(buff)-1),
3026    archive_read_data(a, buff, (sizeof(buff)-1)));
3027  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3028                        "Transitional//EN\">\n", buff);
3029
3030  memset(buff, 0, sizeof(buff));
3031  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3032    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3033  assertEqualIntA(a, (sizeof(buff)-1),
3034    archive_read_data(a, buff, (sizeof(buff)-1)));
3035  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3036                        "</P>\n</BODY>\n</HTML>", buff);
3037
3038  memset(buff, 0, sizeof(buff));
3039  assertEqualIntA(a, 11568,
3040    archive_seek_data(a, 11568, SEEK_SET));
3041  assertEqualIntA(a, (sizeof(buff)-1),
3042    archive_read_data(a, buff, (sizeof(buff)-1)));
3043  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3044                        "\n\t<TT CLASS=\"west", buff);
3045
3046  memset(buff, 0, sizeof(buff));
3047  assertEqualIntA(a, 0,
3048    archive_seek_data(a, 0, SEEK_SET));
3049  assertEqualIntA(a, (sizeof(buff)-1),
3050    archive_read_data(a, buff, (sizeof(buff)-1)));
3051  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3052                        "Transitional//EN\">\n", buff);
3053
3054  /* Test that SEEK_CUR works correctly between data blocks */
3055  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3056  memset(buff, 0, sizeof(buff));
3057  assertEqualIntA(a, 11568,
3058    archive_seek_data(a, 11568, SEEK_CUR));
3059  assertEqualIntA(a, (sizeof(buff)-1),
3060    archive_read_data(a, buff, (sizeof(buff)-1)));
3061  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3062                        "\n\t<TT CLASS=\"west", buff);
3063
3064  memset(buff, 0, sizeof(buff));
3065  assertEqualIntA(a, 0,
3066    archive_seek_data(a, -11631, SEEK_CUR));
3067  assertEqualIntA(a, (sizeof(buff)-1),
3068    archive_read_data(a, buff, (sizeof(buff)-1)));
3069  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3070                        "Transitional//EN\">\n", buff);
3071
3072  memset(buff, 0, sizeof(buff));
3073  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3074    archive_seek_data(a, 19985, SEEK_CUR));
3075  assertEqualIntA(a, (sizeof(buff)-1),
3076    archive_read_data(a, buff, (sizeof(buff)-1)));
3077  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3078                        "</P>\n</BODY>\n</HTML>", buff);
3079
3080  memset(buff, 0, sizeof(buff));
3081  assertEqualIntA(a, 11568,
3082    archive_seek_data(a, -8543, SEEK_CUR));
3083  assertEqualIntA(a, (sizeof(buff)-1),
3084    archive_read_data(a, buff, (sizeof(buff)-1)));
3085  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3086                        "\n\t<TT CLASS=\"west", buff);
3087
3088  memset(buff, 0, sizeof(buff));
3089  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3090    archive_seek_data(a, 8417, SEEK_CUR));
3091  assertEqualIntA(a, (sizeof(buff)-1),
3092    archive_read_data(a, buff, (sizeof(buff)-1)));
3093  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3094                        "</P>\n</BODY>\n</HTML>", buff);
3095
3096  memset(buff, 0, sizeof(buff));
3097  assertEqualIntA(a, 0,
3098    archive_seek_data(a, -20111, SEEK_CUR));
3099  assertEqualIntA(a, (sizeof(buff)-1),
3100    archive_read_data(a, buff, (sizeof(buff)-1)));
3101  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3102                        "Transitional//EN\">\n", buff);
3103
3104  memset(buff, 0, sizeof(buff));
3105  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3106    archive_seek_data(a, 19985, SEEK_CUR));
3107  assertEqualIntA(a, (sizeof(buff)-1),
3108    archive_read_data(a, buff, (sizeof(buff)-1)));
3109  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3110                        "</P>\n</BODY>\n</HTML>", buff);
3111
3112  memset(buff, 0, sizeof(buff));
3113  assertEqualIntA(a, 11568,
3114    archive_seek_data(a, -8543, SEEK_CUR));
3115  assertEqualIntA(a, (sizeof(buff)-1),
3116    archive_read_data(a, buff, (sizeof(buff)-1)));
3117  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3118                        "\n\t<TT CLASS=\"west", buff);
3119
3120  memset(buff, 0, sizeof(buff));
3121  assertEqualIntA(a, 0,
3122    archive_seek_data(a, -11631, SEEK_CUR));
3123  assertEqualIntA(a, (sizeof(buff)-1),
3124    archive_read_data(a, buff, (sizeof(buff)-1)));
3125  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3126                        "Transitional//EN\">\n", buff);
3127
3128  /* Test that SEEK_END works correctly between data blocks */
3129  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3130  memset(buff, 0, sizeof(buff));
3131  assertEqualIntA(a, 11568,
3132    archive_seek_data(a, -8543, SEEK_END));
3133  assertEqualIntA(a, (sizeof(buff)-1),
3134    archive_read_data(a, buff, (sizeof(buff)-1)));
3135  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3136                        "\n\t<TT CLASS=\"west", buff);
3137
3138  memset(buff, 0, sizeof(buff));
3139  assertEqualIntA(a, 0,
3140    archive_seek_data(a, -20111, SEEK_END));
3141  assertEqualIntA(a, (sizeof(buff)-1),
3142    archive_read_data(a, buff, (sizeof(buff)-1)));
3143  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3144                        "Transitional//EN\">\n", buff);
3145
3146  memset(buff, 0, sizeof(buff));
3147  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3148    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3149  assertEqualIntA(a, (sizeof(buff)-1),
3150    archive_read_data(a, buff, (sizeof(buff)-1)));
3151  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3152                        "</P>\n</BODY>\n</HTML>", buff);
3153
3154  memset(buff, 0, sizeof(buff));
3155  assertEqualIntA(a, 11568,
3156    archive_seek_data(a, -8543, SEEK_END));
3157  assertEqualIntA(a, (sizeof(buff)-1),
3158    archive_read_data(a, buff, (sizeof(buff)-1)));
3159  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3160                        "\n\t<TT CLASS=\"west", buff);
3161
3162  memset(buff, 0, sizeof(buff));
3163  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3164    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3165  assertEqualIntA(a, (sizeof(buff)-1),
3166    archive_read_data(a, buff, (sizeof(buff)-1)));
3167  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3168                        "</P>\n</BODY>\n</HTML>", buff);
3169
3170  memset(buff, 0, sizeof(buff));
3171  assertEqualIntA(a, 0,
3172    archive_seek_data(a, -20111, SEEK_END));
3173  assertEqualIntA(a, (sizeof(buff)-1),
3174    archive_read_data(a, buff, (sizeof(buff)-1)));
3175  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3176                        "Transitional//EN\">\n", buff);
3177
3178  memset(buff, 0, sizeof(buff));
3179  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3180    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3181  assertEqualIntA(a, (sizeof(buff)-1),
3182    archive_read_data(a, buff, (sizeof(buff)-1)));
3183  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3184                        "</P>\n</BODY>\n</HTML>", buff);
3185
3186  memset(buff, 0, sizeof(buff));
3187  assertEqualIntA(a, 11568,
3188    archive_seek_data(a, -8543, SEEK_END));
3189  assertEqualIntA(a, (sizeof(buff)-1),
3190    archive_read_data(a, buff, (sizeof(buff)-1)));
3191  assertEqualStringA(a, ", <TT CLASS=\"western\">assertFileContents</TT>,"
3192                        "\n\t<TT CLASS=\"west", buff);
3193
3194  memset(buff, 0, sizeof(buff));
3195  assertEqualIntA(a, 0,
3196    archive_seek_data(a, -20111, SEEK_END));
3197  assertEqualIntA(a, (sizeof(buff)-1),
3198    archive_read_data(a, buff, (sizeof(buff)-1)));
3199  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3200                        "Transitional//EN\">\n", buff);
3201
3202  test_read_format_rar_multivolume_uncompressed_files_helper(a);
3203
3204  /*
3205   * Sixth header.
3206   */
3207  assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
3208  assertEqualStringA(a, "LibarchiveAddingTest.html",
3209                     archive_entry_pathname(ae));
3210  assertA((int)archive_entry_mtime(ae));
3211  assertA((int)archive_entry_ctime(ae));
3212  assertA((int)archive_entry_atime(ae));
3213  assertEqualIntA(a, 20111, archive_entry_size(ae));
3214  assertEqualIntA(a, 33188, archive_entry_mode(ae));
3215  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3216  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3217
3218  test_read_format_rar_multivolume_uncompressed_files_helper(a);
3219
3220  /* Read from the beginning to the end of the file */
3221  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3222  do
3223  {
3224    memset(buff, 0, sizeof(buff));
3225    bytes_read = archive_read_data(a, buff, (sizeof(buff)-1));
3226  } while (bytes_read > 0);
3227
3228  /* Seek to the end minus (sizeof(buff)-1) bytes */
3229  memset(buff, 0, sizeof(buff));
3230  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3231    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3232  assertEqualIntA(a, (sizeof(buff)-1),
3233    archive_read_data(a, buff, (sizeof(buff)-1)));
3234  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3235                        "</P>\n</BODY>\n</HTML>", buff);
3236
3237  /* Seek back to the beginning */
3238  memset(buff, 0, sizeof(buff));
3239  assertEqualIntA(a, 0, archive_seek_data(a, -20111, SEEK_END));
3240  assertEqualIntA(a, (sizeof(buff)-1),
3241    archive_read_data(a, buff, (sizeof(buff)-1)));
3242  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3243                        "Transitional//EN\">\n", buff);
3244
3245  /* Test that SEEK_SET works correctly between data blocks */
3246  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3247  memset(buff, 0, sizeof(buff));
3248  assertEqualIntA(a, 4576,
3249    archive_seek_data(a, 4576, SEEK_SET));
3250  assertEqualIntA(a, (sizeof(buff)-1),
3251    archive_read_data(a, buff, (sizeof(buff)-1)));
3252  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3253                        "NAME=\"Basic_test", buff);
3254
3255  memset(buff, 0, sizeof(buff));
3256  assertEqualIntA(a, 17749,
3257    archive_seek_data(a, 17749, SEEK_SET));
3258  assertEqualIntA(a, (sizeof(buff)-1),
3259    archive_read_data(a, buff, (sizeof(buff)-1)));
3260  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3261                        "large tar tester attempts to", buff);
3262
3263  memset(buff, 0, sizeof(buff));
3264  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3265    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3266  assertEqualIntA(a, (sizeof(buff)-1),
3267    archive_read_data(a, buff, (sizeof(buff)-1)));
3268  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3269                        "</P>\n</BODY>\n</HTML>", buff);
3270
3271  memset(buff, 0, sizeof(buff));
3272  assertEqualIntA(a, 17749,
3273    archive_seek_data(a, 17749, SEEK_SET));
3274  assertEqualIntA(a, (sizeof(buff)-1),
3275    archive_read_data(a, buff, (sizeof(buff)-1)));
3276  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3277                        "large tar tester attempts to", buff);
3278
3279  memset(buff, 0, sizeof(buff));
3280  assertEqualIntA(a, 4576,
3281    archive_seek_data(a, 4576, SEEK_SET));
3282  assertEqualIntA(a, (sizeof(buff)-1),
3283    archive_read_data(a, buff, (sizeof(buff)-1)));
3284  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3285                        "NAME=\"Basic_test", buff);
3286
3287  memset(buff, 0, sizeof(buff));
3288  assertEqualIntA(a, 0,
3289    archive_seek_data(a, 0, SEEK_SET));
3290  assertEqualIntA(a, (sizeof(buff)-1),
3291    archive_read_data(a, buff, (sizeof(buff)-1)));
3292  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3293                        "Transitional//EN\">\n", buff);
3294
3295  memset(buff, 0, sizeof(buff));
3296  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3297    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3298  assertEqualIntA(a, (sizeof(buff)-1),
3299    archive_read_data(a, buff, (sizeof(buff)-1)));
3300  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3301                        "</P>\n</BODY>\n</HTML>", buff);
3302
3303  memset(buff, 0, sizeof(buff));
3304  assertEqualIntA(a, 4576,
3305    archive_seek_data(a, 4576, SEEK_SET));
3306  assertEqualIntA(a, (sizeof(buff)-1),
3307    archive_read_data(a, buff, (sizeof(buff)-1)));
3308  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3309                        "NAME=\"Basic_test", buff);
3310
3311  memset(buff, 0, sizeof(buff));
3312  assertEqualIntA(a, 17749,
3313    archive_seek_data(a, 17749, SEEK_SET));
3314  assertEqualIntA(a, (sizeof(buff)-1),
3315    archive_read_data(a, buff, (sizeof(buff)-1)));
3316  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3317                        "large tar tester attempts to", buff);
3318
3319  memset(buff, 0, sizeof(buff));
3320  assertEqualIntA(a, 0,
3321    archive_seek_data(a, 0, SEEK_SET));
3322  assertEqualIntA(a, (sizeof(buff)-1),
3323    archive_read_data(a, buff, (sizeof(buff)-1)));
3324  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3325                        "Transitional//EN\">\n", buff);
3326
3327  memset(buff, 0, sizeof(buff));
3328  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3329    archive_seek_data(a, 20111 - (int)(sizeof(buff)-1), SEEK_SET));
3330  assertEqualIntA(a, (sizeof(buff)-1),
3331    archive_read_data(a, buff, (sizeof(buff)-1)));
3332  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3333                        "</P>\n</BODY>\n</HTML>", buff);
3334
3335  memset(buff, 0, sizeof(buff));
3336  assertEqualIntA(a, 0,
3337    archive_seek_data(a, 0, SEEK_SET));
3338  assertEqualIntA(a, (sizeof(buff)-1),
3339    archive_read_data(a, buff, (sizeof(buff)-1)));
3340  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3341                        "Transitional//EN\">\n", buff);
3342
3343  memset(buff, 0, sizeof(buff));
3344  assertEqualIntA(a, 17749,
3345    archive_seek_data(a, 17749, SEEK_SET));
3346  assertEqualIntA(a, (sizeof(buff)-1),
3347    archive_read_data(a, buff, (sizeof(buff)-1)));
3348  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3349                        "large tar tester attempts to", buff);
3350
3351  memset(buff, 0, sizeof(buff));
3352  assertEqualIntA(a, 4576,
3353    archive_seek_data(a, 4576, SEEK_SET));
3354  assertEqualIntA(a, (sizeof(buff)-1),
3355    archive_read_data(a, buff, (sizeof(buff)-1)));
3356  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3357                        "NAME=\"Basic_test", buff);
3358
3359  /* Test that SEEK_CUR works correctly between data blocks */
3360  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3361  memset(buff, 0, sizeof(buff));
3362  assertEqualIntA(a, 4576,
3363    archive_seek_data(a, 4576, SEEK_CUR));
3364  assertEqualIntA(a, (sizeof(buff)-1),
3365    archive_read_data(a, buff, (sizeof(buff)-1)));
3366  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3367                        "NAME=\"Basic_test", buff);
3368
3369  memset(buff, 0, sizeof(buff));
3370  assertEqualIntA(a, 17749,
3371    archive_seek_data(a, 13110, SEEK_CUR));
3372  assertEqualIntA(a, (sizeof(buff)-1),
3373    archive_read_data(a, buff, (sizeof(buff)-1)));
3374  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3375                        "large tar tester attempts to", buff);
3376
3377  memset(buff, 0, sizeof(buff));
3378  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3379    archive_seek_data(a, 2236, SEEK_CUR));
3380  assertEqualIntA(a, (sizeof(buff)-1),
3381    archive_read_data(a, buff, (sizeof(buff)-1)));
3382  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3383                        "</P>\n</BODY>\n</HTML>", buff);
3384
3385  memset(buff, 0, sizeof(buff));
3386  assertEqualIntA(a, 17749,
3387    archive_seek_data(a, -2362, SEEK_CUR));
3388  assertEqualIntA(a, (sizeof(buff)-1),
3389    archive_read_data(a, buff, (sizeof(buff)-1)));
3390  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3391                        "large tar tester attempts to", buff);
3392
3393  memset(buff, 0, sizeof(buff));
3394  assertEqualIntA(a, 4576,
3395    archive_seek_data(a, -13236, SEEK_CUR));
3396  assertEqualIntA(a, (sizeof(buff)-1),
3397    archive_read_data(a, buff, (sizeof(buff)-1)));
3398  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3399                        "NAME=\"Basic_test", buff);
3400
3401  memset(buff, 0, sizeof(buff));
3402  assertEqualIntA(a, 0,
3403    archive_seek_data(a, -4639, SEEK_CUR));
3404  assertEqualIntA(a, (sizeof(buff)-1),
3405    archive_read_data(a, buff, (sizeof(buff)-1)));
3406  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3407                        "Transitional//EN\">\n", buff);
3408
3409  memset(buff, 0, sizeof(buff));
3410  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3411    archive_seek_data(a, 19985, SEEK_CUR));
3412  assertEqualIntA(a, (sizeof(buff)-1),
3413    archive_read_data(a, buff, (sizeof(buff)-1)));
3414  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3415                        "</P>\n</BODY>\n</HTML>", buff);
3416
3417  memset(buff, 0, sizeof(buff));
3418  assertEqualIntA(a, 4576,
3419    archive_seek_data(a, -15535, SEEK_CUR));
3420  assertEqualIntA(a, (sizeof(buff)-1),
3421    archive_read_data(a, buff, (sizeof(buff)-1)));
3422  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3423                        "NAME=\"Basic_test", buff);
3424
3425  memset(buff, 0, sizeof(buff));
3426  assertEqualIntA(a, 17749,
3427    archive_seek_data(a, 13110, SEEK_CUR));
3428  assertEqualIntA(a, (sizeof(buff)-1),
3429    archive_read_data(a, buff, (sizeof(buff)-1)));
3430  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3431                        "large tar tester attempts to", buff);
3432
3433  memset(buff, 0, sizeof(buff));
3434  assertEqualIntA(a, 0,
3435    archive_seek_data(a, -17812, SEEK_CUR));
3436  assertEqualIntA(a, (sizeof(buff)-1),
3437    archive_read_data(a, buff, (sizeof(buff)-1)));
3438  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3439                        "Transitional//EN\">\n", buff);
3440
3441  memset(buff, 0, sizeof(buff));
3442  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3443    archive_seek_data(a, 19985, SEEK_CUR));
3444  assertEqualIntA(a, (sizeof(buff)-1),
3445    archive_read_data(a, buff, (sizeof(buff)-1)));
3446  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3447                        "</P>\n</BODY>\n</HTML>", buff);
3448
3449  memset(buff, 0, sizeof(buff));
3450  assertEqualIntA(a, 0,
3451    archive_seek_data(a, -20111, SEEK_CUR));
3452  assertEqualIntA(a, (sizeof(buff)-1),
3453    archive_read_data(a, buff, (sizeof(buff)-1)));
3454  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3455                        "Transitional//EN\">\n", buff);
3456
3457  memset(buff, 0, sizeof(buff));
3458  assertEqualIntA(a, 17749,
3459    archive_seek_data(a, 17686, SEEK_CUR));
3460  assertEqualIntA(a, (sizeof(buff)-1),
3461    archive_read_data(a, buff, (sizeof(buff)-1)));
3462  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3463                        "large tar tester attempts to", buff);
3464
3465  memset(buff, 0, sizeof(buff));
3466  assertEqualIntA(a, 4576,
3467    archive_seek_data(a, -13236, SEEK_CUR));
3468  assertEqualIntA(a, (sizeof(buff)-1),
3469    archive_read_data(a, buff, (sizeof(buff)-1)));
3470  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3471                        "NAME=\"Basic_test", buff);
3472
3473  /* Test that SEEK_END works correctly between data blocks */
3474  assertEqualIntA(a, 0, archive_seek_data(a, 0, SEEK_SET));
3475  memset(buff, 0, sizeof(buff));
3476  assertEqualIntA(a, 4576,
3477    archive_seek_data(a, -15535, SEEK_END));
3478  assertEqualIntA(a, (sizeof(buff)-1),
3479    archive_read_data(a, buff, (sizeof(buff)-1)));
3480  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3481                        "NAME=\"Basic_test", buff);
3482
3483  memset(buff, 0, sizeof(buff));
3484  assertEqualIntA(a, 17749,
3485    archive_seek_data(a, -2362, SEEK_END));
3486  assertEqualIntA(a, (sizeof(buff)-1),
3487    archive_read_data(a, buff, (sizeof(buff)-1)));
3488  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3489                        "large tar tester attempts to", buff);
3490
3491  memset(buff, 0, sizeof(buff));
3492  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3493    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3494  assertEqualIntA(a, (sizeof(buff)-1),
3495    archive_read_data(a, buff, (sizeof(buff)-1)));
3496  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3497                        "</P>\n</BODY>\n</HTML>", buff);
3498
3499  memset(buff, 0, sizeof(buff));
3500  assertEqualIntA(a, 17749,
3501    archive_seek_data(a, -2362, SEEK_END));
3502  assertEqualIntA(a, (sizeof(buff)-1),
3503    archive_read_data(a, buff, (sizeof(buff)-1)));
3504  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3505                        "large tar tester attempts to", buff);
3506
3507  memset(buff, 0, sizeof(buff));
3508  assertEqualIntA(a, 4576,
3509    archive_seek_data(a, -15535, SEEK_END));
3510  assertEqualIntA(a, (sizeof(buff)-1),
3511    archive_read_data(a, buff, (sizeof(buff)-1)));
3512  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3513                        "NAME=\"Basic_test", buff);
3514
3515  memset(buff, 0, sizeof(buff));
3516  assertEqualIntA(a, 0,
3517    archive_seek_data(a, -20111, SEEK_END));
3518  assertEqualIntA(a, (sizeof(buff)-1),
3519    archive_read_data(a, buff, (sizeof(buff)-1)));
3520  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3521                        "Transitional//EN\">\n", buff);
3522
3523  memset(buff, 0, sizeof(buff));
3524  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3525    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3526  assertEqualIntA(a, (sizeof(buff)-1),
3527    archive_read_data(a, buff, (sizeof(buff)-1)));
3528  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3529                        "</P>\n</BODY>\n</HTML>", buff);
3530
3531  memset(buff, 0, sizeof(buff));
3532  assertEqualIntA(a, 4576,
3533    archive_seek_data(a, -15535, SEEK_END));
3534  assertEqualIntA(a, (sizeof(buff)-1),
3535    archive_read_data(a, buff, (sizeof(buff)-1)));
3536  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3537                        "NAME=\"Basic_test", buff);
3538
3539  memset(buff, 0, sizeof(buff));
3540  assertEqualIntA(a, 17749,
3541    archive_seek_data(a, -2362, SEEK_END));
3542  assertEqualIntA(a, (sizeof(buff)-1),
3543    archive_read_data(a, buff, (sizeof(buff)-1)));
3544  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3545                        "large tar tester attempts to", buff);
3546
3547  memset(buff, 0, sizeof(buff));
3548  assertEqualIntA(a, 0,
3549    archive_seek_data(a, -20111, SEEK_END));
3550  assertEqualIntA(a, (sizeof(buff)-1),
3551    archive_read_data(a, buff, (sizeof(buff)-1)));
3552  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3553                        "Transitional//EN\">\n", buff);
3554
3555  memset(buff, 0, sizeof(buff));
3556  assertEqualIntA(a, 20111 - (int)(sizeof(buff)-1),
3557    archive_seek_data(a, -((int)sizeof(buff)-1), SEEK_END));
3558  assertEqualIntA(a, (sizeof(buff)-1),
3559    archive_read_data(a, buff, (sizeof(buff)-1)));
3560  assertEqualStringA(a, ". \n</P>\n<P STYLE=\"margin-bottom: 0in\"><BR>\n"
3561                        "</P>\n</BODY>\n</HTML>", buff);
3562
3563  memset(buff, 0, sizeof(buff));
3564  assertEqualIntA(a, 0,
3565    archive_seek_data(a, -20111, SEEK_END));
3566  assertEqualIntA(a, (sizeof(buff)-1),
3567    archive_read_data(a, buff, (sizeof(buff)-1)));
3568  assertEqualStringA(a, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
3569                        "Transitional//EN\">\n", buff);
3570
3571  memset(buff, 0, sizeof(buff));
3572  assertEqualIntA(a, 17749,
3573    archive_seek_data(a, -2362, SEEK_END));
3574  assertEqualIntA(a, (sizeof(buff)-1),
3575    archive_read_data(a, buff, (sizeof(buff)-1)));
3576  assertEqualStringA(a, "\"></A>Large tar tester</H2>\n<P>The "
3577                        "large tar tester attempts to", buff);
3578
3579  memset(buff, 0, sizeof(buff));
3580  assertEqualIntA(a, 4576,
3581    archive_seek_data(a, -15535, SEEK_END));
3582  assertEqualIntA(a, (sizeof(buff)-1),
3583    archive_read_data(a, buff, (sizeof(buff)-1)));
3584  assertEqualStringA(a, "hat was expected. \n</P>\n<H1 CLASS=\"western\"><A "
3585                        "NAME=\"Basic_test", buff);
3586
3587  test_read_format_rar_multivolume_uncompressed_files_helper(a);
3588
3589  /*
3590   * Seventh header.
3591   */
3592  assertA(0 == archive_read_next_header(a, &ae));
3593  assertEqualString("testdir/testsymlink5", archive_entry_pathname(ae));
3594  assertA((int)archive_entry_mtime(ae));
3595  assertA((int)archive_entry_ctime(ae));
3596  assertA((int)archive_entry_atime(ae));
3597  assertEqualInt(0, archive_entry_size(ae));
3598  assertEqualInt(41471, archive_entry_mode(ae));
3599  assertEqualString("testsubdir/LibarchiveAddingTest.html",
3600    archive_entry_symlink(ae));
3601  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3602  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3603  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3604
3605  /*
3606   * Eighth header.
3607   */
3608  assertA(0 == archive_read_next_header(a, &ae));
3609  assertEqualString("testdir/testsymlink6", archive_entry_pathname(ae));
3610  assertA((int)archive_entry_mtime(ae));
3611  assertA((int)archive_entry_ctime(ae));
3612  assertA((int)archive_entry_atime(ae));
3613  assertEqualInt(0, archive_entry_size(ae));
3614  assertEqualInt(41471, archive_entry_mode(ae));
3615  assertEqualString("testsubdir/LibarchiveAddingTest2.html",
3616    archive_entry_symlink(ae));
3617  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3618  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3619  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3620
3621  /*
3622   * Ninth header.
3623   */
3624  assertA(0 == archive_read_next_header(a, &ae));
3625  assertEqualString("testsymlink", archive_entry_pathname(ae));
3626  assertA((int)archive_entry_mtime(ae));
3627  assertA((int)archive_entry_ctime(ae));
3628  assertA((int)archive_entry_atime(ae));
3629  assertEqualInt(0, archive_entry_size(ae));
3630  assertEqualInt(41471, archive_entry_mode(ae));
3631  assertEqualString("testdir/LibarchiveAddingTest.html",
3632    archive_entry_symlink(ae));
3633  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3634  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3635  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3636
3637  /*
3638   * Tenth header.
3639   */
3640  assertA(0 == archive_read_next_header(a, &ae));
3641  assertEqualString("testsymlink2", archive_entry_pathname(ae));
3642  assertA((int)archive_entry_mtime(ae));
3643  assertA((int)archive_entry_ctime(ae));
3644  assertA((int)archive_entry_atime(ae));
3645  assertEqualInt(0, archive_entry_size(ae));
3646  assertEqualInt(41471, archive_entry_mode(ae));
3647  assertEqualString("testdir/LibarchiveAddingTest2.html",
3648    archive_entry_symlink(ae));
3649  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3650  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3651  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3652
3653  /*
3654   * Eleventh header.
3655   */
3656  assertA(0 == archive_read_next_header(a, &ae));
3657  assertEqualString("testsymlink3", archive_entry_pathname(ae));
3658  assertA((int)archive_entry_mtime(ae));
3659  assertA((int)archive_entry_ctime(ae));
3660  assertA((int)archive_entry_atime(ae));
3661  assertEqualInt(0, archive_entry_size(ae));
3662  assertEqualInt(41471, archive_entry_mode(ae));
3663  assertEqualString("testdir/testsubdir/LibarchiveAddingTest.html",
3664    archive_entry_symlink(ae));
3665  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3666  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3667  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3668
3669  /*
3670   * Twelfth header.
3671   */
3672  assertA(0 == archive_read_next_header(a, &ae));
3673  assertEqualString("testsymlink4", archive_entry_pathname(ae));
3674  assertA((int)archive_entry_mtime(ae));
3675  assertA((int)archive_entry_ctime(ae));
3676  assertA((int)archive_entry_atime(ae));
3677  assertEqualInt(0, archive_entry_size(ae));
3678  assertEqualInt(41471, archive_entry_mode(ae));
3679  assertEqualString("testdir/testsubdir/LibarchiveAddingTest2.html",
3680    archive_entry_symlink(ae));
3681  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3682  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3683  assertEqualIntA(a, 0, archive_read_data(a, buff, sizeof(buff)));
3684
3685  /*
3686   * Thirteenth header.
3687   */
3688  assertA(0 == archive_read_next_header(a, &ae));
3689  assertEqualString("testdir/testemptysubdir", archive_entry_pathname(ae));
3690  assertA((int)archive_entry_mtime(ae));
3691  assertA((int)archive_entry_ctime(ae));
3692  assertA((int)archive_entry_atime(ae));
3693  assertEqualInt(0, archive_entry_size(ae));
3694  assertEqualInt(16877, archive_entry_mode(ae));
3695  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3696  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3697
3698  /*
3699   * Fourteenth header.
3700   */
3701  assertA(0 == archive_read_next_header(a, &ae));
3702  assertEqualString("testdir/testsubdir", archive_entry_pathname(ae));
3703  assertA((int)archive_entry_mtime(ae));
3704  assertA((int)archive_entry_ctime(ae));
3705  assertA((int)archive_entry_atime(ae));
3706  assertEqualInt(0, archive_entry_size(ae));
3707  assertEqualInt(16877, archive_entry_mode(ae));
3708  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3709  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3710
3711  /*
3712   * Fifteenth header.
3713   */
3714  assertA(0 == archive_read_next_header(a, &ae));
3715  assertEqualString("testdir", archive_entry_pathname(ae));
3716  assertA((int)archive_entry_mtime(ae));
3717  assertA((int)archive_entry_ctime(ae));
3718  assertA((int)archive_entry_atime(ae));
3719  assertEqualInt(0, archive_entry_size(ae));
3720  assertEqualInt(16877, archive_entry_mode(ae));
3721  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3722  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3723
3724  /*
3725   * Sixteenth header.
3726   */
3727  assertA(0 == archive_read_next_header(a, &ae));
3728  assertEqualString("testemptydir", archive_entry_pathname(ae));
3729  assertA((int)archive_entry_mtime(ae));
3730  assertA((int)archive_entry_ctime(ae));
3731  assertA((int)archive_entry_atime(ae));
3732  assertEqualInt(0, archive_entry_size(ae));
3733  assertEqualInt(16877, archive_entry_mode(ae));
3734  assertEqualInt(archive_entry_is_encrypted(ae), 0);
3735  assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0);
3736
3737  /* Test EOF */
3738  assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
3739  assertEqualIntA(a, 16, archive_file_count(a));
3740  assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3741  assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
3742}
3743