freespace.c (1309B)
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 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 }