Disk ARchive 2.8.0
Full featured and portable backup and archiving tool
fichier_libssh.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
26
27#ifndef FICHIER_LIBSSH_HPP
28#define FICHIER_LIBSSH_HPP
29
30
31#include "../my_config.h"
32
33extern "C"
34{
35#if HAVE_UNISTD_H
36#include <unistd.h>
37#endif
38} // end extern "C"
39
40#include "integers.hpp"
41#include "user_interaction.hpp"
42#include "fichier_global.hpp"
43#include "libssh_connection.hpp"
44#include "cygwin_adapt.hpp"
45
46#include <string>
47
48namespace libdar
49{
50
53
54
56
57#if LIBSSH_AVAILABLE
58
59 class fichier_libssh : public fichier_global
60 {
61 public:
62
64 fichier_libssh(const std::shared_ptr<user_interaction> & dialog,
65 const std::shared_ptr<libssh_connection> & ptr,
66 const std::string & chemin,
67 gf_mode mode,
68 U_I permission,
69 bool fail_if_exists,
70 bool erase);
71
73 fichier_libssh(const fichier_libssh & ref) = delete;
74
76 fichier_libssh(fichier_libssh && ref) noexcept = delete;
77
79 fichier_libssh & operator = (const fichier_libssh & ref) = delete;
80
82 fichier_libssh & operator = (fichier_libssh && ref) noexcept = delete;
83
85 ~fichier_libssh();
86
87
89 virtual void change_ownership(const std::string & user, const std::string & group) override
90 { throw Efeature(gettext("user/group ownership not implemented for this repository")); };
91 // not implemented, libssh can set ownership based on uid / gid but not based on user/group names
92
94 virtual void change_permission(U_I perm) override;
95
97 virtual infinint get_size() const override;
98
100 virtual void fadvise(advise adv) const override {}; // not supported
101
102 // inherited from generic_file
103 virtual bool skippable(skippability direction, const infinint & amount) override;
104 virtual bool skip(const infinint & pos) override;
105 virtual bool skip_to_eof() override;
106 virtual bool skip_relative(S_I x) override;
107 virtual bool truncatable(const infinint & pos) const override;
108 virtual infinint get_position() const override;
109
110 protected:
111 // inherited from generic_file grand-parent class
112 virtual void inherited_truncate(const infinint & pos) override;
113 virtual void inherited_read_ahead(const infinint & amount) override;
114 virtual void inherited_sync_write() override {};
115 virtual void inherited_flush_read() override {};
116 virtual void inherited_terminate() override { myclose(); };
117
118 // inherited from fichier_global parent class
119 virtual U_I fichier_global_inherited_write(const char *a, U_I size) override;
120 virtual bool fichier_global_inherited_read(char *a, U_I size, U_I & read, std::string & message) override;
121
122 private:
123 std::shared_ptr<libssh_connection> connect;
124 std::string my_path;
125 sftp_file sfd;
126 infinint current_pos;
127
128 // read ahead structures
129
130 struct rahead
131 {
132 sftp_aio handle;
133
134 rahead(): handle(nullptr) {};
135 rahead(const rahead & ref) = delete;
136 rahead(rahead && ref) noexcept { handle = ref.handle; ref.handle = nullptr; };
137 rahead & operator = (const rahead & ref) = delete;
138 rahead & operator = (rahead && ref) noexcept { std::swap(handle, ref.handle); return *this; };
139 ~rahead() { if(handle != nullptr) sftp_aio_free(handle); };
140 };
141
142 static const U_I read_ahead_window_size = 100*1024*1024;
144
145 infinint tora;
146
147 std::deque<rahead> rareq;
148 U_I rareq_maxsize;
149
150 char* rabuffer;
151 U_I rallocated;
152 U_I rasize;
153 U_I ralu;
154
155 // private methods
156
157 void myclose();
158 void clear_readahead() { rareq.clear(); ralu = rasize = 0; };
159 void update_aio_reqs();
160
162
166 void check_pos_from_libssh();
167
168 };
169
170#endif
171
173
174} // end of namespace
175
176#endif
thin C++ adaptation layer to Cygwin specifities
class fichier_global definition. This class is a pure virtual class class fichier_global is an abstra...
gf_mode
generic_file openning modes
Definition: gf_mode.hpp:44
are defined here basic integer types that tend to be portable
class holding libssh related data structure for an ssh and sftp session
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47
defines the interaction interface between libdar and users.