1175261Sobrien/* 2175261Sobrien * Copyright (C) 1996-2005 The Free Software Foundation, Inc. 3175261Sobrien * 4175261Sobrien * This program is free software; you can redistribute it and/or modify 5175261Sobrien * it under the terms of the GNU General Public License as published by 6175261Sobrien * the Free Software Foundation; either version 2, or (at your option) 7175261Sobrien * any later version. 8175261Sobrien * 9175261Sobrien * This program is distributed in the hope that it will be useful, 10175261Sobrien * but WITHOUT ANY WARRANTY; without even the implied warranty of 11175261Sobrien * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12175261Sobrien * GNU General Public License for more details. 13175261Sobrien */ 14175261Sobrien 1525839Speter/* Declarations concerning the buffer data structure. */ 1625839Speter 1725839Speter#if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) 1825839Speter 1925839Speter/* 2025839Speter * We must read data from a child process and send it across the 2125839Speter * network. We do not want to block on writing to the network, so we 2225839Speter * store the data from the child process in memory. A BUFFER 2325839Speter * structure holds the status of one communication, and uses a linked 2425839Speter * list of buffer_data structures to hold data. 2525839Speter */ 2625839Speter 2725839Speterstruct buffer 2825839Speter{ 2925839Speter /* Data. */ 3025839Speter struct buffer_data *data; 3125839Speter 3225839Speter /* Last buffer on data chain. */ 3325839Speter struct buffer_data *last; 3425839Speter 3525839Speter /* Nonzero if the buffer is in nonblocking mode. */ 3625839Speter int nonblocking; 3725839Speter 3825839Speter /* Functions must be provided to transfer data in and out of the 3925839Speter buffer. Either the input or output field must be set, but not 4025839Speter both. */ 4125839Speter 4225839Speter /* Read data into the buffer DATA. There is room for up to SIZE 4325839Speter bytes. In blocking mode, wait until some input, at least NEED 4425839Speter bytes, is available (NEED may be 0 but that is the same as NEED 4525839Speter == 1). In non-blocking mode return immediately no matter how 4625839Speter much input is available; NEED is ignored. Return 0 on success, 4725839Speter or -1 on end of file, or an errno code. Set the number of 4825839Speter bytes read in *GOT. 4925839Speter 5025839Speter If there are a nonzero number of bytes available, less than NEED, 5125839Speter followed by end of file, just read those bytes and return 0. */ 5225839Speter int (*input) PROTO((void *closure, char *data, int need, int size, 5325839Speter int *got)); 5425839Speter 5525839Speter /* Write data. This should write up to HAVE bytes from DATA. 5625839Speter This should return 0 on success, or an errno code. It should 5725839Speter set the number of bytes written in *WROTE. */ 5825839Speter int (*output) PROTO((void *closure, const char *data, int have, 5925839Speter int *wrote)); 6025839Speter 6125839Speter /* Flush any data which may be buffered up after previous calls to 6225839Speter OUTPUT. This should return 0 on success, or an errno code. */ 6325839Speter int (*flush) PROTO((void *closure)); 6425839Speter 6525839Speter /* Change the blocking mode of the underlying communication 6625839Speter stream. If BLOCK is non-zero, it should be placed into 6725839Speter blocking mode. Otherwise, it should be placed into 6825839Speter non-blocking mode. This should return 0 on success, or an 6925839Speter errno code. */ 7025839Speter int (*block) PROTO ((void *closure, int block)); 7125839Speter 7225839Speter /* Shut down the communication stream. This does not mean that it 7325839Speter should be closed. It merely means that no more data will be 7425839Speter read or written, and that any final processing that is 7525839Speter appropriate should be done at this point. This may be NULL. 7625839Speter It should return 0 on success, or an errno code. This entry 7725839Speter point exists for the compression code. */ 78102840Speter int (*shutdown) PROTO((struct buffer *)); 7925839Speter 8025839Speter /* This field is passed to the INPUT, OUTPUT, and BLOCK functions. */ 8125839Speter void *closure; 8225839Speter 8325839Speter /* Function to call if we can't allocate memory. */ 8425839Speter void (*memory_error) PROTO((struct buffer *)); 8525839Speter}; 8625839Speter 8725839Speter/* Data is stored in lists of these structures. */ 8825839Speter 8925839Speterstruct buffer_data 9025839Speter{ 9125839Speter /* Next buffer in linked list. */ 9225839Speter struct buffer_data *next; 9325839Speter 9425839Speter /* 9525839Speter * A pointer into the data area pointed to by the text field. This 9625839Speter * is where to find data that has not yet been written out. 9725839Speter */ 9825839Speter char *bufp; 9925839Speter 10025839Speter /* The number of data bytes found at BUFP. */ 10125839Speter int size; 10225839Speter 10325839Speter /* 10425839Speter * Actual buffer. This never changes after the structure is 10525839Speter * allocated. The buffer is BUFFER_DATA_SIZE bytes. 10625839Speter */ 10725839Speter char *text; 10825839Speter}; 10925839Speter 11025839Speter/* The size we allocate for each buffer_data structure. */ 11125839Speter#define BUFFER_DATA_SIZE (4096) 11225839Speter 11334461Speter/* The type of a function passed as a memory error handler. */ 11434461Spetertypedef void (*BUFMEMERRPROC) PROTO ((struct buffer *)); 11534461Speter 11625839Speterextern struct buffer *buf_initialize PROTO((int (*) (void *, char *, int, 11725839Speter int, int *), 11825839Speter int (*) (void *, const char *, 11925839Speter int, int *), 12025839Speter int (*) (void *), 12125839Speter int (*) (void *, int), 122102840Speter int (*) (struct buffer *), 12325839Speter void (*) (struct buffer *), 12425839Speter void *)); 12534461Speterextern void buf_free PROTO((struct buffer *)); 12625839Speterextern struct buffer *buf_nonio_initialize PROTO((void (*) (struct buffer *))); 12725839Speterextern struct buffer *stdio_buffer_initialize 128102840Speter PROTO((FILE *, int, int, void (*) (struct buffer *))); 129107484Speterextern FILE *stdio_buffer_get_file PROTO((struct buffer *)); 13025839Speterextern struct buffer *compress_buffer_initialize 13125839Speter PROTO((struct buffer *, int, int, void (*) (struct buffer *))); 13232785Speterextern struct buffer *packetizing_buffer_initialize 13332785Speter PROTO((struct buffer *, int (*) (void *, const char *, char *, int), 13432785Speter int (*) (void *, const char *, char *, int, int *), void *, 13532785Speter void (*) (struct buffer *))); 136128266Speterextern int buf_empty PROTO((struct buffer *)); 13725839Speterextern int buf_empty_p PROTO((struct buffer *)); 13825839Speterextern void buf_output PROTO((struct buffer *, const char *, int)); 13925839Speterextern void buf_output0 PROTO((struct buffer *, const char *)); 14025839Speterextern void buf_append_char PROTO((struct buffer *, int)); 14125839Speterextern int buf_send_output PROTO((struct buffer *)); 14225839Speterextern int buf_flush PROTO((struct buffer *, int)); 14325839Speterextern int set_nonblock PROTO((struct buffer *)); 14425839Speterextern int set_block PROTO((struct buffer *)); 14525839Speterextern int buf_send_counted PROTO((struct buffer *)); 14625839Speterextern int buf_send_special_count PROTO((struct buffer *, int)); 14725839Speterextern void buf_append_data PROTO((struct buffer *, 14825839Speter struct buffer_data *, 14925839Speter struct buffer_data *)); 15034461Speterextern void buf_append_buffer PROTO((struct buffer *, struct buffer *)); 15125839Speterextern int buf_read_file PROTO((FILE *, long, struct buffer_data **, 15225839Speter struct buffer_data **)); 15325839Speterextern int buf_read_file_to_eof PROTO((FILE *, struct buffer_data **, 15425839Speter struct buffer_data **)); 15525839Speterextern int buf_input_data PROTO((struct buffer *, int *)); 15625839Speterextern int buf_read_line PROTO((struct buffer *, char **, int *)); 15725839Speterextern int buf_read_data PROTO((struct buffer *, int, char **, int *)); 15825839Speterextern void buf_copy_lines PROTO((struct buffer *, struct buffer *, int)); 15925839Speterextern int buf_copy_counted PROTO((struct buffer *, struct buffer *, int *)); 16025839Speterextern int buf_chain_length PROTO((struct buffer_data *)); 16134461Speterextern int buf_length PROTO((struct buffer *)); 16225839Speterextern int buf_shutdown PROTO((struct buffer *)); 16325839Speter 16425839Speter#ifdef SERVER_FLOWCONTROL 16525839Speterextern int buf_count_mem PROTO((struct buffer *)); 16625839Speter#endif /* SERVER_FLOWCONTROL */ 16725839Speter 16825839Speter#endif /* defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) */ 169