/* See LICENSE file for copyright and license details. */ #include #include #include #define NANOSECONDS(X) X##L #define MICROSECONDS(X) NANOSECONDS(X##000) #define MILLISECONDS(X) MICROSECONDS(X##000) #define CENTISECONDS(X) MILLISECONDS(X##0) #define DECISECONDS(X) CENTISECONDS(X##0) #define WHOLE_SECOND DECISECONDS(10) #define WRAVG_STEPS 5 enum direction { FORWARDS = 0, BACKWARDS = 1 }; struct span { off_t start; off_t end; off_t bad; size_t blocksize; }; struct status { struct timespec now; off_t shredded; off_t bad_bytes; uintmax_t bad_writes; uintmax_t bad_sections; uintmax_t pass_nr; struct timespec last_success; enum direction direction; int write_average_i; struct timespec write_average_begin_times[WRAVG_STEPS]; off_t write_average_amounts[WRAVG_STEPS]; }; #define STATUS_INIT {.pass_nr = 1, .last_success = {-1, 0}, .direction = FORWARDS} /* deadshred.c */ extern struct status status; extern _Atomic volatile sig_atomic_t exiting; /* io.c */ off_t filesize(int fd, const char *fname); /* fmt.c */ const char *humansize1000(off_t s, char *buf); const char *humansize1024(off_t s, char *buf); #if defined(__GNUC__) __attribute__((__pure__)) #endif off_t unhumansize(const char *s, char flag); const char *durationstr(const struct timespec *dur, char *buf, int second_decimals); const char *humanbytespersecond(double bytes_per_second, char *buf); /* text.c */ int have_micro_symbol(void); /* avg.c */ void wravg_init(const struct timespec *start_time, struct status *s); void wravg_update_write(ssize_t amount, struct status *s); void wravg_update_time(struct status *s); const char *wravg_get(struct status *s); /* rnd.c */ #if defined(__GNUC__) __attribute__((__const__)) #endif size_t max_blksize(void); void init_random(int fd, const char *fname); const char *get_random(size_t needed); void used_random(ssize_t amount); /* sig.c */ void setup_sighandler(void); void block_sigs(void); void unblock_sigs(void);