/src/serenity/Userland/Libraries/LibArchive/Tar.cpp
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2020, Peter Elliott <pelliott@serenityos.org> |
3 | | * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org> |
4 | | * |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #include "Tar.h" |
9 | | |
10 | | namespace Archive { |
11 | | |
12 | | unsigned TarFileHeader::expected_checksum() const |
13 | 7.47k | { |
14 | 7.47k | auto checksum = 0u; |
15 | 7.47k | u8 const* u8_this = reinterpret_cast<u8 const*>(this); |
16 | 7.47k | u8 const* u8_m_checksum = reinterpret_cast<u8 const*>(&m_checksum); |
17 | 3.74M | for (auto i = 0u; i < sizeof(TarFileHeader); ++i) { |
18 | 3.73M | if (u8_this + i >= u8_m_checksum && u8_this + i < u8_m_checksum + sizeof(m_checksum)) { |
19 | 59.7k | checksum += ' '; |
20 | 3.67M | } else { |
21 | 3.67M | checksum += u8_this[i]; |
22 | 3.67M | } |
23 | 3.73M | } |
24 | 7.47k | return checksum; |
25 | 7.47k | } |
26 | | |
27 | | ErrorOr<void> TarFileHeader::calculate_checksum() |
28 | 0 | { |
29 | 0 | memset(m_checksum, ' ', sizeof(m_checksum)); |
30 | |
|
31 | 0 | auto octal = TRY(String::formatted("{:06o}", expected_checksum())); |
32 | 0 | bool copy_successful = octal.bytes_as_string_view().copy_characters_to_buffer(m_checksum, sizeof(m_checksum)); |
33 | 0 | VERIFY(copy_successful); |
34 | | |
35 | 0 | return {}; |
36 | 0 | } |
37 | | |
38 | | bool TarFileHeader::is_zero_block() const |
39 | 8.16k | { |
40 | 8.16k | u8 const* buffer = reinterpret_cast<u8 const*>(this); |
41 | 413k | for (size_t i = 0; i < sizeof(TarFileHeader); ++i) { |
42 | 412k | if (buffer[i] != 0) |
43 | 7.48k | return false; |
44 | 412k | } |
45 | 684 | return true; |
46 | 8.16k | } |
47 | | |
48 | | bool TarFileHeader::content_is_like_extended_header() const |
49 | 12.1k | { |
50 | 12.1k | return type_flag() == TarFileType::ExtendedHeader || type_flag() == TarFileType::GlobalExtendedHeader; |
51 | 12.1k | } |
52 | | |
53 | | void TarFileHeader::set_filename_and_prefix(StringView filename) |
54 | 0 | { |
55 | | // FIXME: Add support for extended tar headers for longer filenames. |
56 | 0 | VERIFY(filename.length() <= sizeof(m_filename) + sizeof(m_prefix)); |
57 | | |
58 | 0 | if (filename.length() <= sizeof(m_filename)) { |
59 | 0 | set_prefix(""sv); |
60 | 0 | set_filename(filename); |
61 | 0 | return; |
62 | 0 | } |
63 | | |
64 | 0 | Optional<size_t> slash = filename.find('/', filename.length() - sizeof(m_filename)); |
65 | |
|
66 | 0 | VERIFY(slash.has_value()); |
67 | 0 | set_prefix(filename.substring_view(0, slash.value() + 1)); |
68 | 0 | set_filename(filename.substring_view(slash.value() + 1)); |
69 | 0 | } |
70 | | |
71 | | } |