Compare commits
	
		
			3 Commits
		
	
	
		
			v2.0.3-rc
			...
			v2.0.6-rel
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 87d336141c | |||
| 62555e6125 | |||
| 24418ba03d | 
| @@ -3,6 +3,7 @@ _mkgmtime | |||||||
| _sh_denyno | _sh_denyno | ||||||
| _sh_denyrd | _sh_denyrd | ||||||
| _sh_denyrw | _sh_denyrw | ||||||
|  | _spawnv | ||||||
| aarch64 | aarch64 | ||||||
| advapi32 | advapi32 | ||||||
| armv8 | armv8 | ||||||
| @@ -16,6 +17,7 @@ bugprone | |||||||
| cflags | cflags | ||||||
| chrono | chrono | ||||||
| cmake_current_source_dir | cmake_current_source_dir | ||||||
|  | coinit_apartmentthreaded | ||||||
| comdlg32 | comdlg32 | ||||||
| cppcoreguidelines | cppcoreguidelines | ||||||
| cppdbg | cppdbg | ||||||
| @@ -26,6 +28,7 @@ cppvsdbg | |||||||
| create_notraverse | create_notraverse | ||||||
| crypto_aead_xchacha20poly1305_ietf_npubbytes | crypto_aead_xchacha20poly1305_ietf_npubbytes | ||||||
| cstdint | cstdint | ||||||
|  | curle_couldnt_resolve_host | ||||||
| curlopt_aws_sigv4 | curlopt_aws_sigv4 | ||||||
| cxxflags | cxxflags | ||||||
| cxxstd | cxxstd | ||||||
| @@ -114,6 +117,7 @@ googletest | |||||||
| gpath | gpath | ||||||
| gtest_version | gtest_version | ||||||
| has_setxattr | has_setxattr | ||||||
|  | hkey | ||||||
| httpapi | httpapi | ||||||
| httplib | httplib | ||||||
| icudata | icudata | ||||||
| @@ -121,6 +125,7 @@ icui18n | |||||||
| icuuc | icuuc | ||||||
| iostreams | iostreams | ||||||
| iphlpapi | iphlpapi | ||||||
|  | ipstream | ||||||
| jthread | jthread | ||||||
| libbitcoin | libbitcoin | ||||||
| libbitcoinsystem | libbitcoinsystem | ||||||
| @@ -142,6 +147,7 @@ libuuid_include_dirs | |||||||
| libvlc | libvlc | ||||||
| linkflags | linkflags | ||||||
| localappdata | localappdata | ||||||
|  | lpbyte | ||||||
| lptr | lptr | ||||||
| lpwstr | lpwstr | ||||||
| markdownlint | markdownlint | ||||||
| @@ -154,8 +160,10 @@ mtune | |||||||
| musl-libc | musl-libc | ||||||
| nana | nana | ||||||
| ncrypt | ncrypt | ||||||
|  | nlohmann | ||||||
| nlohmann_json | nlohmann_json | ||||||
| nmakeprg | nmakeprg | ||||||
|  | nohup | ||||||
| nominmax | nominmax | ||||||
| ntstatus | ntstatus | ||||||
| nullptr | nullptr | ||||||
| @@ -163,6 +171,7 @@ nuspell_version | |||||||
| oleaut32 | oleaut32 | ||||||
| openal_version | openal_version | ||||||
| openssldir | openssldir | ||||||
|  | pistream | ||||||
| pkgconfig | pkgconfig | ||||||
| plarge_integer | plarge_integer | ||||||
| plex | plex | ||||||
| @@ -192,6 +201,8 @@ secp256k1 | |||||||
| secur32 | secur32 | ||||||
| sfml_project | sfml_project | ||||||
| shlwapi | shlwapi | ||||||
|  | sigchld | ||||||
|  | skynet | ||||||
| source_subdir | source_subdir | ||||||
| spdlog | spdlog | ||||||
| spdlog_project | spdlog_project | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | *.tgz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tar.gz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.tar.xz filter=lfs diff=lfs merge=lfs -text | ||||||
|  | *.zip filter=lfs diff=lfs merge=lfs -text | ||||||
| @@ -1,36 +0,0 @@ | |||||||
| { |  | ||||||
|     "configurations": { |  | ||||||
|         "UnixDebug": { |  | ||||||
|             "adapter": "vscode-cpptools", |  | ||||||
|             "configuration": { |  | ||||||
|                 "request": "launch", |  | ||||||
|                 "program": "${workspaceRoot}/build/debug/repertory", |  | ||||||
|                 "args": ["-f", "/home/sgraves/mnt"], |  | ||||||
|                 "cwd": "${workspaceRoot}/build/debug", |  | ||||||
|                 "environment": [], |  | ||||||
|                 "externalConsole": true, |  | ||||||
|                 "MIMode": "gdb", |  | ||||||
|                 "stopAtEntry": true, |  | ||||||
|                 "logging": { |  | ||||||
|                     "engineLogging": false |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "UnixDebugTest": { |  | ||||||
|             "adapter": "vscode-cpptools", |  | ||||||
|             "configuration": { |  | ||||||
|                 "request": "launch", |  | ||||||
|                 "program": "${workspaceRoot}/build/debug/unittests", |  | ||||||
|                 "args": ["--gtest_filter=file_manager.can_close_after_download_timeout"], |  | ||||||
|                 "cwd": "${workspaceRoot}/build", |  | ||||||
|                 "environment": [], |  | ||||||
|                 "externalConsole": true, |  | ||||||
|                 "MIMode": "gdb", |  | ||||||
|                 "stopAtEntry": true, |  | ||||||
|                 "logging": { |  | ||||||
|                     "engineLogging": false |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										68
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,7 +1,74 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  | ## v2.0.6-release | ||||||
|  |  | ||||||
|  | ### Issues | ||||||
|  | * \#42 [bug] Remote mount directory listing on Windows connected to Linux is failing | ||||||
|  | * \#43 [bug] Directories are not importing properly for Sia | ||||||
|  | * \#44 [bug] Windows-to-Linux remote mount ignores `CREATE_NEW` | ||||||
|  | * \#45 [bug] Windows-to-Linux remote mount is not handling attempts to remove a non-empty directory properly | ||||||
|  | * \#46 [bug] Changes to maximum cache size should be updated live | ||||||
|  | * \#47 [bug] Windows-to-Linux remote mount is allowing directory rename when directory is not empty | ||||||
|  | * \#48 [bug] Windows-to-Linux remote mount overlapped I/O is not detecting EOF for read operations | ||||||
|  | * \#49 [ui] Implement provider test button | ||||||
|  |  | ||||||
|  | ### Changes from v2.0.5-rc | ||||||
|  |  | ||||||
|  | * Added request retry on `libcurl` error code `CURLE_COULDNT_RESOLVE_HOST` | ||||||
|  | * Added `libcurl` DNS caching | ||||||
|  | * Drive letters in UI should always be lowercase | ||||||
|  | * Fixed WinFSP directory rename for non-empty directories | ||||||
|  | * Fixed segfault in UI due to incorrect `SIGCHLD` handling | ||||||
|  | * Migrated to v2 error handling | ||||||
|  | * Upgraded WinFSP to v2.1 (2025) | ||||||
|  |  | ||||||
|  | ## v2.0.5-rc | ||||||
|  |  | ||||||
|  | <!-- markdownlint-disable-next-line --> | ||||||
|  | ### Issues | ||||||
|  |  | ||||||
|  | * \#39 Create management portal in Flutter | ||||||
|  |  | ||||||
|  | ### Changes from v2.0.4-rc | ||||||
|  |  | ||||||
|  | * Continue documentation updates | ||||||
|  | * Fixed `-status` command erasing active mount information | ||||||
|  | * Fixed overlapping HTTP REST API port's | ||||||
|  | * Refactored/fixed instance locking | ||||||
|  | * Removed passwords and secret key values from API calls | ||||||
|  | * Renamed setting `ApiAuth` to `ApiPassword` | ||||||
|  | * Require `--name,-na` option for encryption provider | ||||||
|  |  | ||||||
|  | ## v2.0.4-rc | ||||||
|  |  | ||||||
|  | ### BREAKING CHANGES | ||||||
|  |  | ||||||
|  | * `renterd` v2.0.0+ is now required. Prior versions will fail to mount. | ||||||
|  |  | ||||||
|  | <!-- markdownlint-disable-next-line --> | ||||||
|  | ### Issues | ||||||
|  |  | ||||||
|  | * \#35 [bug] Low frequency check is set to '0' instead of 1 hour by default | ||||||
|  | * \#36 [bug] Max cache size bytes is set to '0' by default | ||||||
|  |  | ||||||
|  | ### Changes from v2.0.3-rc | ||||||
|  |  | ||||||
|  | * Added Sia API version check prior to mounting | ||||||
|  | * Added back `-cv` (check version) CLI option | ||||||
|  | * Continue documentation updates | ||||||
|  | * Fixed setting `ApiAuth` via `set_value_by_name` | ||||||
|  | * Fixed setting `HostConfig.ApiUser` via `set_value_by_name` | ||||||
|  | * Fixed setting `HostConfig.Path` via `set_value_by_name` | ||||||
|  | * Fixed setting `HostConfig.Protocol` via `set_value_by_name` | ||||||
|  | * Improved ring buffer read-ahead | ||||||
|  | * Integrated `renterd` version 2.0.0 | ||||||
|  | * Prefer using local cache file when opening files | ||||||
|  | * Refactored `app_config` unit tests | ||||||
|  | * Refactored polling to be more accurate on scheduling tasks | ||||||
|  |  | ||||||
| ## v2.0.3-rc | ## v2.0.3-rc | ||||||
|  |  | ||||||
|  | <!-- markdownlint-disable-next-line --> | ||||||
| ### Issues | ### Issues | ||||||
|  |  | ||||||
| * \#28 \[bug\] Address slow directory responses in S3 mounts for deeply nested directories | * \#28 \[bug\] Address slow directory responses in S3 mounts for deeply nested directories | ||||||
| @@ -25,6 +92,7 @@ | |||||||
|  |  | ||||||
| ## v2.0.2-rc | ## v2.0.2-rc | ||||||
|  |  | ||||||
|  | <!-- markdownlint-disable-next-line --> | ||||||
| ### BREAKING CHANGES | ### BREAKING CHANGES | ||||||
|  |  | ||||||
| * Refactored `config.json` - will need to verify configuration settings prior to mounting | * Refactored `config.json` - will need to verify configuration settings prior to mounting | ||||||
|   | |||||||
| @@ -58,6 +58,10 @@ if(PROJECT_IS_MINGW) | |||||||
|   endif() |   endif() | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  | if (PROJECT_ENABLE_V2_ERRORS) | ||||||
|  |   add_definitions(-DPROJECT_ENABLE_V2_ERRORS) | ||||||
|  | endif() | ||||||
|  |  | ||||||
| include(cmake/settings.cmake) | include(cmake/settings.cmake) | ||||||
|  |  | ||||||
| include(cmake/flags.cmake) | include(cmake/flags.cmake) | ||||||
| @@ -143,6 +147,7 @@ endif() | |||||||
|       -DPROJECT_COPYRIGHT=${PROJECT_COPYRIGHT} |       -DPROJECT_COPYRIGHT=${PROJECT_COPYRIGHT} | ||||||
|       -DPROJECT_DESC=${PROJECT_DESC} |       -DPROJECT_DESC=${PROJECT_DESC} | ||||||
|       -DPROJECT_DIST_DIR=${PROJECT_DIST_DIR} |       -DPROJECT_DIST_DIR=${PROJECT_DIST_DIR} | ||||||
|  |       -DPROJECT_ENABLE_V2_ERRORS=${PROJECT_ENABLE_V2_ERRORS} | ||||||
|       -DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES} |       -DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES} | ||||||
|       -DPROJECT_ENABLE_BOOST=${PROJECT_ENABLE_BOOST} |       -DPROJECT_ENABLE_BOOST=${PROJECT_ENABLE_BOOST} | ||||||
|       -DPROJECT_ENABLE_CPP_HTTPLIB=${PROJECT_ENABLE_CPP_HTTPLIB} |       -DPROJECT_ENABLE_CPP_HTTPLIB=${PROJECT_ENABLE_CPP_HTTPLIB} | ||||||
|   | |||||||
							
								
								
									
										490
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										490
									
								
								README.md
									
									
									
									
									
								
							| @@ -3,149 +3,431 @@ | |||||||
| Repertory allows you to mount S3 and Sia via FUSE on Linux or via WinFSP | Repertory allows you to mount S3 and Sia via FUSE on Linux or via WinFSP | ||||||
| on Windows. | on Windows. | ||||||
|  |  | ||||||
|  | ## Contents | ||||||
|  |  | ||||||
|  | 1. [Details and Features](#details-and-features) | ||||||
|  | 2. [Minimum Requirements](#minimum-requirements) | ||||||
|  |    1. [Supported Operating Systems](#supported-operating-systems) | ||||||
|  | 3. [GUI](#gui) | ||||||
|  | 4. [Usage](#usage) | ||||||
|  |    1. [Important Options](#important-options) | ||||||
|  |    2. [Sia](#sia) | ||||||
|  |       * [Sia Initial Configuration](#sia-initial-configuration) | ||||||
|  |       * [Sia Mounting](#sia-mounting) | ||||||
|  |       * [Sia Configuration File](#sia-configuration-file) | ||||||
|  |    3. [S3](#s3) | ||||||
|  |       * [S3 Initial Configuration](#s3-initial-configuration) | ||||||
|  |       * [S3 Mounting](#s3-mounting) | ||||||
|  |       * [S3 Configuration File](#s3-configuration-file) | ||||||
|  | 5. [Data Directories](#data-directories) | ||||||
|  |    1. [Linux Directories](#linux-directories) | ||||||
|  |    2. [Windows Directories](#windows-directories) | ||||||
|  | 6. [Remote Mounting](#remote-mounting) | ||||||
|  |    1. [Server Setup](#server-setup) | ||||||
|  |       * [Remote Mount Configuration File Section](#remote-mount-configuration-file-section) | ||||||
|  |    2. [Client Setup](#client-setup) | ||||||
|  |       * [Client Remote Mounting](#client-remote-mounting) | ||||||
|  |       * [Remote Mount Configuration File](#remote-mount-configuration-file) | ||||||
|  | 7. [Compiling](#compiling) | ||||||
|  |    1. [Linux Compilation](#linux-compilation) | ||||||
|  |    2. [Windows Setup](#windows-compilation) | ||||||
|  | 8. [Credits](#credits) | ||||||
|  | 9. [Developer Public Key](#developer-public-key) | ||||||
|  | 10. [Consult the Wiki for additional information](https://git.fifthgrid.com/BlockStorage/repertory/wiki) | ||||||
|  |  | ||||||
| ## Details and Features | ## Details and Features | ||||||
|  |  | ||||||
| * Optimized for [Plex Media Server](https://www.plex.tv/) | * Optimized for [Plex Media Server](https://www.plex.tv/) | ||||||
| * Single application to mount S3 and/or Sia | * Remote mounting of `repertory` instances on Linux and Windows | ||||||
| * Remote mounting of Repertory instances on Linux and Windows |  | ||||||
|   * Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet. |   * Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet. | ||||||
| * Cross-platform support (Linux 64-bit, Linux arm64/aarch64, Windows 64-bit) | * Cross-platform support (Linux 64-bit, Linux arm64/aarch64, Windows 64-bit) | ||||||
| * Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts | * Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts | ||||||
|  |  | ||||||
| ## Minimum Requirements | ## Minimum Requirements | ||||||
|  |  | ||||||
| * [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v0.4.0+ for Sia support | * [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support | ||||||
| * Only 64-bit operating systems are supported | * Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support | ||||||
|   * By default, Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support | * Windows requires the following dependencies to be installed: | ||||||
|   * Windows requires the following dependencies to be installed: |   * [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi) | ||||||
|     * [WinFSP 2023](https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi) |  | ||||||
|  |  | ||||||
| ## Supported Operating Systems | ### Supported Operating Systems | ||||||
|  |  | ||||||
|  | Only 64-bit operating systems are supported | ||||||
|  |  | ||||||
| * Linux `arm64/aarch64` | * Linux `arm64/aarch64` | ||||||
| * Linux `amd64` | * Linux `amd64` | ||||||
| * Windows 64-bit 10, 11 | * Windows 64-bit 10, 11 | ||||||
|  |  | ||||||
|  | ## GUI | ||||||
|  |  | ||||||
|  | As of `v2.0.5-rc`, mounts can be managed using the `Repertory Management Portal`. | ||||||
|  | To launch the portal, execute the following command: | ||||||
|  |  | ||||||
|  | * `repertory -ui` | ||||||
|  |   * The default username is `repertory` | ||||||
|  |   * The default password is `repertory` | ||||||
|  |  | ||||||
|  | After first launch, `ui.json` will be created in the appropriate data directory. | ||||||
|  | See [Data Directories](#data-directories). | ||||||
|  | You should modify this file directly or use the portal to change the default | ||||||
|  | username and password. | ||||||
|  |  | ||||||
|  | ### Screenshot | ||||||
|  |   | ||||||
|  | <a href="https://ibb.co/fVyJqnbF"><img src="https://i.ibb.co/fVyJqnbF/repertory-portal.png" alt="repertory-portal" border="0"></a> | ||||||
|  |  | ||||||
| ## Usage | ## Usage | ||||||
|  |  | ||||||
| ### Sia | ### Important Options | ||||||
|  |  | ||||||
| * Initial Configuration |  | ||||||
|   * Sia steps: |  | ||||||
|     * Set the appropriate bucket name and `renterd` API password in `repertory` configuration: |  | ||||||
|       * To use `default` as the bucket name and configuration name: |  | ||||||
|         * `repertory -set HostConfig.ApiPassword '<my password>'` |  | ||||||
|       * To use a different bucket name with `default` as the configuration name: |  | ||||||
|         * `repertory -set HostConfig.ApiPassword '<my password>'` |  | ||||||
|         * `repertory -set SiaConfig.Bucket '<my bucket>'` |  | ||||||
|       * For all other configurations: |  | ||||||
|         * `repertory --name '<my config name>' -set HostConfig.ApiPassword '<my password>'` |  | ||||||
|         * `repertory --name '<my config name>' -set SiaConfig.Bucket '<my bucket name>'` |  | ||||||
|   * To verify/view all configuration options: |  | ||||||
|     * `repertory -dc` |  | ||||||
|     * `repertory --name '<my config name>' -dc` |  | ||||||
|       * Example: |  | ||||||
|         * `repertory --name default -dc` |  | ||||||
| * Mounting on Linux: |  | ||||||
|   * `repertory /mnt/location` |  | ||||||
|   * `repertory --name '<my config name>' /mnt/location` |  | ||||||
|     * Example: |  | ||||||
|       * `repertory --name default /mnt/location` |  | ||||||
| * Mounting on Windows: |  | ||||||
|   * `repertory t:` |  | ||||||
|   * `repertory --name '<my config name>' t:` |  | ||||||
|     * Example: |  | ||||||
|       * `repertory --name default t:` |  | ||||||
|  |  | ||||||
| ### S3 |  | ||||||
|  |  | ||||||
| * Initial Configuration |  | ||||||
|   * S3 steps: |  | ||||||
|     * Set the appropriate base URL: |  | ||||||
|       * `repertory -s3 --name '<my config name>' -set S3Config.URL '<my url>'` |  | ||||||
|         * Example: |  | ||||||
|           * `repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'` |  | ||||||
|     * Set the appropriate bucket name: |  | ||||||
|       * `repertory -s3 --name '<my config name>' -set S3Config.Bucket '<my bucket name>'` |  | ||||||
|     * Set the appropriate access key: |  | ||||||
|       * `repertory -s3 --name '<my config name>' -set S3Config.AccessKey '<my access key>'` |  | ||||||
|     * Set the appropriate secret key: |  | ||||||
|       * `repertory -s3 --name '<my config name>' -set S3Config.SecretKey '<my secret key>'` |  | ||||||
|     * For Sia and most local S3 gateway instances, enable path style URL's: |  | ||||||
|       * `repertory -s3 --name '<my config name>' -set S3Config.UsePathStyle true` |  | ||||||
|     * Optional steps: |  | ||||||
|       * Set an appropriate region. Default is set to `any`: |  | ||||||
|         * `repertory -s3 --name '<my config name>' -set S3Config.Region '<my region>'` |  | ||||||
|       * Enable encrypted file names and file data. Set a strong, random encryption token and be sure to store it in a secure backup location: |  | ||||||
|         * `repertory -s3 --name '<my config name>' -set S3Config.EncryptionToken '<my strong password>'` |  | ||||||
|   * To verify/view all configuration options: |  | ||||||
|     * `repertory -s3 --name '<my config name>' -dc` |  | ||||||
|       * Example: |  | ||||||
|         * `repertory -s3 --name minio -dc` |  | ||||||
| * Mounting on Linux: |  | ||||||
|   * `repertory -s3 --name '<my config name>' /mnt/location` |  | ||||||
|     * Example: |  | ||||||
|       * `repertory -s3 --name minio /mnt/location` |  | ||||||
| * Mounting on Windows: |  | ||||||
|   * `repertory -s3 --name '<my config name>' t:` |  | ||||||
|     * Example: |  | ||||||
|       * `repertory -s3 --name minio t:` |  | ||||||
|  |  | ||||||
| ### Notable Options |  | ||||||
|  |  | ||||||
| * `--help` | * `--help` | ||||||
|   * Display all mount utility options |   * Display all mount utility options | ||||||
|  |  | ||||||
|  | * `-f` | ||||||
|  |   * Keep process in foreground on Linux. | ||||||
|  |  | ||||||
| * `--name, -na [name]` | * `--name, -na [name]` | ||||||
|  |   * Identifies a unique configuration name to support multiple mounts. | ||||||
|   * The `--name` option can be set to any valid value allowed as a file name for your filesystem. |   * The `--name` option can be set to any valid value allowed as a file name for your filesystem. | ||||||
|   * For Sia, the bucket name will be set to the same value if it is empty in the configuration file. |   * For Sia, the bucket name will be set to the same value if it is empty in the configuration file. | ||||||
|     * If the `--name` option is not specified, `default` will be used. |     * If the `--name` option is not specified, `default` will be used. | ||||||
|   * For S3, the `--name` option is required and does not affect the bucket name. |   * For S3, the `--name` option is required and does not affect the bucket name. | ||||||
|  |  | ||||||
| * `-dc` | * `-dc` | ||||||
|   * Display mount configuration |   * Display mount configuration | ||||||
|   * For Sia, `--name` is optional |   * For Sia, `--name` is optional | ||||||
|   * For S3, the `-s3` option is required along with `--name` |   * For S3, the `-s3` option is required along with `--name` | ||||||
|  |  | ||||||
|  | ### Sia | ||||||
|  |  | ||||||
|  | #### Sia Initial Configuration | ||||||
|  |  | ||||||
|  | * Required steps: | ||||||
|  |   * Set the appropriate bucket name and `renterd` API password in `repertory` configuration: | ||||||
|  |     * To use `default` as the bucket name and configuration name, you only need to set the `renterd` API password: | ||||||
|  |       * `repertory -set HostConfig.ApiPassword '<my password>'` | ||||||
|  |     * To specify a different bucket name while using `default` as the configuration name: | ||||||
|  |       * `repertory -set HostConfig.ApiPassword '<my password>'` | ||||||
|  |       * `repertory -set SiaConfig.Bucket '<my bucket>'` | ||||||
|  |     * For all other configurations: | ||||||
|  |       * `repertory --name '<my config name>' -set HostConfig.ApiPassword '<my password>'` | ||||||
|  |       * `repertory --name '<my config name>' -set SiaConfig.Bucket '<my bucket name>'` | ||||||
|  |  | ||||||
|  | * Optional steps: | ||||||
|  |   * Set a user name used during `renterd` basic authentication: | ||||||
|  |     * `repertory -set HostConfig.ApiUser '<my user>'` | ||||||
|  |     * `repertory --name '<my config name>' -set HostConfig.ApiUser '<my user>'` | ||||||
|  |   * Set a custom agent string (default `Sia-Agent`): | ||||||
|  |     * `repertory -set HostConfig.AgentString '<my agent>'` | ||||||
|  |     * `repertory --name '<my config name>' -set HostConfig.AgentString '<my agent>'` | ||||||
|  |   * Set the host name or IP of the `renterd` instance (default `localhost`): | ||||||
|  |     * `repertory -set HostConfig.HostNameOrIp '<my host name>'` | ||||||
|  |     * `repertory --name '<my config name>' -set HostConfig.HostNameOrIp '<my host name>'` | ||||||
|  |   * Set the `renterd` API port (default `9980`): | ||||||
|  |     * `repertory -set HostConfig.ApiPort 9981` | ||||||
|  |     * `repertory --name '<my config name>' -set HostConfig.ApiPort 9981` | ||||||
|  |  | ||||||
|  | * To verify/view all configuration options: | ||||||
|  |   * `repertory -dc` | ||||||
|  |   * `repertory --name '<my config name>' -dc` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory --name default -dc` | ||||||
|  |  | ||||||
|  | #### Sia Mounting | ||||||
|  |  | ||||||
|  | * Linux: | ||||||
|  |   * `repertory /mnt/location` | ||||||
|  |   * `repertory --name '<my config name>' /mnt/location` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory --name default /mnt/location` | ||||||
|  |  | ||||||
|  | * Windows: | ||||||
|  |   * `repertory t:` | ||||||
|  |   * `repertory --name '<my config name>' t:` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory --name default t:` | ||||||
|  |  | ||||||
|  | #### Sia Configuration File | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "ApiPassword": "<random generated rpc password>", | ||||||
|  |   "ApiPort": 10000, | ||||||
|  |   "ApiUser": "repertory", | ||||||
|  |   "DatabaseType": "rocksdb", | ||||||
|  |   "DownloadTimeoutSeconds": 30, | ||||||
|  |   "EnableDownloadTimeout": true, | ||||||
|  |   "EnableDriveEvents": false, | ||||||
|  |   "EventLevel": "info", | ||||||
|  |   "EvictionDelayMinutes": 1, | ||||||
|  |   "EvictionUseAccessedTime": false, | ||||||
|  |   "HighFreqIntervalSeconds": 30, | ||||||
|  |   "HostConfig": { | ||||||
|  |     "AgentString": "Sia-Agent", | ||||||
|  |     "ApiPassword": "<renterd api password>", | ||||||
|  |     "ApiPort": 9980, | ||||||
|  |     "ApiUser": "", | ||||||
|  |     "HostNameOrIp": "localhost", | ||||||
|  |     "Path": "", | ||||||
|  |     "Protocol": "http", | ||||||
|  |     "TimeoutMs": 60000 | ||||||
|  |   }, | ||||||
|  |   "LowFreqIntervalSeconds": 3600, | ||||||
|  |   "MaxCacheSizeBytes": 21474836480, | ||||||
|  |   "MaxUploadCount": 5, | ||||||
|  |   "MedFreqIntervalSeconds": 120, | ||||||
|  |   "OnlineCheckRetrySeconds": 60, | ||||||
|  |   "PreferredDownloadType": "default", | ||||||
|  |   "RemoteMount": { | ||||||
|  |     "ApiPort": 20000, | ||||||
|  |     "ClientPoolSize": 20, | ||||||
|  |     "Enable": false, | ||||||
|  |     "EncryptionToken": "" | ||||||
|  |   }, | ||||||
|  |   "RetryReadCount": 6, | ||||||
|  |   "RingBufferFileSize": 512, | ||||||
|  |   "SiaConfig": { | ||||||
|  |     "Bucket": "default" | ||||||
|  |   }, | ||||||
|  |   "TaskWaitMs": 100, | ||||||
|  |   "Version": 1 | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### S3 | ||||||
|  |  | ||||||
|  | #### S3 Initial Configuration | ||||||
|  |  | ||||||
|  | * Required steps: | ||||||
|  |   * Set the appropriate base URL: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.URL '<my url>'` | ||||||
|  |       * Example: | ||||||
|  |         * `repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'` | ||||||
|  |   * Set the appropriate bucket name: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.Bucket '<my bucket name>'` | ||||||
|  |   * Set the appropriate access key: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.AccessKey '<my access key>'` | ||||||
|  |   * Set the appropriate secret key: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.SecretKey '<my secret key>'` | ||||||
|  |   * For Sia and most local S3 gateway instances, enable path style URL's: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.UsePathStyle true` | ||||||
|  |  | ||||||
|  | * Optional steps: | ||||||
|  |   * Set an appropriate region. Default is set to `any`: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.Region '<my region>'` | ||||||
|  |   * Enable encrypted file names and file data. Set a strong, random encryption token and be sure to store it in a secure backup location: | ||||||
|  |     * `repertory -s3 --name '<my config name>' -set S3Config.EncryptionToken '<my strong password>'` | ||||||
|  |  | ||||||
|  | * To verify/view all configuration options: | ||||||
|  |   * `repertory -s3 --name '<my config name>' -dc` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory -s3 --name minio -dc` | ||||||
|  |  | ||||||
|  | #### S3 Mounting | ||||||
|  |  | ||||||
|  | * Linux: | ||||||
|  |   * `repertory -s3 --name '<my config name>' /mnt/location` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory -s3 --name minio /mnt/location` | ||||||
|  |  | ||||||
|  | * Windows: | ||||||
|  |   * `repertory -s3 --name '<my config name>' t:` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory -s3 --name minio t:` | ||||||
|  |  | ||||||
|  | #### S3 Configuration File | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "ApiPassword": "<random generated rpc password>", | ||||||
|  |   "ApiPort": 10100, | ||||||
|  |   "ApiUser": "repertory", | ||||||
|  |   "DatabaseType": "rocksdb", | ||||||
|  |   "DownloadTimeoutSeconds": 30, | ||||||
|  |   "EnableDownloadTimeout": true, | ||||||
|  |   "EnableDriveEvents": false, | ||||||
|  |   "EventLevel": "info", | ||||||
|  |   "EvictionDelayMinutes": 1, | ||||||
|  |   "EvictionUseAccessedTime": false, | ||||||
|  |   "HighFreqIntervalSeconds": 30, | ||||||
|  |   "LowFreqIntervalSeconds": 3600, | ||||||
|  |   "MaxCacheSizeBytes": 21474836480, | ||||||
|  |   "MaxUploadCount": 5, | ||||||
|  |   "MedFreqIntervalSeconds": 120, | ||||||
|  |   "OnlineCheckRetrySeconds": 60, | ||||||
|  |   "PreferredDownloadType": "default", | ||||||
|  |   "RemoteMount": { | ||||||
|  |     "ApiPort": 20100, | ||||||
|  |     "ClientPoolSize": 20, | ||||||
|  |     "Enable": false, | ||||||
|  |     "EncryptionToken": "" | ||||||
|  |   }, | ||||||
|  |   "RetryReadCount": 6, | ||||||
|  |   "RingBufferFileSize": 512, | ||||||
|  |   "S3Config": { | ||||||
|  |     "AccessKey": "<my access key>", | ||||||
|  |     "Bucket": "<my bucket name>", | ||||||
|  |     "EncryptionToken": "", | ||||||
|  |     "Region": "any", | ||||||
|  |     "SecretKey": "<my secret key>", | ||||||
|  |     "TimeoutMs": 60000, | ||||||
|  |     "URL": "http://localhost:9000", | ||||||
|  |     "UsePathStyle": true, | ||||||
|  |     "UseRegionInURL": false | ||||||
|  |   }, | ||||||
|  |   "TaskWaitMs": 100, | ||||||
|  |   "Version": 1 | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ### Data Directories | ### Data Directories | ||||||
|  |  | ||||||
| * Linux | #### Linux Directories | ||||||
|   * `~/.local/repertory2` |  | ||||||
| * Windows | * `~/.local/repertory2/s3` | ||||||
|   * `%LOCALAPPDATA%\repertory2` | * `~/.local/repertory2/sia` | ||||||
|     * Example: |  | ||||||
|       * `C:\Users\Tom\AppData\Local\repertory2` | #### Windows Directories | ||||||
|     * IMPORTANT: |  | ||||||
|       * It is highly recommended to exclude this folder from any anti-virus/anti-malware applications as severe performance issues may arise. | * `%LOCALAPPDATA%\repertory2\s3` | ||||||
|       * Excluding the mounted drive letter is also highly recommended. | * `%LOCALAPPDATA%\repertory2\sia` | ||||||
|  |   * Examples: | ||||||
|  |     * `C:\Users\Tom\AppData\Local\repertory2\s3` | ||||||
|  |     * `C:\Users\Tom\AppData\Local\repertory2\sia` | ||||||
|  | * IMPORTANT: | ||||||
|  |   * It is highly recommended to exclude this folder from any anti-virus/anti-malware applications as severe performance issues may arise. | ||||||
|  |   * Excluding the mounted drive letter is also highly recommended. | ||||||
|  |  | ||||||
| ## Remote Mounting | ## Remote Mounting | ||||||
|  |  | ||||||
| `Repertory` allows local mounts to be shared with other computers on your network. | `repertory` allows local mounts to be shared with other computers on your network | ||||||
| This option is referred to as remote mounting. Instructions TBD. | or over the internet. This option is referred to as remote mounting. | ||||||
|  |  | ||||||
|  | ### Server Setup | ||||||
|  |  | ||||||
|  | The following steps must be performed on the mount you wish to share with | ||||||
|  | other systems. Changes to configuration will not take affect while a mount is | ||||||
|  | active, so it is recommended to unmount beforehand. | ||||||
|  |  | ||||||
|  | * Required steps: | ||||||
|  |   * Enable remote mount: | ||||||
|  |     * Sia | ||||||
|  |       * `repertory -set RemoteMount.Enable true` | ||||||
|  |       * `repertory --name '<my config name>' -set RemoteMount.Enable true` | ||||||
|  |     * S3: | ||||||
|  |       * `repertory -s3 --name '<my config name>' -set RemoteMount.Enable true` | ||||||
|  |   * Set a secure encryption token: | ||||||
|  |     * Sia: | ||||||
|  |       * `repertory -set RemoteMount.EncryptionToken '<my secure password>'` | ||||||
|  |       * `repertory --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'` | ||||||
|  |     * S3: | ||||||
|  |       * `repertory -s3 --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'` | ||||||
|  |  | ||||||
|  | * Optional steps: | ||||||
|  |   * Change the port clients will use to connect to your mount: | ||||||
|  |     * Sia: | ||||||
|  |       * `repertory -set RemoteMount.ApiPort 20000` | ||||||
|  |       * `repertory --name '<my config name>' -set RemoteMount.ApiPort 20000` | ||||||
|  |     * S3: | ||||||
|  |       * `repertory -s3 --name '<my config name>' -set RemoteMount.ApiPort 20000` | ||||||
|  |  | ||||||
|  | * IMPORTANT: | ||||||
|  |   * Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.ApiPort`. | ||||||
|  |  | ||||||
|  | #### Remote Mount Configuration File Section | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   ... | ||||||
|  |   "RemoteMount": { | ||||||
|  |     "ApiPort": 20000, | ||||||
|  |     "ClientPoolSize": 20, | ||||||
|  |     "Enable": true, | ||||||
|  |     "EncryptionToken": "<my secure password>" | ||||||
|  |   }, | ||||||
|  |   ... | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Client Setup | ||||||
|  |  | ||||||
|  | Client configuration is provider agnostic, so there's no need to specify `-s3` | ||||||
|  | for S3 providers. | ||||||
|  |  | ||||||
|  | * Required steps: | ||||||
|  |   * Set the encryption token to the same value configured during server setup: | ||||||
|  |     * `repertory -rm <host name or IP>:<port> -set RemoteConfig.EncryptionToken '<my secure password>'` | ||||||
|  |       * Replace `<host name or IP>` with the host name or IP of the server | ||||||
|  |       * Replace `<port>` with the value of `RemoteMount.ApiPort` used in the server configuration | ||||||
|  |     * Example: | ||||||
|  |       * `repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken '<my secure password>'` | ||||||
|  |       * `repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken '<my secure password>'` | ||||||
|  |  | ||||||
|  | #### Client Remote Mounting | ||||||
|  |  | ||||||
|  | * Linux: | ||||||
|  |   * `repertory -rm <host name or IP>:<port> /mnt/location` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory -rm 192.168.1.10:20000 /mnt/location` | ||||||
|  |  | ||||||
|  | * Windows: | ||||||
|  |   * `repertory -rm <host name or IP>:<port> t:` | ||||||
|  |     * Example: | ||||||
|  |       * `repertory -rm 192.168.1.10:20000 t:` | ||||||
|  |  | ||||||
|  | #### Remote Mount Configuration File | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "ApiPassword": "<random generated rpc password>", | ||||||
|  |   "ApiPort": 10010, | ||||||
|  |   "ApiUser": "repertory", | ||||||
|  |   "EnableDriveEvents": false, | ||||||
|  |   "EventLevel": "info", | ||||||
|  |   "RemoteConfig": { | ||||||
|  |     "ApiPort": 20000, | ||||||
|  |     "EncryptionToken": "<my secure password>", | ||||||
|  |     "HostNameOrIp": "192.168.1.10", | ||||||
|  |     "MaxConnections": 20, | ||||||
|  |     "ReceiveTimeoutMs": 120000, | ||||||
|  |     "SendTimeoutMs": 30000 | ||||||
|  |   }, | ||||||
|  |   "TaskWaitMs": 100, | ||||||
|  |   "Version": 1 | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ## Compiling | ## Compiling | ||||||
|  |  | ||||||
| * Successful compilation will result in all required files being placed in the `dist/` directory | Successful compilation will result in all files required for execution to be placed | ||||||
| * Linux | in the `dist/` directory | ||||||
|  |  | ||||||
|  | ### Linux Compilation | ||||||
|  |  | ||||||
|  | * Ensure `docker` is installed | ||||||
|  |   * For x86_64: | ||||||
|  |     * RelWithDebInfo: `scripts/make_unix.sh` | ||||||
|  |     * Release: `scripts/make_unix.sh x86_64 Release` | ||||||
|  |     * Debug: `scripts/make_unix.sh x86_64 Debug` | ||||||
|  |  | ||||||
|  |   * For aarch64: | ||||||
|  |     * RelWithDebInfo: `scripts/make_unix.sh aarch64` | ||||||
|  |     * Release: `scripts/make_unix.sh aarch64 Release` | ||||||
|  |     * Debug: `scripts/make_unix.sh aarch64 Debug` | ||||||
|  |  | ||||||
|  | ### Windows Compilation | ||||||
|  |  | ||||||
|  | * OFFICIAL: Cross-compiling on Linux | ||||||
|   * Ensure `docker` is installed |   * Ensure `docker` is installed | ||||||
|     * For x86_64: |     * RelWithDebInfo: `scripts/make_win32.sh` | ||||||
|       * RelWithDebInfo: `scripts/make_unix.sh` |     * Release: `scripts/make_win32.sh x86_64 Release` | ||||||
|       * Release: `scripts/make_unix.sh x86_64 Release` |     * Debug: `scripts/make_win32.sh x86_64 Debug` | ||||||
|       * Debug: `scripts/make_unix.sh x86_64 Debug` |  | ||||||
|     * For aarch64: | * UNOFFICIAL: Compiling on Windows | ||||||
|       * RelWithDebInfo: `scripts/make_unix.sh aarch64` |   * Ensure latest [MSYS2](https://www.msys2.org/) is installed | ||||||
|       * Release: `scripts/make_unix.sh aarch64 Release` |     * RelWithDebInfo: `scripts\make_win32.cmd` | ||||||
|       * Debug: `scripts/make_unix.sh aarch64 Debug` |     * Release: `scripts\make_win32.cmd x86_64 Release` | ||||||
| * Windows |     * Debug: `scripts\make_win32.cmd x86_64 Debug` | ||||||
|   * OFFICIAL: Cross-compiling on Linux |  | ||||||
|     * Ensure `docker` is installed |  | ||||||
|       * RelWithDebInfo: `scripts/make_win32.sh` |  | ||||||
|       * Release: `scripts/make_win32.sh x86_64 Release` |  | ||||||
|       * Debug: `scripts/make_win32.sh x86_64 Debug` |  | ||||||
|   * UNOFFICIAL: Compiling on Windows |  | ||||||
|     * Ensure latest [MSYS2](https://www.msys2.org/) is installed |  | ||||||
|       * RelWithDebInfo: `scripts\make_win32.cmd` |  | ||||||
|       * Release: `scripts\make_win32.cmd x86_64 Release` |  | ||||||
|       * Debug: `scripts\make_win32.cmd x86_64 Debug` |  | ||||||
|  |  | ||||||
| ## Credits | ## Credits | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,20 +1,20 @@ | |||||||
| set(BINUTILS_HASH b53606f443ac8f01d1d5fc9c39497f2af322d99e14cea5c0b4b124d630379365) | set(BINUTILS_HASH ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237) | ||||||
| set(BOOST2_HASH 7bd7ddceec1a1dfdcbdb3e609b60d01739c38390a5f956385a12f3122049f0ca) | set(BOOST2_HASH 7bd7ddceec1a1dfdcbdb3e609b60d01739c38390a5f956385a12f3122049f0ca) | ||||||
| set(BOOST_HASH f55c340aa49763b1925ccf02b2e83f35fdcf634c9d5164a2acb87540173c741d) | set(BOOST_HASH 3621533e820dcab1e8012afd583c0c73cf0f77694952b81352bf38c1488f9cb4) | ||||||
| set(CPP_HTTPLIB_HASH 405abd8170f2a446fc8612ac635d0db5947c0d2e156e32603403a4496255ff00) | set(CPP_HTTPLIB_HASH 410a1347ed6bcbcc4a19af8ed8ad3873fe9fa97731d52db845c4c78f3f9c31e6) | ||||||
| set(CURL_HASH 5a231145114589491fc52da118f9c7ef8abee885d1cb1ced99c7290e9a352f07) | set(CURL_HASH 2937cadde007aa3a52a17c21ac9153ea054700f37926d1d96602bf07e888c847) | ||||||
| set(EXPAT_HASH 372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2) | set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb) | ||||||
| set(GCC_HASH 7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293) | set(GCC_HASH 51b9919ea69c980d7a381db95d4be27edf73b21254eb13d752a08003b4d013b1) | ||||||
| set(GTEST_HASH 7b42b4d6ed48810c5362c265a17faebe90dc2373c885e5216439d37927f02926) | set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c) | ||||||
| set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2) | set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2) | ||||||
| set(JSON_HASH 0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406) | set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187) | ||||||
| set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1) | set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1) | ||||||
| set(MINGW_HASH 30e5aad2c48dd318150f79cff47661232c4175876d6b4d6b270961cf2b49a48b) | set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf) | ||||||
| set(OPENSSL_HASH e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf) | set(OPENSSL_HASH 529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f) | ||||||
| set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591) | set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591) | ||||||
| set(PUGIXML_HASH 2f10e276870c64b1db6809050a75e11a897a8d7456c4be5c6b2e35a11168a015) | set(PUGIXML_HASH 655ade57fa703fb421c2eb9a0113b5064bddb145d415dd1f88c79353d90d511a) | ||||||
| set(ROCKSDB_HASH 9b810c81731835fda0d4bbdb51d3199d901fa4395733ab63752d297da84c5a47) | set(ROCKSDB_HASH afccfab496556904900afacf7d99887f1d50cb893e5d2288bd502db233adacac) | ||||||
| set(SPDLOG_HASH 9962648c9b4f1a7bbc76fd8d9172555bad1871fdb14ff4f842ef87949682caa5) | set(SPDLOG_HASH 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67) | ||||||
| set(SQLITE_HASH 77823cb110929c2bcb0f5d48e4833b5c59a8a6e40cdea3936b99e199dbbe5784) | set(SQLITE_HASH 9ad6d16cbc1df7cd55c8b55127c82a9bca5e9f287818de6dc87e04e73599d754) | ||||||
| set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3) | set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3) | ||||||
| set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c) | set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c) | ||||||
|   | |||||||
| @@ -120,11 +120,11 @@ if(PROJECT_ENABLE_BOOST) | |||||||
|           --with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread |           --with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread | ||||||
|         BUILD_COMMAND |         BUILD_COMMAND | ||||||
|           ./b2 |           ./b2 | ||||||
|           -j1 |           -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL} | ||||||
|           ${BOOST_BUILD_ARGS} |           ${BOOST_BUILD_ARGS} | ||||||
|         INSTALL_COMMAND |         INSTALL_COMMAND | ||||||
|           ./b2 |           ./b2 | ||||||
|           -j1 |           -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL} | ||||||
|           ${BOOST_BUILD_ARGS} |           ${BOOST_BUILD_ARGS} | ||||||
|           install |           install | ||||||
|       ) |       ) | ||||||
|   | |||||||
| @@ -15,10 +15,13 @@ if(PROJECT_ENABLE_CPP_HTTPLIB) | |||||||
|       CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} |       CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} | ||||||
|         -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} |         -DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} | ||||||
|         -DBUILD_STATIC_LIBS=ON |         -DBUILD_STATIC_LIBS=ON | ||||||
|         -DHTTPLIB_REQUIRE_OPENSSL=${PROJECT_ENABLE_OPENSSL} |  | ||||||
|         -DHTTPLIB_REQUIRE_ZLIB=ON |  | ||||||
|         -DHTTPLIB_REQUIRE_BROTLI=OFF |         -DHTTPLIB_REQUIRE_BROTLI=OFF | ||||||
|  |         -DHTTPLIB_REQUIRE_OPENSSL=ON | ||||||
|  |         -DHTTPLIB_REQUIRE_ZLIB=ON | ||||||
|         -DHTTPLIB_TEST=OFF |         -DHTTPLIB_TEST=OFF | ||||||
|  |         -DHTTPLIB_USE_BROTLI_IF_AVAILABLE=OFF | ||||||
|  |         -DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=ON | ||||||
|  |         -DHTTPLIB_USE_ZLIB_IF_AVAILABLE=ON | ||||||
|         -DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS} |         -DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS} | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,8 +18,9 @@ if(PROJECT_ENABLE_CURL) | |||||||
|       URL ${PROJECT_3RD_PARTY_DIR}/curl-${CURL_VERSION}.tar.gz |       URL ${PROJECT_3RD_PARTY_DIR}/curl-${CURL_VERSION}.tar.gz | ||||||
|       URL_HASH SHA256=${CURL_HASH} |       URL_HASH SHA256=${CURL_HASH} | ||||||
|       LIST_SEPARATOR | |       LIST_SEPARATOR | | ||||||
|       CMAKE_ARGS  |       BUILD_COMMAND  | ||||||
|         ${PROJECT_EXTERNAL_CMAKE_FLAGS} |         ${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL} | ||||||
|  |       CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} | ||||||
|         -DBUILD_CURL_EXE=OFF |         -DBUILD_CURL_EXE=OFF | ||||||
|         -DBUILD_LIBCURL_DOCS=OFF |         -DBUILD_LIBCURL_DOCS=OFF | ||||||
|         -DBUILD_MISC_DOCS=OFF |         -DBUILD_MISC_DOCS=OFF | ||||||
| @@ -28,6 +29,7 @@ if(PROJECT_ENABLE_CURL) | |||||||
|         -DBUILD_STATIC_LIBS=ON |         -DBUILD_STATIC_LIBS=ON | ||||||
|         -DBUILD_STATIC_LIBS=ON |         -DBUILD_STATIC_LIBS=ON | ||||||
|         -DBUILD_TESTING=OFF |         -DBUILD_TESTING=OFF | ||||||
|  |         -DCURL_BROTLI=OFF | ||||||
|         -DCURL_CA_BUNDLE=./cacert.pem |         -DCURL_CA_BUNDLE=./cacert.pem | ||||||
|         -DCURL_CA_FALLBACK=ON |         -DCURL_CA_FALLBACK=ON | ||||||
|         -DCURL_DISABLE_LDAP=ON |         -DCURL_DISABLE_LDAP=ON | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ if(PROJECT_ENABLE_ROCKSDB) | |||||||
|       URL ${PROJECT_3RD_PARTY_DIR}/rocksdb-${ROCKSDB_VERSION}.tar.gz |       URL ${PROJECT_3RD_PARTY_DIR}/rocksdb-${ROCKSDB_VERSION}.tar.gz | ||||||
|       URL_HASH SHA256=${ROCKSDB_HASH} |       URL_HASH SHA256=${ROCKSDB_HASH} | ||||||
|       LIST_SEPARATOR | |       LIST_SEPARATOR | | ||||||
|  |       BUILD_COMMAND  | ||||||
|  |         ${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL} | ||||||
|       CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} |       CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS} | ||||||
|         -DBUILD_SHARED_LIBS=OFF |         -DBUILD_SHARED_LIBS=OFF | ||||||
|         -DBUILD_STATIC_LIBS=ON |         -DBUILD_STATIC_LIBS=ON | ||||||
| @@ -31,4 +33,4 @@ if(PROJECT_ENABLE_ROCKSDB) | |||||||
|  |  | ||||||
|     list(APPEND PROJECT_DEPENDENCIES rocksdb_project) |     list(APPEND PROJECT_DEPENDENCIES rocksdb_project) | ||||||
|   endif() |   endif() | ||||||
| endif() | endif() | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ if(PROJECT_ENABLE_SQLITE) | |||||||
|   if(PROJECT_BUILD) |   if(PROJECT_BUILD) | ||||||
|     add_definitions(-DPROJECT_ENABLE_SQLITE) |     add_definitions(-DPROJECT_ENABLE_SQLITE) | ||||||
|     if (PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX) |     if (PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX) | ||||||
|       pkg_check_modules(SQLITE3 REQUIRED sqlite3>=${SQLITE2_VERSION}) |       pkg_check_modules(SQLITE3 REQUIRED sqlite3) | ||||||
|       include_directories(SYSTEM BEFORE ${SQLITE3_INCLUDE_DIRS}) |       include_directories(SYSTEM BEFORE ${SQLITE3_INCLUDE_DIRS}) | ||||||
|       link_libraries(${SQLITE3_LIBRARIES}) |       link_libraries(${SQLITE3_LIBRARIES}) | ||||||
|     else() |     else() | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ if(PROJECT_ENABLE_WINFSP AND PROJECT_IS_MINGW) | |||||||
|   if(PROJECT_BUILD)  |   if(PROJECT_BUILD)  | ||||||
|     add_definitions(-DPROJECT_ENABLE_WINFSP) |     add_definitions(-DPROJECT_ENABLE_WINFSP) | ||||||
|  |  | ||||||
|     include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/inc) |     include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/inc) | ||||||
|  |  | ||||||
|     link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/lib) |     link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/lib) | ||||||
|  |  | ||||||
|     if(PROJECT_IS_ARM64) |     if(PROJECT_IS_ARM64) | ||||||
|       link_libraries(winfsp-a64) |       link_libraries(winfsp-a64) | ||||||
|   | |||||||
| @@ -1,28 +1,27 @@ | |||||||
| set(BINUTILS_VERSION 2.43) | set(BINUTILS_VERSION 2.44) | ||||||
| set(BOOST_MAJOR_VERSION 1) |  | ||||||
| set(BOOST_MINOR_VERSION 87) |  | ||||||
| set(BOOST_PATCH_VERSION 0) |  | ||||||
| set(BOOST2_MAJOR_VERSION 1) | set(BOOST2_MAJOR_VERSION 1) | ||||||
| set(BOOST2_MINOR_VERSION 76) | set(BOOST2_MINOR_VERSION 76) | ||||||
| set(BOOST2_PATCH_VERSION 0) | set(BOOST2_PATCH_VERSION 0) | ||||||
| set(CPP_HTTPLIB_VERSION 0.18.1) | set(BOOST_MAJOR_VERSION 1) | ||||||
| set(CURL_VERSION 8.11.0) | set(BOOST_MINOR_VERSION 88) | ||||||
| set(CURL2_VERSION 8_11_0) | set(BOOST_PATCH_VERSION 0) | ||||||
| set(EXPAT_VERSION 2.6.4) | set(CPP_HTTPLIB_VERSION 0.23.1) | ||||||
| set(EXPAT2_VERSION 2_6_4) | set(CURL2_VERSION 8_15_0) | ||||||
| set(GCC_VERSION 14.2.0) | set(CURL_VERSION 8.15.0) | ||||||
| set(GTEST_VERSION 1.15.2) | set(EXPAT2_VERSION 2_7_1) | ||||||
|  | set(EXPAT_VERSION 2.7.1) | ||||||
|  | set(GCC_VERSION 15.1.0) | ||||||
|  | set(GTEST_VERSION 1.17.0) | ||||||
| set(ICU_VERSION 76-1) | set(ICU_VERSION 76-1) | ||||||
| set(JSON_VERSION 3.11.3) | set(JSON_VERSION 3.12.0) | ||||||
| set(LIBSODIUM_VERSION 1.0.20) | set(LIBSODIUM_VERSION 1.0.20) | ||||||
| set(MESA_VERSION 23.3.3) | set(MINGW_VERSION 13.0.0) | ||||||
| set(MINGW_VERSION 12.0.0) | set(OPENSSL_VERSION 3.5.1) | ||||||
| set(OPENSSL_VERSION 3.4.0) |  | ||||||
| set(PKG_CONFIG_VERSION 0.29.2) | set(PKG_CONFIG_VERSION 0.29.2) | ||||||
| set(PUGIXML_VERSION 1.14) | set(PUGIXML_VERSION 1.15) | ||||||
| set(ROCKSDB_VERSION 9.7.4) | set(ROCKSDB_VERSION 10.4.2) | ||||||
| set(SPDLOG_VERSION 1.15.0) | set(SPDLOG_VERSION 1.15.3) | ||||||
| set(SQLITE_VERSION 3460100) | set(SQLITE2_VERSION 3.50.3) | ||||||
| set(SQLITE2_VERSION 3.46.1) | set(SQLITE_VERSION 3500300) | ||||||
| set(STDUUID_VERSION 1.2.3) | set(STDUUID_VERSION 1.2.3) | ||||||
| set(ZLIB_VERSION 1.3.1) | set(ZLIB_VERSION 1.3.1) | ||||||
|   | |||||||
| @@ -10,15 +10,18 @@ PROJECT_DESC="Mount utility for Sia and S3" | |||||||
|  |  | ||||||
| PROJECT_MAJOR_VERSION=2 | PROJECT_MAJOR_VERSION=2 | ||||||
| PROJECT_MINOR_VERSION=0 | PROJECT_MINOR_VERSION=0 | ||||||
| PROJECT_REVISION_VERSION=3 | PROJECT_REVISION_VERSION=6 | ||||||
| PROJECT_RELEASE_NUM=0 | PROJECT_RELEASE_NUM=1 | ||||||
| PROJECT_RELEASE_ITER=rc | PROJECT_RELEASE_ITER=release | ||||||
|  |  | ||||||
| PROJECT_APP_LIST=(${PROJECT_NAME}) | PROJECT_APP_LIST=(${PROJECT_NAME}) | ||||||
|  |  | ||||||
| PROJECT_PRIVATE_KEY=${DEVELOPER_PRIVATE_KEY} | PROJECT_PRIVATE_KEY=${DEVELOPER_PRIVATE_KEY} | ||||||
| PROJECT_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY} | PROJECT_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY} | ||||||
|  |  | ||||||
|  | PROJECT_FLUTTER_BASE_HREF="/ui/" | ||||||
|  |  | ||||||
|  | PROJECT_ENABLE_V2_ERRORS=ON | ||||||
| PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF | PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF | ||||||
|  |  | ||||||
| PROJECT_ENABLE_BACKWARD_CPP=OFF | PROJECT_ENABLE_BACKWARD_CPP=OFF | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| FROM         arm64v8/alpine:3.21.0 | #comment | ||||||
|  | FROM         arm64v8/alpine:3.21.4 | ||||||
| MAINTAINER   Scott E. Graves <scott.e.graves@protonmail.com> | MAINTAINER   Scott E. Graves <scott.e.graves@protonmail.com> | ||||||
| CMD          bash | CMD          bash | ||||||
|  |  | ||||||
| @@ -30,6 +31,7 @@ RUN apk add \ | |||||||
|   gflags \ |   gflags \ | ||||||
|   gflags-dev \ |   gflags-dev \ | ||||||
|   git \ |   git \ | ||||||
|  |   git-lfs \ | ||||||
|   icu-dev \ |   icu-dev \ | ||||||
|   icu-libs \ |   icu-libs \ | ||||||
|   icu-static \ |   icu-static \ | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| FROM         alpine:3.21.0 | #comment | ||||||
|  | FROM         alpine:3.21.4 | ||||||
| MAINTAINER   Scott E. Graves <scott.e.graves@protonmail.com> | MAINTAINER   Scott E. Graves <scott.e.graves@protonmail.com> | ||||||
| CMD          bash | CMD          bash | ||||||
|  |  | ||||||
| @@ -30,6 +31,7 @@ RUN apk add \ | |||||||
|   gflags \ |   gflags \ | ||||||
|   gflags-dev \ |   gflags-dev \ | ||||||
|   git \ |   git \ | ||||||
|  |   git-lfs \ | ||||||
|   icu-dev \ |   icu-dev \ | ||||||
|   icu-libs \ |   icu-libs \ | ||||||
|   icu-static \ |   icu-static \ | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								docker/x86_64/flutter
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								docker/x86_64/flutter
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | FROM debian:latest | ||||||
|  |  | ||||||
|  | ARG UID=0 | ||||||
|  | ARG GID=0 | ||||||
|  |  | ||||||
|  | RUN apt-get update  | ||||||
|  | RUN apt-get install -y \ | ||||||
|  |   bash \ | ||||||
|  |   curl \ | ||||||
|  |   fonts-droid-fallback \ | ||||||
|  |   gdb \ | ||||||
|  |   git \ | ||||||
|  |   lib32stdc++6 \ | ||||||
|  |   libgconf-2-4 \ | ||||||
|  |   libglu1-mesa \ | ||||||
|  |   libstdc++6 \ | ||||||
|  |   python3 \ | ||||||
|  |   unzip \ | ||||||
|  |   wget | ||||||
|  | RUN apt-get clean | ||||||
|  |  | ||||||
|  | RUN git clone https://github.com/flutter/flutter.git /flutter | ||||||
|  | RUN git config --system --add safe.directory /flutter | ||||||
|  |  | ||||||
|  | ENV PATH="/flutter/bin:/flutter/bin/cache/dart-sdk/bin:${PATH}" | ||||||
|  |  | ||||||
|  | RUN flutter doctor -v | ||||||
|  | RUN flutter channel master | ||||||
|  | RUN flutter upgrade | ||||||
|  | RUN flutter --disable-analytics | ||||||
|  |  | ||||||
|  | RUN flutter config --no-analytics | ||||||
|  | RUN flutter config --enable-web | ||||||
|  | RUN flutter config --no-cli-animations | ||||||
|  |  | ||||||
|  | RUN mkdir /nonexistent | ||||||
|  | RUN chown -R $UID:$GID /nonexistent | ||||||
|  |  | ||||||
|  | RUN mkdir /.config | ||||||
|  | RUN chown -R $UID:$GID /.config | ||||||
|  |  | ||||||
|  | RUN mkdir /.dart-tool | ||||||
|  | RUN chown -R $UID:$GID /.dart-tool | ||||||
|  |  | ||||||
|  | RUN mkdir /.pub-cache | ||||||
|  | RUN chown -R $UID:$GID /.pub-cache | ||||||
|  |  | ||||||
|  | RUN chown -R $UID:$GID /flutter | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| #comment | #comment | ||||||
| FROM alpine:3.21.0 | FROM alpine:3.21.4 | ||||||
|  |  | ||||||
| RUN apk update | RUN apk update | ||||||
| RUN apk upgrade | RUN apk upgrade | ||||||
| @@ -18,6 +18,7 @@ RUN apk add \ | |||||||
|   gcc \ |   gcc \ | ||||||
|   gettext \ |   gettext \ | ||||||
|   git \ |   git \ | ||||||
|  |   git-lfs \ | ||||||
|   gmp \ |   gmp \ | ||||||
|   gmp-dev \ |   gmp-dev \ | ||||||
|   gperf \ |   gperf \ | ||||||
| @@ -350,9 +351,9 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./expat-${MY_EXPAT_VERSION}.tar.gz.sha | |||||||
|  |  | ||||||
| ARG FONTCONFIG_VERSION | ARG FONTCONFIG_VERSION | ||||||
| ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION} | ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION} | ||||||
| RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz" ]; then \ | RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz" ]; then \ | ||||||
|       cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz.sha256 && cd - \ |       cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz.sha256 && cd - \ | ||||||
|       && tar xvzf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz \ |       && tar xvJf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz \ | ||||||
|       && cd fontconfig-${MY_FONTCONFIG_VERSION} \ |       && cd fontconfig-${MY_FONTCONFIG_VERSION} \ | ||||||
|       && meson setup \ |       && meson setup \ | ||||||
|         --cross-file ${MY_TOOLCHAIN_FILE_MESON} \ |         --cross-file ${MY_TOOLCHAIN_FILE_MESON} \ | ||||||
| @@ -679,6 +680,7 @@ RUN if [ -f "/3rd_party/curl-${MY_CURL_VERSION}.tar.gz" ]; then \ | |||||||
|         -DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \ |         -DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \ | ||||||
|         -DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \ |         -DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \ | ||||||
|         -DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ |         -DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ | ||||||
|  |         -DCURL_BROTLI=OFF \ | ||||||
|         -DCURL_CA_BUNDLE=./cacert.pem \ |         -DCURL_CA_BUNDLE=./cacert.pem \ | ||||||
|         -DCURL_CA_FALLBACK=ON \ |         -DCURL_CA_FALLBACK=ON \ | ||||||
|         -DCURL_DISABLE_LDAP=ON \ |         -DCURL_DISABLE_LDAP=ON \ | ||||||
| @@ -714,6 +716,9 @@ RUN if [ -f "/3rd_party/cpp-httplib-${MY_CPP_HTTPLIB_VERSION}.tar.gz" ]; then \ | |||||||
|         -DHTTPLIB_REQUIRE_OPENSSL=ON \ |         -DHTTPLIB_REQUIRE_OPENSSL=ON \ | ||||||
|         -DHTTPLIB_REQUIRE_ZLIB=ON \ |         -DHTTPLIB_REQUIRE_ZLIB=ON \ | ||||||
|         -DHTTPLIB_TEST=OFF \ |         -DHTTPLIB_TEST=OFF \ | ||||||
|  |         -DHTTPLIB_USE_BROTLI_IF_AVAILABLE=OFF \ | ||||||
|  |         -DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=YES \ | ||||||
|  |         -DHTTPLIB_USE_ZLIB_IF_AVAILABLE=ON \ | ||||||
|       && make -j${MY_NUM_JOBS} \ |       && make -j${MY_NUM_JOBS} \ | ||||||
|       && make install \ |       && make install \ | ||||||
|       && cd ${MY_WORKDIR} \ |       && cd ${MY_WORKDIR} \ | ||||||
|   | |||||||
| @@ -31,26 +31,27 @@ private: | |||||||
|   static stop_type stop_requested; |   static stop_type stop_requested; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto default_agent_name(const provider_type &prov) | ||||||
|   default_agent_name(const provider_type &prov) -> std::string; |       -> std::string; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto default_api_port(const provider_type &prov) | ||||||
|   default_api_port(const provider_type &prov) -> std::uint16_t; |       -> std::uint16_t; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto default_data_directory(const provider_type &prov) | ||||||
|   default_data_directory(const provider_type &prov) -> std::string; |       -> std::string; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto default_remote_api_port(const provider_type &prov) | ||||||
|   default_remote_api_port(const provider_type &prov) -> std::uint16_t; |       -> std::uint16_t; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto default_rpc_port() -> std::uint16_t; | ||||||
|   default_rpc_port(const provider_type &prov) -> std::uint16_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto get_provider_display_name(const provider_type &prov) | ||||||
|   get_provider_display_name(const provider_type &prov) -> std::string; |       -> std::string; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto get_provider_name(const provider_type &prov) | ||||||
|   get_provider_name(const provider_type &prov) -> std::string; |       -> std::string; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto get_root_data_directory() -> std::string; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] static auto get_stop_requested() -> bool; |   [[nodiscard]] static auto get_stop_requested() -> bool; | ||||||
| @@ -71,7 +72,7 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|   provider_type prov_; |   provider_type prov_; | ||||||
|   atomic<std::string> api_auth_; |   atomic<std::string> api_password_; | ||||||
|   std::atomic<std::uint16_t> api_port_; |   std::atomic<std::uint16_t> api_port_; | ||||||
|   atomic<std::string> api_user_; |   atomic<std::string> api_user_; | ||||||
|   std::atomic<bool> config_changed_; |   std::atomic<bool> config_changed_; | ||||||
| @@ -91,7 +92,6 @@ private: | |||||||
|   std::atomic<std::uint8_t> max_upload_count_; |   std::atomic<std::uint8_t> max_upload_count_; | ||||||
|   std::atomic<std::uint16_t> med_freq_interval_secs_; |   std::atomic<std::uint16_t> med_freq_interval_secs_; | ||||||
|   std::atomic<std::uint16_t> online_check_retry_secs_; |   std::atomic<std::uint16_t> online_check_retry_secs_; | ||||||
|   std::atomic<std::uint16_t> orphaned_file_retention_days_; |  | ||||||
|   std::atomic<download_type> preferred_download_type_; |   std::atomic<download_type> preferred_download_type_; | ||||||
|   std::atomic<std::uint16_t> retry_read_count_; |   std::atomic<std::uint16_t> retry_read_count_; | ||||||
|   std::atomic<std::uint16_t> ring_buffer_file_size_; |   std::atomic<std::uint16_t> ring_buffer_file_size_; | ||||||
| @@ -122,7 +122,7 @@ private: | |||||||
|   auto set_value(dest &dst, const source &src) -> bool; |   auto set_value(dest &dst, const source &src) -> bool; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] auto get_api_auth() const -> std::string; |   [[nodiscard]] auto get_api_password() const -> std::string; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_api_port() const -> std::uint16_t; |   [[nodiscard]] auto get_api_port() const -> std::uint16_t; | ||||||
|  |  | ||||||
| @@ -172,8 +172,6 @@ public: | |||||||
|  |  | ||||||
|   [[nodiscard]] auto get_online_check_retry_secs() const -> std::uint16_t; |   [[nodiscard]] auto get_online_check_retry_secs() const -> std::uint16_t; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_orphaned_file_retention_days() const -> std::uint16_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_preferred_download_type() const -> download_type; |   [[nodiscard]] auto get_preferred_download_type() const -> download_type; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_provider_type() const -> provider_type; |   [[nodiscard]] auto get_provider_type() const -> provider_type; | ||||||
| @@ -192,14 +190,17 @@ public: | |||||||
|  |  | ||||||
|   [[nodiscard]] auto get_task_wait_ms() const -> std::uint16_t; |   [[nodiscard]] auto get_task_wait_ms() const -> std::uint16_t; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto get_value_by_name(const std::string &name) const | ||||||
|   get_value_by_name(const std::string &name) const -> std::string; |       -> std::string; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_raw_value_by_name(const std::string &name) const | ||||||
|  |       -> std::string; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_version() const -> std::uint64_t; |   [[nodiscard]] auto get_version() const -> std::uint64_t; | ||||||
|  |  | ||||||
|   void save(); |   void save(); | ||||||
|  |  | ||||||
|   void set_api_auth(const std::string &value); |   void set_api_password(const std::string &value); | ||||||
|  |  | ||||||
|   void set_api_port(std::uint16_t value); |   void set_api_port(std::uint16_t value); | ||||||
|  |  | ||||||
| @@ -239,8 +240,6 @@ public: | |||||||
|  |  | ||||||
|   void set_online_check_retry_secs(std::uint16_t value); |   void set_online_check_retry_secs(std::uint16_t value); | ||||||
|  |  | ||||||
|   void set_orphaned_file_retention_days(std::uint16_t value); |  | ||||||
|  |  | ||||||
|   void set_preferred_download_type(const download_type &value); |   void set_preferred_download_type(const download_type &value); | ||||||
|  |  | ||||||
|   void set_remote_config(remote::remote_config value); |   void set_remote_config(remote::remote_config value); | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ | |||||||
| #define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_ | #define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_ | ||||||
|  |  | ||||||
| #include "app_config.hpp" | #include "app_config.hpp" | ||||||
|  | #include "comm/curl/curl_shared.hpp" | ||||||
| #include "comm/curl/multi_request.hpp" | #include "comm/curl/multi_request.hpp" | ||||||
| #include "comm/i_http_comm.hpp" | #include "comm/i_http_comm.hpp" | ||||||
| #include "events/event_system.hpp" | #include "events/event_system.hpp" | ||||||
| @@ -48,14 +49,12 @@ private: | |||||||
|  |  | ||||||
|   static const write_callback write_data; |   static const write_callback write_data; | ||||||
|   static const write_callback write_headers; |   static const write_callback write_headers; | ||||||
|  |   static constexpr std::uint8_t retry_request_count{5U}; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   std::optional<host_config> host_config_; |   std::optional<host_config> host_config_; | ||||||
|   std::optional<s3_config> s3_config_; |   std::optional<s3_config> s3_config_; | ||||||
|  |  | ||||||
| private: |  | ||||||
|   bool use_s3_path_style_{false}; |  | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] static auto create_curl() -> CURL *; |   [[nodiscard]] static auto create_curl() -> CURL *; | ||||||
|  |  | ||||||
| @@ -67,8 +66,7 @@ public: | |||||||
|                                           const host_config &cfg) |                                           const host_config &cfg) | ||||||
|       -> std::string; |       -> std::string; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto create_host_config(const s3_config &cfg, |   [[nodiscard]] static auto create_host_config(const s3_config &cfg) | ||||||
|                                                bool use_s3_path_style) |  | ||||||
|       -> host_config; |       -> host_config; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto url_encode(CURL *curl, const std::string &data, |   [[nodiscard]] static auto url_encode(CURL *curl, const std::string &data, | ||||||
| @@ -139,107 +137,128 @@ public: | |||||||
|                long &response_code, stop_type &stop_requested) -> bool { |                long &response_code, stop_type &stop_requested) -> bool { | ||||||
|     REPERTORY_USES_FUNCTION_NAME(); |     REPERTORY_USES_FUNCTION_NAME(); | ||||||
|  |  | ||||||
|     if (request.decryption_token.has_value() && |  | ||||||
|         not request.decryption_token.value().empty()) { |  | ||||||
|       return make_encrypted_request(cfg, request, response_code, |  | ||||||
|                                     stop_requested); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     response_code = 0; |  | ||||||
|  |  | ||||||
|     auto *curl = create_curl(); |  | ||||||
|     if (not request.set_method(curl, stop_requested)) { |  | ||||||
|       return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (not cfg.agent_string.empty()) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_USERAGENT, cfg.agent_string.c_str()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (request.allow_timeout && cfg.timeout_ms) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, cfg.timeout_ms); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     std::string range_list{}; |  | ||||||
|     if (request.range.has_value()) { |  | ||||||
|       range_list = std::to_string(request.range.value().begin) + '-' + |  | ||||||
|                    std::to_string(request.range.value().end); |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_RANGE, range_list.c_str()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (request.response_headers.has_value()) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_HEADERDATA, |  | ||||||
|                        &request.response_headers.value()); |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     read_write_info write_info{ |  | ||||||
|         {}, |  | ||||||
|         [&stop_requested]() -> bool { |  | ||||||
|           return stop_requested || app_config::get_stop_requested(); |  | ||||||
|         }, |  | ||||||
|     }; |  | ||||||
|     if (request.response_handler.has_value()) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info); |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     std::string parameters{}; |  | ||||||
|     for (const auto ¶m : request.query) { |  | ||||||
|       parameters += (parameters.empty() ? '?' : '&') + param.first + '=' + |  | ||||||
|                     url_encode(curl, param.second, false); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (not cfg.api_password.empty()) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_PASSWORD, cfg.api_password.c_str()); |  | ||||||
|     } else if (not cfg.api_user.empty()) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (request.aws_service.has_value()) { |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_AWS_SIGV4, |  | ||||||
|                        request.aws_service.value().c_str()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     curl_slist *header_list{nullptr}; |  | ||||||
|     if (not request.headers.empty()) { |  | ||||||
|       for (const auto &header : request.headers) { |  | ||||||
|         header_list = curl_slist_append( |  | ||||||
|             header_list, |  | ||||||
|             fmt::format("{}: {}", header.first, header.second).c_str()); |  | ||||||
|       } |  | ||||||
|       curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     auto url = construct_url(curl, request.get_path(), cfg) + parameters; |  | ||||||
|     curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); |  | ||||||
|  |  | ||||||
|     multi_request curl_request(curl, stop_requested); |  | ||||||
|  |  | ||||||
|     CURLcode curl_code{}; |     CURLcode curl_code{}; | ||||||
|     curl_request.get_result(curl_code, response_code); |     const auto do_request = [&]() -> bool { | ||||||
|  |       if (request.decryption_token.has_value() && | ||||||
|  |           not request.decryption_token.value().empty()) { | ||||||
|  |         return make_encrypted_request(cfg, request, response_code, | ||||||
|  |                                       stop_requested); | ||||||
|  |       } | ||||||
|  |  | ||||||
|     if (header_list != nullptr) { |       response_code = 0; | ||||||
|       curl_slist_free_all(header_list); |  | ||||||
|  |       auto *curl = create_curl(); | ||||||
|  |       if (not request.set_method(curl, stop_requested)) { | ||||||
|  |         return false; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (not cfg.agent_string.empty()) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_USERAGENT, cfg.agent_string.c_str()); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (request.allow_timeout && cfg.timeout_ms) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, cfg.timeout_ms); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       std::string range_list{}; | ||||||
|  |       if (request.range.has_value()) { | ||||||
|  |         range_list = std::to_string(request.range.value().begin) + '-' + | ||||||
|  |                      std::to_string(request.range.value().end); | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_RANGE, range_list.c_str()); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (request.response_headers.has_value()) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_HEADERDATA, | ||||||
|  |                          &request.response_headers.value()); | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       read_write_info write_info{ | ||||||
|  |           {}, | ||||||
|  |           [&stop_requested]() -> bool { | ||||||
|  |             return stop_requested || app_config::get_stop_requested(); | ||||||
|  |           }, | ||||||
|  |       }; | ||||||
|  |       if (request.response_handler.has_value()) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info); | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       std::string parameters{}; | ||||||
|  |       for (const auto ¶m : request.query) { | ||||||
|  |         parameters += (parameters.empty() ? '?' : '&') + param.first + '=' + | ||||||
|  |                       url_encode(curl, param.second, false); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (not cfg.api_password.empty()) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_PASSWORD, cfg.api_password.c_str()); | ||||||
|  |       } else if (not cfg.api_user.empty()) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (request.aws_service.has_value()) { | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_AWS_SIGV4, | ||||||
|  |                          request.aws_service.value().c_str()); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       curl_slist *header_list{nullptr}; | ||||||
|  |       if (not request.headers.empty()) { | ||||||
|  |         for (const auto &header : request.headers) { | ||||||
|  |           header_list = curl_slist_append( | ||||||
|  |               header_list, | ||||||
|  |               fmt::format("{}: {}", header.first, header.second).c_str()); | ||||||
|  |         } | ||||||
|  |         curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       curl_shared::set_share(curl); | ||||||
|  |  | ||||||
|  |       auto url = construct_url(curl, request.get_path(), cfg) + parameters; | ||||||
|  |       curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | ||||||
|  |  | ||||||
|  |       multi_request curl_request(curl, stop_requested); | ||||||
|  |  | ||||||
|  |       curl_code = CURLE_OK; | ||||||
|  |       curl_request.get_result(curl_code, response_code); | ||||||
|  |  | ||||||
|  |       if (header_list != nullptr) { | ||||||
|  |         curl_slist_free_all(header_list); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (curl_code != CURLE_OK) { | ||||||
|  |         event_system::instance().raise<curl_error>(curl_code, function_name, | ||||||
|  |                                                    request.get_type(), url); | ||||||
|  |         return false; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (request.response_handler.has_value()) { | ||||||
|  |         request.response_handler.value()(write_info.data, response_code); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       return true; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     bool ret{false}; | ||||||
|  |     for (std::uint8_t retry = 0U; !ret && retry < retry_request_count; | ||||||
|  |          ++retry) { | ||||||
|  |       ret = do_request(); | ||||||
|  |       if (ret) { | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (curl_code == CURLE_COULDNT_RESOLVE_HOST) { | ||||||
|  |         std::this_thread::sleep_for(1s); | ||||||
|  |         continue; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (curl_code != CURLE_OK) { |     return ret; | ||||||
|       event_system::instance().raise<curl_error>(curl_code, function_name, |  | ||||||
|                                                   url); |  | ||||||
|       return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (request.response_handler.has_value()) { |  | ||||||
|       request.response_handler.value()(write_info.data, response_code); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return true; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   void enable_s3_path_style(bool enable) override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto make_request(const curl::requests::http_delete &del, |   [[nodiscard]] auto make_request(const curl::requests::http_delete &del, | ||||||
|                                   long &response_code, |                                   long &response_code, | ||||||
|                                   stop_type &stop_requested) const |                                   stop_type &stop_requested) const | ||||||
|   | |||||||
							
								
								
									
										67
									
								
								repertory/librepertory/include/comm/curl/curl_shared.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								repertory/librepertory/include/comm/curl/curl_shared.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_ | ||||||
|  |  | ||||||
|  | namespace repertory { | ||||||
|  | class curl_shared final { | ||||||
|  | private: | ||||||
|  |   struct curl_sh_deleter final { | ||||||
|  |     void operator()(CURLSH *ptr) { | ||||||
|  |       if (ptr != nullptr) { | ||||||
|  |         curl_share_cleanup(ptr); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   using curl_sh_t = std::unique_ptr<CURLSH, curl_sh_deleter>; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   curl_shared() = delete; | ||||||
|  |   curl_shared(const curl_shared &) = delete; | ||||||
|  |   curl_shared(curl_shared &&) = delete; | ||||||
|  |   ~curl_shared() = delete; | ||||||
|  |  | ||||||
|  |   auto operator=(const curl_shared &) -> curl_shared & = delete; | ||||||
|  |   auto operator=(curl_shared &&) -> curl_shared & = delete; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   static curl_sh_t cache_; | ||||||
|  |   static std::recursive_mutex mtx_; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   static void lock_callback(CURL * /* curl */, curl_lock_data /* data */, | ||||||
|  |                             curl_lock_access /* access */, void * /* ptr */); | ||||||
|  |  | ||||||
|  |   static void unlock_callback(CURL * /* curl */, curl_lock_data /* data */, | ||||||
|  |                               curl_lock_access /* access */, void * /* ptr */); | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   static void cleanup(); | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto init() -> bool; | ||||||
|  |  | ||||||
|  |   static void set_share(CURL *curl); | ||||||
|  | }; | ||||||
|  | } // namespace repertory | ||||||
|  |  | ||||||
|  | #endif // REPERTORY_INCLUDE_COMM_CURL_DNS_CACHE_HPP_ | ||||||
| @@ -26,11 +26,13 @@ | |||||||
|  |  | ||||||
| namespace repertory::curl::requests { | namespace repertory::curl::requests { | ||||||
| struct http_delete final : http_request_base { | struct http_delete final : http_request_base { | ||||||
|   ~http_delete() override = default; |   [[nodiscard]] auto get_type() const -> std::string override { | ||||||
|  |     return "delete"; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto set_method(CURL *curl, | ||||||
|   set_method(CURL *curl, |                                 stop_type & /* stop_requested */) const | ||||||
|              stop_type & /* stop_requested */) const -> bool override { |       -> bool override { | ||||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); |     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -33,9 +33,11 @@ struct http_get final : http_request_base { | |||||||
|   auto operator=(http_get &&) -> http_get & = default; |   auto operator=(http_get &&) -> http_get & = default; | ||||||
|   ~http_get() override = default; |   ~http_get() override = default; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto get_type() const -> std::string override { return "get"; } | ||||||
|   set_method(CURL *curl, |  | ||||||
|              stop_type & /*stop_requested*/) const -> bool override { |   [[nodiscard]] auto set_method(CURL *curl, | ||||||
|  |                                 stop_type & /*stop_requested*/) const | ||||||
|  |       -> bool override { | ||||||
|     curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); |     curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -26,11 +26,11 @@ | |||||||
|  |  | ||||||
| namespace repertory::curl::requests { | namespace repertory::curl::requests { | ||||||
| struct http_head final : http_request_base { | struct http_head final : http_request_base { | ||||||
|   ~http_head() override = default; |   [[nodiscard]] auto get_type() const -> std::string override { return "head"; } | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto set_method(CURL *curl, | ||||||
|   set_method(CURL *curl, |                                 stop_type & /* stop_requested */) const | ||||||
|              stop_type & /* stop_requested */) const -> bool override { |       -> bool override { | ||||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "HEAD"); |     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "HEAD"); | ||||||
|     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); |     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); | ||||||
|     return true; |     return true; | ||||||
|   | |||||||
| @@ -26,16 +26,10 @@ | |||||||
|  |  | ||||||
| namespace repertory::curl::requests { | namespace repertory::curl::requests { | ||||||
| struct http_post final : http_request_base { | struct http_post final : http_request_base { | ||||||
|   http_post() = default; |  | ||||||
|   http_post(const http_post &) = default; |  | ||||||
|   http_post(http_post &&) = default; |  | ||||||
|   auto operator=(const http_post &) -> http_post & = default; |  | ||||||
|   auto operator=(http_post &&) -> http_post & = default; |  | ||||||
|  |  | ||||||
|   ~http_post() override = default; |  | ||||||
|  |  | ||||||
|   std::optional<nlohmann::json> json; |   std::optional<nlohmann::json> json; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_type() const -> std::string override { return "post"; } | ||||||
|  |  | ||||||
|   [[nodiscard]] auto set_method(CURL *curl, |   [[nodiscard]] auto set_method(CURL *curl, | ||||||
|                                 stop_type & /*stop_requested*/) const |                                 stop_type & /*stop_requested*/) const | ||||||
|       -> bool override; |       -> bool override; | ||||||
|   | |||||||
| @@ -27,18 +27,11 @@ | |||||||
|  |  | ||||||
| namespace repertory::curl::requests { | namespace repertory::curl::requests { | ||||||
| struct http_put_file final : http_request_base { | struct http_put_file final : http_request_base { | ||||||
|   http_put_file() = default; |  | ||||||
|   http_put_file(const http_put_file &) = default; |  | ||||||
|   http_put_file(http_put_file &&) = default; |  | ||||||
|  |  | ||||||
|   auto operator=(const http_put_file &) -> http_put_file & = default; |  | ||||||
|   auto operator=(http_put_file &&) -> http_put_file & = default; |  | ||||||
|  |  | ||||||
|   ~http_put_file() override = default; |  | ||||||
|  |  | ||||||
|   std::shared_ptr<utils::encryption::encrypting_reader> reader; |   std::shared_ptr<utils::encryption::encrypting_reader> reader; | ||||||
|   std::string source_path; |   std::string source_path; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_type() const -> std::string override { return "put"; } | ||||||
|  |  | ||||||
|   [[nodiscard]] auto set_method(CURL *curl, stop_type &stop_requested) const |   [[nodiscard]] auto set_method(CURL *curl, stop_type &stop_requested) const | ||||||
|       -> bool override; |       -> bool override; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -61,6 +61,8 @@ struct http_request_base { | |||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto get_path() const -> std::string { return path; } |   [[nodiscard]] virtual auto get_path() const -> std::string { return path; } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto get_type() const -> std::string = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto set_method(CURL *curl, |   [[nodiscard]] virtual auto set_method(CURL *curl, | ||||||
|                                         stop_type &stop_requested) const |                                         stop_type &stop_requested) const | ||||||
|       -> bool = 0; |       -> bool = 0; | ||||||
|   | |||||||
| @@ -34,28 +34,29 @@ struct i_http_comm { | |||||||
|   INTERFACE_SETUP(i_http_comm); |   INTERFACE_SETUP(i_http_comm); | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual void enable_s3_path_style(bool enable) = 0; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   make_request(const curl::requests::http_delete &del, long &response_code, |   make_request(const curl::requests::http_delete &del, long &response_code, | ||||||
|                stop_type &stop_requested) const -> bool = 0; |                stop_type &stop_requested) const -> bool = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto make_request(const curl::requests::http_get &get, | ||||||
|   make_request(const curl::requests::http_get &get, long &response_code, |                                           long &response_code, | ||||||
|                stop_type &stop_requested) const -> bool = 0; |                                           stop_type &stop_requested) const | ||||||
|  |       -> bool = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto make_request(const curl::requests::http_head &head, | ||||||
|   make_request(const curl::requests::http_head &head, long &response_code, |                                           long &response_code, | ||||||
|                stop_type &stop_requested) const -> bool = 0; |                                           stop_type &stop_requested) const | ||||||
|  |       -> bool = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto make_request(const curl::requests::http_post &post, | ||||||
|   make_request(const curl::requests::http_post &post, long &response_code, |                                           long &response_code, | ||||||
|                stop_type &stop_requested) const -> bool = 0; |                                           stop_type &stop_requested) const | ||||||
|  |       -> bool = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   make_request(const curl::requests::http_put_file &put_file, |   make_request(const curl::requests::http_put_file &put_file, | ||||||
|                long &response_code, |                long &response_code, stop_type &stop_requested) const | ||||||
|                stop_type &stop_requested) const -> bool = 0; |       -> bool = 0; | ||||||
| }; | }; | ||||||
| } // namespace repertory | } // namespace repertory | ||||||
|  |  | ||||||
|   | |||||||
| @@ -94,7 +94,7 @@ private: | |||||||
|   bool shutdown_ = false; |   bool shutdown_ = false; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   static constexpr const auto min_pool_size = 10U; |   static constexpr auto min_pool_size = 10U; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   void execute(const std::string &client_id, std::uint64_t thread_id, |   void execute(const std::string &client_id, std::uint64_t thread_id, | ||||||
|   | |||||||
| @@ -54,12 +54,13 @@ REPERTORY_IGNORE_WARNINGS_DISABLE() | |||||||
| using namespace std::chrono_literals; | using namespace std::chrono_literals; | ||||||
| using json = nlohmann::json; | using json = nlohmann::json; | ||||||
|  |  | ||||||
| inline constexpr const std::string_view REPERTORY = "repertory"; | inline constexpr std::string_view REPERTORY{"repertory"}; | ||||||
| inline constexpr const std::wstring_view REPERTORY_W = L"repertory"; | inline constexpr std::string_view REPERTORY_DATA_NAME{"repertory2"}; | ||||||
|  | inline constexpr std::wstring_view REPERTORY_W{L"repertory"}; | ||||||
|  |  | ||||||
| inline constexpr const std::uint64_t REPERTORY_CONFIG_VERSION = 0ULL; | inline constexpr std::uint64_t REPERTORY_CONFIG_VERSION{2ULL}; | ||||||
| inline constexpr const std::string_view REPERTORY_DATA_NAME = "repertory2"; | inline constexpr std::string_view REPERTORY_MIN_REMOTE_VERSION{"2.0.0"}; | ||||||
| inline constexpr const std::string_view REPERTORY_MIN_REMOTE_VERSION = "2.0.0"; | inline constexpr std::string_view RENTERD_MIN_VERSION{"2.0.0"}; | ||||||
|  |  | ||||||
| #define REPERTORY_INVALID_HANDLE INVALID_HANDLE_VALUE | #define REPERTORY_INVALID_HANDLE INVALID_HANDLE_VALUE | ||||||
|  |  | ||||||
| @@ -221,44 +222,27 @@ using WCHAR = wchar_t; | |||||||
|  |  | ||||||
| #define MAX_PATH 260 | #define MAX_PATH 260 | ||||||
|  |  | ||||||
| #define STATUS_SUCCESS                                                         \ | #define STATUS_ACCESS_DENIED std::uint32_t{0xC0000022L} | ||||||
|   std::uint32_t { 0U } | #define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L} | ||||||
| #define STATUS_ACCESS_DENIED                                                   \ | #define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L} | ||||||
|   std::uint32_t { 0xC0000022L } | #define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L} | ||||||
| #define STATUS_DEVICE_BUSY                                                     \ | #define STATUS_END_OF_FILE std::uint32_t{0xC0000011L} | ||||||
|   std::uint32_t { 0x80000011L } | #define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL} | ||||||
| #define STATUS_DEVICE_INSUFFICIENT_RESOURCES                                   \ | #define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L} | ||||||
|   std::uint32_t { 0xC0000468L } | #define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL} | ||||||
| #define STATUS_DIRECTORY_NOT_EMPTY                                             \ | #define STATUS_INTERNAL_ERROR std::uint32_t{0xC00000E5L} | ||||||
|   std::uint32_t { 0xC0000101L } | #define STATUS_INVALID_ADDRESS std::uint32_t{0xC0000141L} | ||||||
| #define STATUS_FILE_IS_A_DIRECTORY                                             \ | #define STATUS_INVALID_HANDLE std::uint32_t{0xC0000006L} | ||||||
|   std::uint32_t { 0xC00000BAL } | #define STATUS_INVALID_IMAGE_FORMAT std::uint32_t{0xC000007BL} | ||||||
| #define STATUS_FILE_TOO_LARGE                                                  \ | #define STATUS_INVALID_PARAMETER std::uint32_t{0xC000000DL} | ||||||
|   std::uint32_t { 0xC0000904L } | #define STATUS_NOT_IMPLEMENTED std::uint32_t{0xC0000002L} | ||||||
| #define STATUS_INSUFFICIENT_RESOURCES                                          \ | #define STATUS_NO_MEMORY std::uint32_t{0xC0000017L} | ||||||
|   std::uint32_t { 0xC000009AL } | #define STATUS_OBJECT_NAME_COLLISION std::uint32_t{0xC0000035L} | ||||||
| #define STATUS_INTERNAL_ERROR                                                  \ | #define STATUS_OBJECT_NAME_EXISTS std::uint32_t{0x40000000L} | ||||||
|   std::uint32_t { 0xC00000E5L } | #define STATUS_OBJECT_NAME_NOT_FOUND std::uint32_t{0xC0000034L} | ||||||
| #define STATUS_INVALID_ADDRESS                                                 \ | #define STATUS_OBJECT_PATH_INVALID std::uint32_t{0xC0000039L} | ||||||
|   std::uint32_t { 0xC0000141L } | #define STATUS_SUCCESS std::uint32_t{0U} | ||||||
| #define STATUS_INVALID_HANDLE                                                  \ | #define STATUS_UNEXPECTED_IO_ERROR std::uint32_t{0xC00000E9L} | ||||||
|   std::uint32_t { 0xC0000006L } |  | ||||||
| #define STATUS_INVALID_IMAGE_FORMAT                                            \ |  | ||||||
|   std::uint32_t { 0xC000007BL } |  | ||||||
| #define STATUS_INVALID_PARAMETER                                               \ |  | ||||||
|   std::uint32_t { 0xC000000DL } |  | ||||||
| #define STATUS_NO_MEMORY                                                       \ |  | ||||||
|   std::uint32_t { 0xC0000017L } |  | ||||||
| #define STATUS_NOT_IMPLEMENTED                                                 \ |  | ||||||
|   std::uint32_t { 0xC0000002L } |  | ||||||
| #define STATUS_OBJECT_NAME_EXISTS                                              \ |  | ||||||
|   std::uint32_t { 0x40000000L } |  | ||||||
| #define STATUS_OBJECT_NAME_NOT_FOUND                                           \ |  | ||||||
|   std::uint32_t { 0xC0000034L } |  | ||||||
| #define STATUS_OBJECT_PATH_INVALID                                             \ |  | ||||||
|   std::uint32_t { 0xC0000039L } |  | ||||||
| #define STATUS_UNEXPECTED_IO_ERROR                                             \ |  | ||||||
|   std::uint32_t { 0xC00000E9L } |  | ||||||
|  |  | ||||||
| #define CONVERT_STATUS_NOT_IMPLEMENTED(e)                                      \ | #define CONVERT_STATUS_NOT_IMPLEMENTED(e)                                      \ | ||||||
|   ((std::uint32_t(e) == STATUS_NOT_IMPLEMENTED) ? -ENOTSUP : e) |   ((std::uint32_t(e) == STATUS_NOT_IMPLEMENTED) ? -ENOTSUP : e) | ||||||
|   | |||||||
| @@ -50,14 +50,14 @@ public: | |||||||
|   [[nodiscard]] auto fill_buffer(const remote::file_offset &offset, |   [[nodiscard]] auto fill_buffer(const remote::file_offset &offset, | ||||||
|                                  fuse_fill_dir_t filler_function, void *buffer, |                                  fuse_fill_dir_t filler_function, void *buffer, | ||||||
|                                  populate_stat_callback populate_stat) -> int; |                                  populate_stat_callback populate_stat) -> int; | ||||||
| #endif | #endif // !defined(_WIN32) | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get(std::size_t offset, std::string &item) -> int; |   [[nodiscard]] auto get(std::size_t offset, std::string &item) -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_count() const -> std::size_t { return items_.size(); } |   [[nodiscard]] auto get_count() const -> std::size_t { return items_.size(); } | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_directory_item(std::size_t offset, |   [[nodiscard]] auto get_directory_item(std::size_t offset, directory_item &di) | ||||||
|                                         directory_item &di) -> api_error; |       -> api_error; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_directory_item(const std::string &api_path, |   [[nodiscard]] auto get_directory_item(const std::string &api_path, | ||||||
|                                         directory_item &di) -> api_error; |                                         directory_item &di) -> api_error; | ||||||
| @@ -71,8 +71,8 @@ public: | |||||||
|   auto operator=(const directory_iterator &iterator) noexcept |   auto operator=(const directory_iterator &iterator) noexcept | ||||||
|       -> directory_iterator &; |       -> directory_iterator &; | ||||||
|  |  | ||||||
|   auto |   auto operator=(directory_iterator &&iterator) noexcept | ||||||
|   operator=(directory_iterator &&iterator) noexcept -> directory_iterator &; |       -> directory_iterator &; | ||||||
|  |  | ||||||
|   auto operator=(directory_item_list list) noexcept -> directory_iterator &; |   auto operator=(directory_item_list list) noexcept -> directory_iterator &; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -61,7 +61,7 @@ private: | |||||||
|   static auto instance() -> fuse_base &; |   static auto instance() -> fuse_base &; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   struct fuse_operations fuse_ops_ {}; |   struct fuse_operations fuse_ops_{}; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto | ||||||
| @@ -78,9 +78,9 @@ private: | |||||||
|   static void execute_void_callback(std::string_view function_name, |   static void execute_void_callback(std::string_view function_name, | ||||||
|                                     const std::function<void()> &cb); |                                     const std::function<void()> &cb); | ||||||
|  |  | ||||||
|   static auto |   static auto execute_void_pointer_callback(std::string_view function_name, | ||||||
|   execute_void_pointer_callback(std::string_view function_name, |                                             const std::function<void *()> &cb) | ||||||
|                                 const std::function<void *()> &cb) -> void *; |       -> void *; | ||||||
|  |  | ||||||
|   void raise_fuse_event(std::string_view function_name, |   void raise_fuse_event(std::string_view function_name, | ||||||
|                         std::string_view api_path, int ret, |                         std::string_view api_path, int ret, | ||||||
| @@ -91,22 +91,22 @@ private: | |||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto chflags_(const char *path, uint32_t flags) -> int; |   [[nodiscard]] static auto chflags_(const char *path, uint32_t flags) -> int; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] static auto chmod_(const char *path, mode_t mode, |   [[nodiscard]] static auto chmod_(const char *path, mode_t mode, | ||||||
|                                    struct fuse_file_info *fi) -> int; |                                    struct fuse_file_info *fi) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto chmod_(const char *path, mode_t mode) -> int; |   [[nodiscard]] static auto chmod_(const char *path, mode_t mode) -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] static auto chown_(const char *path, uid_t uid, gid_t gid, |   [[nodiscard]] static auto chown_(const char *path, uid_t uid, gid_t gid, | ||||||
|                                    struct fuse_file_info *fi) -> int; |                                    struct fuse_file_info *fi) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto chown_(const char *path, uid_t uid, |   [[nodiscard]] static auto chown_(const char *path, uid_t uid, gid_t gid) | ||||||
|                                    gid_t gid) -> int; |       -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto create_(const char *path, mode_t mode, |   [[nodiscard]] static auto create_(const char *path, mode_t mode, | ||||||
|                                     struct fuse_file_info *fi) -> int; |                                     struct fuse_file_info *fi) -> int; | ||||||
| @@ -114,19 +114,19 @@ private: | |||||||
|   static void destroy_(void *ptr); |   static void destroy_(void *ptr); | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto fallocate_(const char *path, int mode, off_t offset, |   [[nodiscard]] static auto fallocate_(const char *path, int mode, off_t offset, | ||||||
|                                        off_t length, |                                        off_t length, struct fuse_file_info *fi) | ||||||
|                                        struct fuse_file_info *fi) -> int; |       -> int; | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION < 30 | #if FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto fgetattr_(const char *path, struct stat *st, |   [[nodiscard]] static auto fgetattr_(const char *path, struct stat *st, | ||||||
|                                       struct fuse_file_info *fi) -> int; |                                       struct fuse_file_info *fi) -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION < 30 | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto fsetattr_x_(const char *path, |   [[nodiscard]] static auto fsetattr_x_(const char *path, | ||||||
|                                         struct setattr_x *attr, |                                         struct setattr_x *attr, | ||||||
|                                         struct fuse_file_info *fi) -> int; |                                         struct fuse_file_info *fi) -> int; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto fsync_(const char *path, int datasync, |   [[nodiscard]] static auto fsync_(const char *path, int datasync, | ||||||
|                                    struct fuse_file_info *fi) -> int; |                                    struct fuse_file_info *fi) -> int; | ||||||
| @@ -137,27 +137,27 @@ private: | |||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] static auto getattr_(const char *path, struct stat *st, |   [[nodiscard]] static auto getattr_(const char *path, struct stat *st, | ||||||
|                                      struct fuse_file_info *fi) -> int; |                                      struct fuse_file_info *fi) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto getattr_(const char *path, struct stat *st) -> int; |   [[nodiscard]] static auto getattr_(const char *path, struct stat *st) -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto getxtimes_(const char *path, |   [[nodiscard]] static auto getxtimes_(const char *path, | ||||||
|                                        struct timespec *bkuptime, |                                        struct timespec *bkuptime, | ||||||
|                                        struct timespec *crtime) -> int; |                                        struct timespec *crtime) -> int; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] static auto init_(struct fuse_conn_info *conn, |   [[nodiscard]] static auto init_(struct fuse_conn_info *conn, | ||||||
|                                   struct fuse_config *cfg) -> void *; |                                   struct fuse_config *cfg) -> void *; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto init_(struct fuse_conn_info *conn) -> void *; |   [[nodiscard]] static auto init_(struct fuse_conn_info *conn) -> void *; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto mkdir_(const char *path, mode_t mode) -> int; |   [[nodiscard]] static auto mkdir_(const char *path, mode_t mode) -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto open_(const char *path, |   [[nodiscard]] static auto open_(const char *path, struct fuse_file_info *fi) | ||||||
|                                   struct fuse_file_info *fi) -> int; |       -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto opendir_(const char *path, |   [[nodiscard]] static auto opendir_(const char *path, | ||||||
|                                      struct fuse_file_info *fi) -> int; |                                      struct fuse_file_info *fi) -> int; | ||||||
| @@ -171,12 +171,12 @@ private: | |||||||
|                                      fuse_fill_dir_t fuse_fill_dir, |                                      fuse_fill_dir_t fuse_fill_dir, | ||||||
|                                      off_t offset, struct fuse_file_info *fi, |                                      off_t offset, struct fuse_file_info *fi, | ||||||
|                                      fuse_readdir_flags flags) -> int; |                                      fuse_readdir_flags flags) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto readdir_(const char *path, void *buf, |   [[nodiscard]] static auto readdir_(const char *path, void *buf, | ||||||
|                                      fuse_fill_dir_t fuse_fill_dir, |                                      fuse_fill_dir_t fuse_fill_dir, | ||||||
|                                      off_t offset, |                                      off_t offset, struct fuse_file_info *fi) | ||||||
|                                      struct fuse_file_info *fi) -> int; |       -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto release_(const char *path, |   [[nodiscard]] static auto release_(const char *path, | ||||||
|                                      struct fuse_file_info *fi) -> int; |                                      struct fuse_file_info *fi) -> int; | ||||||
| @@ -187,9 +187,9 @@ private: | |||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] static auto rename_(const char *from, const char *to, |   [[nodiscard]] static auto rename_(const char *from, const char *to, | ||||||
|                                     unsigned int flags) -> int; |                                     unsigned int flags) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto rename_(const char *from, const char *to) -> int; |   [[nodiscard]] static auto rename_(const char *from, const char *to) -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto rmdir_(const char *path) -> int; |   [[nodiscard]] static auto rmdir_(const char *path) -> int; | ||||||
|  |  | ||||||
| @@ -199,35 +199,36 @@ private: | |||||||
|                                       char *value, size_t size, |                                       char *value, size_t size, | ||||||
|                                       uint32_t position) -> int; |                                       uint32_t position) -> int; | ||||||
|  |  | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto getxattr_(const char *path, const char *name, |   [[nodiscard]] static auto getxattr_(const char *path, const char *name, | ||||||
|                                       char *value, size_t size) -> int; |                                       char *value, size_t size) -> int; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto listxattr_(const char *path, char *buffer, |   [[nodiscard]] static auto listxattr_(const char *path, char *buffer, | ||||||
|                                        size_t size) -> int; |                                        size_t size) -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto removexattr_(const char *path, |   [[nodiscard]] static auto removexattr_(const char *path, const char *name) | ||||||
|                                          const char *name) -> int; |       -> int; | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto setxattr_(const char *path, const char *name, |   [[nodiscard]] static auto setxattr_(const char *path, const char *name, | ||||||
|                                       const char *value, size_t size, int flags, |                                       const char *value, size_t size, int flags, | ||||||
|                                       uint32_t position) -> int; |                                       uint32_t position) -> int; | ||||||
|  |  | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto setxattr_(const char *path, const char *name, |   [[nodiscard]] static auto setxattr_(const char *path, const char *name, | ||||||
|                                       const char *value, size_t size, |                                       const char *value, size_t size, int flags) | ||||||
|                                       int flags) -> int; |       -> int; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
| #endif // HAS_SETXATTR | #endif // defined(HAS_SETXATTR) | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto setattr_x_(const char *path, |   [[nodiscard]] static auto setattr_x_(const char *path, struct setattr_x *attr) | ||||||
|                                        struct setattr_x *attr) -> int; |       -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto setbkuptime_(const char *path, | ||||||
|   setbkuptime_(const char *path, const struct timespec *bkuptime) -> int; |                                          const struct timespec *bkuptime) | ||||||
|  |       -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto setchgtime_(const char *path, |   [[nodiscard]] static auto setchgtime_(const char *path, | ||||||
|                                         const struct timespec *chgtime) -> int; |                                         const struct timespec *chgtime) -> int; | ||||||
| @@ -237,20 +238,20 @@ private: | |||||||
|  |  | ||||||
|   [[nodiscard]] static auto setvolname_(const char *volname) -> int; |   [[nodiscard]] static auto setvolname_(const char *volname) -> int; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto statfs_x_(const char *path, |   [[nodiscard]] static auto statfs_x_(const char *path, struct statfs *stbuf) | ||||||
|                                       struct statfs *stbuf) -> int; |       -> int; | ||||||
|  |  | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto statfs_(const char *path, |   [[nodiscard]] static auto statfs_(const char *path, struct statvfs *stbuf) | ||||||
|                                     struct statvfs *stbuf) -> int; |       -> int; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] static auto truncate_(const char *path, off_t size, |   [[nodiscard]] static auto truncate_(const char *path, off_t size, | ||||||
|                                       struct fuse_file_info *fi) -> int; |                                       struct fuse_file_info *fi) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto truncate_(const char *path, off_t size) -> int; |   [[nodiscard]] static auto truncate_(const char *path, off_t size) -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto unlink_(const char *path) -> int; |   [[nodiscard]] static auto unlink_(const char *path) -> int; | ||||||
|  |  | ||||||
| @@ -258,18 +259,18 @@ private: | |||||||
|   [[nodiscard]] static auto utimens_(const char *path, |   [[nodiscard]] static auto utimens_(const char *path, | ||||||
|                                      const struct timespec tv[2], |                                      const struct timespec tv[2], | ||||||
|                                      struct fuse_file_info *fi) -> int; |                                      struct fuse_file_info *fi) -> int; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] static auto utimens_(const char *path, |   [[nodiscard]] static auto utimens_(const char *path, | ||||||
|                                      const struct timespec tv[2]) -> int; |                                      const struct timespec tv[2]) -> int; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto write_(const char *path, const char *buffer, |   [[nodiscard]] static auto write_(const char *path, const char *buffer, | ||||||
|                                    size_t write_size, off_t write_offset, |                                    size_t write_size, off_t write_offset, | ||||||
|                                    struct fuse_file_info *fi) -> int; |                                    struct fuse_file_info *fi) -> int; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|   [[nodiscard]] virtual auto access_impl(std::string /*api_path*/, |   [[nodiscard]] virtual auto access_impl(std::string /*api_path*/, int /*mask*/) | ||||||
|                                          int /*mask*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -278,37 +279,40 @@ protected: | |||||||
|                                           uint32_t /*flags*/) -> api_error { |                                           uint32_t /*flags*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto chmod_impl(std::string /*api_path*/, | ||||||
|   chmod_impl(std::string /*api_path*/, mode_t /*mode*/, |                                         mode_t /*mode*/, | ||||||
|              struct fuse_file_info * /*fi*/) -> api_error { |                                         struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else //FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto chmod_impl(std::string /*api_path*/, |   [[nodiscard]] virtual auto chmod_impl(std::string /*api_path*/, | ||||||
|                                         mode_t /*mode*/) -> api_error { |                                         mode_t /*mode*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto chown_impl(std::string /*api_path*/, uid_t /*uid*/, | ||||||
|   chown_impl(std::string /*api_path*/, uid_t /*uid*/, gid_t /*gid*/, |                                         gid_t /*gid*/, | ||||||
|              struct fuse_file_info * /*fi*/) -> api_error { |                                         struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto chown_impl(std::string /*api_path*/, uid_t /*uid*/, |   [[nodiscard]] virtual auto chown_impl(std::string /*api_path*/, uid_t /*uid*/, | ||||||
|                                         gid_t /*gid*/) -> api_error { |                                         gid_t /*gid*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto create_impl(std::string /*api_path*/, | ||||||
|   create_impl(std::string /*api_path*/, mode_t /*mode*/, |                                          mode_t /*mode*/, | ||||||
|               struct fuse_file_info * /*fi*/) -> api_error { |                                          struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -316,81 +320,87 @@ protected: | |||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   fallocate_impl(std::string /*api_path*/, int /*mode*/, off_t /*offset*/, |   fallocate_impl(std::string /*api_path*/, int /*mode*/, off_t /*offset*/, | ||||||
|                  off_t /*length*/, |                  off_t /*length*/, struct fuse_file_info * /*fi*/) | ||||||
|                  struct fuse_file_info * /*fi*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto fgetattr_impl(std::string /*api_path*/, | ||||||
|   fgetattr_impl(std::string /*api_path*/, struct stat * /*st*/, |                                            struct stat * /*st*/, | ||||||
|                 struct fuse_file_info * /*fi*/) -> api_error { |                                            struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto fsetattr_x_impl(std::string /*api_path*/, | ||||||
|   fsetattr_x_impl(std::string /*api_path*/, struct setattr_x * /*attr*/, |                                              struct setattr_x * /*attr*/, | ||||||
|                   struct fuse_file_info * /*fi*/) -> api_error { |                                              struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto fsync_impl(std::string /*api_path*/, | ||||||
|   fsync_impl(std::string /*api_path*/, int /*datasync*/, |                                         int /*datasync*/, | ||||||
|              struct fuse_file_info * /*fi*/) -> api_error { |                                         struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION < 30 | #if FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto ftruncate_impl(std::string /*api_path*/, | ||||||
|   ftruncate_impl(std::string /*api_path*/, off_t /*size*/, |                                             off_t /*size*/, | ||||||
|                  struct fuse_file_info * /*fi*/) -> api_error { |                                             struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION < 30 | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto getattr_impl(std::string /*api_path*/, | ||||||
|   getattr_impl(std::string /*api_path*/, struct stat * /*st*/, |                                           struct stat * /*st*/, | ||||||
|                struct fuse_file_info * /*fi*/) -> api_error { |                                           struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto getattr_impl(std::string /*api_path*/, |   [[nodiscard]] virtual auto getattr_impl(std::string /*api_path*/, | ||||||
|                                           struct stat * /*st*/) -> api_error { |                                           struct stat * /*st*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto getxtimes_impl(std::string /*api_path*/, | ||||||
|   getxtimes_impl(std::string /*api_path*/, struct timespec * /*bkuptime*/, |                                             struct timespec * /*bkuptime*/, | ||||||
|                  struct timespec * /*crtime*/) -> api_error { |                                             struct timespec * /*crtime*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   virtual auto init_impl(struct fuse_conn_info *conn, |   virtual auto init_impl(struct fuse_conn_info *conn, struct fuse_config *cfg) | ||||||
|                          struct fuse_config *cfg) -> void *; |       -> void *; | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   virtual auto init_impl(struct fuse_conn_info *conn) -> void *; |   virtual auto init_impl(struct fuse_conn_info *conn) -> void *; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto mkdir_impl(std::string /*api_path*/, |   [[nodiscard]] virtual auto mkdir_impl(std::string /*api_path*/, | ||||||
|                                         mode_t /*mode*/) -> api_error { |                                         mode_t /*mode*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto open_impl(std::string /*api_path*/, | ||||||
|   open_impl(std::string /*api_path*/, |                                        struct fuse_file_info * /*fi*/) | ||||||
|             struct fuse_file_info * /*fi*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto opendir_impl(std::string /*api_path*/, | ||||||
|   opendir_impl(std::string /*api_path*/, |                                           struct fuse_file_info * /*fi*/) | ||||||
|                struct fuse_file_info * /*fi*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -405,28 +415,28 @@ protected: | |||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   readdir_impl(std::string /*api_path*/, void * /*buf*/, |   readdir_impl(std::string /*api_path*/, void * /*buf*/, | ||||||
|                fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, |                fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, | ||||||
|                struct fuse_file_info * /*fi*/, |                struct fuse_file_info * /*fi*/, fuse_readdir_flags /*flags*/) | ||||||
|                fuse_readdir_flags /*flags*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   readdir_impl(std::string /*api_path*/, void * /*buf*/, |   readdir_impl(std::string /*api_path*/, void * /*buf*/, | ||||||
|                fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, |                fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, | ||||||
|                struct fuse_file_info * /*fi*/) -> api_error { |                struct fuse_file_info * /*fi*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto release_impl(std::string /*api_path*/, | ||||||
|   release_impl(std::string /*api_path*/, |                                           struct fuse_file_info * /*fi*/) | ||||||
|                struct fuse_file_info * /*fi*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto releasedir_impl(std::string /*api_path*/, | ||||||
|   releasedir_impl(std::string /*api_path*/, |                                              struct fuse_file_info * /*fi*/) | ||||||
|                   struct fuse_file_info * /*fi*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -436,13 +446,13 @@ protected: | |||||||
|                                          unsigned int /*flags*/) -> api_error { |                                          unsigned int /*flags*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto rename_impl(std::string /*from_api_path*/, | ||||||
|   rename_impl(std::string /*from_api_path*/, |                                          std::string /*to_api_path*/) | ||||||
|               std::string /*to_api_path*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto rmdir_impl(std::string /*api_path*/) -> api_error { |   [[nodiscard]] virtual auto rmdir_impl(std::string /*api_path*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
| @@ -456,14 +466,14 @@ protected: | |||||||
|                 int & /*attribute_size*/) -> api_error { |                 int & /*attribute_size*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   getxattr_impl(std::string /*api_path*/, const char * /*name*/, |   getxattr_impl(std::string /*api_path*/, const char * /*name*/, | ||||||
|                 char * /*value*/, size_t /*size*/, |                 char * /*value*/, size_t /*size*/, int & /*attribute_size*/) | ||||||
|                 int & /*attribute_size*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   listxattr_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*size*/, |   listxattr_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*size*/, | ||||||
| @@ -471,9 +481,9 @@ protected: | |||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto removexattr_impl(std::string /*api_path*/, | ||||||
|   removexattr_impl(std::string /*api_path*/, |                                               const char * /*name*/) | ||||||
|                    const char * /*name*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -485,21 +495,20 @@ protected: | |||||||
|                                            uint32_t /*position*/) -> api_error { |                                            uint32_t /*position*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else  // __APPLE__ | #else  // !defined (__APPLE__) | ||||||
|   [[nodiscard]] virtual auto setxattr_impl(std::string /*api_path*/, |   [[nodiscard]] virtual auto | ||||||
|                                            const char * /*name*/, |   setxattr_impl(std::string /*api_path*/, const char * /*name*/, | ||||||
|                                            const char * /*value*/, |                 const char * /*value*/, size_t /*size*/, int /*flags*/) | ||||||
|                                            size_t /*size*/, |       -> api_error { | ||||||
|                                            int /*flags*/) -> api_error { |  | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif // __APPLE__ | #endif // defined (__APPLE__) | ||||||
| #endif // HAS_SETXATTR | #endif // defined(HAS_SETXATTR) | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto setattr_x_impl(std::string /*api_path*/, | ||||||
|   setattr_x_impl(std::string /*api_path*/, |                                             struct setattr_x * /*attr*/) | ||||||
|                  struct setattr_x * /*attr*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -510,72 +519,74 @@ protected: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   setchgtime_impl(std::string /*api_path*/, |   setchgtime_impl(std::string /*api_path*/, const struct timespec * /*chgtime*/) | ||||||
|                   const struct timespec * /*chgtime*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto setcrtime_impl(std::string /*api_path*/, | ||||||
|   setcrtime_impl(std::string /*api_path*/, |                                             const struct timespec * /*crtime*/) | ||||||
|                  const struct timespec * /*crtime*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto setvolname_impl(const char * /*volname*/) | ||||||
|   setvolname_impl(const char * /*volname*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto statfs_x_impl(std::string /*api_path*/, | ||||||
|   statfs_x_impl(std::string /*api_path*/, |                                            struct statfs * /*stbuf*/) | ||||||
|                 struct statfs * /*stbuf*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto statfs_impl(std::string /*api_path*/, | ||||||
|   statfs_impl(std::string /*api_path*/, |                                          struct statvfs * /*stbuf*/) | ||||||
|               struct statvfs * /*stbuf*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto truncate_impl(std::string /*api_path*/, | ||||||
|   truncate_impl(std::string /*api_path*/, off_t /*size*/, |                                            off_t /*size*/, | ||||||
|                 struct fuse_file_info * /*fi*/) -> api_error { |                                            struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto truncate_impl(std::string /*api_path*/, |   [[nodiscard]] virtual auto truncate_impl(std::string /*api_path*/, | ||||||
|                                            off_t /*size*/) -> api_error { |                                            off_t /*size*/) -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto unlink_impl(std::string /*api_path*/) | ||||||
|   unlink_impl(std::string /*api_path*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto utimens_impl(std::string /*api_path*/, | ||||||
|   utimens_impl(std::string /*api_path*/, const struct timespec /*tv*/[2], |                                           const struct timespec /*tv*/[2], | ||||||
|                struct fuse_file_info * /*fi*/) -> api_error { |                                           struct fuse_file_info * /*fi*/) | ||||||
|  |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #else | #else // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto utimens_impl(std::string /*api_path*/, | ||||||
|   utimens_impl(std::string /*api_path*/, |                                           const struct timespec /*tv*/[2]) | ||||||
|                const struct timespec /*tv*/[2]) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   write_impl(std::string /*api_path*/, const char * /*buffer*/, |   write_impl(std::string /*api_path*/, const char * /*buffer*/, | ||||||
|              size_t /*write_size*/, off_t /*write_offset*/, |              size_t /*write_size*/, off_t /*write_offset*/, | ||||||
|              struct fuse_file_info * /*fi*/, |              struct fuse_file_info * /*fi*/, std::size_t & /*bytes_written*/) | ||||||
|              std::size_t & /*bytes_written*/) -> api_error { |       -> api_error { | ||||||
|     return api_error::not_implemented; |     return api_error::not_implemented; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -603,5 +614,5 @@ public: | |||||||
| }; | }; | ||||||
| } // namespace repertory | } // namespace repertory | ||||||
|  |  | ||||||
| #endif // _WIN32 | #endif // !defined(_WIN32) | ||||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_BASE_HPP_ | #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_BASE_HPP_ | ||||||
|   | |||||||
| @@ -73,92 +73,95 @@ private: | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto chflags_impl(std::string api_path, |   [[nodiscard]] auto chflags_impl(std::string api_path, uint32_t flags) | ||||||
|                                   uint32_t flags) -> api_error override; |       -> api_error override; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__{} | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto chmod_impl(std::string api_path, mode_t mode, | ||||||
|   chmod_impl(std::string api_path, mode_t mode, |                                 struct fuse_file_info *file_info) | ||||||
|              struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] auto chmod_impl(std::string api_path, |   [[nodiscard]] auto chmod_impl(std::string api_path, mode_t mode) | ||||||
|                                 mode_t mode) -> api_error override; |       -> api_error override; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto chown_impl(std::string api_path, uid_t uid, gid_t gid, | ||||||
|   chown_impl(std::string api_path, uid_t uid, gid_t gid, |                                 struct fuse_file_info *file_info) | ||||||
|              struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] auto chown_impl(std::string api_path, uid_t uid, |   [[nodiscard]] auto chown_impl(std::string api_path, uid_t uid, gid_t gid) | ||||||
|                                 gid_t gid) -> api_error override; |       -> api_error override; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto create_impl(std::string api_path, mode_t mode, | ||||||
|   create_impl(std::string api_path, mode_t mode, |                                  struct fuse_file_info *file_info) | ||||||
|               struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   void destroy_impl(void *ptr) override; |   void destroy_impl(void *ptr) override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fallocate_impl(std::string api_path, int mode, | ||||||
|   fallocate_impl(std::string api_path, int mode, off_t offset, off_t length, |                                     off_t offset, off_t length, | ||||||
|                  struct fuse_file_info *file_info) -> api_error override; |                                     struct fuse_file_info *file_info) | ||||||
|  |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fgetattr_impl(std::string api_path, struct stat *unix_st, | ||||||
|   fgetattr_impl(std::string api_path, struct stat *unix_st, |                                    struct fuse_file_info *file_info) | ||||||
|                 struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fsetattr_x_impl(std::string api_path, | ||||||
|   fsetattr_x_impl(std::string api_path, struct setattr_x *attr, |                                      struct setattr_x *attr, | ||||||
|                   struct fuse_file_info *file_info) -> api_error override; |                                      struct fuse_file_info *file_info) | ||||||
| #endif // __APPLE__ |       -> api_error override; | ||||||
|  | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fsync_impl(std::string api_path, int datasync, | ||||||
|   fsync_impl(std::string api_path, int datasync, |                                 struct fuse_file_info *file_info) | ||||||
|              struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION < 30 | #if FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto ftruncate_impl(std::string api_path, off_t size, | ||||||
|   ftruncate_impl(std::string api_path, off_t size, |                                     struct fuse_file_info *file_info) | ||||||
|                  struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
| #endif | #endif // FUSE_USE_VERSION < 30 | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto getattr_impl(std::string api_path, struct stat *unix_st, | ||||||
|   getattr_impl(std::string api_path, struct stat *unix_st, |                                   struct fuse_file_info *file_info) | ||||||
|                struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] auto getattr_impl(std::string api_path, |   [[nodiscard]] auto getattr_impl(std::string api_path, struct stat *unix_st) | ||||||
|                                   struct stat *unix_st) -> api_error override; |       -> api_error override; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto getxtimes_impl(std::string api_path, | ||||||
|   getxtimes_impl(std::string api_path, struct timespec *bkuptime, |                                     struct timespec *bkuptime, | ||||||
|                  struct timespec *crtime) -> api_error override; |                                     struct timespec *crtime) | ||||||
| #endif // __APPLE__ |       -> api_error override; | ||||||
|  | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   auto init_impl(struct fuse_conn_info *conn, |   auto init_impl(struct fuse_conn_info *conn, struct fuse_config *cfg) | ||||||
|                  struct fuse_config *cfg) -> void * override; |       -> void * override; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   auto init_impl(struct fuse_conn_info *conn) -> void * override; |   auto init_impl(struct fuse_conn_info *conn) -> void * override; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] auto mkdir_impl(std::string api_path, |   [[nodiscard]] auto mkdir_impl(std::string api_path, mode_t mode) | ||||||
|                                 mode_t mode) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   void notify_fuse_main_exit(int &ret) override; |   void notify_fuse_main_exit(int &ret) override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto open_impl(std::string api_path, | ||||||
|   open_impl(std::string api_path, |                                struct fuse_file_info *file_info) | ||||||
|             struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto opendir_impl(std::string api_path, | ||||||
|   opendir_impl(std::string api_path, |                                   struct fuse_file_info *file_info) | ||||||
|                struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto read_impl(std::string api_path, char *buffer, |   [[nodiscard]] auto read_impl(std::string api_path, char *buffer, | ||||||
|                                size_t read_size, off_t read_offset, |                                size_t read_size, off_t read_offset, | ||||||
| @@ -166,121 +169,124 @@ protected: | |||||||
|                                std::size_t &bytes_read) -> api_error override; |                                std::size_t &bytes_read) -> api_error override; | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto readdir_impl(std::string api_path, void *buf, | ||||||
|   readdir_impl(std::string api_path, void *buf, fuse_fill_dir_t fuse_fill_dir, |                                   fuse_fill_dir_t fuse_fill_dir, off_t offset, | ||||||
|                off_t offset, struct fuse_file_info *file_info, |                                   struct fuse_file_info *file_info, | ||||||
|                fuse_readdir_flags flags) -> api_error override; |                                   fuse_readdir_flags flags) | ||||||
| #else |       -> api_error override; | ||||||
|   [[nodiscard]] auto | #else  // FUSE_USE_VERSION < 30 | ||||||
|   readdir_impl(std::string api_path, void *buf, fuse_fill_dir_t fuse_fill_dir, |   [[nodiscard]] auto readdir_impl(std::string api_path, void *buf, | ||||||
|                off_t offset, |                                   fuse_fill_dir_t fuse_fill_dir, off_t offset, | ||||||
|                struct fuse_file_info *file_info) -> api_error override; |                                   struct fuse_file_info *file_info) | ||||||
| #endif |       -> api_error override; | ||||||
|  | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto release_impl(std::string api_path, | ||||||
|   release_impl(std::string api_path, |                                   struct fuse_file_info *file_info) | ||||||
|                struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto releasedir_impl(std::string api_path, | ||||||
|   releasedir_impl(std::string api_path, |                                      struct fuse_file_info *file_info) | ||||||
|                   struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto rename_impl(std::string from_api_path, |   [[nodiscard]] auto rename_impl(std::string from_api_path, | ||||||
|                                  std::string to_api_path, |                                  std::string to_api_path, unsigned int flags) | ||||||
|                                  unsigned int flags) -> api_error override; |       -> api_error override; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] auto rename_impl(std::string from_api_path, |   [[nodiscard]] auto rename_impl(std::string from_api_path, | ||||||
|                                  std::string to_api_path) -> api_error override; |                                  std::string to_api_path) -> api_error override; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] auto rmdir_impl(std::string api_path) -> api_error override; |   [[nodiscard]] auto rmdir_impl(std::string api_path) -> api_error override; | ||||||
|  |  | ||||||
| #if defined(HAS_SETXATTR) | #if defined(HAS_SETXATTR) | ||||||
|   [[nodiscard]] auto getxattr_common(std::string api_path, const char *name, |   [[nodiscard]] auto getxattr_common(std::string api_path, const char *name, | ||||||
|                                      char *value, size_t size, |                                      char *value, size_t size, | ||||||
|                                      int &attribute_size, |                                      int &attribute_size, uint32_t *position) | ||||||
|                                      uint32_t *position) -> api_error; |       -> api_error; | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto getxattr_impl(std::string api_path, const char *name, |   [[nodiscard]] auto getxattr_impl(std::string api_path, const char *name, | ||||||
|                                    char *value, size_t size, uint32_t position, |                                    char *value, size_t size, uint32_t position, | ||||||
|                                    int &attribute_size) -> api_error override; |                                    int &attribute_size) -> api_error override; | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] auto getxattr_impl(std::string api_path, const char *name, |   [[nodiscard]] auto getxattr_impl(std::string api_path, const char *name, | ||||||
|                                    char *value, size_t size, |                                    char *value, size_t size, | ||||||
|                                    int &attribute_size) -> api_error override; |                                    int &attribute_size) -> api_error override; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] auto listxattr_impl(std::string api_path, char *buffer, |   [[nodiscard]] auto listxattr_impl(std::string api_path, char *buffer, | ||||||
|                                     size_t size, int &required_size, |                                     size_t size, int &required_size, | ||||||
|                                     bool &return_size) -> api_error override; |                                     bool &return_size) -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto removexattr_impl(std::string api_path, |   [[nodiscard]] auto removexattr_impl(std::string api_path, const char *name) | ||||||
|                                       const char *name) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto setxattr_impl(std::string api_path, const char *name, |   [[nodiscard]] auto setxattr_impl(std::string api_path, const char *name, | ||||||
|                                    const char *value, size_t size, int flags, |                                    const char *value, size_t size, int flags, | ||||||
|                                    uint32_t position) -> api_error override; |                                    uint32_t position) -> api_error override; | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] auto setxattr_impl(std::string api_path, const char *name, |   [[nodiscard]] auto setxattr_impl(std::string api_path, const char *name, | ||||||
|                                    const char *value, size_t size, |                                    const char *value, size_t size, int flags) | ||||||
|                                    int flags) -> api_error override; |       -> api_error override; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
| #endif // HAS_SETXATTR | #endif // defined(HAS_SETXATTR{} | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto setattr_x_impl(std::string api_path, | ||||||
|   setattr_x_impl(std::string api_path, |                                     struct setattr_x *attr) | ||||||
|                  struct setattr_x *attr) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto setbkuptime_impl(std::string api_path, | ||||||
|   setbkuptime_impl(std::string api_path, |                                       const struct timespec *bkuptime) | ||||||
|                    const struct timespec *bkuptime) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto setchgtime_impl(std::string api_path, | ||||||
|   setchgtime_impl(std::string api_path, |                                      const struct timespec *chgtime) | ||||||
|                   const struct timespec *chgtime) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto setcrtime_impl(std::string api_path, | ||||||
|   setcrtime_impl(std::string api_path, |                                     const struct timespec *crtime) | ||||||
|                  const struct timespec *crtime) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto setvolname_impl(const char *volname) -> api_error override; |   [[nodiscard]] auto setvolname_impl(const char *volname) -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto statfs_x_impl(std::string api_path, |   [[nodiscard]] auto statfs_x_impl(std::string api_path, struct statfs *stbuf) | ||||||
|                                    struct statfs *stbuf) -> api_error override; |       -> api_error override; | ||||||
| #else  // __APPLE__ | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] auto statfs_impl(std::string api_path, |   [[nodiscard]] auto statfs_impl(std::string api_path, struct statvfs *stbuf) | ||||||
|                                  struct statvfs *stbuf) -> api_error override; |       -> api_error override; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto truncate_impl(std::string api_path, off_t size, | ||||||
|   truncate_impl(std::string api_path, off_t size, |                                    struct fuse_file_info *file_info) | ||||||
|                 struct fuse_file_info *file_info) -> api_error override; |       -> api_error override; | ||||||
| #else | #else  // FUSE_USE_VERSION < 30 | ||||||
|   [[nodiscard]] auto truncate_impl(std::string api_path, |   [[nodiscard]] auto truncate_impl(std::string api_path, off_t size) | ||||||
|                                    off_t size) -> api_error override; |       -> api_error override; | ||||||
| #endif | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] auto unlink_impl(std::string api_path) -> api_error override; |   [[nodiscard]] auto unlink_impl(std::string api_path) -> api_error override; | ||||||
|  |  | ||||||
| #if FUSE_USE_VERSION >= 30 | #if FUSE_USE_VERSION >= 30 | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto utimens_impl(std::string api_path, | ||||||
|   utimens_impl(std::string api_path, const struct timespec tv[2], |                                   const struct timespec tv[2], | ||||||
|                struct fuse_file_info *file_info) -> api_error override; |                                   struct fuse_file_info *file_info) | ||||||
| #else |       -> api_error override; | ||||||
|   [[nodiscard]] auto | #else  // FUSE_USE_VERSION < 30 | ||||||
|   utimens_impl(std::string api_path, |   [[nodiscard]] auto utimens_impl(std::string api_path, | ||||||
|                const struct timespec tv[2]) -> api_error override; |                                   const struct timespec tv[2]) | ||||||
| #endif |       -> api_error override; | ||||||
|  | #endif // FUSE_USE_VERSION >= 30 | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto write_impl(std::string api_path, const char *buffer, | ||||||
|   write_impl(std::string api_path, const char *buffer, size_t write_size, |                                 size_t write_size, off_t write_offset, | ||||||
|              off_t write_offset, struct fuse_file_info *file_info, |                                 struct fuse_file_info *file_info, | ||||||
|              std::size_t &bytes_written) -> api_error override; |                                 std::size_t &bytes_written) | ||||||
|  |       -> api_error override; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] auto get_directory_item_count(const std::string &api_path) const |   [[nodiscard]] auto get_directory_item_count(const std::string &api_path) const | ||||||
| @@ -289,16 +295,17 @@ public: | |||||||
|   [[nodiscard]] auto get_directory_items(const std::string &api_path) const |   [[nodiscard]] auto get_directory_items(const std::string &api_path) const | ||||||
|       -> directory_item_list override; |       -> directory_item_list override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto get_file_size(const std::string &api_path) const | ||||||
|   get_file_size(const std::string &api_path) const -> std::uint64_t override; |       -> std::uint64_t override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||||
|   get_item_meta(const std::string &api_path, |                                    api_meta_map &meta) const | ||||||
|                 api_meta_map &meta) const -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||||
|   get_item_meta(const std::string &api_path, const std::string &name, |                                    const std::string &name, | ||||||
|                 std::string &value) const -> api_error override; |                                    std::string &value) const | ||||||
|  |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_total_drive_space() const -> std::uint64_t override; |   [[nodiscard]] auto get_total_drive_space() const -> std::uint64_t override; | ||||||
|  |  | ||||||
| @@ -309,21 +316,24 @@ public: | |||||||
|   void get_volume_info(UINT64 &total_size, UINT64 &free_size, |   void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||||
|                        std::string &volume_label) const override; |                        std::string &volume_label) const override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto is_processing(const std::string &api_path) const | ||||||
|   is_processing(const std::string &api_path) const -> bool override; |       -> bool override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto rename_directory(const std::string &from_api_path, | ||||||
|   rename_directory(const std::string &from_api_path, |                                       const std::string &to_api_path) | ||||||
|                    const std::string &to_api_path) -> int override; |       -> int override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto rename_file(const std::string &from_api_path, |   [[nodiscard]] auto rename_file(const std::string &from_api_path, | ||||||
|                                  const std::string &to_api_path, |                                  const std::string &to_api_path, bool overwrite) | ||||||
|                                  bool overwrite) -> int override; |       -> int override; | ||||||
|  |  | ||||||
|   void set_item_meta(const std::string &api_path, const std::string &key, |   void set_item_meta(const std::string &api_path, const std::string &key, | ||||||
|                      const std::string &value) override; |                      const std::string &value) override; | ||||||
|  |  | ||||||
|  |   void set_item_meta(const std::string &api_path, | ||||||
|  |                      const api_meta_map &meta) override; | ||||||
| }; | }; | ||||||
| } // namespace repertory | } // namespace repertory | ||||||
|  |  | ||||||
| #endif // _WIN32 | #endif // !defined(_WIN32) | ||||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_DRIVE_HPP_ | #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_DRIVE_HPP_ | ||||||
|   | |||||||
| @@ -43,16 +43,17 @@ public: | |||||||
|   auto operator=(fuse_drive_base &&) -> fuse_drive_base & = delete; |   auto operator=(fuse_drive_base &&) -> fuse_drive_base & = delete; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|   [[nodiscard]] auto access_impl(std::string api_path, |   [[nodiscard]] auto access_impl(std::string api_path, int mask) | ||||||
|                                  int mask) -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|   [[nodiscard]] auto check_access(const std::string &api_path, |   [[nodiscard]] auto check_access(const std::string &api_path, int mask) const | ||||||
|                                   int mask) const -> api_error; |       -> api_error; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto check_and_perform( |   [[nodiscard]] auto | ||||||
|       const std::string &api_path, int parent_mask, |   check_and_perform(const std::string &api_path, int parent_mask, | ||||||
|       const std::function<api_error(api_meta_map &meta)> &action) -> api_error; |                     const std::function<api_error(api_meta_map &meta)> &action) | ||||||
|  |       -> api_error; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_current_gid() const -> gid_t; |   [[nodiscard]] auto get_current_gid() const -> gid_t; | ||||||
|  |  | ||||||
| @@ -62,58 +63,60 @@ protected: | |||||||
|  |  | ||||||
|   [[nodiscard]] auto get_effective_uid() const -> uid_t; |   [[nodiscard]] auto get_effective_uid() const -> uid_t; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto check_open_flags(int flags, int mask, | ||||||
|   check_open_flags(int flags, int mask, |                                              api_error fail_error) -> api_error; | ||||||
|                    const api_error &fail_error) -> api_error; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto check_owner(const api_meta_map &meta) const -> api_error; |   [[nodiscard]] auto check_owner(const api_meta_map &meta) const -> api_error; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto check_readable(int flags, api_error fail_error) | ||||||
|   check_readable(int flags, const api_error &fail_error) -> api_error; |       -> api_error; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto check_writeable(int flags, api_error fail_error) | ||||||
|   check_writeable(int flags, const api_error &fail_error) -> api_error; |       -> api_error; | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto get_flags_from_meta(const api_meta_map &meta) | ||||||
|   get_flags_from_meta(const api_meta_map &meta) -> __uint32_t; |       -> __uint32_t; | ||||||
| #endif // __APPLE__ | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto get_gid_from_meta(const api_meta_map &meta) | ||||||
|   get_gid_from_meta(const api_meta_map &meta) -> gid_t; |       -> gid_t; | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto get_mode_from_meta(const api_meta_map &meta) | ||||||
|   get_mode_from_meta(const api_meta_map &meta) -> mode_t; |       -> mode_t; | ||||||
|  |  | ||||||
|   static void get_timespec_from_meta(const api_meta_map &meta, |   static void get_timespec_from_meta(const api_meta_map &meta, | ||||||
|                                      const std::string &name, |                                      const std::string &name, | ||||||
|                                      struct timespec &ts); |                                      struct timespec &ts); | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |   [[nodiscard]] static auto get_uid_from_meta(const api_meta_map &meta) | ||||||
|   get_uid_from_meta(const api_meta_map &meta) -> uid_t; |       -> uid_t; | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto parse_xattr_parameters(const char *name, | ||||||
|   parse_xattr_parameters(const char *name, const uint32_t &position, |                                             const uint32_t &position, | ||||||
|                          std::string &attribute_name, |                                             std::string &attribute_name, | ||||||
|                          const std::string &api_path) -> api_error; |                                             const std::string &api_path) | ||||||
| #else |       -> api_error; | ||||||
|   [[nodiscard]] auto | #else  // !defined(__APPLE__) | ||||||
|   parse_xattr_parameters(const char *name, std::string &attribute_name, |   [[nodiscard]] auto parse_xattr_parameters(const char *name, | ||||||
|                          const std::string &api_path) -> api_error; |                                             std::string &attribute_name, | ||||||
| #endif |                                             const std::string &api_path) | ||||||
|  |       -> api_error; | ||||||
|  | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
| #if defined(__APPLE__) | #if defined(__APPLE__) | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto | ||||||
|   parse_xattr_parameters(const char *name, const char *value, size_t size, |   parse_xattr_parameters(const char *name, const char *value, size_t size, | ||||||
|                          const uint32_t &position, std::string &attribute_name, |                          const uint32_t &position, std::string &attribute_name, | ||||||
|                          const std::string &api_path) -> api_error; |                          const std::string &api_path) -> api_error; | ||||||
| #else | #else  // !defined(__APPLE__) | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto parse_xattr_parameters(const char *name, const char *value, | ||||||
|   parse_xattr_parameters(const char *name, const char *value, size_t size, |                                             size_t size, | ||||||
|                          std::string &attribute_name, |                                             std::string &attribute_name, | ||||||
|                          const std::string &api_path) -> api_error; |                                             const std::string &api_path) | ||||||
| #endif |       -> api_error; | ||||||
|  | #endif // defined(__APPLE__) | ||||||
|  |  | ||||||
|   static void populate_stat(const std::string &api_path, |   static void populate_stat(const std::string &api_path, | ||||||
|                             std::uint64_t size_or_count, |                             std::uint64_t size_or_count, | ||||||
| @@ -125,13 +128,13 @@ protected: | |||||||
|                                      struct timespec &ts); |                                      struct timespec &ts); | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto check_owner(const std::string &api_path) const | ||||||
|   check_owner(const std::string &api_path) const -> api_error override; |       -> api_error override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto check_parent_access(const std::string &api_path, |   [[nodiscard]] auto check_parent_access(const std::string &api_path, | ||||||
|                                          int mask) const -> api_error override; |                                          int mask) const -> api_error override; | ||||||
| }; | }; | ||||||
| } // namespace repertory | } // namespace repertory | ||||||
|  |  | ||||||
| #endif // _WIN32 | #endif // !defined(_WIN32) | ||||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_DRIVE_BASE_HPP_ | #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_DRIVE_BASE_HPP_ | ||||||
|   | |||||||
| @@ -30,29 +30,32 @@ class i_fuse_drive { | |||||||
|   INTERFACE_SETUP(i_fuse_drive); |   INTERFACE_SETUP(i_fuse_drive); | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto check_owner(const std::string &api_path) const | ||||||
|   check_owner(const std::string &api_path) const -> api_error = 0; |       -> api_error = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto check_parent_access(const std::string &api_path, | ||||||
|  |                                                  int mask) const | ||||||
|  |       -> api_error = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   check_parent_access(const std::string &api_path, |   get_directory_item_count(const std::string &api_path) const | ||||||
|                       int mask) const -> api_error = 0; |       -> std::uint64_t = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto get_directory_item_count( |  | ||||||
|       const std::string &api_path) const -> std::uint64_t = 0; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto get_directory_items( |  | ||||||
|       const std::string &api_path) const -> directory_item_list = 0; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto | ||||||
|   get_file_size(const std::string &api_path) const -> std::uint64_t = 0; |   get_directory_items(const std::string &api_path) const | ||||||
|  |       -> directory_item_list = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto get_file_size(const std::string &api_path) const | ||||||
|   get_item_meta(const std::string &api_path, |       -> std::uint64_t = 0; | ||||||
|                 api_meta_map &meta) const -> api_error = 0; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||||
|   get_item_meta(const std::string &api_path, const std::string &name, |                                            api_meta_map &meta) const | ||||||
|                 std::string &value) const -> api_error = 0; |       -> api_error = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||||
|  |                                            const std::string &name, | ||||||
|  |                                            std::string &value) const | ||||||
|  |       -> api_error = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto get_total_drive_space() const -> std::uint64_t = 0; |   [[nodiscard]] virtual auto get_total_drive_space() const -> std::uint64_t = 0; | ||||||
|  |  | ||||||
| @@ -63,12 +66,12 @@ public: | |||||||
|   virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, |   virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||||
|                                std::string &volume_label) const = 0; |                                std::string &volume_label) const = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto is_processing(const std::string &api_path) const | ||||||
|   is_processing(const std::string &api_path) const -> bool = 0; |       -> bool = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto |   [[nodiscard]] virtual auto rename_directory(const std::string &from_api_path, | ||||||
|   rename_directory(const std::string &from_api_path, |                                               const std::string &to_api_path) | ||||||
|                    const std::string &to_api_path) -> int = 0; |       -> int = 0; | ||||||
|  |  | ||||||
|   [[nodiscard]] virtual auto rename_file(const std::string &from_api_path, |   [[nodiscard]] virtual auto rename_file(const std::string &from_api_path, | ||||||
|                                          const std::string &to_api_path, |                                          const std::string &to_api_path, | ||||||
| @@ -77,8 +80,11 @@ public: | |||||||
|   virtual void set_item_meta(const std::string &api_path, |   virtual void set_item_meta(const std::string &api_path, | ||||||
|                              const std::string &key, |                              const std::string &key, | ||||||
|                              const std::string &value) = 0; |                              const std::string &value) = 0; | ||||||
|  |  | ||||||
|  |   virtual void set_item_meta(const std::string &api_path, | ||||||
|  |                              const api_meta_map &meta) = 0; | ||||||
| }; | }; | ||||||
| } // namespace repertory | } // namespace repertory | ||||||
|  |  | ||||||
| #endif | #endif // !defined(_WIN32) | ||||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_I_FUSE_DRIVE_HPP_ | #endif // REPERTORY_INCLUDE_DRIVES_FUSE_I_FUSE_DRIVE_HPP_ | ||||||
|   | |||||||
| @@ -38,10 +38,12 @@ public: | |||||||
| private: | private: | ||||||
|   const app_config &config_; |   const app_config &config_; | ||||||
|   packet_client packet_client_; |   packet_client packet_client_; | ||||||
|   remote::user_id uid_ = 0; |   remote::user_id uid_{0}; | ||||||
|   remote::group_id gid_ = 0; |   remote::group_id gid_{0}; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|  |   [[nodiscard]] auto check() -> packet::error_type; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_access(const char *path, const std::int32_t &mask) |   [[nodiscard]] auto fuse_access(const char *path, const std::int32_t &mask) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
| @@ -51,9 +53,9 @@ public: | |||||||
|   [[nodiscard]] auto fuse_chmod(const char *path, const remote::file_mode &mode) |   [[nodiscard]] auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_chown(const char *path, const remote::user_id &uid, | ||||||
|   fuse_chown(const char *path, const remote::user_id &uid, |                                 const remote::group_id &gid) | ||||||
|              const remote::group_id &gid) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_destroy() -> packet::error_type override; |   [[nodiscard]] auto fuse_destroy() -> packet::error_type override; | ||||||
|  |  | ||||||
| @@ -67,21 +69,23 @@ public: | |||||||
|                 const remote::file_handle &handle) |                 const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_fsetattr_x( |   [[nodiscard]] auto fuse_fsetattr_x(const char *path, | ||||||
|       const char *path, const remote::setattr_x &attr, |                                      const remote::setattr_x &attr, | ||||||
|       const remote::file_handle &handle) -> packet::error_type override; |                                      const remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||||
|   fuse_fsync(const char *path, const std::int32_t &datasync, |                                 const remote::file_handle &handle) | ||||||
|              const remote::file_handle &handle) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_ftruncate( |   [[nodiscard]] auto fuse_ftruncate(const char *path, | ||||||
|       const char *path, const remote::file_offset &size, |                                     const remote::file_offset &size, | ||||||
|       const remote::file_handle &handle) -> packet::error_type override; |                                     const remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_getattr(const char *path, remote::stat &st, | ||||||
|   fuse_getattr(const char *path, remote::stat &st, |                                   bool &directory) | ||||||
|                bool &directory) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   /*[[nodiscard]] packet::error_type fuse_getxattr(const char *path, const char |   /*[[nodiscard]] packet::error_type fuse_getxattr(const char *path, const char | ||||||
|   *name, char *value, const remote::file_size &size) override ; |   *name, char *value, const remote::file_size &size) override ; | ||||||
| @@ -90,9 +94,10 @@ public: | |||||||
|   *name, char *value, const remote::file_size &size, std::uint32_t position) |   *name, char *value, const remote::file_size &size, std::uint32_t position) | ||||||
|   override ;*/ |   override ;*/ | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_getxtimes(const char *path, | ||||||
|   fuse_getxtimes(const char *path, remote::file_time &bkuptime, |                                     remote::file_time &bkuptime, | ||||||
|                  remote::file_time &crtime) -> packet::error_type override; |                                     remote::file_time &crtime) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_init() -> packet::error_type override; |   [[nodiscard]] auto fuse_init() -> packet::error_type override; | ||||||
|  |  | ||||||
| @@ -107,25 +112,27 @@ public: | |||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto | ||||||
|   fuse_create(const char *path, const remote::file_mode &mode, |   fuse_create(const char *path, const remote::file_mode &mode, | ||||||
|               const remote::open_flags &flags, |               const remote::open_flags &flags, remote::file_handle &handle) | ||||||
|               remote::file_handle &handle) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_open(const char *path, | ||||||
|   fuse_open(const char *path, const remote::open_flags &flags, |                                const remote::open_flags &flags, | ||||||
|             remote::file_handle &handle) -> packet::error_type override; |                                remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_read(const char *path, char *buffer, | ||||||
|   fuse_read(const char *path, char *buffer, const remote::file_size &read_size, |                                const remote::file_size &read_size, | ||||||
|             const remote::file_offset &read_offset, |                                const remote::file_offset &read_offset, | ||||||
|             const remote::file_handle &handle) -> packet::error_type override; |                                const remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_rename(const char *from, |   [[nodiscard]] auto fuse_rename(const char *from, const char *to) | ||||||
|                                  const char *to) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto | ||||||
|   fuse_readdir(const char *path, const remote::file_offset &offset, |   fuse_readdir(const char *path, const remote::file_offset &offset, | ||||||
|                const remote::file_handle &handle, |                const remote::file_handle &handle, std::string &item_path) | ||||||
|                std::string &item_path) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_release(const char *path, |   [[nodiscard]] auto fuse_release(const char *path, | ||||||
|                                   const remote::file_handle &handle) |                                   const remote::file_handle &handle) | ||||||
| @@ -139,8 +146,8 @@ public: | |||||||
|    * char *name) override |    * char *name) override | ||||||
|    * ;*/ |    * ;*/ | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_rmdir(const char *path) | ||||||
|   fuse_rmdir(const char *path) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_setattr_x(const char *path, remote::setattr_x &attr) |   [[nodiscard]] auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
| @@ -157,8 +164,8 @@ public: | |||||||
|                                     const remote::file_time &crtime) |                                     const remote::file_time &crtime) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_setvolname(const char *volname) | ||||||
|   fuse_setvolname(const char *volname) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] /*packet::error_type fuse_setxattr(const char *path, const char |   [[nodiscard]] /*packet::error_type fuse_setxattr(const char *path, const char | ||||||
|   *name, const char *value, const remote::file_size &size, const std::int32_t |   *name, const char *value, const remote::file_size &size, const std::int32_t | ||||||
| @@ -169,45 +176,48 @@ public: | |||||||
|   std::int32_t &flags, std::uint32_t position) override ;*/ |   std::int32_t &flags, std::uint32_t position) override ;*/ | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto | ||||||
|   fuse_statfs(const char *path, std::uint64_t frsize, |   fuse_statfs(const char *path, std::uint64_t frsize, remote::statfs &st) | ||||||
|               remote::statfs &st) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||||
|   fuse_statfs_x(const char *path, std::uint64_t bsize, |                                    remote::statfs_x &st) | ||||||
|                 remote::statfs_x &st) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_truncate(const char *path, | ||||||
|   fuse_truncate(const char *path, |                                    const remote::file_offset &size) | ||||||
|                 const remote::file_offset &size) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_unlink(const char *path) | ||||||
|   fuse_unlink(const char *path) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||||
|   fuse_utimens(const char *path, const remote::file_time *tv, std::uint64_t op0, |                                   std::uint64_t op0, std::uint64_t op1) | ||||||
|                std::uint64_t op1) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |   [[nodiscard]] auto fuse_write(const char *path, const char *buffer, | ||||||
|   fuse_write(const char *path, const char *buffer, |                                 const remote::file_size &write_size, | ||||||
|              const remote::file_size &write_size, |                                 const remote::file_offset &write_offset, | ||||||
|              const remote::file_offset &write_offset, |                                 const remote::file_handle &handle) | ||||||
|              const remote::file_handle &handle) -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto fuse_write_base64( |   [[nodiscard]] auto fuse_write_base64(const char *path, const char *buffer, | ||||||
|       const char *path, const char *buffer, const remote::file_size &write_size, |                                        const remote::file_size &write_size, | ||||||
|       const remote::file_offset &write_offset, |                                        const remote::file_offset &write_offset, | ||||||
|       const remote::file_handle &handle) -> packet::error_type override; |                                        const remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto json_create_directory_snapshot( |   [[nodiscard]] auto json_create_directory_snapshot(const std::string &path, | ||||||
|       const std::string &path, json &json_data) -> packet::error_type override; |                                                     json &json_data) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto json_read_directory_snapshot( |   [[nodiscard]] auto json_read_directory_snapshot( | ||||||
|       const std::string &path, const remote::file_handle &handle, |       const std::string &path, const remote::file_handle &handle, | ||||||
|       std::uint32_t page, json &json_data) -> packet::error_type override; |       std::uint32_t page, json &json_data) -> packet::error_type override; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto json_release_directory_snapshot( |   [[nodiscard]] auto | ||||||
|       const std::string &path, |   json_release_directory_snapshot(const std::string &path, | ||||||
|       const remote::file_handle &handle) -> packet::error_type override; |                                   const remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   void set_fuse_uid_gid(const remote::user_id &uid, |   void set_fuse_uid_gid(const remote::user_id &uid, | ||||||
|                         const remote::group_id &gid) override; |                         const remote::group_id &gid) override; | ||||||
|   | |||||||
| @@ -59,7 +59,8 @@ private: | |||||||
|  |  | ||||||
|   static void populate_stat(const struct stat64 &unix_st, remote::stat &r_stat); |   static void populate_stat(const struct stat64 &unix_st, remote::stat &r_stat); | ||||||
|  |  | ||||||
|   [[nodiscard]] auto update_to_windows_format(json &item) -> json &; |   [[nodiscard]] auto update_to_windows_format(const std::string &root_api_path, | ||||||
|  |                                               json &item) -> json &; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   // FUSE Layer |   // FUSE Layer | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -29,87 +29,92 @@ class i_remote_instance : public virtual i_remote_json { | |||||||
|   INTERFACE_SETUP(i_remote_instance); |   INTERFACE_SETUP(i_remote_instance); | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) |   [[nodiscard]] virtual auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, |   [[nodiscard]] virtual auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, | ||||||
|                               BOOLEAN &was_deleted) -> packet::error_type = 0; |                                             UINT32 flags, BOOLEAN &was_deleted) | ||||||
|  |  | ||||||
|   virtual auto winfsp_close(PVOID file_desc) -> packet::error_type = 0; |  | ||||||
|  |  | ||||||
|   virtual auto winfsp_create(PWSTR file_name, UINT32 create_options, |  | ||||||
|                              UINT32 granted_access, UINT32 file_attributes, |  | ||||||
|                              UINT64 allocation_size, PVOID *file_desc, |  | ||||||
|                              remote::file_info *file_info, |  | ||||||
|                              std::string &normalized_name, BOOLEAN &exists) |  | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) |   [[nodiscard]] virtual auto winfsp_close(PVOID file_desc) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) |   [[nodiscard]] virtual auto | ||||||
|  |   winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||||
|  |                 UINT32 file_attributes, UINT64 allocation_size, | ||||||
|  |                 PVOID *file_desc, remote::file_info *file_info, | ||||||
|  |                 std::string &normalized_name, BOOLEAN &exists) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_get_file_info(PVOID file_desc, |   [[nodiscard]] virtual auto winfsp_flush(PVOID file_desc, | ||||||
|                                     remote::file_info *file_info) |                                           remote::file_info *file_info) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto |   [[nodiscard]] virtual auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||||
|  |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto winfsp_get_file_info(PVOID file_desc, | ||||||
|  |                                                   remote::file_info *file_info) | ||||||
|  |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto | ||||||
|   winfsp_get_security_by_name(PWSTR file_name, PUINT32 file_attributes, |   winfsp_get_security_by_name(PWSTR file_name, PUINT32 file_attributes, | ||||||
|                               std::uint64_t *security_descriptor_size, |                               std::uint64_t *security_descriptor_size, | ||||||
|                               std::wstring &str_descriptor) |                               std::wstring &str_descriptor) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, |   [[nodiscard]] virtual auto winfsp_get_volume_info(UINT64 &total_size, | ||||||
|                                       std::string &volume_label) |                                                     UINT64 &free_size, | ||||||
|  |                                                     std::string &volume_label) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_mounted(const std::wstring &location) |   [[nodiscard]] virtual auto winfsp_mounted(const std::wstring &location) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_open(PWSTR file_name, UINT32 create_options, |   [[nodiscard]] virtual auto | ||||||
|                            UINT32 granted_access, PVOID *file_desc, |   winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||||
|                            remote::file_info *file_info, |               PVOID *file_desc, remote::file_info *file_info, | ||||||
|                            std::string &normalized_name) |               std::string &normalized_name) -> packet::error_type = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto | ||||||
|  |   winfsp_overwrite(PVOID file_desc, UINT32 file_attributes, | ||||||
|  |                    BOOLEAN replace_file_attributes, UINT64 allocation_size, | ||||||
|  |                    remote::file_info *file_info) -> packet::error_type = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto winfsp_read(PVOID file_desc, PVOID buffer, | ||||||
|  |                                          UINT64 offset, UINT32 length, | ||||||
|  |                                          PUINT32 bytes_transferred) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_overwrite(PVOID file_desc, UINT32 file_attributes, |   [[nodiscard]] virtual auto winfsp_read_directory(PVOID file_desc, | ||||||
|                                 BOOLEAN replace_file_attributes, |                                                    PWSTR pattern, PWSTR marker, | ||||||
|                                 UINT64 allocation_size, |                                                    json &itemList) | ||||||
|                                 remote::file_info *file_info) |  | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, |   [[nodiscard]] virtual auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||||
|                            UINT32 length, PUINT32 bytes_transferred) |                                            PWSTR new_file_name, | ||||||
|  |                                            BOOLEAN replace_if_exists) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, |   [[nodiscard]] virtual auto | ||||||
|                                      PWSTR marker, json &itemList) |   winfsp_set_basic_info(PVOID file_desc, UINT32 file_attributes, | ||||||
|  |                         UINT64 creation_time, UINT64 last_access_time, | ||||||
|  |                         UINT64 last_write_time, UINT64 change_time, | ||||||
|  |                         remote::file_info *file_info) -> packet::error_type = 0; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] virtual auto winfsp_set_file_size(PVOID file_desc, | ||||||
|  |                                                   UINT64 new_size, | ||||||
|  |                                                   BOOLEAN set_allocation_size, | ||||||
|  |                                                   remote::file_info *file_info) | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_rename(PVOID file_desc, PWSTR file_name, |   [[nodiscard]] virtual auto winfsp_unmounted(const std::wstring &location) | ||||||
|                              PWSTR new_file_name, BOOLEAN replace_if_exists) |  | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
|  |  | ||||||
|   virtual auto winfsp_set_basic_info(PVOID file_desc, UINT32 file_attributes, |   [[nodiscard]] virtual auto | ||||||
|                                      UINT64 creation_time, |   winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||||
|                                      UINT64 last_access_time, |                BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||||
|                                      UINT64 last_write_time, UINT64 change_time, |                PUINT32 bytes_transferred, remote::file_info *file_info) | ||||||
|                                      remote::file_info *file_info) |  | ||||||
|       -> packet::error_type = 0; |  | ||||||
|  |  | ||||||
|   virtual auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, |  | ||||||
|                                     BOOLEAN set_allocation_size, |  | ||||||
|                                     remote::file_info *file_info) |  | ||||||
|       -> packet::error_type = 0; |  | ||||||
|  |  | ||||||
|   virtual auto winfsp_unmounted(const std::wstring &location) |  | ||||||
|       -> packet::error_type = 0; |  | ||||||
|  |  | ||||||
|   virtual auto winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, |  | ||||||
|                             UINT32 length, BOOLEAN write_to_end, |  | ||||||
|                             BOOLEAN constrained_io, PUINT32 bytes_transferred, |  | ||||||
|                             remote::file_info *file_info) |  | ||||||
|       -> packet::error_type = 0; |       -> packet::error_type = 0; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ | |||||||
| #include "comm/packet/packet_client.hpp" | #include "comm/packet/packet_client.hpp" | ||||||
| #include "drives/remote/remote_open_file_table.hpp" | #include "drives/remote/remote_open_file_table.hpp" | ||||||
| #include "drives/winfsp/remotewinfsp/i_remote_instance.hpp" | #include "drives/winfsp/remotewinfsp/i_remote_instance.hpp" | ||||||
|  | #include "types/remote.hpp" | ||||||
|  |  | ||||||
| namespace repertory { | namespace repertory { | ||||||
| class app_config; | class app_config; | ||||||
| @@ -43,93 +44,105 @@ private: | |||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| #define to_handle(x) (x) | #define to_handle(x) (x) | ||||||
| #else  // !defined(_WIN32) | #else  // !defined(_WIN32) | ||||||
|   static auto to_handle(PVOID file_desc) -> native_handle; |   [[nodiscard]] static auto to_handle(PVOID file_desc) -> native_handle; | ||||||
| #endif // defined(_WIN32) | #endif // defined(_WIN32) | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) |   [[nodiscard]] auto check() -> packet::error_type; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto json_create_directory_snapshot(const std::string &path, | ||||||
|  |                                                     json &json_data) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto json_read_directory_snapshot(const std::string &path, |   [[nodiscard]] auto json_read_directory_snapshot( | ||||||
|                                     const remote::file_handle &handle, |       const std::string &path, const remote::file_handle &handle, | ||||||
|                                     std::uint32_t page, json &json_data) |       std::uint32_t page, json &json_data) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   json_release_directory_snapshot(const std::string &path, | ||||||
|  |                                   const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto json_release_directory_snapshot(const std::string &path, |   [[nodiscard]] auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||||
|                                        const remote::file_handle &handle) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) |   [[nodiscard]] auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, | ||||||
|  |                                     UINT32 flags, BOOLEAN &was_deleted) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, |   [[nodiscard]] auto winfsp_close(PVOID file_desc) | ||||||
|                       BOOLEAN &was_deleted) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_create(PWSTR file_name, UINT32 create_options, |  | ||||||
|                      UINT32 granted_access, UINT32 attributes, |  | ||||||
|                      UINT64 allocation_size, PVOID *file_desc, |  | ||||||
|                      remote::file_info *file_info, std::string &normalized_name, |  | ||||||
|                      BOOLEAN &exists) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) |   [[nodiscard]] auto | ||||||
|  |   winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||||
|  |                 UINT32 attributes, UINT64 allocation_size, PVOID *file_desc, | ||||||
|  |                 remote::file_info *file_info, std::string &normalized_name, | ||||||
|  |                 BOOLEAN &exists) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) |   [[nodiscard]] auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, |   [[nodiscard]] auto winfsp_get_file_info(PVOID file_desc, | ||||||
|                                    std::uint64_t *descriptor_size, |                                           remote::file_info *file_info) | ||||||
|                                    std::wstring &string_descriptor) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, |   [[nodiscard]] auto winfsp_get_security_by_name( | ||||||
|                               std::string &volume_label) |       PWSTR file_name, PUINT32 attributes, std::uint64_t *descriptor_size, | ||||||
|  |       std::wstring &string_descriptor) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_get_volume_info(UINT64 &total_size, | ||||||
|  |                                             UINT64 &free_size, | ||||||
|  |                                             std::string &volume_label) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_mounted(const std::wstring &location) |   [[nodiscard]] auto winfsp_mounted(const std::wstring &location) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, |   [[nodiscard]] auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||||
|                    UINT32 granted_access, PVOID *file_desc, |                                  UINT32 granted_access, PVOID *file_desc, | ||||||
|                    remote::file_info *file_info, std::string &normalized_name) |                                  remote::file_info *file_info, | ||||||
|  |                                  std::string &normalized_name) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, |   [[nodiscard]] auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, |                                       BOOLEAN replace_attributes, | ||||||
|                         remote::file_info *file_info) |                                       UINT64 allocation_size, | ||||||
|  |                                       remote::file_info *file_info) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, |   [[nodiscard]] auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; |                                  UINT32 length, PUINT32 bytes_transferred) | ||||||
|  |  | ||||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, |  | ||||||
|                              json &itemList) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, |  | ||||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, |  | ||||||
|                              UINT64 creation_time, UINT64 last_access_time, |  | ||||||
|                              UINT64 last_write_time, UINT64 change_time, |  | ||||||
|                              remote::file_info *file_info) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, |   [[nodiscard]] auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, | ||||||
|                             BOOLEAN set_allocation_size, |                                            PWSTR marker, json &itemList) | ||||||
|                             remote::file_info *file_info) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_unmounted(const std::wstring &location) |   [[nodiscard]] auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||||
|  |                                    PWSTR new_file_name, | ||||||
|  |                                    BOOLEAN replace_if_exists) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, |   [[nodiscard]] auto winfsp_set_basic_info( | ||||||
|                     BOOLEAN write_to_end, BOOLEAN constrained_io, |       PVOID file_desc, UINT32 attributes, UINT64 creation_time, | ||||||
|                     PUINT32 bytes_transferred, remote::file_info *file_info) |       UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time, | ||||||
|  |       remote::file_info *file_info) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||||
|  |                                           BOOLEAN set_allocation_size, | ||||||
|  |                                           remote::file_info *file_info) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_unmounted(const std::wstring &location) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||||
|  |                BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||||
|  |                PUINT32 bytes_transferred, remote::file_info *file_info) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
| }; | }; | ||||||
| } // namespace remote_winfsp | } // namespace remote_winfsp | ||||||
|   | |||||||
| @@ -58,41 +58,46 @@ private: | |||||||
|  |  | ||||||
| public: | public: | ||||||
|   // FUSE Layer |   // FUSE Layer | ||||||
|   auto fuse_access(const char *path, const std::int32_t &mask) |   [[nodiscard]] auto fuse_access(const char *path, const std::int32_t &mask) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_chflags(const char *path, std::uint32_t flags) |   [[nodiscard]] auto fuse_chflags(const char *path, std::uint32_t flags) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_chmod(const char *path, const remote::file_mode &mode) |   [[nodiscard]] auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_chown(const char *path, const remote::user_id &uid, |   [[nodiscard]] auto fuse_chown(const char *path, const remote::user_id &uid, | ||||||
|                   const remote::group_id &gid) -> packet::error_type override; |                                 const remote::group_id &gid) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_destroy() -> packet::error_type override; |   [[nodiscard]] auto fuse_destroy() -> packet::error_type override; | ||||||
|  |  | ||||||
|   /*packet::error_type fuse_fallocate(const char *path, const std::int32_t |   /*packet::error_type fuse_fallocate(const char *path, const std::int32_t | ||||||
|      &mode, const remote::file_offset &offset, const remote::file_offset |      &mode, const remote::file_offset &offset, const remote::file_offset | ||||||
|      &length, const remote::file_handle &handle) override ;*/ |      &length, const remote::file_handle &handle) override ;*/ | ||||||
|  |  | ||||||
|   auto fuse_fgetattr(const char *path, remote::stat &r_stat, bool &directory, |   [[nodiscard]] auto fuse_fgetattr(const char *path, remote::stat &r_stat, | ||||||
|                      const remote::file_handle &handle) |                                    bool &directory, | ||||||
|  |                                    const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, |   [[nodiscard]] auto fuse_fsetattr_x(const char *path, | ||||||
|                        const remote::file_handle &handle) |                                      const remote::setattr_x &attr, | ||||||
|  |                                      const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_fsync(const char *path, const std::int32_t &datasync, |   [[nodiscard]] auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||||
|                   const remote::file_handle &handle) |                                 const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_ftruncate(const char *path, const remote::file_offset &size, |   [[nodiscard]] auto fuse_ftruncate(const char *path, | ||||||
|                       const remote::file_handle &handle) |                                     const remote::file_offset &size, | ||||||
|  |                                     const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_getattr(const char *path, remote::stat &r_stat, bool &directory) |   [[nodiscard]] auto fuse_getattr(const char *path, remote::stat &r_stat, | ||||||
|  |                                   bool &directory) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   /*packet::error_type fuse_getxattr(const char *path, const char *name, char |   /*packet::error_type fuse_getxattr(const char *path, const char *name, char | ||||||
| @@ -101,77 +106,90 @@ public: | |||||||
|   packet::error_type fuse_getxattrOSX(const char *path, const char *name, char |   packet::error_type fuse_getxattrOSX(const char *path, const char *name, char | ||||||
|   *value, const remote::file_size &size, std::uint32_t position) override ;*/ |   *value, const remote::file_size &size, std::uint32_t position) override ;*/ | ||||||
|  |  | ||||||
|   auto fuse_getxtimes(const char *path, remote::file_time &bkuptime, |   [[nodiscard]] auto fuse_getxtimes(const char *path, | ||||||
|                       remote::file_time &crtime) -> packet::error_type override; |                                     remote::file_time &bkuptime, | ||||||
|  |                                     remote::file_time &crtime) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_init() -> packet::error_type override; |   [[nodiscard]] auto fuse_init() -> packet::error_type override; | ||||||
|  |  | ||||||
|   /*packet::error_type fuse_listxattr(const char *path, char *buffer, |   /*packet::error_type fuse_listxattr(const char *path, char *buffer, | ||||||
|                                          const remote::file_size &size) override |                                          const remote::file_size &size) override | ||||||
|      ;*/ |      ;*/ | ||||||
|  |  | ||||||
|   auto fuse_mkdir(const char *path, const remote::file_mode &mode) |   [[nodiscard]] auto fuse_mkdir(const char *path, const remote::file_mode &mode) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_opendir(const char *path, remote::file_handle &handle) |   [[nodiscard]] auto fuse_opendir(const char *path, remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_create(const char *path, const remote::file_mode &mode, |   [[nodiscard]] auto | ||||||
|                    const remote::open_flags &flags, remote::file_handle &handle) |   fuse_create(const char *path, const remote::file_mode &mode, | ||||||
|  |               const remote::open_flags &flags, remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_open(const char *path, const remote::open_flags &flags, |   [[nodiscard]] auto fuse_open(const char *path, | ||||||
|                  remote::file_handle &handle) -> packet::error_type override; |                                const remote::open_flags &flags, | ||||||
|  |                                remote::file_handle &handle) | ||||||
|   auto fuse_read(const char *path, char *buffer, |  | ||||||
|                  const remote::file_size &read_size, |  | ||||||
|                  const remote::file_offset &read_offset, |  | ||||||
|                  const remote::file_handle &handle) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_rename(const char *from, const char *to) |   [[nodiscard]] auto fuse_read(const char *path, char *buffer, | ||||||
|  |                                const remote::file_size &read_size, | ||||||
|  |                                const remote::file_offset &read_offset, | ||||||
|  |                                const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_write(const char *path, const char *buffer, |   [[nodiscard]] auto fuse_rename(const char *from, const char *to) | ||||||
|                   const remote::file_size &write_size, |  | ||||||
|                   const remote::file_offset &write_offset, |  | ||||||
|                   const remote::file_handle &handle) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_write_base64(const char *path, const char *buffer, |   [[nodiscard]] auto fuse_write(const char *path, const char *buffer, | ||||||
|                          const remote::file_size &write_size, |                                 const remote::file_size &write_size, | ||||||
|                          const remote::file_offset &write_offset, |                                 const remote::file_offset &write_offset, | ||||||
|                          const remote::file_handle &handle) |                                 const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_readdir(const char *path, const remote::file_offset &offset, |   [[nodiscard]] auto fuse_write_base64(const char *path, const char *buffer, | ||||||
|                     const remote::file_handle &handle, std::string &item_path) |                                        const remote::file_size &write_size, | ||||||
|  |                                        const remote::file_offset &write_offset, | ||||||
|  |                                        const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_release(const char *path, const remote::file_handle &handle) |   [[nodiscard]] auto | ||||||
|  |   fuse_readdir(const char *path, const remote::file_offset &offset, | ||||||
|  |                const remote::file_handle &handle, std::string &item_path) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_releasedir(const char *path, const remote::file_handle &handle) |   [[nodiscard]] auto fuse_release(const char *path, | ||||||
|  |                                   const remote::file_handle &handle) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto fuse_releasedir(const char *path, | ||||||
|  |                                      const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   /*packet::error_type fuse_removexattr(const char *path, const char *name) |   /*packet::error_type fuse_removexattr(const char *path, const char *name) | ||||||
|    * override ;*/ |    * override ;*/ | ||||||
|  |  | ||||||
|   auto fuse_rmdir(const char *path) -> packet::error_type override; |   [[nodiscard]] auto fuse_rmdir(const char *path) | ||||||
|  |  | ||||||
|   auto fuse_setattr_x(const char *path, remote::setattr_x &attr) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) |   [[nodiscard]] auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_setchgtime(const char *path, const remote::file_time &chgtime) |   [[nodiscard]] auto fuse_setbkuptime(const char *path, | ||||||
|  |                                       const remote::file_time &bkuptime) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_setcrtime(const char *path, const remote::file_time &crtime) |   [[nodiscard]] auto fuse_setchgtime(const char *path, | ||||||
|  |                                      const remote::file_time &chgtime) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_setvolname(const char *volname) -> packet::error_type override; |   [[nodiscard]] auto fuse_setcrtime(const char *path, | ||||||
|  |                                     const remote::file_time &crtime) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto fuse_setvolname(const char *volname) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   /*packet::error_type fuse_setxattr(const char *path, const char *name, const |   /*packet::error_type fuse_setxattr(const char *path, const char *name, const | ||||||
|   char *value, const remote::file_size &size, const std::int32_t &flags) |   char *value, const remote::file_size &size, const std::int32_t &flags) | ||||||
| @@ -181,109 +199,123 @@ public: | |||||||
|   char *value, const remote::file_size &size, const std::int32_t &flags, |   char *value, const remote::file_size &size, const std::int32_t &flags, | ||||||
|                                            std::uint32_t position) override ;*/ |                                            std::uint32_t position) override ;*/ | ||||||
|  |  | ||||||
|   auto fuse_statfs(const char *path, std::uint64_t frsize, |   [[nodiscard]] auto fuse_statfs(const char *path, std::uint64_t frsize, | ||||||
|                    remote::statfs &r_stat) -> packet::error_type override; |                                  remote::statfs &r_stat) | ||||||
|  |  | ||||||
|   auto fuse_statfs_x(const char *path, std::uint64_t bsize, |  | ||||||
|                      remote::statfs_x &r_stat) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto fuse_truncate(const char *path, const remote::file_offset &size) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_unlink(const char *path) -> packet::error_type override; |   [[nodiscard]] auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||||
|  |                                    remote::statfs_x &r_stat) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto fuse_utimens(const char *path, const remote::file_time *tv, |   [[nodiscard]] auto fuse_truncate(const char *path, | ||||||
|                     std::uint64_t op0, std::uint64_t op1) |                                    const remote::file_offset &size) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto fuse_unlink(const char *path) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||||
|  |                                   std::uint64_t op0, std::uint64_t op1) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   void set_fuse_uid_gid(const remote::user_id & /* uid */, |   void set_fuse_uid_gid(const remote::user_id & /* uid */, | ||||||
|                         const remote::group_id & /* gid */) override {} |                         const remote::group_id & /* gid */) override {} | ||||||
|  |  | ||||||
|   // JSON Layer |   // JSON Layer | ||||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) |   [[nodiscard]] auto json_create_directory_snapshot(const std::string &path, | ||||||
|  |                                                     json &json_data) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto json_read_directory_snapshot(const std::string &path, |   [[nodiscard]] auto json_read_directory_snapshot( | ||||||
|                                     const remote::file_handle &handle, |       const std::string &path, const remote::file_handle &handle, | ||||||
|                                     std::uint32_t page, json &json_data) |       std::uint32_t page, json &json_data) -> packet::error_type override; | ||||||
|       -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto json_release_directory_snapshot(const std::string &path, |   [[nodiscard]] auto | ||||||
|                                        const remote::file_handle &handle) |   json_release_directory_snapshot(const std::string &path, | ||||||
|  |                                   const remote::file_handle &handle) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   // WinFSP Layer |   // WinFSP Layer | ||||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) |   [[nodiscard]] auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, |   [[nodiscard]] auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, | ||||||
|                       BOOLEAN &was_deleted) -> packet::error_type override; |                                     UINT32 flags, BOOLEAN &was_deleted) | ||||||
|  |  | ||||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_create(PWSTR file_name, UINT32 create_options, |  | ||||||
|                      UINT32 granted_access, UINT32 attributes, |  | ||||||
|                      UINT64 allocation_size, PVOID *file_desc, |  | ||||||
|                      remote::file_info *file_info, std::string &normalized_name, |  | ||||||
|                      BOOLEAN &exists) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) |   [[nodiscard]] auto winfsp_close(PVOID file_desc) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) |   [[nodiscard]] auto | ||||||
|  |   winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||||
|  |                 UINT32 attributes, UINT64 allocation_size, PVOID *file_desc, | ||||||
|  |                 remote::file_info *file_info, std::string &normalized_name, | ||||||
|  |                 BOOLEAN &exists) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, |   [[nodiscard]] auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||||
|                                    std::uint64_t *descriptor_size, |  | ||||||
|                                    std::wstring &string_descriptor) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, |   [[nodiscard]] auto winfsp_get_file_info(PVOID file_desc, | ||||||
|                               std::string &volume_label) |                                           remote::file_info *file_info) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_mounted(const std::wstring &location) |   [[nodiscard]] auto winfsp_get_security_by_name( | ||||||
|  |       PWSTR file_name, PUINT32 attributes, std::uint64_t *descriptor_size, | ||||||
|  |       std::wstring &string_descriptor) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_get_volume_info(UINT64 &total_size, | ||||||
|  |                                             UINT64 &free_size, | ||||||
|  |                                             std::string &volume_label) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, |   [[nodiscard]] auto winfsp_mounted(const std::wstring &location) | ||||||
|                    UINT32 granted_access, PVOID *file_desc, |  | ||||||
|                    remote::file_info *file_info, std::string &normalized_name) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, |   [[nodiscard]] auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, |                                  UINT32 granted_access, PVOID *file_desc, | ||||||
|                         remote::file_info *file_info) |                                  remote::file_info *file_info, | ||||||
|  |                                  std::string &normalized_name) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, |   [[nodiscard]] auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; |                                       BOOLEAN replace_attributes, | ||||||
|  |                                       UINT64 allocation_size, | ||||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, |                                       remote::file_info *file_info) | ||||||
|                              json &item_list) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, |  | ||||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; |  | ||||||
|  |  | ||||||
|   auto winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, |  | ||||||
|                              UINT64 creation_time, UINT64 last_access_time, |  | ||||||
|                              UINT64 last_write_time, UINT64 change_time, |  | ||||||
|                              remote::file_info *file_info) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, |   [[nodiscard]] auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||||
|                             BOOLEAN set_allocation_size, |                                  UINT32 length, PUINT32 bytes_transferred) | ||||||
|                             remote::file_info *file_info) |  | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_unmounted(const std::wstring &location) |   [[nodiscard]] auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, | ||||||
|  |                                            PWSTR marker, json &item_list) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
|  |  | ||||||
|   auto winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, |   [[nodiscard]] auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||||
|                     BOOLEAN write_to_end, BOOLEAN constrained_io, |                                    PWSTR new_file_name, | ||||||
|                     PUINT32 bytes_transferred, remote::file_info *file_info) |                                    BOOLEAN replace_if_exists) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_set_basic_info( | ||||||
|  |       PVOID file_desc, UINT32 attributes, UINT64 creation_time, | ||||||
|  |       UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time, | ||||||
|  |       remote::file_info *file_info) -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||||
|  |                                           BOOLEAN set_allocation_size, | ||||||
|  |                                           remote::file_info *file_info) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto winfsp_unmounted(const std::wstring &location) | ||||||
|  |       -> packet::error_type override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||||
|  |                BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||||
|  |                PUINT32 bytes_transferred, remote::file_info *file_info) | ||||||
|       -> packet::error_type override; |       -> packet::error_type override; | ||||||
| }; | }; | ||||||
| } // namespace remote_winfsp | } // namespace remote_winfsp | ||||||
|   | |||||||
| @@ -35,9 +35,8 @@ public: | |||||||
|   ~logging_consumer(); |   ~logging_consumer(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   static constexpr const std::uint8_t MAX_LOG_FILES{5U}; |   static constexpr std::uint8_t MAX_LOG_FILES{5U}; | ||||||
|   static constexpr const std::uint64_t MAX_LOG_FILE_SIZE{1024ULL * 1024ULL * |   static constexpr std::uint64_t MAX_LOG_FILE_SIZE{1024ULL * 1024ULL * 5ULL}; | ||||||
|                                                          5ULL}; |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   static void process_event(const i_event &evt); |   static void process_event(const i_event &evt); | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ class i_event; | |||||||
|  |  | ||||||
| class event_system final { | class event_system final { | ||||||
| private: | private: | ||||||
|   static constexpr const std::uint8_t max_queue_retry{ |   static constexpr std::uint8_t max_queue_retry{ | ||||||
|       30U, |       30U, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| @@ -35,7 +35,7 @@ private: | |||||||
|       std::thread::hardware_concurrency() * 4U, |       std::thread::hardware_concurrency() * 4U, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   static constexpr const std::chrono::seconds queue_wait_secs{ |   static constexpr std::chrono::seconds queue_wait_secs{ | ||||||
|       5s, |       5s, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,16 +28,19 @@ | |||||||
| namespace repertory { | namespace repertory { | ||||||
| struct curl_error final : public i_event { | struct curl_error final : public i_event { | ||||||
|   curl_error() = default; |   curl_error() = default; | ||||||
|   curl_error(CURLcode code_, std::string_view function_name_, std::string url_) |   curl_error(CURLcode code_, std::string_view function_name_, std::string type_, | ||||||
|  |              std::string url_) | ||||||
|       : code(code_), |       : code(code_), | ||||||
|         function_name(std::string{function_name_}), |         function_name(std::string{function_name_}), | ||||||
|  |         type(std::move(type_)), | ||||||
|         url(std::move(url_)) {} |         url(std::move(url_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{"curl_error"}; |   static constexpr std::string_view name{"curl_error"}; | ||||||
|  |  | ||||||
|   CURLcode code{}; |   CURLcode code{}; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|  |   std::string type; | ||||||
|   std::string url; |   std::string url; | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { |   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||||
| @@ -49,8 +52,8 @@ struct curl_error final : public i_event { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { |   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||||
|     return fmt::format("{}|func|{}|url|{}|code|{}", name, function_name, url, |     return fmt::format("{}|func|{}|type|{}|url|{}|code|{}", name, function_name, | ||||||
|                        static_cast<int>(code)); |                        type, url, static_cast<int>(code)); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| } // namespace repertory | } // namespace repertory | ||||||
| @@ -60,12 +63,14 @@ template <> struct adl_serializer<repertory::curl_error> { | |||||||
|   static void to_json(json &data, const repertory::curl_error &value) { |   static void to_json(json &data, const repertory::curl_error &value) { | ||||||
|     data["code"] = value.code; |     data["code"] = value.code; | ||||||
|     data["function_name"] = value.function_name; |     data["function_name"] = value.function_name; | ||||||
|  |     data["type"] = value.type; | ||||||
|     data["url"] = value.url; |     data["url"] = value.url; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static void from_json(const json &data, repertory::curl_error &value) { |   static void from_json(const json &data, repertory::curl_error &value) { | ||||||
|     data.at("code").get_to<CURLcode>(value.code); |     data.at("code").get_to<CURLcode>(value.code); | ||||||
|     data.at("function_name").get_to<std::string>(value.function_name); |     data.at("function_name").get_to<std::string>(value.function_name); | ||||||
|  |     data.at("type").get_to<std::string>(value.type); | ||||||
|     data.at("url").get_to<std::string>(value.url); |     data.at("url").get_to<std::string>(value.url); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -31,8 +31,8 @@ struct debug_log final : public i_event { | |||||||
|   debug_log(std::string_view function_name_, std::string msg_) |   debug_log(std::string_view function_name_, std::string msg_) | ||||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} |       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"debug_log"}; |   static constexpr std::string_view name{"debug_log"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string msg; |   std::string msg; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct directory_remove_failed final : public i_event { | |||||||
|         error(error_), |         error(error_), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{"directory_remove_failed"}; |   static constexpr std::string_view name{"directory_remove_failed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   api_error error{}; |   api_error error{}; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct directory_removed final : public i_event { | |||||||
|       : api_path(std::move(api_path_)), |       : api_path(std::move(api_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"directory_removed"}; |   static constexpr std::string_view name{"directory_removed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct directory_removed_externally final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"directory_removed_externally"}; |   static constexpr std::string_view name{"directory_removed_externally"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct download_begin final : public i_event { | |||||||
|         dest_path(std::move(dest_path_)), |         dest_path(std::move(dest_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"download_begin"}; |   static constexpr std::string_view name{"download_begin"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct download_end final : public i_event { | |||||||
|         error(error_), |         error(error_), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"download_end"}; |   static constexpr std::string_view name{"download_end"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct download_progress final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         progress(progress_) {} |         progress(progress_) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"download_progress"}; |   static constexpr std::string_view name{"download_progress"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct download_restore_failed final : public i_event { | |||||||
|         error(std::move(error_)), |         error(std::move(error_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{"download_restore_failed"}; |   static constexpr std::string_view name{"download_restore_failed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct download_restored final : public i_event { | |||||||
|         dest_path(std::move(dest_path_)), |         dest_path(std::move(dest_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"download_restored"}; |   static constexpr std::string_view name{"download_restored"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -36,8 +36,8 @@ struct download_resume_add_failed final : public i_event { | |||||||
|         error(std::move(error_)), |         error(std::move(error_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{"download_resume_add_failed"}; |   static constexpr std::string_view name{"download_resume_add_failed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct download_resume_added final : public i_event { | |||||||
|         dest_path(std::move(dest_path_)), |         dest_path(std::move(dest_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"download_resume_added"}; |   static constexpr std::string_view name{"download_resume_added"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct download_resume_removed final : public i_event { | |||||||
|         dest_path(std::move(dest_path_)), |         dest_path(std::move(dest_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"download_resume_removed"}; |   static constexpr std::string_view name{"download_resume_removed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct download_type_selected final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         type(type_) {} |         type(type_) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"download_type_selected"}; |   static constexpr std::string_view name{"download_type_selected"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string dest_path; |   std::string dest_path; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct drive_mount_failed final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         mount_location(std::move(mount_location_)) {} |         mount_location(std::move(mount_location_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{"drive_mount_failed"}; |   static constexpr std::string_view name{"drive_mount_failed"}; | ||||||
|  |  | ||||||
|   NTSTATUS error{}; |   NTSTATUS error{}; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct drive_mount_result final : public i_event { | |||||||
|         mount_location(std::move(mount_location_)), |         mount_location(std::move(mount_location_)), | ||||||
|         result(std::move(result_)) {} |         result(std::move(result_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"drive_mount_result"}; |   static constexpr std::string_view name{"drive_mount_result"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string mount_location; |   std::string mount_location; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct drive_mounted final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         mount_location(std::move(mount_location_)) {} |         mount_location(std::move(mount_location_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"drive_mounted"}; |   static constexpr std::string_view name{"drive_mounted"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string mount_location; |   std::string mount_location; | ||||||
|   | |||||||
| @@ -31,8 +31,8 @@ struct drive_stop_timed_out final : public i_event { | |||||||
|   drive_stop_timed_out(std::string_view function_name_) |   drive_stop_timed_out(std::string_view function_name_) | ||||||
|       : function_name(std::string(function_name_)) {} |       : function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"drive_stop_timed_out"}; |   static constexpr std::string_view name{"drive_stop_timed_out"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ struct drive_unmount_pending final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         mount_location(std::move(mount_location_)) {} |         mount_location(std::move(mount_location_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"drive_unmount_pending"}; |   static constexpr std::string_view name{"drive_unmount_pending"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string mount_location; |   std::string mount_location; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct drive_unmounted final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         mount_location(std::move(mount_location_)) {} |         mount_location(std::move(mount_location_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"drive_unmounted"}; |   static constexpr std::string_view name{"drive_unmounted"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string mount_location; |   std::string mount_location; | ||||||
|   | |||||||
| @@ -31,8 +31,8 @@ struct event_level_changed final : public i_event { | |||||||
|   event_level_changed(std::string_view function_name_, event_level new_level_) |   event_level_changed(std::string_view function_name_, event_level new_level_) | ||||||
|       : function_name(std::string(function_name_)), new_level(new_level_) {} |       : function_name(std::string(function_name_)), new_level(new_level_) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"event_level_changed"}; |   static constexpr std::string_view name{"event_level_changed"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   event_level new_level{}; |   event_level new_level{}; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct file_pinned final : public i_event { | |||||||
|       : api_path(std::move(api_path_)), |       : api_path(std::move(api_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"file_pinned"}; |   static constexpr std::string_view name{"file_pinned"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct file_remove_failed final : public i_event { | |||||||
|         error(error_), |         error(error_), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{"file_remove_failed"}; |   static constexpr std::string_view name{"file_remove_failed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   api_error error{}; |   api_error error{}; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct file_removed final : public i_event { | |||||||
|       : api_path(std::move(api_path_)), |       : api_path(std::move(api_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"file_removed"}; |   static constexpr std::string_view name{"file_removed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct file_removed_externally final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"file_removed_externally"}; |   static constexpr std::string_view name{"file_removed_externally"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct file_unpinned final : public i_event { | |||||||
|       : api_path(std::move(api_path_)), |       : api_path(std::move(api_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"file_unpinned"}; |   static constexpr std::string_view name{"file_unpinned"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -37,8 +37,8 @@ struct file_upload_completed final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"file_upload_completed"}; |   static constexpr std::string_view name{"file_upload_completed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   bool cancelled{}; |   bool cancelled{}; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct file_upload_failed final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"file_upload_failed"}; |   static constexpr std::string_view name{"file_upload_failed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string error; |   std::string error; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct file_upload_not_found final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"file_upload_not_found"}; |   static constexpr std::string_view name{"file_upload_not_found"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct file_upload_queued final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"file_upload_queued"}; |   static constexpr std::string_view name{"file_upload_queued"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct file_upload_removed final : public i_event { | |||||||
|       : api_path(std::move(api_path_)), |       : api_path(std::move(api_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"file_upload_removed"}; |   static constexpr std::string_view name{"file_upload_removed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct file_upload_retry final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"file_upload_retry"}; |   static constexpr std::string_view name{"file_upload_retry"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   api_error error{}; |   api_error error{}; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct filesystem_item_added final : public i_event { | |||||||
|         directory(directory_), |         directory(directory_), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"filesystem_item_added"}; |   static constexpr std::string_view name{"filesystem_item_added"}; | ||||||
|  |  | ||||||
|   std::string api_parent; |   std::string api_parent; | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   | |||||||
| @@ -37,8 +37,8 @@ struct filesystem_item_closed final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::trace}; |   static constexpr event_level level{event_level::trace}; | ||||||
|   static constexpr const std::string_view name{"filesystem_item_closed"}; |   static constexpr std::string_view name{"filesystem_item_closed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   bool changed{}; |   bool changed{}; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct filesystem_item_evicted final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"filesystem_item_evicted"}; |   static constexpr std::string_view name{"filesystem_item_evicted"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -39,8 +39,8 @@ struct filesystem_item_handle_closed final : public i_event { | |||||||
|         handle(handle_), |         handle(handle_), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::trace}; |   static constexpr event_level level{event_level::trace}; | ||||||
|   static constexpr const std::string_view name{"filesystem_item_handle_closed"}; |   static constexpr std::string_view name{"filesystem_item_handle_closed"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   bool changed{}; |   bool changed{}; | ||||||
|   | |||||||
| @@ -37,8 +37,8 @@ struct filesystem_item_handle_opened final : public i_event { | |||||||
|         handle(handle_), |         handle(handle_), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::trace}; |   static constexpr event_level level{event_level::trace}; | ||||||
|   static constexpr const std::string_view name{"filesystem_item_handle_opened"}; |   static constexpr std::string_view name{"filesystem_item_handle_opened"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   bool directory{}; |   bool directory{}; | ||||||
|   | |||||||
| @@ -36,8 +36,8 @@ struct filesystem_item_opened final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::trace}; |   static constexpr event_level level{event_level::trace}; | ||||||
|   static constexpr const std::string_view name{"filesystem_item_opened"}; |   static constexpr std::string_view name{"filesystem_item_opened"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   bool directory{}; |   bool directory{}; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct fuse_args_parsed final : public i_event { | |||||||
|   fuse_args_parsed(std::string_view args_, std::string_view function_name_) |   fuse_args_parsed(std::string_view args_, std::string_view function_name_) | ||||||
|       : args(std::move(args_)), function_name(std::string{function_name_}) {} |       : args(std::move(args_)), function_name(std::string{function_name_}) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"fuse_args_parsed"}; |   static constexpr std::string_view name{"fuse_args_parsed"}; | ||||||
|  |  | ||||||
|   std::string args; |   std::string args; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct fuse_event final : public i_event { | |||||||
|         error(error_), |         error(error_), | ||||||
|         function_name(std::string{function_name_}) {} |         function_name(std::string{function_name_}) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"fuse_event"}; |   static constexpr std::string_view name{"fuse_event"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::int32_t error{}; |   std::int32_t error{}; | ||||||
|   | |||||||
							
								
								
									
										68
									
								
								repertory/librepertory/include/events/types/info_log.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								repertory/librepertory/include/events/types/info_log.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_INFO_LOG_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_EVENTS_TYPES_INFO_LOG_HPP_ | ||||||
|  |  | ||||||
|  | #include "events/i_event.hpp" | ||||||
|  | #include "types/repertory.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory { | ||||||
|  | struct info_log final : public i_event { | ||||||
|  |   info_log() = default; | ||||||
|  |   info_log(std::string_view function_name_, std::string msg_) | ||||||
|  |       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||||
|  |  | ||||||
|  |   static constexpr event_level level{event_level::info}; | ||||||
|  |   static constexpr std::string_view name{"info_log"}; | ||||||
|  |  | ||||||
|  |   std::string function_name; | ||||||
|  |   std::string msg; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||||
|  |     return level; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||||
|  |     return name; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||||
|  |     return fmt::format("{}|func|{}|msg|{}", name, function_name, msg); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | } // namespace repertory | ||||||
|  |  | ||||||
|  | NLOHMANN_JSON_NAMESPACE_BEGIN | ||||||
|  | template <> struct adl_serializer<repertory::info_log> { | ||||||
|  |   static void to_json(json &data, const repertory::info_log &value) { | ||||||
|  |     data["function_name"] = value.function_name; | ||||||
|  |     data["msg"] = value.msg; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static void from_json(const json &data, repertory::info_log &value) { | ||||||
|  |     data.at("function_name").get_to<std::string>(value.function_name); | ||||||
|  |     data.at("msg").get_to<std::string>(value.msg); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | NLOHMANN_JSON_NAMESPACE_END | ||||||
|  |  | ||||||
|  | #endif // REPERTORY_INCLUDE_EVENTS_TYPES_INFO_LOG_HPP_ | ||||||
| @@ -34,8 +34,8 @@ struct invalid_cache_size final : public i_event { | |||||||
|         function_name(std::string{function_name_}), |         function_name(std::string{function_name_}), | ||||||
|         invalid_size(invalid_size_) {} |         invalid_size(invalid_size_) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"invalid_cache_size"}; |   static constexpr std::string_view name{"invalid_cache_size"}; | ||||||
|  |  | ||||||
|   std::uint64_t cache_size{}; |   std::uint64_t cache_size{}; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct item_timeout final : public i_event { | |||||||
|       : api_path(std::move(api_path_)), |       : api_path(std::move(api_path_)), | ||||||
|         function_name(std::string(function_name_)) {} |         function_name(std::string(function_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::trace}; |   static constexpr event_level level{event_level::trace}; | ||||||
|   static constexpr const std::string_view name{"item_timeout"}; |   static constexpr std::string_view name{"item_timeout"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct max_cache_size_reached final : public i_event { | |||||||
|         function_name(std::string{function_name_}), |         function_name(std::string{function_name_}), | ||||||
|         max_cache_size(max_cache_size_) {} |         max_cache_size(max_cache_size_) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"max_cache_size_reached"}; |   static constexpr std::string_view name{"max_cache_size_reached"}; | ||||||
|  |  | ||||||
|   std::uint64_t cache_size{}; |   std::uint64_t cache_size{}; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ struct orphaned_file_detected final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"orphaned_file_detected"}; |   static constexpr std::string_view name{"orphaned_file_detected"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string source_path; |   std::string source_path; | ||||||
|   | |||||||
| @@ -36,8 +36,8 @@ struct orphaned_file_processing_failed final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::error}; |   static constexpr event_level level{event_level::error}; | ||||||
|   static constexpr const std::string_view name{ |   static constexpr std::string_view name{ | ||||||
|       "orphaned_file_processing_failed", |       "orphaned_file_processing_failed", | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ struct orphaned_source_file_detected final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"orphaned_source_file_detected"}; |   static constexpr std::string_view name{"orphaned_source_file_detected"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string source_path; |   std::string source_path; | ||||||
|   | |||||||
| @@ -33,8 +33,8 @@ struct orphaned_source_file_removed final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"orphaned_source_file_removed"}; |   static constexpr std::string_view name{"orphaned_source_file_removed"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string source_path; |   std::string source_path; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct packet_client_timeout final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         msg(std::move(msg_)) {} |         msg(std::move(msg_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"packet_client_timeout"}; |   static constexpr std::string_view name{"packet_client_timeout"}; | ||||||
|  |  | ||||||
|   std::string event_name; |   std::string event_name; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct polling_item_begin final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         item_name(std::move(item_name_)) {} |         item_name(std::move(item_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"polling_item_begin"}; |   static constexpr std::string_view name{"polling_item_begin"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string item_name; |   std::string item_name; | ||||||
|   | |||||||
| @@ -32,8 +32,8 @@ struct polling_item_end final : public i_event { | |||||||
|       : function_name(std::string(function_name_)), |       : function_name(std::string(function_name_)), | ||||||
|         item_name(std::move(item_name_)) {} |         item_name(std::move(item_name_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"polling_item_end"}; |   static constexpr std::string_view name{"polling_item_end"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string item_name; |   std::string item_name; | ||||||
|   | |||||||
| @@ -0,0 +1,78 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_EVENTS_TYPES_PRODIVER_INVALID_VERSION_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_EVENTS_TYPES_PRODIVER_INVALID_VERSION_HPP_ | ||||||
|  |  | ||||||
|  | #include "events/i_event.hpp" | ||||||
|  | #include "types/repertory.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory { | ||||||
|  | struct provider_invalid_version final : public i_event { | ||||||
|  |   provider_invalid_version() = default; | ||||||
|  |   provider_invalid_version(std::string_view function_name_, | ||||||
|  |                            std::string required_version_, | ||||||
|  |                            std::string returned_version_) | ||||||
|  |       : function_name(std::string(function_name_)), | ||||||
|  |         required_version(std::move(required_version_)), | ||||||
|  |         returned_version(std::move(returned_version_)) {} | ||||||
|  |  | ||||||
|  |   static constexpr event_level level{event_level::error}; | ||||||
|  |   static constexpr std::string_view name{"provider_invalid_version"}; | ||||||
|  |  | ||||||
|  |   std::string function_name; | ||||||
|  |   std::string required_version; | ||||||
|  |   std::string returned_version; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||||
|  |     return level; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||||
|  |     return name; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||||
|  |     return fmt::format("{}|func|{}|required|{}|returned|{}", name, | ||||||
|  |                        function_name, required_version, returned_version); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | } // namespace repertory | ||||||
|  |  | ||||||
|  | NLOHMANN_JSON_NAMESPACE_BEGIN | ||||||
|  | template <> struct adl_serializer<repertory::provider_invalid_version> { | ||||||
|  |   static void to_json(json &data, | ||||||
|  |                       const repertory::provider_invalid_version &value) { | ||||||
|  |     data["function_name"] = value.function_name; | ||||||
|  |     data["required_version"] = value.required_version; | ||||||
|  |     data["returned_version"] = value.returned_version; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static void from_json(const json &data, | ||||||
|  |                         repertory::provider_invalid_version &value) { | ||||||
|  |     data.at("function_name").get_to(value.function_name); | ||||||
|  |     data.at("required_version").get_to(value.required_version); | ||||||
|  |     data.at("returned_version").get_to(value.returned_version); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | NLOHMANN_JSON_NAMESPACE_END | ||||||
|  |  | ||||||
|  | #endif // REPERTORY_INCLUDE_EVENTS_TYPES_PRODIVER_INVALID_VERSION_HPP_ | ||||||
| @@ -34,8 +34,8 @@ struct provider_offline final : public i_event { | |||||||
|         host_name_or_ip(std::move(host_name_or_ip_)), |         host_name_or_ip(std::move(host_name_or_ip_)), | ||||||
|         port(port_) {} |         port(port_) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::warn}; |   static constexpr event_level level{event_level::warn}; | ||||||
|   static constexpr const std::string_view name{"provider_offline"}; |   static constexpr std::string_view name{"provider_offline"}; | ||||||
|  |  | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   std::string host_name_or_ip; |   std::string host_name_or_ip; | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ struct provider_upload_begin final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"provider_upload_begin"}; |   static constexpr std::string_view name{"provider_upload_begin"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   std::string function_name; |   std::string function_name; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct provider_upload_end final : public i_event { | |||||||
|         function_name(std::string(function_name_)), |         function_name(std::string(function_name_)), | ||||||
|         source_path(std::move(source_path_)) {} |         source_path(std::move(source_path_)) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::info}; |   static constexpr event_level level{event_level::info}; | ||||||
|   static constexpr const std::string_view name{"provider_upload_end"}; |   static constexpr std::string_view name{"provider_upload_end"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   api_error error{}; |   api_error error{}; | ||||||
|   | |||||||
| @@ -35,8 +35,8 @@ struct remote_server_event final : public i_event { | |||||||
|         error(error_), |         error(error_), | ||||||
|         function_name(std::string{function_name_}) {} |         function_name(std::string{function_name_}) {} | ||||||
|  |  | ||||||
|   static constexpr const event_level level{event_level::debug}; |   static constexpr event_level level{event_level::debug}; | ||||||
|   static constexpr const std::string_view name{"remote_server_event"}; |   static constexpr std::string_view name{"remote_server_event"}; | ||||||
|  |  | ||||||
|   std::string api_path; |   std::string api_path; | ||||||
|   packet::error_type error{}; |   packet::error_type error{}; | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user