diff --git a/networking/tftp.c b/networking/tftp.c index 83b0ef36f..e0f2b91cf 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -38,10 +38,12 @@ #define TFTP_ERROR 5 #define TFTP_OACK 6 -/* error codes sent over network */ +/* error codes sent over network (we use only 0, 3 and 8) */ +/* generic (error message is included in the packet) */ #define ERR_UNSPEC 0 #define ERR_NOFILE 1 #define ERR_ACCESS 2 +/* disk full or allocation exceeded */ #define ERR_WRITE 3 #define ERR_OP 4 #define ERR_BAD_ID 5 @@ -71,7 +73,7 @@ struct globals { /* u16 TFTP_ERROR; u16 reason; both network-endian, then error text: */ uint8_t error_pkt[4 + 32]; - /* used in tftpd_main(), a bit big fro stack: */ + /* used in tftpd_main(), a bit big for stack: */ char block_buf[TFTP_BLKSIZE_DEFAULT]; }; #define G (*(struct globals*)&bb_common_bufsiz1) @@ -420,13 +422,13 @@ static int tftp_protocol( if (CMD_GET(cmd) && (opcode == TFTP_DATA)) { if (recv_blk == block_nr) { - len = full_write(local_fd, &rbuf[4], len - 4); - if (len < 0) { - bb_perror_msg(bb_msg_write_error); + int sz = full_write(local_fd, &rbuf[4], len - 4); + if (sz != len - 4) { + strcpy(error_pkt_str, bb_msg_write_error); error_pkt_reason = ERR_WRITE; goto send_err_pkt; } - if (len != blksize) { + if (sz != blksize) { finished = 1; } continue; /* send ACK */ @@ -467,9 +469,10 @@ static int tftp_protocol( return finished == 0; /* returns 1 on failure */ send_read_err_pkt: - bb_perror_msg(bb_msg_read_error); strcpy(error_pkt_str, bb_msg_read_error); send_err_pkt: + if (error_pkt_str[0]) + bb_error_msg(error_pkt_str); error_pkt[1] = TFTP_ERROR; xsendto(socket_fd, error_pkt, 4 + 1 + strlen(error_pkt_str), &peer_lsa->u.sa, peer_lsa->len); @@ -652,9 +655,10 @@ int tftpd_main(int argc ATTRIBUTE_UNUSED, char **argv) #if ENABLE_FEATURE_TFTP_GET if (!ENABLE_FEATURE_TFTP_PUT || opcode == TFTP_WRQ) { if (opt_r) { - error_pkt_reason = ERR_WRITE; - /* will just send error pkt */ - goto do_proto; + /* This would mean "disk full" - not true */ + /*error_pkt_reason = ERR_WRITE;*/ + error_msg = bb_msg_write_error; + goto err; } USE_GETPUT(cmd = 1;) /* CMD_GET: we will receive file's data */ open_mode = O_WRONLY | O_TRUNC; @@ -662,6 +666,7 @@ int tftpd_main(int argc ATTRIBUTE_UNUSED, char **argv) #endif local_fd = open(filename, open_mode); if (local_fd < 0) { + /*error_pkt_reason = ERR_NOFILE/ERR_ACCESS?*/ error_msg = "can't open file"; err: strcpy(error_pkt_str, error_msg);