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