]>
git.wh0rd.org - home.git/blob - ddnuke.c
2 * released into the public domain
3 * written by Mike Frysinger <vapier>
6 #define _FILE_OFFSET_BITS 64
7 #define _LARGEFILE_SOURCE
8 #define _LARGEFILE64_SOURCE
20 static const char zero
[1024 * 1024];
22 #define errp(msg, args...) \
24 printf("%s: " msg ": %m\n", argv[0], ## args); \
28 static unsigned long long mbps(struct timespec
*stime
, struct timespec
*etime
, off_t len
)
31 clock_gettime(CLOCK_MONOTONIC
, etime
);
32 dtime
= ((etime
->tv_sec
- stime
->tv_sec
) * 1000 * 1000 * 1000) +
33 (etime
->tv_nsec
- stime
->tv_nsec
);
35 return 1000 * len
/ dtime
;
38 int main(int argc
, char *argv
[])
43 setlocale(LC_NUMERIC
, "en_US");
47 offset
= atoll(argv
[2]);
52 puts("Usage: ddnuke <dev> [offset in bytes]");
56 int fd
= open(file
, O_WRONLY
);
58 errp("open(%s) failed", file
);
60 if (lseek(fd
, offset
, SEEK_SET
) != offset
)
61 errp("lseek(%"PRIu64
"u) failed", offset
);
63 unsigned long long speed
= 0;
64 struct timespec stime
, etime
, itime
;
65 clock_gettime(CLOCK_MONOTONIC
, &stime
);
68 off_t pos
= 0, last_pos
= 0;
72 ret
= write(fd
, zero
, sizeof(zero
));
74 if (ret
!= sizeof(zero
)) {
75 printf("\ngot back %zi (wanted %zu)\n%'llu MB/s over entire run\n",
76 ret
, sizeof(zero
), mbps(&itime
, &etime
, pos
));
80 printf("%'llu bytes (%'llu MB/s)%20s\r", (unsigned long long)pos
, speed
, "");
82 if ((++fsync_pos
% 16) == 0) {
83 speed
= mbps(&stime
, &etime
, pos
- last_pos
);