]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - tools-util.c
Update bcachefs sources to 171da96d76 bcachefs: Drop some anonymous structs, unions
[bcachefs-tools-debian] / tools-util.c
index 98cb350387c601f44a9935aedcce0c2521cf8ea4..65835edfae5af3b5fafad2b3229a98114e36e94c 100644 (file)
@@ -94,12 +94,12 @@ void xpread(int fd, void *buf, size_t count, off_t offset)
        }
 }
 
-void xpwrite(int fd, const void *buf, size_t count, off_t offset)
+void xpwrite(int fd, const void *buf, size_t count, off_t offset, const char *msg)
 {
        ssize_t r = pwrite(fd, buf, count, offset);
 
        if (r != count)
-               die("write error (ret %zi err %m)", r);
+               die("error writing %s (ret %zi err %m)", msg, r);
 }
 
 struct stat xfstatat(int dirfd, const char *path, int flags)
@@ -126,63 +126,19 @@ struct stat xstat(const char *path)
        return statbuf;
 }
 
-/* Formatting: */
-
-int printf_pad(unsigned pad, const char * fmt, ...)
-{
-       va_list args;
-       int ret;
-
-       va_start(args, fmt);
-       ret = vprintf(fmt, args);
-       va_end(args);
-
-       while (ret++ < pad)
-              putchar(' ');
-
-       return ret;
-}
+/* File parsing (i.e. sysfs) */
 
-struct units_buf __pr_units(s64 _v, enum units units)
+void write_file_str(int dirfd, const char *path, const char *str)
 {
-       struct units_buf ret;
-       char *out = ret.b, *end = out + sizeof(ret.b);
-       u64 v = _v;
-
-       if (_v < 0) {
-               out += scnprintf(out, end - out, "-");
-               v = -_v;
-       }
-
-       switch (units) {
-       case BYTES:
-               snprintf(out, end - out, "%llu", v << 9);
-               break;
-       case SECTORS:
-               snprintf(out, end - out, "%llu", v);
-               break;
-       case HUMAN_READABLE:
-               v <<= 9;
-
-               if (v >= 1024) {
-                       int exp = log(v) / log(1024);
-                       snprintf(out, end - out, "%.1f%c",
-                                v / pow(1024, exp),
-                                "KMGTPE"[exp-1]);
-               } else {
-                       snprintf(out, end - out, "%llu", v);
-               }
-
-               break;
-       }
+       int fd = xopenat(dirfd, path, O_WRONLY);
+       ssize_t wrote, len = strlen(str);
 
-       return ret;
+       wrote = write(fd, str, len);
+       if (wrote != len)
+               die("read error: %m");
+       close(fd);
 }
 
-/* Argument parsing stuff: */
-
-/* File parsing (i.e. sysfs) */
-
 char *read_file_str(int dirfd, const char *path)
 {
        int fd = xopenat(dirfd, path, O_RDONLY);
@@ -242,7 +198,7 @@ u64 get_size(const char *path, int fd)
        return ret;
 }
 
-/* Returns blocksize in units of 512 byte sectors: */
+/* Returns blocksize, in bytes: */
 unsigned get_blocksize(const char *path, int fd)
 {
        struct stat statbuf = xfstat(fd);
@@ -331,22 +287,21 @@ static int range_cmp(const void *_l, const void *_r)
 void ranges_sort_merge(ranges *r)
 {
        struct range *t, *i;
-       ranges tmp = { NULL };
+       ranges tmp = { 0 };
 
-       sort(&darray_item(*r, 0), darray_size(*r),
-            sizeof(darray_item(*r, 0)), range_cmp, NULL);
+       sort(r->data, r->nr, sizeof(r->data[0]), range_cmp, NULL);
 
        /* Merge contiguous ranges: */
-       darray_foreach(i, *r) {
-               t = tmp.size ?  &tmp.item[tmp.size - 1] : NULL;
+       darray_for_each(*r, i) {
+               t = tmp.nr ?  &tmp.data[tmp.nr - 1] : NULL;
 
                if (t && t->end >= i->start)
                        t->end = max(t->end, i->end);
                else
-                       darray_append(tmp, *i);
+                       darray_push(&tmp, *i);
        }
 
-       darray_free(*r);
+       darray_exit(r);
        *r = tmp;
 }
 
@@ -354,7 +309,7 @@ void ranges_roundup(ranges *r, unsigned block_size)
 {
        struct range *i;
 
-       darray_foreach(i, *r) {
+       darray_for_each(*r, i) {
                i->start = round_down(i->start, block_size);
                i->end  = round_up(i->end, block_size);
        }
@@ -364,7 +319,7 @@ void ranges_rounddown(ranges *r, unsigned block_size)
 {
        struct range *i;
 
-       darray_foreach(i, *r) {
+       darray_for_each(*r, i) {
                i->start = round_up(i->start, block_size);
                i->end  = round_down(i->end, block_size);
                i->end  = max(i->end, i->start);
@@ -403,24 +358,6 @@ char *strcmp_prefix(char *a, const char *a_prefix)
        return *a_prefix ? NULL : a;
 }
 
-unsigned hatoi_validate(const char *s, const char *msg)
-{
-       u64 v;
-
-       if (bch2_strtoull_h(s, &v))
-               die("bad %s %s", msg, s);
-
-       v /= 512;
-
-       if (v > USHRT_MAX)
-               die("%s too large\n", msg);
-
-       if (!v)
-               die("%s too small\n", msg);
-
-       return v;
-}
-
 /* crc32c */
 
 static u32 crc32c_default(u32 crc, const void *buf, size_t size)
@@ -670,19 +607,41 @@ int dev_mounted(char *dev)
 
 struct bpos bpos_parse(char *buf)
 {
-       char *s = buf, *field;
+       char *orig = strdup(buf);
+       char *s = buf;
+
+       char *inode_s   = strsep(&s, ":");
+       char *offset_s  = strsep(&s, ":");
+       char *snapshot_s = strsep(&s, ":");
+
+       if (!inode_s || !offset_s || s)
+               die("invalid bpos %s", orig);
+       free(orig);
+
        u64 inode_v = 0, offset_v = 0;
+       u32 snapshot_v = 0;
+       if (kstrtoull(inode_s, 10, &inode_v))
+               die("invalid bpos.inode %s", inode_s);
 
-       if (!(field = strsep(&s, ":")) ||
-           kstrtoull(field, 10, &inode_v))
-               die("invalid bpos %s", buf);
+       if (kstrtoull(offset_s, 10, &offset_v))
+               die("invalid bpos.offset %s", offset_s);
 
-       if ((field = strsep(&s, ":")) &&
-           kstrtoull(field, 10, &offset_v))
-               die("invalid bpos %s", buf);
+       if (snapshot_s &&
+           kstrtouint(snapshot_s, 10, &snapshot_v))
+               die("invalid bpos.snapshot %s", snapshot_s);
 
-       if (s)
-               die("invalid bpos %s", buf);
+       return (struct bpos) { .inode = inode_v, .offset = offset_v, .snapshot = snapshot_v };
+}
 
-       return (struct bpos) { .inode = inode_v, .offset = offset_v };
+struct bbpos bbpos_parse(char *buf)
+{
+       char *s = buf, *field;
+       struct bbpos ret;
+
+       if (!(field = strsep(&s, ":")))
+               die("invalid bbpos %s", buf);
+
+       ret.btree = read_string_list_or_die(field, bch2_btree_ids, "btree id");
+       ret.pos = bpos_parse(s);
+       return ret;
 }