aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorallen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2000-09-19 23:35:56 +0000
committerallen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2000-09-19 23:35:56 +0000
commitc1e6b818b3ad317850015cd9a80e7513a9660ffd (patch)
tree95bb822ece5a3069a30035f527aa4d49905f987a
parent7bc89f775b9129148f1bc9e1d5197ee13f3faca6 (diff)
Moved headers to a separate file, they are now callable by a function.
Added page about groups and variables Added parameter file name, current time and date git-svn-id: http://svn.cactuscode.org/arrangements/CactusConnect/HTTPD/trunk@52 1faa4e14-9dd3-4be0-9f0e-ffe519881164
-rw-r--r--README6
-rw-r--r--src/Content.c440
-rw-r--r--src/Groups.c233
-rw-r--r--src/Headers.c143
-rw-r--r--src/http_Content.h3
-rw-r--r--src/make.code.defn2
6 files changed, 679 insertions, 148 deletions
diff --git a/README b/README
index 37665eb..d91bf1e 100644
--- a/README
+++ b/README
@@ -155,10 +155,14 @@ Authorisation.c - HTTP authentication
Content Provision:
-----------------
-The content provision is currently all in
+The content provision is currently in
+
+Headers.c
Content.c
+Groups.c
+
This makes use of the interfaces in http_Request.h described above to
provide content. In principle this could be in another thorn, but
that should wait until we have an agreed set of interfaces to allow
diff --git a/src/Content.c b/src/Content.c
index dcca26e..b708d16 100644
--- a/src/Content.c
+++ b/src/Content.c
@@ -14,6 +14,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "cctk.h"
@@ -65,6 +66,7 @@ static int RegisterImages(void);
static int RegisterParameterPages(void);
static int MainPage(cGH *cctkGH, httpRequest *request, void *data);
+static int AboutPage(cGH *cctkGH, httpRequest *request, void *data);
static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data);
static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data);
@@ -82,12 +84,16 @@ static int CookieTestPage(cGH *cctkGH, httpRequest *request, void *data);
********************* Other Routine Prototypes *********************
********************************************************************/
+int HTTPi_RegisterGroupsPages(void);
+
+
/********************************************************************
********************* Local Data *****************************
********************************************************************/
static struct httpLink *ContentLinks = NULL;
+
#define USER_LENGTH 255
/********************************************************************
********************* External Routines **********************
@@ -138,6 +144,9 @@ int HTTP_RegisterPages(void)
/* Register the master page. */
HTTP_RegisterPage("/index.html", MainPage, NULL);
+ /* Register the server description page */
+ HTTP_RegisterPage("/About.html", AboutPage, NULL);
+
/* Register parameter stuff */
RegisterParameterPages();
@@ -150,6 +159,9 @@ int HTTP_RegisterPages(void)
"Control Panel for this run",
HTTP_QUICKLINK);
+ /* Register Groups Pages */
+ HTTPi_RegisterGroupsPages();
+
HTTP_AuthAddUser("user",user,password,encryption_scheme);
/* Register images */
@@ -157,7 +169,7 @@ int HTTP_RegisterPages(void)
HTTP_RegisterPage("/cookies.html", CookieTestPage, NULL);
-
+ return 0;
}
/*@@
@@ -246,37 +258,6 @@ static int CompareStrings(const void *string1, const void *string2)
******************************************************************************/
-static const char *cactus_mainheader =
-"</HEAD>\n"
-"<BODY BGCOLOR=\"#FFFFFF\""
-" link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n"
-"<center><A HREF=\"http://www.cactuscode.org/\">"
-"<img src=\"/Images/wwwcactuscodeorg.jpg\""
-" alt=\"Cactus\" BORDER=0></A>"
-"</A>"
-"<table width=70% border=0><tr><td>"
-"\n";
-
-static const char *cactus_header =
-"</HEAD>\n"
-"<BODY BGCOLOR=\"#FFFFFF\""
-" link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n"
-"<center>"
-"</A>"
-"<table width=70% border=0><tr><td>"
-"\n";
-
-static const char *cactus_footer =
-"</table>"
-"\n"
-"<HR size=1>\n"
-"<ADDRESS><DIV ALIGN=left>\n"
-"<SMALL>\n"
-"<A HREF=\"http://www.cactuscode.org/\">Cactus Home Page</A><BR>\n"
-"Cactus Web Interface by <A HREF=\"mailto:cactusmaint@cactuscode.org\">The Cactus Team</A><BR>\n"
-"</SMALL></DIV></ADDRESS></BODY></HTML>\n";
-
-
/*@@
@routine MainPage
@date Wed Sep 13 23:47:43 2000
@@ -298,6 +279,7 @@ static const char *cactus_footer =
static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
{
int retval;
+ int filelen;
char message[4098];
struct httpLink *link;
@@ -317,7 +299,8 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
HTTP_Write(request, message, strlen(message));
/* Write out the main header part */
- HTTP_Write(request, cactus_mainheader, strlen(cactus_mainheader));
+ HTTP_ContentHeader(1,4096,message);
+ HTTP_Write(request, message, strlen(message));
strcpy(message, "<center><h1>Simulation Home Page</h1></center>");
@@ -345,13 +328,14 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
/* Some blurb */
strcpy(message, "<br>"
- "<center><table cellspacing=5 cellpadding=5 border=0><tr><td valign=top>"
- "<h3>Simulation web server:</h3>"
- "<p>This browser is connected to a Cactus simulation which contains "
- "a web server thorn. This thorn allows you to monitor the simulation, "
- "and view and change parameters</p>"
- "<p>Depending on which other thorns are active, there may be additional "
- "features available, such as the viewing and downloading of output files</p>");
+ "<center><table cellspacing=5 cellpadding=5 border=0><tr>"
+ "<td valign=top><h3>Simulation web server:</h3>"
+ "<p>This browser is connected to a Cactus simulation which "
+ "contains a web server thorn. This thorn allows you to "
+ "monitor the simulation, and view and change parameters</p>"
+ "<p>Depending on which other thorns are active, there may "
+ "be additional features available, such as the viewing and "
+ "downloading of output files</p>");
HTTP_Write(request, message, strlen(message));
@@ -380,12 +364,37 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
/* CONFIGURATION DETAILS */
sprintf(message, "<h3>Configuration:</h3>"
- "<ul> <li>Flesh version <FONT COLOR=RED> %s"
- "</FONT></li>\n"
- "<li>Code compiled on <FONT COLOR=RED>"
- __DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__ "</font></li>\n"
- "</ul>", CCTK_FullVersion());
+ "<ul> <li>Flesh version <FONT COLOR=RED> %s"
+ "</FONT></li>\n"
+ "<li>Code compiled on <FONT COLOR=RED>"
+ __DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__
+ "</font></li>\n"
+ , CCTK_FullVersion());
+
+ strcat(message,"<li> Parameter filename <font color=red>");
+ HTTP_Write(request, message, strlen(message));
+
+ filelen = CCTK_ParameterFilename(4098,message);
+ HTTP_Write(request, message, filelen);
+
+ strcpy(message,"</font>\n");
+ HTTP_Write(request, message, strlen(message));
+
+ if (cctkGH)
+ {
+ if (CCTK_nProcs(cctkGH) == 1)
+ {
+ strcpy(message,"<li>Single processor run</li>");
+ }
+ else
+ {
+ sprintf(message," <li>Multiprocessor run on %d CPUs</li>",
+ CCTK_nProcs(cctkGH));
+ }
+ HTTP_Write(request, message, strlen(message));
+ }
+ strcpy(message,"</UL>");
HTTP_Write(request, message, strlen(message));
/******************************************************************************/
@@ -409,8 +418,7 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
"<li>Iteration number <FONT COLOR=RED> %d"
"</FONT></li>\n",
cctkGH->cctk_time,
- cctkGH->cctk_iteration);
-
+ cctkGH->cctk_iteration);
}
else
{
@@ -476,7 +484,8 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4096,message);
+ retval = HTTP_Write(request, message, strlen(message));
/* retval = HTTP_Write(request, base_page, strlen(base_page)); */
@@ -561,17 +570,20 @@ static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data)
HTTP_Write(request, message, strlen(message));
/* Start the page */
- strcpy(message, "<HTML><HEAD><TITLE>Cactus Parameters Request</TITLE></HEAD>\n");
- strcat(message, cactus_header);
- strcat(message,"<BODY>");
+ strcpy(message, "<HTML><HEAD><TITLE>Cactus Parameters Request</TITLE>\n");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message,"<HTML>\n");
+ HTTP_Write(request, message, strlen(message));
+
+ HTTP_ContentHeader(0,4098,message);
HTTP_Write(request, message, strlen(message));
strcpy(message, "<center>");
HTTP_Write(request, message, strlen(message));
strcpy(message,
- "<center><H2>Check/Modify Parameters</H2></center>\n"
- "<center>[<A HREF=\"/\">This Simulation Homepage</A>]</center>\n"
+ "<center><H1>Check/Modify Parameters</H1></center>\n"
"</center><p>From this page you can check the values \n"
"of all parameters for the \n"
"simulation, and modify any parameters which have been designated as <i>steerable</i></p>\n"
@@ -602,12 +614,13 @@ static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data)
}
}
- strcpy(message,"</table></BLOCKQUOTE></center>");
+ strcpy(message,"</table></center>");
HTTP_Write(request, message, strlen(message));
/* Write out the footer part. */
-
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
return retval;
}
@@ -640,20 +653,23 @@ static const char *notauthorized_page =
@@*/
static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
{
- int retval;
+ int retval=0;
char message[4098];
- int i;
const char *thorn;
int first;
const cParamData *pData;
char *value;
- const char *prefix;
const httpArg *argument;
char user[USER_LENGTH+1];
int notauthorised;
int readonly;
+ int param_type;
+ int param_bool;
+ int nsteerable=0;
+ int nfixed=0;
+
thorn = (const char *)data;
notauthorised = HTTP_AuthenticateBasic(request, "user", user, USER_LENGTH);
@@ -749,45 +765,45 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
sprintf(message,
"<HTML><HEAD><TITLE>Cactus Parameters Request : %s</TITLE></HEAD>\n", thorn);
- strcat(message, cactus_header);
+ HTTP_ContentHeader(0,4098,message);
strcat(message,"<BODY>");
HTTP_Write(request, message, strlen(message));
- strcpy(message, "<center>");
- HTTP_Write(request, message, strlen(message));
-
if (!CCTK_IsThornActive(thorn))
{
- sprintf(message,"<BLOCKQUOTE><P><B> Thorn %s is not active !!!</B><BR></BLOCKQUOTE>\n",thorn);
+ sprintf(message,"<B> Thorn %s is not active !!!</B><BR>\n",thorn);
HTTP_Write(request, message, strlen(message));
}
else
{
- strcpy(message,"<BLOCKQUOTE>");
- HTTP_Write(request, message, strlen(message));
-
/* Send table of available parameters for given thorn */
/* Steerable parameters can be edited in a FORM. */
sprintf(message,
- "<center><H2>Check/Modify Parameters for Thorn <FONT COLOR=RED> %s</FONT></H2></center>\n",
+ "<center><H1>Check/Modify Parameters</H1>"
+ "<H2>Thorn %s</H2></center>\n",
thorn);
strcat(message,
- "<center>[<A HREF=\"/\">This Simulation Homepage</A>]</center>\n"
- "<p>Steerable parameters can be identified by the presence of a form input box, \n"
- "to change the value of a parameter, simply edit the value in the box and press \n"
- " the submit button to register the new values.</p><center>\n"
- "<p>Return to <a href=\"../\">active thorn list</a></p>\n"
- "<TABLE BORDER= 0 CELLSPACING=5 CELLPADDING=5>\n");
+ "<p>Parameters in Cactus can be either <i>fixed</i> or <i>steerable</i>. "
+ "Steerable parameters are those which can be modified during a "
+ "simulation"
+ "To change steerable parameters, edit the values and press \n"
+ " the submit button."
+ "Before applying the new parameter value, Cactus will check that"
+ " the parameter lies in the allowed range. Note that there"
+ " is currently no log of parameters which have been modified.</p>\n"
+ "<p>The tables below show the parameter name, current value and description."
+ "The default value of each parameter is shown in brackets at the end of the description.</p>"
+ "<center><p><a href=\"../\">View parameters from another thorn</a></p>\n");
HTTP_Write(request, message, strlen(message));
- if(!readonly)
+ if(!readonly )
{
- sprintf(message,"<FORM ACTION=\"/Parameters/%s/\"><TR><TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT VALUE=\"Update all parameters\"></TD></TR>\n", thorn);
- HTTP_Write(request, message, strlen(message));
+ sprintf(message,"<FORM ACTION=\"/Parameters/%s/\">",thorn);
+ HTTP_Write(request, message, strlen(message));
}
- /* Walk through all parameters of given implementation. */
+ /* Walk through all steerable parameters of given implementation. */
first = 1;
while(CCTK_ParameterWalk(first, thorn, NULL, &pData) == 0)
@@ -797,37 +813,40 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
value = CCTK_ParameterValString (pData->name, pData->thorn);
if(value)
- {
- if (pData->scope == SCOPE_PRIVATE)
- {
- prefix = pData->thorn;
- }
- else
- {
- prefix = CCTK_ThornImplementation (pData->thorn);
- }
-
+ {
if (pData->steerable == CCTK_STEERABLE_ALWAYS && !readonly)
{
- sprintf(message,
- "%s<TR><TD align=left valign=center><font color=red>%s::%s</font></TD>"
- "<TD align=left valign=center><INPUT TYPE=TEXT NAME=\"%s\" VALUE=\"%s\">"
- "</TD></TR>\n",
- message,prefix, pData->name, pData->name, value);
- }
- else
- {
- /* FIXME: This is a hack - should put in parameter tags. */
- if(strcmp(thorn,CCTK_THORNSTRING) ||
- (strcmp(pData->name,"user") &&
- strcmp(pData->name,"password") &&
- strcmp(pData->name,"encryption_scheme")))
- {
- sprintf(message,
- "%s<TR><TD align=left valign=center>%s::%s</TD>"
- "<TD>%s</TD></TR>\n",
- message, prefix,pData->name, value);
- }
+
+ if (nsteerable == 0)
+ {
+ strcat(message,"<h2>Steerable Parameters</h2>"
+ "<table cellpadding=5 cellspacing=5>");
+ }
+ nsteerable++;
+
+ if (pData->type == PARAMETER_BOOLEAN)
+ {
+ param_bool = *((CCTK_INT *)CCTK_ParameterGet(pData->name,thorn,&pData->type));
+ sprintf(message,
+ "%s<TR><TD align=left valign=center>%s</TD>"
+ "<TD align=left valign=center>"
+ "Yes <INPUT type=\"radio\" name=\"%s\" %s value=\"1\">"
+ "&nbsp; No <INPUT type=\"radio\" name=\"%s\" %s value=\"0\">"
+ "</TD><TD><SMALL>%s (%s)</SMALL></TR>\n",
+ message,pData->name,pData->name,
+ param_bool ? "checked" : "", pData->name,
+ param_bool ? "" : "checked",pData->description,pData->defval);
+ }
+ else
+ {
+ sprintf(message,
+ "%s<TR><TD align=left valign=center>%s</TD>"
+ "<TD align=left valign=center>"
+ "<INPUT TYPE=TEXT NAME=\"%s\" VALUE=\"%s\">"
+ "</TD><TD><SMALL>%s (%s)</SMALL></TR>\n",
+ message, pData->name, pData->name,
+ value, pData->description,pData->defval);
+ }
}
free (value);
}
@@ -835,16 +854,66 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
}
- if(!readonly)
+ if (nsteerable>0)
+ {
+ strcpy(message, "</TABLE>\n");
+ HTTP_Write(request, message, strlen(message));
+ }
+
+ if(!readonly && nsteerable>0)
{
strcpy(message,
- "<TR><TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT VALUE=\"Update all parameters\"></TD></TR>\n"
+ "<INPUT TYPE=SUBMIT VALUE=\"Update all parameters\">\n"
"</FORM>\n");
HTTP_Write(request, message, strlen(message));
}
- strcpy(message, "</TABLE><P></BLOCKQUOTE>\n");
- HTTP_Write(request, message, strlen(message));
+
+ /* Walk through non-all steerable parameters of given implementation. */
+ first = 1;
+
+ while(CCTK_ParameterWalk(first, thorn, NULL, &pData) == 0)
+ {
+ first = 0;
+ strcpy(message,"");
+
+ value = CCTK_ParameterValString (pData->name, pData->thorn);
+ if(value)
+ {
+ if (!(pData->steerable == CCTK_STEERABLE_ALWAYS && !readonly))
+ {
+
+ if (nfixed == 0)
+ {
+ strcat(message,"<h2>Fixed Parameters</h2>"
+ "<table cellpadding=5 cellspacing=5>");
+ }
+ nfixed++;
+
+ /* FIXME: This is a hack - should put in parameter tags. */
+ if(strcmp(thorn,CCTK_THORNSTRING) ||
+ (strcmp(pData->name,"user") &&
+ strcmp(pData->name,"password") &&
+ strcmp(pData->name,"encryption_scheme")))
+ {
+ sprintf(message,
+ "%s<TR><TD align=left valign=center>%s</TD>"
+ "<TD>%s</TD><TD><SMALL>%s (%s)</SMALL></TD></TR>\n",
+ message,pData->name, value, pData->description,pData->defval);
+ }
+ free(value);
+ }
+ }
+ HTTP_Write(request, message, strlen(message));
+
+ }
+
+ if (nfixed>0)
+ {
+ strcpy(message, "</TABLE>\n");
+ HTTP_Write(request, message, strlen(message));
+ }
+
}
strcpy(message,"</center>");
@@ -853,7 +922,8 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
} /* n_arguments > 0 */
return retval;
@@ -968,10 +1038,9 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
DECLARE_CCTK_PARAMETERS
int retval;
- char message[4096];
+ char message[4098];
int notauthorised;
- struct httpLink *link;
char thisuser[USER_LENGTH+1];
@@ -999,30 +1068,18 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
/* Start the page */
strcpy(message, "<HTML><HEAD><TITLE>Cactus Control and Status Page</TITLE>\n");
- strcat(message, cactus_mainheader);
- strcat(message, "<center><h1>Simulation Home Page</h1></center>");
+ HTTP_ContentHeader(0,4098,message);
+ strcat(message, "<center><h1>Control and Status Page</h1></center>");
HTTP_Write(request, message, strlen(message));
- if(ContentLinks)
- {
- strcpy(message, "<center>Quick links: ");
-
- for(link = ContentLinks; link; link=link->next)
- {
- if(link->flags & HTTP_QUICKLINK)
- {
- sprintf(message,
- "%s[<A HREF=\"%s\">%s</a>]",
- message,
- link->URL,
- link->name);
- }
- }
- strcat(message,"</center>\n<br>\n");
+ strcpy(message,
+ "<P>This page is the control center for interacting with"
+ " the current simulation. It is possible to steer certain"
+ " parameters, as well as pause, restart, or terminate the"
+ " simulation.</P>");
- HTTP_Write(request, message, strlen(message));
- }
+ HTTP_Write(request, message, strlen(message));
strcpy(message,
"<CENTER>\n"
@@ -1058,7 +1115,8 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
}
else
{
@@ -1106,7 +1164,7 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
@@*/
static int ControlSet(cGH *cctkGH, httpRequest *request)
{
- char message[4096];
+ char message[4098];
const char *runstate;
runstate = HTTP_ArgumentValue(request,"runstate");
@@ -1161,7 +1219,7 @@ static int ControlSet(cGH *cctkGH, httpRequest *request)
static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
{
int retval;
- char message[4096];
+ char message[4098];
/* Status message */
strcpy(message,"HTTP/1.0 200 OK\r\n");
@@ -1179,7 +1237,8 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
HTTP_Write(request, message, strlen(message));
/* Write out the main header part */
- HTTP_Write(request, cactus_mainheader, strlen(cactus_mainheader));
+ HTTP_ContentHeader(1,4098,message);
+ HTTP_Write(request, message, strlen(message));
strcpy(message, "<center><h1>Simulation Home Page</h1></center>");
@@ -1205,10 +1264,27 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
"</FONT></li>\n"
"<li>Code compiled on <FONT COLOR=RED>"
__DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__ "</font></li>\n"
- "</ul>", CCTK_FullVersion());
+ ,CCTK_FullVersion());
HTTP_Write(request, message, strlen(message));
+ if (cctkGH)
+ {
+ if (CCTK_nProcs(cctkGH) == 1)
+ {
+ strcpy(message,"<li>Single processor run</li>");
+ }
+ else
+ {
+ sprintf(message," <li>Multiprocessor run on %d CPUs</li>",
+ CCTK_nProcs(cctkGH));
+ }
+ HTTP_Write(request, message, strlen(message));
+ }
+
+ strcpy(message,"</UL>");
+ HTTP_Write(request, message, strlen(message));
+
/******************************************************************************/
/* NEW COLUMN */
@@ -1231,11 +1307,10 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
"</FONT></li>\n",
cctkGH->cctk_time,
cctkGH->cctk_iteration);
-
}
else
{
- strcpy(message, "<li>Current cactus time is unknown</li>\n");
+ strcpy(message, "<li>Current cactus state is unknown</li>\n");
}
HTTP_Write(request, message, strlen(message));
@@ -1301,7 +1376,8 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
/* retval = HTTP_Write(request, base_page, strlen(base_page)); */
@@ -1326,10 +1402,10 @@ int HTTP_ContentSendFromFile(httpRequest *request, int filedes)
{
int bytes_sent;
int n_bytes;
- char buffer[4096];
+ char buffer[4098];
bytes_sent = 0;
- while((n_bytes = read(filedes, buffer,4096)) > 0)
+ while((n_bytes = read(filedes, buffer,4098)) > 0)
{
HTTP_Write(request, buffer, n_bytes);
bytes_sent += n_bytes;
@@ -1344,6 +1420,74 @@ int HTTP_ContentSendFromFile(httpRequest *request, int filedes)
}
+
+ /*@@
+ @routine AboutPage
+ @date Sun Sep 17 2000
+ @author Gabrielle Allen
+ @desc
+ Displays a page about the web server
+ @enddesc
+ @calls
+ @calledby
+@@*/
+static int AboutPage(cGH *cctkGH, httpRequest *request, void *data)
+{
+ int retval;
+ char message[4098];
+
+ /* Status message */
+ strcpy(message,"HTTP/1.0 200 OK\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Content-Type */
+ strcpy(message,"Content-Type: text/html\r\n\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Start the page */
+ strcpy(message, "<HTML><HEAD><TITLE>About Cactus Server</TITLE></HEAD>\n");
+ HTTP_ContentHeader(0,4098,message);
+ strcat(message,"<BODY>");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "<center>");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "<h1>About this Web Server</h1>");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "</center><p>These web pages are served by a simulation "
+ "which is using the Cactus Code and Computational ToolKit, "
+ "a freely available, parallel, collaborative,"
+ " portable and "
+ "modular programming environment for HPC.</p>"
+ "<p>The HTTPD module, or <i>thorn</i> "
+ "which is serving these pages"
+ " can be added to any Cactus application to provide on-line "
+ "monitoring and control of simulations from any web browser.</p>"
+ "<p>This HTTPD server and thorn interface has been designed and "
+ "and implemented by Tom Goodale, based on the original idea and "
+ "implementation by Werner Benger.</p>");
+
+ retval = HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "<p>For more information about Cactus, visit our "
+ "permanent home page at "
+ "<a href=\"http://www.cactuscode.org\">www.cactuscode.org</a></p>");
+
+ retval = HTTP_Write(request, message, strlen(message));
+
+ /* Write out the footer part. */
+
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
+
+ return retval;
+}
+
+
/*@@
@routine CookieTestPage
@date Mon Sep 18 23:28:19 2000
@@ -1387,7 +1531,10 @@ static int CookieTestPage(cGH *cctkGH, httpRequest *request, void *data)
/* Start the page */
strcpy(message, "<HTML><HEAD><TITLE>Cookie Test</TITLE>\n");
- strcat(message, cactus_header);
+ HTTP_Write(request, message, strlen(message));
+
+ HTTP_ContentHeader(0,4098,message);
+ HTTP_Write(request, message, strlen(message));
strcat(message, "<center><h1>Cookie Test</h1></center>");
@@ -1415,7 +1562,8 @@ static int CookieTestPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
return retval;
}
diff --git a/src/Groups.c b/src/Groups.c
new file mode 100644
index 0000000..9ccea48
--- /dev/null
+++ b/src/Groups.c
@@ -0,0 +1,233 @@
+ /*@@
+ @file Groups.c
+ @date Wed Sep 14 23:47:43 2000
+ @author Gabrielle Allen
+ @desc
+ Pages about groups
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include <stdio.h>
+
+#include "cctk.h"
+
+#include "util_String.h"
+
+#include "http_Request.h"
+#include "http_Content.h"
+
+static char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(DevThorns_httpd_Groups_c)
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+static int GroupsPage(cGH *cctkGH, httpRequest *request, void *data);
+
+static int watch[1024];
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine HTTPi_RegisterGroupPages
+ @date Wed Sep 14 11:29:43 2000
+ @author Gabrielle Allen
+ @desc
+ Httpd utils registration routine.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+int HTTPi_RegisterGroupsPages(void)
+{
+ /* Register the group info page. */
+ HTTP_RegisterPage("/Groups", GroupsPage, NULL);
+
+ HTTP_ContentLink("/Groups/index.html", "Groups and Variables",
+ "Information about grid variables and groups",
+ HTTP_QUICKLINK);
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
+
+
+/******************************************************************************
+ ***************************** Groups Page **************************************
+ ******************************************************************************/
+
+ /*@@
+ @routine GroupsPage
+ @date Thu Sep 14 23:47:43 2000
+ @author Gabrielle Allen
+ @desc
+ Displays the group description page.
+ @enddesc
+ @calls
+ @calledby
+@@*/
+static int GroupsPage(cGH *cctkGH, httpRequest *request, void *data)
+{
+ int retval;
+ char message[4098];
+ int i,j;
+ int ngroups,nvars;
+ cGroup gdata;
+
+ /* Status message */
+ strcpy(message,"HTTP/1.0 200 OK\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Content-Type */
+ strcpy(message,"Content-Type: text/html\r\n\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+
+ /* Start the page */
+ strcpy(message,"<HTML><HEAD><TITLE>Cactus Simulation Group Information</TITLE>\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* HTTP_Write out the header part. */
+
+ HTTP_ContentHeader(0,strlen(message),message);
+
+ retval = HTTP_Write(request, message, strlen(message));
+
+ ngroups = CCTK_NumGroups();
+
+ strcpy(message, "<center><h1>Groups and Grid Variables</h1></center>"
+ "<p>These pages describe the grid variables and groups "
+ "active in this simulation.</p>");
+ retval = HTTP_Write(request, message, strlen(message));
+
+ sprintf(message,"<p>This simulation contains %d groups, and %d variables, "
+ "set in %d-space dimensions. Groups for which storage is "
+ "currently assigned are written in <font color=red>red</font>. "
+ "The numbers in square brackets are the group and variable indices."
+ "</p>",
+ CCTK_NumGroups(),CCTK_NumVars(),
+ CCTK_MaxDim());
+ retval = HTTP_Write(request, message, strlen(message));
+
+ strcpy(message,"<FORM action=\"/Groups.html\" method=\"GET\">\n");
+ retval = HTTP_Write(request, message, strlen(message));
+
+ strcpy(message,"<center><table width=100\% cellpadding=5 "
+ "cellspacing=5 BGCOLOR=\"#E9F4D3\">"
+ "<tr><th>Groups</th><th>Group Properties</th>"
+ "<th>Variables</th></tr>");
+ retval = HTTP_Write(request, message, strlen(message));
+
+ for(i=0; i < ngroups; i++)
+ {
+ strcpy(message,"<tr valign=top halign=left>");
+ if (CCTK_QueryGroupStorageI(cctkGH,i))
+ {
+ sprintf(message,"%s <td>[%d] <font color=red>%s</font></td>"
+ "\n", message, i, CCTK_GroupName(i));
+ }
+ else
+ {
+ sprintf(message,"%s <td VALIGN=TOP ALIGN=LEFT>[%d] %s</td>\n",
+ message, i, CCTK_GroupName(i));
+ }
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Group Description */
+
+ sprintf(message,"<td>");
+
+ if (CCTK_GroupData(i,&gdata)>-1)
+ {
+ switch (CCTK_GroupTypeI(i))
+ {
+ case CCTK_SCALAR:
+ strcat(message,"Grid scalar");
+ break;
+ case CCTK_ARRAY:
+ strcat(message,"Grid array");
+ break;
+ case CCTK_GF:
+ strcat(message,"Grid function");
+ break;
+ }
+
+ sprintf(message, "%s %s <br>(%d bytes)", message,
+ CCTK_VarTypeName(gdata.vartype),CCTK_VarTypeSize(gdata.vartype));
+ if (!(CCTK_GroupTypeI(i) == CCTK_SCALAR))
+ {
+ sprintf(message,"%s <br>Dimension %d",message,gdata.dim);
+ sprintf(message, "%s <br>Timelevels %d",message, gdata.numtimelevels);
+ }
+ HTTP_Write(request, message, strlen(message));
+ }
+
+ strcpy(message,"</td>");
+
+ nvars = CCTK_NumVarsInGroupI(i);
+ strcat(message,"<TD VALIGN=TOP ALIGN=LEFT><DL>");
+ for(j=CCTK_FirstVarIndexI(i); j < CCTK_FirstVarIndexI(i)+nvars; j++)
+ {
+ sprintf(message,"%s <DT>[%d] %s\n", message, j, CCTK_VarName(j) );
+ }
+ strcat(message,"</DL></TD></TR>");
+ HTTP_Write(request, message, strlen(message));
+
+ /*
+ strcpy(message,"<TD align=center valign=center>");
+ if (CCTK_GroupTypeI(i) == CCTK_SCALAR)
+ {
+ for(j=CCTK_FirstVarIndexI(i); j < CCTK_FirstVarIndexI(i)+nvars; j++)
+ {
+ sprintf(message,"%s "
+ "<INPUT type=\"checkbox\" name=\"var%d\" %s value=\"1\"><br>",
+ message,j,watch[j] ? "checked" : "unchecked");
+ }
+ }
+ else
+ {
+ strcat(message,"&nbsp;");
+ }
+ sprintf(message,"%s </TD></TR>",message);
+ HTTP_Write(request, message, strlen(message));
+ */
+ }
+
+ strcpy(message,"</TABLE></FORM></center>/n");
+ HTTP_Write(request, message, strlen(message));
+
+ /* Write out the footer part. */
+
+ HTTP_ContentFooter(0,strlen(message),message);
+ retval = HTTP_Write(request, message, strlen(message));
+
+ return retval;
+}
+
diff --git a/src/Headers.c b/src/Headers.c
new file mode 100644
index 0000000..74afd0a
--- /dev/null
+++ b/src/Headers.c
@@ -0,0 +1,143 @@
+ /*@@
+ @file Headers.c
+ @date Wed Sep 17 23:47:43 2000
+ @author Gabrielle Allen
+ @desc
+ Functions to return standard headers and footers for HTML pages
+ @enddesc
+ @version $Header$
+ @@*/
+
+#define TITLE_ARRAY_SIZE 100
+
+#include <string.h>
+
+#include "cctk.h"
+
+static char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(DevThorns_httpd_Headers_c)
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+static const char *cactus_mainheader =
+"</HEAD>\n"
+"<BODY BGCOLOR=\"#FFFFFF\""
+" link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n"
+"<center><A HREF=\"http://www.cactuscode.org/\">"
+"<img src=\"/Images/wwwcactuscodeorg.jpg\""
+" alt=\"Cactus\" BORDER=0></A>"
+"</A>"
+"<table width=70% border=0><tr><td>"
+"\n";
+
+static const char *cactus_footer =
+"</table>\n"
+"<TABLE WIDTH=100\% BORDER=0>\n"
+"<tr><td colspan=2><HR NOSHADE SIZE=1></td></tr>\n"
+"<tr><td align=left valign=top>"
+"<ADDRESS><DIV ALIGN=left>\n"
+"<SMALL>\n"
+"<A HREF=\"http://www.cactuscode.org/\">Cactus Home Page</A><BR>\n"
+"Cactus Web Interface by <A HREF=\"mailto:cactusmaint@cactuscode.org\">The Cactus Team</A><BR>\n"
+"</SMALL></DIV></ADDRESS>"
+"</TD><TD ALIGN=RIGHT VALIGN=TOP><SMALL>"
+"<A HREF=\"/About.html\"><i>About this Server</i></A>"
+"</SMALL></TD></TR></TABLE>"
+"</BODY></HTML>\n";
+
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine HTTP_ContentHeader
+ @date Sat Sep 16 15:22:59 2000
+ @author Gabrielle Allen
+ @desc
+ Returns header for HTML pages
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+int HTTP_ContentHeader(int choice, int len, char *header)
+{
+ char title[TITLE_ARRAY_SIZE];
+ char currentdate[50];
+ char currenttime[50];
+
+ int titlelen,datelen,timelen;
+
+ if (choice == 0)
+ {
+ /* Find strings needed for nonmain-page headers */
+ titlelen = CCTK_RunTitle(TITLE_ARRAY_SIZE,title);
+ datelen = Util_CurrentDate(50,currentdate);
+ timelen = Util_CurrentTime(50,currenttime);
+
+ /* Build the header */
+ sprintf( header,
+ "</HEAD>\n<BODY BGCOLOR=\"#FFFFFF\" link=\"#1B831D\" "
+ "vlink=\"#768000\" alink=\"#00FF00\">\n"
+ "<table width=100\% border=1>\n<tr>\n<td align=left>\n");
+ strcat(header,"<font color=#1B831D><small>\n");
+ strncat(header, title, titlelen*sizeof(char));
+ strcat(header,"</br>");
+ strncat(header, currentdate, datelen*sizeof(char));
+ strcat(header, " ");
+ strncat(header, currenttime, timelen*sizeof(char));
+ strcat(header, "</small></font>\n");
+ strcat(header, "</td>\n<td align=right valign=top>\n"
+ "<A HREF=\"/\">Simulation Homepage</A>\n"
+ "</td>\n</tr>\n</table>\n<center>\n<table width=70% border=0>\n"
+ "<tr>\n<td>\n");
+ printf("Header is \n%s\n",header);
+ }
+ else
+ {
+ sprintf(header,"%s",cactus_mainheader);
+ }
+ return strlen(header)
+}
+
+ /*@@
+ @routine HTTP_ContentFooter
+ @date Sat Sep 16 15:22:59 2000
+ @author Tom Goodale
+ @desc
+ Returns footer for HTML pages
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+int HTTP_ContentFooter(int choice, int len, char *footer)
+{
+ strcpy(footer,cactus_footer);
+ return strlen(footer);
+}
+
+
+
diff --git a/src/http_Content.h b/src/http_Content.h
index 8ae2eb8..cf995b5 100644
--- a/src/http_Content.h
+++ b/src/http_Content.h
@@ -26,6 +26,9 @@ int HTTP_ContentLink(const char *URL,
int HTTP_ContentSendFromFile(httpRequest *request,
int filedes);
+void HTTP_ContentHeader(int choice, int len, char *header);
+void HTTP_ContentFooter(int choice, int len, char *footer);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/make.code.defn b/src/make.code.defn
index b0eac4f..d6d49e0 100644
--- a/src/make.code.defn
+++ b/src/make.code.defn
@@ -7,7 +7,7 @@ MISC_SRC = Startup.c Expression.c
SERVER_SRC = Server.c Sockets.c http.c
-CONTENT_SRC = Content.c
+CONTENT_SRC = Content.c Headers.c Groups.c
STEERING_SRC = Steer.c