2 * Copyright (c) 2001, 2006-2007 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 #define BUF_SIZE (128*1024)
46 * Silly "random" data generator, writes `nbytes' to stdout, from
47 * `offset' in our stream.
51 fill_buf(unsigned long *buf
, unsigned long long base
)
56 buf
= malloc(BUF_SIZE
);
59 errx(1, "malloc failed");
62 srandom(base
/ BUF_SIZE
);
63 for (i
= 0; i
< BUF_SIZE
/sizeof(long); i
++) {
64 unsigned long tmp
= random();
65 buf
[i
] = tmp
^ (tmp
<< 1);
71 doit(long long offset
, long long nbytes
)
73 unsigned long long base
, off
;
79 base
= offset
& (~(BUF_SIZE
- 1));
81 if (base
== offset
|| !buf
)
82 buf
= fill_buf((void *)buf
, base
);
87 ret
= write(STDOUT_FILENO
, buf
+ off
, sz
);
89 err(1, "write at %llu", (unsigned long long)offset
);
98 main(int argc
, char **argv
)
100 long long nbytes
, offset
= 0;
102 setprogname(argv
[0]);
104 if (argc
< 2 || argc
> 3)
105 errx(1, "usage: %s nbytes [offset]", argv
[0]);
107 nbytes
= strtoll(argv
[1], NULL
, 10); /* XXX errno */
110 offset
= strtoll(argv
[2], NULL
, 10); /* XXX errno */
112 doit(offset
, nbytes
);