|
@@ -0,0 +1,98 @@
|
|
|
+// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
+
|
|
|
+#include "common.h"
|
|
|
+
|
|
|
+#define BUFLEN 64
|
|
|
+
|
|
|
+static const char *const fit0 = "/dev/fit0";
|
|
|
+static const char *const fitrw = "/dev/fitrw";
|
|
|
+
|
|
|
+struct devpath {
|
|
|
+ char prefix[5];
|
|
|
+ char device[11];
|
|
|
+};
|
|
|
+
|
|
|
+struct fit_volume {
|
|
|
+ struct volume v;
|
|
|
+ union {
|
|
|
+ char devpathstr[16];
|
|
|
+ struct devpath devpath;
|
|
|
+ } dev;
|
|
|
+};
|
|
|
+
|
|
|
+static struct driver fit_driver;
|
|
|
+
|
|
|
+static int fit_volume_identify(struct volume *v)
|
|
|
+{
|
|
|
+ struct fit_volume *p = container_of(v, struct fit_volume, v);
|
|
|
+ int ret = FS_NONE;
|
|
|
+ FILE *f;
|
|
|
+
|
|
|
+ f = fopen(p->dev.devpathstr, "r");
|
|
|
+ if (!f)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = block_file_identify(f, 0);
|
|
|
+
|
|
|
+ fclose(f);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int fit_volume_init(struct volume *v)
|
|
|
+{
|
|
|
+ struct fit_volume *p = container_of(v, struct fit_volume, v);
|
|
|
+ char voldir[BUFLEN];
|
|
|
+ unsigned int volsize;
|
|
|
+
|
|
|
+ snprintf(voldir, sizeof(voldir), "%s/%s", block_dir_name, p->dev.devpath.device);
|
|
|
+
|
|
|
+ if (read_uint_from_file(voldir, "size", &volsize))
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ v->type = BLOCKDEV;
|
|
|
+ v->size = volsize << 9; /* size is returned in sectors of 512 bytes */
|
|
|
+ v->blk = p->dev.devpathstr;
|
|
|
+
|
|
|
+ return block_volume_format(v, 0, p->dev.devpathstr);
|
|
|
+}
|
|
|
+
|
|
|
+static struct volume *fit_volume_find(char *name)
|
|
|
+{
|
|
|
+ struct fit_volume *p;
|
|
|
+ struct stat buf;
|
|
|
+ const char *fname;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!strcmp(name, "rootfs"))
|
|
|
+ fname = fit0;
|
|
|
+ else if (!strcmp(name, "rootfs_data"))
|
|
|
+ fname = fitrw;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ ret = stat(fname, &buf);
|
|
|
+ if (ret)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ p = calloc(1, sizeof(struct fit_volume));
|
|
|
+ if (!p)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ strcpy(p->dev.devpathstr, fname);
|
|
|
+ p->v.drv = &fit_driver;
|
|
|
+ p->v.blk = p->dev.devpathstr;
|
|
|
+ p->v.name = name;
|
|
|
+
|
|
|
+ return &p->v;
|
|
|
+}
|
|
|
+
|
|
|
+static struct driver fit_driver = {
|
|
|
+ .name = "fit",
|
|
|
+ .priority = 30,
|
|
|
+ .find = fit_volume_find,
|
|
|
+ .init = fit_volume_init,
|
|
|
+ .identify = fit_volume_identify,
|
|
|
+};
|
|
|
+
|
|
|
+DRIVER(fit_driver);
|