1 /**
2   @file
3   Ports response page
4 
5   Copyright (c) 2011-2012, Intel Corporation
6   All rights reserved. This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include <WebServer.h>
17 
18 
19 /**
20   Respond with the Ports page
21 
22   @param [in] SocketFD      The socket's file descriptor to add to the list.
23   @param [in] pPort         The WSDT_PORT structure address
24   @param [out] pbDone       Address to receive the request completion status
25 
26   @retval EFI_SUCCESS       The request was successfully processed
27 
28 **/
29 EFI_STATUS
PortsPage(IN int SocketFD,IN WSDT_PORT * pPort,OUT BOOLEAN * pbDone)30 PortsPage (
31   IN int SocketFD,
32   IN WSDT_PORT * pPort,
33   OUT BOOLEAN * pbDone
34   )
35 {
36   socklen_t AddressLength;
37   struct sockaddr_in6 LocalAddress;
38   DT_WEB_SERVER * pWebServer;
39   EFI_STATUS Status;
40 
41   DBG_ENTER ( );
42 
43   //
44   //  Send the Hello World page
45   //
46   pWebServer = &mWebServer;
47   for ( ; ; ) {
48     //
49     //  Send the page header
50     //
51     Status = HttpPageHeader ( SocketFD, pPort, L"Ports" );
52     if ( EFI_ERROR ( Status )) {
53       break;
54     }
55 
56     //
57     //  Send the page body
58     //
59     Status = HttpSendAnsiString ( SocketFD,
60                                   pPort,
61                                   "<h1>Web-Server Ports</h1>\r\n" );
62     if ( EFI_ERROR ( Status )) {
63       break;
64     }
65 
66     //
67     //  Check for TCP v4
68     //
69     if ( -1 != pWebServer->HttpListenPort ) {
70       AddressLength = sizeof ( LocalAddress );
71       if ( 0 == getsockname ( pWebServer->HttpListenPort,
72                               (struct sockaddr *)&LocalAddress,
73                               &AddressLength )) {
74         Status = HttpSendAnsiString ( SocketFD,
75                                       pPort,
76                                       "<a href=\"http://" );
77         if ( EFI_ERROR ( Status )) {
78           break;
79         }
80         Status = HttpSendIpAddress ( SocketFD,
81                                      pPort,
82                                      &LocalAddress );
83         if ( EFI_ERROR ( Status )) {
84           break;
85         }
86         Status = HttpSendAnsiString ( SocketFD,
87                                       pPort,
88                                       "\">Tcp4</a><br>\r\n" );
89         if ( EFI_ERROR ( Status )) {
90           break;
91         }
92       }
93     }
94 
95     //
96     //  Check for TCP v6
97     //
98     if ( -1 != pWebServer->HttpListenPort6 ) {
99       AddressLength = sizeof ( LocalAddress );
100       if ( 0 == getsockname ( pWebServer->HttpListenPort6,
101                               (struct sockaddr *)&LocalAddress,
102                               &AddressLength )) {
103         Status = HttpSendAnsiString ( SocketFD,
104                                       pPort,
105                                       "<a href=\"http://" );
106         if ( EFI_ERROR ( Status )) {
107           break;
108         }
109         Status = HttpSendIpAddress ( SocketFD,
110                                      pPort,
111                                      &LocalAddress );
112         if ( EFI_ERROR ( Status )) {
113           break;
114         }
115         Status = HttpSendAnsiString ( SocketFD,
116                                       pPort,
117                                       "\">Tcp6</a><br>\r\n" );
118         if ( EFI_ERROR ( Status )) {
119           break;
120         }
121       }
122     }
123 
124     //
125     //  Send the page trailer
126     //
127     Status = HttpPageTrailer ( SocketFD, pPort, pbDone );
128     break;
129   }
130 
131   //
132   //  Return the operation status
133   //
134   DBG_EXIT_STATUS ( Status );
135   return Status;
136 }
137