From aca7863350509a1f390eda93ac0150378d8cd16c Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 10 Mar 2010 12:48:20 +0000
Subject: [PATCH] Added ENABLE_TELNET_SERVER compile time option to the
 Webserver project to disable the TELNET server if desired.

Change over static strings in the Webserver project to use PROGMEM where possible.
---
 LUFA/ManPages/ChangeLog.txt              |  1 +
 Projects/Webserver/Lib/DHCPClientApp.c   | 11 ++++++-----
 Projects/Webserver/Lib/DHCPClientApp.h   | 11 +++++++----
 Projects/Webserver/Lib/HTTPServerApp.c   | 10 +++++-----
 Projects/Webserver/Lib/TELNETServerApp.c | 21 +++++++++++++--------
 Projects/Webserver/Lib/uIPManagement.c   |  4 ++++
 Projects/Webserver/Webserver.txt         |  6 ++++++
 Projects/Webserver/makefile              |  1 +
 8 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index cdffd3c47..e32cdab7d 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -17,6 +17,7 @@
   *  - Increased the speed of both software and hardware TPI/PDI programming modes of the AVRISP project
   *  - Added a timeout value to the TWI_StartTransmission() function, within which the addressed device must respond
   *  - Webserver project now uses the board LEDs to indicate the current IP configuration state
+  *  - Added ENABLE_TELNET_SERVER compile time option to the Webserver project to disable the TELNET server if desired
   *
   *  <b>Fixed:</b>
   *  - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin
diff --git a/Projects/Webserver/Lib/DHCPClientApp.c b/Projects/Webserver/Lib/DHCPClientApp.c
index 01cbb7e26..1af90ad19 100644
--- a/Projects/Webserver/Lib/DHCPClientApp.c
+++ b/Projects/Webserver/Lib/DHCPClientApp.c
@@ -28,16 +28,17 @@
   this software.
 */
 
+#if defined(ENABLE_DHCP_CLIENT) || defined(__DOXYGEN__)
+
 /** \file
  *
  *  DHCP Client Application. When connected to the uIP stack, this will retrieve IP configuration settings from the
  *  DHCP server on the network.
  */
 
+#define  INCLUDE_FROM_DHCPCLIENTAPP_C
 #include "DHCPClientApp.h"
 
-#if defined(ENABLE_DHCP_CLIENT) || defined(__DOXYGEN__)
-
 /** Initialization function for the DHCP client. */
 void DHCPClientApp_Init(void)
 {
@@ -175,7 +176,7 @@ void DHCPClientApp_Callback(void)
  *
  *  \return Size in bytes of the created DHCP packet
  */
-uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState)
+static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState)
 {
 	/* Erase existing packet data so that we start will all 0x00 DHCP header data */
  	memset(DHCPHeader, 0, sizeof(DHCP_Header_t));
@@ -214,7 +215,7 @@ uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMes
  *
  *  \return Number of bytes added to the DHCP packet
  */
-uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData)
+static uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData)
 {
 	/* Skip through the DHCP options list until the terminator option is found */
 	while (*DHCPOptionList != DHCP_OPTION_END)
@@ -238,7 +239,7 @@ uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t
  *
  *  \return Boolean true if the option was found in the DHCP packet's options list, false otherwise
  */
-bool DHCPClientApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination)
+static bool DHCPClientApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination)
 {
 	/* Look through the incoming DHCP packet's options list for the requested option */
 	while (*DHCPOptionList != DHCP_OPTION_END)
diff --git a/Projects/Webserver/Lib/DHCPClientApp.h b/Projects/Webserver/Lib/DHCPClientApp.h
index 947151d0b..702f79704 100644
--- a/Projects/Webserver/Lib/DHCPClientApp.h
+++ b/Projects/Webserver/Lib/DHCPClientApp.h
@@ -159,8 +159,11 @@
 		void DHCPClientApp_Init(void);
 		void DHCPClientApp_Callback(void);
 		
-		uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState);
-		uint8_t  DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData);
-		bool     DHCPClientApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination);
-		
+		#if defined(INCLUDE_FROM_DHCPCLIENTAPP_C)
+			static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType,
+			                                             uip_udp_appstate_t* AppState);
+			static uint8_t  DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen,
+			                                        void* OptionData);
+			static bool     DHCPClientApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination);
+		#endif
 #endif
diff --git a/Projects/Webserver/Lib/HTTPServerApp.c b/Projects/Webserver/Lib/HTTPServerApp.c
index 1a1d2c4bf..08d849433 100644
--- a/Projects/Webserver/Lib/HTTPServerApp.c
+++ b/Projects/Webserver/Lib/HTTPServerApp.c
@@ -56,12 +56,12 @@ const char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n"
                                      "Content-Type: text/plain\r\n\r\n"
                                      "Error 404: File Not Found: /";
 
-/** Default MIME type sent if no other MIME type can be determined. */
-const char PROGMEM DefaultMIMEType[] = "text/plain";
-
 /** Default filename to fetch when a directory is requested */
 const char PROGMEM DefaultDirFileName[] = "index.htm";
 
