2005-10-08 21:20:51 +10:00
# ifndef FISH_IO_H
# define FISH_IO_H
/**
Describes what type of IO operation an io_data_t represents
*/
enum io_mode
{
IO_FILE , IO_PIPE , IO_FD , IO_BUFFER , IO_CLOSE
}
;
/** Represents an FD redirection */
typedef struct io_data
{
/** Type of redirect */
int io_mode ;
/** FD to redirect */
int fd ;
2011-12-26 19:18:46 -08:00
/**
Type - specific parameter for redirection
2005-10-25 01:26:25 +10:00
*/
2005-10-08 21:20:51 +10:00
union
{
/** Fds for IO_PIPE and for IO_BUFFER */
int pipe_fd [ 2 ] ;
/** Filename IO_FILE */
wchar_t * filename ;
/** fd to redirect specified fd to, for IO_FD*/
int old_fd ;
2005-10-12 05:31:16 +10:00
} param1
2005-10-08 21:20:51 +10:00
;
2011-12-26 19:18:46 -08:00
/**
2005-10-25 01:26:25 +10:00
Second type - specific paramter for redirection
*/
2005-10-08 21:20:51 +10:00
union
{
/** file creation flags to send to open for IO_FILE */
int flags ;
/** buffer to save output in for IO_BUFFER */
2011-12-26 19:18:46 -08:00
buffer_t * out_buffer ;
2005-10-08 21:20:51 +10:00
/** Whether to close old_fd for IO_FD */
int close_old ;
2005-10-12 05:31:16 +10:00
} param2
2005-10-08 21:20:51 +10:00
;
2006-08-13 11:38:03 +10:00
2008-01-14 02:47:47 +10:00
/**
Set to true if this is an input io redirection
*/
2006-11-12 22:16:13 +10:00
int is_input ;
2011-12-26 19:18:46 -08:00
2005-10-08 21:20:51 +10:00
/** Pointer to the next IO redirection */
struct io_data * next ;
}
io_data_t ;
2011-12-26 19:18:46 -08:00
2005-10-08 21:20:51 +10:00
/**
Join two chains of io redirections
*/
io_data_t * io_add ( io_data_t * first_chain , io_data_t * decond_chain ) ;
/**
Remove the specified io redirection from the chain
*/
io_data_t * io_remove ( io_data_t * list , io_data_t * element ) ;
/**
2006-02-07 00:25:02 +10:00
Make a copy of the specified chain of redirections . Uses halloc .
2005-10-08 21:20:51 +10:00
*/
2006-02-07 00:25:02 +10:00
io_data_t * io_duplicate ( void * context , io_data_t * l ) ;
2005-10-08 21:20:51 +10:00
/**
2007-04-17 06:10:53 +10:00
Return the last io redirection in the chain for the specified file descriptor .
2005-10-08 21:20:51 +10:00
*/
io_data_t * io_get ( io_data_t * io , int fd ) ;
/**
Free all resources used by a IO_BUFFER type io redirection .
*/
void io_buffer_destroy ( io_data_t * io_buffer ) ;
/**
Create a IO_BUFFER type io redirection , complete with a pipe and a
2006-08-13 11:38:03 +10:00
buffer_t for output . The default file descriptor used is 1 for
output buffering and 0 for input buffering .
\ param is_input set this parameter to zero if the buffer should be
used to buffer the output of a command , or non - zero to buffer the
input to a command .
2005-10-08 21:20:51 +10:00
*/
2006-08-13 11:38:03 +10:00
io_data_t * io_buffer_create ( int is_input ) ;
2005-10-08 21:20:51 +10:00
/**
Close output pipe , and read from input pipe until eof .
*/
void io_buffer_read ( io_data_t * d ) ;
2006-06-20 10:50:10 +10:00
/**
Print debug information about the specified IO redirection chain to stderr .
*/
2006-05-15 08:29:05 +10:00
void io_print ( io_data_t * io ) ;
2005-10-08 21:20:51 +10:00
# endif