1e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner/*
2e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * Copyright (C) 2011 The Android Open Source Project
3e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner *
4e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License");
5e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * you may not use this file except in compliance with the License.
6e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * You may obtain a copy of the License at
7e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner *
8e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner *      http://www.apache.org/licenses/LICENSE-2.0
9e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner *
10e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * Unless required by applicable law or agreed to in writing, software
11e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS,
12e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * See the License for the specific language governing permissions and
14e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * limitations under the License.
15e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner */
16e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
17e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner/* This program benchmarks a QEMUD pipe to exchange data with a test
18e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * server.
19e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner *
20e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * See test_host_1.c for the corresponding server code, which simply
21e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * sends back anything it receives from the client.
22e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner */
23e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <stddef.h>
24e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <stdio.h>
25e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <stdlib.h>
26e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <errno.h>
27e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <string.h>
28e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include "test_util.h"
29e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
30e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#define  PIPE_NAME  "pingpong"
31e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
32e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turnerchar* progname;
33e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
34e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turnerstatic void usage(int code)
35e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner{
36e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    printf("Usage: %s [options]\n\n", progname);
37e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    printf(
38e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner      "Valid options are:\n\n"
39e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner      "  -? -h --help  Print this message\n"
40e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner      "  -pipe <name>  Use pipe name (default: " PIPE_NAME ")\n"
41e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner      "  -tcp <port>   Use local tcp port\n"
42e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner      "  -size <size>  Specify packet size\n"
43e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner      "\n"
44e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    );
45e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    exit(code);
46e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner}
47e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
48e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turnerint main(int argc, char** argv)
49e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner{
50e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    Pipe        pipe[1];
51e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    const char* tcpPort = NULL;
52e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    int         localPort = 0;
53e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    const char* pipeName = NULL;
54e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    const char* packetSize = NULL;
55e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    int         port = 8012;
56e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    int         maxCount   = 1000;
57e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    int         bufferSize = 16384;
58e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    uint8_t*    buffer;
59e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    uint8_t*    buffer2;
60e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    int         nn, count;
61e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    double      time0, time1;
62e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
63e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    /* Extract program name */
64e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    {
65e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        char* p = strrchr(argv[0], '/');
66e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (p == NULL)
67e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            progname = argv[0];
68e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        else
69e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            progname = p+1;
70e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
71e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
72e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    /* Parse options */
73e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    while (argc > 1 && argv[1][0] == '-') {
74e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        char* arg = argv[1];
75e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (!strcmp(arg, "-?") || !strcmp(arg, "-h") || !strcmp(arg, "--help")) {
76e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            usage(0);
77e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        } else if (!strcmp(arg, "-pipe")) {
78e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            if (argc < 3) {
79e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                fprintf(stderr, "-pipe option needs an argument! See --help for details.\n");
80e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                exit(1);
81e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            }
82e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            argc--;
83e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            argv++;
84e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            pipeName = argv[1];
85e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        } else if (!strcmp(arg, "-tcp")) {
86e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            if (argc < 3) {
87e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                fprintf(stderr, "-tcp option needs an argument! See --help for details.\n");
88e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                exit(1);
89e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            }
90e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            argc--;
91e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            argv++;
92e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            tcpPort = argv[1];
93e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        } else if (!strcmp(arg, "-size")) {
94e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            if (argc < 3) {
95e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                fprintf(stderr, "-tcp option needs an argument! See --help for details.\n");
96e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                exit(1);
97e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            }
98e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            argc--;
99e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            argv++;
100e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            packetSize = argv[1];
101e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        } else {
102e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr, "UNKNOWN OPTION: %s\n\n", arg);
103e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            usage(1);
104e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
105e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        argc--;
106e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        argv++;
107e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
108e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
109e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    /* Check arguments */
110e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    if (tcpPort && pipeName) {
111e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        fprintf(stderr, "You can't use both -pipe and -tcp at the same time\n");
112e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        exit(2);
113e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
114e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
115e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    if (tcpPort != NULL) {
116e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        localPort = atoi(tcpPort);
117e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (localPort <= 0 || localPort > 65535) {
118e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr, "Invalid port number: %s\n", tcpPort);
119e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            exit(2);
120e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
121e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    } else if (pipeName == NULL) {
122e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        /* Use default pipe name */
123e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        pipeName = PIPE_NAME;
124e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
125e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
126e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    if (packetSize != NULL) {
127e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        int  size = atoi(packetSize);
128e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (size <= 0) {
129e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr, "Invalid byte size: %s\n", packetSize);
130e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            exit(3);
131e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
132e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        bufferSize = size;
133e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
134e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
135e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    /* Open the pipe */
136e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    if (tcpPort != NULL) {
137e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (pipe_openSocket(pipe, localPort) < 0) {
138e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr, "Could not open tcp socket!\n");
139e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            return 1;
140e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
141e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        printf("Connected to tcp:localhost:%d\n", port);
142e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
143e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    else {
144e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (pipe_openQemuPipe(pipe, pipeName) < 0) {
145e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr, "Could not open '%s' pipe: %s\n", pipeName, strerror(errno));
146e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            return 1;
147e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
148e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        printf("Connected to '%s' pipe\n", pipeName);
149e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
150e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
151e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    /* Allocate buffers, setup their data */
152e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    buffer  = malloc(bufferSize);
153e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    buffer2 = malloc(bufferSize);
154e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
155e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    for (nn = 0; nn < bufferSize; nn++) {
156e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        buffer[nn] = (uint8_t)nn;
157e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
158e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
159e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    /* Do the work! */
160e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    time0 = now_secs();
161e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
162e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    for (count = 0; count < maxCount; count++) {
163e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        int ret = pipe_send(pipe, buffer, bufferSize);
164e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        int pos, len;
165e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
166e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (ret < 0) {
167e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr,"%d: Sending %d bytes failed: %s\n", count, bufferSize, strerror(errno));
168e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            return 1;
169e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
170e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
171e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#if 1
172e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        /* The server is supposed to send the message back */
173e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        pos = 0;
174e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        len = bufferSize;
175e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        while (len > 0) {
176e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            ret = pipe_recv(pipe, buffer2 + pos, len);
177e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            if (ret < 0) {
178e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                fprintf(stderr, "Receiving failed (ret=%d): %s\n", ret, strerror(errno));
179e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                return 3;
180e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            }
181e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            if (ret == 0) {
182e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                fprintf(stderr, "Disconnection while receiving!\n");
183e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                return 4;
184e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            }
185e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            pos += ret;
186e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            len -= ret;
187e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
188e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
189e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (memcmp(buffer, buffer2, bufferSize) != 0) {
190e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            fprintf(stderr, "Message content mismatch!\n");
191e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            const int maxAvail = 16;
192e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            const int maxLines = 12;
193e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            int numLines = 0;
194e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            for (nn = 0; nn < bufferSize; ) {
195e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                int avail = bufferSize - nn;
196e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                int mm;
197e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                if (avail > maxAvail)
198e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    avail = maxAvail;
199e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
200e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                if (memcmp(buffer+nn, buffer2+nn, avail) != 0) {
201e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    if (++numLines >= maxLines) {
202e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                        printf(".... to be continued ...\n");
203e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                        break;
204e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    }
205e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    printf("%04x:", nn);
206e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
207e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    for (mm = 0; mm < avail; mm++)
208e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                        printf(" %02x", buffer[nn+mm]);
209e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    for ( ; mm < maxAvail; mm++ )
210e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                        printf("   ");
211e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
212e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    printf( " -- " );
213e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
214e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    for (mm = 0; mm < avail; mm++)
215e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                        printf(" %02x", buffer2[nn+mm]);
216e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
217e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                    printf ("\n");
218e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                }
219e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner                nn += avail;
220e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            }
221e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            return 6;
222e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
223e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
224e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#endif
225e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
226e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        if (count > 0 && (count % 200) == 0) {
227e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner            printf("... %d\n", count);
228e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner        }
229e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    }
230e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
231e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    time1 = now_secs();
232e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
233e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    printf("Closing pipe\n");
234e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    pipe_close(pipe);
235e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner
236e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    printf("Total time: %g seconds\n", time1 - time0);
237e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    printf("Total bytes: %g bytes\n", 1.0*maxCount*bufferSize);
238e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    printf("Bandwidth: %g MB/s\n", (maxCount*bufferSize/(1024.0*1024.0))/(time1 - time0) );
239e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner    return 0;
240e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner}
241