@@ -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+
278352static 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