summaryrefslogtreecommitdiff
path: root/cleopatre/application/spidgoahead/LINUX/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/application/spidgoahead/LINUX/main.c')
-rw-r--r--cleopatre/application/spidgoahead/LINUX/main.c473
1 files changed, 473 insertions, 0 deletions
diff --git a/cleopatre/application/spidgoahead/LINUX/main.c b/cleopatre/application/spidgoahead/LINUX/main.c
new file mode 100644
index 0000000000..07a9bdb3d8
--- /dev/null
+++ b/cleopatre/application/spidgoahead/LINUX/main.c
@@ -0,0 +1,473 @@
+/*
+ * main.c -- Main program for the GoAhead WebServer (LINUX version)
+ *
+ * Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.
+ *
+ * See the file "license.txt" for usage and redistribution license requirements
+ *
+ * $Id: main.c,v 1.5 2003/09/11 14:03:46 bporter Exp $
+ */
+
+/******************************** Description *********************************/
+
+/*
+ * Main program for for the GoAhead WebServer. This is a demonstration
+ * main program to initialize and configure the web server.
+ */
+
+/********************************* Includes ***********************************/
+
+#include "../uemf.h"
+#include "../wsIntrn.h"
+#include <signal.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#ifdef WEBS_SSL_SUPPORT
+#include "../websSSL.h"
+#endif
+
+#ifdef USER_MANAGEMENT_SUPPORT
+#include "../um.h"
+void formDefineUserMgmt (void);
+#endif
+
+#include "libspid.h"
+
+/*********************************** Locals ***********************************/
+/*
+ * Change configuration here
+ */
+
+static char_t *rootWeb = T("/usr/share/httpd/web"); /* Root web directory */
+static char_t *password = T(""); /* Security password */
+static int port = 80; /* Server port */
+static int retries = 5; /* Server port retries */
+static int finished; /* Finished flag */
+static libspid_ip_t ip;
+
+/****************************** Forward Declarations **************************/
+
+static int initWebs ();
+static int aspTest (int eid, webs_t wp, int argc, char_t **argv);
+static void formTest (webs_t wp, char_t *path, char_t *query);
+static int websHomePageHandler (webs_t wp, char_t *urlPrefix, char_t *webDir,
+ int arg, char_t *url, char_t *path, char_t *query);
+extern void defaultErrorHandler (int etype, char_t *msg);
+extern void defaultTraceHandler (int level, char_t *buf);
+#ifdef B_STATS
+static void printMemStats (int handle, char_t *fmt, ...);
+static void memLeaks ();
+#endif
+
+/*********************************** Code *************************************/
+/*
+ * Main -- entry point from LINUX
+ */
+
+int
+main (int argc, char** argv)
+{
+ int ret = 0;
+ char enable[LIBSPID_CONFIG_LINE_MAX_LEN] = {0};
+ char sys_reset_cause[SPC300_RESET_CAUSE_STR_MAX_LEN];
+
+ ret = libspid_config_read_item (
+ LIBSPID_WEB_RESET_INFO_PATH,
+ LIBSPID_WEB_RESET_INFO_LABEL_RESET_BY_WEB,
+ sys_reset_cause, LIBSPID_LINE_MAX_LEN);
+ if (LIBSPID_SUCCESS == ret &&
+ 0 == strcmp (sys_reset_cause,
+ LIBSPID_WEB_RESET_INFO_RESET_BY_WEB_YES))
+ {
+ ret = libspid_config_write_item (
+ LIBSPID_WEB_RESET_INFO_PATH,
+ LIBSPID_WEB_RESET_INFO_LABEL_RESET_BY_WEB,
+ LIBSPID_WEB_RESET_INFO_RESET_BY_WEB_NO);
+ if (LIBSPID_SUCCESS == ret)
+ {
+ libspid_system_save_file (LIBSPID_WEB_RESET_INFO_PATH);
+ }
+
+ libspid_config_write_item (
+ LIBSPID_WEB_RESET_INFO_PATH,
+ LIBSPID_WEB_RESET_INFO_LABEL_RESET_BY_WEB,
+ LIBSPID_WEB_RESET_INFO_RESET_BY_WEB_YES);
+ }
+
+ ret = libspid_config_read_item (LIBSPID_SYSTEM_CONF_PATH,
+ LIBSPID_SYSTEM_CONF_LABEL_HTTP_SERVICE,
+ enable, LIBSPID_CONFIG_LINE_MAX_LEN);
+
+ /*
+ * http service is disabled for HTTP_SERVICE = no
+ * in /etc/system.conf
+ * in other case it is enabled
+ */
+ if (ret == LIBSPID_SUCCESS && strcmp (enable, LIBSPID_SYSTEM_CONF_VALUE_NO) == 0)
+ return 0;
+ /*
+ * Initialize the memory allocator. Allow use of malloc and start
+ * with a 60K heap. For each page request approx 8KB is allocated.
+ * 60KB allows for several concurrent page requests. If more space
+ * is required, malloc will be used for the overflow.
+ */
+ bopen (NULL, (60 * 1024), B_USE_MALLOC);
+ signal (SIGPIPE, SIG_IGN);
+
+ /*
+ * Initialize the web server
+ */
+ if (initWebs () < 0) {
+ return -1;
+ }
+
+#ifdef WEBS_SSL_SUPPORT
+ websSSLOpen ();
+#endif
+
+ /*
+ * Basic event loop. SocketReady returns true when a socket is ready for
+ * service. SocketSelect will block until an event occurs. SocketProcess
+ * will actually do the servicing.
+ */
+ while (!finished) {
+ if (socketReady (-1) || socketSelect (-1, 1000)) {
+ socketProcess (-1);
+ }
+ websCgiCleanup ();
+ emfSchedProcess ();
+ }
+
+#ifdef WEBS_SSL_SUPPORT
+ websSSLClose ();
+#endif
+
+#ifdef USER_MANAGEMENT_SUPPORT
+ umClose ();
+#endif
+
+ /*
+ * Close the socket module, report memory leaks and close the memory allocator
+ */
+ websCloseServer ();
+ socketClose ();
+#ifdef B_STATS
+ memLeaks ();
+#endif
+ bclose ();
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * Initialize the web server.
+ */
+
+static int initWebs ()
+{
+ struct hostent *hp;
+ struct in_addr intaddr;
+ char host[128], dir[128], webdir[128];
+ char *cp;
+ char_t wbuf[128];
+
+ /*
+ * Initialize the socket subsystem
+ */
+ socketOpen ();
+
+#ifdef USER_MANAGEMENT_SUPPORT
+ /*
+ * Initialize the User Management database
+ */
+ umOpen ();
+ umRestore (UM_TXT_FILENAME);
+#endif
+
+ /*
+ * Define the local Ip address, host name, default home page and the
+ * root web directory.
+ */
+ if (gethostname (host, sizeof(host)) < 0) {
+ error (E_L, E_LOG, T("Can't get hostname"));
+ return -1;
+ }
+ // Spidcom modification
+ if (libspid_network_get_ip ("br0", &ip) != LIBSPID_SUCCESS)
+ strcpy (host, "127.0.0.1");
+ else
+ strcpy (host, ip.address);
+ // End
+ if ((hp = gethostbyname (host)) == NULL) {
+ error (E_L, E_LOG, T("Can't get host address"));
+ return -1;
+ }
+ memcpy ((char *) &intaddr, (char *) hp->h_addr_list[0],
+ (size_t) hp->h_length);
+
+
+
+ /*
+ * Set ../web as the root web. Modify this to suit your needs
+ */
+ sprintf (webdir, "%s", rootWeb);
+
+ /*
+ * Configure the web server options before opening the web server
+ */
+ websSetDefaultDir (webdir);
+ cp = inet_ntoa (intaddr);
+ ascToUni (wbuf, cp, min(strlen (cp) + 1, sizeof (wbuf)));
+ websSetIpaddr (wbuf);
+ ascToUni (wbuf, host, min(strlen (host) + 1, sizeof (wbuf)));
+ websSetHost (wbuf);
+
+ /*
+ * Configure the web server options before opening the web server
+ */
+ websSetDefaultPage (T("index.asp"));
+ websSetPassword (password);
+
+ /*
+ * Open the web server on the given port. If that port is taken, try
+ * the next sequential port for up to "retries" attempts.
+ */
+ websOpenServer (port, retries);
+
+ /*
+ * First create the URL handlers. Note: handlers are called in sorted order
+ * with the longest path handler examined first. Here we define the security
+ * handler, forms handler and the default web page handler.
+ */
+ websUrlHandlerDefine (T(""), NULL, 0, websSecurityHandler,
+ WEBS_HANDLER_FIRST);
+ websUrlHandlerDefine (T("/goform"), NULL, 0, websFormHandler, 0);
+ websUrlHandlerDefine (T("/cgi-bin"), NULL, 0, websCgiHandler, 0);
+ websUrlHandlerDefine (T(""), NULL, 0, websDefaultHandler,
+ WEBS_HANDLER_LAST);
+
+ /*
+ * Now define two test procedures. Replace these with your application
+ * relevant ASP script procedures and form functions.
+ */
+ websAspDefine (T("aspTest"), aspTest);
+ websFormDefine (T("formTest"), formTest);
+ spidcom_register_all ();
+
+ /*
+ * Create the Form handlers for the User Management pages
+ */
+#ifdef USER_MANAGEMENT_SUPPORT
+ formDefineUserMgmt ();
+#endif
+
+ /*
+ * Create a handler for the default home page
+ */
+ websUrlHandlerDefine (T("/"), NULL, 0, websHomePageHandler, 0);
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * Test Javascript binding for ASP. This will be invoked when "aspTest" is
+ * embedded in an ASP page. See web/asp.asp for usage. Set browser to
+ * "localhost/asp.asp" to test.
+ */
+
+static int aspTest (int eid, webs_t wp, int argc, char_t **argv)
+{
+ char_t *name, *address;
+
+ if (ejArgs (argc, argv, T("%s %s"), &name, &address) < 2) {
+ websError (wp, 400, T("Insufficient args\n"));
+ return -1;
+ }
+ return websWrite (wp, T("Name: %s, Address %s"), name, address);
+}
+
+/******************************************************************************/
+/*
+ * Test form for posted data (in-memory CGI). This will be called when the
+ * form in web/forms.asp is invoked. Set browser to "localhost/forms.asp" to test.
+ */
+
+static void formTest (webs_t wp, char_t *path, char_t *query)
+{
+ char_t *name, *address;
+
+ name = websGetVar (wp, T("name"), T("Joe Smith"));
+ address = websGetVar (wp, T("address"), T("1212 Milky Way Ave."));
+
+ websHeader (wp);
+ websWrite (wp, T("<body><h2>Name: %s, Address: %s</h2>\n"), name, address);
+ websFooter (wp);
+ websDone (wp, 200);
+}
+
+/******************************************************************************/
+/*
+ * Home page handler
+ */
+
+static int websHomePageHandler (webs_t wp, char_t *urlPrefix, char_t *webDir,
+ int arg, char_t *url, char_t *path, char_t *query)
+{
+ /*
+ * If the empty or "/" URL is invoked, redirect default URLs to the home page
+ */
+ if (*url == '\0' || gstrcmp (url, T("/")) == 0) {
+ websRedirect (wp, T("index.asp"));
+ return 1;
+ }
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * Default error handler. The developer should insert code to handle
+ * error messages in the desired manner.
+ */
+
+void defaultErrorHandler (int etype, char_t *msg)
+{
+#if 0
+ write(1, msg, gstrlen(msg));
+#endif
+}
+
+/******************************************************************************/
+/*
+ * Trace log. Customize this function to log trace output
+ */
+
+void defaultTraceHandler (int level, char_t *buf)
+{
+ /*
+ * The following code would write all trace regardless of level
+ * to stdout.
+ */
+#if 0
+ if (buf) {
+ write(1, buf, gstrlen(buf));
+ }
+#endif
+}
+
+/******************************************************************************/
+/*
+ * Returns a pointer to an allocated qualified unique temporary file name.
+ * This filename must eventually be deleted with bfree();
+ */
+
+char_t *websGetCgiCommName ()
+{
+ char_t *pname1, *pname2;
+
+ pname1 = tempnam (NULL, T("cgi"));
+ pname2 = bstrdup (B_L, pname1);
+ free (pname1);
+ return pname2;
+}
+
+/******************************************************************************/
+/*
+ * Launch the CGI process and return a handle to it.
+ */
+
+int websLaunchCgiProc (char_t *cgiPath, char_t **argp, char_t **envp,
+ char_t *stdIn, char_t *stdOut)
+{
+ int pid, fdin, fdout, hstdin, hstdout, rc;
+
+ fdin = fdout = hstdin = hstdout = rc = -1;
+ if ((fdin = open (stdIn, O_RDWR | O_CREAT, 0666)) < 0 ||
+ (fdout = open (stdOut, O_RDWR | O_CREAT, 0666)) < 0 ||
+ (hstdin = dup (0)) == -1 ||
+ (hstdout = dup (1)) == -1 ||
+ dup2 (fdin, 0) == -1 ||
+ dup2 (fdout, 1) == -1) {
+ goto DONE;
+ }
+
+ rc = pid = fork ();
+ if (pid == 0)
+ {
+ /*
+ * if pid == 0, then we are in the child process
+ */
+ if (execve (cgiPath, argp, envp) == -1) {
+ printf ("content-type: text/html\n\n"
+ "Execution of cgi process failed\n");
+ }
+ exit (0);
+ }
+
+DONE:
+ if (hstdout >= 0) {
+ dup2 (hstdout, 1);
+ close (hstdout);
+ }
+ if (hstdin >= 0) {
+ dup2 (hstdin, 0);
+ close (hstdin);
+ }
+ if (fdout >= 0) {
+ close (fdout);
+ }
+ if (fdin >= 0) {
+ close (fdin);
+ }
+ return rc;
+}
+
+/******************************************************************************/
+/*
+ * Check the CGI process. Return 0 if it does not exist; non 0 if it does.
+ */
+
+int websCheckCgiProc (int handle)
+{
+ /*
+ * Check to see if the CGI child process has terminated or not yet.
+ */
+ if (waitpid (handle, NULL, WNOHANG) == handle) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+/******************************************************************************/
+
+#ifdef B_STATS
+static void memLeaks ()
+{
+ int fd;
+
+ if ((fd = gopen (T("leak.txt"), O_CREAT | O_TRUNC | O_WRONLY, 0666)) >= 0) {
+ bstats (fd, printMemStats);
+ close (fd);
+ }
+}
+
+/******************************************************************************/
+/*
+ * Print memory usage / leaks
+ */
+
+static void printMemStats (int handle, char_t *fmt, ...)
+{
+ va_list args;
+ char_t buf[256];
+
+ va_start (args, fmt);
+ vsprintf (buf, fmt, args);
+ va_end (args);
+ write (handle, buf, strlen(buf));
+}
+#endif
+
+/******************************************************************************/