int log_ring_file_write_single()

in Sources/aliyun-log-c-sdk/log_ring_file.c [71:129]


int log_ring_file_write_single(log_ring_file *file, uint64_t offset,
                               const 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 = write(file->nowFD, (char *)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 writeSize = buffer_size - nowOffset;
        if (file->maxFileSize - fileOffset <= writeSize)
        {
            writeSize = file->maxFileSize - fileOffset;
        }

        int rst = write(file->nowFD, (char *)buffer + nowOffset, writeSize);
        if (rst != writeSize)
        {
            aos_error_log("write buffer to file failed, file %s, offset %d, size %d, error %s",
                          file->filePath,
                          fileIndex + nowOffset,
                          file->maxFileSize - fileOffset,
                          strerror(errno));
            return -1;
        }
        nowOffset += rst;
        file->nowOffset += rst;
    }
    return buffer_size;
}