5 #define __STDC_FORMAT_MACROS
34 const std::string &rdonly_path,
35 const std::string &tarball_path,
36 const std::string &base_directory,
37 const std::string &to_delete,
38 const bool create_catalog_on_root)
39 :
SyncUnion(mediator, rdonly_path,
"",
""),
41 tarball_path_(tarball_path),
42 base_directory_(base_directory),
43 to_delete_(to_delete),
44 create_catalog_on_root_(create_catalog_on_root),
45 read_archive_signal_(new
Signal) {}
58 src = archive_read_new();
59 assert(ARCHIVE_OK == archive_read_support_format_tar(
src));
60 assert(ARCHIVE_OK == archive_read_support_format_empty(
src));
66 result = archive_read_open_filename(
src, tarball_absolute_path.c_str(),
70 if (result != ARCHIVE_OK) {
72 archive_error_string(
src));
111 for (vector<string>::iterator s = to_eliminate_vec.begin();
112 s != to_eliminate_vec.end(); ++s) {
113 std::string parent_path;
114 std::string filename;
116 if (parent_path ==
".") parent_path =
"";
124 if (NULL ==
src)
return;
126 struct archive_entry *entry = archive_entry_new();
131 int result = archive_read_next_header2(
src, entry);
134 case ARCHIVE_FATAL: {
136 archive_error_string(
src));
140 case ARCHIVE_RETRY: {
142 "Error in reading the header, retrying.\n%s\n",
143 archive_error_string(
src));
160 assert(to_mark->IsDirectory());
161 to_mark->SetCatalogMarker();
162 to_mark->MakePlaceholderDirectory();
171 "Warning in uncompression reading, going on.\n %s",
172 archive_error_string(
src));
185 result, archive_error_string(
src));
192 std::string archive_file_path(archive_entry_pathname(entry));
195 std::string complete_path =
200 std::string parent_path;
201 std::string filename;
202 SplitPath(complete_path, &parent_path, &filename);
203 if (parent_path ==
".") parent_path.clear();
210 if (NULL != archive_entry_hardlink(entry)) {
211 const std::string hardlink_name(
218 hardlinks_.find(hardlink)->second.push_back(complete_path);
220 std::list<std::string> to_hardlink;
221 to_hardlink.push_back(complete_path);
224 if (filename ==
".cvmfscatalog") {
232 if (sync_entry->IsDirectory()) {
234 sync_entry->MakePlaceholderDirectory();
237 dirs_[complete_path] = sync_entry;
243 }
else if (sync_entry->IsRegularFile()) {
246 if (filename ==
".cvmfscatalog") {
250 }
else if (sync_entry->IsSymlink() || sync_entry->IsFifo() ||
251 sync_entry->IsSocket() || sync_entry->IsCharacterDevice() ||
252 sync_entry->IsBlockDevice()) {
255 if (filename !=
".cvmfscatalog") {
259 "Found entity called as a catalog marker '%s' that however is "
260 "not a regular file, abort",
261 complete_path.c_str());
279 if (path.length() >= 2) {
280 if (path[0] ==
'.' && path[1] ==
'/') {
281 return path.substr(2);
284 if (path.length() >= 1) {
285 if (path[0] ==
'/') {
286 return path.substr(1);
293 std::map<const std::string, std::list<std::string> >::iterator hardlink;
296 std::list<std::string>::iterator entry;
297 for (entry = hardlink->second.begin(); entry != hardlink->second.end();
306 return entry->filename();
326 if (target ==
".")
return;
328 std::string dirname =
"";
329 std::string filename =
"";
333 if (dirname ==
".") dirname =
"";
338 dirs_[target] = dummy;
#define LogCvmfs(source, mask,...)
std::map< const std::string, std::list< std::string > > hardlinks_
virtual bool ProcessUnmaterializedDirectory(SharedPtr< SyncItem > entry)
bool IsOpaqueDirectory(SharedPtr< SyncItem > directory) const
std::map< std::string, SharedPtr< SyncItem > > dirs_
const std::string base_directory_
virtual bool Initialize()
assert((mem||(size==0))&&"Out Of Memory")
std::string UnwindWhiteoutFilename(SharedPtr< SyncItem > entry) const
void CreateDirectories(const std::string &target)
SharedPtr< SyncItem > CreateSyncItem(const std::string &relative_parent_path, const std::string &filename, const SyncItemType entry_type) const
const std::string tarball_path_
std::set< std::string > to_create_catalog_dirs_
std::string GetAbsolutePath(const std::string &path)
void SplitPath(const std::string &path, std::string *dirname, std::string *filename)
AbstractSyncMediator * mediator_
vector< string > SplitString(const string &str, char delim)
bool IsInitialized() const
std::string SanitizePath(const std::string &path)
Signal * read_archive_signal_
const std::string to_delete_
entity to delete before to extract the tar
void ProcessArchiveEntry(struct archive_entry *entry)
void ProcessFile(SharedPtr< SyncItem > entry)
const bool create_catalog_on_root_
virtual bool ProcessDirectory(const std::string &parent_dir, const std::string &dir_name)
static const size_t kBlockSize
bool IsWhiteoutEntry(SharedPtr< SyncItem > entry) const
std::set< std::string > know_directories_
directory that we know already exist
std::string MakeCanonicalPath(const std::string &path)
SyncUnionTarball(AbstractSyncMediator *mediator, const std::string &rdonly_path, const std::string &tarball_path, const std::string &base_directory, const std::string &to_delete, const bool create_catalog_on_root)