[syslinux:master] libupload: Implementing error code on tftp

syslinux-bot for Erwan Velu erwanaliasr1 at gmail.com
Mon Apr 25 15:29:15 PDT 2011


Commit-ID:  1b2b5c5e3a34bde8c3860dde5e4d1b6ea984540d
Gitweb:     http://syslinux.zytor.com/commit/1b2b5c5e3a34bde8c3860dde5e4d1b6ea984540d
Author:     Erwan Velu <erwanaliasr1 at gmail.com>
AuthorDate: Mon, 18 Apr 2011 23:07:39 +0200
Committer:  Erwan Velu <erwanaliasr1 at gmail.com>
CommitDate: Mon, 18 Apr 2011 23:07:39 +0200

libupload: Implementing error code on tftp

When using the tftp backend, let's return the errors we got on the
server.


---
 com32/libupload/upload_backend.h |    1 +
 com32/libupload/upload_tftp.c    |   52 ++++++++++++++++++++++++++++---------
 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 968e2c6..7ea03e4 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 091c193..8c65c9b 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 b5575a9..47c0d30 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;
 }



More information about the Syslinux-commits mailing list