diff options
author | Erwan Velu <erwanaliasr1@gmail.com> | 2011-04-18 23:07:39 +0200 |
---|---|---|
committer | Erwan Velu <erwanaliasr1@gmail.com> | 2011-04-18 23:07:39 +0200 |
commit | 1b2b5c5e3a34bde8c3860dde5e4d1b6ea984540d (patch) | |
tree | 0a006cfdaf71b97c62443e0fe743b6ce80eaf647 /com32/libupload | |
parent | dddbf87e6937b39ffc0986561298db7edfe5bd56 (diff) | |
download | syslinux-1b2b5c5e3a34bde8c3860dde5e4d1b6ea984540d.tar.gz |
libupload: Implementing error code on tftp
When using the tftp backend, let's return the errors we got on the
server.
Diffstat (limited to 'com32/libupload')
-rw-r--r-- | com32/libupload/upload_backend.h | 1 | ||||
-rw-r--r-- | com32/libupload/upload_tftp.c | 52 | ||||
-rw-r--r-- | com32/libupload/zout.c | 9 |
3 files changed, 45 insertions, 17 deletions
diff --git a/com32/libupload/upload_backend.h b/com32/libupload/upload_backend.h index 968e2c62..7ea03e46 100644 --- a/com32/libupload/upload_backend.h +++ b/com32/libupload/upload_backend.h @@ -6,6 +6,7 @@ #include <stdbool.h> #include <zlib.h> #include "serial.h" +#include "tftp.h" /* Backend flags */ #define BE_NEEDLEN 0x01 diff --git a/com32/libupload/upload_tftp.c b/com32/libupload/upload_tftp.c index 091c193c..8c65c9bd 100644 --- a/com32/libupload/upload_tftp.c +++ b/com32/libupload/upload_tftp.c @@ -8,7 +8,6 @@ #include <syslinux/config.h> #include <netinet/in.h> #include <sys/times.h> - #include "upload_backend.h" enum tftp_opcode { @@ -19,6 +18,12 @@ enum tftp_opcode { TFTP_ERROR = 5, }; +struct tftp_error { + uint16_t opcode; + uint16_t errcode; + char errmsg[0]; +} __attribute__ (( packed )); + struct tftp_state { uint32_t my_ip; uint32_t srv_ip; @@ -28,6 +33,21 @@ struct tftp_state { uint16_t seq; }; +const char *tftp_string_error_message[]={ +"", +"File not found", +"Access Denied", +"Disk Full", +"Illegal Operation", +"Unknown Transfert ID", +"File already exists", +"Unknown User", +"Negociation failed", +"Unable to resolve hostname", // not in RFC +"Unable to connect", // not in RFC +"No Error", +}; + #define RCV_BUF 2048 static int send_ack_packet(struct tftp_state *tftp, @@ -91,9 +111,14 @@ static int send_ack_packet(struct tftp_state *tftp, if (ntohs(xb[0]) == TFTP_ACK && ntohs(xb[1]) == tftp->seq) { tftp->srv_port = ur->s_port; - err = 0; /* All good! */ + err = TFTP_OK; /* All good! */ goto done; - } else if (ntohs(xb[1]) == TFTP_ERROR) { + } else if (ntohs(xb[0]) == TFTP_ERROR) { + struct tftp_error *te = (struct tftp_error *)(ur+1); + if (te->errcode == TFTP_ERR_UNKNOWN_ERROR) { + tftp_string_error_message[TFTP_ERR_UNKNOWN_ERROR]=strdup(te->errmsg); + } + err=-ntohs(te->errcode); // Return the associated error code goto done; } } @@ -113,6 +138,7 @@ static int upload_tftp_write(struct upload_backend *be) struct tftp_state tftp; char buffer[512+4+6]; int nlen; + int err=0; const union syslinux_derivative_info *sdi = syslinux_derivative_info(); const char *data = be->outbuf; @@ -129,30 +155,30 @@ static int upload_tftp_write(struct upload_backend *be) if (be->argv[1]) { tftp.srv_ip = pxe_dns(be->argv[1]); if (!tftp.srv_ip) { - printf("\nUnable to resolve hostname: %s\n", be->argv[1]); - return -1; +// printf("\nUnable to resolve hostname: %s\n", be->argv[1]); + return -TFTP_ERR_UNABLE_TO_RESOLVE; } } else { tftp.srv_ip = sdi->pxe.ipinfo->serverip; if (!tftp.srv_ip) { - printf("\nNo server IP address\n"); - return -1; +// printf("\nNo server IP address\n"); + return -TFTP_ERR_UNABLE_TO_CONNECT; } } - printf("server %u.%u.%u.%u... ", +/* printf("server %u.%u.%u.%u... ", ((uint8_t *)&tftp.srv_ip)[0], ((uint8_t *)&tftp.srv_ip)[1], ((uint8_t *)&tftp.srv_ip)[2], - ((uint8_t *)&tftp.srv_ip)[3]); + ((uint8_t *)&tftp.srv_ip)[3]);*/ buffer[0] = 0; buffer[1] = TFTP_WRQ; nlen = strlcpy(buffer+2, be->argv[0], 512); memcpy(buffer+3+nlen, "octet", 6); - if (send_ack_packet(&tftp, buffer, 2+nlen+1+6)) - return -1; + if ((err=send_ack_packet(&tftp, buffer, 2+nlen+1+6))!=TFTP_OK) + return err; do { chunk = len >= 512 ? 512 : len; @@ -163,8 +189,8 @@ static int upload_tftp_write(struct upload_backend *be) data += chunk; len -= chunk; - if (send_ack_packet(&tftp, buffer, chunk+4)) - return -1; + if ((err=send_ack_packet(&tftp, buffer, chunk+4))!=TFTP_OK) + return err; } while (chunk == 512); return 0; diff --git a/com32/libupload/zout.c b/com32/libupload/zout.c index b5575a9f..47c0d308 100644 --- a/com32/libupload/zout.c +++ b/com32/libupload/zout.c @@ -78,6 +78,7 @@ int write_data(struct upload_backend *be, const void *buf, size_t len) int flush_data(struct upload_backend *be) { int rv = Z_OK; + int err=-1; while (rv != Z_STREAM_END) { rv = do_deflate(be, Z_FINISH); @@ -85,15 +86,15 @@ int flush_data(struct upload_backend *be) return -1; } - printf("Uploading data, %u bytes... ", be->zbytes); +// printf("Uploading data, %u bytes... ", be->zbytes); - if (be->write(be)) - return -1; + if ((err=be->write(be)) != 0) + return err; free(be->outbuf); be->outbuf = NULL; be->dbytes = be->zbytes = be->alloc = 0; - printf("done.\n"); +// printf("done.\n"); return 0; } |