Handle situation in where we have multiple buffers to send at the end.
[citadel.git] / libcitadel / tests / stringbuf_stream.c
1 /*
2  *  CUnit - A Unit testing framework library for C.
3  *  Copyright (C) 2001  Anil Kumar
4  *  
5  *  This library is open source software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Library General Public License for more details.
14  */
15
16 #include <stdio.h>
17 #include <stdlib.h>
18
19 #include <sys/select.h>
20
21 #include <ctype.h>
22 #include <unistd.h>
23 #include <fcntl.h>
24 #include <signal.h>
25 #include <sys/types.h>
26 #include <sys/wait.h>
27 #include <sys/socket.h>
28 #include <sys/time.h>
29 #include <sys/stat.h>
30 #include <limits.h>
31 #include <netinet/in.h>
32 #include <arpa/inet.h>
33 #include <sys/un.h>
34 #include <netdb.h>
35 #include <sys/poll.h>
36 #include <string.h>
37 #include <pwd.h>
38 #include <errno.h>
39 #include <stdarg.h>
40 #include <stdio.h>
41 #include <pthread.h>
42 #include <signal.h>
43 #include <sys/utsname.h>
44 #include <string.h>
45
46
47 typedef void testfunc(int Sock);
48
49 #include <string.h>
50
51 #include "../lib/libcitadel.h"
52
53
54 int DeZip = -1;
55 int DeBase64 = -1;
56
57 int msock;                      /* master listening socket */
58 int BindPort;
59 int time_to_die=0;
60 int n_Lines_to_read = 0;
61 int blobsize = 0;
62 int timeout = 5;
63 int selres = 1;
64 char ip_addr[256]="0.0.0.0";
65
66
67
68 static void StreamEncode(void)
69 {
70         IOBuffer ReadBuffer;
71         IOBuffer WriteBuffer;
72         int err;
73         int ret = 0;
74         int done = 0;
75         void *vStream;
76         
77         memset(&ReadBuffer, 0, sizeof(IOBuffer));
78         memset(&WriteBuffer, 0, sizeof(IOBuffer));
79         ReadBuffer.fd = fileno(stdin);
80         WriteBuffer.fd = fileno(stdout);
81         ReadBuffer.Buf = NewStrBufPlain(NULL, SIZ*2);
82         WriteBuffer.Buf = NewStrBufPlain(NULL, SIZ*2);
83
84         int fdin = fileno(stdin);
85         int fdout = fileno(stdout);
86         eStreamType ST;
87
88                                 
89         if (DeZip == 0)
90                 ST = eZLibEncode;
91         else if (DeZip == 1)
92                 ST = eZLibDecode;
93         else if (DeBase64 == 0)
94                 ST = eBase64Encode;
95         else if (DeBase64 == 1)
96                 ST = eBase64Decode;
97         else
98                 ST = eEmtyCodec;
99         vStream = StrBufNewStreamContext(ST);
100
101         while (!done && (fdin >= 0) && (fdout >= 0) && (!feof(stdin)))
102         {
103
104                 done = StrBuf_read_one_chunk_callback(fdin,
105                                                       0,
106                                                       &ReadBuffer) < (SIZ * 4) -1 ;
107                 if (IOBufferStrLength(&ReadBuffer) == 0)
108                 {
109                         done = 1;
110                 }
111                 do
112                 {
113                         do {
114                                 ret = StrBufStreamTranscode(ST, &WriteBuffer, &ReadBuffer, NULL, -1, vStream, done);
115                                 
116                                 while (IOBufferStrLength(&WriteBuffer) > 0)
117                                 {
118                                         err = StrBuf_write_one_chunk_callback(fdout,
119                                                                               0,
120                                                                               &WriteBuffer);
121                                 }
122                         } while (ret > 0);
123                 } while (IOBufferStrLength(&ReadBuffer) > 0);
124         }
125
126         
127         StrBufDestroyStreamContext(ST, &vStream);
128         
129         FreeStrBuf(&ReadBuffer.Buf);
130         FreeStrBuf(&WriteBuffer.Buf);
131         time_to_die = 1;
132 }
133
134
135
136
137 int main(int argc, char* argv[])
138 {
139         char a;
140         setvbuf(stdout, NULL, _IONBF, 0);
141
142
143         while ((a = getopt(argc, argv, "z:b")) != EOF)
144         {
145                 switch (a) {
146
147                 case 'z':
148                         // zip...
149                         DeZip = *optarg == 'x';
150                         break;
151                 case 'b':
152                         // base64
153                         DeBase64 = *optarg == 'x';
154
155                 }
156         }
157
158
159         StartLibCitadel(8);
160
161         StreamEncode();
162         return 0;
163 }
164
165
166 /// run -z 1 < ~/testfile1.txt > /tmp/blarg.z