Skip to content

Commit 8c82d00

Browse files
mstumpf-vectedkartben
authored andcommitted
fs: shell: Add cp command
Creates a copy of a given file. Signed-off-by: Martin Stumpf <[email protected]>
1 parent 5261680 commit 8c82d00

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

subsys/fs/shell.c

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,80 @@ static int cmd_rm(const struct shell *sh, size_t argc, char **argv)
275275
return err;
276276
}
277277

278+
static int cmd_cp(const struct shell *sh, size_t argc, char **argv)
279+
{
280+
int err;
281+
int close_err;
282+
char path_src[MAX_PATH_LEN];
283+
char path_dst[MAX_PATH_LEN];
284+
struct fs_file_t file_src;
285+
struct fs_file_t file_dst;
286+
uint8_t buf[BUF_CNT];
287+
ssize_t buf_len;
288+
ssize_t num_written;
289+
290+
create_abs_path(argv[1], path_src, sizeof(path_src));
291+
create_abs_path(argv[2], path_dst, sizeof(path_dst));
292+
293+
fs_file_t_init(&file_src);
294+
fs_file_t_init(&file_dst);
295+
296+
err = fs_open(&file_src, path_src, FS_O_READ);
297+
if (err) {
298+
shell_error(sh, "Failed to open %s (%d)", path_src, err);
299+
err = -EIO;
300+
goto exit;
301+
}
302+
303+
err = fs_open(&file_dst, path_dst, FS_O_CREATE | FS_O_TRUNC | FS_O_WRITE);
304+
if (err) {
305+
shell_error(sh, "Failed to open %s (%d)", path_dst, err);
306+
err = -EIO;
307+
goto close_src;
308+
}
309+
310+
while (true) {
311+
buf_len = fs_read(&file_src, buf, BUF_CNT);
312+
if (buf_len < 0) {
313+
shell_error(sh, "Failed to read %s (%d)", path_src, (int)buf_len);
314+
err = -EIO;
315+
goto close;
316+
}
317+
if (buf_len == 0) {
318+
break;
319+
}
320+
321+
num_written = fs_write(&file_dst, buf, buf_len);
322+
if (num_written < 0) {
323+
shell_error(sh, "Failed to write %s (%d)", path_dst, (int)num_written);
324+
err = -EIO;
325+
goto close;
326+
}
327+
if (num_written != buf_len) {
328+
shell_error(sh, "Failed to write %s", path_dst);
329+
err = -EIO;
330+
goto close;
331+
}
332+
}
333+
334+
close:
335+
close_err = fs_close(&file_dst);
336+
if (close_err) {
337+
shell_error(sh, "Failed to close %s", path_dst);
338+
err = -EIO;
339+
}
340+
341+
close_src:
342+
close_err = fs_close(&file_src);
343+
if (close_err) {
344+
shell_error(sh, "Failed to close %s", path_src);
345+
err = -EIO;
346+
}
347+
348+
exit:
349+
return err;
350+
}
351+
278352
static int cmd_read(const struct shell *sh, size_t argc, char **argv)
279353
{
280354
char path[MAX_PATH_LEN];
@@ -850,6 +924,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sub_fs,
850924
"Concatenate files and print on the standard output",
851925
cmd_cat, 2, 255),
852926
SHELL_CMD_ARG(rm, NULL, "Remove file", cmd_rm, 2, 0),
927+
SHELL_CMD_ARG(cp, NULL, "Copy file", cmd_cp, 3, 0),
853928
SHELL_CMD_ARG(statvfs, NULL, "Show file system state", cmd_statvfs, 2, 0),
854929
SHELL_CMD_ARG(trunc, NULL, "Truncate file", cmd_trunc, 2, 255),
855930
SHELL_CMD_ARG(write, NULL, "Write file", cmd_write, 3, 255),

0 commit comments

Comments
 (0)