1 /* Copyright (c) 2003-2004, Roger Dingledine
2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
4 /* See LICENSE for licensing information */
5
6 /**
7 * \file freespace.c
8 *
9 * \brief Find the available disk space on the current volume.
10 **/
11
12 #include "lib/fs/files.h"
13 #include "lib/cc/torint.h"
14
15 #ifdef HAVE_SYS_STATVFS_H
16 #include <sys/statvfs.h>
17 #endif
18 #ifdef _WIN32
19 #include <windows.h>
20 #endif
21
22 #include <errno.h>
23 #include <string.h>
24
25 /** Return the amount of free disk space we have permission to use, in
26 * bytes. Return -1 if the amount of free space can't be determined. */
27 int64_t
tor_get_avail_disk_space(const char * path)28 tor_get_avail_disk_space(const char *path)
29 {
30 #ifdef HAVE_STATVFS
31 struct statvfs st;
32 int r;
33 memset(&st, 0, sizeof(st));
34
35 r = statvfs(path, &st);
36 if (r < 0)
37 return -1;
38
39 int64_t result = st.f_bavail;
40 if (st.f_frsize) {
41 result *= st.f_frsize;
42 } else if (st.f_bsize) {
43 result *= st.f_bsize;
44 } else {
45 return -1;
46 }
47
48 return result;
49 #elif defined(_WIN32)
50 ULARGE_INTEGER freeBytesAvail;
51 BOOL ok;
52
53 ok = GetDiskFreeSpaceEx(path, &freeBytesAvail, NULL, NULL);
54 if (!ok) {
55 return -1;
56 }
57 return (int64_t)freeBytesAvail.QuadPart;
58 #else
59 (void)path;
60 errno = ENOSYS;
61 return -1;
62 #endif /* defined(HAVE_STATVFS) || ... */
63 }
64