aboutsummaryrefslogtreecommitdiffhomepage
path: root/io.h
diff options
context:
space:
mode:
Diffstat (limited to 'io.h')
-rw-r--r--io.h68
1 files changed, 41 insertions, 27 deletions
diff --git a/io.h b/io.h
index 49bbbafa..109c1a5a 100644
--- a/io.h
+++ b/io.h
@@ -73,7 +73,12 @@ public:
/** Function to get a pointer to the buffer */
char *out_buffer_ptr(void) {
assert(out_buffer.get() != NULL);
- return (out_buffer->size() == 0) ? NULL : &out_buffer->at(0);
+ return out_buffer->empty() ? NULL : &out_buffer->at(0);
+ }
+
+ const char *out_buffer_ptr(void) const {
+ assert(out_buffer.get() != NULL);
+ return out_buffer->empty() ? NULL : &out_buffer->at(0);
}
/** Function to get the size of the buffer */
@@ -83,11 +88,8 @@ public:
}
/** Set to true if this is an input io redirection */
- int is_input;
+ bool is_input;
- /** Pointer to the next IO redirection */
- io_data_t *next;
-
io_data_t() :
out_buffer(),
io_mode(0),
@@ -95,8 +97,7 @@ public:
param1(),
param2(),
filename_cstr(NULL),
- is_input(0),
- next(NULL)
+ is_input(0)
{
}
@@ -107,10 +108,8 @@ public:
param1(rhs.param1),
param2(rhs.param2),
filename_cstr(rhs.filename_cstr ? strdup(rhs.filename_cstr) : NULL),
- is_input(rhs.is_input),
- next(rhs.next)
+ is_input(rhs.is_input)
{
-
}
~io_data_t() {
@@ -118,27 +117,44 @@ public:
}
};
-
-/**
- Join two chains of io redirections
-*/
-io_data_t *io_add( io_data_t *first_chain, io_data_t *decond_chain );
+class io_chain_t : public std::vector<io_data_t *> {
+public:
+ io_chain_t();
+ io_chain_t(io_data_t *);
+
+ void remove(const io_data_t *element);
+ io_chain_t duplicate() const;
+ void duplicate_append(const io_chain_t &src);
+ void destroy();
+
+ const io_data_t *get_io_for_fd(int fd) const;
+ io_data_t *get_io_for_fd(int fd);
+
+
+};
/**
Remove the specified io redirection from the chain
*/
-io_data_t *io_remove( io_data_t *list, io_data_t *element );
+void io_remove(io_chain_t &list, const io_data_t *element);
-/**
- Make a copy of the specified chain of redirections. Uses operator new.
-*/
-io_data_t *io_duplicate( io_data_t *l );
+/** Make a copy of the specified chain of redirections. Uses operator new. */
+io_chain_t io_duplicate(const io_chain_t &chain);
+
+/** Return a shallow copy of the specified chain of redirections that contains only the applicable redirections. That is, if there's multiple redirections for the same fd, only the second one is included. */
+io_chain_t io_unique(const io_chain_t &chain);
+
+/** Appends a copy of the specified 'src' chain of redirections to 'dst.' Uses operator new. */
+void io_duplicate_append( const io_chain_t &src, io_chain_t &dst );
+
+/** Destroys an io_chain */
+void io_chain_destroy(io_chain_t &chain);
/**
Return the last io redirection in the chain for the specified file descriptor.
*/
-io_data_t *io_get( io_data_t *io, int fd );
-
+const io_data_t *io_chain_get(const io_chain_t &src, int fd);
+io_data_t *io_chain_get(io_chain_t &src, int fd);
/**
@@ -155,16 +171,14 @@ void io_buffer_destroy( io_data_t *io_buffer );
used to buffer the output of a command, or non-zero to buffer the
input to a command.
*/
-io_data_t *io_buffer_create( int is_input );
+io_data_t *io_buffer_create( bool is_input );
/**
Close output pipe, and read from input pipe until eof.
*/
void io_buffer_read( io_data_t *d );
-/**
- Print debug information about the specified IO redirection chain to stderr.
-*/
-void io_print( io_data_t *io );
+/** Print debug information about the specified IO redirection chain to stderr. */
+void io_print( const io_chain_t &chain );
#endif