mostly revert commit 700c1c04445f4ff11cdb7256df2be57db55abbf6
[alioth/cvs.git] / src / buffer.h
1 /*
2  * Copyright (C) 1996-2005 The Free Software Foundation, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14
15 /* Declarations concerning the buffer data structure.  */
16
17 #if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT)
18
19 # include "getpagesize.h"
20
21 /*
22  * We must read data from a child process and send it across the
23  * network.  We do not want to block on writing to the network, so we
24  * store the data from the child process in memory.  A BUFFER
25  * structure holds the status of one communication, and uses a linked
26  * list of buffer_data structures to hold data.
27  */
28
29 struct buffer;
30
31 typedef int (*type_buf_input) (void *, char *, size_t, size_t, size_t *);
32 typedef int (*type_buf_output) (void *, const char *, size_t, size_t *);
33 typedef int (*type_buf_flush) (void *);
34 typedef int (*type_buf_block) (void *, bool);
35 typedef int (*type_buf_get_fd) (void *);
36 typedef int (*type_buf_shutdown) (struct buffer *);
37 typedef void (*type_buf_memory_error) (struct buffer *);
38
39 struct buffer
40 {
41     /* Data.  */
42     struct buffer_data *data;
43
44     /* Last buffer on data chain.  */
45     struct buffer_data *last;
46
47     /* Nonzero if the buffer is in nonblocking mode.  */
48     bool nonblocking;
49
50     /* Functions must be provided to transfer data in and out of the
51        buffer.  Either the input or output field must be set, but not
52        both.  */
53
54     /* Read data into the buffer DATA.  There is room for up to SIZE
55        bytes.  In blocking mode, wait until some input, at least NEED
56        bytes, is available (NEED may be 0 but that is the same as NEED
57        == 1).  In non-blocking mode return immediately no matter how
58        much input is available; NEED is ignored. Return 0 on success,
59        or -1 on end of file, or an errno code.  Set the number of
60        bytes read in *GOT.
61        
62        If there are a nonzero number of bytes available, less than NEED,
63        followed by end of file, just read those bytes and return 0.  */
64     type_buf_input input;
65
66     /* Write data.  This should write up to HAVE bytes from DATA.
67        This should return 0 on success, or an errno code.  It should
68        set the number of bytes written in *WROTE.  */
69     type_buf_output output;
70
71     /* Flush any data which may be buffered up after previous calls to
72        OUTPUT.  This should return 0 on success, or an errno code.  */
73     type_buf_flush flush;
74
75     /* Change the blocking mode of the underlying communication
76        stream.  If BLOCK is non-zero, it should be placed into
77        blocking mode.  Otherwise, it should be placed into
78        non-blocking mode.  This should return 0 on success, or an
79        errno code.  */
80     type_buf_block block;
81
82     /* Return the file descriptor underlying this buffer, if any, or -1
83      * otherwise.
84      */
85     type_buf_get_fd get_fd;
86
87     /* Shut down the communication stream.  This does not mean that it
88        should be closed.  It merely means that no more data will be
89        read or written, and that any final processing that is
90        appropriate should be done at this point.  This may be NULL.
91        It should return 0 on success, or an errno code.  This entry
92        point exists for the compression code.  */
93     type_buf_shutdown shutdown;
94
95     /* This field is passed to the INPUT, OUTPUT, and BLOCK functions.  */
96     void *closure;
97
98     /* Function to call if we can't allocate memory.  */
99     type_buf_memory_error memory_error;
100 };
101
102 /* Data is stored in lists of these structures.  */
103
104 struct buffer_data
105 {
106     /* Next buffer in linked list.  */
107     struct buffer_data *next;
108
109     /*
110      * A pointer into the data area pointed to by the text field.  This
111      * is where to find data that has not yet been written out.
112      */
113     char *bufp;
114
115     /* The number of data bytes found at BUFP.  */
116     size_t size;
117
118     /*
119      * Actual buffer.  This never changes after the structure is
120      * allocated.  The buffer is BUFFER_DATA_SIZE bytes.
121      */
122     char *text;
123 };
124
125 /* The size we allocate for each buffer_data structure.  */
126 #define BUFFER_DATA_SIZE getpagesize ()
127
128 /* The type of a function passed as a memory error handler.  */
129 typedef void (*BUFMEMERRPROC) (struct buffer *);
130
131 struct buffer *buf_initialize (type_buf_input,
132                                 type_buf_output,
133                                 type_buf_flush,
134                                 type_buf_block,
135                                 type_buf_get_fd,
136                                 type_buf_shutdown,
137                                 type_buf_memory_error,
138                                 void *);
139 void buf_free (struct buffer *);
140 struct buffer *buf_nonio_initialize (void (*) (struct buffer *));
141 struct buffer *compress_buffer_initialize (struct buffer *, int, int,
142                                            void (*) (struct buffer *));
143 struct buffer *packetizing_buffer_initialize
144         (struct buffer *, int (*) (void *, const char *, char *, size_t),
145          int (*) (void *, const char *, char *, size_t, size_t *), void *,
146          void (*) (struct buffer *));
147 int buf_empty (struct buffer *);
148 int buf_empty_p (struct buffer *);
149 void buf_output (struct buffer *, const char *, size_t);
150 void buf_output0 (struct buffer *, const char *);
151 void buf_append_char (struct buffer *, int);
152 int buf_send_output (struct buffer *);
153 int buf_flush (struct buffer *, bool);
154 int set_nonblock (struct buffer *);
155 int set_block (struct buffer *);
156 int buf_send_counted (struct buffer *);
157 int buf_send_special_count (struct buffer *, int);
158 void buf_append_data (struct buffer *, struct buffer_data *,
159                       struct buffer_data *);
160 void buf_append_buffer (struct buffer *, struct buffer *);
161 int buf_read_file (FILE *, long, struct buffer_data **, struct buffer_data **);
162 int buf_read_file_to_eof (FILE *, struct buffer_data **,
163                           struct buffer_data **);
164 int buf_input_data (struct buffer *, size_t *);
165 int buf_read_line (struct buffer *, char **, size_t *);
166 int buf_read_short_line (struct buffer *buf, char **line, size_t *lenp,
167                          size_t max);
168 int buf_read_data (struct buffer *, size_t, char **, size_t *);
169 void buf_copy_lines (struct buffer *, struct buffer *, int);
170 int buf_copy_counted (struct buffer *, struct buffer *, int *);
171 int buf_chain_length (struct buffer_data *);
172 int buf_length (struct buffer *);
173 int buf_get_fd (struct buffer *);
174 int buf_shutdown (struct buffer *);
175 #ifdef PROXY_SUPPORT
176 void buf_copy_data (struct buffer *buf, struct buffer_data *data,
177                     struct buffer_data *last);
178 #endif /* PROXY_SUPPORT */
179 void buf_free_data (struct buffer *);
180
181 #ifdef SERVER_FLOWCONTROL
182 int buf_count_mem (struct buffer *);
183 #endif /* SERVER_FLOWCONTROL */
184
185 struct buffer *
186 fd_buffer_initialize (int fd, pid_t child_pid, cvsroot_t *root, bool input,
187                       void (*memory) (struct buffer *));
188
189 /* EWOULDBLOCK is not defined by POSIX, but some BSD systems will
190    return it, rather than EAGAIN, for nonblocking writes.  */
191 # ifdef EWOULDBLOCK
192 #   define blocking_error(err) ((err) == EWOULDBLOCK || (err) == EAGAIN)
193 # else
194 #   define blocking_error(err) ((err) == EAGAIN)
195 # endif
196 #endif /* defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) */