diff --git a/components/utilities/ymodem/ry_sy.c b/components/utilities/ymodem/ry_sy.c index a66a0579e7..c6117a53ef 100644 --- a/components/utilities/ymodem/ry_sy.c +++ b/components/utilities/ymodem/ry_sy.c @@ -30,6 +30,16 @@ struct custom_ctx char fpath[DFS_PATH_MAX]; }; +static const char *_get_path_lastname(const char *path) +{ + char *ptr; + if ((ptr = (char *)strrchr(path, '/')) == NULL) + return path; + + /* skip the '/' then return */ + return ++ptr; +} + static enum rym_code _rym_recv_begin( struct rym_ctx *ctx, rt_uint8_t *buf, @@ -125,7 +135,18 @@ static enum rym_code _rym_send_begin( rt_kprintf("error open file.\n"); return RYM_ERR_FILE; } - rt_sprintf((char *)buf, "%s%c%d", (char *) & (cctx->fpath[1]), insert_0, file_buf.st_size); + + const char *fdst = _get_path_lastname(cctx->fpath); + if(fdst != cctx->fpath) + { + fdst = dfs_normalize_path(RT_NULL, fdst); + if (fdst == RT_NULL) + { + return RYM_ERR_FILE; + } + } + + rt_sprintf((char *)buf, "%s%c%d", fdst, insert_0, file_buf.st_size); return RYM_CODE_SOH; } diff --git a/components/utilities/ymodem/ymodem.c b/components/utilities/ymodem/ymodem.c index 52f5e52692..efbb70defd 100644 --- a/components/utilities/ymodem/ymodem.c +++ b/components/utilities/ymodem/ymodem.c @@ -1,5 +1,5 @@ /* - * COPYRIGHT (C) 2011-2022, Real-Thread Information Technology Ltd + * COPYRIGHT (C) 2011-2023, Real-Thread Information Technology Ltd * All rights reserved * * SPDX-License-Identifier: Apache-2.0 @@ -362,7 +362,7 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx) _rym_putchar(ctx, RYM_CODE_ACK); _rym_putchar(ctx, RYM_CODE_C); ctx->stage = RYM_STAGE_ESTABLISHED; - rt_size_t errors; + rt_size_t errors = 0; while (1) { @@ -374,16 +374,25 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx) RYM_WAIT_PKG_TICK); switch (code) { - case RYM_CODE_SOH: - data_sz = 128; - break; - case RYM_CODE_STX: - data_sz = 1024; - break; - case RYM_CODE_EOT: - return RT_EOK; - default: - return -RYM_ERR_CODE; + case RYM_CODE_SOH: + data_sz = 128; + break; + case RYM_CODE_STX: + data_sz = 1024; + break; + case RYM_CODE_EOT: + return RT_EOK; + default: + errors++; + if(errors > RYM_MAX_ERRORS) + { + return -RYM_ERR_CODE;/* Abort communication */ + } + else + { + _rym_putchar(ctx, RYM_CODE_NAK);/* Ask for a packet */ + continue; + } }; err = _rym_trans_data(ctx, data_sz, &code); @@ -404,21 +413,22 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx) { errors = 0; } + switch (code) { - case RYM_CODE_CAN: - /* the spec require multiple CAN */ - for (i = 0; i < RYM_END_SESSION_SEND_CAN_NUM; i++) - { - _rym_putchar(ctx, RYM_CODE_CAN); - } - return -RYM_ERR_CAN; - case RYM_CODE_ACK: - _rym_putchar(ctx, RYM_CODE_ACK); - break; - default: - // wrong code - break; + case RYM_CODE_CAN: + /* the spec require multiple CAN */ + for (i = 0; i < RYM_END_SESSION_SEND_CAN_NUM; i++) + { + _rym_putchar(ctx, RYM_CODE_CAN); + } + return -RYM_ERR_CAN; + case RYM_CODE_ACK: + _rym_putchar(ctx, RYM_CODE_ACK); + break; + default: + // wrong code + break; }; } } @@ -586,11 +596,6 @@ static rt_err_t _rym_do_recv( while (1) { err = _rym_do_trans(ctx); - if (err != RT_EOK) - { - rt_free(ctx->buf); - return err; - } err = _rym_do_fin(ctx); if (err != RT_EOK)