diff options
author | allen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164> | 2000-09-19 23:35:56 +0000 |
---|---|---|
committer | allen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164> | 2000-09-19 23:35:56 +0000 |
commit | c1e6b818b3ad317850015cd9a80e7513a9660ffd (patch) | |
tree | 95bb822ece5a3069a30035f527aa4d49905f987a /src/Content.c | |
parent | 7bc89f775b9129148f1bc9e1d5197ee13f3faca6 (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
Diffstat (limited to 'src/Content.c')
-rw-r--r-- | src/Content.c | 440 |
1 files changed, 294 insertions, 146 deletions
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\">" + " 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; } |