| // Copyright 2020 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 SMBFS_SAMBA_INTERFACE_H_ |
| #define SMBFS_SAMBA_INTERFACE_H_ |
| |
| #include <libsmbclient.h> |
| #include <sys/types.h> |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/memory/weak_ptr.h> |
| |
| namespace smbfs { |
| |
| struct SmbCredential; |
| |
| // Lightweight wrapper to make libsmbclient functions available without having |
| // to define and retrieve their function pointers in multiple places. |
| // |
| // Methods map 1:1 onto libsmbclient functions but unlike libsmbclient provide |
| // a consistent interface where the return value is 0 on success or errno on |
| // failure. Methods that natively return other data (ie. OpenFile()) do so via |
| // pointer-based output parameters. |
| // |
| // All methods must be called from the same thread, unless noted. |
| class SambaInterface { |
| public: |
| SambaInterface() = default; |
| virtual ~SambaInterface() = default; |
| |
| SambaInterface(const SambaInterface&) = delete; |
| SambaInterface& operator=(const SambaInterface&) = delete; |
| |
| // Weak pointer type. |
| using WeakPtr = ::base::WeakPtr<SambaInterface>; |
| |
| // Gets a weak pointer to this object. Should only be called from, and |
| // the resultant pointer dereferenced from, the constructor thread. |
| virtual WeakPtr AsWeakPtr() = 0; |
| |
| // Sets the password to be used for libsmbclient auth callbacks (if |
| // implemented). Can be called from any thread. |
| virtual void UpdateCredentials( |
| std::unique_ptr<SmbCredential> credentials) = 0; |
| |
| // Retrieve stat information for the filesystem that backs |path| into |
| // |out_statvfs|. |
| // Returns 0 on success and errno on failure. |
| virtual int StatVfs(const std::string& path, |
| struct statvfs* out_statvfs) WARN_UNUSED_RESULT = 0; |
| |
| // Opens a file at a given |file_path| with |flags| (O_RDONLY, O_WRONLY etc), |
| // returning a handle to it in |out_file|, which will be nullptr on failure. |
| // |mode| is used when using OpenFile() to create a new file. |
| // Returns 0 on success and errno on failure. |
| virtual int OpenFile(const std::string& file_path, |
| int flags, |
| mode_t mode, |
| SMBCFILE** out_file) WARN_UNUSED_RESULT = 0; |
| |
| // Closes |file|, which is from OpenFile(). |
| // Returns 0 on success and errno on failure. |
| virtual int CloseFile(SMBCFILE* file) WARN_UNUSED_RESULT = 0; |
| |
| // Seeks to |offset| in |file| from position |whence|. |
| // Returns 0 on success and errno on failure. |
| virtual int SeekFile(SMBCFILE* file, |
| off_t offset, |
| int whence) WARN_UNUSED_RESULT = 0; |
| |
| // Reads |count| bytes from |file| into |buf|. On success, |out_bytes_read| |
| // contains the number of bytes read. |
| // Returns 0 on success and errno on failure. |
| virtual int ReadFile(SMBCFILE* file, |
| void* buf, |
| size_t count, |
| size_t* out_bytes_read) WARN_UNUSED_RESULT = 0; |
| |
| // Writes |count| bytes from |buf| into |file|. On success, |
| // |out_bytes_written| contains the number of bytes written. Returns 0 on |
| // success and errno on failure. |
| virtual int WriteFile(SMBCFILE* file, |
| const void* buf, |
| size_t count, |
| size_t* out_bytes_written) WARN_UNUSED_RESULT = 0; |
| |
| // Truncates |file| to |size| bytes. |
| // Returns 0 on success and errno on failure. |
| virtual int TruncateFile(SMBCFILE* file, off_t size) WARN_UNUSED_RESULT = 0; |
| |
| // Retrieves a stat structure for the file or directory at |path| into |
| // |out_stat|. Returns 0 on success and errno on failure. |
| virtual int Stat(const std::string& path, |
| struct stat* out_stat) WARN_UNUSED_RESULT = 0; |
| |
| // Sets the access and modification times for the file or directory at |path|. |
| // Returns 0 on success and errno on failure. |
| virtual int SetUtimes(const std::string& path, |
| const struct timespec& atime, |
| const struct timespec& mtime) = 0; |
| |
| // Renames |old_path| to |new_path|. |
| // Returns 0 on success and errno on failure. |
| virtual int Rename(const std::string& old_path, |
| const std::string& new_path) WARN_UNUSED_RESULT = 0; |
| |
| // Removes the file at |file_path|. Use RmDir() to remove a directory. |
| // Returns 0 on success and errno on failure. |
| virtual int UnlinkFile(const std::string& file_path) WARN_UNUSED_RESULT = 0; |
| |
| // Creates directory at |dir_path| with mode |mode|. |
| // Returns 0 on success and errno on failure. |
| virtual int CreateDirectory(const std::string& dir_path, |
| mode_t mode) WARN_UNUSED_RESULT = 0; |
| |
| // Opens directory at |dir_path|, returning a handle to it in |out_dir|, |
| // which will be nullptr on failure. |
| // Returns 0 on success and errno on failure. |
| virtual int OpenDirectory(const std::string& dir_path, |
| SMBCFILE** out_dir) WARN_UNUSED_RESULT = 0; |
| |
| // Closes |dir|, which is from OpenDirectory(). |
| // Returns 0 on success and errno on failure. |
| virtual int CloseDirectory(SMBCFILE* dir) WARN_UNUSED_RESULT = 0; |
| |
| // Seeks |offset| entries into |directory|. |offset| should be 0 to seek to |
| // the beginning of the directory, or a value returned by TellDirectory(). |
| // Returns 0 on success and errno on failure. |
| virtual int SeekDirectory(SMBCFILE* dir, off_t offset) WARN_UNUSED_RESULT = 0; |
| |
| // Retrieve the current offset in |dir| into |out_offset|. The value returned |
| // in |out_offset| is opaque and should not be interpreted. It should only be |
| // passed into SeekDirectory(). |
| // Returns 0 on success and errno on failure. |
| virtual int TellDirectory(SMBCFILE* dir, |
| off_t* out_offset) WARN_UNUSED_RESULT = 0; |
| |
| // Reads a directory entry from |dir|, returning metadata into |
| // |out_file_info| and an associated stat structure into |out_stat|. Is used |
| // in conjunction with SeekDirectory() to set the read offset. If no more |
| // directory entries are available it will return 0 and set |out_file_info| |
| // to a nullptr and |out_stat| to an empty struct. |
| // Returns 0 on success and errno on failure. |
| virtual int ReadDirectory(SMBCFILE* dir, |
| const struct libsmb_file_info** out_file_info, |
| struct stat* out_stat) WARN_UNUSED_RESULT = 0; |
| |
| // Removes the directory at |dir_path|. |
| // Returns 0 on success and errno on failure. |
| virtual int RemoveDirectory(const std::string& dir_path) |
| WARN_UNUSED_RESULT = 0; |
| }; |
| |
| } // namespace smbfs |
| |
| #endif // SMBFS_SAMBA_INTERFACE_H_ |