@@ -275,6 +275,80 @@ static int cmd_rm(const struct shell *sh, size_t argc, char **argv)
275
275
return err ;
276
276
}
277
277
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
+
278
352
static int cmd_read (const struct shell * sh , size_t argc , char * * argv )
279
353
{
280
354
char path [MAX_PATH_LEN ];
@@ -850,6 +924,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sub_fs,
850
924
"Concatenate files and print on the standard output" ,
851
925
cmd_cat , 2 , 255 ),
852
926
SHELL_CMD_ARG (rm , NULL , "Remove file" , cmd_rm , 2 , 0 ),
927
+ SHELL_CMD_ARG (cp , NULL , "Copy file" , cmd_cp , 3 , 0 ),
853
928
SHELL_CMD_ARG (statvfs , NULL , "Show file system state" , cmd_statvfs , 2 , 0 ),
854
929
SHELL_CMD_ARG (trunc , NULL , "Truncate file" , cmd_trunc , 2 , 255 ),
855
930
SHELL_CMD_ARG (write , NULL , "Write file" , cmd_write , 3 , 255 ),
0 commit comments