| Disk ARchive 2.8.6 Full featured and portable backup and archiving tool

Loading...
Searching...
No Matches
tools.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
27#ifndef TOOLS_HPP
28#define TOOLS_HPP
29
30#include "../my_config.h"
31
32 extern "C"
33{
34#if HAVE_SIGNAL_H
35#include <signal.h>
36#endif
37#if HAVE_GPGME_H
38#include <gpgme.h>
39#endif
40}
41
42#include <string>
43#include <vector>
44#include <deque>
45#include <map>
46#include <set>
47#include <cstdarg>
48#include "path.hpp"
49#include "infinint.hpp"
50#include "generic_file.hpp"
51#include "integers.hpp"
52#include "tlv_list.hpp"
53#include "datetime.hpp"
54#include "entrepot.hpp"
55
56 namespace libdar
57{
58
61
62
64 extern void tools_init();
66 extern void tools_end();
67
69
72 extern void tools_write_string(generic_file & f, const std::string & s);
73
75
78 extern void tools_read_string(generic_file & f, std::string & s);
79
81
84 extern void tools_write_string_all(generic_file & f, const std::string & s);
85
87
91 extern void tools_read_string_size(generic_file & f, std::string & s, infinint taille);
92
94
97 extern infinint tools_get_filesize(const path &p);
98
104 extern std::string tools_display_integer_in_metric_system(infinint number, const std::string & unit, bool binary);
105
107
113 extern std::string::iterator tools_find_last_char_of(std::string &s, unsigned char v);
114
116
119 extern void tools_blocking_read(int fd, bool mode);
120
122
125 extern std::string tools_name_of_uid(const infinint & uid);
126
128
131 extern std::string tools_name_of_gid(const infinint & gid);
132
134
137 extern std::string tools_uword2str(U_16 x);
138
140
143 extern std::string tools_int2str(S_I x);
144 extern std::string tools_uint2str(U_I x);
145
147
151 extern std::string tools_addspacebefore(std::string s, U_I expected_size);
152
154
158 extern std::string tools_display_date(const datetime & date, bool fully_detailed = false);
159
161
166 extern char *tools_str2charptr(const std::string &x);
167
169
172 extern U_I tools_str2int(const std::string & x);
173
175
178 extern void tools_system(user_interaction & dialog, const std::vector<std::string> & argvector);
179
181
187 extern void tools_system_with_pipe(const std::shared_ptr<user_interaction> & dialog,
188 const std::string & dar_cmd,
189 const std::vector<std::string> & argvpipe);
190
192
195 extern void tools_write_vector(generic_file & f, const std::vector<std::string> & x);
196
198
201 extern void tools_read_vector(generic_file & f, std::vector<std::string> & x);
202
204
208 extern std::string tools_concat_vector(const std::string & separator,
209 const std::vector<std::string> & x);
210
212
216 std::vector<std::string> operator + (std::vector<std::string> a, std::vector<std::string> b);
217
218
220
225 extern bool tools_is_equal_with_hourshift(const infinint & hourshift, const datetime & date1, const datetime & date2);
226
228
229 template <class T> std::vector<T> operator +=(std::vector<T> & a, const std::vector<T> & b)
230 {
231 a = a + b;
232 return a;
233 }
234
235
236
238
242 extern std::string tools_readlink(const char *root);
243
245
251 extern void tools_noexcept_make_date(const std::string & chem, bool symlink, const datetime & last_acc, const datetime & last_mod, const datetime & birth);
252
254
261 extern void tools_make_date(const std::string & chemin, bool symlink, const datetime & access, const datetime & modif, const datetime & birth);
262
264
268 extern bool tools_is_case_insensitive_equal(const std::string & a, const std::string & b);
269
276 extern void tools_to_upper(const std::string & r, std::string & uppered);
277
278#if HAVE_WCTYPE_H
285 extern void tools_to_wupper(std::wstring & r);
286#endif
287
289
299 extern std::string tools_printf(const char *format, ...);
300
302
311 extern std::string tools_vprintf(const char *format, va_list ap);
312
314
318 extern bool tools_do_some_files_match_mask_regex(const entrepot & ent,
319 const std::string & file_mask);
320
321
323
329 extern void tools_unlink_file_mask_regex(user_interaction & dialog,
330 const entrepot & ent,
331 const std::string & file_mask,
332 bool info_details);
333
334
336
346 extern void tools_avoid_slice_overwriting_regex(user_interaction & dialog,
347 const entrepot & ent,
348 const std::string & basename,
349 const std::string & extension,
350 bool info_details,
351 bool allow_overwriting,
352 bool warn_overwriting,
353 bool dry_run);
354
356
362 extern bool tools_are_on_same_filesystem(const std::string & file1, const std::string & file2);
363
365
369 extern path tools_relative2absolute_path(const path & src, const path & cwd);
370
372
375 extern void tools_block_all_signals(sigset_t &old_mask);
376
378
382 extern void tools_block_all_signals_except(const std::deque<int> & non_blocked, sigset_t &old_mask);
383
384
386
389 extern void tools_set_back_blocked_signals(sigset_t old_mask);
390
392
396 extern U_I tools_count_in_string(const std::string & s, const char a);
397
399
408 extern datetime tools_get_mtime(user_interaction & dialog,
409 const std::string & s,
410 bool auto_zeroing,
411 bool silent,
412 const std::set<std::string> & ignored_as_symlink = std::set<std::string>());
413
415
418 extern infinint tools_get_size(const std::string & s);
419
421
425 extern infinint tools_get_extended_size(std::string s, U_I base);
426
428
432 extern std::string tools_substitute(const std::string & hook,
433 const std::map<char, std::string> & corres);
434
435
437
448 extern std::string tools_hook_substitute(const std::string & hook,
449 const std::string & path,
450 const std::string & basename,
451 const std::string & num,
452 const std::string & padded_num,
453 const std::string & ext,
454 const std::string & context,
455 const std::string & base_url);
456
457
459
462 extern void tools_hook_execute(user_interaction & ui,
463 const std::string & cmd_line);
464
465
467
477 extern void tools_hook_substitute_and_execute(user_interaction & ui,
478 const std::string & hook,
479 const std::string & path,
480 const std::string & basename,
481 const std::string & num,
482 const std::string & padded_num,
483 const std::string & ext,
484 const std::string & context,
485 const std::string & base_url);
486
487
489
492 extern std::string tools_output2xml(const std::string & src);
493
495
498 extern U_I tools_octal2int(const std::string & perm);
499
500
502
505 extern std::string tools_int2octal(const U_I & perm);
506
508
509 extern char tools_cast_type_to_unix_type(char type);
510
512
513 extern std::string tools_get_permission_string(char type, U_32 perm, bool hard);
514
516
519 extern void tools_set_permission(S_I fd, U_I perm);
520
522
526 extern U_I tools_get_permission(S_I fd);
527
529
531
534 extern uid_t tools_ownership2uid(const std::string & user);
535
537
540 extern uid_t tools_ownership2gid(const std::string & group);
541
543
548 extern void tools_set_ownership(S_I filedesc, const std::string & slice_user, const std::string & slice_group);
549
551
556 extern void tools_memxor(void *dest, const void *src, U_I n);
557
559
564 extern tlv_list tools_string2tlv_list(user_interaction & dialog, const U_16 & type, const std::vector<std::string> & data);
565
566
567
569
572 extern U_I tools_pseudo_random(U_I max);
573
574
576
583
584 template <class N, class B> std::deque<B> tools_number_base_decomposition_in_big_endian(N number, const B & base)
585 {
586 std::deque<B> ret;
587
588 if(base <= 0)
589 throw Erange("tools_number_decoupe_in_big_endian", "base must be strictly positive");
590
591 while(number != 0)
592 {
593 ret.push_back(number % base);
594 number /= base;
595 }
596
597 return ret;
598 }
599
601
604 extern std::string tools_unsigned_char_to_hexa(unsigned char x);
605
607
610 extern std::string tools_string_to_hexa(const std::string & input);
611
613 extern std::string tools_U_I_to_hexa(U_I x);
614
616
619 extern infinint tools_file_size_to_crc_size(const infinint & size);
620
622 extern std::string tools_getcwd();
623
625 extern std::string tools_get_compression_ratio(const infinint & storage_size, const infinint & file_size, bool compressed);
626
628 extern std::string tools_strerror_r(int errnum);
629
630#ifdef GPGME_SUPPORT
632 extern std::string tools_gpgme_strerror_r(gpgme_error_t err);
633#endif
634
635#if HAVE_WCHAR_H
637 extern std::wstring tools_string_to_wstring(const std::string & val);
638
640 extern std::string tools_wstring_to_string(const std::wstring & val);
641#endif
642
644 extern void tools_secu_string_show(user_interaction & dialog, const std::string & msg, const secu_string & key);
645
646 template <class T> T tools_max(T a, T b) { return a > b ? a : b; }
647 template <class T> T tools_min(T a, T b) { return a > b ? b : a; }
648
650 void tools_unlink(const std::string & filename);
651
653 extern std::string tools_escape_chars_in_string(const std::string & val, const char *to_escape);
654
656
658 extern bool tools_infinint2U_64(infinint val, U_64 & res);
659
661
667 extern bool tools_my_atoi(const char *a, U_I & val);
668
670 extern infinint tools_double2infinint(double arg);
671
673
680 template <class T> void tools_check_negative_date(T & val,
681 user_interaction & ui,
682 const char *inode_path,
683 const char *nature,
684 bool ask_before,
685 bool silent)
686 {
687 if(val < 0)
688 {
689 if(!silent)
690 {
691 std::string msg = tools_printf(gettext("Found negative date (%s) for inode %s ."),
692 nature,
693 inode_path);
694 if(ask_before)
695 ui.pause(tools_printf(gettext("%S Can we read it as if it was zero (1st January 1970 at 00:00:00 UTC)?"),
696 &msg));
697 else // just warn
698 ui.message(msg + gettext("Considering date as if it was zero (Jan 1970)"));
699 }
700
701 val = 0;
702 }
703 }
704
705
707
708 extern infinint tools_upper_rounded_log2(const infinint & ref);
709
710
712
713 extern infinint tools_lower_rounded_exp2(const infinint & ref);
714
715
717
718 extern infinint tools_rounded_square_root(const infinint & ref);
719
720
722
723 extern infinint tools_rounded_cube_root(const infinint & ref);
724
726
730 extern std::string tools_build_regex_for_exclude_mask(const std::string & prefix,
731 const std::string & relative_part);
732
733
735
736}
737
738#endif
libdar::Erange
exception used to signal range error
Definition erreurs.hpp:220
libdar::datetime
stores time information
Definition datetime.hpp:59
libdar::entrepot
the Entrepot interface
Definition entrepot.hpp:57
libdar::generic_file
this is the interface class from which all other data transfer classes inherit
Definition generic_file.hpp:77
libdar::infinint
the arbitrary large positive integer class
Definition real_infinint.hpp:62
libdar::path
the class path is here to manipulate paths in the Unix notation: using'/'
Definition path.hpp:51
libdar::secu_string
class secu_string
Definition secu_string.hpp:54
libdar::user_interaction
This is a pure virtual class that is used by libdar when interaction with the user is required.
Definition user_interaction.hpp:58
datetime.hpp
this file contains the definition of class datetime that stores unix times in a portable way
entrepot.hpp
defines the entrepot interface.
generic_file.hpp
class generic_file is defined here as well as class fichier
libdar::tools_is_equal_with_hourshift
bool tools_is_equal_with_hourshift(const infinint &hourshift, const datetime &date1, const datetime &date2)
test if two dates are equal taking care of a integer hour of difference
libdar::tools_check_negative_date
void tools_check_negative_date(T &val, user_interaction &ui, const char *inode_path, const char *nature, bool ask_before, bool silent)
check the value is not negative, and if asked set it to zero
Definition tools.hpp:680
libdar::tools_secu_string_show
void tools_secu_string_show(user_interaction &dialog, const std::string &msg, const secu_string &key)
display the content of a secu_string, this function is only for trouble shooting!
libdar::tools_set_back_blocked_signals
void tools_set_back_blocked_signals(sigset_t old_mask)
unblock signals according to given mask
libdar::tools_system
void tools_system(user_interaction &dialog, const std::vector< std::string > &argvector)
wrapper to the "system" system call.
libdar::tools_escape_chars_in_string
std::string tools_escape_chars_in_string(const std::string &val, const char *to_escape)
escape with a anti-slash character a set of chars found in the given string
libdar::tools_get_compression_ratio
std::string tools_get_compression_ratio(const infinint &storage_size, const infinint &file_size, bool compressed)
return the string about compression ratio
libdar::tools_unlink
void tools_unlink(const std::string &filename)
remove from filesystem the file which path is given
libdar::tools_uword2str
std::string tools_uword2str(U_16 x)
convert unsigned word to string
libdar::tools_read_string
void tools_read_string(generic_file &f, std::string &s)
read a string from a file expecting it to terminate by '\0'
libdar::tools_infinint2U_64
bool tools_infinint2U_64(infinint val, U_64 &res)
convert an infinint to U_64 (aka "uint64_t" or yet "unsigned long long")
libdar::tools_are_on_same_filesystem
bool tools_are_on_same_filesystem(const std::string &file1, const std::string &file2)
tells whether two files are on the same mounted filesystem
libdar::tools_addspacebefore
std::string tools_addspacebefore(std::string s, U_I expected_size)
prepend spaces before the given string
libdar::tools_number_base_decomposition_in_big_endian
std::deque< B > tools_number_base_decomposition_in_big_endian(N number, const B &base)
Template for the decomposition of any number in any base (decimal, octal, hexa, etc....
Definition tools.hpp:584
libdar::tools_to_upper
void tools_to_upper(const std::string &r, std::string &uppered)
convert a string to upper case
libdar::tools_write_string_all
void tools_write_string_all(generic_file &f, const std::string &s)
write a string to a file, '\0' has no special meaning nor is added at the end
libdar::tools_avoid_slice_overwriting_regex
void tools_avoid_slice_overwriting_regex(user_interaction &dialog, const entrepot &ent, const std::string &basename, const std::string &extension, bool info_details, bool allow_overwriting, bool warn_overwriting, bool dry_run)
prevents slice overwriting: check the presence of slice and if necessary ask the user if they can be ...
libdar::tools_display_integer_in_metric_system
std::string tools_display_integer_in_metric_system(infinint number, const std::string &unit, bool binary)
libdar::tools_read_string_size
void tools_read_string_size(generic_file &f, std::string &s, infinint taille)
read a string if given size from a file '\0' has no special meaning
libdar::tools_get_extended_size
infinint tools_get_extended_size(std::string s, U_I base)
convert the given string to infinint taking care of multiplication suffixes like k,...
libdar::tools_set_permission
void tools_set_permission(S_I fd, U_I perm)
change the permission of the file which descriptor is given
libdar::tools_double2infinint
infinint tools_double2infinint(double arg)
convert a double (float) to infinint (integer) taking care of rounding it to the closest value
libdar::tools_int2octal
std::string tools_int2octal(const U_I &perm)
convert a number to a string corresponding to its octal representation
libdar::tools_block_all_signals
void tools_block_all_signals(sigset_t &old_mask)
block all signals (based on POSIX sigprocmask)
libdar::tools_is_case_insensitive_equal
bool tools_is_case_insensitive_equal(const std::string &a, const std::string &b)
compare two string in case insensitive manner
libdar::tools_count_in_string
U_I tools_count_in_string(const std::string &s, const char a)
counts the number of a given char in a given string
libdar::tools_ownership2gid
uid_t tools_ownership2gid(const std::string &group)
convert string group name or gid to numeric gid value
libdar::tools_write_vector
void tools_write_vector(generic_file &f, const std::vector< std::string > &x)
write a list of string to file
libdar::tools_get_size
infinint tools_get_size(const std::string &s)
returns the size of the given plain file
libdar::tools_end
void tools_end()
libdar internal use only: it is launched from close_and_clean() and releases tools internal variables
libdar::tools_string_to_hexa
std::string tools_string_to_hexa(const std::string &input)
convert a string into its hexadecima representation (string containing an integer not its decimal rep...
libdar::tools_strerror_r
std::string tools_strerror_r(int errnum)
wrapper routine to strerror_r
libdar::tools_file_size_to_crc_size
infinint tools_file_size_to_crc_size(const infinint &size)
Defines the CRC size to use for a given filesize.
libdar::tools_ownership2uid
uid_t tools_ownership2uid(const std::string &user)
change ownership of the file which descriptor is given
libdar::tools_hook_execute
void tools_hook_execute(user_interaction &ui, const std::string &cmd_line)
execute and retries at user will a given command line
libdar::tools_memxor
void tools_memxor(void *dest, const void *src, U_I n)
Produces in "dest" the XORed value of "dest" and "src".
libdar::tools_noexcept_make_date
void tools_noexcept_make_date(const std::string &chem, bool symlink, const datetime &last_acc, const datetime &last_mod, const datetime &birth)
set dates of a given file, no exception thrown
libdar::tools_relative2absolute_path
path tools_relative2absolute_path(const path &src, const path &cwd)
transform a relative path to an absolute one given the current directory value
libdar::tools_readlink
std::string tools_readlink(const char *root)
returns the file pointed to by a symbolic link (or transparent if the file is not a symlink).
libdar::tools_display_date
std::string tools_display_date(const datetime &date, bool fully_detailed=false)
convert a date in second to its human readable representation
libdar::tools_upper_rounded_log2
infinint tools_upper_rounded_log2(const infinint &ref)
compute an approximate log2 of the argument
libdar::tools_str2charptr
char * tools_str2charptr(const std::string &x)
convert a string to a char *
libdar::tools_get_permission
U_I tools_get_permission(S_I fd)
obtain the permission of the file which descriptor is given
libdar::tools_getcwd
std::string tools_getcwd()
get current working directory
libdar::tools_octal2int
U_I tools_octal2int(const std::string &perm)
convert octal string to integer
libdar::tools_get_mtime
datetime tools_get_mtime(user_interaction &dialog, const std::string &s, bool auto_zeroing, bool silent, const std::set< std::string > &ignored_as_symlink=std::set< std::string >())
returns the last modification date of the given file
libdar::tools_blocking_read
void tools_blocking_read(int fd, bool mode)
set blocking/not blocking mode for reading on a file descriptor
libdar::tools_output2xml
std::string tools_output2xml(const std::string &src)
convert string for xml output
libdar::tools_pseudo_random
U_I tools_pseudo_random(U_I max)
Produces a pseudo random number x, where 0 <= x < max.
libdar::tools_cast_type_to_unix_type
char tools_cast_type_to_unix_type(char type)
change the libdar internal type representation to the usual unix char type
libdar::tools_hook_substitute_and_execute
void tools_hook_substitute_and_execute(user_interaction &ui, const std::string &hook, const std::string &path, const std::string &basename, const std::string &num, const std::string &padded_num, const std::string &ext, const std::string &context, const std::string &base_url)
subsititue and execute command line
libdar::tools_rounded_square_root
infinint tools_rounded_square_root(const infinint &ref)
compute an approximate square root of the argument
libdar::tools_system_with_pipe
void tools_system_with_pipe(const std::shared_ptr< user_interaction > &dialog, const std::string &dar_cmd, const std::vector< std::string > &argvpipe)
wrapper to the "system" system call using anonymous pipe to tranmit arguments to the child process
libdar::tools_hook_substitute
std::string tools_hook_substitute(const std::string &hook, const std::string &path, const std::string &basename, const std::string &num, const std::string &padded_num, const std::string &ext, const std::string &context, const std::string &base_url)
produces the string resulting from the substitution of %... macro
libdar::tools_find_last_char_of
std::string::iterator tools_find_last_char_of(std::string &s, unsigned char v)
give a pointer to the last character of the given value in the given string
libdar::tools_rounded_cube_root
infinint tools_rounded_cube_root(const infinint &ref)
compute an approximate cube root of the argument
libdar::tools_name_of_gid
std::string tools_name_of_gid(const infinint &gid)
convert gid to name in regards of the current system's configuration
libdar::tools_unlink_file_mask_regex
void tools_unlink_file_mask_regex(user_interaction &dialog, const entrepot &ent, const std::string &file_mask, bool info_details)
remove files from a given directory
libdar::tools_write_string
void tools_write_string(generic_file &f, const std::string &s)
write a string to a file with a '\0' at then end
libdar::tools_concat_vector
std::string tools_concat_vector(const std::string &separator, const std::vector< std::string > &x)
concatenate a vectors of strings in a single string
libdar::tools_lower_rounded_exp2
infinint tools_lower_rounded_exp2(const infinint &ref)
compute an approximate exp2 of the argument
libdar::tools_set_ownership
void tools_set_ownership(S_I filedesc, const std::string &slice_user, const std::string &slice_group)
change ownership of the file which descriptor is given
libdar::tools_printf
std::string tools_printf(const char *format,...)
make printf-like formating to a std::string
libdar::tools_block_all_signals_except
void tools_block_all_signals_except(const std::deque< int > &non_blocked, sigset_t &old_mask)
block all signals except those given in first argument
libdar::tools_my_atoi
bool tools_my_atoi(const char *a, U_I &val)
ascii to integer conversion
libdar::tools_int2str
std::string tools_int2str(S_I x)
convert integer to string
libdar::tools_get_permission_string
std::string tools_get_permission_string(char type, U_32 perm, bool hard)
convert a permission number into its string representation (rwxrwxrwx)
libdar::tools_substitute
std::string tools_substitute(const std::string &hook, const std::map< char, std::string > &corres)
produce the string resulting from the substition of % macro defined in the map
libdar::tools_str2int
U_I tools_str2int(const std::string &x)
convert an integer written in decimal notation to the corresponding value
libdar::operator+=
std::vector< T > operator+=(std::vector< T > &a, const std::vector< T > &b)
template function to add two vectors
Definition tools.hpp:229
libdar::tools_do_some_files_match_mask_regex
bool tools_do_some_files_match_mask_regex(const entrepot &ent, const std::string &file_mask)
test the presence of files corresponding to a given mask in a directory (regex mask)
libdar::tools_init
void tools_init()
libdar internal use only: it is launched from get_version() and initializes tools internal variables
libdar::tools_unsigned_char_to_hexa
std::string tools_unsigned_char_to_hexa(unsigned char x)
convert a unsigned char into its hexa decima representation
libdar::tools_U_I_to_hexa
std::string tools_U_I_to_hexa(U_I x)
convert a unsigned integer to its hexadecimal representation
libdar::tools_get_filesize
infinint tools_get_filesize(const path &p)
retrieve the size in byte of a file
libdar::tools_string2tlv_list
tlv_list tools_string2tlv_list(user_interaction &dialog, const U_16 &type, const std::vector< std::string > &data)
Produces a list of TLV from a constant type and a list of string.
libdar::tools_vprintf
std::string tools_vprintf(const char *format, va_list ap)
make printf-like formating to a std::string
libdar::tools_name_of_uid
std::string tools_name_of_uid(const infinint &uid)
convert uid to name in regards to the current system's configuration
libdar::tools_make_date
void tools_make_date(const std::string &chemin, bool symlink, const datetime &access, const datetime &modif, const datetime &birth)
set dates of a given file, may throw exception
libdar::tools_read_vector
void tools_read_vector(generic_file &f, std::vector< std::string > &x)
read a list of string from a file
libdar::tools_build_regex_for_exclude_mask
std::string tools_build_regex_for_exclude_mask(const std::string &prefix, const std::string &relative_part)
builds a regex from root directory and user provided regex to be applied to the relative path
infinint.hpp
switch module to limitint (32 ou 64 bits integers) or infinint
integers.hpp
are defined here basic integer types that tend to be portable
my_config.h
include macro defined by the configure script and some specific additional ones
libdar
libdar namespace encapsulate all libdar symbols
Definition archive.hpp:47
path.hpp
here is the definition of the path class
tlv_list.hpp
List of Generic Type Length Value data structures.