Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
David Goulet
Tor
Commits
50049df0
Commit
50049df0
authored
Aug 05, 2015
by
Nick Mathewson
👁
Browse files
Add a compat function to check how much disk space is free.
Closes ticket 16734.
parent
9338847b
Changes
4
Hide whitespace changes
Inline
Side-by-side
configure.ac
View file @
50049df0
...
...
@@ -406,6 +406,7 @@ AC_CHECK_FUNCS(
rint \
sigaction \
socketpair \
statvfs \
strlcat \
strlcpy \
strnlen \
...
...
@@ -916,6 +917,7 @@ AC_CHECK_HEADERS(
sys/resource.h \
sys/select.h \
sys/socket.h \
sys/statvfs.h \
sys/sysctl.h \
sys/syslimits.h \
sys/time.h \
...
...
src/common/compat.c
View file @
50049df0
...
...
@@ -68,6 +68,9 @@
#ifdef HAVE_CRT_EXTERNS_H
#include
<crt_externs.h>
#endif
#ifdef HAVE_SYS_STATVFS_H
#include
<sys/statvfs.h>
#endif
#ifdef _WIN32
#include
<conio.h>
...
...
@@ -3374,3 +3377,42 @@ tor_getpass(const char *prompt, char *output, size_t buflen)
#endif
}
/** 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
;
#else
(
void
)
path
;
errno
=
ENOSYS
;
return
-
1
;
#endif
}
src/common/compat.h
View file @
50049df0
...
...
@@ -405,6 +405,8 @@ int tor_fd_setpos(int fd, off_t pos);
int
tor_fd_seekend
(
int
fd
);
int
tor_ftruncate
(
int
fd
);
int64_t
tor_get_avail_disk_space
(
const
char
*
path
);
#ifdef _WIN32
#define PATH_SEPARATOR "\\"
#else
...
...
src/test/test_util.c
View file @
50049df0
...
...
@@ -4347,6 +4347,30 @@ test_util_writepid(void *arg)
tor_free
(
contents
);
}
static
void
test_util_get_avail_disk_space
(
void
*
arg
)
{
(
void
)
arg
;
int64_t
val
;
/* No answer for nonexistent directory */
val
=
tor_get_avail_disk_space
(
"/akljasdfklsajdklasjkldjsa"
);
tt_int_op
(
val
,
OP_EQ
,
-
1
);
/* Try the current directory */
val
=
tor_get_avail_disk_space
(
"."
);
#if !defined(HAVE_STATVFS) && !defined(_WIN32)
tt_i64_op
(
val
,
OP_EQ
,
-
1
);
/* You don't have an implementation for this */
#else
tt_i64_op
(
val
,
OP_GT
,
0
);
/* You have some space. */
tt_i64_op
(
val
,
OP_LT
,
((
int64_t
)
1
)
<<
56
);
/* You don't have a zebibyte */
#endif
done:
;
}
struct
testcase_t
util_tests
[]
=
{
UTIL_LEGACY
(
time
),
UTIL_TEST
(
parse_http_time
,
0
),
...
...
@@ -4414,6 +4438,7 @@ struct testcase_t util_tests[] = {
UTIL_TEST
(
hostname_validation
,
0
),
UTIL_TEST
(
ipv4_validation
,
0
),
UTIL_TEST
(
writepid
,
0
),
UTIL_TEST
(
get_avail_disk_space
,
0
),
END_OF_TESTCASES
};
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment