]> git.ipfire.org Git - people/ms/u-boot.git/blob - common/cmd_ubifs.c
fdc8bfe46a63ae7883cec2f85b291311501523d9
[people/ms/u-boot.git] / common / cmd_ubifs.c
1 /*
2 * (C) Copyright 2008
3 * Stefan Roese, DENX Software Engineering, sr@denx.de.
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8
9 /*
10 * UBIFS command support
11 */
12
13 #undef DEBUG
14
15 #include <common.h>
16 #include <config.h>
17 #include <command.h>
18
19 #include "../fs/ubifs/ubifs.h"
20
21 static int ubifs_initialized;
22 static int ubifs_mounted;
23
24 int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
25 {
26 char *vol_name;
27 int ret;
28
29 if (argc != 2)
30 return CMD_RET_USAGE;
31
32 vol_name = argv[1];
33 debug("Using volume %s\n", vol_name);
34
35 if (ubifs_initialized == 0) {
36 ubifs_init();
37 ubifs_initialized = 1;
38 }
39
40 ret = ubifs_mount(vol_name);
41 if (ret)
42 return -1;
43
44 ubifs_mounted = 1;
45
46 return 0;
47 }
48
49 int ubifs_is_mounted(void)
50 {
51 return ubifs_mounted;
52 }
53
54 void cmd_ubifs_umount(void)
55 {
56
57 if (ubifs_sb) {
58 printf("Unmounting UBIFS volume %s!\n",
59 ((struct ubifs_info *)(ubifs_sb->s_fs_info))->vi.name);
60 ubifs_umount(ubifs_sb->s_fs_info);
61 }
62
63 ubifs_sb = NULL;
64 ubifs_mounted = 0;
65 ubifs_initialized = 0;
66 }
67
68 int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
69 {
70 if (argc != 1)
71 return CMD_RET_USAGE;
72
73 if (ubifs_initialized == 0) {
74 printf("No UBIFS volume mounted!\n");
75 return -1;
76 }
77
78 cmd_ubifs_umount();
79
80 return 0;
81 }
82
83 int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
84 {
85 char *filename = "/";
86 int ret;
87
88 if (!ubifs_mounted) {
89 printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
90 return -1;
91 }
92
93 if (argc == 2)
94 filename = argv[1];
95 debug("Using filename %s\n", filename);
96
97 ret = ubifs_ls(filename);
98 if (ret) {
99 printf("** File not found %s **\n", filename);
100 ret = CMD_RET_FAILURE;
101 }
102
103 return ret;
104 }
105
106 int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
107 {
108 char *filename;
109 char *endp;
110 int ret;
111 u32 addr;
112 u32 size = 0;
113
114 if (!ubifs_mounted) {
115 printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
116 return -1;
117 }
118
119 if (argc < 3)
120 return CMD_RET_USAGE;
121
122 addr = simple_strtoul(argv[1], &endp, 16);
123 if (endp == argv[1])
124 return CMD_RET_USAGE;
125
126 filename = argv[2];
127
128 if (argc == 4) {
129 size = simple_strtoul(argv[3], &endp, 16);
130 if (endp == argv[3])
131 return CMD_RET_USAGE;
132 }
133 debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);
134
135 ret = ubifs_load(filename, addr, size);
136 if (ret) {
137 printf("** File not found %s **\n", filename);
138 ret = CMD_RET_FAILURE;
139 }
140
141 return ret;
142 }
143
144 U_BOOT_CMD(
145 ubifsmount, 2, 0, do_ubifs_mount,
146 "mount UBIFS volume",
147 "<volume-name>\n"
148 " - mount 'volume-name' volume"
149 );
150
151 U_BOOT_CMD(
152 ubifsumount, 1, 0, do_ubifs_umount,
153 "unmount UBIFS volume",
154 " - unmount current volume"
155 );
156
157 U_BOOT_CMD(
158 ubifsls, 2, 0, do_ubifs_ls,
159 "list files in a directory",
160 "[directory]\n"
161 " - list files in a 'directory' (default '/')"
162 );
163
164 U_BOOT_CMD(
165 ubifsload, 4, 0, do_ubifs_load,
166 "load file from an UBIFS filesystem",
167 "<addr> <filename> [bytes]\n"
168 " - load file 'filename' to address 'addr'"
169 );