int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *filename; char *endp; int ret; u32 addr; u32 size = 0; if (!ubifs_mounted) { printf("UBIFS not mounted, use ubifs mount to mount volume first!\n"); return -1; } if (argc < 3) return CMD_RET_USAGE; addr = simple_strtoul(argv[1], &endp, 16); if (addr == 0) addr = load_addr; if (endp == argv[1]) return CMD_RET_USAGE; filename = argv[2]; if (argc == 4) { size = simple_strtoul(argv[3], &endp, 16); if (endp == argv[3]) return CMD_RET_USAGE; } debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size); ret = ubifs_load(filename, addr, size); if (ret) { printf("** File not found %s **\n", filename); ret = CMD_RET_FAILURE; } setenv_hex("fileaddr", addr); return ret; }
int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *filename; char *endp; int ret; u32 addr; u32 size = 0; char buf[32]; if (!ubifs_mounted) { printf("UBIFS not mounted, use ubifs mount to mount volume first!\n"); return -1; } if (argc < 3) return CMD_RET_USAGE; addr = simple_strtoul(argv[1], &endp, 16); if (endp == argv[1]) return CMD_RET_USAGE; filename = argv[2]; if (argc == 4) { size = simple_strtoul(argv[3], &endp, 16); if (endp == argv[3]) return CMD_RET_USAGE; } debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size); ret = ubifs_load(filename, addr, &size); if (ret) printf("%s not found!\n", filename); else { sprintf(buf, "%X", size); setenv("filesize", buf); } return ret; }
int ubifs_load(char *filename, u32 addr, u32 size) { struct ubifs_info *c = ubifs_sb->s_fs_info; unsigned long inum; struct inode *inode; struct page page; int err = 0; int i; int count; char link_name[64]; struct ubifs_inode *ui; c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY); inum = ubifs_findfile(ubifs_sb, filename); if (!inum) { err = -1; goto out; } /* * Read file inode */ inode = ubifs_iget(ubifs_sb, inum); if (IS_ERR(inode)) { printf("%s: Error reading inode %ld!\n", __func__, inum); err = PTR_ERR(inode); goto out; } /* * Check for symbolic link */ ui = ubifs_inode(inode); if (((inode->i_mode & S_IFMT) == S_IFLNK) && ui->data_len) { memcpy(link_name, ui->data, ui->data_len); printf("%s is linked to %s!\n", filename, link_name); ubifs_iput(inode); /* * Now we have the "real" filename, call ubifs_load() * again (recursive call) to load this file instead */ return ubifs_load(link_name, addr, size); } /* * If no size was specified or if size bigger than filesize * set size to filesize */ if ((size == 0) || (size > inode->i_size)) size = inode->i_size; count = (size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT; printf("Loading file '%s' to addr 0x%08x with size %d (0x%08x)...\n", filename, addr, size, size); page.addr = (void *)addr; page.index = 0; page.inode = inode; for (i = 0; i < count; i++) { err = do_readpage(c, inode, &page); if (err) break; page.addr += PAGE_SIZE; page.index++; } if (err) printf("Error reading file '%s'\n", filename); else printf("Done\n"); ubifs_iput(inode); out: ubi_close_volume(c->ubi); return err; }