int ubi_get_vol_info(libubi_t desc, const char *node, struct ubi_vol_info *info) { int err, vol_id, dev_num; struct libubi *lib = (struct libubi *)desc; err = ubi_probe_node(desc, node); if (err != 2) { if (err == 1) errno = ENODEV; return -1; } if (vol_node2nums(lib, node, &dev_num, &vol_id)) return -1; return ubi_get_vol_info1(desc, dev_num, vol_id, info); }
int ubi_get_dev_info(libubi_t desc, const char *node, struct ubi_dev_info *info) { int err, dev_num; struct libubi *lib = (struct libubi *)desc; err = ubi_probe_node(desc, node); if (err != 1) { if (err == 2) errno = ENODEV; return -1; } if (dev_node2num(lib, node, &dev_num)) return -1; return ubi_get_dev_info1(desc, dev_num, info); }
static int update_volume(libubi_t libubi, int fdsw, struct img_type *img, struct ubi_vol_info *vol) { long long bytes; int fdout; char node[64]; int err; unsigned long offset = 0; uint32_t checksum = 0; char sbuf[128]; bytes = img->size; if (!libubi) { ERROR("Request to write into UBI, but no UBI on system"); return -1; } if (bytes > vol->rsvd_bytes) { ERROR("\"%s\" (size %lld) will not fit volume \"%s\" (size %lld)", img->fname, bytes, img->volname, vol->rsvd_bytes); return -1; } snprintf(node, sizeof(node), "/dev/ubi%d_%d", vol->dev_num, vol->vol_id); err = ubi_probe_node(libubi, node); if (err == 1) { ERROR("\"%s\" is an UBI device node, not an UBI volume node", node); return -1; } if (err < 0) { if (errno == ENODEV) ERROR("%s is not an UBI volume node", node); else ERROR("error while probing %s", node); return -1; } fdout = open(node, O_RDWR); if (fdout < 0) { ERROR("cannot open UBI volume \"%s\"", node); return -1; } err = ubi_update_start(libubi, fdout, bytes); if (err) { ERROR("cannot start volume \"%s\" update", node); return -1; } snprintf(sbuf, sizeof(sbuf), "Installing image %s into volume %s(%s)", img->fname, node, img->volname); notify(RUN, RECOVERY_NO_ERROR, sbuf); printf("Updating UBI : %s %lld %lu\n", img->fname, img->size, offset); if (copyfile(fdsw, fdout, img->size, (unsigned long *)&img->offset, 0, img->compressed, &checksum) < 0) { ERROR("Error copying extracted file"); err = -1; } close(fdout); return err; }
int main(int argc, char * const argv[]) { int i, err; int count = 0; libubi_t libubi; struct ubi_dev_info dev_info; struct ubi_rnvol_req rnvol; const char *node; if (argc < 3 || (argc & 1) == 1) { errmsg("too few arguments"); fprintf(stderr, "%s\n", usage); return -1; } if (argc > UBI_MAX_RNVOL + 2) { errmsg("too many volumes to re-name, max. is %d", UBI_MAX_RNVOL); return -1; } node = argv[1]; libubi = libubi_open(); if (!libubi) { if (errno == 0) return errmsg("UBI is not present in the system"); return sys_errmsg("cannot open libubi"); } err = ubi_probe_node(libubi, node); if (err == 2) { errmsg("\"%s\" is an UBI volume node, not an UBI device node", node); goto out_libubi; } else if (err < 0) { if (errno == ENODEV) errmsg("\"%s\" is not an UBI device node", node); else sys_errmsg("error while probing \"%s\"", node); goto out_libubi; } err = ubi_get_dev_info(libubi, node, &dev_info); if (err == -1) { sys_errmsg("cannot get information about UBI device \"%s\"", node); goto out_libubi; } for (i = 2; i < argc; i += 2) { err = get_vol_id(libubi, &dev_info, argv[i]); if (err == -1) { errmsg("\"%s\" volume not found", argv[i]); goto out_libubi; } rnvol.ents[count].vol_id = err; rnvol.ents[count].name_len = strlen(argv[i + 1]); strcpy(rnvol.ents[count++].name, argv[i + 1]); } rnvol.count = count; err = ubi_rnvols(libubi, node, &rnvol); if (err == -1) { sys_errmsg("cannot rename volumes"); goto out_libubi; } libubi_close(libubi); return 0; out_libubi: libubi_close(libubi); return -1; }