1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-24 15:04:20 +00:00
srs/trunk/src/kernel/srs_kernel_file.cpp

287 lines
6.5 KiB
C++
Raw Normal View History

2017-03-25 09:21:39 +00:00
/**
* The MIT License (MIT)
*
2019-01-01 13:37:28 +00:00
* Copyright (c) 2013-2019 Winlin
2017-03-25 09:21:39 +00:00
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <srs_kernel_file.hpp>
2015-11-11 02:37:50 +00:00
// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213
#ifndef _WIN32
#include <unistd.h>
#include <sys/uio.h>
#endif
#include <fcntl.h>
#include <sstream>
using namespace std;
#include <srs_kernel_log.hpp>
#include <srs_kernel_error.hpp>
2019-05-13 00:48:53 +00:00
// For utest to mock it.
_srs_open_t _srs_open_fn = ::open;
_srs_write_t _srs_write_fn = ::write;
_srs_read_t _srs_read_fn = ::read;
2019-05-13 00:48:53 +00:00
_srs_lseek_t _srs_lseek_fn = ::lseek;
SrsFileWriter::SrsFileWriter()
{
fd = -1;
}
SrsFileWriter::~SrsFileWriter()
{
close();
}
srs_error_t SrsFileWriter::open(string p)
{
srs_error_t err = srs_success;
if (fd > 0) {
return srs_error_new(ERROR_SYSTEM_FILE_ALREADY_OPENED, "file %s already opened", p.c_str());
}
int flags = O_CREAT|O_WRONLY|O_TRUNC;
mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH;
2017-03-25 09:21:39 +00:00
2019-05-13 00:48:53 +00:00
if ((fd = _srs_open_fn(p.c_str(), flags, mode)) < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_OPENE, "open file %s failed", p.c_str());
}
2015-07-28 09:56:50 +00:00
path = p;
return err;
}
srs_error_t SrsFileWriter::open_append(string p)
{
srs_error_t err = srs_success;
if (fd > 0) {
return srs_error_new(ERROR_SYSTEM_FILE_ALREADY_OPENED, "file %s already opened", path.c_str());
}
int flags = O_APPEND|O_WRONLY;
mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH;
2017-03-25 09:21:39 +00:00
2019-05-13 00:49:38 +00:00
if ((fd = _srs_open_fn(p.c_str(), flags, mode)) < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_OPENE, "open file %s failed", p.c_str());
}
2015-07-28 09:56:50 +00:00
path = p;
return err;
}
void SrsFileWriter::close()
{
if (fd < 0) {
return;
}
if (::close(fd) < 0) {
srs_warn("close file %s failed", path.c_str());
}
fd = -1;
return;
}
bool SrsFileWriter::is_open()
{
return fd > 0;
}
void SrsFileWriter::seek2(int64_t offset)
{
2019-05-13 00:48:53 +00:00
off_t r0 = _srs_lseek_fn(fd, (off_t)offset, SEEK_SET);
2017-06-13 08:10:46 +00:00
srs_assert(r0 != -1);
}
int64_t SrsFileWriter::tellg()
{
2019-05-13 00:48:53 +00:00
return (int64_t)_srs_lseek_fn(fd, 0, SEEK_CUR);
}
srs_error_t SrsFileWriter::write(void* buf, size_t count, ssize_t* pnwrite)
{
srs_error_t err = srs_success;
ssize_t nwrite;
// TODO: FIXME: use st_write.
2019-05-13 00:48:53 +00:00
if ((nwrite = _srs_write_fn(fd, buf, count)) < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_WRITE, "write to file %s failed", path.c_str());
}
if (pnwrite != NULL) {
*pnwrite = nwrite;
}
return err;
}
srs_error_t SrsFileWriter::writev(const iovec* iov, int iovcnt, ssize_t* pnwrite)
{
srs_error_t err = srs_success;
ssize_t nwrite = 0;
for (int i = 0; i < iovcnt; i++) {
const iovec* piov = iov + i;
ssize_t this_nwrite = 0;
if ((err = write(piov->iov_base, piov->iov_len, &this_nwrite)) != srs_success) {
return srs_error_wrap(err, "write file");
}
nwrite += this_nwrite;
}
if (pnwrite) {
*pnwrite = nwrite;
}
return err;
}
srs_error_t SrsFileWriter::lseek(off_t offset, int whence, off_t* seeked)
{
2019-05-13 00:48:53 +00:00
off_t sk = _srs_lseek_fn(fd, offset, whence);
if (sk < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_SEEK, "seek file");
}
if (seeked) {
*seeked = sk;
}
return srs_success;
}
SrsFileReader::SrsFileReader()
{
fd = -1;
}
SrsFileReader::~SrsFileReader()
{
close();
}
srs_error_t SrsFileReader::open(string p)
{
srs_error_t err = srs_success;
if (fd > 0) {
return srs_error_new(ERROR_SYSTEM_FILE_ALREADY_OPENED, "file %s already opened", path.c_str());
}
2017-03-25 09:21:39 +00:00
if ((fd = _srs_open_fn(p.c_str(), O_RDONLY)) < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_OPENE, "open file %s failed", p.c_str());
}
2015-07-28 09:56:50 +00:00
path = p;
return err;
}
void SrsFileReader::close()
{
int ret = ERROR_SUCCESS;
if (fd < 0) {
return;
}
if (::close(fd) < 0) {
srs_warn("close file %s failed. ret=%d", path.c_str(), ret);
}
fd = -1;
return;
}
bool SrsFileReader::is_open()
{
return fd > 0;
}
int64_t SrsFileReader::tellg()
{
return (int64_t)_srs_lseek_fn(fd, 0, SEEK_CUR);
}
void SrsFileReader::skip(int64_t size)
{
off_t r0 = _srs_lseek_fn(fd, (off_t)size, SEEK_CUR);
2017-06-13 08:10:46 +00:00
srs_assert(r0 != -1);
}
int64_t SrsFileReader::seek2(int64_t offset)
{
return (int64_t)_srs_lseek_fn(fd, (off_t)offset, SEEK_SET);
}
int64_t SrsFileReader::filesize()
{
int64_t cur = tellg();
int64_t size = (int64_t)_srs_lseek_fn(fd, 0, SEEK_END);
2017-06-13 08:10:46 +00:00
off_t r0 = _srs_lseek_fn(fd, (off_t)cur, SEEK_SET);
2017-06-13 08:10:46 +00:00
srs_assert(r0 != -1);
return size;
}
srs_error_t SrsFileReader::read(void* buf, size_t count, ssize_t* pnread)
{
srs_error_t err = srs_success;
ssize_t nread;
// TODO: FIXME: use st_read.
if ((nread = _srs_read_fn(fd, buf, count)) < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_READ, "read from file %s failed", path.c_str());
}
if (nread == 0) {
return srs_error_new(ERROR_SYSTEM_FILE_EOF, "file EOF");
}
if (pnread != NULL) {
*pnread = nread;
}
return err;
}
2014-08-02 14:18:39 +00:00
srs_error_t SrsFileReader::lseek(off_t offset, int whence, off_t* seeked)
{
off_t sk = _srs_lseek_fn(fd, offset, whence);
if (sk < 0) {
return srs_error_new(ERROR_SYSTEM_FILE_SEEK, "seek %v failed", (int)sk);
}
if (seeked) {
*seeked = sk;
}
return srs_success;
}