Disk ARchive 2.8.0
Full featured and portable backup and archiving tool
Loading...
Searching...
No Matches
cat_inode.hpp
Go to the documentation of this file.
1/*********************************************************************/
2// dar - disk archive - a backup/restoration program
3// Copyright (C) 2002-2025 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 CAT_INODE_HPP
27#define CAT_INODE_HPP
28
29#include "../my_config.h"
30
31extern "C"
32{
33} // end extern "C"
34
35#include "infinint.hpp"
36#include "ea.hpp"
37#include "integers.hpp"
38#include "mask.hpp"
39#include "user_interaction.hpp"
41#include "datetime.hpp"
42#include "cat_nomme.hpp"
43#include "archive_aux.hpp"
44
45namespace libdar
46{
49
51
52 class cat_inode : public cat_nomme
53 {
54 public:
55
57
58 cat_inode(const infinint & xuid,
59 const infinint & xgid,
60 U_16 xperm,
61 const datetime & last_access,
62 const datetime & last_modif,
63 const datetime & last_change,
64 const std::string & xname,
65 const infinint & device);
66 cat_inode(const std::shared_ptr<user_interaction> & dialog,
68 const archive_version & reading_ver,
70 bool small);
71 cat_inode(const cat_inode & ref);
72 cat_inode(cat_inode && ref) noexcept: cat_nomme(std::move(ref)) { nullifyptr(); move_from(std::move(ref)); };
73 cat_inode & operator = (const cat_inode & ref);
74 cat_inode & operator = (cat_inode && ref) { cat_nomme::operator = (std::move(ref)); move_from(std::move(ref)); return *this; };
75 ~cat_inode() noexcept(false);
76
77 const infinint & get_uid() const { return uid; };
78 const infinint & get_gid() const { return gid; };
79 U_16 get_perm() const { return perm; };
80 datetime get_last_access() const { return last_acc; };
81 datetime get_last_modif() const { return last_mod; };
82 void set_last_access(const datetime & x_time) { last_acc = x_time; };
83 void set_last_modif(const datetime & x_time) { last_mod = x_time; };
84 infinint get_device() const { if(fs_dev == nullptr) throw SRC_BUG; return *fs_dev; };
85
86 bool same_as(const cat_inode & ref) const;
87 bool is_more_recent_than(const cat_inode & ref, const infinint & hourshift) const;
88 // used for RESTORATION
89 virtual bool has_changed_since(const cat_inode & ref, const infinint & hourshift, comparison_fields what_to_check) const;
90 // signature() left as an abstract method
91 // clone is abstract too
92 // used for INCREMENTAL BACKUP
93
94 void compare(const cat_inode &other,
95 const mask & ea_mask,
96 comparison_fields what_to_check,
97 const infinint & hourshift,
98 bool symlink_date,
99 const fsa_scope & scope,
100 bool isolated_mode,
101 bool seq_read_mode
102 ) const;
103 // throw Erange exception if a difference has been detected
104 // this is not a symetrical comparison, but all what is present
105 // in the current object is compared against the argument
106 // which may contain supplementary informations
107 // used for DIFFERENCE
108
109
110
112 // EXTENDED ATTRIBUTES Methods
113 //
114
115 // I : to know whether EA data is present or not for this object
116 void ea_set_saved_status(ea_saved_status status);
117 ea_saved_status ea_get_saved_status() const { return ea_saved; };
118
119 // II : to associate EA list to an cat_inode object (mainly for backup operation) #EA_FULL only#
120 void ea_attach(ea_attributs *ref);
121
123 const ea_attributs *get_ea() const; // #<-- EA_FULL *and* EA_REMOVED# for this call only
124 void ea_detach() const; //discards any future call to get_ea() !
125 infinint ea_get_size() const; //returns the size of EA (still valid if ea have been detached) mainly used to define CRC width
126
127 // III : to record where is dump the EA in the archive #EA_FULL only#
128 void ea_set_offset(const infinint & pos);
129 bool ea_get_offset(infinint & pos) const;
130 void ea_set_crc(const crc & val);
131 void ea_get_crc(const crc * & ptr) const;
132 bool ea_get_crc_size(infinint & val) const;
133
134 // IV : to know/record if EA and FSA have been modified # any EA status# and FSA status #
135 datetime get_last_change() const { return last_cha; };
136 void set_last_change(const datetime & x_time) { last_cha = x_time; };
137 bool has_last_change() const { return !last_cha.is_null(); };
138 // old format did provide last_change only when EA were present, since archive
139 // format 8, this field is always present even in absence of EA. Thus it is
140 // still necessary to check if the cat_inode has a last_change() before
141 // using get_last_change() (depends on the version of the archive read).
142
143
145 // FILESYSTEM SPECIFIC ATTRIBUTES Methods
146 //
147
148 // I : which FSA are present
149 void fsa_set_saved_status(fsa_saved_status status);
150 fsa_saved_status fsa_get_saved_status() const { return fsa_saved; };
152 fsa_scope fsa_get_families() const { if(fsa_families == nullptr) throw SRC_BUG; return infinint_to_fsa_scope(*fsa_families); };
153
154
155
156 // II : add or drop FSA list to the cat_inode
157 void fsa_attach(filesystem_specific_attribute_list *ref);
158 void fsa_partial_attach(const fsa_scope & val); // #<-- FSA_PARTIAL only
159 const filesystem_specific_attribute_list *get_fsa() const; // #<-- FSA_FULL only
160 void fsa_detach() const; // discard any future call to get_fsa() !
161 infinint fsa_get_size() const; // returns the size of FSA (still valid if fsal has been detached) / mainly used to define CRC size
162
163 // III : to record where FSA are dumped in the archive (only if fsa_status not empty !)
164 void fsa_set_offset(const infinint & pos);
165 bool fsa_get_offset(infinint & pos) const;
166 void fsa_set_crc(const crc & val);
167 void fsa_get_crc(const crc * & ptr) const;
168 bool fsa_get_crc_size(infinint & val) const;
169
170 protected:
171 virtual void sub_compare(const cat_inode & other,
172 bool isolated_mode,
173 bool seq_read_mode) const {};
174 bool get_small_read() const { return small_read; };
175
176 // inherited from cat_entree
177 virtual void inherited_dump(const pile_descriptor & pdesc, bool small) const override;
178
179
180 private :
183 U_16 perm;
189
191
192 // the following is used only if ea_saved == full
196 // the following is used if ea_saved == full or ea_saved == partial or
198
204 //
207
208
209 void nullifyptr() noexcept;
210 void destroy() noexcept;
211 void copy_from(const cat_inode & ref);
212 void move_from(cat_inode && ref) noexcept;
213
214 static const ea_attributs empty_ea;
215 };
216
218
219} // end of namespace
220
221#endif
set of datastructures used to interact with a catalogue object
base class of all objects contained in a catalogue and that can be named
class archive_version manages the version of the archive format
the root class for all cat_inode
Definition cat_inode.hpp:53
infinint * ea_size
storage size required by EA
datetime last_mod
last modification time (mtime)
datetime last_acc
last access time (atime)
U_16 perm
inode's permission
bool ea_get_crc_size(infinint &val) const
returns true if crc is know and puts its width in argument
archive_version edit
need to know EA and FSA format used in archive file
virtual void inherited_dump(const pile_descriptor &pdesc, bool small) const override
true if object has been created by sequential reading of an archive
ea_attributs * ea
Extended Attributes read or to be written down.
infinint uid
inode owner's user ID
infinint * fsa_size
storage size required for FSA
cat_inode(const infinint &xuid, const infinint &xgid, U_16 xperm, const datetime &last_access, const datetime &last_modif, const datetime &last_change, const std::string &xname, const infinint &device)
flag used to only consider certain fields when comparing/restoring inodes
infinint * fsa_families
list of FSA families present for that inode (set to nullptr in fsa_none mode)
crc * fsa_crc
CRC computed on FSA.
bool small_read
whether we the object has been built with sequential-reading
const ea_attributs * get_ea() const
the returned value is the address of an existing file of the cat_inode object and shall not be delete...
void ea_get_crc(const crc *&ptr) const
the argument is set to point to an allocated crc object owned by this "cat_inode" object,...
infinint * fs_dev
filesystem ID on which resides the inode (only used when read from filesystem)
crc * ea_crc
CRC computed on EA.
infinint * ea_offset
offset in archive where to find EA
ea_saved_status ea_saved
inode Extended Attribute status
datetime last_cha
last inode meta data change (ctime)
fsa_saved_status fsa_saved
inode Filesystem Specific Attribute status
infinint * fsa_offset
offset in archive where to find FSA # always allocated (to be reviewed)
filesystem_specific_attribute_list * fsal
Filesystem Specific Attributes read or to be written down # only allocated if fsa_saved if set to FUL...
infinint gid
inode owner's group ID
void compare(const cat_inode &other, const mask &ea_mask, comparison_fields what_to_check, const infinint &hourshift, bool symlink_date, const fsa_scope &scope, bool isolated_mode, bool seq_read_mode) const
fsa_scope fsa_get_families() const
gives the set of FSA family recorded for that inode
the base class for all entry that have a name
Definition cat_nomme.hpp:45
pure virtual class defining interface of a CRC object
Definition crc.hpp:47
stores time information
Definition datetime.hpp:59
bool is_null() const
return true if the datetime is exactly January 1st, 1970, 0 h 0 mn 0 s
Definition datetime.hpp:131
the class ea_attributs manages the set of EA that can be associated to an inode
Definition ea.hpp:48
the arbitrary large positive integer class
the generic class, parent of all masks
Definition mask.hpp:62
smart pointer class to be used to automagically manage multiple time pointed to address
this file contains the definition of class datetime that stores unix times in a portable way
contains a set of routines to manage EA values associated to a file
filesystem specific attributes
comparison_fields
how to consider file change during comparison and incremental backup
fsa_scope infinint_to_fsa_scope(const infinint &ref)
convert an infinint to fsa_scape
std::set< fsa_family > fsa_scope
set of fsa families
fsa_saved_status
FSA saved status for an entry.
saved_status
data saved status for an entry
ea_saved_status
EA saved status for an entry.
@ saved
inode is saved in the archive
switch module to limitint (32 ou 64 bits integers) or infinint
are defined here basic integer types that tend to be portable
here lies a collection of mask classes
include macro defined by the configure script and some specific additional ones
libdar namespace encapsulate all libdar symbols
Definition archive.hpp:47
defines the interaction interface between libdar and users.