]> git.sesse.net Git - bcachefs-tools-debian/blob - util.h
finish ripping out libnih
[bcachefs-tools-debian] / util.h
1 #ifndef _UTIL_H
2 #define _UTIL_H
3
4 #include <stdbool.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <sys/types.h>
8
9 /* linux kernel style types: */
10
11 #include <asm/types.h>
12 #include <asm/byteorder.h>
13
14 typedef __u8    u8;
15 typedef __u16   u16;
16 typedef __u32   u32;
17 typedef __u64   u64;
18
19 typedef __s8    s8;
20 typedef __s16   s16;
21 typedef __s32   s32;
22 typedef __s64   s64;
23
24 #define cpu_to_le16             __cpu_to_le16
25 #define cpu_to_le32             __cpu_to_le32
26 #define cpu_to_le64             __cpu_to_le64
27
28 #define le16_to_cpu             __le16_to_cpu
29 #define le32_to_cpu             __le32_to_cpu
30 #define le64_to_cpu             __le64_to_cpu
31
32 static inline void le16_add_cpu(__le16 *var, u16 val)
33 {
34         *var = cpu_to_le16(le16_to_cpu(*var) + val);
35 }
36
37 static inline void le32_add_cpu(__le32 *var, u32 val)
38 {
39         *var = cpu_to_le32(le32_to_cpu(*var) + val);
40 }
41
42 static inline void le64_add_cpu(__le64 *var, u64 val)
43 {
44         *var = cpu_to_le64(le64_to_cpu(*var) + val);
45 }
46
47 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
48
49 #define min(x, y) ({                            \
50         typeof(x) _min1 = (x);                  \
51         typeof(y) _min2 = (y);                  \
52         (void) (&_min1 == &_min2);              \
53         _min1 < _min2 ? _min1 : _min2; })
54
55 #define max(x, y) ({                            \
56         typeof(x) _max1 = (x);                  \
57         typeof(y) _max2 = (y);                  \
58         (void) (&_max1 == &_max2);              \
59         _max1 > _max2 ? _max1 : _max2; })
60
61 #define die(arg, ...)                                   \
62 do {                                                    \
63         fprintf(stderr, arg "\n", ##__VA_ARGS__);       \
64         exit(EXIT_FAILURE);                             \
65 } while (0)
66
67 u64 rounddown_pow_of_two(u64);
68 unsigned ilog2(u64);
69
70 char *skip_spaces(const char *str);
71 char *strim(char *s);
72
73 enum units {
74         BYTES,
75         SECTORS,
76         HUMAN_READABLE,
77 };
78
79 struct units_buf pr_units(u64, enum units);
80
81 struct units_buf {
82         char    b[20];
83 };
84
85 long strtoul_or_die(const char *, size_t, const char *);
86
87 u64 hatoi(const char *);
88 unsigned hatoi_validate(const char *, const char *);
89 unsigned nr_args(char * const *);
90
91 char *read_file_str(int, const char *);
92 u64 read_file_u64(int, const char *);
93
94 ssize_t read_string_list(const char *, const char * const[]);
95 ssize_t read_string_list_or_die(const char *, const char * const[],
96                                 const char *);
97 void print_string_list(const char * const[], size_t);
98
99 u64 get_size(const char *, int);
100 unsigned get_blocksize(const char *, int);
101
102 #include "bcache-ondisk.h"
103 #include "bcache-ioctl.h"
104
105 u64 bch_checksum(unsigned, const void *, size_t);
106
107 #define __bkey_idx(_set, _offset)                                       \
108         ((_set)->_data + (_offset))
109
110 #define __bset_bkey_last(_set)                                          \
111          __bkey_idx((_set), (_set)->u64s)
112
113 #define __csum_set(i, u64s, type)                                       \
114 ({                                                                      \
115         const void *start = ((const void *) (i)) + sizeof(i->csum);     \
116         const void *end = __bkey_idx(i, u64s);                          \
117                                                                         \
118         bch_checksum(type, start, end - start);                         \
119 })
120
121 #define csum_set(i, type)       __csum_set(i, (i)->u64s, type)
122
123 int bcachectl_open(void);
124
125 #include <dirent.h>
126
127 struct bcache_handle {
128         DIR     *sysfs;
129         int     fd;
130 };
131
132 struct bcache_handle bcache_fs_open(const char *);
133
134 bool ask_proceed(void);
135
136 void memzero_explicit(void *, size_t);
137
138 #endif /* _UTIL_H */