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;
}