| 576 /* Process an archive file. This involves reading the blocks one at a time |
576 /* Process an archive file. This involves reading the blocks one at a time |
| 577 * and passing them to a untar() function. |
577 * and passing them to a untar() function. |
| 578 */ |
578 */ |
| 579 int untar(const char *filename, const char* destdir, untar_opt options) { |
579 int untar(const char *filename, const char* destdir, untar_opt options) { |
| 580 int ret=1; |
580 int ret=1; |
| 581 char curdir[_MAX_PATH]; |
581 wchar_t curdir[_MAX_PATH]; |
| |
582 wchar_t *w_destdir; |
| 582 untarops = options; |
583 untarops = options; |
| 583 /* open the archive */ |
584 /* open the archive */ |
| 584 inname = filename; |
585 inname = filename; |
| 585 infp = g_fopen(filename, "rb"); |
586 infp = g_fopen(filename, "rb"); |
| 586 if (!infp) |
587 if (!infp) |
| 587 { |
588 { |
| 588 untar_error("Error opening: %s\n", filename); |
589 untar_error("Error opening: %s\n", filename); |
| 589 return 0; |
590 return 0; |
| 590 } |
591 } |
| 591 |
592 |
| |
593 w_destdir = g_utf8_to_utf16(destdir, -1, NULL, NULL, NULL); |
| |
594 |
| 592 /* Set current directory */ |
595 /* Set current directory */ |
| 593 if(!GetCurrentDirectory(_MAX_PATH, curdir)) { |
596 if(!GetCurrentDirectoryW(_MAX_PATH, curdir)) { |
| 594 untar_error("Could not get current directory (error %lu).\n", GetLastError()); |
597 untar_error("Could not get current directory (error %lu).\n", GetLastError()); |
| 595 fclose(infp); |
598 fclose(infp); |
| 596 return 0; |
599 return 0; |
| 597 } |
600 } |
| 598 if(!SetCurrentDirectory(destdir)) { |
601 if(!SetCurrentDirectoryW(w_destdir)) { |
| 599 untar_error("Could not set current directory to (error %lu): %s\n", GetLastError(), destdir); |
602 untar_error("Could not set current directory to (error %lu): %s\n", GetLastError(), destdir); |
| 600 fclose(infp); |
603 fclose(infp); |
| 601 return 0; |
604 return 0; |
| 602 } else { |
605 } else { |
| 603 /* UNCOMPRESSED */ |
606 /* UNCOMPRESSED */ |
| 612 if (outsize > 0 && ret) { |
615 if (outsize > 0 && ret) { |
| 613 untar_warning("Last file might be truncated!\n"); |
616 untar_warning("Last file might be truncated!\n"); |
| 614 fclose(outfp); |
617 fclose(outfp); |
| 615 outfp = NULL; |
618 outfp = NULL; |
| 616 } |
619 } |
| 617 if(!SetCurrentDirectory(curdir)) { |
620 if(!SetCurrentDirectoryW(curdir)) { |
| 618 untar_error("Could not set current dir back to original (error %lu).\n", GetLastError()); |
621 untar_error("Could not set current dir back to original (error %lu).\n", GetLastError()); |
| 619 ret=0; |
622 ret=0; |
| 620 } |
623 } |
| 621 } |
624 } |
| 622 |
625 |
| |
626 g_free(w_destdir); |
| |
627 |
| 623 /* close the archive file. */ |
628 /* close the archive file. */ |
| 624 fclose(infp); |
629 fclose(infp); |
| 625 |
630 |
| 626 return ret; |
631 return ret; |
| 627 } |
632 } |