X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fpipe.cpp;h=01bf20aaea32c056b33e2213dafdd1d0515c3f1e;hp=0f206981f11c6d1e205d127d281655965559187e;hb=c8bf2d6c15893ccc9dbc4e04611b7229029f4808;hpb=651cfe05e867ffdef9028a831add3eca54d19d0d diff --git a/source/io/pipe.cpp b/source/io/pipe.cpp index 0f20698..01bf20a 100644 --- a/source/io/pipe.cpp +++ b/source/io/pipe.cpp @@ -1,11 +1,3 @@ -#ifndef WIN32 -#include -#include -#include -#endif -#include -#include -#include "handle_private.h" #include "pipe.h" using namespace std; @@ -18,27 +10,7 @@ Pipe::Pipe(): { mode = M_RDWR; -#ifdef WIN32 - string name = format("\\\\.\\pipe\\%u.%p", GetCurrentProcessId(), this); - *read_handle = CreateNamedPipe(name.c_str(), PIPE_ACCESS_INBOUND|FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 1024, 1024, 0, 0); - if(!read_handle) - throw system_error("CreateNamedPipe"); - - *write_handle = CreateFile(name.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - if(!write_handle) - { - unsigned err = GetLastError(); - CloseHandle(*read_handle); - throw system_error(format("CreateFile(%s)", name), err); - } -#else - int pipe_fd[2]; - if(pipe(pipe_fd)==-1) - throw system_error("pipe"); - - *read_handle = pipe_fd[0]; - *write_handle = pipe_fd[1]; -#endif + platform_init(); set_events(P_INPUT); } @@ -52,21 +24,37 @@ Pipe::~Pipe() sys_close(write_handle); } +void Pipe::set_mode(Mode m) +{ + m = m&M_RDWR; + if(!m) + throw invalid_argument("Pipe::set_mode"); + + check_access(m); + + Mode close = mode&M_RDWR&~m; + if(close&M_READ) + sys_close(read_handle); + if(close&M_WRITE) + sys_close(write_handle); + mode = (mode&~M_RDWR)|m; +} + void Pipe::set_block(bool b) { - mode = (mode&~M_NONBLOCK); - if(b) - mode = (mode|M_NONBLOCK); - -#ifndef WIN32 - int flags = fcntl(*read_handle, F_GETFD); - fcntl(*read_handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); - flags = fcntl(*write_handle, F_GETFD); - fcntl(*write_handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); -#endif + adjust_mode(mode, M_NONBLOCK, !b); + sys_set_blocking(read_handle, b); + sys_set_blocking(write_handle, b); +} + +void Pipe::set_inherit(bool i) +{ + adjust_mode(mode, M_INHERIT, i); + sys_set_inherit(read_handle, i); + sys_set_inherit(write_handle, i); } -unsigned Pipe::do_write(const char *buf, unsigned size) +size_t Pipe::do_write(const char *buf, size_t size) { if(size==0) return 0; @@ -74,12 +62,12 @@ unsigned Pipe::do_write(const char *buf, unsigned size) return sys_write(write_handle, buf, size); } -unsigned Pipe::do_read(char *buf, unsigned size) +size_t Pipe::do_read(char *buf, size_t size) { if(size==0) return 0; - unsigned ret = reader.read(buf, size); + size_t ret = reader.read(buf, size); if(ret==0) set_eof();