]>
git.wh0rd.org - home.git/blob - ddnuke.c
2 * released into the public domain
3 * written by Mike Frysinger <vapier>
6 #pragma GCC diagnostic warning "-Wall"
7 #pragma GCC diagnostic warning "-Wextra"
9 #define _FILE_OFFSET_BITS 64
10 #define _LARGEFILE_SOURCE
11 #define _LARGEFILE64_SOURCE
23 #include <sys/ioctl.h>
27 static const char zero
[1024 * 1024];
29 #define errp(msg, args...) \
31 printf("%s: " msg ": %m\n", program_invocation_short_name, ## args); \
35 static unsigned long long mbps(struct timespec
*stime
, struct timespec
*etime
, off_t len
)
38 clock_gettime(CLOCK_MONOTONIC
, etime
);
39 dtime
= ((etime
->tv_sec
- stime
->tv_sec
) * 1000 * 1000 * 1000) +
40 (etime
->tv_nsec
- stime
->tv_nsec
);
42 return 1000 * len
/ dtime
;
45 static off_t
get_blk_size(int fd
)
48 if (ioctl(fd
, BLKGETSIZE64
, &size
))
49 errp("ioctl(BLKGETSIZE64) failed");
53 static off_t
get_size(int fd
)
58 errp("could not stat %i", fd
);
60 if (S_ISREG(st
.st_mode
))
62 else if (S_ISBLK(st
.st_mode
))
63 return get_blk_size(fd
);
66 errp("unknown type of file");
69 int main(int argc
, char *argv
[])
74 setlocale(LC_NUMERIC
, "en_US");
78 offset
= atoll(argv
[2]);
83 puts("Usage: ddnuke <dev> [offset in bytes]");
87 int fd
= open(file
, O_WRONLY
);
89 errp("open(%s) failed", file
);
91 off_t max_size
= get_size(fd
);
93 if (lseek(fd
, offset
, SEEK_SET
) != offset
)
94 errp("lseek(%"PRIu64
"u) failed", offset
);
96 unsigned long long speed
= 0;
97 struct timespec stime
, etime
, itime
;
98 clock_gettime(CLOCK_MONOTONIC
, &stime
);
101 off_t pos
= offset
, last_pos
= 0;
104 while (pos
< max_size
) {
105 ret
= write(fd
, zero
, sizeof(zero
));
107 if (ret
!= sizeof(zero
)) {
108 printf("\ngot back %zi (wanted %zu)\n%'llu MB/s over entire run\n",
109 ret
, sizeof(zero
), mbps(&itime
, &etime
, pos
));
113 printf("%'llu bytes %u%% (%'llu MB/s)%20s\r", (unsigned long long)pos
,
114 (unsigned)((pos
* 100) / max_size
), speed
, "");
116 if ((++fsync_pos
% 16) == 0) {
117 speed
= mbps(&stime
, &etime
, pos
- last_pos
);