buffer.h revision 102840
125839Speter/* Declarations concerning the buffer data structure. */ 225839Speter 325839Speter#if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) 425839Speter 525839Speter/* 625839Speter * We must read data from a child process and send it across the 725839Speter * network. We do not want to block on writing to the network, so we 825839Speter * store the data from the child process in memory. A BUFFER 925839Speter * structure holds the status of one communication, and uses a linked 1025839Speter * list of buffer_data structures to hold data. 1125839Speter */ 1225839Speter 1325839Speterstruct buffer 1425839Speter{ 1525839Speter /* Data. */ 1625839Speter struct buffer_data *data; 1725839Speter 1825839Speter /* Last buffer on data chain. */ 1925839Speter struct buffer_data *last; 2025839Speter 2125839Speter /* Nonzero if the buffer is in nonblocking mode. */ 2225839Speter int nonblocking; 2325839Speter 2425839Speter /* Functions must be provided to transfer data in and out of the 2525839Speter buffer. Either the input or output field must be set, but not 2625839Speter both. */ 2725839Speter 2825839Speter /* Read data into the buffer DATA. There is room for up to SIZE 2925839Speter bytes. In blocking mode, wait until some input, at least NEED 3025839Speter bytes, is available (NEED may be 0 but that is the same as NEED 3125839Speter == 1). In non-blocking mode return immediately no matter how 3225839Speter much input is available; NEED is ignored. Return 0 on success, 3325839Speter or -1 on end of file, or an errno code. Set the number of 3425839Speter bytes read in *GOT. 3525839Speter 3625839Speter If there are a nonzero number of bytes available, less than NEED, 3725839Speter followed by end of file, just read those bytes and return 0. */ 3825839Speter int (*input) PROTO((void *closure, char *data, int need, int size, 3925839Speter int *got)); 4025839Speter 4125839Speter /* Write data. This should write up to HAVE bytes from DATA. 4225839Speter This should return 0 on success, or an errno code. It should 4325839Speter set the number of bytes written in *WROTE. */ 4425839Speter int (*output) PROTO((void *closure, const char *data, int have, 4525839Speter int *wrote)); 4625839Speter 4725839Speter /* Flush any data which may be buffered up after previous calls to 4825839Speter OUTPUT. This should return 0 on success, or an errno code. */ 4925839Speter int (*flush) PROTO((void *closure)); 5025839Speter 5125839Speter /* Change the blocking mode of the underlying communication 5225839Speter stream. If BLOCK is non-zero, it should be placed into 5325839Speter blocking mode. Otherwise, it should be placed into 5425839Speter non-blocking mode. This should return 0 on success, or an 5525839Speter errno code. */ 5625839Speter int (*block) PROTO ((void *closure, int block)); 5725839Speter 5825839Speter /* Shut down the communication stream. This does not mean that it 5925839Speter should be closed. It merely means that no more data will be 6025839Speter read or written, and that any final processing that is 6125839Speter appropriate should be done at this point. This may be NULL. 6225839Speter It should return 0 on success, or an errno code. This entry 6325839Speter point exists for the compression code. */ 64102840Speter int (*shutdown) PROTO((struct buffer *)); 6525839Speter 6625839Speter /* This field is passed to the INPUT, OUTPUT, and BLOCK functions. */ 6725839Speter void *closure; 6825839Speter 6925839Speter /* Function to call if we can't allocate memory. */ 7025839Speter void (*memory_error) PROTO((struct buffer *)); 7125839Speter}; 7225839Speter 7325839Speter/* Data is stored in lists of these structures. */ 7425839Speter 7525839Speterstruct buffer_data 7625839Speter{ 7725839Speter /* Next buffer in linked list. */ 7825839Speter struct buffer_data *next; 7925839Speter 8025839Speter /* 8125839Speter * A pointer into the data area pointed to by the text field. This 8225839Speter * is where to find data that has not yet been written out. 8325839Speter */ 8425839Speter char *bufp; 8525839Speter 8625839Speter /* The number of data bytes found at BUFP. */ 8725839Speter int size; 8825839Speter 8925839Speter /* 9025839Speter * Actual buffer. This never changes after the structure is 9125839Speter * allocated. The buffer is BUFFER_DATA_SIZE bytes. 9225839Speter */ 9325839Speter char *text; 9425839Speter}; 9525839Speter 9625839Speter/* The size we allocate for each buffer_data structure. */ 9725839Speter#define BUFFER_DATA_SIZE (4096) 9825839Speter 9934461Speter/* The type of a function passed as a memory error handler. */ 10034461Spetertypedef void (*BUFMEMERRPROC) PROTO ((struct buffer *)); 10134461Speter 10225839Speterextern struct buffer *buf_initialize PROTO((int (*) (void *, char *, int, 10325839Speter int, int *), 10425839Speter int (*) (void *, const char *, 10525839Speter int, int *), 10625839Speter int (*) (void *), 10725839Speter int (*) (void *, int), 108102840Speter int (*) (struct buffer *), 10925839Speter void (*) (struct buffer *), 11025839Speter void *)); 11134461Speterextern void buf_free PROTO((struct buffer *)); 11225839Speterextern struct buffer *buf_nonio_initialize PROTO((void (*) (struct buffer *))); 11325839Speterextern struct buffer *stdio_buffer_initialize 114102840Speter PROTO((FILE *, int, int, void (*) (struct buffer *))); 11525839Speterextern struct buffer *compress_buffer_initialize 11625839Speter PROTO((struct buffer *, int, int, void (*) (struct buffer *))); 11732785Speterextern struct buffer *packetizing_buffer_initialize 11832785Speter PROTO((struct buffer *, int (*) (void *, const char *, char *, int), 11932785Speter int (*) (void *, const char *, char *, int, int *), void *, 12032785Speter void (*) (struct buffer *))); 12125839Speterextern int buf_empty_p PROTO((struct buffer *)); 12225839Speterextern void buf_output PROTO((struct buffer *, const char *, int)); 12325839Speterextern void buf_output0 PROTO((struct buffer *, const char *)); 12425839Speterextern void buf_append_char PROTO((struct buffer *, int)); 12525839Speterextern int buf_send_output PROTO((struct buffer *)); 12625839Speterextern int buf_flush PROTO((struct buffer *, int)); 12725839Speterextern int set_nonblock PROTO((struct buffer *)); 12825839Speterextern int set_block PROTO((struct buffer *)); 12925839Speterextern int buf_send_counted PROTO((struct buffer *)); 13025839Speterextern int buf_send_special_count PROTO((struct buffer *, int)); 13125839Speterextern void buf_append_data PROTO((struct buffer *, 13225839Speter struct buffer_data *, 13325839Speter struct buffer_data *)); 13434461Speterextern void buf_append_buffer PROTO((struct buffer *, struct buffer *)); 13525839Speterextern int buf_read_file PROTO((FILE *, long, struct buffer_data **, 13625839Speter struct buffer_data **)); 13725839Speterextern int buf_read_file_to_eof PROTO((FILE *, struct buffer_data **, 13825839Speter struct buffer_data **)); 13925839Speterextern int buf_input_data PROTO((struct buffer *, int *)); 14025839Speterextern int buf_read_line PROTO((struct buffer *, char **, int *)); 14125839Speterextern int buf_read_data PROTO((struct buffer *, int, char **, int *)); 14225839Speterextern void buf_copy_lines PROTO((struct buffer *, struct buffer *, int)); 14325839Speterextern int buf_copy_counted PROTO((struct buffer *, struct buffer *, int *)); 14425839Speterextern int buf_chain_length PROTO((struct buffer_data *)); 14534461Speterextern int buf_length PROTO((struct buffer *)); 14625839Speterextern int buf_shutdown PROTO((struct buffer *)); 14725839Speter 14825839Speter#ifdef SERVER_FLOWCONTROL 14925839Speterextern int buf_count_mem PROTO((struct buffer *)); 15025839Speter#endif /* SERVER_FLOWCONTROL */ 15125839Speter 15225839Speter#endif /* defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) */ 153