Move tor_get_avail_disk_space() to lib/fs

This commit is contained in:
Nick Mathewson 2018-06-29 09:34:37 -04:00
parent f0319fcbde
commit 973afcc40b
3 changed files with 57 additions and 40 deletions

View File

@ -547,43 +547,3 @@ tor_getpass(const char *prompt, char *output, size_t buflen)
#error "No implementation for tor_getpass found!" #error "No implementation for tor_getpass found!"
#endif /* defined(HAVE_READPASSPHRASE) || ... */ #endif /* defined(HAVE_READPASSPHRASE) || ... */
} }
/** Return the amount of free disk space we have permission to use, in
* bytes. Return -1 if the amount of free space can't be determined. */
int64_t
tor_get_avail_disk_space(const char *path)
{
#ifdef HAVE_STATVFS
struct statvfs st;
int r;
memset(&st, 0, sizeof(st));
r = statvfs(path, &st);
if (r < 0)
return -1;
int64_t result = st.f_bavail;
if (st.f_frsize) {
result *= st.f_frsize;
} else if (st.f_bsize) {
result *= st.f_bsize;
} else {
return -1;
}
return result;
#elif defined(_WIN32)
ULARGE_INTEGER freeBytesAvail;
BOOL ok;
ok = GetDiskFreeSpaceEx(path, &freeBytesAvail, NULL, NULL);
if (!ok) {
return -1;
}
return (int64_t)freeBytesAvail.QuadPart;
#else
(void)path;
errno = ENOSYS;
return -1;
#endif /* defined(HAVE_STATVFS) || ... */
}

56
src/lib/fs/freespace.c Normal file
View File

@ -0,0 +1,56 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
* Copyright (c) 2007-2018, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "lib/fs/files.h"
#include "lib/cc/torint.h"
#ifdef HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
#endif
#ifdef _WIN32
#include <windows.h>
#endif
#include <string.h>
/** Return the amount of free disk space we have permission to use, in
* bytes. Return -1 if the amount of free space can't be determined. */
int64_t
tor_get_avail_disk_space(const char *path)
{
#ifdef HAVE_STATVFS
struct statvfs st;
int r;
memset(&st, 0, sizeof(st));
r = statvfs(path, &st);
if (r < 0)
return -1;
int64_t result = st.f_bavail;
if (st.f_frsize) {
result *= st.f_frsize;
} else if (st.f_bsize) {
result *= st.f_bsize;
} else {
return -1;
}
return result;
#elif defined(_WIN32)
ULARGE_INTEGER freeBytesAvail;
BOOL ok;
ok = GetDiskFreeSpaceEx(path, &freeBytesAvail, NULL, NULL);
if (!ok) {
return -1;
}
return (int64_t)freeBytesAvail.QuadPart;
#else
(void)path;
errno = ENOSYS;
return -1;
#endif /* defined(HAVE_STATVFS) || ... */
}

View File

@ -9,6 +9,7 @@ src_lib_libtor_fs_a_SOURCES = \
src/lib/fs/conffile.c \ src/lib/fs/conffile.c \
src/lib/fs/dir.c \ src/lib/fs/dir.c \
src/lib/fs/files.c \ src/lib/fs/files.c \
src/lib/fs/freespace.c \
src/lib/fs/lockfile.c \ src/lib/fs/lockfile.c \
src/lib/fs/mmap.c \ src/lib/fs/mmap.c \
src/lib/fs/path.c \ src/lib/fs/path.c \