1 /*-
2  * Copyright (c) 2011 Michihiro NAKAJIMA
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 #include "test.h"
26 
27 #include <locale.h>
28 
29 DEFINE_TEST(test_read_format_cpio_filename_eucJP_UTF8)
30 {
31 	const char *refname = "test_read_format_cpio_filename_eucjp.cpio";
32 	struct archive *a;
33 	struct archive_entry *ae;
34 
35 	/*
36 	 * Read eucJP filename in en_US.UTF-8 with "hdrcharset=eucJP" option.
37 	 */
38 	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
39 		skipping("en_US.UTF-8 locale not available on this system.");
40 		return;
41 	}
42 	extract_reference_file(refname);
43 
44 	assert((a = archive_read_new()) != NULL);
45 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
46 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
47 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
48 		skipping("This system cannot convert character-set"
49 		    " from eucJP to UTF-8.");
50 		goto cleanup;
51 	}
52 	assertEqualIntA(a, ARCHIVE_OK,
53 	    archive_read_open_filename(a, refname, 10240));
54 
55 	/* Verify regular file. */
56 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
57 	assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
58 	    archive_entry_pathname(ae));
59 	assertEqualInt(8, archive_entry_size(ae));
60 	assertEqualInt(archive_entry_is_encrypted(ae), 0);
61 	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
62 
63 	/* Verify regular file. */
64 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
65 	assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
66 	assertEqualInt(4, archive_entry_size(ae));
67 	assertEqualInt(archive_entry_is_encrypted(ae), 0);
68 	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
69 
70 
71 	/* End of archive. */
72 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
73 
74 	/* Verify archive format. */
75 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
76 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
77 
78 	/* Close the archive. */
79 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
80 cleanup:
81 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
82 }
83 
84 DEFINE_TEST(test_read_format_cpio_filename_UTF8_eucJP)
85 {
86 	const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio";
87 	struct archive *a;
88 	struct archive_entry *ae;
89 
90 	/*
91 	 * Read UTF-8 filename in ja_JP.eucJP with "hdrcharset=UTF-8" option.
92 	 */
93 	if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
94 		skipping("ja_JP.eucJP locale not available on this system.");
95 		return;
96 	}
97 	extract_reference_file(refname);
98 
99 	assert((a = archive_read_new()) != NULL);
100 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
101 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
102 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
103 		skipping("This system cannot convert character-set"
104 		    " from UTF-8 to eucJP.");
105 		goto cleanup;
106 	}
107 
108 	assertEqualIntA(a, ARCHIVE_OK,
109 	    archive_read_open_filename(a, refname, 10240));
110 
111 	/* Verify regular file. */
112 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
113 	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
114 	assertEqualString("\xb4\xc1\xbb\xfa.txt", archive_entry_pathname(ae));
115 	assertEqualInt(8, archive_entry_size(ae));
116 
117 	/* Verify regular file. */
118 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
119 	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
120 	assertEqualString("\xc9\xbd.txt", archive_entry_pathname(ae));
121 	assertEqualInt(4, archive_entry_size(ae));
122 
123 
124 	/* End of archive. */
125 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
126 
127 	/* Verify archive format. */
128 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
129 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
130 
131 	/* Close the archive. */
132 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
133 cleanup:
134 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
135 }
136 
137 DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp)
138 {
139 #if defined(_WIN32) && !defined(__CYGWIN__)
140 	/* Since we explicitly DON'T set hdrcharset=UTF-8 below */
141 	skipping("Windows defaults to OEMCP, not UTF-8");
142 	return;
143 #else
144 	const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio";
145 	struct archive *a;
146 	struct archive_entry *ae;
147 
148 	/*
149 	 * Read UTF-8 filename in en_US.UTF-8 without "hdrcharset=UTF-8" option.
150 	 */
151 	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
152 		skipping("en_US.UTF-8 locale not available on this system.");
153 		return;
154 	}
155 	extract_reference_file(refname);
156 
157 	assert((a = archive_read_new()) != NULL);
158 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
159 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
160 	assertEqualIntA(a, ARCHIVE_OK,
161 	    archive_read_open_filename(a, refname, 10240));
162 
163 	/* Verify regular file. */
164 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
165 	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
166 	assertEqualString("\xe6\xbc\xa2\xe5\xad\x97.txt",
167 	    archive_entry_pathname(ae));
168 	assertEqualInt(8, archive_entry_size(ae));
169 
170 	/* Verify regular file. */
171 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
172 	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
173 	assertEqualString("\xe8\xa1\xa8.txt", archive_entry_pathname(ae));
174 	assertEqualInt(4, archive_entry_size(ae));
175 
176 
177 	/* End of archive. */
178 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
179 
180 	/* Verify archive format. */
181 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
182 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
183 
184 	/* Close the archive. */
185 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
186 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
187 #endif
188 }
189 
190 DEFINE_TEST(test_read_format_cpio_filename_CP866_KOI8R)
191 {
192 	const char *refname = "test_read_format_cpio_filename_cp866.cpio";
193 	struct archive *a;
194 	struct archive_entry *ae;
195 
196 	/*
197 	 * Read CP866 filename in ru_RU.KOI8-R with "hdrcharset=CP866" option.
198 	 */
199 	if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
200 	    NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
201 		skipping("ru_RU.KOI8-R locale not available on this system.");
202 		return;
203 	}
204 	extract_reference_file(refname);
205 
206 	assert((a = archive_read_new()) != NULL);
207 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
208 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
209 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
210 		skipping("This system cannot convert character-set"
211 		    " from CP866 to KOI8-R.");
212 		goto cleanup;
213 	}
214 	assertEqualIntA(a, ARCHIVE_OK,
215 	    archive_read_open_filename(a, refname, 10240));
216 
217 	/* Verify regular file. */
218 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
219 	assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
220 	    archive_entry_pathname(ae));
221 	assertEqualInt(6, archive_entry_size(ae));
222 
223 	/* Verify regular file. */
224 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
225 	assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
226 	    archive_entry_pathname(ae));
227 	assertEqualInt(6, archive_entry_size(ae));
228 
229 
230 	/* End of archive. */
231 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
232 
233 	/* Verify archive format. */
234 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
235 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
236 
237 	/* Close the archive. */
238 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
239 cleanup:
240 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
241 }
242 
243 DEFINE_TEST(test_read_format_cpio_filename_CP866_UTF8)
244 {
245 	const char *refname = "test_read_format_cpio_filename_cp866.cpio";
246 	struct archive *a;
247 	struct archive_entry *ae;
248 
249 	/*
250 	 * Read CP866 filename in en_US.UTF-8 with "hdrcharset=CP866" option.
251 	 */
252 	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
253 		skipping("en_US.UTF-8 locale not available on this system.");
254 		return;
255 	}
256 	extract_reference_file(refname);
257 
258 	assert((a = archive_read_new()) != NULL);
259 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
260 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
261 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
262 		skipping("This system cannot convert character-set"
263 		    " from CP866 to UTF-8.");
264 		goto cleanup;
265 	}
266 	assertEqualIntA(a, ARCHIVE_OK,
267 	    archive_read_open_filename(a, refname, 10240));
268 
269 	/* Verify regular file. */
270 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
271 	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
272 	    archive_entry_pathname(ae));
273 	assertEqualInt(6, archive_entry_size(ae));
274 
275 	/* Verify regular file. */
276 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
277 	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
278 	    archive_entry_pathname(ae));
279 	assertEqualInt(6, archive_entry_size(ae));
280 
281 
282 	/* End of archive. */
283 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
284 
285 	/* Verify archive format. */
286 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
287 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
288 
289 	/* Close the archive. */
290 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
291 cleanup:
292 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
293 }
294 
295 DEFINE_TEST(test_read_format_cpio_filename_KOI8R_CP866)
296 {
297 	const char *refname = "test_read_format_cpio_filename_koi8r.cpio";
298 	struct archive *a;
299 	struct archive_entry *ae;
300 
301 	/*
302 	 * Read KOI8-R filename in ru_RU.CP866 with "hdrcharset=KOI8-R" option.
303 	 */
304 	if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
305 	    NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
306 		skipping("ru_RU.CP866 locale not available on this system.");
307 		return;
308 	}
309 	extract_reference_file(refname);
310 
311 	assert((a = archive_read_new()) != NULL);
312 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
313 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
314 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
315 		skipping("This system cannot convert character-set"
316 		    " from KOI8-R to CP866.");
317 		goto cleanup;
318 	}
319 	assertEqualIntA(a, ARCHIVE_OK,
320 	    archive_read_open_filename(a, refname, 10240));
321 
322 	/* Verify regular file. */
323 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
324 	assertEqualString("\x8f\x90\x88\x82\x85\x92",
325 	    archive_entry_pathname(ae));
326 	assertEqualInt(6, archive_entry_size(ae));
327 
328 	/* Verify regular file. */
329 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
330 	assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
331 	    archive_entry_pathname(ae));
332 	assertEqualInt(6, archive_entry_size(ae));
333 
334 
335 	/* End of archive. */
336 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
337 
338 	/* Verify archive format. */
339 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
340 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
341 
342 	/* Close the archive. */
343 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
344 cleanup:
345 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
346 }
347 
348 DEFINE_TEST(test_read_format_cpio_filename_KOI8R_UTF8)
349 {
350 	const char *refname = "test_read_format_cpio_filename_koi8r.cpio";
351 	struct archive *a;
352 	struct archive_entry *ae;
353 
354 	/*
355 	 * Read KOI8-R filename in en_US.UTF-8 with "hdrcharset=KOI8-R" option.
356 	 */
357 	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
358 		skipping("en_US.UTF-8 locale not available on this system.");
359 		return;
360 	}
361 	extract_reference_file(refname);
362 
363 	assert((a = archive_read_new()) != NULL);
364 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
365 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
366 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
367 		skipping("This system cannot convert character-set"
368 		    " from KOI8-R to UTF-8.");
369 		goto cleanup;
370 	}
371 	assertEqualIntA(a, ARCHIVE_OK,
372 	    archive_read_open_filename(a, refname, 10240));
373 
374 	/* Verify regular file. */
375 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
376 	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
377 	    archive_entry_pathname(ae));
378 	assertEqualInt(6, archive_entry_size(ae));
379 
380 	/* Verify regular file. */
381 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
382 	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
383 	    archive_entry_pathname(ae));
384 	assertEqualInt(6, archive_entry_size(ae));
385 
386 
387 	/* End of archive. */
388 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
389 
390 	/* Verify archive format. */
391 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
392 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
393 
394 	/* Close the archive. */
395 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
396 cleanup:
397 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
398 }
399 
400 DEFINE_TEST(test_read_format_cpio_filename_UTF8_KOI8R)
401 {
402 	const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio";
403 	struct archive *a;
404 	struct archive_entry *ae;
405 
406 	/*
407 	 * Read UTF-8 filename in ru_RU.KOI8-R with "hdrcharset=UTF-8" option.
408 	 */
409 	if (NULL == setlocale(LC_ALL, "Russian_Russia.20866") &&
410 	    NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
411 		skipping("ru_RU.KOI8-R locale not available on this system.");
412 		return;
413 	}
414 	extract_reference_file(refname);
415 
416 	assert((a = archive_read_new()) != NULL);
417 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
418 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
419 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
420 		skipping("This system cannot convert character-set"
421 		    " from UTF-8 to KOI8-R.");
422 		goto cleanup;
423 	}
424 	assertEqualIntA(a, ARCHIVE_OK,
425 	    archive_read_open_filename(a, refname, 10240));
426 
427 	/* Verify regular file. */
428 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
429 	assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
430 	    archive_entry_pathname(ae));
431 	assertEqualInt(6, archive_entry_size(ae));
432 
433 	/* Verify regular file. */
434 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
435 	assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
436 	    archive_entry_pathname(ae));
437 	assertEqualInt(6, archive_entry_size(ae));
438 
439 
440 	/* End of archive. */
441 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
442 
443 	/* Verify archive format. */
444 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
445 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
446 
447 	/* Close the archive. */
448 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
449 cleanup:
450 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
451 }
452 
453 DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP866)
454 {
455 	const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio";
456 	struct archive *a;
457 	struct archive_entry *ae;
458 
459 	/*
460 	 * Read UTF-8 filename in ru_RU.CP866 with "hdrcharset=UTF-8" option.
461 	 */
462 	if (NULL == setlocale(LC_ALL, "Russian_Russia.866") &&
463 		NULL == setlocale(LC_ALL, "ru_RU.CP866")) {
464 		skipping("ru_RU.CP866 locale not available on this system.");
465 		return;
466 	}
467 	extract_reference_file(refname);
468 
469 	assert((a = archive_read_new()) != NULL);
470 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
471 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
472 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
473 		skipping("This system cannot convert character-set"
474 		    " from UTF-8 to CP866.");
475 		goto cleanup;
476 	}
477 	assertEqualIntA(a, ARCHIVE_OK,
478 	    archive_read_open_filename(a, refname, 10240));
479 
480 	/* Verify regular file. */
481 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
482 	assertEqualString("\x8f\x90\x88\x82\x85\x92",
483 	    archive_entry_pathname(ae));
484 	assertEqualInt(6, archive_entry_size(ae));
485 
486 	/* Verify regular file. */
487 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
488 	assertEqualString("\xaf\xe0\xa8\xa2\xa5\xe2",
489 	    archive_entry_pathname(ae));
490 	assertEqualInt(6, archive_entry_size(ae));
491 
492 
493 	/* End of archive. */
494 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
495 
496 	/* Verify archive format. */
497 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
498 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
499 
500 	/* Close the archive. */
501 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
502 cleanup:
503 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
504 }
505 
506 DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_ru)
507 {
508 #if defined(_WIN32) && !defined(__CYGWIN__)
509 	/* Since we explicitly DON'T set hdrcharset=UTF-8 below */
510 	skipping("Windows defaults to OEMCP, not UTF-8");
511 	return;
512 #else
513 	const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio";
514 	struct archive *a;
515 	struct archive_entry *ae;
516 
517 	/*
518 	 * Read UTF-8 filename in en_US.UTF-8 without "hdrcharset=UTF-8" option.
519 	 */
520 	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
521 		skipping("en_US.UTF-8 locale not available on this system.");
522 		return;
523 	}
524 	extract_reference_file(refname);
525 
526 	assert((a = archive_read_new()) != NULL);
527 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
528 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
529 	assertEqualIntA(a, ARCHIVE_OK,
530 	    archive_read_open_filename(a, refname, 10240));
531 
532 	/* Verify regular file. */
533 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
534 	assertEqualString("\xd0\x9f\xd0\xa0\xd0\x98\xd0\x92\xd0\x95\xd0\xa2",
535 	    archive_entry_pathname(ae));
536 	assertEqualInt(6, archive_entry_size(ae));
537 
538 	/* Verify regular file. */
539 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
540 	assertEqualString("\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82",
541 	    archive_entry_pathname(ae));
542 	assertEqualInt(6, archive_entry_size(ae));
543 
544 
545 	/* End of archive. */
546 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
547 
548 	/* Verify archive format. */
549 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
550 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
551 
552 	/* Close the archive. */
553 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
554 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
555 #endif
556 }
557 
558 DEFINE_TEST(test_read_format_cpio_filename_eucJP_CP932)
559 {
560 	const char *refname = "test_read_format_cpio_filename_eucjp.cpio";
561 	struct archive *a;
562 	struct archive_entry *ae;
563 
564 	/*
565 	 * Read eucJP filename in CP932/SJIS with "hdrcharset=eucJP" option.
566 	 */
567 	if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
568 	    NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
569 		skipping("CP932 locale not available on this system.");
570 		return;
571 	}
572 	extract_reference_file(refname);
573 
574 	assert((a = archive_read_new()) != NULL);
575 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
576 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
577 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=eucJP")) {
578 		skipping("This system cannot convert character-set"
579 		    " from eucJP.");
580 		goto cleanup;
581 	}
582 	assertEqualIntA(a, ARCHIVE_OK,
583 	    archive_read_open_filename(a, refname, 10240));
584 
585 	/* Verify regular file. */
586 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
587 	assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
588 	assertEqualInt(8, archive_entry_size(ae));
589 
590 	/* Verify regular file. */
591 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
592 	assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
593 	assertEqualInt(4, archive_entry_size(ae));
594 
595 
596 	/* End of archive. */
597 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
598 
599 	/* Verify archive format. */
600 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
601 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
602 
603 	/* Close the archive. */
604 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
605 cleanup:
606 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
607 }
608 
609 DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP932)
610 {
611 	const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio";
612 	struct archive *a;
613 	struct archive_entry *ae;
614 
615 	/*
616 	 * Read UTF-8 filename in CP932/SJIS with "hdrcharset=UTF-8" option.
617 	 */
618 	if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
619 	    NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
620 		skipping("CP932 locale not available on this system.");
621 		return;
622 	}
623 	extract_reference_file(refname);
624 
625 	assert((a = archive_read_new()) != NULL);
626 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
627 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
628 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
629 		skipping("This system cannot convert character-set"
630 		    " from UTF-8 to CP932.");
631 		goto cleanup;
632 	}
633 	assertEqualIntA(a, ARCHIVE_OK,
634 	    archive_read_open_filename(a, refname, 10240));
635 
636 	/* Verify regular file. */
637 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
638 	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
639 	assertEqualString("\x8a\xbf\x8e\x9a.txt", archive_entry_pathname(ae));
640 	assertEqualInt(8, archive_entry_size(ae));
641 
642 	/* Verify regular file. */
643 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
644 	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
645 	assertEqualString("\x95\x5c.txt", archive_entry_pathname(ae));
646 	assertEqualInt(4, archive_entry_size(ae));
647 
648 	/* End of archive. */
649 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
650 
651 	/* Verify archive format. */
652 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
653 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
654 
655 	/* Close the archive. */
656 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
657 cleanup:
658 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
659 }
660 
661 DEFINE_TEST(test_read_format_cpio_filename_CP866_CP1251)
662 {
663 	const char *refname = "test_read_format_cpio_filename_cp866.cpio";
664 	struct archive *a;
665 	struct archive_entry *ae;
666 
667 	/*
668 	 * Read CP866 filename in CP1251 with "hdrcharset=CP866" option.
669 	 */
670 	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
671 	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
672 		skipping("CP1251 locale not available on this system.");
673 		return;
674 	}
675 	extract_reference_file(refname);
676 
677 	assert((a = archive_read_new()) != NULL);
678 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
679 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
680 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=CP866")) {
681 		skipping("This system cannot convert character-set"
682 		    " from CP866 to CP1251.");
683 		goto cleanup;
684 	}
685 	assertEqualIntA(a, ARCHIVE_OK,
686 	    archive_read_open_filename(a, refname, 10240));
687 
688 	/* Verify regular file. */
689 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
690 	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
691 	    archive_entry_pathname(ae));
692 	assertEqualInt(6, archive_entry_size(ae));
693 
694 	/* Verify regular file. */
695 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
696 	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
697 	    archive_entry_pathname(ae));
698 	assertEqualInt(6, archive_entry_size(ae));
699 
700 
701 	/* End of archive. */
702 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
703 
704 	/* Verify archive format. */
705 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
706 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
707 
708 	/* Close the archive. */
709 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
710 cleanup:
711 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
712 }
713 
714 /*
715  * This test only for Windows platform because other archiver
716  * applications on Windows translate CP1251 filenames into CP866
717  * filenames and store it in the cpio file and so we should read
718  * it by default on Windows.
719  */
720 DEFINE_TEST(test_read_format_cpio_filename_CP866_CP1251_win)
721 {
722 	const char *refname = "test_read_format_cpio_filename_cp866.cpio";
723 	struct archive *a;
724 	struct archive_entry *ae;
725 
726 	/*
727 	 * Read CP866 filename in CP1251 without "hdrcharset=CP866" option.
728 	 */
729 	if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
730 		skipping("Russian_Russia locale not available on this system.");
731 		return;
732 	}
733 	extract_reference_file(refname);
734 
735 	assert((a = archive_read_new()) != NULL);
736 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
737 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
738 	assertEqualIntA(a, ARCHIVE_OK,
739 	    archive_read_open_filename(a, refname, 10240));
740 
741 	/* Verify regular file. */
742 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
743 	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
744 	    archive_entry_pathname(ae));
745 	assertEqualInt(6, archive_entry_size(ae));
746 
747 	/* Verify regular file. */
748 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
749 	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
750 	    archive_entry_pathname(ae));
751 	assertEqualInt(6, archive_entry_size(ae));
752 
753 
754 	/* End of archive. */
755 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
756 
757 	/* Verify archive format. */
758 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
759 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
760 
761 	/* Close the archive. */
762 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
763 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
764 }
765 
766 DEFINE_TEST(test_read_format_cpio_filename_KOI8R_CP1251)
767 {
768 	const char *refname = "test_read_format_cpio_filename_koi8r.cpio";
769 	struct archive *a;
770 	struct archive_entry *ae;
771 
772 	/*
773 	 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
774 	 */
775 	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
776 	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
777 		skipping("CP1251 locale not available on this system.");
778 		return;
779 	}
780 	extract_reference_file(refname);
781 
782 	assert((a = archive_read_new()) != NULL);
783 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
784 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
785 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=KOI8-R")) {
786 		skipping("This system cannot convert character-set"
787 		    " from KOI8-R to CP1251.");
788 		goto cleanup;
789 	}
790 	assertEqualIntA(a, ARCHIVE_OK,
791 	    archive_read_open_filename(a, refname, 10240));
792 
793 	/* Verify regular file. */
794 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
795 	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
796 	    archive_entry_pathname(ae));
797 	assertEqualInt(6, archive_entry_size(ae));
798 
799 	/* Verify regular file. */
800 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
801 	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
802 	    archive_entry_pathname(ae));
803 	assertEqualInt(6, archive_entry_size(ae));
804 
805 
806 	/* End of archive. */
807 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
808 
809 	/* Verify archive format. */
810 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
811 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
812 
813 	/* Close the archive. */
814 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
815 cleanup:
816 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
817 }
818 
819 DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP1251)
820 {
821 	const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio";
822 	struct archive *a;
823 	struct archive_entry *ae;
824 
825 	/*
826 	 * Read KOI8-R filename in CP1251 with "hdrcharset=KOI8-R" option.
827 	 */
828 	if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
829 	    NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
830 		skipping("CP1251 locale not available on this system.");
831 		return;
832 	}
833 	extract_reference_file(refname);
834 
835 	assert((a = archive_read_new()) != NULL);
836 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
837 	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
838 	if (ARCHIVE_OK != archive_read_set_options(a, "hdrcharset=UTF-8")) {
839 		skipping("This system cannot convert character-set"
840 		    " from UTF-8 to CP1251.");
841 		goto cleanup;
842 	}
843 	assertEqualIntA(a, ARCHIVE_OK,
844 	    archive_read_open_filename(a, refname, 10240));
845 
846 	/* Verify regular file. */
847 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
848 	assertEqualString("\xcf\xd0\xc8\xc2\xc5\xd2",
849 	    archive_entry_pathname(ae));
850 	assertEqualInt(6, archive_entry_size(ae));
851 
852 	/* Verify regular file. */
853 	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
854 	assertEqualString("\xef\xf0\xe8\xe2\xe5\xf2",
855 	    archive_entry_pathname(ae));
856 	assertEqualInt(6, archive_entry_size(ae));
857 
858 
859 	/* End of archive. */
860 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
861 
862 	/* Verify archive format. */
863 	assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0));
864 	assertEqualIntA(a, ARCHIVE_FORMAT_CPIO_POSIX, archive_format(a));
865 
866 	/* Close the archive. */
867 	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
868 cleanup:
869 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
870 }
871 
872