source: yaz/trunk/fuentes/client/bertorture.c @ 255

Last change on this file since 255 was 255, checked in by mabarracus, 4 years ago

added trusty code to xenial

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