コード例 #1
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
int socket_input_stream::unsafe_read()
{
    if (pos_ < mark_) {
        return buffer_[pos_++];
    }

    int r = blocking_ ?
            recv(file_descriptor(), buffer_, STREAM_BUFFER_SIZE, 0) :
            recv(file_descriptor(), buffer_, STREAM_BUFFER_SIZE, MSG_DONTWAIT);
    if (r < 0) {
        switch (errno) {
        case EAGAIN:
            return EOF;
        case EINTR:
            return stream_result::INTERRUPTED;
        default:
            throw std::runtime_error(strerror(errno));
        }
    }
    else if (r == 0) {
        return EOF;
    }
    else {
        mark_ = r;
        pos_ = 0;
        return buffer_[pos_++];
    }
}
コード例 #2
0
void FileBase::removexattr(const char* name)
{
#ifdef __APPLE__
    auto rc = ::fremovexattr(file_descriptor(), name, 0);
#else
    auto rc = ::fremovexattr(file_descriptor(), name);
#endif
    if (rc < 0)
        throw OSException(errno);
}
コード例 #3
0
ssize_t FileBase::listxattr(char* buffer, size_t size)
{
#ifdef __APPLE__
    auto rc = ::flistxattr(file_descriptor(), buffer, size, 0);
#else
    auto rc = ::flistxattr(file_descriptor(), buffer, size);
#endif
    if (rc < 0)
        throw OSException(errno);
    return rc;
}
コード例 #4
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
int socket_input_stream::read()
{
    if (file_descriptor() == -1) {
        return stream_result::INVALID_HANDLE;
    }
    return unsafe_read();
}
コード例 #5
0
ファイル: rshd.cpp プロジェクト: arthur-samarin/os
 tcp_socket accept(int flags) {
     int sock_fd = accept4(fd.getfd(), nullptr, nullptr, flags);
     if(sock_fd == -1) {
         throw errno_exception("acceptor::accept");
     }
     return tcp_socket(file_descriptor(sock_fd));
 }
コード例 #6
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
int socket_output_stream::write(char c)
{
    if (file_descriptor() == -1) {
        return stream_result::INVALID_HANDLE;
    }
    return unsafe_write(c);
}
コード例 #7
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
int socket_output_stream::write_string(const char *str, size_t max_len, size_t *written)
{
    if (file_descriptor() == -1) {
        if (written) {
            *written = 0;
        }
        return stream_result::INVALID_HANDLE;
    }
    if (max_len == 0) {
        max_len = std::numeric_limits<size_t>::max();
    }
    for (size_t i = 0; max_len == 0 || i < max_len; i++) {
        char c = str[i];
        if (c == 0) {
            if (written) {
                *written = i;
            }
            return i;
        }
        int w = unsafe_write(c);
        if (w < 0) {
            if (written) {
                *written = i;
            }
            return w;
        }
    }
    return stream_result::DATA_TRUNCATED;
}
コード例 #8
0
void JarFileParser::dispose() const {
  FileDescriptor::Raw desc = file_descriptor();
  desc().dispose();
#ifdef AZZERT
  BufferedFile::Raw bf = buffered_file();
  bf().junk_file_pointer();
#endif
}
コード例 #9
0
ファイル: rshd.cpp プロジェクト: arthur-samarin/os
 file_descriptor openSlave() const {
     char *name = ptsname(master_fd.getfd());
     if (name) {
         return file_descriptor(::open(name, O_RDWR));
     } else {
         throw errno_exception("pseudoterminal::openSlave, ptsname");
     }
 }
コード例 #10
0
	locked_pid_file::locked_pid_file(const boost::filesystem::path& path) :
		pid_file(path)
	{
		if (::flock(file_descriptor(), LOCK_EX) != 0)
		{
			throw boost::system::system_error(errno, boost::system::system_category(), "Locking on the PID file");
		}
	}