+/** Default MIME type sent if no other MIME type can be determined. */
+const char PROGMEM DefaultMIMEType[] = "text/plain";
+
 /** List of MIME types for each supported file extension. */
 const MIME_Type_t MIMETypes[] =
 	{
@@ -174,7 +174,7 @@ static void HTTPServerApp_OpenRequestedFile(void)
 	char* RequestedFileName = strtok(NULL, " ");
 			
 	/* Must be a GET request, abort otherwise */
-	if (strcmp(RequestToken, "GET") != 0)
+	if (strcmp_P(RequestToken, PSTR("GET")) != 0)
 	{
 		uip_abort();
 		return;
@@ -257,7 +257,7 @@ static void HTTPServerApp_SendResponseHeader(void)
 	}
 	
 	/* Add the end-of-line terminator and end-of-headers terminator after the MIME type */
-	strcpy(&AppData[strlen(AppData)], "\r\n\r\n");
+	strcpy_P(&AppData[strlen(AppData)], PSTR("\r\n\r\n"));
 	
 	/* Send the MIME header to the receiving client */
 	uip_send(AppData, strlen(AppData));
diff --git a/Projects/Webserver/Lib/TELNETServerApp.c b/Projects/Webserver/Lib/TELNETServerApp.c
index d1f1d7f97..2855f8d76 100644
--- a/Projects/Webserver/Lib/TELNETServerApp.c
+++ b/Projects/Webserver/Lib/TELNETServerApp.c
@@ -28,6 +28,8 @@
   this software.
 */
 
+#if defined(ENABLE_TELNET_SERVER) || defined(__DOXYGEN__)
+
 /** \file
  *
  *  TELNET Webserver Application. When connected to the uIP stack,
@@ -114,7 +116,7 @@ void TELNETServerApp_Callback(void)
 						TELNETServerApp_DisplayTCPConnections();
 						break;
 					default:
-						strcpy(AppData, "Invalid Command.\r\n");
+						strcpy_P(AppData, PSTR("Invalid Command.\r\n"));
 						uip_send(AppData, strlen(AppData));
 						break;
 				}
@@ -144,14 +146,17 @@ static void TELNETServerApp_DisplayTCPConnections(void)
 		if (CurrConnection->tcpstateflags != UIP_CLOSED)
 		{
 			/* Add the current connection's details to the out buffer */
-			ResponseLen += sprintf(&AppData[ResponseLen], "%u) %02d.%02d.%02d.%02d (Local %u, Remote %u)\r\n",
-								   ++ActiveConnCount, CurrConnection->ripaddr.u8[0],
-													  CurrConnection->ripaddr.u8[1],
-													  CurrConnection->ripaddr.u8[2],
-													  CurrConnection->ripaddr.u8[3],
-								   HTONS(CurrConnection->lport), HTONS(CurrConnection->rport));
+			ResponseLen += sprintf_P(&AppData[ResponseLen], PSTR("%u) %02d.%02d.%02d.%02d (Local %u, Remote %u)\r\n"),
+			                         ++ActiveConnCount,
+			                         CurrConnection->ripaddr.u8[0],
+			                         CurrConnection->ripaddr.u8[1],
+			                         CurrConnection->ripaddr.u8[2],
+			                         CurrConnection->ripaddr.u8[3],
+			                         HTONS(CurrConnection->lport), HTONS(CurrConnection->rport));
 		}
 	}
 
 	uip_send(AppData, ResponseLen);
-}
\ No newline at end of file
+}
+
+#endif
diff --git a/Projects/Webserver/Lib/uIPManagement.c b/Projects/Webserver/Lib/uIPManagement.c
index d5ad515c2..45f8a6ae5 100644
--- a/Projects/Webserver/Lib/uIPManagement.c
+++ b/Projects/Webserver/Lib/uIPManagement.c
@@ -80,7 +80,9 @@ void uIPManagement_Init(void)
 	HTTPServerApp_Init();
 	
 	/* TELNET Server Initialization */
+	#if defined(ENABLE_TELNET_SERVER)
 	TELNETServerApp_Init();
+	#endif
 }
 
 /** uIP Management function. This function manages the uIP stack when called while an RNDIS device has been
@@ -106,9 +108,11 @@ void uIPManagement_TCPCallback(void)
 		case HTONS(HTTP_SERVER_PORT):
 			HTTPServerApp_Callback();
 			break;
+		#if defined(ENABLE_TELNET_SERVER)
 		case HTONS(TELNET_SERVER_PORT):
 			TELNETServerApp_Callback();
 			break;
+		#endif
 	}
 }
 
diff --git a/Projects/Webserver/Webserver.txt b/Projects/Webserver/Webserver.txt
index 05d0b1ffd..3c0c48e35 100644
--- a/Projects/Webserver/Webserver.txt
+++ b/Projects/Webserver/Webserver.txt
@@ -78,6 +78,12 @@
  *    <td><b>Description:</b></td>
  *   </tr>
  *   <tr>
+ *    <td>ENABLE_TELNET_SERVER</td>
+ *    <td>Makefile CDEFS</td>
+ *    <td>When defined, this enables the TELNET server in addition to the HTTP webserver, which listens for incomming connections
+ *        and processes user commands.</td>
+ *   </tr>
+ *   <tr>
  *    <td>ENABLE_DHCP_CLIENT</td>
  *    <td>Makefile CDEFS</td>
  *    <td>When defined, this enables the DHCP client for dynamic IP allocation of the network settings from a DHCP server.</td>
diff --git a/Projects/Webserver/makefile b/Projects/Webserver/makefile
index edd282401..36adb1d51 100644
--- a/Projects/Webserver/makefile
+++ b/Projects/Webserver/makefile
@@ -201,6 +201,7 @@ CSTANDARD = -std=gnu99
 # Place -D or -U options here for C sources
 CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA_OPTS)
 CDEFS += -DENABLE_DHCP_CLIENT
+CDEFS += -DENABLE_TELNET_SERVER
 CDEFS += -DMAX_URI_LENGTH=50
 
 CDEFS += -DUIP_CONF_UDP="defined(ENABLE_DHCP_CLIENT)" -DUIP_CONF_TCP=1 -DUIP_CONF_UDP_CONNS=1 -DUIP_CONF_MAX_CONNECTIONS=3
-- 
GitLab