part: let list put the list in an environment variable
[platform/kernel/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 static int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc,
25                                 char * const argv[])
26 {
27         char *vol_name;
28         int ret;
29
30         if (argc != 2)
31                 return CMD_RET_USAGE;
32
33         vol_name = argv[1];
34         debug("Using volume %s\n", vol_name);
35
36         if (ubifs_initialized == 0) {
37                 ubifs_init();
38                 ubifs_initialized = 1;
39         }
40
41         ret = uboot_ubifs_mount(vol_name);
42         if (ret)
43                 return -1;
44
45         ubifs_mounted = 1;
46
47         return 0;
48 }
49
50 int ubifs_is_mounted(void)
51 {
52         return ubifs_mounted;
53 }
54
55 void cmd_ubifs_umount(void)
56 {
57
58         if (ubifs_sb) {
59                 printf("Unmounting UBIFS volume %s!\n",
60                        ((struct ubifs_info *)(ubifs_sb->s_fs_info))->vi.name);
61                 ubifs_umount(ubifs_sb->s_fs_info);
62         }
63
64         ubifs_sb = NULL;
65         ubifs_mounted = 0;
66         ubifs_initialized = 0;
67 }
68
69 static int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc,
70                                 char * const argv[])
71 {
72         if (argc != 1)
73                 return CMD_RET_USAGE;
74
75         if (ubifs_initialized == 0) {
76                 printf("No UBIFS volume mounted!\n");
77                 return -1;
78         }
79
80         cmd_ubifs_umount();
81
82         return 0;
83 }
84
85 static int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc,
86                         char * const argv[])
87 {
88         char *filename = "/";
89         int ret;
90
91         if (!ubifs_mounted) {
92                 printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
93                 return -1;
94         }
95
96         if (argc == 2)
97                 filename = argv[1];
98         debug("Using filename %s\n", filename);
99
100         ret = ubifs_ls(filename);
101         if (ret) {
102                 printf("** File not found %s **\n", filename);
103                 ret = CMD_RET_FAILURE;
104         }
105
106         return ret;
107 }
108
109 static int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc,
110                                 char * const argv[])
111 {
112         char *filename;
113         char *endp;
114         int ret;
115         u32 addr;
116         u32 size = 0;
117
118         if (!ubifs_mounted) {
119                 printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
120                 return -1;
121         }
122
123         if (argc < 3)
124                 return CMD_RET_USAGE;
125
126         addr = simple_strtoul(argv[1], &endp, 16);
127         if (endp == argv[1])
128                 return CMD_RET_USAGE;
129
130         filename = argv[2];
131
132         if (argc == 4) {
133                 size = simple_strtoul(argv[3], &endp, 16);
134                 if (endp == argv[3])
135                         return CMD_RET_USAGE;
136         }
137         debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);
138
139         ret = ubifs_load(filename, addr, size);
140         if (ret) {
141                 printf("** File not found %s **\n", filename);
142                 ret = CMD_RET_FAILURE;
143         }
144
145         return ret;
146 }
147
148 U_BOOT_CMD(
149         ubifsmount, 2, 0, do_ubifs_mount,
150         "mount UBIFS volume",
151         "<volume-name>\n"
152         "    - mount 'volume-name' volume"
153 );
154
155 U_BOOT_CMD(
156         ubifsumount, 1, 0, do_ubifs_umount,
157         "unmount UBIFS volume",
158         "    - unmount current volume"
159 );
160
161 U_BOOT_CMD(
162         ubifsls, 2, 0, do_ubifs_ls,
163         "list files in a directory",
164         "[directory]\n"
165         "    - list files in a 'directory' (default '/')"
166 );
167
168 U_BOOT_CMD(
169         ubifsload, 4, 0, do_ubifs_load,
170         "load file from an UBIFS filesystem",
171         "<addr> <filename> [bytes]\n"
172         "    - load file 'filename' to address 'addr'"
173 );