1 /* Code for the buffer data structure. */
2
3 #include <assert.h>
4 #include "cvs.h"
5 #include "buffer.h"
6
7 #if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT)
8
9 /* OS/2 doesn't have EIO. FIXME: this whole notion of turning
10 a different error into EIO strikes me as pretty dubious. */
11 #if !defined (EIO)
12 #define EIO EBADPOS
13 #endif
14
15 /* Linked list of available buffer_data structures. */
16 static struct buffer_data *free_buffer_data;
17
18 /* Local functions. */
19 static void buf_default_memory_error PROTO ((struct buffer *));
20 static void allocate_buffer_datas PROTO((void));
21 static struct buffer_data *get_buffer_data PROTO((void));
22
23 /* Initialize a buffer structure. */
24
25 struct buffer *
26 buf_initialize (input, output, flush, block, shutdown, memory, closure)
27 int (*input) PROTO((void *, char *, int, int, int *));
28 int (*output) PROTO((void *, const char *, int, int *));
29 int (*flush) PROTO((void *));
30 int (*block) PROTO((void *, int));
31 int (*shutdown) PROTO((void *));
32 void (*memory) PROTO((struct buffer *));
33 void *closure;
34 {
35 struct buffer *buf;
36
37 buf = (struct buffer *) xmalloc (sizeof (struct buffer));
38 buf->data = NULL;
39 buf->last = NULL;
40 buf->nonblocking = 0;
41 buf->input = input;
42 buf->output = output;
43 buf->flush = flush;
44 buf->block = block;
45 buf->shutdown = shutdown;
46 buf->memory_error = memory ? memory : buf_default_memory_error;
47 buf->closure = closure;
48 return buf;
49 }
50
51 /* Free a buffer structure. */
52
53 void
buf_free(buf)54 buf_free (buf)
55 struct buffer *buf;
56 {
57 if (buf->data != NULL)
58 {
59 buf->last->next = free_buffer_data;
60 free_buffer_data = buf->data;
61 }
62 free (buf);
63 }
64
65 /* Initialize a buffer structure which is not to be used for I/O. */
66
67 struct buffer *
68 buf_nonio_initialize (memory)
69 void (*memory) PROTO((struct buffer *));
70 {
71 return (buf_initialize
72 ((int (*) PROTO((void *, char *, int, int, int *))) NULL,
73 (int (*) PROTO((void *, const char *, int, int *))) NULL,
74 (int (*) PROTO((void *))) NULL,
75 (int (*) PROTO((void *, int))) NULL,
76 (int (*) PROTO((void *))) NULL,
77 memory,
78 (void *) NULL));
79 }
80
81 /* Default memory error handler. */
82
83 static void
buf_default_memory_error(buf)84 buf_default_memory_error (buf)
85 struct buffer *buf;
86 {
87 error (1, 0, "out of memory");
88 }
89
90 /* Allocate more buffer_data structures. */
91
92 static void
allocate_buffer_datas()93 allocate_buffer_datas ()
94 {
95 struct buffer_data *alc;
96 char *space;
97 int i;
98
99 /* Allocate buffer_data structures in blocks of 16. */
100 #define ALLOC_COUNT (16)
101
102 alc = ((struct buffer_data *)
103 malloc (ALLOC_COUNT * sizeof (struct buffer_data)));
104 if (alc == NULL)
105 return;
106 space = (char *) valloc (ALLOC_COUNT * BUFFER_DATA_SIZE);
107 if (space == NULL) {
108 free(alc);
109 return;
110 }
111 for (i = 0; i < ALLOC_COUNT; i++, alc++, space += BUFFER_DATA_SIZE)
112 {
113 alc->next = free_buffer_data;
114 free_buffer_data = alc;
115 alc->text = space;
116 }
117 }
118
119 /* Get a new buffer_data structure. */
120
121 static struct buffer_data *
get_buffer_data()122 get_buffer_data ()
123 {
124 struct buffer_data *ret;
125
126 if (free_buffer_data == NULL)
127 {
128 allocate_buffer_datas ();
129 if (free_buffer_data == NULL)
130 return NULL;
131 }
132
133 ret = free_buffer_data;
134 free_buffer_data = ret->next;
135 return ret;
136 }
137
138 /* See whether a buffer is empty. */
139
140 int
buf_empty_p(buf)141 buf_empty_p (buf)
142 struct buffer *buf;
143 {
144 struct buffer_data *data;
145
146 for (data = buf->data; data != NULL; data = data->next)
147 if (data->size > 0)
148 return 0;
149 return 1;
150 }
151
152 #ifdef SERVER_FLOWCONTROL
153 /*
154 * Count how much data is stored in the buffer..
155 * Note that each buffer is a malloc'ed chunk BUFFER_DATA_SIZE.
156 */
157
158 int
buf_count_mem(buf)159 buf_count_mem (buf)
160 struct buffer *buf;
161 {
162 struct buffer_data *data;
163 int mem = 0;
164
165 for (data = buf->data; data != NULL; data = data->next)
166 mem += BUFFER_DATA_SIZE;
167
168 return mem;
169 }
170 #endif /* SERVER_FLOWCONTROL */
171
172 /* Add data DATA of length LEN to BUF. */
173
174 void
buf_output(buf,data,len)175 buf_output (buf, data, len)
176 struct buffer *buf;
177 const char *data;
178 int len;
179 {
180 if (buf->data != NULL
181 && (((buf->last->text + BUFFER_DATA_SIZE)
182 - (buf->last->bufp + buf->last->size))
183 >= len))
184 {
185 memcpy (buf->last->bufp + buf->last->size, data, len);
186 buf->last->size += len;
187 return;
188 }
189
190 while (1)
191 {
192 struct buffer_data *newdata;
193
194 newdata = get_buffer_data ();
195 if (newdata == NULL)
196 {
197 (*buf->memory_error) (buf);
198 return;
199 }
200
201 if (buf->data == NULL)
202 buf->data = newdata;
203 else
204 buf->last->next = newdata;
205 newdata->next = NULL;
206 buf->last = newdata;
207
208 newdata->bufp = newdata->text;
209
210 if (len <= BUFFER_DATA_SIZE)
211 {
212 newdata->size = len;
213 memcpy (newdata->text, data, len);
214 return;
215 }
216
217 newdata->size = BUFFER_DATA_SIZE;
218 memcpy (newdata->text, data, BUFFER_DATA_SIZE);
219
220 data += BUFFER_DATA_SIZE;
221 len -= BUFFER_DATA_SIZE;
222 }
223
224 /*NOTREACHED*/
225 }
226
227 /* Add a '\0' terminated string to BUF. */
228
229 void
buf_output0(buf,string)230 buf_output0 (buf, string)
231 struct buffer *buf;
232 const char *string;
233 {
234 buf_output (buf, string, strlen (string));
235 }
236
237 /* Add a single character to BUF. */
238
239 void
buf_append_char(buf,ch)240 buf_append_char (buf, ch)
241 struct buffer *buf;
242 int ch;
243 {
244 if (buf->data != NULL
245 && (buf->last->text + BUFFER_DATA_SIZE
246 != buf->last->bufp + buf->last->size))
247 {
248 *(buf->last->bufp + buf->last->size) = ch;
249 ++buf->last->size;
250 }
251 else
252 {
253 char b;
254
255 b = ch;
256 buf_output (buf, &b, 1);
257 }
258 }
259
260 /*
261 * Send all the output we've been saving up. Returns 0 for success or
262 * errno code. If the buffer has been set to be nonblocking, this
263 * will just write until the write would block.
264 */
265
266 int
buf_send_output(buf)267 buf_send_output (buf)
268 struct buffer *buf;
269 {
270 if (buf->output == NULL)
271 abort ();
272
273 while (buf->data != NULL)
274 {
275 struct buffer_data *data;
276
277 data = buf->data;
278
279 if (data->size > 0)
280 {
281 int status, nbytes;
282
283 status = (*buf->output) (buf->closure, data->bufp, data->size,
284 &nbytes);
285 if (status != 0)
286 {
287 /* Some sort of error. Discard the data, and return. */
288
289 buf->last->next = free_buffer_data;
290 free_buffer_data = buf->data;
291 buf->data = NULL;
292 buf->last = NULL;
293
294 return status;
295 }
296
297 if (nbytes != data->size)
298 {
299 /* Not all the data was written out. This is only
300 permitted in nonblocking mode. Adjust the buffer,
301 and return. */
302
303 assert (buf->nonblocking);
304
305 data->size -= nbytes;
306 data->bufp += nbytes;
307
308 return 0;
309 }
310 }
311
312 buf->data = data->next;
313 data->next = free_buffer_data;
314 free_buffer_data = data;
315 }
316
317 buf->last = NULL;
318
319 return 0;
320 }
321
322 /*
323 * Flush any data queued up in the buffer. If BLOCK is nonzero, then
324 * if the buffer is in nonblocking mode, put it into blocking mode for
325 * the duration of the flush. This returns 0 on success, or an error
326 * code.
327 */
328
329 int
buf_flush(buf,block)330 buf_flush (buf, block)
331 struct buffer *buf;
332 int block;
333 {
334 int nonblocking;
335 int status;
336
337 if (buf->flush == NULL)
338 abort ();
339
340 nonblocking = buf->nonblocking;
341 if (nonblocking && block)
342 {
343 status = set_block (buf);
344 if (status != 0)
345 return status;
346 }
347
348 status = buf_send_output (buf);
349 if (status == 0)
350 status = (*buf->flush) (buf->closure);
351
352 if (nonblocking && block)
353 {
354 int blockstat;
355
356 blockstat = set_nonblock (buf);
357 if (status == 0)
358 status = blockstat;
359 }
360
361 return status;
362 }
363
364 /*
365 * Set buffer BUF to nonblocking I/O. Returns 0 for success or errno
366 * code.
367 */
368
369 int
set_nonblock(buf)370 set_nonblock (buf)
371 struct buffer *buf;
372 {
373 int status;
374
375 if (buf->nonblocking)
376 return 0;
377 if (buf->block == NULL)
378 abort ();
379 status = (*buf->block) (buf->closure, 0);
380 if (status != 0)
381 return status;
382 buf->nonblocking = 1;
383 return 0;
384 }
385
386 /*
387 * Set buffer BUF to blocking I/O. Returns 0 for success or errno
388 * code.
389 */
390
391 int
set_block(buf)392 set_block (buf)
393 struct buffer *buf;
394 {
395 int status;
396
397 if (! buf->nonblocking)
398 return 0;
399 if (buf->block == NULL)
400 abort ();
401 status = (*buf->block) (buf->closure, 1);
402 if (status != 0)
403 return status;
404 buf->nonblocking = 0;
405 return 0;
406 }
407
408 /*
409 * Send a character count and some output. Returns errno code or 0 for
410 * success.
411 *
412 * Sending the count in binary is OK since this is only used on a pipe
413 * within the same system.
414 */
415
416 int
buf_send_counted(buf)417 buf_send_counted (buf)
418 struct buffer *buf;
419 {
420 int size;
421 struct buffer_data *data;
422
423 size = 0;
424 for (data = buf->data; data != NULL; data = data->next)
425 size += data->size;
426
427 data = get_buffer_data ();
428 if (data == NULL)
429 {
430 (*buf->memory_error) (buf);
431 return ENOMEM;
432 }
433
434 data->next = buf->data;
435 buf->data = data;
436 if (buf->last == NULL)
437 buf->last = data;
438
439 data->bufp = data->text;
440 data->size = sizeof (int);
441
442 *((int *) data->text) = size;
443
444 return buf_send_output (buf);
445 }
446
447 /*
448 * Send a special count. COUNT should be negative. It will be
449 * handled speciallyi by buf_copy_counted. This function returns 0 or
450 * an errno code.
451 *
452 * Sending the count in binary is OK since this is only used on a pipe
453 * within the same system.
454 */
455
456 int
buf_send_special_count(buf,count)457 buf_send_special_count (buf, count)
458 struct buffer *buf;
459 int count;
460 {
461 struct buffer_data *data;
462
463 data = get_buffer_data ();
464 if (data == NULL)
465 {
466 (*buf->memory_error) (buf);
467 return ENOMEM;
468 }
469
470 data->next = buf->data;
471 buf->data = data;
472 if (buf->last == NULL)
473 buf->last = data;
474
475 data->bufp = data->text;
476 data->size = sizeof (int);
477
478 *((int *) data->text) = count;
479
480 return buf_send_output (buf);
481 }
482
483 /* Append a list of buffer_data structures to an buffer. */
484
485 void
buf_append_data(buf,data,last)486 buf_append_data (buf, data, last)
487 struct buffer *buf;
488 struct buffer_data *data;
489 struct buffer_data *last;
490 {
491 if (data != NULL)
492 {
493 if (buf->data == NULL)
494 buf->data = data;
495 else
496 buf->last->next = data;
497 buf->last = last;
498 }
499 }
500
501 /* Append the data on one buffer to another. This removes the data
502 from the source buffer. */
503
504 void
buf_append_buffer(to,from)505 buf_append_buffer (to, from)
506 struct buffer *to;
507 struct buffer *from;
508 {
509 buf_append_data (to, from->data, from->last);
510 from->data = NULL;
511 from->last = NULL;
512 }
513
514 /*
515 * Copy the contents of file F into buffer_data structures. We can't
516 * copy directly into an buffer, because we want to handle failure and
517 * succeess differently. Returns 0 on success, or -2 if out of
518 * memory, or a status code on error. Since the caller happens to
519 * know the size of the file, it is passed in as SIZE. On success,
520 * this function sets *RETP and *LASTP, which may be passed to
521 * buf_append_data.
522 */
523
524 int
buf_read_file(f,size,retp,lastp)525 buf_read_file (f, size, retp, lastp)
526 FILE *f;
527 long size;
528 struct buffer_data **retp;
529 struct buffer_data **lastp;
530 {
531 int status;
532
533 *retp = NULL;
534 *lastp = NULL;
535
536 while (size > 0)
537 {
538 struct buffer_data *data;
539 int get;
540
541 data = get_buffer_data ();
542 if (data == NULL)
543 {
544 status = -2;
545 goto error_return;
546 }
547
548 if (*retp == NULL)
549 *retp = data;
550 else
551 (*lastp)->next = data;
552 data->next = NULL;
553 *lastp = data;
554
555 data->bufp = data->text;
556 data->size = 0;
557
558 if (size > BUFFER_DATA_SIZE)
559 get = BUFFER_DATA_SIZE;
560 else
561 get = size;
562
563 errno = EIO;
564 if (fread (data->text, get, 1, f) != 1)
565 {
566 status = errno;
567 goto error_return;
568 }
569
570 data->size += get;
571 size -= get;
572 }
573
574 return 0;
575
576 error_return:
577 if (*retp != NULL)
578 {
579 (*lastp)->next = free_buffer_data;
580 free_buffer_data = *retp;
581 }
582 return status;
583 }
584
585 /*
586 * Copy the contents of file F into buffer_data structures. We can't
587 * copy directly into an buffer, because we want to handle failure and
588 * succeess differently. Returns 0 on success, or -2 if out of
589 * memory, or a status code on error. On success, this function sets
590 * *RETP and *LASTP, which may be passed to buf_append_data.
591 */
592
593 int
buf_read_file_to_eof(f,retp,lastp)594 buf_read_file_to_eof (f, retp, lastp)
595 FILE *f;
596 struct buffer_data **retp;
597 struct buffer_data **lastp;
598 {
599 int status;
600
601 *retp = NULL;
602 *lastp = NULL;
603
604 while (!feof (f))
605 {
606 struct buffer_data *data;
607 int get, nread;
608
609 data = get_buffer_data ();
610 if (data == NULL)
611 {
612 status = -2;
613 goto error_return;
614 }
615
616 if (*retp == NULL)
617 *retp = data;
618 else
619 (*lastp)->next = data;
620 data->next = NULL;
621 *lastp = data;
622
623 data->bufp = data->text;
624 data->size = 0;
625
626 get = BUFFER_DATA_SIZE;
627
628 errno = EIO;
629 nread = fread (data->text, 1, get, f);
630 if (nread == 0 && !feof (f))
631 {
632 status = errno;
633 goto error_return;
634 }
635
636 data->size = nread;
637 }
638
639 return 0;
640
641 error_return:
642 if (*retp != NULL)
643 {
644 (*lastp)->next = free_buffer_data;
645 free_buffer_data = *retp;
646 }
647 return status;
648 }
649
650 /* Return the number of bytes in a chain of buffer_data structures. */
651
652 int
buf_chain_length(buf)653 buf_chain_length (buf)
654 struct buffer_data *buf;
655 {
656 int size = 0;
657 while (buf)
658 {
659 size += buf->size;
660 buf = buf->next;
661 }
662 return size;
663 }
664
665 /* Return the number of bytes in a buffer. */
666
667 int
buf_length(buf)668 buf_length (buf)
669 struct buffer *buf;
670 {
671 return buf_chain_length (buf->data);
672 }
673
674 /*
675 * Read an arbitrary amount of data into an input buffer. The buffer
676 * will be in nonblocking mode, and we just grab what we can. Return
677 * 0 on success, or -1 on end of file, or -2 if out of memory, or an
678 * error code. If COUNTP is not NULL, *COUNTP is set to the number of
679 * bytes read.
680 */
681
682 int
buf_input_data(buf,countp)683 buf_input_data (buf, countp)
684 struct buffer *buf;
685 int *countp;
686 {
687 if (buf->input == NULL)
688 abort ();
689
690 if (countp != NULL)
691 *countp = 0;
692
693 while (1)
694 {
695 int get;
696 int status, nbytes;
697
698 if (buf->data == NULL
699 || (buf->last->bufp + buf->last->size
700 == buf->last->text + BUFFER_DATA_SIZE))
701 {
702 struct buffer_data *data;
703
704 data = get_buffer_data ();
705 if (data == NULL)
706 {
707 (*buf->memory_error) (buf);
708 return -2;
709 }
710
711 if (buf->data == NULL)
712 buf->data = data;
713 else
714 buf->last->next = data;
715 data->next = NULL;
716 buf->last = data;
717
718 data->bufp = data->text;
719 data->size = 0;
720 }
721
722 get = ((buf->last->text + BUFFER_DATA_SIZE)
723 - (buf->last->bufp + buf->last->size));
724
725 status = (*buf->input) (buf->closure,
726 buf->last->bufp + buf->last->size,
727 0, get, &nbytes);
728 if (status != 0)
729 return status;
730
731 buf->last->size += nbytes;
732 if (countp != NULL)
733 *countp += nbytes;
734
735 if (nbytes < get)
736 {
737 /* If we did not fill the buffer, then presumably we read
738 all the available data. */
739 return 0;
740 }
741 }
742
743 /*NOTREACHED*/
744 }
745
746 /*
747 * Read a line (characters up to a \012) from an input buffer. (We
748 * use \012 rather than \n for the benefit of non Unix clients for
749 * which \n means something else). This returns 0 on success, or -1
750 * on end of file, or -2 if out of memory, or an error code. If it
751 * succeeds, it sets *LINE to an allocated buffer holding the contents
752 * of the line. The trailing \012 is not included in the buffer. If
753 * LENP is not NULL, then *LENP is set to the number of bytes read;
754 * strlen may not work, because there may be embedded null bytes.
755 */
756
757 int
buf_read_line(buf,line,lenp)758 buf_read_line (buf, line, lenp)
759 struct buffer *buf;
760 char **line;
761 int *lenp;
762 {
763 if (buf->input == NULL)
764 abort ();
765
766 *line = NULL;
767
768 while (1)
769 {
770 int len, finallen = 0;
771 struct buffer_data *data;
772 char *nl;
773
774 /* See if there is a newline in BUF. */
775 len = 0;
776 for (data = buf->data; data != NULL; data = data->next)
777 {
778 nl = memchr (data->bufp, '\012', data->size);
779 if (nl != NULL)
780 {
781 finallen = nl - data->bufp;
782 len += finallen;
783 break;
784 }
785 len += data->size;
786 }
787
788 /* If we found a newline, copy the line into a memory buffer,
789 and remove it from BUF. */
790 if (data != NULL)
791 {
792 char *p;
793 struct buffer_data *nldata;
794
795 p = malloc (len + 1);
796 if (p == NULL)
797 return -2;
798 *line = p;
799
800 nldata = data;
801 data = buf->data;
802 while (data != nldata)
803 {
804 struct buffer_data *next;
805
806 memcpy (p, data->bufp, data->size);
807 p += data->size;
808 next = data->next;
809 data->next = free_buffer_data;
810 free_buffer_data = data;
811 data = next;
812 }
813
814 memcpy (p, data->bufp, finallen);
815 p[finallen] = '\0';
816
817 data->size -= finallen + 1;
818 data->bufp = nl + 1;
819 buf->data = data;
820
821 if (lenp != NULL)
822 *lenp = len;
823
824 return 0;
825 }
826
827 /* Read more data until we get a newline. */
828 while (1)
829 {
830 int size, status, nbytes;
831 char *mem;
832
833 if (buf->data == NULL
834 || (buf->last->bufp + buf->last->size
835 == buf->last->text + BUFFER_DATA_SIZE))
836 {
837 data = get_buffer_data ();
838 if (data == NULL)
839 {
840 (*buf->memory_error) (buf);
841 return -2;
842 }
843
844 if (buf->data == NULL)
845 buf->data = data;
846 else
847 buf->last->next = data;
848 data->next = NULL;
849 buf->last = data;
850
851 data->bufp = data->text;
852 data->size = 0;
853 }
854
855 mem = buf->last->bufp + buf->last->size;
856 size = (buf->last->text + BUFFER_DATA_SIZE) - mem;
857
858 /* We need to read at least 1 byte. We can handle up to
859 SIZE bytes. This will only be efficient if the
860 underlying communication stream does its own buffering,
861 or is clever about getting more than 1 byte at a time. */
862 status = (*buf->input) (buf->closure, mem, 1, size, &nbytes);
863 if (status != 0)
864 return status;
865
866 buf->last->size += nbytes;
867
868 /* Optimize slightly to avoid an unnecessary call to
869 memchr. */
870 if (nbytes == 1)
871 {
872 if (*mem == '\012')
873 break;
874 }
875 else
876 {
877 if (memchr (mem, '\012', nbytes) != NULL)
878 break;
879 }
880 }
881 }
882 }
883
884 /*
885 * Extract data from the input buffer BUF. This will read up to WANT
886 * bytes from the buffer. It will set *RETDATA to point at the bytes,
887 * and set *GOT to the number of bytes to be found there. Any buffer
888 * call which uses BUF may change the contents of the buffer at *DATA,
889 * so the data should be fully processed before any further calls are
890 * made. This returns 0 on success, or -1 on end of file, or -2 if
891 * out of memory, or an error code.
892 */
893
894 int
buf_read_data(buf,want,retdata,got)895 buf_read_data (buf, want, retdata, got)
896 struct buffer *buf;
897 int want;
898 char **retdata;
899 int *got;
900 {
901 if (buf->input == NULL)
902 abort ();
903
904 while (buf->data != NULL && buf->data->size == 0)
905 {
906 struct buffer_data *next;
907
908 next = buf->data->next;
909 buf->data->next = free_buffer_data;
910 free_buffer_data = buf->data;
911 buf->data = next;
912 if (next == NULL)
913 buf->last = NULL;
914 }
915
916 if (buf->data == NULL)
917 {
918 struct buffer_data *data;
919 int get, status, nbytes;
920
921 data = get_buffer_data ();
922 if (data == NULL)
923 {
924 (*buf->memory_error) (buf);
925 return -2;
926 }
927
928 buf->data = data;
929 buf->last = data;
930 data->next = NULL;
931 data->bufp = data->text;
932 data->size = 0;
933
934 if (want < BUFFER_DATA_SIZE)
935 get = want;
936 else
937 get = BUFFER_DATA_SIZE;
938 status = (*buf->input) (buf->closure, data->bufp, get,
939 BUFFER_DATA_SIZE, &nbytes);
940 if (status != 0)
941 return status;
942
943 data->size = nbytes;
944 }
945
946 *retdata = buf->data->bufp;
947 if (want < buf->data->size)
948 {
949 *got = want;
950 buf->data->size -= want;
951 buf->data->bufp += want;
952 }
953 else
954 {
955 *got = buf->data->size;
956 buf->data->size = 0;
957 }
958
959 return 0;
960 }
961
962 /*
963 * Copy lines from an input buffer to an output buffer. This copies
964 * all complete lines (characters up to a newline) from INBUF to
965 * OUTBUF. Each line in OUTBUF is preceded by the character COMMAND
966 * and a space.
967 */
968
969 void
buf_copy_lines(outbuf,inbuf,command)970 buf_copy_lines (outbuf, inbuf, command)
971 struct buffer *outbuf;
972 struct buffer *inbuf;
973 int command;
974 {
975 while (1)
976 {
977 struct buffer_data *data;
978 struct buffer_data *nldata;
979 char *nl;
980 int len;
981
982 /* See if there is a newline in INBUF. */
983 nldata = NULL;
984 nl = NULL;
985 for (data = inbuf->data; data != NULL; data = data->next)
986 {
987 nl = memchr (data->bufp, '\n', data->size);
988 if (nl != NULL)
989 {
990 nldata = data;
991 break;
992 }
993 }
994
995 if (nldata == NULL)
996 {
997 /* There are no more lines in INBUF. */
998 return;
999 }
1000
1001 /* Put in the command. */
1002 buf_append_char (outbuf, command);
1003 buf_append_char (outbuf, ' ');
1004
1005 if (inbuf->data != nldata)
1006 {
1007 /*
1008 * Simply move over all the buffers up to the one containing
1009 * the newline.
1010 */
1011 for (data = inbuf->data; data->next != nldata; data = data->next)
1012 ;
1013 data->next = NULL;
1014 buf_append_data (outbuf, inbuf->data, data);
1015 inbuf->data = nldata;
1016 }
1017
1018 /*
1019 * If the newline is at the very end of the buffer, just move
1020 * the buffer onto OUTBUF. Otherwise we must copy the data.
1021 */
1022 len = nl + 1 - nldata->bufp;
1023 if (len == nldata->size)
1024 {
1025 inbuf->data = nldata->next;
1026 if (inbuf->data == NULL)
1027 inbuf->last = NULL;
1028
1029 nldata->next = NULL;
1030 buf_append_data (outbuf, nldata, nldata);
1031 }
1032 else
1033 {
1034 buf_output (outbuf, nldata->bufp, len);
1035 nldata->bufp += len;
1036 nldata->size -= len;
1037 }
1038 }
1039 }
1040
1041 /*
1042 * Copy counted data from one buffer to another. The count is an
1043 * integer, host size, host byte order (it is only used across a
1044 * pipe). If there is enough data, it should be moved over. If there
1045 * is not enough data, it should remain on the original buffer. A
1046 * negative count is a special case. if one is seen, *SPECIAL is set
1047 * to the (negative) count value and no additional data is gathered
1048 * from the buffer; normally *SPECIAL is set to 0. This function
1049 * returns the number of bytes it needs to see in order to actually
1050 * copy something over.
1051 */
1052
1053 int
buf_copy_counted(outbuf,inbuf,special)1054 buf_copy_counted (outbuf, inbuf, special)
1055 struct buffer *outbuf;
1056 struct buffer *inbuf;
1057 int *special;
1058 {
1059 *special = 0;
1060
1061 while (1)
1062 {
1063 struct buffer_data *data;
1064 int need;
1065 union
1066 {
1067 char intbuf[sizeof (int)];
1068 int i;
1069 } u;
1070 char *intp;
1071 int count;
1072 struct buffer_data *start;
1073 int startoff;
1074 struct buffer_data *stop;
1075 int stopwant;
1076
1077 /* See if we have enough bytes to figure out the count. */
1078 need = sizeof (int);
1079 intp = u.intbuf;
1080 for (data = inbuf->data; data != NULL; data = data->next)
1081 {
1082 if (data->size >= need)
1083 {
1084 memcpy (intp, data->bufp, need);
1085 break;
1086 }
1087 memcpy (intp, data->bufp, data->size);
1088 intp += data->size;
1089 need -= data->size;
1090 }
1091 if (data == NULL)
1092 {
1093 /* We don't have enough bytes to form an integer. */
1094 return need;
1095 }
1096
1097 count = u.i;
1098 start = data;
1099 startoff = need;
1100
1101 if (count < 0)
1102 {
1103 /* A negative COUNT is a special case meaning that we
1104 don't need any further information. */
1105 stop = start;
1106 stopwant = 0;
1107 }
1108 else
1109 {
1110 /*
1111 * We have an integer in COUNT. We have gotten all the
1112 * data from INBUF in all buffers before START, and we
1113 * have gotten STARTOFF bytes from START. See if we have
1114 * enough bytes remaining in INBUF.
1115 */
1116 need = count - (start->size - startoff);
1117 if (need <= 0)
1118 {
1119 stop = start;
1120 stopwant = count;
1121 }
1122 else
1123 {
1124 for (data = start->next; data != NULL; data = data->next)
1125 {
1126 if (need <= data->size)
1127 break;
1128 need -= data->size;
1129 }
1130 if (data == NULL)
1131 {
1132 /* We don't have enough bytes. */
1133 return need;
1134 }
1135 stop = data;
1136 stopwant = need;
1137 }
1138 }
1139
1140 /*
1141 * We have enough bytes. Free any buffers in INBUF before
1142 * START, and remove STARTOFF bytes from START, so that we can
1143 * forget about STARTOFF.
1144 */
1145 start->bufp += startoff;
1146 start->size -= startoff;
1147
1148 if (start->size == 0)
1149 start = start->next;
1150
1151 if (stop->size == stopwant)
1152 {
1153 stop = stop->next;
1154 stopwant = 0;
1155 }
1156
1157 while (inbuf->data != start)
1158 {
1159 data = inbuf->data;
1160 inbuf->data = data->next;
1161 data->next = free_buffer_data;
1162 free_buffer_data = data;
1163 }
1164
1165 /* If COUNT is negative, set *SPECIAL and get out now. */
1166 if (count < 0)
1167 {
1168 *special = count;
1169 return 0;
1170 }
1171
1172 /*
1173 * We want to copy over the bytes from START through STOP. We
1174 * only want STOPWANT bytes from STOP.
1175 */
1176
1177 if (start != stop)
1178 {
1179 /* Attach the buffers from START through STOP to OUTBUF. */
1180 for (data = start; data->next != stop; data = data->next)
1181 ;
1182 inbuf->data = stop;
1183 data->next = NULL;
1184 buf_append_data (outbuf, start, data);
1185 }
1186
1187 if (stopwant > 0)
1188 {
1189 buf_output (outbuf, stop->bufp, stopwant);
1190 stop->bufp += stopwant;
1191 stop->size -= stopwant;
1192 }
1193 }
1194
1195 /*NOTREACHED*/
1196 }
1197
1198 /* Shut down a buffer. This returns 0 on success, or an errno code. */
1199
1200 int
buf_shutdown(buf)1201 buf_shutdown (buf)
1202 struct buffer *buf;
1203 {
1204 if (buf->shutdown)
1205 return (*buf->shutdown) (buf->closure);
1206 return 0;
1207 }
1208
1209 /* The simplest type of buffer is one built on top of a stdio FILE.
1210 For simplicity, and because it is all that is required, we do not
1211 implement setting this type of buffer into nonblocking mode. The
1212 closure field is just a FILE *. */
1213
1214 static int stdio_buffer_input PROTO((void *, char *, int, int, int *));
1215 static int stdio_buffer_output PROTO((void *, const char *, int, int *));
1216 static int stdio_buffer_flush PROTO((void *));
1217
1218 /* Initialize a buffer built on a stdio FILE. */
1219
1220 struct buffer *
stdio_buffer_initialize(fp,input,memory)1221 stdio_buffer_initialize (fp, input, memory)
1222 FILE *fp;
1223 int input;
1224 void (*memory) PROTO((struct buffer *));
1225 {
1226 return buf_initialize (input ? stdio_buffer_input : NULL,
1227 input ? NULL : stdio_buffer_output,
1228 input ? NULL : stdio_buffer_flush,
1229 (int (*) PROTO((void *, int))) NULL,
1230 (int (*) PROTO((void *))) NULL,
1231 memory,
1232 (void *) fp);
1233 }
1234
1235 /* The buffer input function for a buffer built on a stdio FILE. */
1236
1237 static int
stdio_buffer_input(closure,data,need,size,got)1238 stdio_buffer_input (closure, data, need, size, got)
1239 void *closure;
1240 char *data;
1241 int need;
1242 int size;
1243 int *got;
1244 {
1245 FILE *fp = (FILE *) closure;
1246 int nbytes;
1247
1248 /* Since stdio does its own buffering, we don't worry about
1249 getting more bytes than we need. */
1250
1251 if (need == 0 || need == 1)
1252 {
1253 int ch;
1254
1255 ch = getc (fp);
1256
1257 if (ch == EOF)
1258 {
1259 if (feof (fp))
1260 return -1;
1261 else if (errno == 0)
1262 return EIO;
1263 else
1264 return errno;
1265 }
1266
1267 *data = ch;
1268 *got = 1;
1269 return 0;
1270 }
1271
1272 nbytes = fread (data, 1, need, fp);
1273
1274 if (nbytes == 0)
1275 {
1276 *got = 0;
1277 if (feof (fp))
1278 return -1;
1279 else if (errno == 0)
1280 return EIO;
1281 else
1282 return errno;
1283 }
1284
1285 *got = nbytes;
1286
1287 return 0;
1288 }
1289
1290 /* The buffer output function for a buffer built on a stdio FILE. */
1291
1292 static int
stdio_buffer_output(closure,data,have,wrote)1293 stdio_buffer_output (closure, data, have, wrote)
1294 void *closure;
1295 const char *data;
1296 int have;
1297 int *wrote;
1298 {
1299 FILE *fp = (FILE *) closure;
1300
1301 *wrote = 0;
1302
1303 while (have > 0)
1304 {
1305 int nbytes;
1306
1307 nbytes = fwrite (data, 1, have, fp);
1308
1309 if (nbytes != have)
1310 {
1311 if (errno == 0)
1312 return EIO;
1313 else
1314 return errno;
1315 }
1316
1317 *wrote += nbytes;
1318 have -= nbytes;
1319 data += nbytes;
1320 }
1321
1322 return 0;
1323 }
1324
1325 /* The buffer flush function for a buffer built on a stdio FILE. */
1326
1327 static int
stdio_buffer_flush(closure)1328 stdio_buffer_flush (closure)
1329 void *closure;
1330 {
1331 FILE *fp = (FILE *) closure;
1332
1333 if (fflush (fp) != 0)
1334 {
1335 if (errno == 0)
1336 return EIO;
1337 else
1338 return errno;
1339 }
1340
1341 return 0;
1342 }
1343
1344 /* Certain types of communication input and output data in packets,
1345 where each packet is translated in some fashion. The packetizing
1346 buffer type supports that, given a buffer which handles lower level
1347 I/O and a routine to translate the data in a packet.
1348
1349 This code uses two bytes for the size of a packet, so packets are
1350 restricted to 65536 bytes in total.
1351
1352 The translation functions should just translate; they may not
1353 significantly increase or decrease the amount of data. The actual
1354 size of the initial data is part of the translated data. The
1355 output translation routine may add up to PACKET_SLOP additional
1356 bytes, and the input translation routine should shrink the data
1357 correspondingly. */
1358
1359 #define PACKET_SLOP (100)
1360
1361 /* This structure is the closure field of a packetizing buffer. */
1362
1363 struct packetizing_buffer
1364 {
1365 /* The underlying buffer. */
1366 struct buffer *buf;
1367 /* The input translation function. Exactly one of inpfn and outfn
1368 will be NULL. The input translation function should
1369 untranslate the data in INPUT, storing the result in OUTPUT.
1370 SIZE is the amount of data in INPUT, and is also the size of
1371 OUTPUT. This should return 0 on success, or an errno code. */
1372 int (*inpfn) PROTO((void *fnclosure, const char *input, char *output,
1373 int size));
1374 /* The output translation function. This should translate the
1375 data in INPUT, storing the result in OUTPUT. The first two
1376 bytes in INPUT will be the size of the data, and so will SIZE.
1377 This should set *TRANSLATED to the amount of translated data in
1378 OUTPUT. OUTPUT is large enough to hold SIZE + PACKET_SLOP
1379 bytes. This should return 0 on success, or an errno code. */
1380 int (*outfn) PROTO((void *fnclosure, const char *input, char *output,
1381 int size, int *translated));
1382 /* A closure for the translation function. */
1383 void *fnclosure;
1384 /* For an input buffer, we may have to buffer up data here. */
1385 /* This is non-zero if the buffered data has been translated.
1386 Otherwise, the buffered data has not been translated, and starts
1387 with the two byte packet size. */
1388 int translated;
1389 /* The amount of buffered data. */
1390 int holdsize;
1391 /* The buffer allocated to hold the data. */
1392 char *holdbuf;
1393 /* The size of holdbuf. */
1394 int holdbufsize;
1395 /* If translated is set, we need another data pointer to track
1396 where we are in holdbuf. If translated is clear, then this
1397 pointer is not used. */
1398 char *holddata;
1399 };
1400
1401 static int packetizing_buffer_input PROTO((void *, char *, int, int, int *));
1402 static int packetizing_buffer_output PROTO((void *, const char *, int, int *));
1403 static int packetizing_buffer_flush PROTO((void *));
1404 static int packetizing_buffer_block PROTO((void *, int));
1405 static int packetizing_buffer_shutdown PROTO((void *));
1406
1407 /* Create a packetizing buffer. */
1408
1409 struct buffer *
packetizing_buffer_initialize(buf,inpfn,outfn,fnclosure,memory)1410 packetizing_buffer_initialize (buf, inpfn, outfn, fnclosure, memory)
1411 struct buffer *buf;
1412 int (*inpfn) PROTO ((void *, const char *, char *, int));
1413 int (*outfn) PROTO ((void *, const char *, char *, int, int *));
1414 void *fnclosure;
1415 void (*memory) PROTO((struct buffer *));
1416 {
1417 struct packetizing_buffer *pb;
1418
1419 pb = (struct packetizing_buffer *) xmalloc (sizeof *pb);
1420 memset (pb, 0, sizeof *pb);
1421
1422 pb->buf = buf;
1423 pb->inpfn = inpfn;
1424 pb->outfn = outfn;
1425 pb->fnclosure = fnclosure;
1426
1427 if (inpfn != NULL)
1428 {
1429 /* Add PACKET_SLOP to handle larger translated packets, and
1430 add 2 for the count. This buffer is increased if
1431 necessary. */
1432 pb->holdbufsize = BUFFER_DATA_SIZE + PACKET_SLOP + 2;
1433 pb->holdbuf = xmalloc (pb->holdbufsize);
1434 }
1435
1436 return buf_initialize (inpfn != NULL ? packetizing_buffer_input : NULL,
1437 inpfn != NULL ? NULL : packetizing_buffer_output,
1438 inpfn != NULL ? NULL : packetizing_buffer_flush,
1439 packetizing_buffer_block,
1440 packetizing_buffer_shutdown,
1441 memory,
1442 pb);
1443 }
1444
1445 /* Input data from a packetizing buffer. */
1446
1447 static int
packetizing_buffer_input(closure,data,need,size,got)1448 packetizing_buffer_input (closure, data, need, size, got)
1449 void *closure;
1450 char *data;
1451 int need;
1452 int size;
1453 int *got;
1454 {
1455 struct packetizing_buffer *pb = (struct packetizing_buffer *) closure;
1456
1457 *got = 0;
1458
1459 if (pb->holdsize > 0 && pb->translated)
1460 {
1461 int copy;
1462
1463 copy = pb->holdsize;
1464
1465 if (copy > size)
1466 {
1467 memcpy (data, pb->holddata, size);
1468 pb->holdsize -= size;
1469 pb->holddata += size;
1470 *got = size;
1471 return 0;
1472 }
1473
1474 memcpy (data, pb->holddata, copy);
1475 pb->holdsize = 0;
1476 pb->translated = 0;
1477
1478 data += copy;
1479 need -= copy;
1480 size -= copy;
1481 *got = copy;
1482 }
1483
1484 while (need > 0 || *got == 0)
1485 {
1486 int get, status, nread, count, tcount;
1487 char *bytes;
1488 char stackoutbuf[BUFFER_DATA_SIZE + PACKET_SLOP];
1489 char *inbuf, *outbuf;
1490
1491 /* If we don't already have the two byte count, get it. */
1492 if (pb->holdsize < 2)
1493 {
1494 get = 2 - pb->holdsize;
1495 status = buf_read_data (pb->buf, get, &bytes, &nread);
1496 if (status != 0)
1497 {
1498 /* buf_read_data can return -2, but a buffer input
1499 function is only supposed to return -1, 0, or an
1500 error code. */
1501 if (status == -2)
1502 status = ENOMEM;
1503 return status;
1504 }
1505
1506 if (nread == 0)
1507 {
1508 /* The buffer is in nonblocking mode, and we didn't
1509 manage to read anything. */
1510 return 0;
1511 }
1512
1513 if (get == 1)
1514 pb->holdbuf[1] = bytes[0];
1515 else
1516 {
1517 pb->holdbuf[0] = bytes[0];
1518 if (nread < 2)
1519 {
1520 /* We only got one byte, but we needed two. Stash
1521 the byte we got, and try again. */
1522 pb->holdsize = 1;
1523 continue;
1524 }
1525 pb->holdbuf[1] = bytes[1];
1526 }
1527 pb->holdsize = 2;
1528 }
1529
1530 /* Read the packet. */
1531
1532 count = (((pb->holdbuf[0] & 0xff) << 8)
1533 + (pb->holdbuf[1] & 0xff));
1534
1535 if (count + 2 > pb->holdbufsize)
1536 {
1537 char *n;
1538
1539 /* We didn't allocate enough space in the initialize
1540 function. */
1541
1542 n = realloc (pb->holdbuf, count + 2);
1543 if (n == NULL)
1544 {
1545 (*pb->buf->memory_error) (pb->buf);
1546 return ENOMEM;
1547 }
1548 pb->holdbuf = n;
1549 pb->holdbufsize = count + 2;
1550 }
1551
1552 get = count - (pb->holdsize - 2);
1553
1554 status = buf_read_data (pb->buf, get, &bytes, &nread);
1555 if (status != 0)
1556 {
1557 /* buf_read_data can return -2, but a buffer input
1558 function is only supposed to return -1, 0, or an error
1559 code. */
1560 if (status == -2)
1561 status = ENOMEM;
1562 return status;
1563 }
1564
1565 if (nread == 0)
1566 {
1567 /* We did not get any data. Presumably the buffer is in
1568 nonblocking mode. */
1569 return 0;
1570 }
1571
1572 if (nread < get)
1573 {
1574 /* We did not get all the data we need to fill the packet.
1575 buf_read_data does not promise to return all the bytes
1576 requested, so we must try again. */
1577 memcpy (pb->holdbuf + pb->holdsize, bytes, nread);
1578 pb->holdsize += nread;
1579 continue;
1580 }
1581
1582 /* We have a complete untranslated packet of COUNT bytes. */
1583
1584 if (pb->holdsize == 2)
1585 {
1586 /* We just read the entire packet (the 2 bytes in
1587 PB->HOLDBUF are the size). Save a memcpy by
1588 translating directly from BYTES. */
1589 inbuf = bytes;
1590 }
1591 else
1592 {
1593 /* We already had a partial packet in PB->HOLDBUF. We
1594 need to copy the new data over to make the input
1595 contiguous. */
1596 memcpy (pb->holdbuf + pb->holdsize, bytes, nread);
1597 inbuf = pb->holdbuf + 2;
1598 }
1599
1600 if (count <= sizeof stackoutbuf)
1601 outbuf = stackoutbuf;
1602 else
1603 {
1604 outbuf = malloc (count);
1605 if (outbuf == NULL)
1606 {
1607 (*pb->buf->memory_error) (pb->buf);
1608 return ENOMEM;
1609 }
1610 }
1611
1612 status = (*pb->inpfn) (pb->fnclosure, inbuf, outbuf, count);
1613 if (status != 0)
1614 return status;
1615
1616 /* The first two bytes in the translated buffer are the real
1617 length of the translated data. */
1618 tcount = ((outbuf[0] & 0xff) << 8) + (outbuf[1] & 0xff);
1619
1620 if (tcount > count)
1621 error (1, 0, "Input translation failure");
1622
1623 if (tcount > size)
1624 {
1625 /* We have more data than the caller has provided space
1626 for. We need to save some of it for the next call. */
1627
1628 memcpy (data, outbuf + 2, size);
1629 *got += size;
1630
1631 pb->holdsize = tcount - size;
1632 memcpy (pb->holdbuf, outbuf + 2 + size, tcount - size);
1633 pb->holddata = pb->holdbuf;
1634 pb->translated = 1;
1635
1636 if (outbuf != stackoutbuf)
1637 free (outbuf);
1638
1639 return 0;
1640 }
1641
1642 memcpy (data, outbuf + 2, tcount);
1643
1644 if (outbuf != stackoutbuf)
1645 free (outbuf);
1646
1647 pb->holdsize = 0;
1648
1649 data += tcount;
1650 need -= tcount;
1651 size -= tcount;
1652 *got += tcount;
1653 }
1654
1655 return 0;
1656 }
1657
1658 /* Output data to a packetizing buffer. */
1659
1660 static int
packetizing_buffer_output(closure,data,have,wrote)1661 packetizing_buffer_output (closure, data, have, wrote)
1662 void *closure;
1663 const char *data;
1664 int have;
1665 int *wrote;
1666 {
1667 struct packetizing_buffer *pb = (struct packetizing_buffer *) closure;
1668 char inbuf[BUFFER_DATA_SIZE + 2];
1669 char stack_outbuf[BUFFER_DATA_SIZE + PACKET_SLOP + 4];
1670 struct buffer_data *outdata;
1671 char *outbuf;
1672 int size, status, translated;
1673
1674 if (have > BUFFER_DATA_SIZE)
1675 {
1676 /* It would be easy to malloc a buffer, but I don't think this
1677 case can ever arise. */
1678 abort ();
1679 }
1680
1681 inbuf[0] = (have >> 8) & 0xff;
1682 inbuf[1] = have & 0xff;
1683 memcpy (inbuf + 2, data, have);
1684
1685 size = have + 2;
1686
1687 /* The output function is permitted to add up to PACKET_SLOP
1688 bytes, and we need 2 bytes for the size of the translated data.
1689 If we can guarantee that the result will fit in a buffer_data,
1690 we translate directly into one to avoid a memcpy in buf_output. */
1691 if (size + PACKET_SLOP + 2 > BUFFER_DATA_SIZE)
1692 outbuf = stack_outbuf;
1693 else
1694 {
1695 outdata = get_buffer_data ();
1696 if (outdata == NULL)
1697 {
1698 (*pb->buf->memory_error) (pb->buf);
1699 return ENOMEM;
1700 }
1701
1702 outdata->next = NULL;
1703 outdata->bufp = outdata->text;
1704
1705 outbuf = outdata->text;
1706 }
1707
1708 status = (*pb->outfn) (pb->fnclosure, inbuf, outbuf + 2, size,
1709 &translated);
1710 if (status != 0)
1711 return status;
1712
1713 /* The output function is permitted to add up to PACKET_SLOP
1714 bytes. */
1715 if (translated > size + PACKET_SLOP)
1716 abort ();
1717
1718 outbuf[0] = (translated >> 8) & 0xff;
1719 outbuf[1] = translated & 0xff;
1720
1721 if (outbuf == stack_outbuf)
1722 buf_output (pb->buf, outbuf, translated + 2);
1723 else
1724 {
1725 outdata->size = translated + 2;
1726 buf_append_data (pb->buf, outdata, outdata);
1727 }
1728
1729 *wrote = have;
1730
1731 /* We will only be here because buf_send_output was called on the
1732 packetizing buffer. That means that we should now call
1733 buf_send_output on the underlying buffer. */
1734 return buf_send_output (pb->buf);
1735 }
1736
1737 /* Flush data to a packetizing buffer. */
1738
1739 static int
packetizing_buffer_flush(closure)1740 packetizing_buffer_flush (closure)
1741 void *closure;
1742 {
1743 struct packetizing_buffer *pb = (struct packetizing_buffer *) closure;
1744
1745 /* Flush the underlying buffer. Note that if the original call to
1746 buf_flush passed 1 for the BLOCK argument, then the buffer will
1747 already have been set into blocking mode, so we should always
1748 pass 0 here. */
1749 return buf_flush (pb->buf, 0);
1750 }
1751
1752 /* The block routine for a packetizing buffer. */
1753
1754 static int
packetizing_buffer_block(closure,block)1755 packetizing_buffer_block (closure, block)
1756 void *closure;
1757 int block;
1758 {
1759 struct packetizing_buffer *pb = (struct packetizing_buffer *) closure;
1760
1761 if (block)
1762 return set_block (pb->buf);
1763 else
1764 return set_nonblock (pb->buf);
1765 }
1766
1767 /* Shut down a packetizing buffer. */
1768
1769 static int
packetizing_buffer_shutdown(closure)1770 packetizing_buffer_shutdown (closure)
1771 void *closure;
1772 {
1773 struct packetizing_buffer *pb = (struct packetizing_buffer *) closure;
1774
1775 return buf_shutdown (pb->buf);
1776 }
1777
1778 #endif /* defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) */
1779