43cade60创建于 2022年2月24日历史提交
/*
 * Copyright (c) 2022 Huawei Technologies Co.,Ltd.
 *
 * openGauss is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 *
 * util_stat.c
 *    util statistics
 *
 * IDENTIFICATION
 *    src/utils/util_stat.c
 *
 * -------------------------------------------------------------------------
 */
#include "cm_log.h"
#include "util_stat.h"
#ifndef WIN32
#include <sys/statfs.h>
#endif

#define CM_MB_2_B_SHIFT_BITS 20

#ifndef WIN32
status_t cm_get_disk_size(const char *path, disk_size_type_e disk_type, uint64 *size)
{
    uint64 f_mbsize = 0;
    struct statfs disk_inf;
    if (statfs(path, &disk_inf) == CM_ERROR) {
        LOG_DEBUG_ERR("cm_get_disk_f_mbsize statfs failed.");
        return CM_ERROR;
    }
    switch (disk_type) {
        case TOTAL_SIZE:
            f_mbsize = (disk_inf.f_bsize * disk_inf.f_blocks) >> CM_MB_2_B_SHIFT_BITS;
            break;
        case AVAIL_SIZE:
            f_mbsize = (disk_inf.f_bsize * disk_inf.f_bavail) >> CM_MB_2_B_SHIFT_BITS;
            break;
        default:
            break;
    }
    *size = f_mbsize;
    return CM_SUCCESS;
}
#else
status_t cm_get_disk_size(const char *path, disk_size_type_e disk_type, uint64 *size)
{
    uint64 f_mbsize = 0;
    uint64 avail, total, free;
    if (!GetDiskFreeSpaceEx(path, (ULARGE_INTEGER*)&avail, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {
        LOG_DEBUG_ERR("cm_get_disk_f_mbsize GetDiskFreeSpaceEx failed.");
        return CM_ERROR;
    }
    switch (disk_type) {
        case TOTAL_SIZE:
            f_mbsize = total >> CM_MB_2_B_SHIFT_BITS;
            break;
        case AVAIL_SIZE:
            f_mbsize = avail >> CM_MB_2_B_SHIFT_BITS;
            break;
        default:
            break;
    }
    *size = f_mbsize;
    return CM_SUCCESS;
}
#endif