int log_ring_file_read()

in Sources/aliyun-log-c-sdk/log_ring_file.c [146:213]


int log_ring_file_read(log_ring_file *file, uint64_t offset, void *buffer,
                       size_t buffer_size)
{
//    {
//        int openFlag = O_RDWR|O_CREAT;
//        if (file->syncWrite)
//        {
//            openFlag |= O_SYNC;
//        }
//        file->nowFD = open(file->filePath, openFlag, 0644);
//        if (file->nowFD < 0)
//        {
//            aos_error_log("open file failed %s, error %s", file->filePath, strerror(errno));
//            return -1;
//        }
//        if (offset != 0)
//        {
//            lseek(file->nowFD, offset, SEEK_SET);
//        }
//        int rst = read(file->nowFD, buffer, buffer_size);
//        close(file->nowFD);
//        file->nowFD = 0;
//        return rst;
//    }
    int32_t fileIndex = 0;
    int32_t fileOffset = 0;
    size_t nowOffset = 0;
    while (nowOffset < buffer_size)
    {
        get_ring_file_offset(file, offset + nowOffset, &fileIndex, &fileOffset);
        if (log_ring_file_open_fd(file, offset, fileIndex, fileOffset) != 0)
        {
            return -1;
        }
        int rst = 0;
        int readSize = buffer_size - nowOffset;
        if (readSize > file->maxFileSize - fileOffset)
        {
            readSize = file->maxFileSize - fileOffset;
        }
        if ((rst = read(file->nowFD, buffer + nowOffset, readSize)) != readSize)
        {
            if (errno == ENOENT)
            {
                return 0;
            }
            if (rst > 0)
            {
                file->nowOffset += rst;
                nowOffset += rst;
                continue;
            }
            if (rst == 0)
            {
                return file->nowOffset - offset;
            }
            aos_error_log("read buffer from file failed, file %s, offset %d, size %d, error %s",
                          file->filePath,
                          fileIndex + nowOffset,
                          file->maxFileSize - fileOffset,
                          strerror(errno));
            return -1;
        }
        nowOffset += file->maxFileSize - fileOffset;
        file->nowOffset += file->maxFileSize - fileOffset;
    }
    return buffer_size;
}