Compare commits
378 Commits
b0b69c6dd4
...
v2.1.0-rc-
Author | SHA1 | Date | |
---|---|---|---|
94abee27f9 | |||
a241cd16ef | |||
a43a778b46 | |||
290bdb5fda | |||
6b2bf3ab67 | |||
f2f28cea59 | |||
c82ec168a1 | |||
a54f928455 | |||
bc9e4fc95a | |||
f722dd4b84 | |||
53b8c70c80 | |||
ed2823ba59 | |||
e94011151a | |||
b44192da62 | |||
044cda06db | |||
ba586ad32f | |||
b28f422174 | |||
94f732df6c | |||
040fa2cd03 | |||
37e8204d92 | |||
18d3a7d843 | |||
d2eba1289c | |||
846520187b | |||
c21e141872 | |||
b077d0c746 | |||
ca9b965e5b | |||
17a28b58a4 | |||
078f679cca | |||
694f487861 | |||
ed89b3e8c2 | |||
12d1491221 | |||
eaf0018eb7 | |||
24bb67894f | |||
218545569d | |||
1ca5f41d89 | |||
f0e1cc7fc5 | |||
e3dd7c9791 | |||
8f0d8d7d6c | |||
b5fe6709d4 | |||
d6ee76ca7a | |||
3d93712aac | |||
21ac54e97c | |||
eee5587bab | |||
8475d04341 | |||
66c606a28f | |||
4267861034 | |||
57ad2e9773 | |||
158675f9c9 | |||
4f4323d7b7 | |||
873c82b84e | |||
35d1893275 | |||
caa9bf2604 | |||
b72c1822d5 | |||
d6b9a73570 | |||
61f768f306 | |||
8add58bdd3 | |||
075b15286f | |||
ca21b13ab9 | |||
9eac4a4191 | |||
c24bd2d615 | |||
99b50713ce | |||
fa0da8ec3f | |||
125b37b40a | |||
7e88142cdb | |||
1ed322b0c7 | |||
ba21676c2b | |||
de74dbcbac | |||
966d28cf5b | |||
cf9011c1ce | |||
5597c7b802 | |||
4a91d29490 | |||
d772a713a2 | |||
f0bd032cb9 | |||
68ca817fd7 | |||
7fd518a1e5 | |||
4d20715e26 | |||
2d5e28cfc2 | |||
cafa012bca | |||
88ab085846 | |||
7f2a9d99dd | |||
35be1a0d03 | |||
4f65f0379f | |||
06ae4bab43 | |||
9ce49848fd | |||
9d58e804a0 | |||
98a277713b | |||
f473d5c855 | |||
f4a7e0e187 | |||
39b5491c52 | |||
3ad0b7cdd7 | |||
1c759c2f7e | |||
a1cd963683 | |||
c277233855 | |||
0ddcb134a1 | |||
0bc07bf7fc | |||
558cbe62fc | |||
1904bd868d | |||
30633aa4ff | |||
7bfe455b1b | |||
a049542de2 | |||
6a95c8b21a | |||
13fbcbab9a | |||
78abe1ed8f | |||
2d19c57314 | |||
a1d77faa8d | |||
9de4d3172f | |||
a5ac2c3dfe | |||
06bc838e27 | |||
db70ad5aa0 | |||
6b9343371a | |||
e597bea35d | |||
237cb88d9d | |||
7e9e0f0729 | |||
87bf174bb8 | |||
7da1cfdd45 | |||
47cac7e71c | |||
f5df53f781 | |||
f16f6b808e | |||
cd28953324 | |||
da0e2ddb46 | |||
71ddf7ecf7 | |||
035a411800 | |||
fc0cff5a0c | |||
425160c390 | |||
75036f2418 | |||
f18157170b | |||
61e0ce4b97 | |||
25e3562300 | |||
5f92801860 | |||
8797134903 | |||
ad88f369bc | |||
c03877aa58 | |||
36ef520cf2 | |||
d1183c00af | |||
58451858fd | |||
4b44ce4482 | |||
1967389fdc | |||
bd913d83e1 | |||
c20574aa3b | |||
518bcc6527 | |||
ad8feafa5c | |||
5ac94667f9 | |||
4dcfdedb14 | |||
f76ba96613 | |||
6fdbaf9529 | |||
8ac7b06d68 | |||
4f63d0bb32 | |||
b143962dac | |||
9656828700 | |||
e680ec8664 | |||
b40b0397d7 | |||
932106d671 | |||
6260785b15 | |||
58a8b782c6 | |||
6f658fab35 | |||
e7fb5c5bc0 | |||
9442d4f6ee | |||
e542aa64ad | |||
5a4e1302f1 | |||
bbdf8ebad8 | |||
91463bcac0 | |||
23f1852337 | |||
edc4465d15 | |||
40e30defb3 | |||
478a5abff2 | |||
c00d5e8894 | |||
ff3b2314bf | |||
76906b04ee | |||
ee3fb40171 | |||
d13ab3106e | |||
f04d4d531a | |||
55b7afc023 | |||
5a033e7f12 | |||
8979e6e2a4 | |||
faaf7648a8 | |||
72db4e12cd | |||
62194271c0 | |||
087a2d0d6d | |||
57213c007f | |||
69d91413fc | |||
8cbaa83206 | |||
fa3419c7cc | |||
c9362b8802 | |||
cae269d4d6 | |||
1d7e96f3a4 | |||
8fabc142f2 | |||
95aa190f5f | |||
17116ecd02 | |||
83aeec51dc | |||
1fd6721d33 | |||
5782379897 | |||
1ccfae7552 | |||
31dbed7a1f | |||
b8dd642dc5 | |||
5326b3b81f | |||
b5d5e63486 | |||
f41a53c463 | |||
98a5c89d6b | |||
1a9756a86e | |||
01bb853d22 | |||
224bf37e68 | |||
14998bf952 | |||
60222b3948 | |||
e9a5b7e9af | |||
fec755dc25 | |||
60c098a5af | |||
881b5f4efd | |||
9c8f045db8 | |||
d06b24674f | |||
7299c4e96a | |||
beaf4194c2 | |||
877715aa22 | |||
a16a795300 | |||
7de7462548 | |||
3effb4c80a | |||
02d59cb047 | |||
6968feac7e | |||
c38e1ce43b | |||
efbdd08187 | |||
fcd88f8c3f | |||
546455eedc | |||
70bcfe9a9a | |||
0150cb2918 | |||
5c5b7047a0 | |||
b0c9d55658 | |||
c7e27c0080 | |||
28800625e4 | |||
666b3f2dc5 | |||
95cc859c9a | |||
e8f0b3d8dc | |||
7bfb4a9518 | |||
3f502eeb64 | |||
4dcd7bd5ce | |||
6821cf3707 | |||
8a68d025b5 | |||
6bc11ec727 | |||
b8daf9b9b7 | |||
63ef79f441 | |||
f83b5d8d07 | |||
cac52f739f | |||
02045dfd07 | |||
1a86fc5c29 | |||
ba82f322af | |||
2a40d8207e | |||
62a06281ab | |||
3a2e83682e | |||
b28496c7b6 | |||
bea5e02c2e | |||
de3eec47a0 | |||
08449b2468 | |||
84794ce862 | |||
21fc375ce0 | |||
f73cd9b6cf | |||
f674017610 | |||
48852b00f8 | |||
28480b1ee5 | |||
5916f438ca | |||
957a9f9c15 | |||
efafa6bf68 | |||
e88d53760d | |||
ccb56485d8 | |||
c91e51a445 | |||
1a6ab2d020 | |||
6dd96939c4 | |||
06aee5a899 | |||
f56302769c | |||
3e1d7e5e9b | |||
ccbf64678e | |||
a6ea47e1b0 | |||
dcddca16f3 | |||
25668a8d83 | |||
8068adb1bf | |||
c79af5b085 | |||
08057672d9 | |||
542c8b9f32 | |||
0cad44cd4e | |||
549afeacee | |||
e79322f670 | |||
10e7f72eab | |||
7c2ecd3340 | |||
29aaf625c7 | |||
eee832ce49 | |||
d8f3f87760 | |||
2df11b693c | |||
3805a27cd5 | |||
d09bd35646 | |||
5bbdcd9fb6 | |||
437a3444ec | |||
77e0633c38 | |||
ad5794c223 | |||
fdec5f7b6e | |||
|
fd1d32d314 | ||
0ca1a12cd4 | |||
6d456e5a7a | |||
07b6b5fca2 | |||
15579ef3cb | |||
d9dd2a59e7 | |||
d45d91340f | |||
039ff6ba42 | |||
81c6875382 | |||
1bbe078799 | |||
17082eb271 | |||
9e5e775c71 | |||
bf63bdb8ea | |||
a0c412bd66 | |||
d40ff7d14d | |||
85609be4b6 | |||
83fb6aaec3 | |||
22f546f14d | |||
54376ae84a | |||
2ac0f8fc52 | |||
bca7012d10 | |||
00b11da712 | |||
b438b1b1f1 | |||
5ab7301cbe | |||
b360335655 | |||
2cba8936c4 | |||
f8451c5514 | |||
462a9446bd | |||
a0a0d92169 | |||
7fb34c1b4a | |||
2ca345df8c | |||
2d53671fdf | |||
03b810ec75 | |||
3f4b88a2c6 | |||
0ad54c25a7 | |||
d97949cc3a | |||
b1a1824050 | |||
75fe994e95 | |||
9d020dd241 | |||
cbb2bfa73d | |||
0404950693 | |||
9948df0541 | |||
c53ab513a0 | |||
9e76f88c8f | |||
8da2a7d27a | |||
025a5a0db7 | |||
5fc391e5c0 | |||
5357486659 | |||
d8774ba7f7 | |||
1e7e304b43 | |||
17b7b09333 | |||
5f4b853764 | |||
6d0f2a6c36 | |||
ccdbf2efde | |||
e02eebba99 | |||
7d06fb5617 | |||
66053df28f | |||
6920db4c88 | |||
e37b2492e9 | |||
2435a765f0 | |||
f88e4181f1 | |||
5d2a1b0c17 | |||
1fff514e4e | |||
2f14e0f054 | |||
0c049a17f6 | |||
1390f96fdc | |||
1d7a3f5125 | |||
a9ebc52514 | |||
ca9eaf0249 | |||
7601746093 | |||
42f83170f7 | |||
9722cc06ff | |||
3d063a8ec2 | |||
b6719846bf | |||
9ed4187593 | |||
8c0bbe05ee | |||
c8b6d5053e | |||
4cf339cfc4 | |||
6fe23f270a | |||
c85fe76a48 | |||
4508b6d908 | |||
c74a70ce13 | |||
f5e88e44bf | |||
f11f92ba55 | |||
14d0173bd3 | |||
5b56c73528 | |||
87d336141c |
@@ -16,8 +16,11 @@ boost_asio_has_std_string_view
|
|||||||
bugprone
|
bugprone
|
||||||
cflags
|
cflags
|
||||||
chrono
|
chrono
|
||||||
|
clsid
|
||||||
cmake_current_source_dir
|
cmake_current_source_dir
|
||||||
|
coinit_apartmentthreaded
|
||||||
comdlg32
|
comdlg32
|
||||||
|
conin$
|
||||||
cppcoreguidelines
|
cppcoreguidelines
|
||||||
cppdbg
|
cppdbg
|
||||||
cppflags
|
cppflags
|
||||||
@@ -26,7 +29,10 @@ cpptrace
|
|||||||
cppvsdbg
|
cppvsdbg
|
||||||
create_notraverse
|
create_notraverse
|
||||||
crypto_aead_xchacha20poly1305_ietf_npubbytes
|
crypto_aead_xchacha20poly1305_ietf_npubbytes
|
||||||
|
cspan
|
||||||
cstdint
|
cstdint
|
||||||
|
curl_zstd
|
||||||
|
curle_couldnt_resolve_host
|
||||||
curlopt_aws_sigv4
|
curlopt_aws_sigv4
|
||||||
cxxflags
|
cxxflags
|
||||||
cxxstd
|
cxxstd
|
||||||
@@ -52,6 +58,7 @@ dcurl_staticlib
|
|||||||
dcurl_use_libpsl
|
dcurl_use_libpsl
|
||||||
dcurl_use_libssh2
|
dcurl_use_libssh2
|
||||||
dcurl_zlib
|
dcurl_zlib
|
||||||
|
dcurl_zstd
|
||||||
ddebug
|
ddebug
|
||||||
decmult_gen_prec_bits
|
decmult_gen_prec_bits
|
||||||
decmult_window_size
|
decmult_window_size
|
||||||
@@ -84,6 +91,7 @@ dspdlog_fmt_external
|
|||||||
dthreads_prefer_pthread_flag
|
dthreads_prefer_pthread_flag
|
||||||
dunw_local_only
|
dunw_local_only
|
||||||
duse_libidn2
|
duse_libidn2
|
||||||
|
duse_nghttp2
|
||||||
duuid_build_tests
|
duuid_build_tests
|
||||||
dwith_benchmark
|
dwith_benchmark
|
||||||
dwith_gflags
|
dwith_gflags
|
||||||
@@ -95,6 +103,7 @@ endforeach
|
|||||||
endfunction
|
endfunction
|
||||||
eventlib
|
eventlib
|
||||||
expect_streq
|
expect_streq
|
||||||
|
fallocate
|
||||||
fallocate_impl
|
fallocate_impl
|
||||||
fext
|
fext
|
||||||
fgetattr
|
fgetattr
|
||||||
@@ -103,7 +112,10 @@ filebase
|
|||||||
flac_version
|
flac_version
|
||||||
flag_nopath
|
flag_nopath
|
||||||
flarge
|
flarge
|
||||||
|
folderid
|
||||||
fontconfig_version
|
fontconfig_version
|
||||||
|
foob
|
||||||
|
fooba
|
||||||
freetype2_version
|
freetype2_version
|
||||||
fsetattr_x
|
fsetattr_x
|
||||||
fusermount
|
fusermount
|
||||||
@@ -116,11 +128,14 @@ gpath
|
|||||||
gtest_version
|
gtest_version
|
||||||
has_setxattr
|
has_setxattr
|
||||||
hkey
|
hkey
|
||||||
|
hresult
|
||||||
httpapi
|
httpapi
|
||||||
httplib
|
httplib
|
||||||
|
hwnd
|
||||||
icudata
|
icudata
|
||||||
icui18n
|
icui18n
|
||||||
icuuc
|
icuuc
|
||||||
|
inproc
|
||||||
iostreams
|
iostreams
|
||||||
iphlpapi
|
iphlpapi
|
||||||
ipstream
|
ipstream
|
||||||
@@ -146,6 +161,7 @@ libvlc
|
|||||||
linkflags
|
linkflags
|
||||||
localappdata
|
localappdata
|
||||||
lpbyte
|
lpbyte
|
||||||
|
lpthread
|
||||||
lptr
|
lptr
|
||||||
lpwstr
|
lpwstr
|
||||||
markdownlint
|
markdownlint
|
||||||
@@ -156,11 +172,13 @@ msvcr120
|
|||||||
msys2
|
msys2
|
||||||
mtune
|
mtune
|
||||||
musl-libc
|
musl-libc
|
||||||
|
mwindows
|
||||||
nana
|
nana
|
||||||
ncrypt
|
ncrypt
|
||||||
nlohmann
|
nlohmann
|
||||||
nlohmann_json
|
nlohmann_json
|
||||||
nmakeprg
|
nmakeprg
|
||||||
|
noappledouble
|
||||||
nohup
|
nohup
|
||||||
nominmax
|
nominmax
|
||||||
ntstatus
|
ntstatus
|
||||||
@@ -169,6 +187,8 @@ nuspell_version
|
|||||||
oleaut32
|
oleaut32
|
||||||
openal_version
|
openal_version
|
||||||
openssldir
|
openssldir
|
||||||
|
osascript
|
||||||
|
osxfuse
|
||||||
pistream
|
pistream
|
||||||
pkgconfig
|
pkgconfig
|
||||||
plarge_integer
|
plarge_integer
|
||||||
@@ -178,12 +198,15 @@ project_enable_fontconfig
|
|||||||
project_enable_gtkmm
|
project_enable_gtkmm
|
||||||
project_enable_libdsm
|
project_enable_libdsm
|
||||||
project_enable_nana
|
project_enable_nana
|
||||||
|
project_macos_icns_name
|
||||||
propgrid
|
propgrid
|
||||||
psecurity_descriptor
|
psecurity_descriptor
|
||||||
|
pthreads
|
||||||
pugi
|
pugi
|
||||||
pugixml_project
|
pugixml_project
|
||||||
puint32
|
puint32
|
||||||
pvoid
|
pvoid
|
||||||
|
pwhash
|
||||||
pwstr
|
pwstr
|
||||||
rdrw
|
rdrw
|
||||||
remote_winfsp
|
remote_winfsp
|
||||||
@@ -191,24 +214,31 @@ renterd
|
|||||||
richtext
|
richtext
|
||||||
rocksdb_library
|
rocksdb_library
|
||||||
rpcrt4
|
rpcrt4
|
||||||
|
runas
|
||||||
s_igid
|
s_igid
|
||||||
s_isvtx
|
s_isvtx
|
||||||
s_iuid
|
s_iuid
|
||||||
sddl_revision_1
|
sddl_revision_1
|
||||||
secp256k1
|
secp256k1
|
||||||
secur32
|
secur32
|
||||||
|
see_mask_nocloseprocess
|
||||||
sfml_project
|
sfml_project
|
||||||
|
shellexecuteinfoa
|
||||||
shlwapi
|
shlwapi
|
||||||
|
sigchld
|
||||||
skynet
|
skynet
|
||||||
source_subdir
|
source_subdir
|
||||||
spdlog
|
spdlog
|
||||||
spdlog_project
|
spdlog_project
|
||||||
st_ctim
|
st_ctim
|
||||||
|
startf_useshowwindow
|
||||||
|
startupinfoa
|
||||||
static-libgcc
|
static-libgcc
|
||||||
static-libstdc++
|
static-libstdc++
|
||||||
stbuf
|
stbuf
|
||||||
stduuid_project
|
stduuid_project
|
||||||
strequal
|
strequal
|
||||||
|
sw_shownoactivate
|
||||||
ularge_integer
|
ularge_integer
|
||||||
uring
|
uring
|
||||||
url
|
url
|
||||||
@@ -227,6 +257,7 @@ wextra
|
|||||||
wfloat
|
wfloat
|
||||||
wformat=2
|
wformat=2
|
||||||
winfsp
|
winfsp
|
||||||
|
winfsp_drive
|
||||||
winhttp
|
winhttp
|
||||||
wininet
|
wininet
|
||||||
winspool
|
winspool
|
||||||
|
3
.gitattributes
vendored
@@ -1,4 +1,5 @@
|
|||||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
*.msi filter=lfs diff=lfs merge=lfs -text
|
||||||
*.tar.gz 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
|
*.tar.xz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
13
.gitignore
vendored
@@ -1,13 +1,16 @@
|
|||||||
|
.DS_Store
|
||||||
.cache/
|
.cache/
|
||||||
|
.vs/
|
||||||
|
Info.plist
|
||||||
build*/
|
build*/
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
cspell.json
|
cspell.json
|
||||||
.vs/
|
|
||||||
support/Dockerfile
|
|
||||||
dist/
|
|
||||||
deps/
|
deps/
|
||||||
|
dist/
|
||||||
|
override.sh
|
||||||
|
repertory.iss
|
||||||
scripts/cleanup.cmd
|
scripts/cleanup.cmd
|
||||||
scripts/cleanup.sh
|
scripts/cleanup.sh
|
||||||
version.rc
|
support/Dockerfile
|
||||||
version.cpp
|
version.cpp
|
||||||
override.sh
|
version.rc
|
||||||
|
101
.jenkins_builds
@@ -5,57 +5,88 @@ pipeline {
|
|||||||
|
|
||||||
environment {
|
environment {
|
||||||
DEVELOPER_PRIVATE_KEY = "/.ci/repertory/cert/developer.priv"
|
DEVELOPER_PRIVATE_KEY = "/.ci/repertory/cert/developer.priv"
|
||||||
DEVELOPER_PUBLIC_KEY = "/.ci/repertory/cert/developer.pub"
|
DEVELOPER_PUBLIC_KEY = "/.ci/repertory/cert/developer.pub"
|
||||||
PROJECT_TEST_CONFIG_DIR = "/.ci/repertory/test_config"
|
PROJECT_TEST_CONFIG_DIR = "/.ci/repertory/test"
|
||||||
}
|
}
|
||||||
|
|
||||||
options {
|
options {
|
||||||
disableConcurrentBuilds()
|
disableConcurrentBuilds()
|
||||||
retry(2)
|
skipDefaultCheckout()
|
||||||
|
timestamps()
|
||||||
}
|
}
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
stage('linux_x86_64') {
|
stage('Build • Test • Deliver') {
|
||||||
agent any
|
agent any
|
||||||
|
stages {
|
||||||
steps {
|
stage('Checkout') {
|
||||||
retry(2) {
|
steps {
|
||||||
sleep time: 5, unit: 'SECONDS'
|
script {
|
||||||
sh 'scripts/make_unix.sh'
|
int maxAttempts = 6
|
||||||
|
int baseDelay = 10
|
||||||
|
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
|
try {
|
||||||
|
checkout scm
|
||||||
|
break
|
||||||
|
} catch (err) {
|
||||||
|
if (attempt == maxAttempts) { throw err }
|
||||||
|
int waitSec = baseDelay * (1 << (attempt - 1))
|
||||||
|
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||||
|
sleep time: waitSec, unit: 'SECONDS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('mingw64') {
|
stage('linux_x86_64') {
|
||||||
agent any
|
steps {
|
||||||
|
script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh' } }
|
||||||
steps {
|
}
|
||||||
retry(2) {
|
|
||||||
sleep time: 5, unit: 'SECONDS'
|
|
||||||
sh 'scripts/make_win32.sh'
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('linux_aarch64') {
|
stage('mingw64') {
|
||||||
agent any
|
steps {
|
||||||
|
script { retryWithBackoff(2, 5) { sh 'scripts/make_win32.sh' } }
|
||||||
steps {
|
}
|
||||||
retry(2) {
|
|
||||||
sleep time: 5, unit: 'SECONDS'
|
|
||||||
sh 'scripts/make_unix.sh aarch64'
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('deliver') {
|
stage('linux_aarch64') {
|
||||||
agent any
|
steps {
|
||||||
|
script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh aarch64' } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
steps {
|
stage('linux_x86_64_test') {
|
||||||
sh 'scripts/deliver.sh /mnt/repertory "" "" "" "" 1 1'
|
steps {
|
||||||
sh 'scripts/deliver.sh /mnt/repertory "" aarch64'
|
script { retryWithBackoff(2, 5) { sh 'scripts/run_tests.sh' } }
|
||||||
sh 'scripts/deliver.sh /mnt/repertory'
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('deliver') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/repertory "" "" "" "" 1 1' }
|
||||||
|
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/repertory "" aarch64' }
|
||||||
|
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/repertory' }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
|
||||||
|
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
|
try {
|
||||||
|
body()
|
||||||
|
return
|
||||||
|
} catch (err) {
|
||||||
|
if (attempt == maxAttempts) { throw err }
|
||||||
|
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
|
||||||
|
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||||
|
sleep time: waitSec, unit: 'SECONDS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
79
.jenkins_macos
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!groovy
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent none
|
||||||
|
|
||||||
|
environment {
|
||||||
|
DEVELOPER_PRIVATE_KEY = "${env.HOME}/.ci/repertory/cert/developer.priv"
|
||||||
|
DEVELOPER_PUBLIC_KEY = "${env.HOME}/.ci/repertory/cert/developer.pub"
|
||||||
|
PROJECT_TEST_CONFIG_DIR = "${env.HOME}/.ci/repertory/test"
|
||||||
|
}
|
||||||
|
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
skipDefaultCheckout()
|
||||||
|
timestamps()
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Build • Test • Deliver') {
|
||||||
|
agent any
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
int maxAttempts = 6
|
||||||
|
int baseDelay = 10
|
||||||
|
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
|
try {
|
||||||
|
checkout scm
|
||||||
|
break
|
||||||
|
} catch (err) {
|
||||||
|
if (attempt == maxAttempts) { throw err }
|
||||||
|
int waitSec = baseDelay * (1 << (attempt - 1))
|
||||||
|
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||||
|
sleep time: waitSec, unit: 'SECONDS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('darwin_aarch64') {
|
||||||
|
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh aarch64' } } }
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('darwin_x86_64') {
|
||||||
|
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh x86_64' } } }
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('darwin_aarch64_test') {
|
||||||
|
steps { script { retryWithBackoff(2, 5) { sh 'scripts/run_tests.sh aarch64' } } }
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('deliver') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
retryWithBackoff(3, 10) { sh "scripts/deliver.sh ${env.HOME}/mnt/repertory '' aarch64" }
|
||||||
|
retryWithBackoff(3, 10) { sh "scripts/deliver.sh ${env.HOME}/mnt/repertory '' x86_64" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
|
||||||
|
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
|
try {
|
||||||
|
body()
|
||||||
|
return
|
||||||
|
} catch (err) {
|
||||||
|
if (attempt == maxAttempts) { throw err }
|
||||||
|
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
|
||||||
|
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||||
|
sleep time: waitSec, unit: 'SECONDS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
68
.jenkins_msys2
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#!groovy
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent none
|
||||||
|
|
||||||
|
environment {
|
||||||
|
PROJECT_TEST_CONFIG_DIR = "c:\\.ci\\repertory\\test"
|
||||||
|
}
|
||||||
|
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
skipDefaultCheckout()
|
||||||
|
timestamps()
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Build • Test') {
|
||||||
|
agent any
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
int maxAttempts = 6
|
||||||
|
int baseDelay = 10
|
||||||
|
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
|
try {
|
||||||
|
checkout scm
|
||||||
|
break
|
||||||
|
} catch (err) {
|
||||||
|
if (attempt == maxAttempts) { throw err }
|
||||||
|
int waitSec = baseDelay * (1 << (attempt - 1))
|
||||||
|
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||||
|
sleep time: waitSec, unit: 'SECONDS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('msys2') {
|
||||||
|
steps {
|
||||||
|
script { retryWithBackoff(2, 5) { bat 'scripts\\make_win32.cmd' } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// stage('msys2_test') {
|
||||||
|
// steps {
|
||||||
|
// script { retryWithBackoff(2, 5) { bat 'scripts\\run_tests.cmd' } }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
|
||||||
|
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
|
try {
|
||||||
|
body()
|
||||||
|
return
|
||||||
|
} catch (err) {
|
||||||
|
if (attempt == maxAttempts) { throw err }
|
||||||
|
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
|
||||||
|
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||||
|
sleep time: waitSec, unit: 'SECONDS'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
52
CHANGELOG.md
@@ -1,16 +1,57 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## v2.0.6-release
|
## v2.1.0-rc
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* Remote mounts must be upgraded to v2.1.0+ to support new authentication scheme
|
||||||
|
|
||||||
### Issues
|
### Issues
|
||||||
|
|
||||||
* ~~\#12 [Unit Test] Complete all providers unit tests~~
|
* \#33 Complete initial v2.0 documentation
|
||||||
* ~~\#21 [Unit Test] Complete WinFSP unit tests~~
|
* \#34 Add macOS support
|
||||||
* ~~\#22 [Unit Test] Complete FUSE unit tests~~
|
* \#38 Pinning a file should automatically initiate a download to cache
|
||||||
* ~~\#33 Complete initial v2.0 documentation~~
|
* \#51 [ui] UI console window should close after launch
|
||||||
|
* \#52 [ui] Add auto-mount on first launch functionality
|
||||||
|
* \#53 Create Windows installer
|
||||||
|
* \#54 Remove 'default' as initial bucket name for Sia
|
||||||
|
* \#58 Create macOS bundle for simplified installation
|
||||||
|
* \#59 [bug] [ui] UI is hanging after launching repertory mount in background
|
||||||
|
* \#60 Implement secure key via KDF for transparent data encryption/decryption
|
||||||
|
* \#61 [ui] UI theme should match repertory blue
|
||||||
|
|
||||||
|
## v2.0.7-release
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
### Issues
|
||||||
|
|
||||||
|
* \#55 [bug] UI is unable to launch `repertory.exe` on Windows when absolute path contains spaces
|
||||||
|
* \#57 [bug] Directory entries . and .. are incorrectly being reported as files in Linux remote mounts
|
||||||
|
|
||||||
|
## v2.0.6-release
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
### 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
|
### 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
|
## v2.0.5-rc
|
||||||
|
|
||||||
<!-- markdownlint-disable-next-line -->
|
<!-- markdownlint-disable-next-line -->
|
||||||
@@ -81,6 +122,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
|
||||||
|
@@ -51,6 +51,10 @@ if(PROJECT_IS_ARM64)
|
|||||||
add_definitions(-DPROJECT_IS_ARM64)
|
add_definitions(-DPROJECT_IS_ARM64)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(PROJECT_IS_DARWIN)
|
||||||
|
add_definitions(-DPROJECT_IS_DARWIN)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(PROJECT_IS_MINGW)
|
if(PROJECT_IS_MINGW)
|
||||||
option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF)
|
option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF)
|
||||||
if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
|
if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
|
||||||
@@ -115,6 +119,17 @@ if(PROJECT_BUILD)
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp
|
||||||
@ONLY
|
@ONLY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.iss.in")
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.iss.in
|
||||||
|
${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(ICU REQUIRED COMPONENTS uc i18n io)
|
||||||
|
link_libraries(ICU::uc ICU::i18n ICU::io)
|
||||||
else()
|
else()
|
||||||
message(STATUS "-=[CMake Settings]=-")
|
message(STATUS "-=[CMake Settings]=-")
|
||||||
message(STATUS " C standard: ${CMAKE_C_STANDARD}")
|
message(STATUS " C standard: ${CMAKE_C_STANDARD}")
|
||||||
@@ -170,9 +185,12 @@ endif()
|
|||||||
-DPROJECT_INTERFACE=1
|
-DPROJECT_INTERFACE=1
|
||||||
-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE}
|
-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE}
|
||||||
-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64}
|
-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64}
|
||||||
|
-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN}
|
||||||
-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW}
|
-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW}
|
||||||
-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX}
|
-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX}
|
||||||
-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION}
|
-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION}
|
||||||
|
-DPROJECT_MACOS_BUNDLE_ID=${PROJECT_MACOS_BUNDLE_ID}
|
||||||
|
-DPROJECT_MACOS_ICNS_NAME=${PROJECT_MACOS_ICNS_NAME}
|
||||||
-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION}
|
-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION}
|
||||||
-DPROJECT_NAME=${PROJECT_NAME}
|
-DPROJECT_NAME=${PROJECT_NAME}
|
||||||
-DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER}
|
-DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER}
|
||||||
|
847
README.md
@@ -1,153 +1,347 @@
|
|||||||
# Repertory
|
# Repertory
|
||||||
|
|
||||||
Repertory allows you to mount S3 and Sia via FUSE on Linux or via WinFSP
|
Repertory allows you to mount **S3** and **Sia** storage as local drives using:
|
||||||
on Windows.
|
|
||||||
|
|
||||||
## Contents
|
- **FUSE** (Linux/macOS)
|
||||||
|
- **WinFSP** (Windows)
|
||||||
|
|
||||||
1. [Details and Features](#details-and-features)
|
It supports:
|
||||||
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
|
- Local mounts
|
||||||
|
- Remote encrypted mounts between systems
|
||||||
|
- Optional file name and data encryption using `XChaCha20-Poly1305` and `Argon2id` for key generation
|
||||||
|
|
||||||
* Optimized for [Plex Media Server](https://www.plex.tv/)
|
---
|
||||||
* 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.
|
|
||||||
* 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
|
|
||||||
|
|
||||||
## Minimum Requirements
|
## 📖 Contents
|
||||||
|
|
||||||
* [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support
|
1. [Quick Start (Sia Example)](#-quick-start-sia-example)
|
||||||
* Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support
|
2. [Details & Features](#-details-and-features)
|
||||||
* Windows requires the following dependencies to be installed:
|
3. [Minimum Requirements](#-minimum-requirements)
|
||||||
* [WinFSP 2023](https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi)
|
- [Supported Operating Systems](#supported-operating-systems)
|
||||||
|
4. [Data Directories](#-data-directories)
|
||||||
|
5. [GUI](#-gui)
|
||||||
|
6. [Usage](#-usage)
|
||||||
|
- [Important Options](#important-options)
|
||||||
|
- [Unmounting](#unmounting)
|
||||||
|
7. [Sia Setup](#-sia)
|
||||||
|
- [Sia Initial Configuration](#sia-initial-configuration)
|
||||||
|
- [Sia Mounting](#sia-mounting)
|
||||||
|
- [Sia Configuration File](#sia-configuration-file)
|
||||||
|
8. [S3 Setup](#-s3)
|
||||||
|
- [S3 Initial Configuration](#s3-initial-configuration)
|
||||||
|
- [S3 Mounting](#s3-mounting)
|
||||||
|
- [S3 Configuration File](#s3-configuration-file)
|
||||||
|
9. [Remote Mounting](#-remote-mounting)
|
||||||
|
- [Server Setup](#server-setup)
|
||||||
|
- [Client Setup](#client-setup)
|
||||||
|
- [Remote Mount Configuration File](#remote-mount-configuration-file)
|
||||||
|
10. [Compiling from Source](#-compiling)
|
||||||
|
- [Linux Compilation](#linux-compilation)
|
||||||
|
- [macOS Compilation](#macos-compilation)
|
||||||
|
- [Windows Compilation](#windows-compilation)
|
||||||
|
11. [Credits](#-credits)
|
||||||
|
12. [Developer Public Key](#-developer-public-key)
|
||||||
|
13. [Consult the Wiki for additional information](https://git.fifthgrid.com/BlockStorage/repertory/wiki)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Quick Start (Sia Example)
|
||||||
|
|
||||||
|
> 💡 Want to mount S3 instead?
|
||||||
|
> Skip ahead to [S3 Setup](#-s3) — the process is almost identical.
|
||||||
|
|
||||||
|
This example mounts a Sia bucket from a running [renterd](https://github.com/SiaFoundation/renterd) instance.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1. Install dependencies
|
||||||
|
|
||||||
|
#### Linux
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
sudo apt install fuse3 # Debian/Ubuntu
|
||||||
|
# or
|
||||||
|
sudo dnf install fuse3 # Fedora
|
||||||
|
```
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
|
||||||
|
- Install [macFUSE 4.10.2](https://github.com/macfuse/macfuse/releases/download/macfuse-4.10.2/macfuse-4.10.2.dmg)
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
- Install [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Configure
|
||||||
|
|
||||||
|
Replace placeholders with your actual values:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name mybucket -set HostConfig.ApiPassword "<renterd api password>"
|
||||||
|
repertory --name mybucket -set SiaConfig.Bucket "<bucket name>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
# If renterd is not running locally
|
||||||
|
repertory --name mybucket -set HostConfig.HostNameOrIp "<hostname or IP>"
|
||||||
|
|
||||||
|
# If renterd uses a non-default port (default 9980)
|
||||||
|
repertory --name mybucket -set HostConfig.ApiPort <port>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Mount
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### Linux
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name mybucket /mnt/mybucket
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### macOS
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name mybucket /Volumes/mybucket
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name mybucket t:
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Unmount
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name mybucket --unmount
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✨ Details and Features
|
||||||
|
|
||||||
|
- **Optimized for [Plex Media Server](https://www.plex.tv/).**
|
||||||
|
- Remote mounting of `repertory` instances between Linux, macOS, and/or Windows.
|
||||||
|
- Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet.
|
||||||
|
- Cross-platform support (Linux, macOS, and Windows).
|
||||||
|
- Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Minimum Requirements
|
||||||
|
|
||||||
|
- **Sia:** [renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support
|
||||||
|
- **Linux:** requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support
|
||||||
|
- **macOS:** requires:
|
||||||
|
- [macFUSE 4.10.2](https://github.com/macfuse/macfuse/releases/download/macfuse-4.10.2/macfuse-4.10.2.dmg)
|
||||||
|
- **Windows:** requires:
|
||||||
|
- [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi)
|
||||||
|
|
||||||
### Supported Operating Systems
|
### Supported Operating Systems
|
||||||
|
|
||||||
Only 64-bit operating systems are supported
|
Only **64-bit operating systems** are supported:
|
||||||
|
|
||||||
* Linux `arm64/aarch64`
|
- Linux `arm64/aarch64`
|
||||||
* Linux `amd64`
|
- Linux `x86_64`
|
||||||
* Windows 64-bit 10, 11
|
- macOS `arm64/aarch64`
|
||||||
|
- macOS `x86_64`
|
||||||
|
- Windows `x86_64` 10, 11
|
||||||
|
|
||||||
## GUI
|
---
|
||||||
|
|
||||||
As of `v2.0.5-rc`, mounts can be managed using the `Repertory Management Portal`.
|
## 📂 Data Directories
|
||||||
To launch the portal, execute the following command:
|
|
||||||
|
|
||||||
* `repertory -ui`
|
<!-- markdownlint-disable-next-line -->
|
||||||
* The default username is `repertory`
|
### Linux
|
||||||
* The default password is `repertory`
|
|
||||||
|
|
||||||
After first launch, `ui.json` will be created in the appropriate data directory.
|
``` shell
|
||||||
See [Data Directories](#data-directories).
|
~/.local/repertory2/s3
|
||||||
You should modify this file directly or use the portal to change the default
|
~/.local/repertory2/sia
|
||||||
username and password.
|
```
|
||||||
|
|
||||||
### Screenshot
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
### Windows
|
||||||
<a href="https://ibb.co/fVyJqnbF"><img src="https://i.ibb.co/fVyJqnbF/repertory-portal.png" alt="repertory-portal" border="0"></a>
|
|
||||||
|
|
||||||
## Usage
|
``` shell
|
||||||
|
%LOCALAPPDATA%\repertory2\s3
|
||||||
|
%LOCALAPPDATA%\repertory2\sia
|
||||||
|
```
|
||||||
|
|
||||||
|
**IMPORTANT:**
|
||||||
|
It is highly recommended to **exclude** these folders from any anti-virus/anti-malware applications as severe performance issues may arise. Excluding the mounted drive letter is also highly recommended.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🖥 GUI
|
||||||
|
|
||||||
|
As of `v2.0.6-release`, mounts can be managed using the **Repertory Management Portal**.
|
||||||
|
|
||||||
|
Launch the portal:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -ui
|
||||||
|
```
|
||||||
|
|
||||||
|
### ⚠️ Security tip
|
||||||
|
|
||||||
|
- Change the default UI credentials on first launch (`ui.json`) or via the portal
|
||||||
|
- Default username: `repertory`
|
||||||
|
- Default password: `repertory`
|
||||||
|
|
||||||
|
After first launch, `ui.json` will be created in the appropriate data directory (see [Data Directories](#-data-directories)). Modify this file directly or use the portal to change the default credentials.
|
||||||
|
|
||||||
|
### Screenshots
|
||||||
|
|
||||||
|
#### Login screen
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Home screen
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠 Usage
|
||||||
|
|
||||||
### Important Options
|
### Important Options
|
||||||
|
|
||||||
* `--help`
|
- `--help`
|
||||||
* Display all mount utility options
|
Display all mount utility options.
|
||||||
|
|
||||||
* `-f`
|
- `-f`
|
||||||
* Keep process in foreground on Linux.
|
Keep process in foreground on Linux.
|
||||||
|
|
||||||
* `--name, -na [name]`
|
- `--name, -na [name]`
|
||||||
* Identifies a unique configuration name to support multiple mounts.
|
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.
|
**The `--name` option is required.**
|
||||||
* 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.
|
|
||||||
|
|
||||||
* `-dc`
|
- `-dc`
|
||||||
* Display mount configuration
|
Display mount configuration.
|
||||||
* For Sia, `--name` is optional
|
For Sia, the `--name` option is required.
|
||||||
* For S3, the `-s3` option is required along with `--name`
|
For S3, the `-s3` and `--name` options are required.
|
||||||
|
|
||||||
### Sia
|
### Unmounting
|
||||||
|
|
||||||
#### Sia Initial Configuration
|
#### Remote
|
||||||
|
|
||||||
* Required steps:
|
``` shell
|
||||||
* Set the appropriate bucket name and `renterd` API password in `repertory` configuration:
|
repertory -rm 192.168.0.1:20000 --unmount
|
||||||
* 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:
|
#### S3
|
||||||
* 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:
|
``` shell
|
||||||
* `repertory -dc`
|
repertory -s3 --name '<my config name>' --unmount
|
||||||
* `repertory --name '<my config name>' -dc`
|
```
|
||||||
* Example:
|
|
||||||
* `repertory --name default -dc`
|
|
||||||
|
|
||||||
#### Sia Mounting
|
#### Sia
|
||||||
|
|
||||||
* Linux:
|
``` shell
|
||||||
* `repertory /mnt/location`
|
repertory --name '<my config name>' --unmount
|
||||||
* `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
|
## 🔒 Security Best Practices
|
||||||
|
|
||||||
|
When enabling **encryption tokens** for S3 or remote mounts:
|
||||||
|
|
||||||
|
- Use a **long, random string**.
|
||||||
|
- Store it **offline** (password manager and an offline backup).
|
||||||
|
- Losing it means **permanent data loss**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ☁️ Sia
|
||||||
|
|
||||||
|
### Sia Initial Configuration
|
||||||
|
|
||||||
|
**Required steps:**
|
||||||
|
|
||||||
|
- Set the appropriate bucket name and `renterd` API password in `repertory` configuration:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
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:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' -set HostConfig.ApiUser '<my user>'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set a custom agent string (default `Sia-Agent`):
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' -set HostConfig.AgentString '<my agent>'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set the host name or IP of the `renterd` instance (default `localhost`):
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' -set HostConfig.HostNameOrIp '<my host name>'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set the `renterd` API port (default `9980`):
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' -set HostConfig.ApiPort 9981
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verify/view all configuration options:**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' -dc
|
||||||
|
# Example:
|
||||||
|
repertory --name my_bucket -dc
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sia Mounting
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### Linux
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' /mnt/location
|
||||||
|
# Example:
|
||||||
|
repertory --name my_bucket /mnt/location
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### macOS
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' /Volumes/mybucket
|
||||||
|
# Example:
|
||||||
|
repertory --name my_bucket /Volumes/mybucket
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory --name '<my config name>' t:
|
||||||
|
# Example:
|
||||||
|
repertory --name my_bucket t:
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sia Configuration File
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -187,55 +381,105 @@ username and password.
|
|||||||
"RetryReadCount": 6,
|
"RetryReadCount": 6,
|
||||||
"RingBufferFileSize": 512,
|
"RingBufferFileSize": 512,
|
||||||
"SiaConfig": {
|
"SiaConfig": {
|
||||||
"Bucket": "default"
|
"Bucket": "my_bucket"
|
||||||
},
|
},
|
||||||
"TaskWaitMs": 100,
|
"TaskWaitMs": 100,
|
||||||
"Version": 1
|
"Version": 1
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### S3
|
---
|
||||||
|
|
||||||
#### S3 Initial Configuration
|
## 🪣 S3
|
||||||
|
|
||||||
* Required steps:
|
### S3 Initial Configuration
|
||||||
* 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:
|
**Required 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:
|
- Set the appropriate base URL:
|
||||||
* `repertory -s3 --name '<my config name>' -dc`
|
|
||||||
* Example:
|
|
||||||
* `repertory -s3 --name minio -dc`
|
|
||||||
|
|
||||||
#### S3 Mounting
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' -set S3Config.URL '<my url>'
|
||||||
|
# Example:
|
||||||
|
repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'
|
||||||
|
```
|
||||||
|
|
||||||
* Linux:
|
- Set the appropriate bucket name:
|
||||||
* `repertory -s3 --name '<my config name>' /mnt/location`
|
|
||||||
* Example:
|
|
||||||
* `repertory -s3 --name minio /mnt/location`
|
|
||||||
|
|
||||||
* Windows:
|
``` shell
|
||||||
* `repertory -s3 --name '<my config name>' t:`
|
repertory -s3 --name '<my config name>' -set S3Config.Bucket '<my bucket name>'
|
||||||
* Example:
|
```
|
||||||
* `repertory -s3 --name minio t:`
|
|
||||||
|
|
||||||
#### S3 Configuration File
|
- Set the appropriate access key:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' -set S3Config.AccessKey '<my access key>'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set the appropriate secret key:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' -set S3Config.SecretKey '<my secret key>'
|
||||||
|
```
|
||||||
|
|
||||||
|
- For Sia and most local S3 gateway instances, enable path style URLs:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' -set S3Config.UsePathStyle true
|
||||||
|
```
|
||||||
|
|
||||||
|
**Optional steps:**
|
||||||
|
|
||||||
|
- Set an appropriate region. Default is `any`:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
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 store it securely:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' -set S3Config.EncryptionToken '<my strong password>'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verify/view all configuration options:**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' -dc
|
||||||
|
# Example:
|
||||||
|
repertory -s3 --name minio -dc
|
||||||
|
```
|
||||||
|
|
||||||
|
### S3 Mounting
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### Linux
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' /mnt/location
|
||||||
|
# Example:
|
||||||
|
repertory -s3 --name minio /mnt/location
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### macOS
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' /Volumes/minio
|
||||||
|
# Example:
|
||||||
|
repertory -s3 --name minio /Volumes/minio
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -s3 --name '<my config name>' t:
|
||||||
|
# Example:
|
||||||
|
repertory -s3 --name minio t:
|
||||||
|
```
|
||||||
|
|
||||||
|
### S3 Configuration File
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -280,100 +524,128 @@ username and password.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Data Directories
|
---
|
||||||
|
|
||||||
#### Linux Directories
|
## 🌐 Remote Mounting
|
||||||
|
|
||||||
* `~/.local/repertory2/s3`
|
`repertory` allows local mounts to be shared with other computers on your network or over the internet. This option is referred to as **remote mounting**.
|
||||||
* `~/.local/repertory2/sia`
|
|
||||||
|
|
||||||
#### Windows Directories
|
|
||||||
|
|
||||||
* `%LOCALAPPDATA%\repertory2\s3`
|
|
||||||
* `%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
|
|
||||||
|
|
||||||
`repertory` allows local mounts to be shared with other computers on your network
|
|
||||||
or over the internet. This option is referred to as remote mounting.
|
|
||||||
|
|
||||||
### Server Setup
|
### Server Setup
|
||||||
|
|
||||||
The following steps must be performed on the mount you wish to share with
|
The following steps must be performed on the mount you wish to share with other systems. Changes to configuration will not take effect while a mount is active, so it is recommended to unmount beforehand.
|
||||||
other systems. Changes to configuration will not take affect while a mount is
|
|
||||||
active, so it is recommended to unmount beforehand.
|
|
||||||
|
|
||||||
* Required steps:
|
**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:
|
- Enable remote mount:
|
||||||
* 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:
|
- **Sia**
|
||||||
* Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.ApiPort`.
|
|
||||||
|
``` shell
|
||||||
|
repertory -set RemoteMount.Enable true
|
||||||
|
repertory --name '<my config name>' -set RemoteMount.Enable true
|
||||||
|
```
|
||||||
|
|
||||||
|
- **S3**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -set RemoteMount.Enable true
|
||||||
|
repertory -s3 --name '<my config name>' -set RemoteMount.Enable true
|
||||||
|
```
|
||||||
|
|
||||||
|
- Set a secure encryption token:
|
||||||
|
|
||||||
|
- **Sia**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -set RemoteMount.EncryptionToken '<my secure password>'
|
||||||
|
repertory --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'
|
||||||
|
```
|
||||||
|
|
||||||
|
- **S3**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
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**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -set RemoteMount.ApiPort 20000
|
||||||
|
repertory --name '<my config name>' -set RemoteMount.ApiPort 20000
|
||||||
|
```
|
||||||
|
|
||||||
|
- **S3**
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
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
|
#### Remote Mount Configuration File Section
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
...
|
|
||||||
"RemoteMount": {
|
"RemoteMount": {
|
||||||
"ApiPort": 20000,
|
"ApiPort": 20000,
|
||||||
"ClientPoolSize": 20,
|
"ClientPoolSize": 20,
|
||||||
"Enable": true,
|
"Enable": true,
|
||||||
"EncryptionToken": "<my secure password>"
|
"EncryptionToken": "<my secure password>"
|
||||||
},
|
}
|
||||||
...
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Client Setup
|
### Client Setup
|
||||||
|
|
||||||
Client configuration is provider agnostic, so there's no need to specify `-s3`
|
Client configuration is provider agnostic, so there's no need to specify `-s3` for S3 providers.
|
||||||
for S3 providers.
|
|
||||||
|
|
||||||
* Required steps:
|
**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>'`
|
- Set the encryption token to the same value configured during server setup:
|
||||||
* 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
|
``` shell
|
||||||
* Example:
|
repertory -rm <host name or IP>:<port> -set RemoteConfig.EncryptionToken '<my secure password>'
|
||||||
* `repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken '<my secure password>'`
|
# Replace <host name or IP> with the host name or IP of the server
|
||||||
* `repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken '<my secure password>'`
|
# 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
|
#### Client Remote Mounting
|
||||||
|
|
||||||
* Linux:
|
<!-- markdownlint-disable-next-line -->
|
||||||
* `repertory -rm <host name or IP>:<port> /mnt/location`
|
##### Linux
|
||||||
* Example:
|
|
||||||
* `repertory -rm 192.168.1.10:20000 /mnt/location`
|
|
||||||
|
|
||||||
* Windows:
|
``` shell
|
||||||
* `repertory -rm <host name or IP>:<port> t:`
|
repertory -rm <host name or IP>:<port> /mnt/location
|
||||||
* Example:
|
# Example:
|
||||||
* `repertory -rm 192.168.1.10:20000 t:`
|
repertory -rm 192.168.1.10:20000 /mnt/location
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
##### macOS
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -rm <host name or IP>:<port> /Volumes/remotemount
|
||||||
|
# Example:
|
||||||
|
repertory -rm 192.168.1.10:20000 /Volumes/remotemount
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- markdownlint-disable-next-line -->
|
||||||
|
##### Windows
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
repertory -rm <host name or IP>:<port> t:
|
||||||
|
# Example:
|
||||||
|
repertory -rm 192.168.1.10:20000 t:
|
||||||
|
```
|
||||||
|
|
||||||
#### Remote Mount Configuration File
|
#### Remote Mount Configuration File
|
||||||
|
|
||||||
@@ -397,67 +669,108 @@ for S3 providers.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Compiling
|
---
|
||||||
|
|
||||||
Successful compilation will result in all files required for execution to be placed
|
## 🧰 Compiling
|
||||||
in the `dist/` directory
|
|
||||||
|
Successful compilation will place all required files for execution in the `dist/` directory.
|
||||||
|
|
||||||
### Linux Compilation
|
### Linux Compilation
|
||||||
|
|
||||||
* Ensure `docker` is installed
|
- 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:
|
- For `x86_64`:
|
||||||
* RelWithDebInfo: `scripts/make_unix.sh aarch64`
|
|
||||||
* Release: `scripts/make_unix.sh aarch64 Release`
|
``` shell
|
||||||
* Debug: `scripts/make_unix.sh aarch64 Debug`
|
scripts/make_unix.sh x86_64
|
||||||
|
scripts/make_unix.sh x86_64 Release
|
||||||
|
scripts/make_unix.sh x86_64 Debug
|
||||||
|
```
|
||||||
|
|
||||||
|
- For `aarch64`:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
scripts/make_unix.sh aarch64
|
||||||
|
scripts/make_unix.sh aarch64 Release
|
||||||
|
scripts/make_unix.sh aarch64 Debug
|
||||||
|
```
|
||||||
|
|
||||||
|
### macOS Compilation
|
||||||
|
|
||||||
|
- Ensure `Xcode` and `CMake` are installed
|
||||||
|
|
||||||
|
- For `x86_64`:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
scripts/make_unix.sh x86_64
|
||||||
|
scripts/make_unix.sh x86_64 Release
|
||||||
|
scripts/make_unix.sh x86_64 Debug
|
||||||
|
```
|
||||||
|
|
||||||
|
- For `aarch64`:
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
scripts/make_unix.sh aarch64
|
||||||
|
scripts/make_unix.sh aarch64 Release
|
||||||
|
scripts/make_unix.sh aarch64 Debug
|
||||||
|
```
|
||||||
|
|
||||||
### Windows Compilation
|
### Windows Compilation
|
||||||
|
|
||||||
* OFFICIAL: Cross-compiling on Linux
|
- **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 `docker` is installed
|
||||||
* 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
|
``` shell
|
||||||
|
scripts/make_win32.sh x86_64
|
||||||
|
scripts/make_win32.sh x86_64 Release
|
||||||
|
scripts/make_win32.sh x86_64 Debug
|
||||||
|
```
|
||||||
|
|
||||||
* [binutils](https://www.gnu.org/software/binutils/)
|
- **UNOFFICIAL: Compiling on Windows**
|
||||||
* [boost c++ libraries](https://www.boost.org/)
|
|
||||||
* [cpp-httplib](https://github.com/yhirose/cpp-httplib)
|
|
||||||
* [curl](https://curl.haxx.se/)
|
|
||||||
* [docker](https://www.docker.com/)
|
|
||||||
* [Google Test](https://github.com/google/googletest)
|
|
||||||
* [ICU](https://icu.unicode.org/)
|
|
||||||
* [JSON for Modern C++](https://github.com/nlohmann/json)
|
|
||||||
* [libexpat](https://github.com/libexpat/libexpat)
|
|
||||||
* [libfuse](https://github.com/libfuse/libfuse)
|
|
||||||
* [libsodium](https://doc.libsodium.org/)
|
|
||||||
* [mingw-w64](https://www.mingw-w64.org/)
|
|
||||||
* [MSYS2](https://www.msys2.org)
|
|
||||||
* [OpenSSL](https://www.openssl.org/)
|
|
||||||
* [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/)
|
|
||||||
* [pugixml](https://pugixml.org/)
|
|
||||||
* [RocksDB](https://rocksdb.org)
|
|
||||||
* [ScPrime](https://scpri.me/)
|
|
||||||
* [Sia Decentralized Cloud Storage](https://sia.tech/)
|
|
||||||
* [spdlog](https://github.com/gabime/spdlog)
|
|
||||||
* [SQLite](https://www.sqlite.org)
|
|
||||||
* [stduuid](https://github.com/mariusbancila/stduuid)
|
|
||||||
* [Storj](https://storj.io/)
|
|
||||||
* [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp)
|
|
||||||
* [zlib](https://zlib.net/)
|
|
||||||
|
|
||||||
## Developer Public Key
|
- Ensure latest [MSYS2](https://www.msys2.org/) is installed
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
scripts\make_win32.cmd x86_64
|
||||||
|
scripts\make_win32.cmd x86_64 Release
|
||||||
|
scripts\make_win32.cmd x86_64 Debug
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📜 Credits
|
||||||
|
|
||||||
|
- [binutils](https://www.gnu.org/software/binutils/)
|
||||||
|
- [boost c++ libraries](https://www.boost.org/)
|
||||||
|
- [cpp-httplib](https://github.com/yhirose/cpp-httplib)
|
||||||
|
- [curl](https://curl.haxx.se/)
|
||||||
|
- [docker](https://www.docker.com/)
|
||||||
|
- [Google Test](https://github.com/google/googletest)
|
||||||
|
- [ICU](https://icu.unicode.org/)
|
||||||
|
- [JSON for Modern C++](https://github.com/nlohmann/json)
|
||||||
|
- [libexpat](https://github.com/libexpat/libexpat)
|
||||||
|
- [libfuse](https://github.com/libfuse/libfuse)
|
||||||
|
- [libsodium](https://doc.libsodium.org/)
|
||||||
|
- [macFUSE](https://macfuse.github.io/)
|
||||||
|
- [mingw-w64](https://www.mingw-w64.org/)
|
||||||
|
- [MSYS2](https://www.msys2.org)
|
||||||
|
- [OpenSSL](https://www.openssl.org/)
|
||||||
|
- [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/)
|
||||||
|
- [pugixml](https://pugixml.org/)
|
||||||
|
- [RocksDB](https://rocksdb.org)
|
||||||
|
- [ScPrime](https://scpri.me/)
|
||||||
|
- [Sia Decentralized Cloud Storage](https://sia.tech/)
|
||||||
|
- [spdlog](https://github.com/gabime/spdlog)
|
||||||
|
- [SQLite](https://www.sqlite.org)
|
||||||
|
- [stduuid](https://github.com/mariusbancila/stduuid)
|
||||||
|
- [Storj](https://www.storj.io/)
|
||||||
|
- [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp)
|
||||||
|
- [zlib](https://zlib.net/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 Developer Public Key
|
||||||
|
|
||||||
```text
|
```text
|
||||||
-----BEGIN PUBLIC KEY-----
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
BIN
assets/blue/icon_24X24.png
Normal file
After Width: | Height: | Size: 262 B |
BIN
assets/blue/icon_40x40.png
Normal file
After Width: | Height: | Size: 298 B |
BIN
assets/blue/icon_48x48.png
Normal file
After Width: | Height: | Size: 315 B |
BIN
assets/blue/logo.icns
Normal file
BIN
assets/blue/logo.iconset/icon_128x128.png
Normal file
After Width: | Height: | Size: 552 B |
BIN
assets/blue/logo.iconset/icon_128x128@2x.png
Normal file
After Width: | Height: | Size: 820 B |
BIN
assets/blue/logo.iconset/icon_16x16.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
assets/blue/logo.iconset/icon_16x16@2x.png
Normal file
After Width: | Height: | Size: 281 B |
BIN
assets/blue/logo.iconset/icon_256x256.png
Normal file
After Width: | Height: | Size: 820 B |
BIN
assets/blue/logo.iconset/icon_256x256@2x.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
assets/blue/logo.iconset/icon_32x32.png
Normal file
After Width: | Height: | Size: 281 B |
BIN
assets/blue/logo.iconset/icon_32x32@2x.png
Normal file
After Width: | Height: | Size: 361 B |
BIN
assets/blue/logo.iconset/icon_512x512.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
assets/blue/logo.iconset/icon_512x512@2x.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
assets/blue/logo.iconset/icon_64x64.png
Normal file
After Width: | Height: | Size: 361 B |
BIN
assets/blue/logo.iconset/icon_64x64@2x.png
Normal file
After Width: | Height: | Size: 552 B |
BIN
assets/blue/logo.iconset/logo_1024x1024.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
assets/green/icon_24X24.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
assets/green/icon_40x40.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
assets/green/icon_48x48.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
assets/green/logo.icns
Normal file
BIN
assets/green/logo.iconset/icon_128x128.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
assets/green/logo.iconset/icon_128x128@2x.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
assets/green/logo.iconset/icon_16x16.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/green/logo.iconset/icon_16x16@2x.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
assets/green/logo.iconset/icon_256x256.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
assets/green/logo.iconset/icon_256x256@2x.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
assets/green/logo.iconset/icon_32x32.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
assets/green/logo.iconset/icon_32x32@2x.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
assets/green/logo.iconset/icon_512x512.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
assets/green/logo.iconset/icon_512x512@2x.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
assets/green/logo.iconset/icon_64x64.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
assets/green/logo.iconset/icon_64x64@2x.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
assets/green/logo.iconset/logo_1024x1024.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
assets/home.png
Normal file
After Width: | Height: | Size: 165 KiB |
BIN
assets/icon.icns
Normal file
BIN
assets/icon.ico
Normal file
After Width: | Height: | Size: 370 KiB |
BIN
assets/login.png
Normal file
After Width: | Height: | Size: 221 KiB |
BIN
assets/logo_blue.xcf
Normal file
BIN
assets/logo_green.xcf
Normal file
@@ -35,13 +35,9 @@ list(APPEND PROJECT_CXXFLAGS_LIST
|
|||||||
-Wcast-align
|
-Wcast-align
|
||||||
-Wconversion
|
-Wconversion
|
||||||
-Wdouble-promotion
|
-Wdouble-promotion
|
||||||
-Wduplicated-branches
|
|
||||||
-Wduplicated-cond
|
|
||||||
-Wextra
|
-Wextra
|
||||||
-Wformat=2
|
-Wformat=2
|
||||||
-Wlogical-op
|
|
||||||
-Wmisleading-indentation
|
-Wmisleading-indentation
|
||||||
-Wno-useless-cast
|
|
||||||
-Wnon-virtual-dtor
|
-Wnon-virtual-dtor
|
||||||
-Wnull-dereference
|
-Wnull-dereference
|
||||||
-Wold-style-cast
|
-Wold-style-cast
|
||||||
@@ -52,6 +48,15 @@ list(APPEND PROJECT_CXXFLAGS_LIST
|
|||||||
-Wunused
|
-Wunused
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (NOT PROJECT_IS_DARWIN)
|
||||||
|
list(APPEND PROJECT_CXXFLAGS_LIST
|
||||||
|
-Wduplicated-branches
|
||||||
|
-Wduplicated-cond
|
||||||
|
-Wlogical-op
|
||||||
|
-Wno-useless-cast
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
list(APPEND PROJECT_CFLAGS_LIST
|
list(APPEND PROJECT_CFLAGS_LIST
|
||||||
${PROJECT_COMMON_FLAG_LIST}
|
${PROJECT_COMMON_FLAG_LIST}
|
||||||
-std=c${CMAKE_C_STANDARD}
|
-std=c${CMAKE_C_STANDARD}
|
||||||
@@ -62,7 +67,7 @@ list(APPEND PROJECT_CXXFLAGS_LIST
|
|||||||
-std=gnu++${CMAKE_CXX_STANDARD}
|
-std=gnu++${CMAKE_CXX_STANDARD}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(PROJECT_STATIC_LINK)
|
if(NOT PROJECT_IS_DARWIN AND PROJECT_STATIC_LINK)
|
||||||
list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS
|
list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS
|
||||||
-static-libgcc
|
-static-libgcc
|
||||||
-static-libstdc++
|
-static-libstdc++
|
||||||
@@ -89,7 +94,11 @@ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${PROJECT_RELEASE_FLAG_L
|
|||||||
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}")
|
set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}")
|
||||||
|
|
||||||
set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility -fext-numeric-literals ${PROJECT_COMMON_FLAG_LIST}")
|
set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility ${PROJECT_COMMON_FLAG_LIST}")
|
||||||
|
if (NOT PROJECT_IS_DARWIN)
|
||||||
|
set(EXTERNAL_CMAKE_CXX_FLAGS "-fext-numeric-literals ${EXTERNAL_CMAKE_CXX_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
|
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
|
||||||
-DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE}
|
-DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE}
|
||||||
-DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE}
|
-DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE}
|
||||||
|
@@ -1,3 +1,7 @@
|
|||||||
|
if (PROJECT_MACOS_ICNS_NAME)
|
||||||
|
set(PROJECT_MACOS_ICNS_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/assets/${PROJECT_MACOS_ICNS_NAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
function(set_common_target_options name)
|
function(set_common_target_options name)
|
||||||
target_compile_definitions(${name} PUBLIC
|
target_compile_definitions(${name} PUBLIC
|
||||||
${PROJECT_DEFINITIONS}
|
${PROJECT_DEFINITIONS}
|
||||||
@@ -12,6 +16,16 @@ function(set_common_target_options name)
|
|||||||
${PROJECT_EXTERNAL_BUILD_ROOT}/lib
|
${PROJECT_EXTERNAL_BUILD_ROOT}/lib
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (PROJECT_STATIC_LINK)
|
||||||
|
target_compile_definitions(${name} PRIVATE U_STATIC_IMPLEMENTATION)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_directories(${name} PRIVATE
|
||||||
|
ICU::uc
|
||||||
|
ICU::i18n
|
||||||
|
ICU::io
|
||||||
|
)
|
||||||
|
|
||||||
target_include_directories(${name} AFTER PUBLIC
|
target_include_directories(${name} AFTER PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include
|
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include
|
||||||
${name}_INCLUDES
|
${name}_INCLUDES
|
||||||
@@ -31,11 +45,31 @@ function(add_project_executable2 name dependencies libraries headers sources is_
|
|||||||
list(APPEND sources ${PROJECT_WINDOWS_VERSION_RC})
|
list(APPEND sources ${PROJECT_WINDOWS_VERSION_RC})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${name}
|
if (PROJECT_IS_DARWIN AND PROJECT_MACOS_ICNS_SOURCE AND "${name}" STREQUAL "${PROJECT_NAME}")
|
||||||
${headers}
|
set_source_files_properties(${PROJECT_MACOS_ICNS_SOURCE} PROPERTIES
|
||||||
${sources}
|
MACOSX_PACKAGE_LOCATION "Resources"
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
|
)
|
||||||
)
|
|
||||||
|
add_executable(${name}
|
||||||
|
MACOSX_BUNDLE
|
||||||
|
${headers}
|
||||||
|
${sources}
|
||||||
|
${PROJECT_MACOS_ICNS_SOURCE}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(${name} PROPERTIES
|
||||||
|
MACOSX_BUNDLE TRUE
|
||||||
|
MACOSX_BUNDLE_ICON_FILE "${PROJECT_MACOS_ICNS_NAME}"
|
||||||
|
RESOURCE "${PROJECT_MACOS_ICNS_SOURCE}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_executable(${name}
|
||||||
|
${headers}
|
||||||
|
${sources}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
foreach(dependency ${dependencies})
|
foreach(dependency ${dependencies})
|
||||||
set_common_target_options(${dependency})
|
set_common_target_options(${dependency})
|
||||||
|
@@ -1,20 +1,22 @@
|
|||||||
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 c9b9e0524666e1cd088f0874c57c1ce7c0eaa8552f9f4e15c755d5201fc8c608)
|
set(CPP_HTTPLIB_HASH 410a1347ed6bcbcc4a19af8ed8ad3873fe9fa97731d52db845c4c78f3f9c31e6)
|
||||||
set(CURL_HASH 6edc063d1ebaf9cf3b3b46e9fef2f3cd8932694989ecd43d005d6e828426d09f)
|
set(CURL_HASH 2937cadde007aa3a52a17c21ac9153ea054700f37926d1d96602bf07e888c847)
|
||||||
set(EXPAT_HASH 372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2)
|
set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb)
|
||||||
set(GCC_HASH 7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293)
|
set(GCC_HASH 51b9919ea69c980d7a381db95d4be27edf73b21254eb13d752a08003b4d013b1)
|
||||||
set(GTEST_HASH 78c676fc63881529bf97bf9d45948d905a66833fbfa5318ea2cd7478cb98f399)
|
set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c)
|
||||||
set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2)
|
set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2)
|
||||||
set(JSON_HASH 0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406)
|
set(INNOSETUP_HASH f3c42116542c4cc57263c5ba6c4feabfc49fe771f2f98a79d2f7628b8762723b)
|
||||||
|
set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187)
|
||||||
set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1)
|
set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1)
|
||||||
set(MINGW_HASH cc41898aac4b6e8dd5cffd7331b9d9515b912df4420a3a612b5ea2955bbeed2f)
|
set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf)
|
||||||
set(OPENSSL_HASH 002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3)
|
set(OPENSSL_HASH 529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f)
|
||||||
set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591)
|
set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591)
|
||||||
set(PUGIXML_HASH 655ade57fa703fb421c2eb9a0113b5064bddb145d415dd1f88c79353d90d511a)
|
set(PUGIXML_HASH 655ade57fa703fb421c2eb9a0113b5064bddb145d415dd1f88c79353d90d511a)
|
||||||
set(ROCKSDB_HASH fdccab16133c9d927a183c2648bcea8d956fb41eb1df2aacaa73eb0b95e43724)
|
set(ROCKSDB_HASH afccfab496556904900afacf7d99887f1d50cb893e5d2288bd502db233adacac)
|
||||||
set(SPDLOG_HASH 25c843860f039a1600f232c6eb9e01e6627f7d030a2ae5e232bdd3c9205d26cc)
|
set(SPDLOG_HASH 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67)
|
||||||
set(SQLITE_HASH 6cebd1d8403fc58c30e93939b246f3e6e58d0765a5cd50546f16c00fd805d2c3)
|
set(SQLITE_HASH 9ad6d16cbc1df7cd55c8b55127c82a9bca5e9f287818de6dc87e04e73599d754)
|
||||||
set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3)
|
set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3)
|
||||||
|
set(WINFSP_HASH 073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a)
|
||||||
set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c)
|
set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c)
|
||||||
|
@@ -4,13 +4,17 @@ set(Boost_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
|||||||
set(CURL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
set(CURL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||||
set(OPENSSL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
set(OPENSSL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||||
set(SFML_STATIC_LIBRARIES ${PROJECT_STATIC_LINK})
|
set(SFML_STATIC_LIBRARIES ${PROJECT_STATIC_LINK})
|
||||||
set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
if (PROJECT_IS_DARWIN)
|
||||||
|
set(ZLIB_USE_STATIC_LIBS OFF)
|
||||||
|
else()
|
||||||
|
set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||||
|
endif()
|
||||||
set(wxWidgets_USE_STATIC ${PROJECT_STATIC_LINK})
|
set(wxWidgets_USE_STATIC ${PROJECT_STATIC_LINK})
|
||||||
|
set(ICU_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||||
|
|
||||||
|
include(cmake/libraries/icu.cmake)
|
||||||
include(cmake/libraries/openssl.cmake)
|
include(cmake/libraries/openssl.cmake)
|
||||||
|
|
||||||
include(cmake/libraries/boost.cmake)
|
include(cmake/libraries/boost.cmake)
|
||||||
|
|
||||||
include(cmake/libraries/cpp_httplib.cmake)
|
include(cmake/libraries/cpp_httplib.cmake)
|
||||||
include(cmake/libraries/curl.cmake)
|
include(cmake/libraries/curl.cmake)
|
||||||
include(cmake/libraries/fuse.cmake)
|
include(cmake/libraries/fuse.cmake)
|
||||||
@@ -59,7 +63,7 @@ if(PROJECT_BUILD)
|
|||||||
winspool
|
winspool
|
||||||
ws2_32
|
ws2_32
|
||||||
)
|
)
|
||||||
else()
|
elseif(NOT PROJECT_IS_DARWIN)
|
||||||
link_libraries(
|
link_libraries(
|
||||||
uring
|
uring
|
||||||
)
|
)
|
||||||
|
@@ -39,6 +39,14 @@ if(PROJECT_ENABLE_BOOST)
|
|||||||
wserialization
|
wserialization
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
|
if(PROJECT_IS_DARWIN)
|
||||||
|
set(CMAKE_HAVE_THREADS_LIBRARY 1)
|
||||||
|
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
|
||||||
|
set(CMAKE_USE_PTHREADS_INIT 1)
|
||||||
|
set(CMAKE_USE_WIN32_THREADS_INIT 0)
|
||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION}
|
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION}
|
||||||
REQUIRED
|
REQUIRED
|
||||||
COMPONENTS
|
COMPONENTS
|
||||||
@@ -120,10 +128,12 @@ 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
|
||||||
|
-sNO_BZIP2=1
|
||||||
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||||
${BOOST_BUILD_ARGS}
|
${BOOST_BUILD_ARGS}
|
||||||
INSTALL_COMMAND
|
INSTALL_COMMAND
|
||||||
./b2
|
./b2
|
||||||
|
-sNO_BZIP2=1
|
||||||
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||||
${BOOST_BUILD_ARGS}
|
${BOOST_BUILD_ARGS}
|
||||||
install
|
install
|
||||||
@@ -131,6 +141,10 @@ if(PROJECT_ENABLE_BOOST)
|
|||||||
|
|
||||||
list(APPEND PROJECT_DEPENDENCIES boost_project)
|
list(APPEND PROJECT_DEPENDENCIES boost_project)
|
||||||
|
|
||||||
|
if (PROJECT_IS_DARWIN)
|
||||||
|
add_dependencies(boost_project icu_project)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (NOT CMAKE_HOST_WIN32)
|
if (NOT CMAKE_HOST_WIN32)
|
||||||
add_dependencies(boost_project openssl_project)
|
add_dependencies(boost_project openssl_project)
|
||||||
endif()
|
endif()
|
||||||
|
@@ -15,6 +15,7 @@ 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
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
-DHTTPLIB_REQUIRE_BROTLI=OFF
|
-DHTTPLIB_REQUIRE_BROTLI=OFF
|
||||||
-DHTTPLIB_REQUIRE_OPENSSL=ON
|
-DHTTPLIB_REQUIRE_OPENSSL=ON
|
||||||
-DHTTPLIB_REQUIRE_ZLIB=ON
|
-DHTTPLIB_REQUIRE_ZLIB=ON
|
||||||
|
@@ -27,8 +27,8 @@ if(PROJECT_ENABLE_CURL)
|
|||||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||||
-DBUILD_STATIC_CURL=ON
|
-DBUILD_STATIC_CURL=ON
|
||||||
-DBUILD_STATIC_LIBS=ON
|
-DBUILD_STATIC_LIBS=ON
|
||||||
-DBUILD_STATIC_LIBS=ON
|
|
||||||
-DBUILD_TESTING=OFF
|
-DBUILD_TESTING=OFF
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
-DCURL_BROTLI=OFF
|
-DCURL_BROTLI=OFF
|
||||||
-DCURL_CA_BUNDLE=./cacert.pem
|
-DCURL_CA_BUNDLE=./cacert.pem
|
||||||
-DCURL_CA_FALLBACK=ON
|
-DCURL_CA_FALLBACK=ON
|
||||||
@@ -37,11 +37,13 @@ if(PROJECT_ENABLE_CURL)
|
|||||||
-DCURL_USE_LIBSSH2=OFF
|
-DCURL_USE_LIBSSH2=OFF
|
||||||
-DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
|
-DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
|
||||||
-DCURL_ZLIB=ON
|
-DCURL_ZLIB=ON
|
||||||
|
-DCURL_ZSTD=OFF
|
||||||
-DENABLE_CURL_MANUAL=OFF
|
-DENABLE_CURL_MANUAL=OFF
|
||||||
-DENABLE_THREADED_RESOLVER=ON
|
-DENABLE_THREADED_RESOLVER=ON
|
||||||
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
|
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
|
||||||
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
|
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
|
||||||
-DUSE_LIBIDN2=OFF
|
-DUSE_LIBIDN2=OFF
|
||||||
|
-DUSE_NGHTTP2=OFF
|
||||||
-DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS}
|
-DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -20,17 +20,25 @@ if(PROJECT_ENABLE_FUSE AND NOT PROJECT_IS_MINGW)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
pkg_check_modules(LIBFUSE3 fuse3>=3.0.0)
|
if (PROJECT_IS_DARWIN)
|
||||||
if(LIBFUSE3_FOUND)
|
find_library(OSXFUSE NO_CACHE NAMES OSXFUSE)
|
||||||
set(PROJECT_FUSE fuse3)
|
if (NOT OSXFUSE)
|
||||||
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE3_INCLUDE_DIRS})
|
message(FATAL_ERROR "FUSE for macOS not found (https://macfuse.github.io)")
|
||||||
|
endif ()
|
||||||
|
set(PROJECT_FUSE fuse2)
|
||||||
else()
|
else()
|
||||||
pkg_check_modules(LIBFUSE2 fuse>=2.9.0)
|
pkg_check_modules(LIBFUSE3 fuse3>=3.0.0)
|
||||||
if(LIBFUSE2_FOUND)
|
if(LIBFUSE3_FOUND)
|
||||||
set(PROJECT_FUSE fuse2)
|
set(PROJECT_FUSE fuse3)
|
||||||
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE2_INCLUDE_DIRS})
|
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE3_INCLUDE_DIRS})
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "fuse library not found")
|
pkg_check_modules(LIBFUSE2 fuse>=2.9.0)
|
||||||
|
if(LIBFUSE2_FOUND)
|
||||||
|
set(PROJECT_FUSE fuse2)
|
||||||
|
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE2_INCLUDE_DIRS})
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "fuse library not found")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
24
cmake/libraries/icu.cmake
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
if(PROJECT_IS_DARWIN AND NOT PROJECT_BUILD)
|
||||||
|
if(PROJECT_BUILD_SHARED_LIBS)
|
||||||
|
set(ICU_ENABLE_SHARED yes)
|
||||||
|
else()
|
||||||
|
set(ICU_ENABLE_SHARED no)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
ExternalProject_Add(icu_project
|
||||||
|
PREFIX external
|
||||||
|
URL ${PROJECT_3RD_PARTY_DIR}/mingw64/icu-release-${ICU_VERSION}.tar.gz
|
||||||
|
URL_HASH SHA256=${ICU_HASH}
|
||||||
|
BUILD_IN_SOURCE 1
|
||||||
|
LIST_SEPARATOR |
|
||||||
|
PATCH_COMMAND chmod +x ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
|
||||||
|
CONFIGURE_COMMAND cd icu4c/source && ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
|
||||||
|
${PROJECT_MARCH}
|
||||||
|
${PROJECT_EXTERNAL_BUILD_ROOT}
|
||||||
|
${ICU_ENABLE_SHARED}
|
||||||
|
BUILD_COMMAND cd icu4c/source && make -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||||
|
INSTALL_COMMAND cd icu4c/source && make install
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND PROJECT_DEPENDENCIES icu_project)
|
||||||
|
endif()
|
@@ -18,6 +18,7 @@ if(PROJECT_ENABLE_JSON)
|
|||||||
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
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
-DJSON_BuildTests=OFF
|
-DJSON_BuildTests=OFF
|
||||||
-DJSON_Install=ON
|
-DJSON_Install=ON
|
||||||
-DJSON_MultipleHeaders=OFF
|
-DJSON_MultipleHeaders=OFF
|
||||||
|
@@ -15,6 +15,12 @@ if(PROJECT_ENABLE_OPENSSL)
|
|||||||
elseif(NOT PROJECT_IS_MINGW)
|
elseif(NOT PROJECT_IS_MINGW)
|
||||||
if(PROJECT_IS_MINGW)
|
if(PROJECT_IS_MINGW)
|
||||||
set(OPENSSL_COMPILE_TYPE mingw64)
|
set(OPENSSL_COMPILE_TYPE mingw64)
|
||||||
|
elseif(PROJECT_IS_DARWIN)
|
||||||
|
if(PROJECT_IS_ARM64)
|
||||||
|
set(OPENSSL_COMPILE_TYPE darwin64-arm64)
|
||||||
|
else()
|
||||||
|
set(OPENSSL_COMPILE_TYPE darwin64-x86_64)
|
||||||
|
endif()
|
||||||
elseif(PROJECT_IS_ARM64)
|
elseif(PROJECT_IS_ARM64)
|
||||||
set(OPENSSL_COMPILE_TYPE linux-aarch64)
|
set(OPENSSL_COMPILE_TYPE linux-aarch64)
|
||||||
else()
|
else()
|
||||||
|
@@ -20,6 +20,7 @@ if(PROJECT_ENABLE_PUGIXML)
|
|||||||
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
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND PROJECT_DEPENDENCIES pugixml_project)
|
list(APPEND PROJECT_DEPENDENCIES pugixml_project)
|
||||||
|
@@ -14,12 +14,14 @@ if(PROJECT_ENABLE_ROCKSDB)
|
|||||||
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
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
-DFAIL_ON_WARNINGS=OFF
|
-DFAIL_ON_WARNINGS=OFF
|
||||||
-DPORTABLE=1
|
-DPORTABLE=1
|
||||||
-DROCKSDB_BUILD_SHARED=OFF
|
-DROCKSDB_BUILD_SHARED=OFF
|
||||||
-DROCKSDB_INSTALL_ON_WINDOWS=ON
|
-DROCKSDB_INSTALL_ON_WINDOWS=ON
|
||||||
-DWITH_BENCHMARK=OFF
|
-DWITH_BENCHMARK=OFF
|
||||||
-DWITH_BENCHMARK_TOOLS=OFF
|
-DWITH_BENCHMARK_TOOLS=OFF
|
||||||
|
-DWITH_BZ2=OFF
|
||||||
-DWITH_CORE_TOOLS=OFF
|
-DWITH_CORE_TOOLS=OFF
|
||||||
-DWITH_EXAMPLES=OFF
|
-DWITH_EXAMPLES=OFF
|
||||||
-DWITH_GFLAGS=OFF
|
-DWITH_GFLAGS=OFF
|
||||||
|
@@ -15,6 +15,7 @@ if(PROJECT_ENABLE_SPDLOG)
|
|||||||
LIST_SEPARATOR |
|
LIST_SEPARATOR |
|
||||||
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}
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
-DSPDLOG_BUILD_EXAMPLE=OFF
|
-DSPDLOG_BUILD_EXAMPLE=OFF
|
||||||
-DSPDLOG_FMT_EXTERNAL=OFF
|
-DSPDLOG_FMT_EXTERNAL=OFF
|
||||||
-DSPDLOG_FMT_EXTERNAL_HO=OFF
|
-DSPDLOG_FMT_EXTERNAL_HO=OFF
|
||||||
|
@@ -16,6 +16,7 @@ if(PROJECT_ENABLE_STDUUID)
|
|||||||
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
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
-DUUID_BUILD_TESTS=OFF
|
-DUUID_BUILD_TESTS=OFF
|
||||||
-DUUID_ENABLE_INSTALL=ON
|
-DUUID_ENABLE_INSTALL=ON
|
||||||
-DUUID_USING_CXX20_SPAN=ON
|
-DUUID_USING_CXX20_SPAN=ON
|
||||||
|
@@ -10,6 +10,7 @@ if (PROJECT_ENABLE_TESTING)
|
|||||||
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
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND PROJECT_DEPENDENCIES gtest_project)
|
list(APPEND PROJECT_DEPENDENCIES gtest_project)
|
||||||
|
@@ -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)
|
||||||
|
@@ -2,10 +2,6 @@ if(MSVC)
|
|||||||
message(FATAL_ERROR "MSVC will not be supported")
|
message(FATAL_ERROR "MSVC will not be supported")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(UNIX AND APPLE)
|
|
||||||
message(FATAL_ERROR "Apple is not currently supported")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
||||||
message(FATAL_ERROR "FreeBSD is not currently supported")
|
message(FATAL_ERROR "FreeBSD is not currently supported")
|
||||||
endif()
|
endif()
|
||||||
@@ -13,3 +9,15 @@ endif()
|
|||||||
if(PROJECT_REQUIRE_ALPINE AND NOT PROJECT_IS_ALPINE AND PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
|
if(PROJECT_REQUIRE_ALPINE AND NOT PROJECT_IS_ALPINE AND PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
|
||||||
message(FATAL_ERROR "Project requires Alpine Linux to build")
|
message(FATAL_ERROR "Project requires Alpine Linux to build")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (PROJECT_IS_DARWIN)
|
||||||
|
if (PROJECT_IS_ARM64)
|
||||||
|
set(CMAKE_OSX_ARCHITECTURES "arm64")
|
||||||
|
else()
|
||||||
|
set(CMAKE_OSX_ARCHITECTURES "x86_64")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (PROJECT_IS_DARWIN AND NOT PROJECT_MACOS_BUNDLE_ID)
|
||||||
|
message(FATAL_ERROR "'PROJECT_MACOS_BUNDLE_ID' is not set in 'config.sh'")
|
||||||
|
endif()
|
||||||
|
@@ -1,28 +1,30 @@
|
|||||||
set(BINUTILS_VERSION 2.43)
|
set(BINUTILS_VERSION 2.44)
|
||||||
|
set(BOOST_MAJOR_VERSION 1)
|
||||||
|
set(BOOST_MINOR_VERSION 88)
|
||||||
|
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(BOOST_MAJOR_VERSION 1)
|
set(CPP_HTTPLIB_VERSION 0.23.1)
|
||||||
set(BOOST_MINOR_VERSION 87)
|
set(CURL_VERSION 8.15.0)
|
||||||
set(BOOST_PATCH_VERSION 0)
|
set(CURL2_VERSION 8_15_0)
|
||||||
set(CPP_HTTPLIB_VERSION 0.19.0)
|
set(EXPAT_VERSION 2.7.1)
|
||||||
set(CURL2_VERSION 8_12_1)
|
set(EXPAT2_VERSION 2_7_1)
|
||||||
set(CURL_VERSION 8.12.1)
|
set(GCC_VERSION 15.1.0)
|
||||||
set(EXPAT2_VERSION 2_6_4)
|
set(GTEST_VERSION 1.17.0)
|
||||||
set(EXPAT_VERSION 2.6.4)
|
|
||||||
set(GCC_VERSION 14.2.0)
|
|
||||||
set(GTEST_VERSION 1.16.0)
|
|
||||||
set(ICU_VERSION 76-1)
|
set(ICU_VERSION 76-1)
|
||||||
set(JSON_VERSION 3.11.3)
|
set(INNOSETUP_VERSION 6.4.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.1)
|
|
||||||
set(PKG_CONFIG_VERSION 0.29.2)
|
set(PKG_CONFIG_VERSION 0.29.2)
|
||||||
set(PUGIXML_VERSION 1.15)
|
set(PUGIXML_VERSION 1.15)
|
||||||
set(ROCKSDB_VERSION 9.10.0)
|
set(ROCKSDB_VERSION 10.4.2)
|
||||||
set(SPDLOG_VERSION 1.15.1)
|
set(SPDLOG_VERSION 1.15.3)
|
||||||
set(SQLITE2_VERSION 3.49.1)
|
set(SQLITE_VERSION 3500300)
|
||||||
set(SQLITE_VERSION 3490100)
|
set(SQLITE2_VERSION 3.50.3)
|
||||||
set(STDUUID_VERSION 1.2.3)
|
set(STDUUID_VERSION 1.2.3)
|
||||||
|
set(WINFSP_VERSION 2.1.25156)
|
||||||
|
set(WINFSP2_VERSION 2.1)
|
||||||
set(ZLIB_VERSION 1.3.1)
|
set(ZLIB_VERSION 1.3.1)
|
||||||
|
@@ -8,9 +8,12 @@ PROJECT_URL="${PROJECT_COMPANY_NAME}/repertory"
|
|||||||
PROJECT_COPYRIGHT="Copyright <2018-2025> <MIT License> <${PROJECT_URL}>"
|
PROJECT_COPYRIGHT="Copyright <2018-2025> <MIT License> <${PROJECT_URL}>"
|
||||||
PROJECT_DESC="Mount utility for Sia and S3"
|
PROJECT_DESC="Mount utility for Sia and S3"
|
||||||
|
|
||||||
|
PROJECT_MACOS_BUNDLE_ID="com.fifthgrid.blockstorage.repertory"
|
||||||
|
PROJECT_MACOS_ICNS_NAME="icon.icns"
|
||||||
|
|
||||||
PROJECT_MAJOR_VERSION=2
|
PROJECT_MAJOR_VERSION=2
|
||||||
PROJECT_MINOR_VERSION=0
|
PROJECT_MINOR_VERSION=1
|
||||||
PROJECT_REVISION_VERSION=6
|
PROJECT_REVISION_VERSION=0
|
||||||
PROJECT_RELEASE_NUM=0
|
PROJECT_RELEASE_NUM=0
|
||||||
PROJECT_RELEASE_ITER=rc
|
PROJECT_RELEASE_ITER=rc
|
||||||
|
|
||||||
@@ -21,6 +24,7 @@ PROJECT_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY}
|
|||||||
|
|
||||||
PROJECT_FLUTTER_BASE_HREF="/ui/"
|
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,5 +1,5 @@
|
|||||||
#comment
|
#comment
|
||||||
FROM arm64v8/alpine:3.21.3
|
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
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#comment
|
#comment
|
||||||
FROM alpine:3.21.3
|
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
|
||||||
|
|
||||||
|
@@ -11,7 +11,6 @@ RUN apt-get install -y \
|
|||||||
gdb \
|
gdb \
|
||||||
git \
|
git \
|
||||||
lib32stdc++6 \
|
lib32stdc++6 \
|
||||||
libgconf-2-4 \
|
|
||||||
libglu1-mesa \
|
libglu1-mesa \
|
||||||
libstdc++6 \
|
libstdc++6 \
|
||||||
python3 \
|
python3 \
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#comment
|
#comment
|
||||||
FROM alpine:3.21.3
|
FROM alpine:3.21.4
|
||||||
|
|
||||||
RUN apk update
|
RUN apk update
|
||||||
RUN apk upgrade
|
RUN apk upgrade
|
||||||
@@ -12,6 +12,7 @@ RUN apk add \
|
|||||||
bzip2 \
|
bzip2 \
|
||||||
clang17-extra-tools \
|
clang17-extra-tools \
|
||||||
cmake \
|
cmake \
|
||||||
|
curl \
|
||||||
file \
|
file \
|
||||||
flex \
|
flex \
|
||||||
g++ \
|
g++ \
|
||||||
@@ -43,6 +44,7 @@ RUN apk add \
|
|||||||
ruby \
|
ruby \
|
||||||
texinfo \
|
texinfo \
|
||||||
unzip \
|
unzip \
|
||||||
|
xvfb \
|
||||||
wget \
|
wget \
|
||||||
wine \
|
wine \
|
||||||
xz \
|
xz \
|
||||||
@@ -102,6 +104,39 @@ RUN echo -e \
|
|||||||
"system = 'windows'\n"\
|
"system = 'windows'\n"\
|
||||||
> ${MY_TOOLCHAIN_FILE_MESON}
|
> ${MY_TOOLCHAIN_FILE_MESON}
|
||||||
|
|
||||||
|
RUN mkdir -p /opt/bin;echo -e \
|
||||||
|
"#!/bin/sh\n"\
|
||||||
|
"COUNT=0\n"\
|
||||||
|
"echo \"Start waiting on \$@\"\n"\
|
||||||
|
"while pgrep \"\$@\" > /dev/null; do \n"\
|
||||||
|
" echo \"waiting ...\"\n"\
|
||||||
|
" sleep 1;\n"\
|
||||||
|
" COUNT=\$((COUNT+1))\n"\
|
||||||
|
" if [ \$COUNT -eq 60 ]; then\n"\
|
||||||
|
" exit 3;\n"\
|
||||||
|
" fi\n"\
|
||||||
|
"done\n"\
|
||||||
|
"echo \"\$@ completed\"\n"\
|
||||||
|
> /opt/bin/waitonprocess && \
|
||||||
|
chmod +x /opt/bin/waitonprocess && \
|
||||||
|
cat /opt/bin/waitonprocess
|
||||||
|
|
||||||
|
RUN echo -e \
|
||||||
|
"#!/bin/sh\n"\
|
||||||
|
"Xvfb \$DISPLAY &\n"\
|
||||||
|
"tokill=\$!\n"\
|
||||||
|
"wine wineboot --init\n"\
|
||||||
|
"waitonprocess wineserver\n"\
|
||||||
|
"\"\$@\"\n"\
|
||||||
|
"retval=\$?\n"\
|
||||||
|
"kill -15 \$tokill\n"\
|
||||||
|
"wine wineboot --shutdown\n"\
|
||||||
|
"return \$retval\n"\
|
||||||
|
> /opt/bin/wine-x11-run && \
|
||||||
|
chmod +x /opt/bin/wine-x11-run && \
|
||||||
|
cat /opt/bin/wine-x11-run
|
||||||
|
|
||||||
|
ENV PATH="/opt/bin:${PATH}"
|
||||||
SHELL [ "/bin/bash", "-c" ]
|
SHELL [ "/bin/bash", "-c" ]
|
||||||
|
|
||||||
RUN mkdir -p \
|
RUN mkdir -p \
|
||||||
@@ -351,9 +386,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} \
|
||||||
@@ -799,6 +834,7 @@ RUN if [ -f "/3rd_party/libevent-${MY_LIBEVENT_VERSION}-stable.tar.gz" ]; then \
|
|||||||
&& cmake .. \
|
&& cmake .. \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
|
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
|
||||||
|
-DCMAKE_C_FLAGS="-include winsock2.h -include ws2tcpip.h -include iphlpapi.h" \
|
||||||
-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} \
|
||||||
-DEVENT__DISABLE_OPENSSL=ON \
|
-DEVENT__DISABLE_OPENSSL=ON \
|
||||||
@@ -888,6 +924,7 @@ RUN if [ -f "/3rd_party/rocksdb-${MY_ROCKSDB_VERSION}.tar.gz" ]; then \
|
|||||||
-DROCKSDB_INSTALL_ON_WINDOWS=ON \
|
-DROCKSDB_INSTALL_ON_WINDOWS=ON \
|
||||||
-DWITH_BENCHMARK=OFF \
|
-DWITH_BENCHMARK=OFF \
|
||||||
-DWITH_BENCHMARK_TOOLS=OFF \
|
-DWITH_BENCHMARK_TOOLS=OFF \
|
||||||
|
-DWITH_BZ2=OFF \
|
||||||
-DWITH_CORE_TOOLS=OFF \
|
-DWITH_CORE_TOOLS=OFF \
|
||||||
-DWITH_EXAMPLES=OFF \
|
-DWITH_EXAMPLES=OFF \
|
||||||
-DWITH_GFLAGS=OFF \
|
-DWITH_GFLAGS=OFF \
|
||||||
@@ -1119,6 +1156,33 @@ RUN if [ -f "/3rd_party/libdsm-${MY_LIBDSM_VERSION}.tar.gz" ]; then \
|
|||||||
&& rm -r libdsm-${MY_LIBDSM_VERSION} \
|
&& rm -r libdsm-${MY_LIBDSM_VERSION} \
|
||||||
; fi
|
; fi
|
||||||
|
|
||||||
RUN (mv ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \
|
ENV DISPLAY=:90
|
||||||
|
ENV WINEDEBUG=-all,err+all
|
||||||
|
|
||||||
|
ARG INNOSETUP_VERSION
|
||||||
|
ENV MY_INNOSETUP_VERSION=${INNOSETUP_VERSION}
|
||||||
|
RUN rm -rf /root/.wine; \
|
||||||
|
wine64 reg add 'HKEY_CURRENT_USER\Software\Wine' /v ShowDotFiles /d Y \
|
||||||
|
&& while [ ! -f /root/.wine/user.reg ]; do sleep 1; done; \
|
||||||
|
wine-x11-run wine64 /3rd_party/mingw64/innosetup-${MY_INNOSETUP_VERSION}.exe /SP- /VERYSILENT /ALLUSERS /SUPPRESSMSGBOXES /DOWNLOADISCRYPT=1
|
||||||
|
|
||||||
|
ARG UID=1000
|
||||||
|
ARG GID=1000
|
||||||
|
ARG USERNAME=myuser
|
||||||
|
|
||||||
|
RUN delgroup scanner || echo "no scanner group found"
|
||||||
|
|
||||||
|
RUN addgroup -g $GID $USERNAME && \
|
||||||
|
adduser -D -u $UID -G $USERNAME -h /home/$USERNAME $USERNAME
|
||||||
|
|
||||||
|
RUN rsync -av --progress /root/.wine/ /home/$USERNAME/.wine/ && \
|
||||||
|
chown -R $UID:$GID -R /home/$USERNAME/.wine/
|
||||||
|
|
||||||
|
RUN (cp ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \
|
||||||
&& chmod 0777 -R ${MY_MINGW_DIR} \
|
&& chmod 0777 -R ${MY_MINGW_DIR} \
|
||||||
&& rm -rf /3rd_party
|
&& rm -rf /3rd_party \
|
||||||
|
&& rm -rf /root/.wine
|
||||||
|
|
||||||
|
USER $USERNAME
|
||||||
|
WORKDIR /home/$USERNAME
|
||||||
|
|
||||||
|
@@ -8,3 +8,7 @@ rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_in
|
|||||||
|
|
||||||
rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_input/ \
|
rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_input/ \
|
||||||
${PROJECT_DIST_DIR}/test_input/
|
${PROJECT_DIST_DIR}/test_input/
|
||||||
|
|
||||||
|
rsync -av --progress ${CURRENT_DIR}/assets/icon.ico ${PROJECT_DIST_DIR}/icon.ico
|
||||||
|
|
||||||
|
rsync -av --progress ${CURRENT_DIR}/assets/blue/logo.iconset/icon_128x128.png ${PROJECT_DIST_DIR}/repertory.png
|
||||||
|
@@ -1,7 +1,20 @@
|
|||||||
set(CMAKE_CXX_FLAGS "-include common.hpp ${CMAKE_CXX_FLAGS}")
|
set(CMAKE_CXX_FLAGS "-include common.hpp ${CMAKE_CXX_FLAGS}")
|
||||||
|
|
||||||
|
if (PROJECT_IS_DARWIN)
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/Info.plist.in
|
||||||
|
${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/Info.plist
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_project_library(lib${PROJECT_NAME} "" "" "${PROJECT_ADDITIONAL_SOURCES}")
|
add_project_library(lib${PROJECT_NAME} "" "" "${PROJECT_ADDITIONAL_SOURCES}")
|
||||||
|
|
||||||
add_project_executable(${PROJECT_NAME} lib${PROJECT_NAME} lib${PROJECT_NAME})
|
add_project_executable(${PROJECT_NAME} lib${PROJECT_NAME} lib${PROJECT_NAME})
|
||||||
|
if (PROJECT_IS_DARWIN)
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/Info.plist
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_project_test_executable(${PROJECT_NAME}_test lib${PROJECT_NAME} lib${PROJECT_NAME})
|
add_project_test_executable(${PROJECT_NAME}_test lib${PROJECT_NAME} lib${PROJECT_NAME})
|
||||||
|
171
repertory.iss.in
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
; Script generated by the Inno Setup Script Wizard.
|
||||||
|
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
||||||
|
|
||||||
|
#define MyAppName "repertory"
|
||||||
|
#define MyAppVersion "@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@-@PROJECT_RELEASE_ITER@_@PROJECT_GIT_REV@"
|
||||||
|
#define MyAppPublisher "BlockStorage"
|
||||||
|
#define MyAppURL "https://git.fifthgrid.com/BlockStorage/repertory"
|
||||||
|
#define MyAppExeName "repertory.exe"
|
||||||
|
|
||||||
|
[Setup]
|
||||||
|
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
|
||||||
|
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
||||||
|
AppId={{BD165823-1DEF-4D23-87DC-3D7A9BB73A00}
|
||||||
|
AppName={#MyAppName}
|
||||||
|
AppPublisher={#MyAppPublisher}
|
||||||
|
AppPublisherURL={#MyAppURL}
|
||||||
|
AppSupportURL={#MyAppURL}
|
||||||
|
AppUpdatesURL={#MyAppURL}
|
||||||
|
AppVersion={#MyAppVersion}
|
||||||
|
ArchitecturesAllowed=x64compatible
|
||||||
|
ArchitecturesInstallIn64BitMode=x64compatible
|
||||||
|
DefaultDirName={autopf}\{#MyAppName}
|
||||||
|
DefaultGroupName={#MyAppName}
|
||||||
|
DisableProgramGroupPage=yes
|
||||||
|
LicenseFile=repertory\LICENSE.md
|
||||||
|
OutputBaseFilename=repertory_{#MyAppVersion}_windows_@PROJECT_MARCH@_setup
|
||||||
|
PrivilegesRequired=admin
|
||||||
|
SolidCompression=yes
|
||||||
|
SetupIconFile=repertory\icon.ico
|
||||||
|
UninstallDisplayIcon={app}\icon.ico
|
||||||
|
WizardStyle=modern
|
||||||
|
|
||||||
|
[code]
|
||||||
|
const
|
||||||
|
SMTO_ABORTIFHUNG = $0002;
|
||||||
|
WM_SETTINGCHANGE = $001A;
|
||||||
|
|
||||||
|
type
|
||||||
|
LPARAM = LongWord;
|
||||||
|
LRESULT = LongWord;
|
||||||
|
WPARAM = LongWord;
|
||||||
|
|
||||||
|
function SendMessageTimeout(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: AnsiString;
|
||||||
|
fuFlags: UINT; uTimeout: UINT; out lpdwResult: DWORD): LRESULT;
|
||||||
|
external 'SendMessageTimeoutA@user32.dll stdcall';
|
||||||
|
|
||||||
|
procedure RefreshEnvironment();
|
||||||
|
var
|
||||||
|
EnvStr: AnsiString;
|
||||||
|
R: DWORD;
|
||||||
|
begin
|
||||||
|
EnvStr := 'Environment' + #0;
|
||||||
|
|
||||||
|
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
|
||||||
|
EnvStr, SMTO_ABORTIFHUNG, 5000, R);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function NormalizeSemicolons(S: string): string;
|
||||||
|
begin
|
||||||
|
while Pos(';;', S) > 0 do
|
||||||
|
StringChange(S, ';;', ';');
|
||||||
|
Result := S;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure AddAppToPath();
|
||||||
|
var
|
||||||
|
OldPath, NewPath, FinalPath: string;
|
||||||
|
begin
|
||||||
|
if not RegQueryStringValue(HKLM,
|
||||||
|
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
||||||
|
'Path', OldPath)
|
||||||
|
then
|
||||||
|
OldPath := '';
|
||||||
|
|
||||||
|
NewPath := ExpandConstant('{app}');
|
||||||
|
if Pos(LowerCase(NewPath), LowerCase(OldPath)) = 0 then
|
||||||
|
begin
|
||||||
|
if (OldPath <> '') and (Copy(OldPath, Length(OldPath), 1) <> ';') then
|
||||||
|
OldPath := OldPath + ';';
|
||||||
|
|
||||||
|
FinalPath := NormalizeSemicolons(OldPath + NewPath + ';');
|
||||||
|
RegWriteExpandStringValue(HKLM,
|
||||||
|
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
||||||
|
'Path', FinalPath);
|
||||||
|
|
||||||
|
RefreshEnvironment();
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure RemoveAppFromPath();
|
||||||
|
var
|
||||||
|
OldPath, NewPath, Token, Remainder, FinalPath: string;
|
||||||
|
p: Integer;
|
||||||
|
begin
|
||||||
|
if not RegQueryStringValue(HKLM,
|
||||||
|
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
||||||
|
'Path', OldPath) then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
NewPath := ExpandConstant('{app}');
|
||||||
|
Remainder := OldPath;
|
||||||
|
FinalPath := '';
|
||||||
|
|
||||||
|
while Length(Remainder) > 0 do
|
||||||
|
begin
|
||||||
|
p := Pos(';', Remainder);
|
||||||
|
if p = 0 then
|
||||||
|
begin
|
||||||
|
Token := Remainder;
|
||||||
|
Remainder := '';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Token := Copy(Remainder, 1, p - 1);
|
||||||
|
Delete(Remainder, 1, p);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Token := Trim(Token);
|
||||||
|
if (Token <> '') and (CompareText(Token, NewPath) <> 0) then
|
||||||
|
begin
|
||||||
|
if (FinalPath <> '') and (FinalPath[Length(FinalPath)] <> ';') then
|
||||||
|
FinalPath := FinalPath + ';';
|
||||||
|
FinalPath := FinalPath + Token;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
while Pos(';;', FinalPath) > 0 do
|
||||||
|
StringChange(FinalPath, ';;', ';');
|
||||||
|
if (FinalPath <> '') and (FinalPath[Length(FinalPath)] = ';') then
|
||||||
|
Delete(FinalPath, Length(FinalPath), 1);
|
||||||
|
|
||||||
|
RegWriteExpandStringValue(HKLM,
|
||||||
|
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
||||||
|
'Path', FinalPath);
|
||||||
|
|
||||||
|
RefreshEnvironment();
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure CurStepChanged(CurStep: TSetupStep);
|
||||||
|
begin
|
||||||
|
if CurStep = ssPostInstall then
|
||||||
|
begin
|
||||||
|
AddAppToPath();
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DeinitializeUninstall();
|
||||||
|
begin
|
||||||
|
RemoveAppFromPath();
|
||||||
|
end;
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||||
|
|
||||||
|
[Components]
|
||||||
|
Name: "main"; Description: "Repertory Core"; Types: full compact custom; Flags: fixed
|
||||||
|
Name: "winfsp"; Description: "WinFSP v@WINFSP_VERSION@"; Types: full custom
|
||||||
|
|
||||||
|
[Files]
|
||||||
|
Source: "repertory\*.*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
|
||||||
|
Source: "3rd_party\winfsp-@WINFSP_VERSION@.msi"; DestDir: "{app}"; Flags: ignoreversion; Components: winfsp
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Parameters: "-ui --hidden"; IconFilename: "{app}\assets\icon.ico"
|
||||||
|
|
||||||
|
[Run]
|
||||||
|
Filename: "msiexec.exe"; WorkingDir: "{app}"; Parameters: "/i winfsp-@WINFSP_VERSION@.msi /norestart"; \
|
||||||
|
Flags: 64bit hidewizard waituntilterminated skipifsilent; Components: winfsp
|
||||||
|
Filename: "{app}\repertory.exe"; WorkingDir: "{app}"; Parameters: "-ui --hidden"; \
|
||||||
|
Description: "Launch Repertory Management Portal"; \
|
||||||
|
Flags: 64bit runhidden nowait postinstall skipifsilent; Components: main
|
23
repertory/Info.plist.in
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||||
|
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>@PROJECT_NAME@</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>@PROJECT_MACOS_BUNDLE_ID@</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>@PROJECT_NAME@</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@-@PROJECT_RELEASE_ITER@_@PROJECT_GIT_REV@</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@.@PROJECT_RELEASE_NUM@</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>LSUIElement</key>
|
||||||
|
<true />
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>@PROJECT_MACOS_ICNS_NAME@</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
421
repertory/Install repertory.command
Normal file
@@ -0,0 +1,421 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# No `-e` (we tolerate benign non-zero returns); keep -Euo
|
||||||
|
set -Euo pipefail
|
||||||
|
|
||||||
|
LOG_DIR="/tmp"
|
||||||
|
LOG_FILE="${LOG_DIR}/Install-$(date +%Y%m%d-%H%M%S).log"
|
||||||
|
exec > >(tee -a "$LOG_FILE") 2>&1
|
||||||
|
echo "Logging to: $LOG_FILE"
|
||||||
|
|
||||||
|
TARGET_DIR="/Applications"
|
||||||
|
APP_NAME="repertory.app"
|
||||||
|
|
||||||
|
# Embedded at pack time (from CFBundleIdentifier prefix)
|
||||||
|
LABEL_PREFIX="__LABEL_PREFIX__"
|
||||||
|
UI_LABEL="${LABEL_PREFIX}.ui"
|
||||||
|
|
||||||
|
staged=""
|
||||||
|
backup=""
|
||||||
|
snapfile=""
|
||||||
|
skip_ui_launch=0
|
||||||
|
|
||||||
|
log() { printf "[%(%H:%M:%S)T] %s\n" -1 "$*"; }
|
||||||
|
warn() { log "WARN: $*"; }
|
||||||
|
die() {
|
||||||
|
log "ERROR: $*"
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
here="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
|
||||||
|
# Locate source app on the DMG (supports hidden payload dirs)
|
||||||
|
src_app="${here}/${APP_NAME}"
|
||||||
|
if [[ ! -d "$src_app" ]]; then
|
||||||
|
src_app="$(/usr/bin/find "$here" -type d -name "$APP_NAME" -print -quit 2>/dev/null || true)"
|
||||||
|
fi
|
||||||
|
[[ -d "$src_app" ]] || die "Could not find ${APP_NAME} on this disk image."
|
||||||
|
|
||||||
|
app_basename="$(basename "$src_app")"
|
||||||
|
dest_app="${TARGET_DIR}/${APP_NAME}"
|
||||||
|
|
||||||
|
bundle_id_of() { /usr/bin/defaults read "$1/Contents/Info" CFBundleIdentifier 2>/dev/null || true; }
|
||||||
|
bundle_exec_of() { /usr/bin/defaults read "$1/Contents/Info" CFBundleExecutable 2>/dev/null || echo "${app_basename%.app}"; }
|
||||||
|
bundle_version_of() {
|
||||||
|
/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "$1/Contents/Info.plist" 2>/dev/null ||
|
||||||
|
/usr/bin/defaults read "$1/Contents/Info" CFBundleShortVersionString 2>/dev/null || echo "(unknown)"
|
||||||
|
}
|
||||||
|
bundle_build_of() {
|
||||||
|
/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' "$1/Contents/Info.plist" 2>/dev/null ||
|
||||||
|
/usr/bin/defaults read "$1/Contents/Info" CFBundleVersion 2>/dev/null || echo "(unknown)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Require /Applications; prompt for sudo if needed; abort if cannot elevate
|
||||||
|
USE_SUDO=0
|
||||||
|
SUDO=""
|
||||||
|
ensure_target_writable() {
|
||||||
|
if mkdir -p "${TARGET_DIR}/.repertory_install_test.$$" 2>/dev/null; then
|
||||||
|
rmdir "${TARGET_DIR}/.repertory_install_test.$$" 2>/dev/null || true
|
||||||
|
USE_SUDO=0
|
||||||
|
SUDO=""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if command -v sudo >/dev/null 2>&1; then
|
||||||
|
log "Elevating privileges to write to ${TARGET_DIR}…"
|
||||||
|
sudo -v || die "Administrator privileges required to install into ${TARGET_DIR}."
|
||||||
|
USE_SUDO=1
|
||||||
|
SUDO="sudo"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
die "Cannot write to ${TARGET_DIR} and sudo is unavailable."
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- STRICT LABEL PREFIX GATE (fail if invalid) -----
|
||||||
|
_is_valid_label_prefix() {
|
||||||
|
local p="${1:-}"
|
||||||
|
[[ -n "$p" ]] && [[ "$p" != "__LABEL_PREFIX__" ]] && [[ "$p" =~ ^[A-Za-z0-9._-]+$ ]] && [[ "$p" == *.* ]]
|
||||||
|
}
|
||||||
|
if ! _is_valid_label_prefix "${LABEL_PREFIX:-}"; then
|
||||||
|
die "Invalid LABEL_PREFIX in installer (value: \"${LABEL_PREFIX:-}\"). Rebuild the DMG so the installer contains a valid reverse-DNS prefix."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ----- LaunchServices helpers -----
|
||||||
|
ls_prune_bundle_id() {
|
||||||
|
local bundle_id="$1" keep_path="$2"
|
||||||
|
[[ -z "$bundle_id" ]] && return 0
|
||||||
|
local search_roots=("/Applications" "$HOME/Applications" "/Volumes")
|
||||||
|
if [[ -n "${here:-}" && "$here" == /Volumes/* ]]; then search_roots+=("$here"); fi
|
||||||
|
local candidates=""
|
||||||
|
for root in "${search_roots[@]}"; do
|
||||||
|
[[ -d "$root" ]] || continue
|
||||||
|
candidates+=$'\n'"$(/usr/bin/mdfind -onlyin "$root" "kMDItemCFBundleIdentifier == '${bundle_id}'" 2>/dev/null || true)"
|
||||||
|
done
|
||||||
|
# Include backups adjacent to keep_path (quote-safe)
|
||||||
|
local parent_dir="${keep_path%/*.app}"
|
||||||
|
candidates+=$'\n'$(/bin/ls -1d "${parent_dir}/"*.bak 2>/dev/null || true)
|
||||||
|
local LSREG="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"
|
||||||
|
printf "%s\n" "$candidates" | /usr/bin/awk 'NF' | /usr/bin/sort -u | while IFS= read -r p; do
|
||||||
|
[[ -z "$p" || ! -d "$p" || "$p" == "$keep_path" ]] && continue
|
||||||
|
log "Unregistering older LS entry for ${bundle_id}: $p"
|
||||||
|
"$LSREG" -u "$p" >/dev/null 2>&1 || true
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- FUSE unmount (no process killing here) -----
|
||||||
|
is_mounted() { /sbin/mount | /usr/bin/awk '{print $3}' | /usr/bin/grep -Fx "${1:-}" >/dev/null 2>&1; }
|
||||||
|
_list_repertory_fuse_mounts() { /sbin/mount | /usr/bin/grep -Ei 'macfuse|osxfuse' | /usr/bin/awk '{print $3}' | /usr/bin/grep -i "repertory" || true; }
|
||||||
|
_unmount_one() {
|
||||||
|
local mnt="${1:-}"
|
||||||
|
[[ -n "$mnt" ]] || return 0
|
||||||
|
/usr/sbin/diskutil unmount "$mnt" >/dev/null 2>&1 || /sbin/umount "$mnt" >/dev/null 2>&1 || true
|
||||||
|
if is_mounted "$mnt"; then
|
||||||
|
/usr/sbin/diskutil unmount force "$mnt" >/dev/null 2>&1 || /sbin/umount -f "$mnt" >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
for _ in {1..20}; do
|
||||||
|
is_mounted "$mnt" || return 0
|
||||||
|
sleep 0.25
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
unmount_existing_repertory_volumes() {
|
||||||
|
# Hard-fail on the first unmount problem.
|
||||||
|
while IFS= read -r mnt; do
|
||||||
|
[[ -z "$mnt" ]] && continue
|
||||||
|
log "Unmounting FUSE mount: $mnt"
|
||||||
|
if ! _unmount_one "$mnt"; then
|
||||||
|
warn "Failed to unmount $mnt"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done < <(_list_repertory_fuse_mounts)
|
||||||
|
sync || true
|
||||||
|
sleep 0.3
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- user LaunchAgents (by LABEL_PREFIX only) -----
|
||||||
|
get_plist_label() { /usr/bin/defaults read "$1" Label 2>/dev/null || /usr/libexec/PlistBuddy -c "Print :Label" "$1" 2>/dev/null || basename "$1" .plist; }
|
||||||
|
|
||||||
|
# Return the executable path a LaunchAgent runs (ProgramArguments[0] or Program).
|
||||||
|
# Echoes empty string if neither is present.
|
||||||
|
get_plist_exec_path() {
|
||||||
|
local plist="$1" arg0=""
|
||||||
|
# Prefer ProgramArguments[0]
|
||||||
|
arg0="$(/usr/libexec/PlistBuddy -c 'Print :ProgramArguments:0' "$plist" 2>/dev/null || true)"
|
||||||
|
if [[ -z "$arg0" ]]; then
|
||||||
|
# Fallback to Program (older style)
|
||||||
|
arg0="$(/usr/libexec/PlistBuddy -c 'Print :Program' "$plist" 2>/dev/null || true)"
|
||||||
|
fi
|
||||||
|
printf '%s\n' "$arg0"
|
||||||
|
}
|
||||||
|
|
||||||
|
snapshot_launchagents_user() {
|
||||||
|
local user_agents="$HOME/Library/LaunchAgents"
|
||||||
|
snapfile="$(/usr/bin/mktemp "/tmp/repertory_launchagents.XXXXXX")" || snapfile=""
|
||||||
|
if [[ -z "$snapfile" ]]; then
|
||||||
|
warn "Could not create temporary snapshot file; skipping LaunchAgent restart snapshot."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
[[ -d "$user_agents" ]] || return 0
|
||||||
|
|
||||||
|
# We collect non-UI first, then UI last, to preserve restart order later.
|
||||||
|
local tmp_nonui tmp_ui
|
||||||
|
tmp_nonui="$(/usr/bin/mktemp "/tmp/repertory_launchagents.nonui.XXXXXX")" || tmp_nonui=""
|
||||||
|
tmp_ui="$(/usr/bin/mktemp "/tmp/repertory_launchagents.ui.XXXXXX")" || tmp_ui=""
|
||||||
|
|
||||||
|
/usr/bin/find "$user_agents" -maxdepth 1 -type f -name "${LABEL_PREFIX}"'*.plist' -print 2>/dev/null |
|
||||||
|
while IFS= read -r plist; do
|
||||||
|
[[ -z "$plist" ]] && continue
|
||||||
|
|
||||||
|
# Label must match the prefix
|
||||||
|
local label
|
||||||
|
label="$(get_plist_label "$plist")"
|
||||||
|
[[ -n "$label" && "$label" == "${LABEL_PREFIX}"* ]] || continue
|
||||||
|
|
||||||
|
# Executable must point into the *installed* app path
|
||||||
|
local exec_path
|
||||||
|
exec_path="$(get_plist_exec_path "$plist")"
|
||||||
|
[[ -n "$exec_path" ]] || continue
|
||||||
|
# Normalize: only accept absolute paths under $dest_app (e.g. .../repertory.app/Contents/...)
|
||||||
|
if [[ "$exec_path" != "$dest_app/"* ]]; then
|
||||||
|
# Not one of ours; skip
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Defer UI label to the end
|
||||||
|
if [[ "$label" == "$UI_LABEL" ]]; then
|
||||||
|
[[ -n "$tmp_ui" ]] && printf "%s\t%s\n" "$plist" "$label" >>"$tmp_ui"
|
||||||
|
else
|
||||||
|
[[ -n "$tmp_nonui" ]] && printf "%s\t%s\n" "$plist" "$label" >>"$tmp_nonui"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Stitch together: non-UI first, then UI
|
||||||
|
[[ -s "$tmp_nonui" ]] && /bin/cat "$tmp_nonui" >>"$snapfile"
|
||||||
|
[[ -s "$tmp_ui" ]] && /bin/cat "$tmp_ui" >>"$snapfile"
|
||||||
|
|
||||||
|
[[ -n "$tmp_nonui" ]] && /bin/rm -f "$tmp_nonui" 2>/dev/null || true
|
||||||
|
[[ -n "$tmp_ui" ]] && /bin/rm -f "$tmp_ui" 2>/dev/null || true
|
||||||
|
|
||||||
|
log "Snapshot contains $(/usr/bin/wc -l <"$snapfile" 2>/dev/null || echo 0) LaunchAgent(s)."
|
||||||
|
}
|
||||||
|
|
||||||
|
unload_launchd_helpers_user() {
|
||||||
|
local uid user_agents
|
||||||
|
uid="$(id -u)"
|
||||||
|
user_agents="$HOME/Library/LaunchAgents"
|
||||||
|
[[ -d "$user_agents" ]] || return 0
|
||||||
|
|
||||||
|
while IFS= read -r plist; do
|
||||||
|
[[ -z "$plist" ]] && continue
|
||||||
|
local base label
|
||||||
|
base="$(basename "$plist")"
|
||||||
|
[[ "$base" == "${LABEL_PREFIX}"* ]] || continue
|
||||||
|
label="$(get_plist_label "$plist")"
|
||||||
|
[[ -n "$label" && "$label" == "${LABEL_PREFIX}"* ]] || continue
|
||||||
|
log "Booting out user label ${label} (${plist})"
|
||||||
|
/bin/launchctl bootout "gui/${uid}" "$plist" 2>/dev/null ||
|
||||||
|
/bin/launchctl bootout "gui/${uid}" "$label" 2>/dev/null ||
|
||||||
|
/bin/launchctl remove "$label" 2>/dev/null || true
|
||||||
|
done < <(/usr/bin/find "$user_agents" -maxdepth 1 -type f -name "${LABEL_PREFIX}"'*.plist' -print 2>/dev/null)
|
||||||
|
|
||||||
|
/bin/launchctl list 2>/dev/null | /usr/bin/awk -v pre="$LABEL_PREFIX" 'NF>=3 && index($3, pre)==1 {print $3}' |
|
||||||
|
while read -r lbl; do
|
||||||
|
[[ -z "$lbl" ]] && continue
|
||||||
|
log "Booting out leftover user label: $lbl"
|
||||||
|
/bin/launchctl bootout "gui/${uid}" "$lbl" 2>/dev/null || /bin/launchctl remove "$lbl" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
restart_launchagents_from_snapshot() {
|
||||||
|
[[ -n "${snapfile:-}" && -f "${snapfile}" ]] || return 0
|
||||||
|
|
||||||
|
local uid count=0 ui_seen=0
|
||||||
|
uid="$(id -u)"
|
||||||
|
|
||||||
|
# Pass 1: restart all non-UI agents first
|
||||||
|
while IFS=$'\t' read -r plist label; do
|
||||||
|
[[ -n "$plist" && -n "$label" ]] || continue
|
||||||
|
[[ -f "$plist" ]] || continue
|
||||||
|
[[ "$label" == "$UI_LABEL" ]] && continue
|
||||||
|
|
||||||
|
log "Re-starting LaunchAgent: ${label}"
|
||||||
|
/bin/launchctl bootstrap "gui/${uid}" "$plist" 2>/dev/null || true
|
||||||
|
/bin/launchctl kickstart -k "gui/${uid}/${label}" 2>/dev/null || true
|
||||||
|
((count++)) || true
|
||||||
|
done <"$snapfile"
|
||||||
|
|
||||||
|
# Give helpers a moment to settle (e.g., automounts)
|
||||||
|
sleep 0.3
|
||||||
|
|
||||||
|
# Pass 2: restart the UI agent last (if present in the snapshot)
|
||||||
|
while IFS=$'\t' read -r plist label; do
|
||||||
|
[[ -n "$plist" && -n "$label" ]] || continue
|
||||||
|
[[ -f "$plist" ]] || continue
|
||||||
|
[[ "$label" == "$UI_LABEL" ]] || continue
|
||||||
|
|
||||||
|
log "Re-starting UI LaunchAgent last: ${label}"
|
||||||
|
/bin/launchctl bootstrap "gui/${uid}" "$plist" 2>/dev/null || true
|
||||||
|
/bin/launchctl kickstart -k "gui/${uid}/${label}" 2>/dev/null || true
|
||||||
|
ui_seen=1
|
||||||
|
((count++)) || true
|
||||||
|
done <"$snapfile"
|
||||||
|
|
||||||
|
log "Re-started ${count} LaunchAgent(s) with prefix ${LABEL_PREFIX}." || true
|
||||||
|
|
||||||
|
if ((ui_seen)); then
|
||||||
|
# If the UI label is active, skip manual open(1).
|
||||||
|
if /bin/launchctl list | /usr/bin/awk '{print $3}' | /usr/bin/grep -Fxq "$UI_LABEL"; then
|
||||||
|
log "UI LaunchAgent (${UI_LABEL}) active after restart; skipping manual UI launch."
|
||||||
|
skip_ui_launch=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- quarantine helper -----
|
||||||
|
remove_quarantine() {
|
||||||
|
local path="${1:-}"
|
||||||
|
if [[ "${USE_SUDO:-0}" == "1" ]]; then
|
||||||
|
sudo /usr/bin/xattr -dr com.apple.quarantine "$path" 2>/dev/null || true
|
||||||
|
else
|
||||||
|
/usr/bin/xattr -dr com.apple.quarantine "$path" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- process helpers -----
|
||||||
|
kill_repertory_processes() {
|
||||||
|
local exec_name="$1"
|
||||||
|
/usr/bin/pkill -TERM -f "$dest_app" >/dev/null 2>&1 || true
|
||||||
|
/usr/bin/pkill -TERM -x "$exec_name" >/dev/null 2>&1 || true
|
||||||
|
for _ in {1..20}; do
|
||||||
|
/usr/bin/pgrep -af "$dest_app" >/dev/null 2>&1 || /usr/bin/pgrep -x "$exec_name" >/dev/null 2>&1 || break
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
/usr/bin/pkill -KILL -f "$dest_app" >/dev/null 2>&1 || true
|
||||||
|
/usr/bin/pkill -KILL -x "$exec_name" >/dev/null 2>&1 || true
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- visibility helper -----
|
||||||
|
unhide_path() {
|
||||||
|
local path="$1"
|
||||||
|
/usr/bin/chflags -R nohidden "$path" 2>/dev/null || true
|
||||||
|
/usr/bin/xattr -d -r com.apple.FinderInfo "$path" 2>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----- stage / validate / activate / post-activate -----
|
||||||
|
stage_new_app() {
|
||||||
|
staged="${dest_app}.new-$$"
|
||||||
|
log "Staging new app → $staged"
|
||||||
|
$SUDO /usr/bin/ditto "$src_app" "$staged" || die "ditto to stage failed"
|
||||||
|
remove_quarantine "$staged"
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_staged_app() {
|
||||||
|
[[ -f "$staged/Contents/Info.plist" ]] || {
|
||||||
|
$SUDO /bin/rm -rf "$staged"
|
||||||
|
die "staged app missing Info.plist"
|
||||||
|
}
|
||||||
|
local exe_name_staged
|
||||||
|
exe_name_staged="$(/usr/bin/defaults read "$staged/Contents/Info" CFBundleExecutable 2>/dev/null || echo "${app_basename%.app}")"
|
||||||
|
[[ -x "$staged/Contents/MacOS/$exe_name_staged" ]] || {
|
||||||
|
$SUDO /bin/rm -rf "$staged"
|
||||||
|
die "staged app missing main executable"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
activate_staged_app() {
|
||||||
|
if [[ -d "$dest_app" ]]; then
|
||||||
|
backup="${dest_app}.$(date +%Y%m%d%H%M%S).bak"
|
||||||
|
log "Moving existing app to backup: $backup"
|
||||||
|
$SUDO /bin/mv "$dest_app" "$backup" || {
|
||||||
|
$SUDO /bin/rm -rf "$staged"
|
||||||
|
die "failed to move existing app out of the way"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
log "Activating new app → $dest_app"
|
||||||
|
if ! $SUDO /bin/mv "$staged" "$dest_app"; then
|
||||||
|
warn "Activation failed; attempting rollback…"
|
||||||
|
[[ -n "$backup" && -d "$backup" ]] && $SUDO /bin/mv "$backup" "$dest_app" || true
|
||||||
|
$SUDO /bin/rm -rf "$staged" || true
|
||||||
|
die "install activation failed"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
post_activate_cleanup() {
|
||||||
|
log "Clearing quarantine on installed app…"
|
||||||
|
remove_quarantine "$dest_app"
|
||||||
|
log "Clearing hidden flags on installed app…"
|
||||||
|
unhide_path "$dest_app"
|
||||||
|
|
||||||
|
local LSREG="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"
|
||||||
|
[[ -x "$LSREG" ]] && "$LSREG" -f "$dest_app" >/dev/null 2>&1 || true
|
||||||
|
local BID
|
||||||
|
BID="$(bundle_id_of "$dest_app")"
|
||||||
|
ls_prune_bundle_id "$BID" "$dest_app"
|
||||||
|
|
||||||
|
log "Installed ${app_basename}: version=$(bundle_version_of "$dest_app") build=$(bundle_build_of "$dest_app")"
|
||||||
|
}
|
||||||
|
|
||||||
|
launch_ui() {
|
||||||
|
log "Launching the new app…"
|
||||||
|
/usr/bin/open -n "$dest_app" || warn "open -n by path failed; not falling back to -b to avoid launching a stale copy."
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_backup() {
|
||||||
|
[[ -n "$backup" && -d "$backup" ]] && {
|
||||||
|
log "Removing backup: $backup"
|
||||||
|
$SUDO /bin/rm -rf "$backup" || warn "Could not remove backup (safe to delete manually): $backup"
|
||||||
|
}
|
||||||
|
log "Done."
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup_staged() {
|
||||||
|
if [[ -n "${staged:-}" && -d "${staged}" ]]; then
|
||||||
|
log "Cleaning up staged folder: ${staged}"
|
||||||
|
if [[ "${USE_SUDO:-0}" == "1" ]]; then
|
||||||
|
sudo /bin/rm -rf "${staged}" 2>/dev/null || true
|
||||||
|
else
|
||||||
|
/bin/rm -rf "${staged}" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ -n "${snapfile:-}" && -f "${snapfile}" ]]; then
|
||||||
|
/bin/rm -f "${snapfile}" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
ensure_target_writable
|
||||||
|
|
||||||
|
local exec_name
|
||||||
|
exec_name="$(bundle_exec_of "$src_app")"
|
||||||
|
|
||||||
|
# 1) Snapshot agents we’ll restart later
|
||||||
|
snapshot_launchagents_user
|
||||||
|
|
||||||
|
# 2) Hard-fail if any FUSE unmount fails
|
||||||
|
unmount_existing_repertory_volumes || die "One or more FUSE mounts resisted unmount."
|
||||||
|
|
||||||
|
# 3) Stop user LaunchAgents (do NOT delete plists)
|
||||||
|
unload_launchd_helpers_user
|
||||||
|
|
||||||
|
# 4) Kill any remaining repertory processes
|
||||||
|
kill_repertory_processes "$exec_name"
|
||||||
|
|
||||||
|
# 5) Stage → validate → activate → post-activate
|
||||||
|
stage_new_app
|
||||||
|
validate_staged_app
|
||||||
|
activate_staged_app
|
||||||
|
post_activate_cleanup
|
||||||
|
|
||||||
|
# 6) Re-start previously-running LaunchAgents (so automount helpers come up)
|
||||||
|
restart_launchagents_from_snapshot
|
||||||
|
|
||||||
|
# 7) If UI LaunchAgent came back, skip manual launch
|
||||||
|
if ((!skip_ui_launch)); then
|
||||||
|
launch_ui
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 8) Remove backup now that everything is good
|
||||||
|
remove_backup
|
||||||
|
}
|
||||||
|
|
||||||
|
trap 'rc=$?; cleanup_staged; if (( rc != 0 )); then echo "Installer failed with code $rc. See $LOG_FILE"; fi' EXIT
|
||||||
|
main "$@"
|
@@ -31,24 +31,22 @@ private:
|
|||||||
static stop_type stop_requested;
|
static stop_type stop_requested;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] static auto default_agent_name(const provider_type &prov)
|
[[nodiscard]] static auto default_agent_name(provider_type prov)
|
||||||
-> std::string;
|
-> std::string;
|
||||||
|
|
||||||
[[nodiscard]] static auto default_api_port(const provider_type &prov)
|
[[nodiscard]] static auto default_api_port(provider_type prov)
|
||||||
-> std::uint16_t;
|
-> std::uint16_t;
|
||||||
|
|
||||||
[[nodiscard]] static auto default_data_directory(const provider_type &prov)
|
[[nodiscard]] static auto default_data_directory(provider_type prov)
|
||||||
-> std::string;
|
-> std::string;
|
||||||
|
|
||||||
[[nodiscard]] static auto default_remote_api_port(const provider_type &prov)
|
[[nodiscard]] static auto default_remote_api_port(provider_type prov)
|
||||||
-> std::uint16_t;
|
-> std::uint16_t;
|
||||||
|
|
||||||
[[nodiscard]] static auto default_rpc_port() -> std::uint16_t;
|
[[nodiscard]] static auto get_provider_display_name(provider_type prov)
|
||||||
|
|
||||||
[[nodiscard]] static auto get_provider_display_name(const provider_type &prov)
|
|
||||||
-> std::string;
|
-> std::string;
|
||||||
|
|
||||||
[[nodiscard]] static auto get_provider_name(const provider_type &prov)
|
[[nodiscard]] static auto get_provider_name(provider_type prov)
|
||||||
-> std::string;
|
-> std::string;
|
||||||
|
|
||||||
[[nodiscard]] static auto get_root_data_directory() -> std::string;
|
[[nodiscard]] static auto get_root_data_directory() -> std::string;
|
||||||
@@ -59,7 +57,7 @@ public:
|
|||||||
static void set_stop_requested();
|
static void set_stop_requested();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
app_config(const provider_type &prov, std::string_view data_directory = "");
|
app_config(provider_type prov, std::string_view data_directory = "");
|
||||||
|
|
||||||
app_config() = delete;
|
app_config() = delete;
|
||||||
app_config(app_config &&) = delete;
|
app_config(app_config &&) = delete;
|
||||||
@@ -72,9 +70,9 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
provider_type prov_;
|
provider_type prov_;
|
||||||
atomic<std::string> api_password_;
|
utils::atomic<std::string> api_password_;
|
||||||
std::atomic<std::uint16_t> api_port_;
|
std::atomic<std::uint16_t> api_port_;
|
||||||
atomic<std::string> api_user_;
|
utils::atomic<std::string> api_user_;
|
||||||
std::atomic<bool> config_changed_;
|
std::atomic<bool> config_changed_;
|
||||||
std::atomic<database_type> db_type_{database_type::rocksdb};
|
std::atomic<database_type> db_type_{database_type::rocksdb};
|
||||||
std::atomic<std::uint8_t> download_timeout_secs_;
|
std::atomic<std::uint8_t> download_timeout_secs_;
|
||||||
@@ -100,14 +98,14 @@ private:
|
|||||||
private:
|
private:
|
||||||
std::string cache_directory_;
|
std::string cache_directory_;
|
||||||
std::string data_directory_;
|
std::string data_directory_;
|
||||||
atomic<encrypt_config> encrypt_config_;
|
utils::atomic<encrypt_config> encrypt_config_;
|
||||||
atomic<host_config> host_config_;
|
utils::atomic<host_config> host_config_;
|
||||||
std::string log_directory_;
|
std::string log_directory_;
|
||||||
mutable std::recursive_mutex read_write_mutex_;
|
mutable std::recursive_mutex read_write_mutex_;
|
||||||
atomic<remote::remote_config> remote_config_;
|
utils::atomic<remote::remote_config> remote_config_;
|
||||||
atomic<remote::remote_mount> remote_mount_;
|
utils::atomic<remote::remote_mount> remote_mount_;
|
||||||
atomic<s3_config> s3_config_;
|
utils::atomic<s3_config> s3_config_;
|
||||||
atomic<sia_config> sia_config_;
|
utils::atomic<sia_config> sia_config_;
|
||||||
std::unordered_map<std::string, std::function<std::string()>>
|
std::unordered_map<std::string, std::function<std::string()>>
|
||||||
value_get_lookup_;
|
value_get_lookup_;
|
||||||
std::unordered_map<std::string,
|
std::unordered_map<std::string,
|
||||||
|
@@ -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"
|
||||||
@@ -42,20 +43,18 @@ private:
|
|||||||
using write_callback = size_t (*)(char *, size_t, size_t, void *);
|
using write_callback = size_t (*)(char *, size_t, size_t, void *);
|
||||||
|
|
||||||
struct read_write_info final {
|
struct read_write_info final {
|
||||||
data_buffer data{};
|
data_buffer data;
|
||||||
stop_type_callback stop_requested_cb;
|
stop_type_callback stop_requested_cb;
|
||||||
};
|
};
|
||||||
|
|
||||||
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,
|
||||||
@@ -95,9 +93,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
data_buffer data{};
|
data_buffer data{};
|
||||||
const auto key =
|
const auto key = utils::encryption::generate_key<utils::hash::hash_256_t>(
|
||||||
utils::encryption::generate_key<utils::encryption::hash_256_t>(
|
request.decryption_token.value());
|
||||||
request.decryption_token.value());
|
|
||||||
if (not utils::encryption::read_encrypted_range(
|
if (not utils::encryption::read_encrypted_range(
|
||||||
request.range.value(), key,
|
request.range.value(), key,
|
||||||
[&](data_buffer &ct, std::uint64_t start_offset,
|
[&](data_buffer &ct, std::uint64_t start_offset,
|
||||||
@@ -139,107 +136,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
@@ -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,
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
#ifndef REPERTORY_INCLUDE_COMMON_HPP_
|
#ifndef REPERTORY_INCLUDE_COMMON_HPP_
|
||||||
#define REPERTORY_INCLUDE_COMMON_HPP_
|
#define REPERTORY_INCLUDE_COMMON_HPP_
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__) && !defined(PROJECT_IS_DARWIN)
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define REPERTORY_IGNORE_WARNINGS_ENABLE() \
|
#define REPERTORY_IGNORE_WARNINGS_ENABLE() \
|
||||||
_Pragma("GCC diagnostic push") \
|
_Pragma("GCC diagnostic push") \
|
||||||
@@ -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 = 2ULL;
|
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.1.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,11 +222,11 @@ using WCHAR = wchar_t;
|
|||||||
|
|
||||||
#define MAX_PATH 260
|
#define MAX_PATH 260
|
||||||
|
|
||||||
#define STATUS_SUCCESS std::uint32_t{0U}
|
|
||||||
#define STATUS_ACCESS_DENIED std::uint32_t{0xC0000022L}
|
#define STATUS_ACCESS_DENIED std::uint32_t{0xC0000022L}
|
||||||
#define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L}
|
#define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L}
|
||||||
#define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L}
|
#define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L}
|
||||||
#define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L}
|
#define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L}
|
||||||
|
#define STATUS_END_OF_FILE std::uint32_t{0xC0000011L}
|
||||||
#define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL}
|
#define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL}
|
||||||
#define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L}
|
#define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L}
|
||||||
#define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL}
|
#define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL}
|
||||||
@@ -234,11 +235,13 @@ using WCHAR = wchar_t;
|
|||||||
#define STATUS_INVALID_HANDLE std::uint32_t{0xC0000006L}
|
#define STATUS_INVALID_HANDLE std::uint32_t{0xC0000006L}
|
||||||
#define STATUS_INVALID_IMAGE_FORMAT std::uint32_t{0xC000007BL}
|
#define STATUS_INVALID_IMAGE_FORMAT std::uint32_t{0xC000007BL}
|
||||||
#define STATUS_INVALID_PARAMETER std::uint32_t{0xC000000DL}
|
#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_NOT_IMPLEMENTED std::uint32_t{0xC0000002L}
|
||||||
|
#define STATUS_NO_MEMORY std::uint32_t{0xC0000017L}
|
||||||
|
#define STATUS_OBJECT_NAME_COLLISION std::uint32_t{0xC0000035L}
|
||||||
#define STATUS_OBJECT_NAME_EXISTS std::uint32_t{0x40000000L}
|
#define STATUS_OBJECT_NAME_EXISTS std::uint32_t{0x40000000L}
|
||||||
#define STATUS_OBJECT_NAME_NOT_FOUND std::uint32_t{0xC0000034L}
|
#define STATUS_OBJECT_NAME_NOT_FOUND std::uint32_t{0xC0000034L}
|
||||||
#define STATUS_OBJECT_PATH_INVALID std::uint32_t{0xC0000039L}
|
#define STATUS_OBJECT_PATH_INVALID std::uint32_t{0xC0000039L}
|
||||||
|
#define STATUS_SUCCESS std::uint32_t{0U}
|
||||||
#define STATUS_UNEXPECTED_IO_ERROR std::uint32_t{0xC00000E9L}
|
#define STATUS_UNEXPECTED_IO_ERROR std::uint32_t{0xC00000E9L}
|
||||||
|
|
||||||
#define CONVERT_STATUS_NOT_IMPLEMENTED(e) \
|
#define CONVERT_STATUS_NOT_IMPLEMENTED(e) \
|
||||||
|
@@ -29,6 +29,13 @@ class i_file_db {
|
|||||||
INTERFACE_SETUP(i_file_db);
|
INTERFACE_SETUP(i_file_db);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
struct directory_data final {
|
||||||
|
std::string api_path;
|
||||||
|
std::pair<utils::encryption::kdf_config, utils::encryption::kdf_config>
|
||||||
|
kdf_configs;
|
||||||
|
std::string source_path;
|
||||||
|
};
|
||||||
|
|
||||||
struct file_info final {
|
struct file_info final {
|
||||||
std::string api_path;
|
std::string api_path;
|
||||||
bool directory{};
|
bool directory{};
|
||||||
@@ -40,13 +47,14 @@ public:
|
|||||||
std::uint64_t file_size{};
|
std::uint64_t file_size{};
|
||||||
std::vector<
|
std::vector<
|
||||||
std::array<unsigned char, crypto_aead_xchacha20poly1305_IETF_NPUBBYTES>>
|
std::array<unsigned char, crypto_aead_xchacha20poly1305_IETF_NPUBBYTES>>
|
||||||
iv_list{};
|
iv_list;
|
||||||
|
std::pair<utils::encryption::kdf_config, utils::encryption::kdf_config>
|
||||||
|
kdf_configs;
|
||||||
std::string source_path;
|
std::string source_path;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] virtual auto add_directory(const std::string &api_path,
|
[[nodiscard]] virtual auto add_or_update_directory(const directory_data &data)
|
||||||
const std::string &source_path)
|
|
||||||
-> api_error = 0;
|
-> api_error = 0;
|
||||||
|
|
||||||
[[nodiscard]] virtual auto add_or_update_file(const file_data &data)
|
[[nodiscard]] virtual auto add_or_update_file(const file_data &data)
|
||||||
@@ -68,6 +76,10 @@ public:
|
|||||||
get_directory_api_path(const std::string &source_path,
|
get_directory_api_path(const std::string &source_path,
|
||||||
std::string &api_path) const -> api_error = 0;
|
std::string &api_path) const -> api_error = 0;
|
||||||
|
|
||||||
|
[[nodiscard]] virtual auto get_directory_data(const std::string &api_path,
|
||||||
|
directory_data &data) const
|
||||||
|
-> api_error = 0;
|
||||||
|
|
||||||
[[nodiscard]] virtual auto
|
[[nodiscard]] virtual auto
|
||||||
get_directory_source_path(const std::string &api_path,
|
get_directory_source_path(const std::string &api_path,
|
||||||
std::string &source_path) const -> api_error = 0;
|
std::string &source_path) const -> api_error = 0;
|
||||||
|
@@ -67,8 +67,7 @@ private:
|
|||||||
rocksdb::Transaction *txn) -> rocksdb::Status;
|
rocksdb::Transaction *txn) -> rocksdb::Status;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] auto add_directory(const std::string &api_path,
|
[[nodiscard]] auto add_or_update_directory(const directory_data &data)
|
||||||
const std::string &source_path)
|
|
||||||
-> api_error override;
|
-> api_error override;
|
||||||
|
|
||||||
[[nodiscard]] auto add_or_update_file(const i_file_db::file_data &data)
|
[[nodiscard]] auto add_or_update_file(const i_file_db::file_data &data)
|
||||||
@@ -90,6 +89,10 @@ public:
|
|||||||
std::string &api_path) const
|
std::string &api_path) const
|
||||||
-> api_error override;
|
-> api_error override;
|
||||||
|
|
||||||
|
[[nodiscard]] auto get_directory_data(const std::string &api_path,
|
||||||
|
i_file_db::directory_data &data) const
|
||||||
|
-> api_error override;
|
||||||
|
|
||||||
[[nodiscard]] auto get_directory_source_path(const std::string &api_path,
|
[[nodiscard]] auto get_directory_source_path(const std::string &api_path,
|
||||||
std::string &source_path) const
|
std::string &source_path) const
|
||||||
-> api_error override;
|
-> api_error override;
|
||||||
|
@@ -42,8 +42,8 @@ private:
|
|||||||
utils::db::sqlite::db3_t db_;
|
utils::db::sqlite::db3_t db_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] auto add_directory(const std::string &api_path,
|
[[nodiscard]] auto
|
||||||
const std::string &source_path)
|
add_or_update_directory(const i_file_db::directory_data &data)
|
||||||
-> api_error override;
|
-> api_error override;
|
||||||
|
|
||||||
[[nodiscard]] auto add_or_update_file(const i_file_db::file_data &data)
|
[[nodiscard]] auto add_or_update_file(const i_file_db::file_data &data)
|
||||||
@@ -65,6 +65,10 @@ public:
|
|||||||
std::string &api_path) const
|
std::string &api_path) const
|
||||||
-> api_error override;
|
-> api_error override;
|
||||||
|
|
||||||
|
[[nodiscard]] auto get_directory_data(const std::string &api_path,
|
||||||
|
i_file_db::directory_data &data) const
|
||||||
|
-> api_error override;
|
||||||
|
|
||||||
[[nodiscard]] auto get_directory_source_path(const std::string &api_path,
|
[[nodiscard]] auto get_directory_source_path(const std::string &api_path,
|
||||||
std::string &source_path) const
|
std::string &source_path) const
|
||||||
-> api_error override;
|
-> api_error override;
|
||||||
|
@@ -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 &;
|
||||||
};
|
};
|
||||||
|
@@ -52,7 +52,11 @@ private:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool atime_enabled_{true};
|
bool atime_enabled_{true};
|
||||||
bool console_enabled_{false};
|
bool console_enabled_{true};
|
||||||
|
bool foreground_{false};
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
std::string label_;
|
||||||
|
#endif // defined(__APPLE__)
|
||||||
std::optional<gid_t> forced_gid_;
|
std::optional<gid_t> forced_gid_;
|
||||||
std::optional<uid_t> forced_uid_;
|
std::optional<uid_t> forced_uid_;
|
||||||
std::optional<mode_t> forced_umask_;
|
std::optional<mode_t> forced_umask_;
|
||||||
@@ -61,7 +65,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 +82,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,105 +95,107 @@ 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 *f_info) -> 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 *f_info) -> 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 *f_info) -> int;
|
||||||
|
|
||||||
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) -> int;
|
struct fuse_file_info *f_info) -> 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 *u_stat,
|
||||||
struct fuse_file_info *fi) -> int;
|
struct fuse_file_info *f_info) -> 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 *f_info) -> 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 *f_info) -> int;
|
||||||
|
|
||||||
[[nodiscard]] static auto ftruncate_(const char *path, off_t size,
|
[[nodiscard]] static auto ftruncate_(const char *path, off_t size,
|
||||||
struct fuse_file_info *fi) -> int;
|
struct fuse_file_info *f_info) -> int;
|
||||||
|
|
||||||
#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 *u_stat,
|
||||||
struct fuse_file_info *fi) -> int;
|
struct fuse_file_info *f_info) -> 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 *u_stat)
|
||||||
#endif
|
-> int;
|
||||||
|
#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) -> int;
|
struct fuse_file_info *f_info) -> 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 *f_info) -> int;
|
||||||
|
|
||||||
[[nodiscard]] static auto read_(const char *path, char *buffer,
|
[[nodiscard]] static auto read_(const char *path, char *buffer,
|
||||||
size_t read_size, off_t read_offset,
|
size_t read_size, off_t read_offset,
|
||||||
struct fuse_file_info *fi) -> int;
|
struct fuse_file_info *f_info) -> int;
|
||||||
|
|
||||||
#if FUSE_USE_VERSION >= 30
|
#if 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, struct fuse_file_info *fi,
|
off_t offset,
|
||||||
|
struct fuse_file_info *f_info,
|
||||||
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) -> int;
|
struct fuse_file_info *f_info) -> 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 *f_info) -> int;
|
||||||
|
|
||||||
[[nodiscard]] static auto releasedir_(const char *path,
|
[[nodiscard]] static auto releasedir_(const char *path,
|
||||||
struct fuse_file_info *fi) -> int;
|
struct fuse_file_info *f_info) -> int;
|
||||||
|
|
||||||
#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 +205,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,39 +244,39 @@ 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 *f_info) -> 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;
|
||||||
|
|
||||||
#if FUSE_USE_VERSION >= 30
|
#if FUSE_USE_VERSION >= 30
|
||||||
[[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 *f_info) -> 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 *f_info) -> 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 +285,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 * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/)
|
||||||
|
-> api_error {
|
||||||
return api_error::not_implemented;
|
return api_error::not_implemented;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,87 +326,94 @@ 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 * /*f_info*/)
|
||||||
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 * /*u_stat*/,
|
||||||
struct fuse_file_info * /*fi*/) -> api_error {
|
struct fuse_file_info * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/)
|
||||||
|
-> 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
|
|
||||||
getattr_impl(std::string /*api_path*/, struct stat * /*st*/,
|
|
||||||
struct fuse_file_info * /*fi*/) -> api_error {
|
|
||||||
return api_error::not_implemented;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
[[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 * /*u_stat*/,
|
||||||
|
struct fuse_file_info * /*f_info*/)
|
||||||
|
-> api_error {
|
||||||
return api_error::not_implemented;
|
return api_error::not_implemented;
|
||||||
}
|
}
|
||||||
#endif
|
#else // FUSE_USE_VERSION < 30
|
||||||
|
[[nodiscard]] virtual auto getattr_impl(std::string /*api_path*/,
|
||||||
|
struct stat * /*u_stat*/)
|
||||||
|
-> api_error {
|
||||||
|
return api_error::not_implemented;
|
||||||
|
}
|
||||||
|
#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 * /*f_info*/)
|
||||||
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 * /*f_info*/)
|
||||||
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
|
||||||
read_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*read_size*/,
|
read_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*read_size*/,
|
||||||
off_t /*read_offset*/, struct fuse_file_info * /*fi*/,
|
off_t /*read_offset*/, struct fuse_file_info * /*f_info*/,
|
||||||
std::size_t & /*bytes_read*/) -> api_error {
|
std::size_t & /*bytes_read*/) -> api_error {
|
||||||
return api_error::not_implemented;
|
return api_error::not_implemented;
|
||||||
}
|
}
|
||||||
@@ -405,28 +422,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 * /*f_info*/, 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 * /*f_info*/) -> 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 * /*f_info*/)
|
||||||
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 * /*f_info*/)
|
||||||
struct fuse_file_info * /*fi*/) -> api_error {
|
-> api_error {
|
||||||
return api_error::not_implemented;
|
return api_error::not_implemented;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,13 +453,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 +473,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 +488,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 +502,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,71 +526,73 @@ 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 * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/)
|
||||||
|
-> 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 * /*f_info*/,
|
||||||
std::size_t & /*bytes_written*/) -> api_error {
|
std::size_t & /*bytes_written*/) -> api_error {
|
||||||
return api_error::not_implemented;
|
return api_error::not_implemented;
|
||||||
}
|
}
|
||||||
@@ -593,15 +611,17 @@ public:
|
|||||||
|
|
||||||
static void display_version_information(std::vector<const char *> args);
|
static void display_version_information(std::vector<const char *> args);
|
||||||
|
|
||||||
static auto unmount(const std::string &mount_location) -> int;
|
auto unmount(const std::string &mount_location) -> int;
|
||||||
|
|
||||||
[[nodiscard]] auto get_mount_location() const -> std::string {
|
[[nodiscard]] auto get_mount_location() const -> std::string {
|
||||||
return mount_location_;
|
return mount_location_;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] auto mount(std::vector<std::string> args) -> int;
|
[[nodiscard]] auto mount(std::vector<std::string> orig_args,
|
||||||
|
std::vector<std::string> args, provider_type prov,
|
||||||
|
std::string_view unique_id) -> int;
|
||||||
};
|
};
|
||||||
} // 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,214 +73,220 @@ 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 *f_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 *f_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 *f_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 *f_info)
|
||||||
|
-> api_error override;
|
||||||
|
|
||||||
[[nodiscard]] auto
|
[[nodiscard]] auto fgetattr_impl(std::string api_path, struct stat *u_stat,
|
||||||
fgetattr_impl(std::string api_path, struct stat *unix_st,
|
struct fuse_file_info *f_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 *f_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 *f_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 *f_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 *u_stat,
|
||||||
getattr_impl(std::string api_path, struct stat *unix_st,
|
struct fuse_file_info *f_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 *u_stat)
|
||||||
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 *f_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 *f_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,
|
||||||
struct fuse_file_info *file_info,
|
struct fuse_file_info *f_info,
|
||||||
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 *f_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 *f_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 *f_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 *f_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 *f_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 *f_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 *f_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,76 +63,78 @@ 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,
|
||||||
const api_meta_map &meta, bool directory,
|
const api_meta_map &meta, bool directory,
|
||||||
i_provider &provider, struct stat *st);
|
i_provider &provider, struct stat *u_stat);
|
||||||
|
|
||||||
static void set_timespec_from_meta(const api_meta_map &meta,
|
static void set_timespec_from_meta(const api_meta_map &meta,
|
||||||
const std::string &name,
|
const std::string &name,
|
||||||
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_
|
||||||
|
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#include "comm/packet/packet_client.hpp"
|
#include "comm/packet/packet_client.hpp"
|
||||||
#include "drives/fuse/remotefuse/i_remote_instance.hpp"
|
#include "drives/fuse/remotefuse/i_remote_instance.hpp"
|
||||||
#include "events/event_system.hpp"
|
|
||||||
#include "types/remote.hpp"
|
#include "types/remote.hpp"
|
||||||
|
|
||||||
namespace repertory {
|
namespace repertory {
|
||||||
@@ -38,10 +37,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 +52,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;
|
||||||
|
|
||||||
@@ -63,25 +64,27 @@ public:
|
|||||||
&handle) override ;*/
|
&handle) override ;*/
|
||||||
|
|
||||||
[[nodiscard]] auto
|
[[nodiscard]] auto
|
||||||
fuse_fgetattr(const char *path, remote::stat &st, bool &directory,
|
fuse_fgetattr(const char *path, remote::stat &r_stat, bool &directory,
|
||||||
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 &r_stat,
|
||||||
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 +93,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 +111,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 +145,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 +163,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 +175,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 &r_stat)
|
||||||
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 &r_stat)
|
||||||
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;
|
||||||
|