xref: /netbsd/external/gpl2/xcvs/dist/src/buffer.c (revision 3cd63638)
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 #include <sys/cdefs.h>
15 __RCSID("$NetBSD: buffer.c,v 1.2 2016/05/17 14:00:09 christos Exp $");
16 
17 /* Code for the buffer data structure.  */
18 
19 #include "cvs.h"
20 #include "buffer.h"
21 #include "pagealign_alloc.h"
22 
23 #if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT)
24 
25 # include <sys/socket.h>
26 
27 /* OS/2 doesn't have EIO.  FIXME: this whole notion of turning
28    a different error into EIO strikes me as pretty dubious.  */
29 # if !defined( EIO )
30 #   define EIO EBADPOS
31 # endif
32 
33 /* Local functions.  */
34 static void buf_default_memory_error (struct buffer *);
35 static struct buffer_data *get_buffer_data (void);
36 
37 
38 
39 /* Initialize a buffer structure.  */
40 struct buffer *
buf_initialize(type_buf_input input,type_buf_output output,type_buf_flush flush,type_buf_block block,type_buf_get_fd get_fd,type_buf_shutdown shutdown,type_buf_memory_error memory_error,void * closure)41 buf_initialize (type_buf_input input,
42                 type_buf_output output,
43                 type_buf_flush flush,
44                 type_buf_block block,
45                 type_buf_get_fd get_fd,
46                 type_buf_shutdown shutdown,
47                 type_buf_memory_error memory_error,
48                 void *closure)
49 {
50     struct buffer *buf;
51 
52     buf = xmalloc (sizeof (struct buffer));
53     buf->data = NULL;
54     buf->last = NULL;
55     buf->nonblocking = false;
56     buf->input = input;
57     buf->output = output;
58     buf->flush = flush;
59     buf->block = block;
60     buf->get_fd = get_fd;
61     buf->shutdown = shutdown;
62     buf->memory_error = memory_error ? memory_error : buf_default_memory_error;
63     buf->closure = closure;
64     return buf;
65 }
66 
67 
68 
69 /* Free a buffer structure.  */
70 void
buf_free(struct buffer * buf)71 buf_free (struct buffer *buf)
72 {
73     if (buf->closure != NULL)
74     {
75 	free (buf->closure);
76 	buf->closure = NULL;
77     }
78     buf_free_data (buf);
79     free (buf);
80 }
81 
82 
83 
84 /* Initialize a buffer structure which is not to be used for I/O.  */
85 struct buffer *
buf_nonio_initialize(void (* memory)(struct buffer *))86 buf_nonio_initialize( void (*memory) (struct buffer *) )
87 {
88     return buf_initialize (NULL, NULL, NULL, NULL, NULL, NULL, memory, NULL);
89 }
90 
91 
92 
93 /* Default memory error handler.  */
94 static void
buf_default_memory_error(struct buffer * buf)95 buf_default_memory_error (struct buffer *buf)
96 {
97     error (1, 0, "out of memory");
98 }
99 
100 
101 
102 /* Allocate more buffer_data structures.  */
103 /* Get a new buffer_data structure.  */
104 static struct buffer_data *
get_buffer_data(void)105 get_buffer_data (void)
106 {
107     struct buffer_data *ret;
108 
109     ret = xmalloc (sizeof (struct buffer_data));
110     ret->text = pagealign_xalloc (BUFFER_DATA_SIZE);
111 
112     return ret;
113 }
114 
115 
116 
117 /* See whether a buffer and its file descriptor is empty.  */
118 int
buf_empty(buf)119 buf_empty (buf)
120     struct buffer *buf;
121 {
122 	/* Try and read any data on the file descriptor first.
123 	 * We already know the descriptor is non-blocking.
124 	 */
125 	buf_input_data (buf, NULL);
126 	return buf_empty_p (buf);
127 }
128 
129 
130 
131 /* See whether a buffer is empty.  */
132 int
buf_empty_p(struct buffer * buf)133 buf_empty_p (struct buffer *buf)
134 {
135     struct buffer_data *data;
136 
137     for (data = buf->data; data != NULL; data = data->next)
138 	if (data->size > 0)
139 	    return 0;
140     return 1;
141 }
142 
143 
144 
145 # if defined (SERVER_FLOWCONTROL) || defined (PROXY_SUPPORT)
146 /*
147  * Count how much data is stored in the buffer..
148  * Note that each buffer is a xmalloc'ed chunk BUFFER_DATA_SIZE.
149  */
150 int
buf_count_mem(struct buffer * buf)151 buf_count_mem (struct buffer *buf)
152 {
153     struct buffer_data *data;
154     int mem = 0;
155 
156     for (data = buf->data; data != NULL; data = data->next)
157 	mem += BUFFER_DATA_SIZE;
158 
159     return mem;
160 }
161 # endif /* SERVER_FLOWCONTROL || PROXY_SUPPORT */
162 
163 
164 
165 /* Add data DATA of length LEN to BUF.  */
166 void
buf_output(struct buffer * buf,const char * data,size_t len)167 buf_output (struct buffer *buf, const char *data, size_t len)
168 {
169     if (buf->data != NULL
170 	&& (((buf->last->text + BUFFER_DATA_SIZE)
171 	     - (buf->last->bufp + buf->last->size))
172 	    >= len))
173     {
174 	memcpy (buf->last->bufp + buf->last->size, data, len);
175 	buf->last->size += len;
176 	return;
177     }
178 
179     while (1)
180     {
181 	struct buffer_data *newdata;
182 
183 	newdata = get_buffer_data ();
184 	if (newdata == NULL)
185 	{
186 	    (*buf->memory_error) (buf);
187 	    return;
188 	}
189 
190 	if (buf->data == NULL)
191 	    buf->data = newdata;
192 	else
193 	    buf->last->next = newdata;
194 	newdata->next = NULL;
195 	buf->last = newdata;
196 
197 	newdata->bufp = newdata->text;
198 
199 	if (len <= BUFFER_DATA_SIZE)
200 	{
201 	    newdata->size = len;
202 	    memcpy (newdata->text, data, len);
203 	    return;
204 	}
205 
206 	newdata->size = BUFFER_DATA_SIZE;
207 	memcpy (newdata->text, data, BUFFER_DATA_SIZE);
208 
209 	data += BUFFER_DATA_SIZE;
210 	len -= BUFFER_DATA_SIZE;
211     }
212 
213     /*NOTREACHED*/
214 }
215 
216 
217 
218 /* Add a '\0' terminated string to BUF.  */
219 void
buf_output0(struct buffer * buf,const char * string)220 buf_output0 (struct buffer *buf, const char *string)
221 {
222     buf_output (buf, string, strlen (string));
223 }
224 
225 
226 
227 /* Add a single character to BUF.  */
228 void
buf_append_char(struct buffer * buf,int ch)229 buf_append_char (struct buffer *buf, int ch)
230 {
231     if (buf->data != NULL
232 	&& (buf->last->text + BUFFER_DATA_SIZE
233 	    != buf->last->bufp + buf->last->size))
234     {
235 	*(buf->last->bufp + buf->last->size) = ch;
236 	++buf->last->size;
237     }
238     else
239     {
240 	char b;
241 
242 	b = ch;
243 	buf_output (buf, &b, 1);
244     }
245 }
246 
247 
248 
249 /* Free struct buffer_data's from the list starting with FIRST and ending at
250  * LAST, inclusive.
251  */
252 static inline void
buf_free_datas(struct buffer_data * first,struct buffer_data * last)253 buf_free_datas (struct buffer_data *first, struct buffer_data *last)
254 {
255     struct buffer_data *b, *n, *p;
256     b = first;
257     do
258     {
259 	p = b;
260 	n = b->next;
261 	pagealign_free (b->text);
262 	free (b);
263 	b = n;
264     } while (p != last);
265 }
266 
267 
268 
269 /*
270  * Send all the output we've been saving up.  Returns 0 for success or
271  * errno code.  If the buffer has been set to be nonblocking, this
272  * will just write until the write would block.
273  */
274 int
buf_send_output(struct buffer * buf)275 buf_send_output (struct buffer *buf)
276 {
277     assert (buf->output != NULL);
278 
279     while (buf->data != NULL)
280     {
281 	struct buffer_data *data;
282 
283 	data = buf->data;
284 
285 	if (data->size > 0)
286 	{
287 	    int status;
288 	    size_t nbytes;
289 
290 	    status = (*buf->output) (buf->closure, data->bufp, data->size,
291 				     &nbytes);
292 	    if (status != 0)
293 	    {
294 		/* Some sort of error.  Discard the data, and return.  */
295 		buf_free_data (buf);
296 	        return status;
297 	    }
298 
299 	    if (nbytes != data->size)
300 	    {
301 		/* Not all the data was written out.  This is only
302                    permitted in nonblocking mode.  Adjust the buffer,
303                    and return.  */
304 
305 		assert (buf->nonblocking);
306 
307 		data->size -= nbytes;
308 		data->bufp += nbytes;
309 
310 		return 0;
311 	    }
312 	}
313 
314 	buf->data = data->next;
315 	buf_free_datas (data, data);
316     }
317 
318     buf->last = NULL;
319 
320     return 0;
321 }
322 
323 
324 
325 /*
326  * Flush any data queued up in the buffer.  If BLOCK is nonzero, then
327  * if the buffer is in nonblocking mode, put it into blocking mode for
328  * the duration of the flush.  This returns 0 on success, or an error
329  * code.
330  */
331 int
buf_flush(struct buffer * buf,bool block)332 buf_flush (struct buffer *buf, bool block)
333 {
334     int nonblocking;
335     int status;
336 
337     assert (buf->flush != NULL);
338 
339     nonblocking = buf->nonblocking;
340     if (nonblocking && block)
341     {
342         status = set_block (buf);
343 	if (status != 0)
344 	    return status;
345     }
346 
347     status = buf_send_output (buf);
348     if (status == 0)
349         status = (*buf->flush) (buf->closure);
350 
351     if (nonblocking && block)
352     {
353         int blockstat;
354 
355         blockstat = set_nonblock (buf);
356 	if (status == 0)
357 	    status = blockstat;
358     }
359 
360     return status;
361 }
362 
363 
364 
365 /*
366  * Set buffer BUF to nonblocking I/O.  Returns 0 for success or errno
367  * code.
368  */
369 int
set_nonblock(struct buffer * buf)370 set_nonblock (struct buffer *buf)
371 {
372     int status;
373 
374     if (buf->nonblocking)
375 	return 0;
376     assert (buf->block != NULL);
377     status = (*buf->block) (buf->closure, 0);
378     if (status != 0)
379 	return status;
380     buf->nonblocking = true;
381     return 0;
382 }
383 
384 
385 
386 /*
387  * Set buffer BUF to blocking I/O.  Returns 0 for success or errno
388  * code.
389  */
390 int
set_block(struct buffer * buf)391 set_block (struct buffer *buf)
392 {
393     int status;
394 
395     if (! buf->nonblocking)
396 	return 0;
397     assert (buf->block != NULL);
398     status = (*buf->block) (buf->closure, 1);
399     if (status != 0)
400 	return status;
401     buf->nonblocking = false;
402     return 0;
403 }
404 
405 
406 
407 /*
408  * Send a character count and some output.  Returns errno code or 0 for
409  * success.
410  *
411  * Sending the count in binary is OK since this is only used on a pipe
412  * within the same system.
413  */
414 int
buf_send_counted(struct buffer * buf)415 buf_send_counted (struct buffer *buf)
416 {
417     int size;
418     struct buffer_data *data;
419 
420     size = 0;
421     for (data = buf->data; data != NULL; data = data->next)
422 	size += data->size;
423 
424     data = get_buffer_data ();
425     if (data == NULL)
426     {
427 	(*buf->memory_error) (buf);
428 	return ENOMEM;
429     }
430 
431     data->next = buf->data;
432     buf->data = data;
433     if (buf->last == NULL)
434 	buf->last = data;
435 
436     data->bufp = data->text;
437     data->size = sizeof (int);
438 
439     *((int *) data->text) = size;
440 
441     return buf_send_output (buf);
442 }
443 
444 
445 
446 /*
447  * Send a special count.  COUNT should be negative.  It will be
448  * handled specially by buf_copy_counted.  This function returns 0 or
449  * an errno code.
450  *
451  * Sending the count in binary is OK since this is only used on a pipe
452  * within the same system.
453  */
454 int
buf_send_special_count(struct buffer * buf,int count)455 buf_send_special_count (struct buffer *buf, int count)
456 {
457     struct buffer_data *data;
458 
459     data = get_buffer_data ();
460     if (data == NULL)
461     {
462 	(*buf->memory_error) (buf);
463 	return ENOMEM;
464     }
465 
466     data->next = buf->data;
467     buf->data = data;
468     if (buf->last == NULL)
469 	buf->last = data;
470 
471     data->bufp = data->text;
472     data->size = sizeof (int);
473 
474     *((int *) data->text) = count;
475 
476     return buf_send_output (buf);
477 }
478 
479 
480 
481 /* Append a list of buffer_data structures to an buffer.  */
482 void
buf_append_data(struct buffer * buf,struct buffer_data * data,struct buffer_data * last)483 buf_append_data (struct buffer *buf, struct buffer_data *data,
484                  struct buffer_data *last)
485 {
486     if (data != NULL)
487     {
488 	if (buf->data == NULL)
489 	    buf->data = data;
490 	else
491 	    buf->last->next = data;
492 	buf->last = last;
493     }
494 }
495 
496 
497 
498 # ifdef PROXY_SUPPORT
499 /* Copy data structures and append them to a buffer.
500  *
501  * ERRORS
502  *   Failure to allocate memory here is fatal.
503  */
504 void
buf_copy_data(struct buffer * buf,struct buffer_data * data,struct buffer_data * last)505 buf_copy_data (struct buffer *buf, struct buffer_data *data,
506                struct buffer_data *last)
507 {
508     struct buffer_data *first, *new, *cur, *prev;
509 
510     assert (buf);
511     assert (data);
512 
513     prev = first = NULL;
514     cur = data;
515     while (1)
516     {
517 	new = get_buffer_data ();
518 	if (!new) error (1, errno, "Failed to allocate buffer data.");
519 
520 	if (!first) first = new;
521 	memcpy (new->text, cur->bufp, cur->size);
522 	new->bufp = new->text;
523 	new->size = cur->size;
524 	new->next = NULL;
525 	if (prev) prev->next = new;
526 	if (cur == last) break;
527 	prev = new;
528 	cur = cur->next;
529     }
530 
531     buf_append_data (buf, first, new);
532 }
533 # endif /* PROXY_SUPPORT */
534 
535 
536 
537 /* Dispose of any remaining data in the buffer.  */
538 void
buf_free_data(struct buffer * buffer)539 buf_free_data (struct buffer *buffer)
540 {
541     if (buf_empty_p (buffer)) return;
542     buf_free_datas (buffer->data, buffer->last);
543     buffer->data = buffer->last = NULL;
544 }
545 
546 
547 
548 /* Append the data in one buffer to another.  This removes the data
549  * from the source buffer.
550  */
551 void
buf_append_buffer(struct buffer * to,struct buffer * from)552 buf_append_buffer (struct buffer *to, struct buffer *from)
553 {
554     struct buffer_data *n;
555 
556     /* Copy the data pointer to the new buf.  */
557     buf_append_data (to, from->data, from->last);
558 
559     n = from->data;
560     while (n)
561     {
562 	if (n == from->last) break;
563 	n = n->next;
564     }
565 
566     /* Remove from the original location.  */
567     from->data = NULL;
568     from->last = NULL;
569 }
570 
571 
572 
573 /*
574  * Copy the contents of file F into buffer_data structures.  We can't
575  * copy directly into an buffer, because we want to handle failure and
576  * success differently.  Returns 0 on success, or -2 if out of
577  * memory, or a status code on error.  Since the caller happens to
578  * know the size of the file, it is passed in as SIZE.  On success,
579  * this function sets *RETP and *LASTP, which may be passed to
580  * buf_append_data.
581  */
582 int
buf_read_file(FILE * f,long int size,struct buffer_data ** retp,struct buffer_data ** lastp)583 buf_read_file (FILE *f, long int size, struct buffer_data **retp,
584                struct buffer_data **lastp)
585 {
586     int status;
587 
588     *retp = NULL;
589     *lastp = NULL;
590 
591     while (size > 0)
592     {
593 	struct buffer_data *data;
594 	int get;
595 
596 	data = get_buffer_data ();
597 	if (data == NULL)
598 	{
599 	    status = -2;
600 	    goto error_return;
601 	}
602 
603 	if (*retp == NULL)
604 	    *retp = data;
605 	else
606 	    (*lastp)->next = data;
607 	data->next = NULL;
608 	*lastp = data;
609 
610 	data->bufp = data->text;
611 	data->size = 0;
612 
613 	if (size > BUFFER_DATA_SIZE)
614 	    get = BUFFER_DATA_SIZE;
615 	else
616 	    get = size;
617 
618 	errno = EIO;
619 	if (fread (data->text, get, 1, f) != 1)
620 	{
621 	    status = errno;
622 	    goto error_return;
623 	}
624 
625 	data->size += get;
626 	size -= get;
627     }
628 
629     return 0;
630 
631   error_return:
632     if (*retp != NULL)
633 	buf_free_datas (*retp, (*lastp)->next);
634     return status;
635 }
636 
637 
638 
639 /*
640  * Copy the contents of file F into buffer_data structures.  We can't
641  * copy directly into an buffer, because we want to handle failure and
642  * success differently.  Returns 0 on success, or -2 if out of
643  * memory, or a status code on error.  On success, this function sets
644  * *RETP and *LASTP, which may be passed to buf_append_data.
645  */
646 int
buf_read_file_to_eof(FILE * f,struct buffer_data ** retp,struct buffer_data ** lastp)647 buf_read_file_to_eof (FILE *f, struct buffer_data **retp,
648                       struct buffer_data **lastp)
649 {
650     int status;
651 
652     *retp = NULL;
653     *lastp = NULL;
654 
655     while (!feof (f))
656     {
657 	struct buffer_data *data;
658 	int get, nread;
659 
660 	data = get_buffer_data ();
661 	if (data == NULL)
662 	{
663 	    status = -2;
664 	    goto error_return;
665 	}
666 
667 	if (*retp == NULL)
668 	    *retp = data;
669 	else
670 	    (*lastp)->next = data;
671 	data->next = NULL;
672 	*lastp = data;
673 
674 	data->bufp = data->text;
675 	data->size = 0;
676 
677 	get = BUFFER_DATA_SIZE;
678 
679 	errno = EIO;
680 	nread = fread (data->text, 1, get, f);
681 	if (nread == 0 && !feof (f))
682 	{
683 	    status = errno;
684 	    goto error_return;
685 	}
686 
687 	data->size = nread;
688     }
689 
690     return 0;
691 
692   error_return:
693     if (*retp != NULL)
694 	buf_free_datas (*retp, (*lastp)->next);
695     return status;
696 }
697 
698 
699 
700 /* Return the number of bytes in a chain of buffer_data structures.  */
701 int
buf_chain_length(struct buffer_data * buf)702 buf_chain_length (struct buffer_data *buf)
703 {
704     int size = 0;
705     while (buf)
706     {
707 	size += buf->size;
708 	buf = buf->next;
709     }
710     return size;
711 }
712 
713 
714 
715 /* Return the number of bytes in a buffer.  */
716 int
buf_length(struct buffer * buf)717 buf_length (struct buffer *buf)
718 {
719     return buf_chain_length (buf->data);
720 }
721 
722 
723 
724 /*
725  * Read an arbitrary amount of data into an input buffer.  The buffer
726  * will be in nonblocking mode, and we just grab what we can.  Return
727  * 0 on success, or -1 on end of file, or -2 if out of memory, or an
728  * error code.  If COUNTP is not NULL, *COUNTP is set to the number of
729  * bytes read.
730  */
731 int
buf_input_data(struct buffer * buf,size_t * countp)732 buf_input_data (struct buffer *buf, size_t *countp)
733 {
734     assert (buf->input != NULL);
735 
736     if (countp != NULL)
737 	*countp = 0;
738 
739     while (1)
740     {
741 	int status;
742 	size_t get, nbytes;
743 
744 	if (buf->data == NULL
745 	    || (buf->last->bufp + buf->last->size
746 		== buf->last->text + BUFFER_DATA_SIZE))
747 	{
748 	    struct buffer_data *data;
749 
750 	    data = get_buffer_data ();
751 	    if (data == NULL)
752 	    {
753 		(*buf->memory_error) (buf);
754 		return -2;
755 	    }
756 
757 	    if (buf->data == NULL)
758 		buf->data = data;
759 	    else
760 		buf->last->next = data;
761 	    data->next = NULL;
762 	    buf->last = data;
763 
764 	    data->bufp = data->text;
765 	    data->size = 0;
766 	}
767 
768 	get = ((buf->last->text + BUFFER_DATA_SIZE)
769 	       - (buf->last->bufp + buf->last->size));
770 
771 	status = (*buf->input) (buf->closure,
772 				buf->last->bufp + buf->last->size,
773 				0, get, &nbytes);
774 	if (status != 0)
775 	    return status;
776 
777 	buf->last->size += nbytes;
778 	if (countp != NULL)
779 	    *countp += nbytes;
780 
781 	if (nbytes < get)
782 	{
783 	    /* If we did not fill the buffer, then presumably we read
784                all the available data.  */
785 	    return 0;
786 	}
787     }
788 
789     /*NOTREACHED*/
790 }
791 
792 
793 
794 /*
795  * Read a line (characters up to a \012) from an input buffer.  (We
796  * use \012 rather than \n for the benefit of non Unix clients for
797  * which \n means something else).  This returns 0 on success, or -1
798  * on end of file, or -2 if out of memory, or an error code.  If it
799  * succeeds, it sets *LINE to an allocated buffer holding the contents
800  * of the line.  The trailing \012 is not included in the buffer.  If
801  * LENP is not NULL, then *LENP is set to the number of bytes read;
802  * strlen may not work, because there may be embedded null bytes.
803  */
804 int
buf_read_line(struct buffer * buf,char ** line,size_t * lenp)805 buf_read_line (struct buffer *buf, char **line, size_t *lenp)
806 {
807     return buf_read_short_line (buf, line, lenp, SIZE_MAX);
808 }
809 
810 
811 
812 /* Like buf_read_line, but return -2 if no newline is found in MAX characters.
813  */
814 int
buf_read_short_line(struct buffer * buf,char ** line,size_t * lenp,size_t max)815 buf_read_short_line (struct buffer *buf, char **line, size_t *lenp,
816                      size_t max)
817 {
818     assert (buf->input != NULL);
819 
820     *line = NULL;
821 
822     while (1)
823     {
824 	size_t len, finallen, predicted_len;
825 	struct buffer_data *data;
826 	char *nl;
827 
828 	/* See if there is a newline in BUF.  */
829 	len = 0;
830 	for (data = buf->data; data != NULL; data = data->next)
831 	{
832 	    nl = memchr (data->bufp, '\012', data->size);
833 	    if (nl != NULL)
834 	    {
835 	        finallen = nl - data->bufp;
836 		if (xsum (len, finallen) >= max) return -2;
837 	        len += finallen;
838 		break;
839 	    }
840 	    else if (xsum (len, data->size) >= max) return -2;
841 	    len += data->size;
842 	}
843 
844 	/* If we found a newline, copy the line into a memory buffer,
845            and remove it from BUF.  */
846 	if (data != NULL)
847 	{
848 	    char *p;
849 	    struct buffer_data *nldata;
850 
851 	    p = xmalloc (len + 1);
852 	    if (p == NULL)
853 		return -2;
854 	    *line = p;
855 
856 	    nldata = data;
857 	    data = buf->data;
858 	    while (data != nldata)
859 	    {
860 		struct buffer_data *next;
861 
862 		memcpy (p, data->bufp, data->size);
863 		p += data->size;
864 		next = data->next;
865 		buf_free_datas (data, data);
866 		data = next;
867 	    }
868 
869 	    memcpy (p, data->bufp, finallen);
870 	    p[finallen] = '\0';
871 
872 	    data->size -= finallen + 1;
873 	    data->bufp = nl + 1;
874 	    buf->data = data;
875 
876 	    if (lenp != NULL)
877 	        *lenp = len;
878 
879 	    return 0;
880 	}
881 
882 	/* Read more data until we get a newline or MAX characters.  */
883 	predicted_len = 0;
884 	while (1)
885 	{
886 	    int status;
887 	    size_t size, nbytes;
888 	    char *mem;
889 
890 	    if (buf->data == NULL
891 		|| (buf->last->bufp + buf->last->size
892 		    == buf->last->text + BUFFER_DATA_SIZE))
893 	    {
894 		data = get_buffer_data ();
895 		if (data == NULL)
896 		{
897 		    (*buf->memory_error) (buf);
898 		    return -2;
899 		}
900 
901 		if (buf->data == NULL)
902 		    buf->data = data;
903 		else
904 		    buf->last->next = data;
905 		data->next = NULL;
906 		buf->last = data;
907 
908 		data->bufp = data->text;
909 		data->size = 0;
910 	    }
911 
912 	    mem = buf->last->bufp + buf->last->size;
913 	    size = (buf->last->text + BUFFER_DATA_SIZE) - mem;
914 
915 	    /* We need to read at least 1 byte.  We can handle up to
916                SIZE bytes.  This will only be efficient if the
917                underlying communication stream does its own buffering,
918                or is clever about getting more than 1 byte at a time.  */
919 	    status = (*buf->input) (buf->closure, mem, 1, size, &nbytes);
920 	    if (status != 0)
921 		return status;
922 
923 	    predicted_len += nbytes;
924 	    buf->last->size += nbytes;
925 
926 	    /* Optimize slightly to avoid an unnecessary call to memchr.  */
927 	    if (nbytes == 1)
928 	    {
929 		if (*mem == '\012')
930 		    break;
931 	    }
932 	    else
933 	    {
934 		if (memchr (mem, '\012', nbytes) != NULL)
935 		    break;
936 	    }
937 	    if (xsum (len, predicted_len) >= max) return -2;
938 	}
939     }
940 }
941 
942 
943 
944 /*
945  * Extract data from the input buffer BUF.  This will read up to WANT
946  * bytes from the buffer.  It will set *RETDATA to point at the bytes,
947  * and set *GOT to the number of bytes to be found there.  Any buffer
948  * call which uses BUF may change the contents of the buffer at *DATA,
949  * so the data should be fully processed before any further calls are
950  * made.  This returns 0 on success, or -1 on end of file, or -2 if
951  * out of memory, or an error code.
952  */
953 int
buf_read_data(struct buffer * buf,size_t want,char ** retdata,size_t * got)954 buf_read_data (struct buffer *buf, size_t want, char **retdata, size_t *got)
955 {
956     assert (buf->input != NULL);
957 
958     while (buf->data != NULL && buf->data->size == 0)
959     {
960 	struct buffer_data *next;
961 
962 	next = buf->data->next;
963 	buf_free_datas (buf->data, buf->data);
964 	buf->data = next;
965 	if (next == NULL)
966 	    buf->last = NULL;
967     }
968 
969     if (buf->data == NULL)
970     {
971 	struct buffer_data *data;
972 	int status;
973 	size_t get, nbytes;
974 
975 	data = get_buffer_data ();
976 	if (data == NULL)
977 	{
978 	    (*buf->memory_error) (buf);
979 	    return -2;
980 	}
981 
982 	buf->data = data;
983 	buf->last = data;
984 	data->next = NULL;
985 	data->bufp = data->text;
986 	data->size = 0;
987 
988 	if (want < BUFFER_DATA_SIZE)
989 	    get = want;
990 	else
991 	    get = BUFFER_DATA_SIZE;
992 	status = (*buf->input) (buf->closure, data->bufp, get,
993 				BUFFER_DATA_SIZE, &nbytes);
994 	if (status != 0)
995 	    return status;
996 
997 	data->size = nbytes;
998     }
999 
1000     *retdata = buf->data->bufp;
1001     if (want < buf->data->size)
1002     {
1003         *got = want;
1004 	buf->data->size -= want;
1005 	buf->data->bufp += want;
1006     }
1007     else
1008     {
1009         *got = buf->data->size;
1010 	buf->data->size = 0;
1011     }
1012 
1013     return 0;
1014 }
1015 
1016 
1017 
1018 /*
1019  * Copy lines from an input buffer to an output buffer.
1020  * This copies all complete lines (characters up to a
1021  * newline) from INBUF to OUTBUF.  Each line in OUTBUF is preceded by the
1022  * character COMMAND and a space.
1023  */
1024 void
buf_copy_lines(struct buffer * outbuf,struct buffer * inbuf,int command)1025 buf_copy_lines (struct buffer *outbuf, struct buffer *inbuf, int command)
1026 {
1027     while (1)
1028     {
1029 	struct buffer_data *data;
1030 	struct buffer_data *nldata;
1031 	char *nl;
1032 	int len;
1033 
1034 	/* See if there is a newline in INBUF.  */
1035 	nldata = NULL;
1036 	nl = NULL;
1037 	for (data = inbuf->data; data != NULL; data = data->next)
1038 	{
1039 	    nl = memchr (data->bufp, '\n', data->size);
1040 	    if (nl != NULL)
1041 	    {
1042 		nldata = data;
1043 		break;
1044 	    }
1045 	}
1046 
1047 	if (nldata == NULL)
1048 	{
1049 	    /* There are no more lines in INBUF.  */
1050 	    return;
1051 	}
1052 
1053 	/* Put in the command.  */
1054 	buf_append_char (outbuf, command);
1055 	buf_append_char (outbuf, ' ');
1056 
1057 	if (inbuf->data != nldata)
1058 	{
1059 	    /*
1060 	     * Simply move over all the buffers up to the one containing
1061 	     * the newline.
1062 	     */
1063 	    for (data = inbuf->data; data->next != nldata; data = data->next);
1064 	    data->next = NULL;
1065 	    buf_append_data (outbuf, inbuf->data, data);
1066 	    inbuf->data = nldata;
1067 	}
1068 
1069 	/*
1070 	 * If the newline is at the very end of the buffer, just move
1071 	 * the buffer onto OUTBUF.  Otherwise we must copy the data.
1072 	 */
1073 	len = nl + 1 - nldata->bufp;
1074 	if (len == nldata->size)
1075 	{
1076 	    inbuf->data = nldata->next;
1077 	    if (inbuf->data == NULL)
1078 		inbuf->last = NULL;
1079 
1080 	    nldata->next = NULL;
1081 	    buf_append_data (outbuf, nldata, nldata);
1082 	}
1083 	else
1084 	{
1085 	    buf_output (outbuf, nldata->bufp, len);
1086 	    nldata->bufp += len;
1087 	    nldata->size -= len;
1088 	}
1089     }
1090 }
1091 
1092 
1093 
1094 /*
1095  * Copy counted data from one buffer to another.  The count is an
1096  * integer, host size, host byte order (it is only used across a
1097  * pipe).  If there is enough data, it should be moved over.  If there
1098  * is not enough data, it should remain on the original buffer.  A
1099  * negative count is a special case.  if one is seen, *SPECIAL is set
1100  * to the (negative) count value and no additional data is gathered
1101  * from the buffer; normally *SPECIAL is set to 0.  This function
1102  * returns the number of bytes it needs to see in order to actually
1103  * copy something over.
1104  */
1105 int
buf_copy_counted(struct buffer * outbuf,struct buffer * inbuf,int * special)1106 buf_copy_counted (struct buffer *outbuf, struct buffer *inbuf, int *special)
1107 {
1108     *special = 0;
1109 
1110     while (1)
1111     {
1112 	struct buffer_data *data;
1113 	int need;
1114 	union
1115 	{
1116 	    char intbuf[sizeof (int)];
1117 	    int i;
1118 	} u;
1119 	char *intp;
1120 	int count;
1121 	struct buffer_data *start;
1122 	int startoff;
1123 	struct buffer_data *stop;
1124 	int stopwant;
1125 
1126 	/* See if we have enough bytes to figure out the count.  */
1127 	need = sizeof (int);
1128 	intp = u.intbuf;
1129 	for (data = inbuf->data; data != NULL; data = data->next)
1130 	{
1131 	    if (data->size >= need)
1132 	    {
1133 		memcpy (intp, data->bufp, need);
1134 		break;
1135 	    }
1136 	    memcpy (intp, data->bufp, data->size);
1137 	    intp += data->size;
1138 	    need -= data->size;
1139 	}
1140 	if (data == NULL)
1141 	{
1142 	    /* We don't have enough bytes to form an integer.  */
1143 	    return need;
1144 	}
1145 
1146 	count = u.i;
1147 	start = data;
1148 	startoff = need;
1149 
1150 	if (count < 0)
1151 	{
1152 	    /* A negative COUNT is a special case meaning that we
1153                don't need any further information.  */
1154 	    stop = start;
1155 	    stopwant = 0;
1156 	}
1157 	else
1158 	{
1159 	    /*
1160 	     * We have an integer in COUNT.  We have gotten all the
1161 	     * data from INBUF in all buffers before START, and we
1162 	     * have gotten STARTOFF bytes from START.  See if we have
1163 	     * enough bytes remaining in INBUF.
1164 	     */
1165 	    need = count - (start->size - startoff);
1166 	    if (need <= 0)
1167 	    {
1168 		stop = start;
1169 		stopwant = count;
1170 	    }
1171 	    else
1172 	    {
1173 		for (data = start->next; data != NULL; data = data->next)
1174 		{
1175 		    if (need <= data->size)
1176 			break;
1177 		    need -= data->size;
1178 		}
1179 		if (data == NULL)
1180 		{
1181 		    /* We don't have enough bytes.  */
1182 		    return need;
1183 		}
1184 		stop = data;
1185 		stopwant = need;
1186 	    }
1187 	}
1188 
1189 	/*
1190 	 * We have enough bytes.  Free any buffers in INBUF before
1191 	 * START, and remove STARTOFF bytes from START, so that we can
1192 	 * forget about STARTOFF.
1193 	 */
1194 	start->bufp += startoff;
1195 	start->size -= startoff;
1196 
1197 	if (start->size == 0)
1198 	    start = start->next;
1199 
1200 	if (stop->size == stopwant)
1201 	{
1202 	    stop = stop->next;
1203 	    stopwant = 0;
1204 	}
1205 
1206 	while (inbuf->data != start)
1207 	{
1208 	    data = inbuf->data;
1209 	    inbuf->data = data->next;
1210 	    buf_free_datas (data, data);
1211 	}
1212 
1213 	/* If COUNT is negative, set *SPECIAL and get out now.  */
1214 	if (count < 0)
1215 	{
1216 	    *special = count;
1217 	    return 0;
1218 	}
1219 
1220 	/*
1221 	 * We want to copy over the bytes from START through STOP.  We
1222 	 * only want STOPWANT bytes from STOP.
1223 	 */
1224 
1225 	if (start != stop)
1226 	{
1227 	    /* Attach the buffers from START through STOP to OUTBUF.  */
1228 	    for (data = start; data->next != stop; data = data->next);
1229 	    inbuf->data = stop;
1230 	    data->next = NULL;
1231 	    buf_append_data (outbuf, start, data);
1232 	}
1233 
1234 	if (stopwant > 0)
1235 	{
1236 	    buf_output (outbuf, stop->bufp, stopwant);
1237 	    stop->bufp += stopwant;
1238 	    stop->size -= stopwant;
1239 	}
1240     }
1241 
1242     /*NOTREACHED*/
1243 }
1244 
1245 
1246 
1247 int
buf_get_fd(struct buffer * buf)1248 buf_get_fd (struct buffer *buf)
1249 {
1250     if (buf->get_fd)
1251 	return (*buf->get_fd) (buf->closure);
1252     return -1;
1253 }
1254 
1255 
1256 
1257 /* Shut down a buffer.  This returns 0 on success, or an errno code.  */
1258 int
buf_shutdown(struct buffer * buf)1259 buf_shutdown (struct buffer *buf)
1260 {
1261     if (buf->shutdown) return (*buf->shutdown) (buf);
1262     return 0;
1263 }
1264 
1265 
1266 
1267 /* Certain types of communication input and output data in packets,
1268    where each packet is translated in some fashion.  The packetizing
1269    buffer type supports that, given a buffer which handles lower level
1270    I/O and a routine to translate the data in a packet.
1271 
1272    This code uses two bytes for the size of a packet, so packets are
1273    restricted to 65536 bytes in total.
1274 
1275    The translation functions should just translate; they may not
1276    significantly increase or decrease the amount of data.  The actual
1277    size of the initial data is part of the translated data.  The
1278    output translation routine may add up to PACKET_SLOP additional
1279    bytes, and the input translation routine should shrink the data
1280    correspondingly.  */
1281 
1282 # define PACKET_SLOP (100)
1283 
1284 /* This structure is the closure field of a packetizing buffer.  */
1285 
1286 struct packetizing_buffer
1287 {
1288     /* The underlying buffer.  */
1289     struct buffer *buf;
1290     /* The input translation function.  Exactly one of inpfn and outfn
1291        will be NULL.  The input translation function should
1292        untranslate the data in INPUT, storing the result in OUTPUT.
1293        SIZE is the amount of data in INPUT, and is also the size of
1294        OUTPUT.  This should return 0 on success, or an errno code.  */
1295     int (*inpfn) (void *fnclosure, const char *input, char *output,
1296 			size_t size);
1297     /* The output translation function.  This should translate the
1298        data in INPUT, storing the result in OUTPUT.  The first two
1299        bytes in INPUT will be the size of the data, and so will SIZE.
1300        This should set *TRANSLATED to the amount of translated data in
1301        OUTPUT.  OUTPUT is large enough to hold SIZE + PACKET_SLOP
1302        bytes.  This should return 0 on success, or an errno code.  */
1303     int (*outfn) (void *fnclosure, const char *input, char *output,
1304 			size_t size, size_t *translated);
1305     /* A closure for the translation function.  */
1306     void *fnclosure;
1307     /* For an input buffer, we may have to buffer up data here.  */
1308     /* This is non-zero if the buffered data has been translated.
1309        Otherwise, the buffered data has not been translated, and starts
1310        with the two byte packet size.  */
1311     bool translated;
1312     /* The amount of buffered data.  */
1313     size_t holdsize;
1314     /* The buffer allocated to hold the data.  */
1315     char *holdbuf;
1316     /* The size of holdbuf.  */
1317     size_t holdbufsize;
1318     /* If translated is set, we need another data pointer to track
1319        where we are in holdbuf.  If translated is clear, then this
1320        pointer is not used.  */
1321     char *holddata;
1322 };
1323 
1324 
1325 
1326 static int packetizing_buffer_input (void *, char *, size_t, size_t, size_t *);
1327 static int packetizing_buffer_output (void *, const char *, size_t, size_t *);
1328 static int packetizing_buffer_flush (void *);
1329 static int packetizing_buffer_block (void *, bool);
1330 static int packetizing_buffer_get_fd (void *);
1331 static int packetizing_buffer_shutdown (struct buffer *);
1332 
1333 
1334 
1335 /* Create a packetizing buffer.  */
1336 struct buffer *
packetizing_buffer_initialize(struct buffer * buf,int (* inpfn)(void *,const char *,char *,size_t),int (* outfn)(void *,const char *,char *,size_t,size_t *),void * fnclosure,void (* memory)(struct buffer *))1337 packetizing_buffer_initialize (struct buffer *buf,
1338                                int (*inpfn) (void *, const char *, char *,
1339                                              size_t),
1340                                int (*outfn) (void *, const char *, char *,
1341                                              size_t, size_t *),
1342                                void *fnclosure,
1343                                void (*memory) (struct buffer *))
1344 {
1345     struct packetizing_buffer *pb;
1346 
1347     pb = xmalloc (sizeof *pb);
1348     memset (pb, 0, sizeof *pb);
1349 
1350     pb->buf = buf;
1351     pb->inpfn = inpfn;
1352     pb->outfn = outfn;
1353     pb->fnclosure = fnclosure;
1354 
1355     if (inpfn != NULL)
1356     {
1357 	/* Add PACKET_SLOP to handle larger translated packets, and
1358            add 2 for the count.  This buffer is increased if
1359            necessary.  */
1360 	pb->holdbufsize = BUFFER_DATA_SIZE + PACKET_SLOP + 2;
1361 	pb->holdbuf = xmalloc (pb->holdbufsize);
1362     }
1363 
1364     return buf_initialize (inpfn != NULL ? packetizing_buffer_input : NULL,
1365 			   inpfn != NULL ? NULL : packetizing_buffer_output,
1366 			   inpfn != NULL ? NULL : packetizing_buffer_flush,
1367 			   packetizing_buffer_block,
1368 			   packetizing_buffer_get_fd,
1369 			   packetizing_buffer_shutdown,
1370 			   memory,
1371 			   pb);
1372 }
1373 
1374 
1375 
1376 /* Input data from a packetizing buffer.  */
1377 static int
packetizing_buffer_input(void * closure,char * data,size_t need,size_t size,size_t * got)1378 packetizing_buffer_input (void *closure, char *data, size_t need, size_t size,
1379                           size_t *got)
1380 {
1381     struct packetizing_buffer *pb = closure;
1382 
1383     *got = 0;
1384 
1385     if (pb->holdsize > 0 && pb->translated)
1386     {
1387 	size_t copy;
1388 
1389 	copy = pb->holdsize;
1390 
1391 	if (copy > size)
1392 	{
1393 	    memcpy (data, pb->holddata, size);
1394 	    pb->holdsize -= size;
1395 	    pb->holddata += size;
1396 	    *got = size;
1397 	    return 0;
1398 	}
1399 
1400 	memcpy (data, pb->holddata, copy);
1401 	pb->holdsize = 0;
1402 	pb->translated = false;
1403 
1404 	data += copy;
1405 	need -= copy;
1406 	size -= copy;
1407 	*got = copy;
1408     }
1409 
1410     while (need > 0 || *got == 0)
1411     {
1412 	int status;
1413 	size_t get, nread, count, tcount;
1414 	char *bytes;
1415 	static char *stackoutbuf = NULL;
1416 	char *inbuf, *outbuf;
1417 
1418 	if (!stackoutbuf)
1419 	    stackoutbuf = xmalloc (BUFFER_DATA_SIZE + PACKET_SLOP);
1420 
1421 	/* If we don't already have the two byte count, get it.  */
1422 	if (pb->holdsize < 2)
1423 	{
1424 	    get = 2 - pb->holdsize;
1425 	    status = buf_read_data (pb->buf, get, &bytes, &nread);
1426 	    if (status != 0)
1427 	    {
1428 		/* buf_read_data can return -2, but a buffer input
1429                    function is only supposed to return -1, 0, or an
1430                    error code.  */
1431 		if (status == -2)
1432 		    status = ENOMEM;
1433 		return status;
1434 	    }
1435 
1436 	    if (nread == 0)
1437 	    {
1438 		/* The buffer is in nonblocking mode, and we didn't
1439                    manage to read anything.  */
1440 		return 0;
1441 	    }
1442 
1443 	    if (get == 1)
1444 		pb->holdbuf[1] = bytes[0];
1445 	    else
1446 	    {
1447 		pb->holdbuf[0] = bytes[0];
1448 		if (nread < 2)
1449 		{
1450 		    /* We only got one byte, but we needed two.  Stash
1451                        the byte we got, and try again.  */
1452 		    pb->holdsize = 1;
1453 		    continue;
1454 		}
1455 		pb->holdbuf[1] = bytes[1];
1456 	    }
1457 	    pb->holdsize = 2;
1458 	}
1459 
1460 	/* Read the packet.  */
1461 
1462 	count = (((pb->holdbuf[0] & 0xff) << 8)
1463 		 + (pb->holdbuf[1] & 0xff));
1464 
1465 	if (count + 2 > pb->holdbufsize)
1466 	{
1467 	    char *n;
1468 
1469 	    /* We didn't allocate enough space in the initialize
1470                function.  */
1471 
1472 	    n = xrealloc (pb->holdbuf, count + 2);
1473 	    if (n == NULL)
1474 	    {
1475 		(*pb->buf->memory_error) (pb->buf);
1476 		return ENOMEM;
1477 	    }
1478 	    pb->holdbuf = n;
1479 	    pb->holdbufsize = count + 2;
1480 	}
1481 
1482 	get = count - (pb->holdsize - 2);
1483 
1484 	status = buf_read_data (pb->buf, get, &bytes, &nread);
1485 	if (status != 0)
1486 	{
1487 	    /* buf_read_data can return -2, but a buffer input
1488                function is only supposed to return -1, 0, or an error
1489                code.  */
1490 	    if (status == -2)
1491 		status = ENOMEM;
1492 	    return status;
1493 	}
1494 
1495 	if (nread == 0)
1496 	{
1497 	    /* We did not get any data.  Presumably the buffer is in
1498                nonblocking mode.  */
1499 	    return 0;
1500 	}
1501 
1502 	if (nread < get)
1503 	{
1504 	    /* We did not get all the data we need to fill the packet.
1505                buf_read_data does not promise to return all the bytes
1506                requested, so we must try again.  */
1507 	    memcpy (pb->holdbuf + pb->holdsize, bytes, nread);
1508 	    pb->holdsize += nread;
1509 	    continue;
1510 	}
1511 
1512 	/* We have a complete untranslated packet of COUNT bytes.  */
1513 
1514 	if (pb->holdsize == 2)
1515 	{
1516 	    /* We just read the entire packet (the 2 bytes in
1517                PB->HOLDBUF are the size).  Save a memcpy by
1518                translating directly from BYTES.  */
1519 	    inbuf = bytes;
1520 	}
1521 	else
1522 	{
1523 	    /* We already had a partial packet in PB->HOLDBUF.  We
1524                need to copy the new data over to make the input
1525                contiguous.  */
1526 	    memcpy (pb->holdbuf + pb->holdsize, bytes, nread);
1527 	    inbuf = pb->holdbuf + 2;
1528 	}
1529 
1530 	if (count <= BUFFER_DATA_SIZE + PACKET_SLOP)
1531 	    outbuf = stackoutbuf;
1532 	else
1533 	{
1534 	    outbuf = xmalloc (count);
1535 	    if (outbuf == NULL)
1536 	    {
1537 		(*pb->buf->memory_error) (pb->buf);
1538 		return ENOMEM;
1539 	    }
1540 	}
1541 
1542 	status = (*pb->inpfn) (pb->fnclosure, inbuf, outbuf, count);
1543 	if (status != 0)
1544 	    return status;
1545 
1546 	/* The first two bytes in the translated buffer are the real
1547            length of the translated data.  */
1548 	tcount = ((outbuf[0] & 0xff) << 8) + (outbuf[1] & 0xff);
1549 
1550 	if (tcount > count)
1551 	    error (1, 0, "Input translation failure");
1552 
1553 	if (tcount > size)
1554 	{
1555 	    /* We have more data than the caller has provided space
1556                for.  We need to save some of it for the next call.  */
1557 
1558 	    memcpy (data, outbuf + 2, size);
1559 	    *got += size;
1560 
1561 	    pb->holdsize = tcount - size;
1562 	    memcpy (pb->holdbuf, outbuf + 2 + size, tcount - size);
1563 	    pb->holddata = pb->holdbuf;
1564 	    pb->translated = true;
1565 
1566 	    if (outbuf != stackoutbuf)
1567 		free (outbuf);
1568 
1569 	    return 0;
1570 	}
1571 
1572 	memcpy (data, outbuf + 2, tcount);
1573 
1574 	if (outbuf != stackoutbuf)
1575 	    free (outbuf);
1576 
1577 	pb->holdsize = 0;
1578 
1579 	data += tcount;
1580 	need -= tcount;
1581 	size -= tcount;
1582 	*got += tcount;
1583     }
1584 
1585     return 0;
1586 }
1587 
1588 
1589 
1590 /* Output data to a packetizing buffer.  */
1591 static int
packetizing_buffer_output(void * closure,const char * data,size_t have,size_t * wrote)1592 packetizing_buffer_output (void *closure, const char *data, size_t have,
1593                            size_t *wrote)
1594 {
1595     struct packetizing_buffer *pb = closure;
1596     static char *inbuf = NULL;  /* These two buffers are static so that they
1597 				 * depend on the size of BUFFER_DATA_SIZE yet
1598 				 * still only be allocated once per run.
1599 				 */
1600     static char *stack_outbuf = NULL;
1601     struct buffer_data *outdata = NULL; /* Initialize to silence -Wall.  Dumb.
1602 					 */
1603     char *outbuf;
1604     size_t size, translated;
1605     int status;
1606 
1607     /* It would be easy to xmalloc a buffer, but I don't think this
1608        case can ever arise.  */
1609     assert (have <= BUFFER_DATA_SIZE);
1610 
1611     if (!inbuf)
1612     {
1613 	inbuf = xmalloc (BUFFER_DATA_SIZE + 2);
1614         stack_outbuf = xmalloc (BUFFER_DATA_SIZE + PACKET_SLOP + 4);
1615     }
1616 
1617     inbuf[0] = (have >> 8) & 0xff;
1618     inbuf[1] = have & 0xff;
1619     memcpy (inbuf + 2, data, have);
1620 
1621     size = have + 2;
1622 
1623     /* The output function is permitted to add up to PACKET_SLOP
1624        bytes, and we need 2 bytes for the size of the translated data.
1625        If we can guarantee that the result will fit in a buffer_data,
1626        we translate directly into one to avoid a memcpy in buf_output.  */
1627     if (size + PACKET_SLOP + 2 > BUFFER_DATA_SIZE)
1628 	outbuf = stack_outbuf;
1629     else
1630     {
1631 	outdata = get_buffer_data ();
1632 	if (outdata == NULL)
1633 	{
1634 	    (*pb->buf->memory_error) (pb->buf);
1635 	    return ENOMEM;
1636 	}
1637 
1638 	outdata->next = NULL;
1639 	outdata->bufp = outdata->text;
1640 
1641 	outbuf = outdata->text;
1642     }
1643 
1644     status = (*pb->outfn) (pb->fnclosure, inbuf, outbuf + 2, size,
1645 			   &translated);
1646     if (status != 0)
1647 	return status;
1648 
1649     /* The output function is permitted to add up to PACKET_SLOP
1650        bytes.  */
1651     assert (translated <= size + PACKET_SLOP);
1652 
1653     outbuf[0] = (translated >> 8) & 0xff;
1654     outbuf[1] = translated & 0xff;
1655 
1656     if (outbuf == stack_outbuf)
1657 	buf_output (pb->buf, outbuf, translated + 2);
1658     else
1659     {
1660 	outdata->size = translated + 2;
1661 	buf_append_data (pb->buf, outdata, outdata);
1662     }
1663 
1664     *wrote = have;
1665 
1666     /* We will only be here because buf_send_output was called on the
1667        packetizing buffer.  That means that we should now call
1668        buf_send_output on the underlying buffer.  */
1669     return buf_send_output (pb->buf);
1670 }
1671 
1672 
1673 
1674 /* Flush data to a packetizing buffer.  */
1675 static int
packetizing_buffer_flush(void * closure)1676 packetizing_buffer_flush (void *closure)
1677 {
1678     struct packetizing_buffer *pb = closure;
1679 
1680     /* Flush the underlying buffer.  Note that if the original call to
1681        buf_flush passed 1 for the BLOCK argument, then the buffer will
1682        already have been set into blocking mode, so we should always
1683        pass 0 here.  */
1684     return buf_flush (pb->buf, 0);
1685 }
1686 
1687 
1688 
1689 /* The block routine for a packetizing buffer.  */
1690 static int
packetizing_buffer_block(void * closure,bool block)1691 packetizing_buffer_block (void *closure, bool block)
1692 {
1693     struct packetizing_buffer *pb = closure;
1694 
1695     if (block)
1696 	return set_block (pb->buf);
1697     else
1698 	return set_nonblock (pb->buf);
1699 }
1700 
1701 
1702 
1703 /* Return the file descriptor underlying any child buffers.  */
1704 static int
packetizing_buffer_get_fd(void * closure)1705 packetizing_buffer_get_fd (void *closure)
1706 {
1707     struct packetizing_buffer *cb = closure;
1708     return buf_get_fd (cb->buf);
1709 }
1710 
1711 
1712 
1713 /* Shut down a packetizing buffer.  */
1714 static int
packetizing_buffer_shutdown(struct buffer * buf)1715 packetizing_buffer_shutdown (struct buffer *buf)
1716 {
1717     struct packetizing_buffer *pb = buf->closure;
1718 
1719     return buf_shutdown (pb->buf);
1720 }
1721 
1722 
1723 
1724 /* All server communication goes through buffer structures.  Most of
1725    the buffers are built on top of a file descriptor.  This structure
1726    is used as the closure field in a buffer.  */
1727 
1728 struct fd_buffer
1729 {
1730     /* The file descriptor.  */
1731     int fd;
1732     /* Nonzero if the file descriptor is in blocking mode.  */
1733     int blocking;
1734     /* The child process id when fd is a pipe.  */
1735     pid_t child_pid;
1736     /* The connection info, when fd is a pipe to a server.  */
1737     cvsroot_t *root;
1738 };
1739 
1740 static int fd_buffer_input (void *, char *, size_t, size_t, size_t *);
1741 static int fd_buffer_output (void *, const char *, size_t, size_t *);
1742 static int fd_buffer_flush (void *);
1743 static int fd_buffer_block (void *, bool);
1744 static int fd_buffer_get_fd (void *);
1745 static int fd_buffer_shutdown (struct buffer *);
1746 
1747 /* Initialize a buffer built on a file descriptor.  FD is the file
1748    descriptor.  INPUT is nonzero if this is for input, zero if this is
1749    for output.  MEMORY is the function to call when a memory error
1750    occurs.  */
1751 
1752 struct buffer *
fd_buffer_initialize(int fd,pid_t child_pid,cvsroot_t * root,bool input,void (* memory)(struct buffer *))1753 fd_buffer_initialize (int fd, pid_t child_pid, cvsroot_t *root, bool input,
1754                       void (*memory) (struct buffer *))
1755 {
1756     struct fd_buffer *n;
1757 
1758     n = xmalloc (sizeof *n);
1759     n->fd = fd;
1760     n->child_pid = child_pid;
1761     n->root = root;
1762     fd_buffer_block (n, true);
1763     return buf_initialize (input ? fd_buffer_input : NULL,
1764 			   input ? NULL : fd_buffer_output,
1765 			   input ? NULL : fd_buffer_flush,
1766 			   fd_buffer_block, fd_buffer_get_fd,
1767 			   fd_buffer_shutdown,
1768 			   memory,
1769 			   n);
1770 }
1771 
1772 
1773 
1774 /* The buffer input function for a buffer built on a file descriptor.
1775  *
1776  * In non-blocking mode, this function will read as many bytes as it can in a
1777  * single try, up to SIZE bytes, and return.
1778  *
1779  * In blocking mode with NEED > 0, this function will read as many bytes as it
1780  * can but will not return until it has read at least NEED bytes.
1781  *
1782  * In blocking mode with NEED == 0, this function will block until it can read
1783  * either at least one byte or EOF, then read as many bytes as are available
1784  * and return.  At the very least, compress_buffer_shutdown depends on this
1785  * behavior to read EOF and can loop indefinitely without it.
1786  *
1787  * ASSUMPTIONS
1788  *   NEED <= SIZE.
1789  *
1790  * INPUTS
1791  *   closure	Our FD_BUFFER struct.
1792  *   data	The start of our input buffer.
1793  *   need	How many bytes our caller needs.
1794  *   size	How many bytes are available in DATA.
1795  *   got	Where to store the number of bytes read.
1796  *
1797  * OUTPUTS
1798  *   data	Filled with bytes read.
1799  *   *got	Number of bytes actually read into DATA.
1800  *
1801  * RETURNS
1802  *   errno	On error.
1803  *   -1		On EOF.
1804  *   0		Otherwise.
1805  *
1806  * ERRORS
1807  *   This function can return an error if fd_buffer_block(), or the system
1808  *   read() or select() calls do.
1809  */
1810 static int
fd_buffer_input(void * closure,char * data,size_t need,size_t size,size_t * got)1811 fd_buffer_input (void *closure, char *data, size_t need, size_t size,
1812 		 size_t *got)
1813 {
1814     struct fd_buffer *fb = closure;
1815     int nbytes;
1816 
1817     assert (need <= size);
1818 
1819     *got = 0;
1820 
1821     if (fb->blocking)
1822     {
1823 	int status;
1824 	fd_set readfds;
1825 
1826 	/* Set non-block.  */
1827         status = fd_buffer_block (fb, false);
1828 	if (status != 0) return status;
1829 
1830 	FD_ZERO (&readfds);
1831 	FD_SET (fb->fd, &readfds);
1832 	do
1833 	{
1834 	    int numfds;
1835 
1836 	    do {
1837 		/* This used to select on exceptions too, but as far
1838 		   as I know there was never any reason to do that and
1839 		   SCO doesn't let you select on exceptions on pipes.  */
1840 		numfds = fd_select (fb->fd + 1, &readfds, NULL, NULL, NULL);
1841 		if (numfds < 0 && errno != EINTR)
1842 		{
1843 		    status = errno;
1844 		    goto block_done;
1845 		}
1846 	    } while (numfds < 0);
1847 
1848 	    nbytes = read (fb->fd, data + *got, size - *got);
1849 
1850 	    if (nbytes == 0)
1851 	    {
1852 		/* End of file.  This assumes that we are using POSIX or BSD
1853 		   style nonblocking I/O.  On System V we will get a zero
1854 		   return if there is no data, even when not at EOF.  */
1855 		if (*got)
1856 		{
1857 		    /* We already read some data, so return no error, counting
1858 		     * on the fact that we will read EOF again next time.
1859 		     */
1860 		    status = 0;
1861 		    break;
1862 		}
1863 		else
1864 		{
1865 		    /* Return EOF.  */
1866 		    status = -1;
1867 		    break;
1868 		}
1869 	    }
1870 
1871 	    if (nbytes < 0)
1872 	    {
1873 		/* Some error occurred.  */
1874 		if (!blocking_error (errno))
1875 		{
1876 		    status = errno;
1877 		    break;
1878 		}
1879 		/* else Everything's fine, we just didn't get any data.  */
1880 	    }
1881 
1882 	    *got += nbytes;
1883 	} while (*got < need);
1884 
1885 block_done:
1886 	if (status == 0 || status == -1)
1887 	{
1888 	    int newstatus;
1889 
1890 	    /* OK or EOF - Reset block.  */
1891 	    newstatus = fd_buffer_block (fb, true);
1892 	    if (newstatus) status = newstatus;
1893 	}
1894 	return status;
1895     }
1896 
1897     /* The above will always return.  Handle non-blocking read.  */
1898     nbytes = read (fb->fd, data, size);
1899 
1900     if (nbytes > 0)
1901     {
1902 	*got = nbytes;
1903 	return 0;
1904     }
1905 
1906     if (nbytes == 0)
1907 	/* End of file.  This assumes that we are using POSIX or BSD
1908 	   style nonblocking I/O.  On System V we will get a zero
1909 	   return if there is no data, even when not at EOF.  */
1910 	return -1;
1911 
1912     /* Some error occurred.  */
1913     if (blocking_error (errno))
1914 	/* Everything's fine, we just didn't get any data.  */
1915 	return 0;
1916 
1917     return errno;
1918 }
1919 
1920 
1921 
1922 /* The buffer output function for a buffer built on a file descriptor.  */
1923 
1924 static int
fd_buffer_output(void * closure,const char * data,size_t have,size_t * wrote)1925 fd_buffer_output (void *closure, const char *data, size_t have, size_t *wrote)
1926 {
1927     struct fd_buffer *fd = closure;
1928 
1929     *wrote = 0;
1930 
1931     while (have > 0)
1932     {
1933 	int nbytes;
1934 
1935 	nbytes = write (fd->fd, data, have);
1936 
1937 	if (nbytes <= 0)
1938 	{
1939 	    if (! fd->blocking
1940 		&& (nbytes == 0 || blocking_error (errno)))
1941 	    {
1942 		/* A nonblocking write failed to write any data.  Just
1943 		   return.  */
1944 		return 0;
1945 	    }
1946 
1947 	    /* Some sort of error occurred.  */
1948 
1949 	    if (nbytes == 0)
1950 		return EIO;
1951 
1952 	    return errno;
1953 	}
1954 
1955 	*wrote += nbytes;
1956 	data += nbytes;
1957 	have -= nbytes;
1958     }
1959 
1960     return 0;
1961 }
1962 
1963 
1964 
1965 /* The buffer flush function for a buffer built on a file descriptor.  */
1966 static int
fd_buffer_flush(void * closure)1967 fd_buffer_flush (void *closure)
1968 {
1969     /* We don't need to do anything here.  Our fd doesn't have its own buffer
1970      * and syncing won't do anything but slow us down.
1971      *
1972      * struct fd_buffer *fb = closure;
1973      *
1974      * if (fsync (fb->fd) < 0 && errno != EROFS && errno != EINVAL)
1975      *     return errno;
1976      */
1977     return 0;
1978 }
1979 
1980 
1981 
1982 static struct stat devnull;
1983 static int devnull_set = -1;
1984 
1985 /* The buffer block function for a buffer built on a file descriptor.  */
1986 static int
fd_buffer_block(void * closure,bool block)1987 fd_buffer_block (void *closure, bool block)
1988 {
1989     struct fd_buffer *fb = closure;
1990 # if defined (F_GETFL) && defined (O_NONBLOCK) && defined (F_SETFL)
1991     int flags;
1992 
1993     flags = fcntl (fb->fd, F_GETFL, 0);
1994     if (flags < 0)
1995 	return errno;
1996 
1997     if (block)
1998 	flags &= ~O_NONBLOCK;
1999     else
2000 	flags |= O_NONBLOCK;
2001 
2002     if (fcntl (fb->fd, F_SETFL, flags) < 0)
2003     {
2004 	/*
2005 	 * BSD returns ENODEV when we try to set block/nonblock on /dev/null.
2006 	 * BSDI returns ENOTTY when we try to set block/nonblock on /dev/null.
2007 	 */
2008 	struct stat sb;
2009 	int save_errno = errno;
2010 	bool isdevnull = false;
2011 
2012 	if (devnull_set == -1)
2013 	    devnull_set = stat ("/dev/null", &devnull);
2014 
2015 	if (devnull_set >= 0)
2016 	    /* Equivalent to /dev/null ? */
2017 	    isdevnull = (fstat (fb->fd, &sb) >= 0
2018 			 && sb.st_dev == devnull.st_dev
2019 			 && sb.st_ino == devnull.st_ino
2020 			 && sb.st_mode == devnull.st_mode
2021 			 && sb.st_uid == devnull.st_uid
2022 			 && sb.st_gid == devnull.st_gid
2023 			 && sb.st_size == devnull.st_size
2024 			 && sb.st_blocks == devnull.st_blocks
2025 			 && sb.st_blksize == devnull.st_blksize);
2026 	if (isdevnull)
2027 	    errno = 0;
2028 	else
2029 	{
2030 	    errno = save_errno;
2031 	    return errno;
2032 	}
2033     }
2034 # endif /* F_GETFL && O_NONBLOCK && F_SETFL */
2035 
2036     fb->blocking = block;
2037 
2038     return 0;
2039 }
2040 
2041 
2042 
2043 static int
fd_buffer_get_fd(void * closure)2044 fd_buffer_get_fd (void *closure)
2045 {
2046     struct fd_buffer *fb = closure;
2047     return fb->fd;
2048 }
2049 
2050 
2051 
2052 /* The buffer shutdown function for a buffer built on a file descriptor.
2053  *
2054  * This function disposes of memory allocated for this buffer.
2055  */
2056 static int
fd_buffer_shutdown(struct buffer * buf)2057 fd_buffer_shutdown (struct buffer *buf)
2058 {
2059     struct fd_buffer *fb = buf->closure;
2060     struct stat s;
2061     bool closefd, statted;
2062 
2063     /* Must be an open pipe, socket, or file.  What could go wrong? */
2064     if (fstat (fb->fd, &s) == -1) statted = false;
2065     else statted = true;
2066     /* Don't bother to try closing the FD if we couldn't stat it.  This
2067      * probably won't work.
2068      *
2069      * (buf_shutdown() on some of the server/child communication pipes is
2070      * getting EBADF on both the fstat and the close.  I'm not sure why -
2071      * perhaps they were alredy closed somehow?
2072      */
2073     closefd = statted;
2074 
2075     /* Flush the buffer if possible.  */
2076     if (buf->flush)
2077     {
2078 	buf_flush (buf, 1);
2079 	buf->flush = NULL;
2080     }
2081 
2082     if (buf->input)
2083     {
2084 	/* There used to be a check here for unread data in the buffer of
2085 	 * the pipe, but it was deemed unnecessary and possibly dangerous.  In
2086 	 * some sense it could be second-guessing the caller who requested it
2087 	 * closed, as well.
2088 	 */
2089 
2090 /* FIXME:
2091  *
2092  * This mess of #ifdefs is hard to read.  There must be some relation between
2093  * the macros being checked which at least deserves comments - if
2094  * SHUTDOWN_SERVER, NO_SOCKET_TO_FD, & START_RSH_WITH_POPEN_RW were completely
2095  * independant, then the next few lines could easily refuse to compile.
2096  *
2097  * The note below about START_RSH_WITH_POPEN_RW never being set when
2098  * SHUTDOWN_SERVER is defined means that this code would always break on
2099  * systems with SHUTDOWN_SERVER defined and thus the comment must now be
2100  * incorrect or the code was broken since the comment was written.
2101  */
2102 # ifdef SHUTDOWN_SERVER
2103 	if (fb->root && fb->root->method != server_method)
2104 # endif
2105 # ifndef NO_SOCKET_TO_FD
2106 	{
2107 	    /* shutdown() sockets */
2108 	    if (statted && S_ISSOCK (s.st_mode))
2109 		shutdown (fb->fd, 0);
2110 	}
2111 # endif /* NO_SOCKET_TO_FD */
2112 # ifdef START_RSH_WITH_POPEN_RW
2113 /* Can't be set with SHUTDOWN_SERVER defined */
2114 	/* FIXME: This is now certainly broken since pclose is defined by ANSI
2115 	 * C to accept a FILE * argument.  The switch will need to happen at a
2116 	 * higher abstraction level to switch between initializing stdio & fd
2117 	 * buffers on systems that need this (or maybe an fd buffer that keeps
2118 	 * track of the FILE * could be used - I think flushing the stream
2119 	 * before beginning exclusive access via the FD is OK.
2120 	 */
2121 	else if (fb->root && pclose (fb->fd) == EOF)
2122 	{
2123 	    error (1, errno, "closing connection to %s",
2124 		   fb->root->hostname);
2125 	    closefd = false;
2126 	}
2127 # endif /* START_RSH_WITH_POPEN_RW */
2128 
2129 	buf->input = NULL;
2130     }
2131     else if (buf->output)
2132     {
2133 # ifdef SHUTDOWN_SERVER
2134 	/* FIXME:  Should have a SHUTDOWN_SERVER_INPUT &
2135 	 * SHUTDOWN_SERVER_OUTPUT
2136 	 */
2137 	if (fb->root && fb->root->method == server_method)
2138 	    SHUTDOWN_SERVER (fb->fd);
2139 	else
2140 # endif
2141 # ifndef NO_SOCKET_TO_FD
2142 	/* shutdown() sockets */
2143 	if (statted && S_ISSOCK (s.st_mode))
2144 	    shutdown (fb->fd, 1);
2145 # else
2146 	{
2147 	/* I'm not sure I like this empty block, but the alternative
2148 	 * is another nested NO_SOCKET_TO_FD switch as above.
2149 	 */
2150 	}
2151 # endif /* NO_SOCKET_TO_FD */
2152 
2153 	buf->output = NULL;
2154     }
2155 
2156     if (statted && closefd && close (fb->fd) == -1)
2157     {
2158 	if (server_active)
2159 	{
2160             /* Syslog this? */
2161 	}
2162 # ifdef CLIENT_SUPPORT
2163 	else if (fb->root)
2164             error (1, errno, "closing down connection to %s",
2165                    fb->root->hostname);
2166 	    /* EXITS */
2167 # endif /* CLIENT_SUPPORT */
2168 
2169 	error (0, errno, "closing down buffer");
2170     }
2171 
2172     /* If we were talking to a process, make sure it exited */
2173     if (fb->child_pid)
2174     {
2175 	int w;
2176 
2177 	do
2178 	    w = waitpid (fb->child_pid, NULL, 0);
2179 	while (w == -1 && errno == EINTR);
2180 	if (w == -1)
2181 	    error (1, errno, "waiting for process %d", fb->child_pid);
2182     }
2183 
2184     free (buf->closure);
2185     buf->closure = NULL;
2186 
2187     return 0;
2188 }
2189 #endif /* defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) */
2190