X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=tools-util.h;h=e5c3508474b9431c60a6d63de59cce99965b4e45;hb=5bc48bd428303aabe19c196a47d1d89a605397be;hp=5c8ea1372e8e4c662f2e96374b5e7c3327ca88ba;hpb=b33fc8298f7e13226b9895abc57c9bfce5e3fa2d;p=bcachefs-tools-debian diff --git a/tools-util.h b/tools-util.h index 5c8ea13..e5c3508 100644 --- a/tools-util.h +++ b/tools-util.h @@ -1,22 +1,56 @@ #ifndef _TOOLS_UTIL_H #define _TOOLS_UTIL_H +#include +#include #include #include #include +#include +#include #include +#include +#include #include #include #include #include #include - -#define die(arg, ...) \ -do { \ - fprintf(stderr, arg "\n", ##__VA_ARGS__); \ - exit(EXIT_FAILURE); \ -} while (0) +#include +#include "ccan/darray/darray.h" + +void die(const char *, ...); +char *mprintf(const char *, ...) + __attribute__ ((format (printf, 1, 2))); +void *xcalloc(size_t, size_t); +void *xmalloc(size_t); +void *xrealloc(void *, size_t); +void xpread(int, void *, size_t, off_t); +void xpwrite(int, const void *, size_t, off_t); +struct stat xfstatat(int, const char *, int); +struct stat xfstat(int); +struct stat xstat(const char *); + +#define xopenat(_dirfd, _path, ...) \ +({ \ + int _fd = openat((_dirfd), (_path), __VA_ARGS__); \ + if (_fd < 0) \ + die("Error opening %s: %m", (_path)); \ + _fd; \ +}) + +#define xopen(...) xopenat(AT_FDCWD, __VA_ARGS__) + +#define xioctl(_fd, _nr, ...) \ +({ \ + int _ret = ioctl((_fd), (_nr), ##__VA_ARGS__); \ + if (_ret < 0) \ + die(#_nr " ioctl error: %m"); \ + _ret; \ +}) + +int printf_pad(unsigned pad, const char * fmt, ...); enum units { BYTES, @@ -24,41 +58,118 @@ enum units { HUMAN_READABLE, }; -struct units_buf pr_units(u64, enum units); +struct units_buf __pr_units(s64, enum units); struct units_buf { char b[20]; }; -long strtoul_or_die(const char *, size_t, const char *); - -u64 hatoi(const char *); -unsigned hatoi_validate(const char *, const char *); -unsigned nr_args(char * const *); +#define pr_units(_v, _u) &(__pr_units(_v, _u).b[0]) char *read_file_str(int, const char *); u64 read_file_u64(int, const char *); -ssize_t read_string_list(const char *, const char * const[]); ssize_t read_string_list_or_die(const char *, const char * const[], const char *); -void print_string_list(const char * const[], size_t); u64 get_size(const char *, int); unsigned get_blocksize(const char *, int); +int open_for_format(const char *, bool); + +bool ask_yn(void); + +struct range { + u64 start; + u64 end; +}; -#include "linux/bcache.h" -#include "linux/bcache-ioctl.h" +typedef darray(struct range) ranges; -int bcachectl_open(void); +static inline void range_add(ranges *data, u64 offset, u64 size) +{ + darray_append(*data, (struct range) { + .start = offset, + .end = offset + size + }); +} -struct bcache_handle { - int ioctl_fd; - int sysfs_fd; +void ranges_sort_merge(ranges *); +void ranges_roundup(ranges *, unsigned); +void ranges_rounddown(ranges *, unsigned); + +struct hole_iter { + ranges r; + size_t idx; + u64 end; }; -struct bcache_handle bcache_fs_open(const char *); +static inline struct range hole_iter_next(struct hole_iter *iter) +{ + struct range r = { + .start = iter->idx ? iter->r.item[iter->idx - 1].end : 0, + .end = iter->idx < iter->r.size + ? iter->r.item[iter->idx].start : iter->end, + }; + + BUG_ON(r.start > r.end); + + iter->idx++; + return r; +} + +#define for_each_hole(_iter, _ranges, _end, _i) \ + for (_iter = (struct hole_iter) { .r = _ranges, .end = _end }; \ + (_iter.idx <= _iter.r.size && \ + (_i = hole_iter_next(&_iter), true));) + +#include + +struct fiemap_iter { + struct fiemap f; + struct fiemap_extent fe[1024]; + unsigned idx; + int fd; +}; + +static inline void fiemap_iter_init(struct fiemap_iter *iter, int fd) +{ + memset(iter, 0, sizeof(*iter)); + + iter->f.fm_extent_count = ARRAY_SIZE(iter->fe); + iter->f.fm_length = FIEMAP_MAX_OFFSET; + iter->fd = fd; +} + +struct fiemap_extent fiemap_iter_next(struct fiemap_iter *); + +#define fiemap_for_each(fd, iter, extent) \ + for (fiemap_iter_init(&iter, fd); \ + (extent = fiemap_iter_next(&iter)).fe_length;) + +char *strcmp_prefix(char *, const char *); + +unsigned hatoi_validate(const char *, const char *); + +u32 crc32c(u32, const void *, size_t); + +char *dev_to_name(dev_t); +char *dev_to_path(dev_t); +struct mntent *dev_to_mount(char *); +bool dev_mounted_rw(char *); + +#define args_shift(_nr) \ +do { \ + unsigned _n = min((_nr), argc); \ + argc -= _n; \ + argv += _n; \ +} while (0) -bool ask_proceed(void); +#define arg_pop() \ +({ \ + char *_ret = argc ? argv[0] : NULL; \ + if (_ret) \ + args_shift(1); \ + _ret; \ +}) #endif /* _TOOLS_UTIL_H */