tftp(d): a bit more verbose error reporting
This commit is contained in:
parent
dd9228b861
commit
71c9f015e9
@ -38,10 +38,12 @@
|
|||||||
#define TFTP_ERROR 5
|
#define TFTP_ERROR 5
|
||||||
#define TFTP_OACK 6
|
#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_UNSPEC 0
|
||||||
#define ERR_NOFILE 1
|
#define ERR_NOFILE 1
|
||||||
#define ERR_ACCESS 2
|
#define ERR_ACCESS 2
|
||||||
|
/* disk full or allocation exceeded */
|
||||||
#define ERR_WRITE 3
|
#define ERR_WRITE 3
|
||||||
#define ERR_OP 4
|
#define ERR_OP 4
|
||||||
#define ERR_BAD_ID 5
|
#define ERR_BAD_ID 5
|
||||||
@ -71,7 +73,7 @@
|
|||||||
struct globals {
|
struct globals {
|
||||||
/* u16 TFTP_ERROR; u16 reason; both network-endian, then error text: */
|
/* u16 TFTP_ERROR; u16 reason; both network-endian, then error text: */
|
||||||
uint8_t error_pkt[4 + 32];
|
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];
|
char block_buf[TFTP_BLKSIZE_DEFAULT];
|
||||||
};
|
};
|
||||||
#define G (*(struct globals*)&bb_common_bufsiz1)
|
#define G (*(struct globals*)&bb_common_bufsiz1)
|
||||||
@ -420,13 +422,13 @@ static int tftp_protocol(
|
|||||||
|
|
||||||
if (CMD_GET(cmd) && (opcode == TFTP_DATA)) {
|
if (CMD_GET(cmd) && (opcode == TFTP_DATA)) {
|
||||||
if (recv_blk == block_nr) {
|
if (recv_blk == block_nr) {
|
||||||
len = full_write(local_fd, &rbuf[4], len - 4);
|
int sz = full_write(local_fd, &rbuf[4], len - 4);
|
||||||
if (len < 0) {
|
if (sz != len - 4) {
|
||||||
bb_perror_msg(bb_msg_write_error);
|
strcpy(error_pkt_str, bb_msg_write_error);
|
||||||
error_pkt_reason = ERR_WRITE;
|
error_pkt_reason = ERR_WRITE;
|
||||||
goto send_err_pkt;
|
goto send_err_pkt;
|
||||||
}
|
}
|
||||||
if (len != blksize) {
|
if (sz != blksize) {
|
||||||
finished = 1;
|
finished = 1;
|
||||||
}
|
}
|
||||||
continue; /* send ACK */
|
continue; /* send ACK */
|
||||||
@ -467,9 +469,10 @@ static int tftp_protocol(
|
|||||||
return finished == 0; /* returns 1 on failure */
|
return finished == 0; /* returns 1 on failure */
|
||||||
|
|
||||||
send_read_err_pkt:
|
send_read_err_pkt:
|
||||||
bb_perror_msg(bb_msg_read_error);
|
|
||||||
strcpy(error_pkt_str, bb_msg_read_error);
|
strcpy(error_pkt_str, bb_msg_read_error);
|
||||||
send_err_pkt:
|
send_err_pkt:
|
||||||
|
if (error_pkt_str[0])
|
||||||
|
bb_error_msg(error_pkt_str);
|
||||||
error_pkt[1] = TFTP_ERROR;
|
error_pkt[1] = TFTP_ERROR;
|
||||||
xsendto(socket_fd, error_pkt, 4 + 1 + strlen(error_pkt_str),
|
xsendto(socket_fd, error_pkt, 4 + 1 + strlen(error_pkt_str),
|
||||||
&peer_lsa->u.sa, peer_lsa->len);
|
&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_GET
|
||||||
if (!ENABLE_FEATURE_TFTP_PUT || opcode == TFTP_WRQ) {
|
if (!ENABLE_FEATURE_TFTP_PUT || opcode == TFTP_WRQ) {
|
||||||
if (opt_r) {
|
if (opt_r) {
|
||||||
error_pkt_reason = ERR_WRITE;
|
/* This would mean "disk full" - not true */
|
||||||
/* will just send error pkt */
|
/*error_pkt_reason = ERR_WRITE;*/
|
||||||
goto do_proto;
|
error_msg = bb_msg_write_error;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
USE_GETPUT(cmd = 1;) /* CMD_GET: we will receive file's data */
|
USE_GETPUT(cmd = 1;) /* CMD_GET: we will receive file's data */
|
||||||
open_mode = O_WRONLY | O_TRUNC;
|
open_mode = O_WRONLY | O_TRUNC;
|
||||||
@ -662,6 +666,7 @@ int tftpd_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
local_fd = open(filename, open_mode);
|
local_fd = open(filename, open_mode);
|
||||||
if (local_fd < 0) {
|
if (local_fd < 0) {
|
||||||
|
/*error_pkt_reason = ERR_NOFILE/ERR_ACCESS?*/
|
||||||
error_msg = "can't open file";
|
error_msg = "can't open file";
|
||||||
err:
|
err:
|
||||||
strcpy(error_pkt_str, error_msg);
|
strcpy(error_pkt_str, error_msg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user