#ifndef COMPAT_DISK_H #define COMPAT_DISK_H #include "git-compat-util.h" static int get_disk_info(struct strbuf *out) { struct strbuf buf = STRBUF_INIT; int res = 0; #ifdef GIT_WINDOWS_NATIVE char volume_name[MAX_PATH], fs_name[MAX_PATH]; DWORD serial_number, component_length, flags; ULARGE_INTEGER avail2caller, total, avail; strbuf_realpath(&buf, ".", 1); if (!GetDiskFreeSpaceExA(buf.buf, &avail2caller, &total, &avail)) { error(_("could not determine free disk size for '%s'"), buf.buf); res = -1; goto cleanup; } strbuf_setlen(&buf, offset_1st_component(buf.buf)); if (!GetVolumeInformationA(buf.buf, volume_name, sizeof(volume_name), &serial_number, &component_length, &flags, fs_name, sizeof(fs_name))) { error(_("could not get info for '%s'"), buf.buf); res = -1; goto cleanup; } strbuf_addf(out, "Available space on '%s': ", buf.buf); strbuf_humanise_bytes(out, avail2caller.QuadPart); strbuf_addch(out, '\n'); #else struct statvfs stat; strbuf_realpath(&buf, ".", 1); if (statvfs(buf.buf, &stat) < 0) { error_errno(_("could not determine free disk size for '%s'"), buf.buf); res = -1; goto cleanup; } strbuf_addf(out, "Available space on '%s': ", buf.buf); strbuf_humanise_bytes(out, (off_t)stat.f_bsize * (off_t)stat.f_bavail); strbuf_addf(out, " (mount flags 0x%lx)\n", stat.f_flag); #endif cleanup: strbuf_release(&buf); return res; } #endif /* COMPAT_DISK_H */