]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/pipe.cpp
Use size_t for sizes in I/O classes
[libs/core.git] / source / io / pipe.cpp
index 831076f0086b2ffd756ec9e86a3b1b1364e9b1cc..01bf20aaea32c056b33e2213dafdd1d0515c3f1e 100644 (file)
@@ -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();