mirror of
https://github.com/transmission/transmission.git
synced 2025-12-20 02:18:42 +00:00
refactor: rename tr_dirSpace() to tr_sys_path_capacity() (#5689)
This commit is contained in:
@@ -152,8 +152,7 @@
|
|||||||
A23F4FF20D1D98AD002FCB97 /* PrefsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A23F4FF00D1D98AD002FCB97 /* PrefsWindow.xib */; };
|
A23F4FF20D1D98AD002FCB97 /* PrefsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A23F4FF00D1D98AD002FCB97 /* PrefsWindow.xib */; };
|
||||||
A23F50020D1D99D7002FCB97 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = A23F50000D1D99D7002FCB97 /* MainMenu.xib */; };
|
A23F50020D1D99D7002FCB97 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = A23F50000D1D99D7002FCB97 /* MainMenu.xib */; };
|
||||||
A23F526F0F14395900AA02E3 /* PredicateEditorRowTemplateAny.mm in Sources */ = {isa = PBXBuildFile; fileRef = A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.mm */; };
|
A23F526F0F14395900AA02E3 /* PredicateEditorRowTemplateAny.mm in Sources */ = {isa = PBXBuildFile; fileRef = A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.mm */; };
|
||||||
A23FAE54178BC2950053DC5B /* platform-quota.cc in Sources */ = {isa = PBXBuildFile; fileRef = A23FAE52178BC2950053DC5B /* platform-quota.cc */; };
|
A23FAE54178BC2950053DC5B /* file-capacity.cc in Sources */ = {isa = PBXBuildFile; fileRef = A23FAE52178BC2950053DC5B /* file-capacity.cc */; };
|
||||||
A23FAE55178BC2950053DC5B /* platform-quota.h in Headers */ = {isa = PBXBuildFile; fileRef = A23FAE53178BC2950053DC5B /* platform-quota.h */; };
|
|
||||||
A242AD9315F05D23002B3A6C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A242AD9115F05D23002B3A6C /* Localizable.strings */; };
|
A242AD9315F05D23002B3A6C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A242AD9115F05D23002B3A6C /* Localizable.strings */; };
|
||||||
A2451E6916ACE4EB00586E0E /* FileRenameSheetController.mm in Sources */ = {isa = PBXBuildFile; fileRef = A2451E6716ACE4EB00586E0E /* FileRenameSheetController.mm */; };
|
A2451E6916ACE4EB00586E0E /* FileRenameSheetController.mm in Sources */ = {isa = PBXBuildFile; fileRef = A2451E6716ACE4EB00586E0E /* FileRenameSheetController.mm */; };
|
||||||
A2451E6A16ACE4EB00586E0E /* FileRenameSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */; };
|
A2451E6A16ACE4EB00586E0E /* FileRenameSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */; };
|
||||||
@@ -909,8 +908,7 @@
|
|||||||
A23F29A0132A447400E9A83B /* announcer-http.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = "announcer-http.cc"; sourceTree = "<group>"; };
|
A23F29A0132A447400E9A83B /* announcer-http.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = "announcer-http.cc"; sourceTree = "<group>"; };
|
||||||
A23F526D0F14395900AA02E3 /* PredicateEditorRowTemplateAny.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PredicateEditorRowTemplateAny.h; sourceTree = "<group>"; };
|
A23F526D0F14395900AA02E3 /* PredicateEditorRowTemplateAny.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PredicateEditorRowTemplateAny.h; sourceTree = "<group>"; };
|
||||||
A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PredicateEditorRowTemplateAny.mm; sourceTree = "<group>"; };
|
A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PredicateEditorRowTemplateAny.mm; sourceTree = "<group>"; };
|
||||||
A23FAE52178BC2950053DC5B /* platform-quota.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = "platform-quota.cc"; sourceTree = "<group>"; };
|
A23FAE52178BC2950053DC5B /* file-capacity.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = "file-capacity.cc"; sourceTree = "<group>"; };
|
||||||
A23FAE53178BC2950053DC5B /* platform-quota.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "platform-quota.h"; sourceTree = "<group>"; };
|
|
||||||
A242AD9215F05D23002B3A6C /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
A242AD9215F05D23002B3A6C /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
A2451E6616ACE4EB00586E0E /* FileRenameSheetController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileRenameSheetController.h; sourceTree = "<group>"; };
|
A2451E6616ACE4EB00586E0E /* FileRenameSheetController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileRenameSheetController.h; sourceTree = "<group>"; };
|
||||||
A2451E6716ACE4EB00586E0E /* FileRenameSheetController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FileRenameSheetController.mm; sourceTree = "<group>"; };
|
A2451E6716ACE4EB00586E0E /* FileRenameSheetController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FileRenameSheetController.mm; sourceTree = "<group>"; };
|
||||||
@@ -1762,8 +1760,7 @@
|
|||||||
4D36BA6B0CA2F00800A63CA5 /* peer-msgs.h */,
|
4D36BA6B0CA2F00800A63CA5 /* peer-msgs.h */,
|
||||||
C1425B381EE9C805001DB851 /* peer-socket.h */,
|
C1425B381EE9C805001DB851 /* peer-socket.h */,
|
||||||
C1425B381EE9C805001DB853 /* peer-socket.cc */,
|
C1425B381EE9C805001DB853 /* peer-socket.cc */,
|
||||||
A23FAE52178BC2950053DC5B /* platform-quota.cc */,
|
A23FAE52178BC2950053DC5B /* file-capacity.cc */,
|
||||||
A23FAE53178BC2950053DC5B /* platform-quota.h */,
|
|
||||||
BEFC1E030C07861A00B0BB3C /* platform.cc */,
|
BEFC1E030C07861A00B0BB3C /* platform.cc */,
|
||||||
BEFC1E020C07861A00B0BB3C /* platform.h */,
|
BEFC1E020C07861A00B0BB3C /* platform.h */,
|
||||||
BEFC1DFD0C07861A00B0BB3C /* port-forwarding.cc */,
|
BEFC1DFD0C07861A00B0BB3C /* port-forwarding.cc */,
|
||||||
@@ -2342,7 +2339,6 @@
|
|||||||
A25BFD6E167BED3B0039D1AA /* variant.h in Headers */,
|
A25BFD6E167BED3B0039D1AA /* variant.h in Headers */,
|
||||||
A2EA52321686AC0D00180493 /* quark.h in Headers */,
|
A2EA52321686AC0D00180493 /* quark.h in Headers */,
|
||||||
A2AF23C916B44FA0003BC59E /* log.h in Headers */,
|
A2AF23C916B44FA0003BC59E /* log.h in Headers */,
|
||||||
A23FAE55178BC2950053DC5B /* platform-quota.h in Headers */,
|
|
||||||
F11545ACA7C4D7A464F703AB /* block-info.h in Headers */,
|
F11545ACA7C4D7A464F703AB /* block-info.h in Headers */,
|
||||||
E23B55A5FC3B557F7746D510 /* interned-string.h in Headers */,
|
E23B55A5FC3B557F7746D510 /* interned-string.h in Headers */,
|
||||||
);
|
);
|
||||||
@@ -3131,7 +3127,7 @@
|
|||||||
A25BFD6D167BED3B0039D1AA /* variant.cc in Sources */,
|
A25BFD6D167BED3B0039D1AA /* variant.cc in Sources */,
|
||||||
A2EA52311686AC0D00180493 /* quark.cc in Sources */,
|
A2EA52311686AC0D00180493 /* quark.cc in Sources */,
|
||||||
A2AF23C816B44FA0003BC59E /* log.cc in Sources */,
|
A2AF23C816B44FA0003BC59E /* log.cc in Sources */,
|
||||||
A23FAE54178BC2950053DC5B /* platform-quota.cc in Sources */,
|
A23FAE54178BC2950053DC5B /* file-capacity.cc in Sources */,
|
||||||
62F644738FE3D8788EBF73A9 /* block-info.cc in Sources */,
|
62F644738FE3D8788EBF73A9 /* block-info.cc in Sources */,
|
||||||
E975121263DD973CAF4AEBA4 /* timer-ev.cc in Sources */,
|
E975121263DD973CAF4AEBA4 /* timer-ev.cc in Sources */,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
#include <libtransmission/utils.h>
|
#include <libtransmission/file.h>
|
||||||
|
|
||||||
#include <glibmm/i18n.h>
|
#include <glibmm/i18n.h>
|
||||||
#include <glibmm/main.h>
|
#include <glibmm/main.h>
|
||||||
@@ -50,8 +50,9 @@ bool FreeSpaceLabel::Impl::on_freespace_timer()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const bytes = tr_dirSpace(dir_).free;
|
auto const capacity = tr_sys_path_get_capacity(dir_);
|
||||||
auto const text = bytes < 0 ? _("Error") : fmt::format(_("{disk_space} free"), fmt::arg("disk_space", tr_strlsize(bytes)));
|
auto const text = capacity ? fmt::format(_("{disk_space} free"), fmt::arg("disk_space", tr_strlsize(capacity->free))) :
|
||||||
|
_("Error");
|
||||||
label_.set_markup(fmt::format(FMT_STRING("<i>{:s}</i>"), text));
|
label_.set_markup(fmt::format(FMT_STRING("<i>{:s}</i>"), text));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ target_sources(${TR_NAME}
|
|||||||
error.cc
|
error.cc
|
||||||
error.h
|
error.h
|
||||||
favicon-cache.h
|
favicon-cache.h
|
||||||
|
file-capacity.cc
|
||||||
file-piece-map.cc
|
file-piece-map.cc
|
||||||
file-piece-map.h
|
file-piece-map.h
|
||||||
file-posix.cc
|
file-posix.cc
|
||||||
@@ -91,8 +92,6 @@ target_sources(${TR_NAME}
|
|||||||
peer-msgs.h
|
peer-msgs.h
|
||||||
peer-socket.cc
|
peer-socket.cc
|
||||||
peer-socket.h
|
peer-socket.h
|
||||||
platform-quota.cc
|
|
||||||
platform-quota.h
|
|
||||||
platform.cc
|
platform.cc
|
||||||
platform.h
|
platform.h
|
||||||
port-forwarding-natpmp.cc
|
port-forwarding-natpmp.cc
|
||||||
|
|||||||
@@ -64,12 +64,20 @@
|
|||||||
|
|
||||||
#include "libtransmission/transmission.h"
|
#include "libtransmission/transmission.h"
|
||||||
|
|
||||||
|
#include "libtransmission/error.h"
|
||||||
|
#include "libtransmission/file.h"
|
||||||
#include "libtransmission/tr-macros.h"
|
#include "libtransmission/tr-macros.h"
|
||||||
#include "libtransmission/utils.h"
|
#include "libtransmission/utils.h"
|
||||||
#include "libtransmission/platform-quota.h"
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
struct tr_device_info
|
||||||
|
{
|
||||||
|
std::string path;
|
||||||
|
std::string device;
|
||||||
|
std::string fstype;
|
||||||
|
};
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
[[nodiscard]] char const* getdev(std::string_view path)
|
[[nodiscard]] char const* getdev(std::string_view path)
|
||||||
@@ -234,12 +242,12 @@ extern "C"
|
|||||||
#include <quota.h>
|
#include <quota.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] tr_disk_space getquota(char const* device)
|
[[nodiscard]] tr_sys_path_capacity getquota(char const* device)
|
||||||
{
|
{
|
||||||
struct quotahandle* qh;
|
struct quotahandle* qh;
|
||||||
struct quotakey qk;
|
struct quotakey qk;
|
||||||
struct quotaval qv;
|
struct quotaval qv;
|
||||||
struct tr_disk_space disk_space = { -1, -1 };
|
struct tr_sys_path_capacity disk_space = { -1, -1 };
|
||||||
|
|
||||||
qh = quota_open(device);
|
qh = quota_open(device);
|
||||||
|
|
||||||
@@ -284,14 +292,14 @@ extern "C"
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
[[nodiscard]] tr_disk_space getquota(char const* device)
|
[[nodiscard]] tr_sys_path_capacity getquota(char const* device)
|
||||||
{
|
{
|
||||||
#if defined(__DragonFly__)
|
#if defined(__DragonFly__)
|
||||||
struct ufs_dqblk dq = {};
|
struct ufs_dqblk dq = {};
|
||||||
#else
|
#else
|
||||||
struct dqblk dq = {};
|
struct dqblk dq = {};
|
||||||
#endif
|
#endif
|
||||||
struct tr_disk_space disk_space = { -1, -1 };
|
auto disk_space = tr_sys_path_capacity{ -1, -1 };
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
|
||||||
if (quotactl(device, QCMD(Q_GETQUOTA, USRQUOTA), getuid(), (caddr_t)&dq) != 0)
|
if (quotactl(device, QCMD(Q_GETQUOTA, USRQUOTA), getuid(), (caddr_t)&dq) != 0)
|
||||||
@@ -370,9 +378,9 @@ extern "C"
|
|||||||
|
|
||||||
#ifdef HAVE_XQM
|
#ifdef HAVE_XQM
|
||||||
|
|
||||||
[[nodiscard]] tr_disk_space getxfsquota(char const* device)
|
[[nodiscard]] tr_sys_path_capacity getxfsquota(char const* device)
|
||||||
{
|
{
|
||||||
struct tr_disk_space disk_space = { -1, -1 };
|
struct tr_sys_path_capacity disk_space = { -1, -1 };
|
||||||
struct fs_disk_quota dq;
|
struct fs_disk_quota dq;
|
||||||
|
|
||||||
if (quotactl(QCMD(Q_XGETQUOTA, USRQUOTA), device, getuid(), (caddr_t)&dq) == 0)
|
if (quotactl(QCMD(Q_XGETQUOTA, USRQUOTA), device, getuid(), (caddr_t)&dq) == 0)
|
||||||
@@ -409,9 +417,9 @@ extern "C"
|
|||||||
|
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
[[nodiscard]] tr_disk_space getQuotaSpace([[maybe_unused]] tr_device_info const& info)
|
[[nodiscard]] tr_sys_path_capacity get_quota_space([[maybe_unused]] tr_device_info const& info)
|
||||||
{
|
{
|
||||||
struct tr_disk_space ret = { -1, -1 };
|
struct tr_sys_path_capacity ret = { -1, -1 };
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
@@ -431,11 +439,11 @@ extern "C"
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] tr_disk_space getDiskSpace(char const* path)
|
[[nodiscard]] tr_sys_path_capacity getDiskSpace(char const* path)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
struct tr_disk_space ret = { -1, -1 };
|
struct tr_sys_path_capacity ret = { -1, -1 };
|
||||||
|
|
||||||
if (auto const wide_path = tr_win32_utf8_to_native(path); !std::empty(wide_path))
|
if (auto const wide_path = tr_win32_utf8_to_native(path); !std::empty(wide_path))
|
||||||
{
|
{
|
||||||
@@ -454,9 +462,9 @@ extern "C"
|
|||||||
#elif defined(HAVE_STATVFS)
|
#elif defined(HAVE_STATVFS)
|
||||||
|
|
||||||
struct statvfs buf = {};
|
struct statvfs buf = {};
|
||||||
return statvfs(path, &buf) != 0 ?
|
return statvfs(path, &buf) != 0 ? (struct tr_sys_path_capacity){ -1, -1 } :
|
||||||
(struct tr_disk_space){ -1, -1 } :
|
(struct tr_sys_path_capacity){ (int64_t)buf.f_bavail * (int64_t)buf.f_frsize,
|
||||||
(struct tr_disk_space){ (int64_t)buf.f_bavail * (int64_t)buf.f_frsize, (int64_t)buf.f_blocks * (int64_t)buf.f_frsize };
|
(int64_t)buf.f_blocks * (int64_t)buf.f_frsize };
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -467,8 +475,6 @@ extern "C"
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
tr_device_info tr_device_info_create(std::string_view path)
|
tr_device_info tr_device_info_create(std::string_view path)
|
||||||
{
|
{
|
||||||
auto out = tr_device_info{};
|
auto out = tr_device_info{};
|
||||||
@@ -481,7 +487,7 @@ tr_device_info tr_device_info_create(std::string_view path)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_disk_space tr_device_info_get_disk_space(struct tr_device_info const& info)
|
tr_sys_path_capacity tr_device_info_get_disk_space(struct tr_device_info const& info)
|
||||||
{
|
{
|
||||||
if (std::empty(info.path))
|
if (std::empty(info.path))
|
||||||
{
|
{
|
||||||
@@ -489,7 +495,7 @@ tr_disk_space tr_device_info_get_disk_space(struct tr_device_info const& info)
|
|||||||
return { -1, -1 };
|
return { -1, -1 };
|
||||||
}
|
}
|
||||||
|
|
||||||
auto space = getQuotaSpace(info);
|
auto space = get_quota_space(info);
|
||||||
|
|
||||||
if (space.free < 0 || space.total < 0)
|
if (space.free < 0 || space.total < 0)
|
||||||
{
|
{
|
||||||
@@ -498,3 +504,31 @@ tr_disk_space tr_device_info_get_disk_space(struct tr_device_info const& info)
|
|||||||
|
|
||||||
return space;
|
return space;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
std::optional<tr_sys_path_capacity> tr_sys_path_get_capacity(std::string_view path, tr_error** error)
|
||||||
|
{
|
||||||
|
auto const info = tr_sys_path_get_info(path, 0, error);
|
||||||
|
if (!info)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!info->isFolder())
|
||||||
|
{
|
||||||
|
tr_error_set_from_errno(error, ENOTDIR);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const device = tr_device_info_create(path);
|
||||||
|
auto capacity = tr_device_info_get_disk_space(device);
|
||||||
|
|
||||||
|
if (capacity.free < 0 || capacity.total < 0)
|
||||||
|
{
|
||||||
|
tr_error_set_from_errno(error, EINVAL);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return capacity;
|
||||||
|
}
|
||||||
@@ -118,6 +118,12 @@ struct tr_sys_path_info
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct tr_sys_path_capacity
|
||||||
|
{
|
||||||
|
int64_t free = -1;
|
||||||
|
int64_t total = -1;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Platform-specific wrapper functions
|
* @name Platform-specific wrapper functions
|
||||||
*
|
*
|
||||||
@@ -160,6 +166,15 @@ bool tr_sys_path_copy(char const* src_path, char const* dst_path, struct tr_erro
|
|||||||
int flags = 0,
|
int flags = 0,
|
||||||
tr_error** error = nullptr);
|
tr_error** error = nullptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get disk capacity and free disk space (in bytes) for the specified folder.
|
||||||
|
*
|
||||||
|
* @param[in] path Path to directory.
|
||||||
|
* @param[out] error Pointer to error object. Optional, pass `nullptr` if you
|
||||||
|
* are not interested in error details.
|
||||||
|
*/
|
||||||
|
[[nodiscard]] std::optional<tr_sys_path_capacity> tr_sys_path_get_capacity(std::string_view path, tr_error** error = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Portability wrapper for `access()`.
|
* @brief Portability wrapper for `access()`.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
// This file Copyright © 2013-2023 Mnemosyne LLC.
|
|
||||||
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
|
||||||
// or any future license endorsed by Mnemosyne LLC.
|
|
||||||
// License text can be found in the licenses/ folder.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstdint> // int64_t
|
|
||||||
#include <string>
|
|
||||||
#include <string_view>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup tr_session Session
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct tr_device_info
|
|
||||||
{
|
|
||||||
std::string path;
|
|
||||||
std::string device;
|
|
||||||
std::string fstype;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tr_disk_space
|
|
||||||
{
|
|
||||||
int64_t free;
|
|
||||||
int64_t total;
|
|
||||||
};
|
|
||||||
|
|
||||||
tr_device_info tr_device_info_create(std::string_view path);
|
|
||||||
|
|
||||||
/** Values represents the total space on disk.
|
|
||||||
If the disk quota (free space) is enabled and readable, this returns how much is available in the quota.
|
|
||||||
Otherwise, it returns how much is available on the disk, or { -1, -1 } on error. */
|
|
||||||
tr_disk_space tr_device_info_get_disk_space(tr_device_info const& info);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
@@ -2181,7 +2181,14 @@ void addSessionField(tr_session const* s, tr_variant* d, tr_quark key)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_download_dir_free_space:
|
case TR_KEY_download_dir_free_space:
|
||||||
tr_variantDictAddInt(d, key, tr_dirSpace(s->downloadDir()).free);
|
if (auto const capacity = tr_sys_path_get_capacity(s->downloadDir()); capacity)
|
||||||
|
{
|
||||||
|
tr_variantDictAddInt(d, key, capacity->free);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tr_variantDictAddInt(d, key, -1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_download_queue_enabled:
|
case TR_KEY_download_queue_enabled:
|
||||||
@@ -2409,15 +2416,16 @@ char const* freeSpace(tr_session* /*session*/, tr_variant* args_in, tr_variant*
|
|||||||
|
|
||||||
/* get the free space */
|
/* get the free space */
|
||||||
auto const old_errno = errno;
|
auto const old_errno = errno;
|
||||||
errno = 0;
|
tr_error* error = nullptr;
|
||||||
auto const dir_space = tr_dirSpace(path);
|
auto const capacity = tr_sys_path_get_capacity(path, &error);
|
||||||
char const* const err = dir_space.free < 0 || dir_space.total < 0 ? tr_strerror(errno) : nullptr;
|
char const* const err = error != nullptr ? tr_strerror(error->code) : nullptr;
|
||||||
|
tr_error_clear(&error);
|
||||||
errno = old_errno;
|
errno = old_errno;
|
||||||
|
|
||||||
/* response */
|
/* response */
|
||||||
tr_variantDictAddStr(args_out, TR_KEY_path, path);
|
tr_variantDictAddStr(args_out, TR_KEY_path, path);
|
||||||
tr_variantDictAddInt(args_out, TR_KEY_size_bytes, dir_space.free);
|
tr_variantDictAddInt(args_out, TR_KEY_size_bytes, capacity ? capacity->free : -1);
|
||||||
tr_variantDictAddInt(args_out, TR_KEY_total_size, dir_space.total);
|
tr_variantDictAddInt(args_out, TR_KEY_total_size, capacity ? capacity->total : -1);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,6 @@
|
|||||||
#include "libtransmission/log.h"
|
#include "libtransmission/log.h"
|
||||||
#include "libtransmission/mime-types.h"
|
#include "libtransmission/mime-types.h"
|
||||||
#include "libtransmission/net.h" // ntohl()
|
#include "libtransmission/net.h" // ntohl()
|
||||||
#include "libtransmission/platform-quota.h" /* tr_device_info_create(), tr_device_info_get_disk_space(), tr_device_info_free() */
|
|
||||||
#include "libtransmission/tr-assert.h"
|
#include "libtransmission/tr-assert.h"
|
||||||
#include "libtransmission/tr-strbuf.h"
|
#include "libtransmission/tr-strbuf.h"
|
||||||
#include "libtransmission/utils.h"
|
#include "libtransmission/utils.h"
|
||||||
@@ -175,17 +174,6 @@ bool tr_saveFile(std::string_view filename, std::string_view contents, tr_error*
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_disk_space tr_dirSpace(std::string_view directory)
|
|
||||||
{
|
|
||||||
if (std::empty(directory))
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return { -1, -1 };
|
|
||||||
}
|
|
||||||
|
|
||||||
return tr_device_info_get_disk_space(tr_device_info_create(directory));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
size_t tr_strvToBuf(std::string_view src, char* buf, size_t buflen)
|
size_t tr_strvToBuf(std::string_view src, char* buf, size_t buflen)
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "platform-quota.h"
|
|
||||||
#include "tr-macros.h"
|
#include "tr-macros.h"
|
||||||
|
|
||||||
struct tr_error;
|
struct tr_error;
|
||||||
@@ -76,12 +75,6 @@ constexpr auto tr_saveFile(std::string_view filename, ContiguousRange const& x,
|
|||||||
return tr_saveFile(filename, std::string_view{ std::data(x), std::size(x) }, error);
|
return tr_saveFile(filename, std::string_view{ std::data(x), std::size(x) }, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get disk capacity and free disk space (in bytes) for the specified folder.
|
|
||||||
* @return struct with free and total as zero or positive integer on success, -1 in case of error.
|
|
||||||
*/
|
|
||||||
[[nodiscard]] tr_disk_space tr_dirSpace(std::string_view directory);
|
|
||||||
|
|
||||||
/** @brief return the current date in milliseconds */
|
/** @brief return the current date in milliseconds */
|
||||||
[[nodiscard]] uint64_t tr_time_msec();
|
[[nodiscard]] uint64_t tr_time_msec();
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static uint32_t parseConnectionRequest(std::vector<char> data)
|
[[nodiscard]] static uint32_t parseConnectionRequest(std::vector<char> const& data)
|
||||||
{
|
{
|
||||||
auto buf = MessageBuffer(data);
|
auto buf = MessageBuffer(data);
|
||||||
EXPECT_EQ(ProtocolId, buf.to_uint64());
|
EXPECT_EQ(ProtocolId, buf.to_uint64());
|
||||||
@@ -150,7 +150,7 @@ protected:
|
|||||||
return std::make_pair(buildScrapeRequestFromResponse(response), response);
|
return std::make_pair(buildScrapeRequestFromResponse(response), response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static auto parseScrapeRequest(std::vector<char> data, uint64_t expected_connection_id)
|
[[nodiscard]] static auto parseScrapeRequest(std::vector<char> const& data, uint64_t expected_connection_id)
|
||||||
{
|
{
|
||||||
auto buf = MessageBuffer(data);
|
auto buf = MessageBuffer(data);
|
||||||
EXPECT_EQ(expected_connection_id, buf.to_uint64());
|
EXPECT_EQ(expected_connection_id, buf.to_uint64());
|
||||||
@@ -254,7 +254,7 @@ protected:
|
|||||||
EXPECT_EQ(actual.external_ip, expected.external_ip);
|
EXPECT_EQ(actual.external_ip, expected.external_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static auto parseAnnounceRequest(std::vector<char> data, uint64_t connection_id)
|
[[nodiscard]] static auto parseAnnounceRequest(std::vector<char> const& data, uint64_t connection_id)
|
||||||
{
|
{
|
||||||
auto buf = MessageBuffer{ data };
|
auto buf = MessageBuffer{ data };
|
||||||
auto req = UdpAnnounceReq{};
|
auto req = UdpAnnounceReq{};
|
||||||
|
|||||||
Reference in New Issue
Block a user