Fixed bug #172: RPM builds does not enable SSL.
[yaz-moved-to-github.git] / client / bertorture.c
1 /* 
2  * Copyright (c) 2003, Index Data
3  * See the file LICENSE for details.
4  *
5  * $Id: bertorture.c,v 1.1 2003-03-11 11:06:35 adam Exp $
6  */
7
8 #include <signal.h>
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 #include <fcntl.h>
12 #include <unistd.h>
13 #include <stdlib.h>
14 #include <stdio.h>
15
16 #include <yaz/yaz-util.h>
17 #include <yaz/proto.h>
18 #include <yaz/comstack.h>
19
20 #define PACKET_SIZE 64
21
22 static int stop = 0;
23
24 static int send_packet(const char *host)
25 {
26     char buf[PACKET_SIZE];
27     int i;
28
29     void *add;
30
31     COMSTACK cs = cs_create_host(host, 1, &add);
32
33     if (!cs)
34         return -1;
35
36     if (cs_connect(cs, add) < 0)
37         return -1;
38
39     for (i = 0; i<sizeof(buf); i++)
40         buf[i] = 233;
41 #if 0
42         buf[i] = rand() & 0xff;
43 #endif
44     cs_put(cs, buf, sizeof(buf));
45
46     cs_close(cs);
47     return 0;
48 }
49
50 static void test_file(const char *fname)
51 {
52     Z_GDU *req;
53     ODR odr = odr_createmem(ODR_DECODE);
54     char buf[PACKET_SIZE];
55     int off = 0;
56     int fd =open(fname, O_RDONLY, 0666);
57     if (fd == -1)
58     {
59         yaz_log(LOG_ERRNO|LOG_FATAL, "open %s", fname);
60         exit (1);
61     }
62     while (off < sizeof(buf))
63     {
64         ssize_t rd;
65         rd = read(fd, buf+off, sizeof(buf)-off);
66         if (rd == -1) {
67             yaz_log(LOG_ERRNO|LOG_FATAL, "read %s", fname);
68             exit (1);
69         }
70         if (rd == 0)
71             break;
72         off += rd;
73     }
74     if (close(fd) == -1)
75     {
76         yaz_log(LOG_ERRNO|LOG_FATAL, "close %s", fname);
77         exit (1);
78     }
79     odr_setbuf(odr, buf, off, 0);
80     z_GDU(odr, &req, 0, 0);
81
82     odr_destroy(odr);
83 }
84
85 static void test_random(int run, const char *fname, const char *fname2,
86                         int *estat)
87 {
88     FILE *dumpfile = 0;
89     char buf[PACKET_SIZE];
90     int i, j;
91
92     if (fname2)
93     {
94         if (!strcmp(fname2, "-"))
95             dumpfile = stdout;
96         else
97             dumpfile = fopen(fname2, "w");
98     }
99
100     for (i = 0; i<sizeof(buf); i++)
101         buf[i] = rand() & 0xff;
102
103     for (j = 0; j<sizeof(buf)-1; j++)
104     {
105         Z_GDU *req;
106         char *mbuf;
107         ODR odr;
108
109         nmem_init();
110         odr = odr_createmem(ODR_DECODE);
111         if (fname)
112         {
113             int off = 0;
114             int fd =open(fname, O_TRUNC|O_CREAT|O_WRONLY, 0666);
115             if (fd == -1)
116             {
117                 yaz_log(LOG_ERRNO|LOG_FATAL, "open %s", fname);
118                 exit (1);
119             }
120             while (sizeof(buf)-j-off > 0)
121             {
122                 ssize_t wrote;
123                 wrote = write(fd, buf+off+j, sizeof(buf)-j-off);
124                 if (wrote <= 0) {
125                     yaz_log(LOG_ERRNO|LOG_FATAL, "write %s", fname);
126                     exit (1);
127                 }
128                 off += wrote;
129             }
130             if (close(fd) == -1)
131             {
132                 yaz_log(LOG_ERRNO|LOG_FATAL, "close %s", fname);
133                 exit (1);
134             }
135         }
136         mbuf = malloc(sizeof(buf)-j);
137         memcpy(mbuf, buf+j, sizeof(buf)-j);
138         odr_setbuf(odr, mbuf, sizeof(buf)-j, 0);
139         if (z_GDU(odr, &req, 0, 0))
140             estat[99]++;
141         else
142         {
143             int ex;
144             odr_geterrorx(odr, &ex);
145             estat[ex]++;
146         }
147         if (dumpfile)
148             odr_dumpBER(dumpfile, buf+j, sizeof(buf)-j);
149         free(mbuf);
150         odr_reset(odr);
151         odr_destroy(odr);
152         nmem_exit();
153     }
154     if (dumpfile && dumpfile != stdout)
155         fclose(dumpfile);
156 }
157
158 void sigint_handler(int x)
159 {
160     stop = 1;
161 }
162
163 int main(int argc, char **argv)
164 {
165     int start = 0, end = 10000000, ret, i, estat[100];
166     char *arg;
167     char *ber_fname = 0;
168     char *packet_fname = 0;
169
170     signal(SIGINT, sigint_handler);
171     signal(SIGTERM, sigint_handler);
172     for (i = 0; i<sizeof(estat)/sizeof(*estat); i++)
173         estat[i] = 0;
174
175     while ((ret = options("s:e:b:p:", argv, argc, &arg)) != -2)
176     {
177         switch (ret)
178         {
179         case 's':
180             start = atoi(arg);
181             break;
182         case 'e':
183             end = atoi(arg);
184             break;
185         case 'b':
186             ber_fname = arg;
187             break;
188         case 'p':
189             packet_fname = arg;
190             break;
191         case 0:
192             if (!strcmp(arg, "random"))
193             {
194                 i = start;
195                 while(!stop && (end == 0 || i < end))
196                 {
197                     srand(i*5111+1);
198                     if ((i % 50) == 0)
199                         printf ("\r[%d]", i); fflush(stdout);
200                     test_random(i, packet_fname, ber_fname, estat);
201                     i++;
202                 }
203             }
204             break;
205         default:
206             fprintf (stderr, "usage\n");
207             fprintf (stderr, " [-s start] [-e end] [-b berdump] [-p packetdump] random\n");
208             exit(1);
209         }
210     }
211     printf ("\n");
212     for (i = 0; i < sizeof(estat)/sizeof(*estat); i++)
213         if (estat[i])
214             printf ("%3d %9d\n", i, estat[i]);
215     exit(0);
216 }