X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fpipe.cpp;h=01bf20aaea32c056b33e2213dafdd1d0515c3f1e;hp=831076f0086b2ffd756ec9e86a3b1b1364e9b1cc;hb=c8bf2d6c15893ccc9dbc4e04611b7229029f4808;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00 diff --git a/source/io/pipe.cpp b/source/io/pipe.cpp index 831076f..01bf20a 100644 --- a/source/io/pipe.cpp +++ b/source/io/pipe.cpp @@ -24,17 +24,37 @@ Pipe::~Pipe() sys_close(write_handle); } -void Pipe::set_block(bool b) +void Pipe::set_mode(Mode m) { - mode = (mode&~M_NONBLOCK); - if(b) - mode = (mode|M_NONBLOCK); + 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) +{ + adjust_mode(mode, M_NONBLOCK, !b); sys_set_blocking(read_handle, b); sys_set_blocking(write_handle, b); } -unsigned Pipe::do_write(const char *buf, unsigned size) +void Pipe::set_inherit(bool i) +{ + adjust_mode(mode, M_INHERIT, i); + sys_set_inherit(read_handle, i); + sys_set_inherit(write_handle, i); +} + +size_t Pipe::do_write(const char *buf, size_t size) { if(size==0) return 0; @@ -42,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();