Disk ARchive 2.8.3
Full featured and portable backup and archiving tool
Loading...
Searching...
No Matches
sar.hpp
Go to the documentation of this file.
1/*********************************************************************/
2// dar - disk archive - a backup/restoration program
3// Copyright (C) 2002-2026 Denis Corbin
4//
5// This program is free software; you can redistribute it and/or
6// modify it under the terms of the GNU General Public License
7// as published by the Free Software Foundation; either version 2
8// of the License, or (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program; if not, write to the Free Software
17// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18//
19// to contact the author, see the AUTHOR file
20/*********************************************************************/
21
25
26#ifndef SAR_HPP
27#define SAR_HPP
28
29#include "../my_config.h"
30
31#include <string>
32#include "infinint.hpp"
33#include "generic_file.hpp"
34#include "header.hpp"
35#include "integers.hpp"
36#include "entrepot.hpp"
37#include "slice_layout.hpp"
38#include "contextual.hpp"
39#include "mem_ui.hpp"
41
42namespace libdar
43{
44 // contextual is defined in generic_file module
45
48
50
55 class sar : public generic_file, public contextual, protected mem_ui
56 {
57 public:
58
60
83 sar(const std::shared_ptr<user_interaction> & dialog,
84 const std::string & base_name,
85 const std::string & extension,
86 const std::shared_ptr<entrepot> & where,
87 bool by_the_end,
88 const infinint & x_min_digits,
89 bool sequential_read,
90 bool lax = false,
91 const std::string & execute = "");
92
93
95
116 sar(const std::shared_ptr<user_interaction> & dialog,
117 gf_mode open_mode,
118 const std::string & base_name,
119 const std::string & extension,
120 const infinint & file_size,
121 const infinint & first_file_size,
122 bool x_warn_overwrite,
123 bool x_allow_overwrite,
124 const infinint & pause,
125 const std::shared_ptr<entrepot> & where,
126 const label & internal_name,
127 const label & data_name,
128 bool force_permission,
129 U_I permission,
130 hash_algo x_hash,
131 const infinint & x_min_digits,
132 bool format_07_compatible,
133 const std::string & execute = "");
134
136 sar(const sar & ref) = delete;
137
139 sar(sar && ref) noexcept = delete;
140
142 sar & operator = (const sar & ref) = delete;
143
145 sar & operator = (sar && ref) noexcept = delete;
146
149
150 // inherited from generic_file
151 virtual bool skippable(skippability direction, const infinint & amount) override;
152 virtual bool skip(const infinint &pos) override;
153 virtual bool skip_to_eof() override;
154 virtual bool skip_relative(S_I x) override;
155 virtual bool truncatable(const infinint & pos) const override;
156 virtual infinint get_position() const override;
157
158 // informational routines
159 const slice_layout & get_slicing() const { return slicing; };
160 bool get_total_file_number(infinint &num) const { num = of_last_file_num; return of_last_file_known; };
161 bool get_last_file_size(infinint &num) const { num = of_last_file_size; return of_last_file_known; };
162
163 // disable execution of user command when destroying the current object
164 void disable_natural_destruction() { natural_destruction = false; };
165
166 // enable back execution of user command when destroying the current object
167 void enable_natural_destruction() { natural_destruction = true; };
168
169 // true if sar's header is from an old archive format (<= "07")
170 virtual bool is_an_old_start_end_archive() const override { return slicing.older_sar_than_v8; };
171
172 // return the internal_name used to link slices toghether
173 const label & get_internal_name_used() const { return of_internal_name; };
174
175 // return the data_name used to link slices toghether
176 virtual const label & get_data_name() const override { return of_data_name; };
177
178 const std::shared_ptr<entrepot> & get_entrepot() const { return entr; };
179
181 const infinint & get_first_slice_header_size() const { return slicing.first_slice_header; };
182
184 const infinint & get_non_first_slice_header_size() const { return slicing.other_slice_header; };
185
186 protected :
187 virtual void inherited_read_ahead(const infinint & amount) override;
188 virtual U_I inherited_read(char *a, U_I size) override;
189 virtual void inherited_write(const char *a, U_I size) override;
190 virtual void inherited_truncate(const infinint & pos) override;
191 virtual void inherited_sync_write() override {}; // nothing to do
192 virtual void inherited_flush_read() override {}; // nothing to do
193 virtual void inherited_terminate() override;
194
195 private :
196 std::shared_ptr<entrepot> entr;
197 std::string base;
198 std::string ext;
199 std::string hook;
200 slice_layout slicing;
205 // these following variables are modified by open_file / open_file_init
206 // else the are used only for reading
216 U_I perm;
218 char of_flag;
219 bool initial;
220 // these are the option flags
223 //
225 bool lax;
227 bool seq_read;
229
230 bool skip_forward(U_I x);
231 bool skip_backward(U_I x);
232 void close_file(bool terminal);
233 void open_readonly(const std::string & fic,
234 const infinint &num,
235 bool bytheend
236 );
237 void open_writeonly(const std::string & fic,
238 const infinint &num,
239 bool bytheend
240 );
242 void open_file(infinint num, bool bytheend);
243 void set_offset(infinint offset);
244 void open_last_file(bool bytheend);
247 header make_write_header(const infinint &num, char flag);
248
249 // function to lauch the eventually existing command to execute after/before each slice
250 void hook_execute(const infinint &num);
251 };
252
254
255} // end of namespace
256
257#endif
abstraction of filesystem files for entrepot
this class manages the header of each slice
Definition header.hpp:66
the arbitrary large positive integer class
manage label data structure used in archive slice headers
Definition label.hpp:43
mem_ui(const std::shared_ptr< user_interaction > &dialog)
constructor
virtual U_I inherited_read(char *a, U_I size) override
implementation of read() operation
infinint size_of_current
size of the current slice (used in reading mode only)
Definition sar.hpp:208
sar & operator=(const sar &ref)=delete
assignment operator
bool skip_backward(U_I x)
skip backward in sar global contents
std::string hook
command line to execute between slices
Definition sar.hpp:199
void open_file(infinint num, bool bytheend)
close current slice and open the slice 'num'
label of_data_name
internal name linked to data (transparent to dar_xform and used by isolated catalogue as reference)
Definition sar.hpp:214
virtual void inherited_terminate() override
destructor-like call, except that it is allowed to throw exceptions
infinint to_read_ahead
amount of data to read ahead for next slices
Definition sar.hpp:226
bool opt_warn_overwrite
a warning must be issued before overwriting a slice
Definition sar.hpp:221
infinint of_last_file_num
number of the last slice (if met)
Definition sar.hpp:211
fichier_global * of_fd
file object currently openned
Definition sar.hpp:217
thread_cancellation thr
used to know whether to ask the user or assume negative answer to allow proper archive terminatio
Definition sar.hpp:228
infinint pause
do we pause between slices
Definition sar.hpp:224
bool is_current_eof_a_normal_end_of_slice() const
return true if current reading position is at end of slice
bool initial
do not launch hook command-line during sar initialization
Definition sar.hpp:219
virtual void inherited_truncate(const infinint &pos) override
truncate file at the give offset
std::shared_ptr< entrepot > entr
where are stored slices
Definition sar.hpp:196
virtual bool is_an_old_start_end_archive() const override
returns whether the archive is a old archive (format < 8)
Definition sar.hpp:170
bool opt_allow_overwrite
is slice overwriting allowed
Definition sar.hpp:222
bool seq_read
whether sequential read has been requested
Definition sar.hpp:227
const infinint & get_non_first_slice_header_size() const
get the non first slice header
Definition sar.hpp:184
sar(const std::shared_ptr< user_interaction > &dialog, gf_mode open_mode, const std::string &base_name, const std::string &extension, const infinint &file_size, const infinint &first_file_size, bool x_warn_overwrite, bool x_allow_overwrite, const infinint &pause, const std::shared_ptr< entrepot > &where, const label &internal_name, const label &data_name, bool force_permission, U_I permission, hash_algo x_hash, const infinint &x_min_digits, bool format_07_compatible, const std::string &execute="")
this constructor creates a new set of slices
virtual void inherited_read_ahead(const infinint &amount) override
tells the object that several calls to read() will follow to probably obtain at least the given amoun...
void open_writeonly(const std::string &fic, const infinint &num, bool bytheend)
void set_offset(infinint offset)
skip to current slice relative offset
bool lax
whether to try to go further reading problems
Definition sar.hpp:225
~sar()
destructor
virtual bool truncatable(const infinint &pos) const override
whether the implementation is able to truncate to the given position
std::string base
archive base name
Definition sar.hpp:197
virtual bool skippable(skippability direction, const infinint &amount) override
whether the implementation is able to skip
bool force_perm
true if any future slice has its permission to be set explicitely
Definition sar.hpp:215
label of_internal_name
internal name shared in all slice header
Definition sar.hpp:213
char of_flag
flags of the open file
Definition sar.hpp:218
bool of_last_file_known
whether the T terminal slice has been met
Definition sar.hpp:210
infinint of_current
number of the open slice
Definition sar.hpp:207
hash_algo hash
whether to build a hashing when creating slices, and if so, which algorithm to use
Definition sar.hpp:202
void close_file(bool terminal)
close current openned file, adding (in write mode only) a terminal mark (last slice) or not
bool skip_forward(U_I x)
skip forward in sar global contents
virtual bool skip(const infinint &pos) override
skip at the absolute position
virtual void inherited_flush_read() override
reset internal engine, flush caches in order to read the data at current position
Definition sar.hpp:192
sar(sar &&ref) noexcept=delete
move constructor
sar(const std::shared_ptr< user_interaction > &dialog, const std::string &base_name, const std::string &extension, const std::shared_ptr< entrepot > &where, bool by_the_end, const infinint &x_min_digits, bool sequential_read, bool lax=false, const std::string &execute="")
this constructor reads data from a set of slices
infinint bytes_still_to_read_in_slice() const
returns the number of bytes expected before the end of slice
infinint min_digits
minimum number of digits the slices number is stored with in the filename
Definition sar.hpp:203
const infinint & get_first_slice_header_size() const
get the first slice header
Definition sar.hpp:181
virtual bool skip_relative(S_I x) override
skip relatively to the current position
void open_readonly(const std::string &fic, const infinint &num, bool bytheend)
U_I perm
if force_perm is true, value to use for slice permission
Definition sar.hpp:216
sar(const sar &ref)=delete
the copy constructor
virtual bool skip_to_eof() override
skip to the end of file
virtual const label & get_data_name() const override
obtain the data_name of the archive (label associated with the archive's data)
Definition sar.hpp:176
virtual void inherited_write(const char *a, U_I size) override
implementation of the write() operation
infinint of_max_seen
highest slice number seen so far
Definition sar.hpp:209
virtual infinint get_position() const override
get the current read/write position
void open_file_init()
initialize some of_* fields
virtual void inherited_sync_write() override
write down any pending data
Definition sar.hpp:191
infinint of_last_file_size
size of the last slice (if met)
Definition sar.hpp:212
infinint file_offset
current reading/writing position in the current slice (relative to the whole slice file,...
Definition sar.hpp:201
bool natural_destruction
whether to execute commands between slices on object destruction
Definition sar.hpp:204
void open_last_file(bool bytheend)
open the last slice, ask the user, test, until last slice available
std::string ext
archive extension
Definition sar.hpp:198
slice_layout slicing
slice layout
Definition sar.hpp:200
class to be used as parent to provide checkpoints to inherited classes
class contextual adds the information of phases in the generic_file
hash_algo
hashing algorithm available
gf_mode
generic_file openning modes
slice header structure is defined here
include macro defined by the configure script and some specific additional ones
libdar namespace encapsulate all libdar symbols
object describing the slicing of an archive
defines the entrepot interface.
class generic_file is defined here as well as class fichier
switch module to limitint (32 ou 64 bits integers) or infinint
are defined here basic integer types that tend to be portable
class mem_ui definition. This class is to be used as parent class to handle user_interaction object m...
to be able to cancel libdar operation while running in a given thread.