]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/tftp.c
Fix printf errors.
[karo-tx-uboot.git] / net / tftp.c
index 27f5e88be830f6dfb1873deca9e3605d3a9b34b1..84d83ca97b1e9f333efe1fa780c3803ce6cadca5 100644 (file)
@@ -15,7 +15,7 @@
 #if defined(CONFIG_CMD_NET)
 
 #define WELL_KNOWN_PORT        69              /* Well known TFTP port #               */
-#define TIMEOUT                5               /* Seconds to timeout for a lost pkt    */
+#define TIMEOUT                5UL             /* Seconds to timeout for a lost pkt    */
 #ifndef        CONFIG_NET_RETRY_COUNT
 # define TIMEOUT_COUNT 10              /* # of timeouts before giving up  */
 #else
@@ -34,7 +34,7 @@
 #define TFTP_ERROR     5
 #define TFTP_OACK      6
 
-
+static IPaddr_t TftpServerIP;
 static int     TftpServerPort;         /* The UDP port at their end            */
 static int     TftpOurPort;            /* The UDP port at our end              */
 static int     TftpTimeoutCount;
@@ -55,7 +55,14 @@ static int   TftpState;
 
 #define DEFAULT_NAME_LEN       (8 + 4 + 1)
 static char default_filename[DEFAULT_NAME_LEN];
-static char *tftp_filename;
+
+#ifndef CONFIG_TFTP_FILE_NAME_MAX_LEN
+#define MAX_LEN 128
+#else
+#define MAX_LEN CONFIG_TFTP_FILE_NAME_MAX_LEN
+#endif
+
+static char tftp_filename[MAX_LEN];
 
 #ifdef CFG_DIRECT_FLASH_TFTP
 extern flash_info_t flash_info[];
@@ -171,7 +178,7 @@ TftpSend (void)
                pkt += 5 /*strlen("octet")*/ + 1;
                strcpy ((char *)pkt, "timeout");
                pkt += 7 /*strlen("timeout")*/ + 1;
-               sprintf((char *)pkt, "%d", TIMEOUT);
+               sprintf((char *)pkt, "%lu", TIMEOUT);
 #ifdef ET_DEBUG
                printf("send option \"timeout %s\"\n", (char *)pkt);
 #endif
@@ -231,16 +238,16 @@ TftpSend (void)
                break;
        }
 
-       NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort, TftpOurPort, len);
+       NetSendUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, TftpOurPort, len);
 }
 
 
 static void
 TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 {
-       char * blksize;
        ushort proto;
        ushort *s;
+       int i;
 
        if (dest != TftpOurPort) {
 #ifdef CONFIG_MCAST_TFTP
@@ -272,22 +279,26 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 
        case TFTP_OACK:
 #ifdef ET_DEBUG
-               printf("Got OACK:\n");
-               print_buffer (0, pkt, 1, len, 16);
+               printf("Got OACK: %s %s\n", pkt, pkt+strlen(pkt)+1);
 #endif
                TftpState = STATE_OACK;
                TftpServerPort = src;
-
-               /* Check for 'blksize' option */
-               pkt[len] = 0; /* NULL terminate so string ops work */
-               blksize = strstr((char*)pkt, "blksize");
-               if ((blksize) && (blksize + 8 < (char*)pkt + len)) {
-                       TftpBlkSize = simple_strtoul(blksize + 8, NULL, 10);
+               /*
+                * Check for 'blksize' option.
+                * Careful: "i" is signed, "len" is unsigned, thus
+                * something like "len-8" may give a *huge* number
+                */
+               for (i=0; i+8<len; i++) {
+                       if (strcmp ((char*)pkt+i,"blksize") == 0) {
+                               TftpBlkSize = (unsigned short)
+                                       simple_strtoul((char*)pkt+i+8,NULL,10);
 #ifdef ET_DEBUG
-                       printf("Blocksize ack: %d\n", TftpBlkSize);
+                               printf ("Blocksize ack: %s, %d\n",
+                                       (char*)pkt+i+8,TftpBlkSize);
 #endif
+                               break;
+                       }
                }
-
 #ifdef CONFIG_MCAST_TFTP
                parse_multicast_oack((char *)pkt,len-1);
                if ((Multicast) && (!MasterClient))
@@ -368,7 +379,7 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 #ifdef CONFIG_MCAST_TFTP
                /* if I am the MasterClient, actively calculate what my next
                 * needed block is; else I'm passive; not ACKING
-                */
+                */
                if (Multicast) {
                        if (len < TftpBlkSize)  {
                                TftpEndingBlock = TftpBlock;
@@ -449,30 +460,43 @@ TftpStart (void)
        char *ep;             /* Environment pointer */
 #endif
 
+       TftpServerIP = NetServerIP;
        if (BootFile[0] == '\0') {
                sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
                        NetOurIP & 0xFF,
                        (NetOurIP >>  8) & 0xFF,
                        (NetOurIP >> 16) & 0xFF,
                        (NetOurIP >> 24) & 0xFF );
-               tftp_filename = default_filename;
+
+               strncpy(tftp_filename, default_filename, MAX_LEN);
+               tftp_filename[MAX_LEN-1] = 0;
 
                printf ("*** Warning: no boot file name; using '%s'\n",
                        tftp_filename);
        } else {
-               tftp_filename = BootFile;
+               char *p = strchr (BootFile, ':');
+
+               if (p == NULL) {
+                       strncpy(tftp_filename, BootFile, MAX_LEN);
+                       tftp_filename[MAX_LEN-1] = 0;
+               } else {
+                       *p++ = '\0';
+                       TftpServerIP = string_to_ip (BootFile);
+                       strncpy(tftp_filename, p, MAX_LEN);
+                       tftp_filename[MAX_LEN-1] = 0;
+               }
        }
 
 #if defined(CONFIG_NET_MULTI)
        printf ("Using %s device\n", eth_get_name());
 #endif
-       puts ("TFTP from server ");     print_IPaddr (NetServerIP);
+       puts ("TFTP from server ");     print_IPaddr (TftpServerIP);
        puts ("; our IP address is ");  print_IPaddr (NetOurIP);
 
        /* Check if we need to send across this subnet */
        if (NetOurGatewayIP && NetOurSubnetMask) {
-           IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
-           IPaddr_t ServerNet  = NetServerIP & NetOurSubnetMask;
+           IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
+           IPaddr_t ServerNet  = TftpServerIP & NetOurSubnetMask;
 
            if (OurNet != ServerNet) {
                puts ("; sending through gateway ");
@@ -518,7 +542,7 @@ TftpStart (void)
        /* Revert TftpBlkSize to dflt */
        TftpBlkSize = TFTP_BLOCK_SIZE;
 #ifdef CONFIG_MCAST_TFTP
-       mcast_cleanup();
+       mcast_cleanup();
 #endif
 
        TftpSend ();