pthread_mutex_unlock(&ctx->dfu_sync_mutex);
switch (*info[DFU_INFO_MODE]) {
- case 'f':
+ case DFU_INFO_MODE_FILE:
fsync(ctx->dfu_fd);
close(ctx->dfu_fd);
umount_dev();
break;
- case 'p':
+ case DFU_INFO_MODE_PARTITION:
close(ctx->dfu_fd);
break;
default:
fprintf(stdout, "finished\n");
}
-static char *get_partition_devname(const char *label)
-{
- blkid_dev_iterate dev_iter;
- blkid_tag_iterate tag_iter;
- blkid_dev dev;
- blkid_cache cache = NULL;
- const char *type, *value;
- int ret;
-
- ret = blkid_get_cache(&cache, NULL);
- if (ret < 0)
- return NULL;
-
- blkid_probe_all(cache);
-
- dev_iter = blkid_dev_iterate_begin(cache);
- blkid_dev_set_search(dev_iter, NULL, NULL);
- while (blkid_dev_next(dev_iter, &dev) == 0) {
- dev = blkid_verify(cache, dev);
- if (!dev)
- continue;
-
- tag_iter = blkid_tag_iterate_begin(dev);
- while (blkid_tag_next(tag_iter, &type, &value) == 0) {
- if (!strncmp(type, "LABEL", 5) && !strncmp(value, label, strlen(label))) {
- char *devname = strdup(blkid_dev_devname(dev));
-
- /*
- * To distinguish physical partition and ram mounted partition,
- * continue to search the next entry if the devname includes
- * 'ram'(eg. /dev/ram0).
- */
- if (strstr(devname, "ram")) {
- free(devname);
- continue;
- }
-
- blkid_tag_iterate_end(tag_iter);
- blkid_dev_iterate_end(dev_iter);
- blkid_put_cache(cache);
- return devname;
- }
- }
- blkid_tag_iterate_end(tag_iter);
- }
- blkid_dev_iterate_end(dev_iter);
- blkid_put_cache(cache);
-
- return NULL;
-}
-
static char *get_partition_fstype(const char *devname)
{
blkid_tag_iterate tag_iter;
int fd;
switch (*info[DFU_INFO_MODE]) {
- case 'p':
- file = get_partition_devname(info[DFU_INFO_LABEL]);
- if (!file) {
- fprintf(stderr, "failed to get partition devname: %s", info[DFU_INFO_LABEL]);
- return -EINVAL;
- }
+ case DFU_INFO_MODE_PARTITION:
+ file = strdup(info[DFU_INFO_PARTITION]);
+ if (!file)
+ return -ENOMEM;
break;
- case 'f':
+ case DFU_INFO_MODE_FILE:
{
int path_prefix = strlen(DFU_MOUNT_PATH);
int path_suffix = strlen(info[DFU_INFO_PATH]);
int path_name = strlen(info[DFU_INFO_NAME]);
- char *devname, *fstype;
+ char fstype;
- devname = get_partition_devname(info[DFU_INFO_LABEL]);
- if (!devname) {
- fprintf(stderr, "failed to get partition devname: %s", info[DFU_INFO_LABEL]);
- return -EINVAL;
- }
-
- fstype = get_partition_fstype(devname);
+ fstype = get_partition_fstype(info[DFU_INFO_PARTITION]);
if (!fstype) {
- fprintf(stderr, "failed to get partition filesystem type: %s", devname);
+ fprintf(stderr, "failed to get partition filesystem type: %s", info[DFU_INFO_PARTITION]);
return -EINVAL;
}
- mount_dev(devname, fstype);
- free(devname);
+ mount_dev(info[DFU_INFO_PARTITION], fstype);
free(fstype);
file = malloc(path_prefix + path_suffix + path_name + 1);
return 0;
}
-
int dfu_start(struct tfm_context *ctx, const char *entity)
{
unsigned long size = ctx->thor_file_size;