コード例 #11
0
ssize_t FileBase::getxattr(const char* name, char* value, size_t size)
{
    if (!name)
        throw OSException(EFAULT);

    auto true_size = fgetxattr_wrapper(file_descriptor(), name, value, size);
    if (true_size < 0)
        throw OSException(errno);
    if (!value)
        return true_size;

    byte meta[XATTR_IV_LENGTH + XATTR_MAC_LENGTH];
    auto true_meta_size = fgetxattr_wrapper(m_meta_fd, name, meta, sizeof(meta));
    if (true_meta_size < 0)
    {
        if (errno == ERANGE)
            errno = EIO;
        throw OSException(errno);
    }

    auto name_len = strlen(name);
    std::unique_ptr<byte[]> header(new byte[name_len + ID_LENGTH]);
    memcpy(header.get(), get_id().data(), ID_LENGTH);
    memcpy(header.get() + ID_LENGTH, name, name_len);

    byte* iv = meta;
    byte* mac = meta + XATTR_IV_LENGTH;
    byte* ciphertext = reinterpret_cast<byte*>(value);

    bool success = aes_gcm_decrypt(ciphertext,
                                   true_size,
                                   header.get(),
                                   name_len + ID_LENGTH,
                                   get_key().data(),
                                   get_key().size(),
                                   iv,
                                   XATTR_IV_LENGTH,
                                   mac,
                                   XATTR_MAC_LENGTH,
                                   value);
    if (m_check && !success)
        throw XattrVerificationException(get_id(), name);
    return true_size;
}
コード例 #12
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
int socket_output_stream::unsafe_send(size_t offset, size_t count, bool do_throw)
{
    int w = send(file_descriptor(), buffer_ + offset, count, MSG_DONTWAIT);
    if (w == -1) {
        switch (errno) {
        case ECONNRESET:
            return stream_result::RESET_BY_PEER;
        case EAGAIN:
            return 0;
        case EINTR:
            return stream_result::INTERRUPTED;
        default:
            if (do_throw) {
                throw std::runtime_error(strerror(errno));
            }
        }
    }
    return w;
}
コード例 #13
0
void FileBase::setxattr(const char* name, const char* value, size_t size, int flags)
{
    if (!name || !value)
        throw OSException(EFAULT);

    std::unique_ptr<byte[]> buffer(new byte[size]);
    byte* ciphertext = buffer.get();

    byte meta[XATTR_MAC_LENGTH + XATTR_IV_LENGTH];
    byte* iv = meta;
    byte* mac = iv + XATTR_IV_LENGTH;
    generate_random(iv, XATTR_IV_LENGTH);

    auto name_len = strlen(name);
    std::unique_ptr<byte[]> header(new byte[name_len + ID_LENGTH]);
    memcpy(header.get(), get_id().data(), ID_LENGTH);
    memcpy(header.get() + ID_LENGTH, name, name_len);

    aes_gcm_encrypt(value,
                    size,
                    header.get(),
                    name_len + ID_LENGTH,
                    get_key().data(),
                    get_key().size(),
                    iv,
                    XATTR_IV_LENGTH,
                    mac,
                    XATTR_MAC_LENGTH,
                    ciphertext);

    auto rc = fsetxattr_wrapper(file_descriptor(), name, ciphertext, size, flags);
    if (rc < 0)
        throw OSException(errno);
    rc = fsetxattr_wrapper(m_meta_fd, name, meta, sizeof(meta), flags);
    if (rc < 0)
        throw OSException(errno);
}
コード例 #14
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
bool socket_input_stream::canReadFromBuffer() const
{
    return file_descriptor() != -1 && pos_ < mark_;
}
コード例 #15
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
void socket_output_stream::close_file()
{
    ::close(file_descriptor());
}
コード例 #16
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
void socket_output_stream::flush()
{
    if (file_descriptor() >= 0) {
        unsafe_flush(false);
    }
}
コード例 #17
0
ファイル: SocketStream.cpp プロジェクト: emmef/speakerman
bool socket_output_stream::canWriteToBuffer() const
{
    return file_descriptor() != -1 && pos_ < STREAM_BUFFER_SIZE;
}
コード例 #18
0
OsFile_Handle JarFileParser::handle() const {
  FileDescriptor::Raw desc = file_descriptor();
  GUARANTEE(desc().valid(), "sanity");
  return desc().handle();
}
コード例 #19
0
	locked_pid_file::~locked_pid_file()
	{
		::flock(file_descriptor(), LOCK_UN);
	}