Implement the "overwrite TFTP filename" Microsoft RIS bug workaround.
authorMichael Brown <mcb30@etherboot.org>
Sat, 30 Jun 2007 14:13:18 +0000 (15:13 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sat, 30 Jun 2007 14:13:18 +0000 (15:13 +0100)
src/interface/pxe/pxe_preboot.c
src/interface/pxe/pxe_tftp.c

index b1cc39c..3cbbf22 100644 (file)
 #include "pxe.h"
 #include "pxe_call.h"
 
+/** Filename used for last TFTP request
+ *
+ * This is a bug-for-bug compatibility hack needed in order to work
+ * with Microsoft Remote Installation Services (RIS).  The filename
+ * used in a call to PXENV_RESTART_TFTP must be returned as the DHCP
+ * filename in subsequent calls to PXENV_GET_CACHED_INFO.
+ */
+static char *pxe_ris_filename = NULL;
+
 /**
  * UNLOAD BASE CODE STACK
  *
@@ -122,6 +131,12 @@ PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO
                goto err;
        }
 
+       /* Overwrite filename to work around Microsoft RIS bug */
+       if ( pxe_ris_filename ) {
+               strncpy ( dhcppkt.dhcphdr->file, pxe_ris_filename,
+                         sizeof ( dhcppkt.dhcphdr->file ) );
+       }
+
        /* Copy packet to client buffer */
        buffer = real_to_user ( get_cached_info->Buffer.segment,
                                get_cached_info->Buffer.offset );
@@ -150,6 +165,14 @@ PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE
 
        DBG ( "PXENV_RESTART_TFTP " );
 
+       /* Work around Microsoft RIS bug */
+       free ( pxe_ris_filename );
+       pxe_ris_filename = strdup ( ( char * ) restart_tftp->FileName );
+       if ( ! pxe_ris_filename ) {
+               restart_tftp->Status = PXENV_STATUS_OUT_OF_RESOURCES;
+               return PXENV_EXIT_FAILURE;
+       }
+
        /* Words cannot describe the complete mismatch between the PXE
         * specification and any possible version of reality...
         */
index 56529b1..44fb820 100644 (file)
@@ -65,9 +65,6 @@ static void pxe_tftp_build_uri ( char *uri_string,
                                 int blksize ) {
        struct in_addr address;
 
-       /* This is a fix to make Microsoft Remote Install Services work (RIS) */
-#warning "Overwrite DHCP filename"
-
        address.s_addr = ipaddress;
        if ( ! port )
                port = htons ( TFTP_PORT );