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