-
Notifications
You must be signed in to change notification settings - Fork 1
/
smbprovider_helper.h
143 lines (107 loc) · 5.19 KB
/
smbprovider_helper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SMBPROVIDER_SMBPROVIDER_HELPER_H_
#define SMBPROVIDER_SMBPROVIDER_HELPER_H_
#include <ostream>
#include <string>
#include <vector>
#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <libsmbclient.h>
#include "smbprovider/proto.h"
#include "smbprovider/proto_bindings/directory_entry.pb.h"
namespace dbus {
class FileDescriptor;
} // namespace dbus
namespace smbprovider {
using PathParts = const std::vector<std::string>;
// Helper method that appends a |base_path| to a |relative_path|. Base path may
// or may not contain a trailing separator ('/'). If |relative_path| starts with
// a leading "/", it is stripped before being appended to |base_path|.
std::string AppendPath(const std::string& base_path,
const std::string& relative_path);
// Helper method to check whether an entry is self (".") or parent ("..").
bool IsSelfOrParentDir(const std::string& entry_name);
// Helper method to check if the entry is a file or directory.
bool IsFileOrDir(uint32_t smbc_type);
// Maps errno to ErrorType.
ErrorType GetErrorFromErrno(int32_t error_code);
// Maps errno to ErrorType. This is a copy function of GetErrorFromErrno with
// a change on mapping EINVAL to ERROR_NOT_FOUND.
ErrorType GetErrorFromErrnoForReadDir(int32_t error_code);
// Helper method to determine whether a stat struct represents a Directory.
bool IsDirectory(const struct stat& stat_info);
// Helper method to detemine whether a stat struct represents a File.
bool IsFile(const struct stat& stat_info);
// Helper method to check if the entry is an SMB share.
bool IsSmbShare(uint32_t smbc_type);
// Helper method to check if MS/DOS file attributes |file_attrs| correspond to a
// symlink.
bool IsSymlink(uint16_t file_attrs);
void LogAndSetError(const char* operation_name,
int32_t mount_id,
ErrorType error_received,
int32_t* error_code);
// Logs error for |operation_name|.
void LogOperationError(const char* operation_name,
int32_t mount_id,
ErrorType error_received);
// Logs error and sets |error_code|.
template <typename Proto>
void LogAndSetError(const Proto& options,
ErrorType error_received,
int32_t* error_code) {
LogAndSetError(GetMethodName(options), GetMountId(options), error_received,
error_code);
}
void LogAndSetDBusParseError(const char* operation_name, int32_t* error_code);
template <typename Proto>
bool ParseOptionsProto(const ProtoBlob& blob,
Proto* options,
int32_t* error_code) {
bool is_valid = options->ParseFromArray(blob.data(), blob.size()) &&
IsValidOptions(*options);
if (!is_valid) {
LogAndSetDBusParseError(GetMethodName(*options), error_code);
}
return is_valid;
}
// Helper method to get |DirectoryEntryProto| from a struct stat. Returns
// ERROR_OK on success and ERROR_FAILED otherwise.
int32_t GetDirectoryEntryProtoFromStat(const std::string& full_path,
const struct stat& stat_info,
ProtoBlob* proto_blob);
// Helper method to determine if the open file flags are valid. Valid flags
// include: O_RDONLY, O_RDWR, O_WRONLY.
bool IsValidOpenFileFlags(int32_t flags);
// Helper method to read data from a file descriptor |fd| and store the
// result in |buffer|. This reads bytes equal to what is specified in |options|,
// and will fail if it doesn't read that amount. Returns true on success and
// |error| is set on failure.
bool ReadFromFD(const WriteFileOptionsProto& options,
const base::ScopedFD& fd,
int32_t* error,
std::vector<uint8_t>* buffer);
// Gets the correct permissions flag for |options|.
int32_t GetOpenFilePermissions(const bool writeable);
int32_t GetOpenFilePermissions(const OpenFileOptionsProto& options);
int32_t GetOpenFilePermissions(const TruncateOptionsProto& unused);
int32_t GetOpenFilePermissions(const CopyEntryOptionsProto& unused);
// Returns the components of a filepath as a vector<std::string>.
PathParts SplitPath(const std::string& full_path);
// Removes smb:// from url. |smb_url| must start with "smb://".
std::string RemoveURLScheme(const std::string& smb_url);
// Returns the file component of a path.|full_path| must be an SMB Url.
std::string GetFileName(const std::string& full_path);
// Returns a string representing the filepath to the directory above the file.
// |full_path| must be an SMB Url.
std::string GetDirPath(const std::string& full_path);
// Helper method to determine if the result from CreateDirectory should be
// processed as an error. |result| is the result of the call to CreateDirectory.
// If |ignore_existing| is true, EEXIST errors are ignored.
bool ShouldReportCreateDirError(int32_t result, bool ignore_existing);
// Output operator for logging and debugging.
std::ostream& operator<<(std::ostream& out, ErrorType error);
} // namespace smbprovider
#endif // SMBPROVIDER_SMBPROVIDER_HELPER_H_