]>
Commit | Line | Data |
---|---|---|
435a2535 VD |
1 | #ifndef COMPAT_DISK_H |
2 | #define COMPAT_DISK_H | |
3 | ||
0b027f6c | 4 | #include "abspath.h" |
f394e093 | 5 | #include "gettext.h" |
435a2535 VD |
6 | |
7 | static int get_disk_info(struct strbuf *out) | |
8 | { | |
9 | struct strbuf buf = STRBUF_INIT; | |
10 | int res = 0; | |
11 | ||
12 | #ifdef GIT_WINDOWS_NATIVE | |
13 | char volume_name[MAX_PATH], fs_name[MAX_PATH]; | |
14 | DWORD serial_number, component_length, flags; | |
15 | ULARGE_INTEGER avail2caller, total, avail; | |
16 | ||
17 | strbuf_realpath(&buf, ".", 1); | |
18 | if (!GetDiskFreeSpaceExA(buf.buf, &avail2caller, &total, &avail)) { | |
19 | error(_("could not determine free disk size for '%s'"), | |
20 | buf.buf); | |
21 | res = -1; | |
22 | goto cleanup; | |
23 | } | |
24 | ||
25 | strbuf_setlen(&buf, offset_1st_component(buf.buf)); | |
26 | if (!GetVolumeInformationA(buf.buf, volume_name, sizeof(volume_name), | |
27 | &serial_number, &component_length, &flags, | |
28 | fs_name, sizeof(fs_name))) { | |
29 | error(_("could not get info for '%s'"), buf.buf); | |
30 | res = -1; | |
31 | goto cleanup; | |
32 | } | |
33 | strbuf_addf(out, "Available space on '%s': ", buf.buf); | |
34 | strbuf_humanise_bytes(out, avail2caller.QuadPart); | |
35 | strbuf_addch(out, '\n'); | |
36 | #else | |
37 | struct statvfs stat; | |
38 | ||
39 | strbuf_realpath(&buf, ".", 1); | |
40 | if (statvfs(buf.buf, &stat) < 0) { | |
41 | error_errno(_("could not determine free disk size for '%s'"), | |
42 | buf.buf); | |
43 | res = -1; | |
44 | goto cleanup; | |
45 | } | |
46 | ||
47 | strbuf_addf(out, "Available space on '%s': ", buf.buf); | |
48 | strbuf_humanise_bytes(out, (off_t)stat.f_bsize * (off_t)stat.f_bavail); | |
49 | strbuf_addf(out, " (mount flags 0x%lx)\n", stat.f_flag); | |
50 | #endif | |
51 | ||
52 | cleanup: | |
53 | strbuf_release(&buf); | |
54 | return res; | |
55 | } | |
56 | ||
57 | #endif /* COMPAT_DISK_H */ |