-const char cgi_rcs[] = "$Id: cgi.c,v 1.70 2002/05/19 11:33:20 jongfoster Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 2.3 2002/11/12 16:19:18 oes Exp $";
/*********************************************************************
*
- * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $
+ * File : $Source: /cvsroot/ijbswa/current/src/cgi.c,v $
*
* Purpose : Declares functions to intercept request, generate
* html or gif answers, and to compose HTTP resonses.
*
* Revisions :
* $Log: cgi.c,v $
+ * Revision 2.3 2002/11/12 16:19:18 oes
+ * Fix: g_bToggleIJB was used outside #ifdef FEATURE_TOGGLE
+ *
+ * Revision 2.2 2002/09/04 15:17:28 oes
+ * Synced with the stable branch:
+ * Revision 1.70.2.1 2002/08/05 11:17:46 oes
+ * Fixed Bug #587820, i.e. added workaround for IE bug that includes fragment identifier in (cgi) query
+ *
+ * Revision 2.1 2002/06/04 17:55:24 jongfoster
+ * Adding comments
+ *
+ * Revision 2.0 2002/06/04 14:34:21 jongfoster
+ * Moving source files to src/
+ *
* Revision 1.70 2002/05/19 11:33:20 jongfoster
* If a CGI error was not handled, and propogated back to
* dispatch_known_cgi(), then it was assumed to be "out of memory".
#endif /* def FEATURE_CGI_EDIT_ACTIONS */
#include "loadcfg.h"
/* loadcfg.h is for g_bToggleIJB only */
+#ifdef FEATURE_PTHREAD
+#include <pthread.h>
+#include "jcc.h"
+/* jcc.h is for mutex semaphore globals only */
+#endif /* def FEATURE_PTHREAD */
const char cgi_h_rcs[] = CGI_H_VERSION;
-/*
- * List of CGI functions: name, handler, description
+/**
+ * List of CGI functions: name, handler, description.
* Note: Do NOT use single quotes in the description;
* this will break the dynamic "blocked" template!
*/
/*
- * Bulit-in images for ad replacement
+ * Built-in images for ad replacement
*
* Hint: You can encode your own images like this:
* cat your-image | perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o", unpack("C", $c)); }'
"\000\000\000\000\111\105\116\104\256\102\140\202";
#else
-/*
+/**
* Checkerboard pattern, as a GIF.
*/
const char image_pattern_data[] =
"\054\000\000\000\000\004\000\004\000\000\002\005\104\174\147"
"\270\005\000\073";
-/*
+/**
* 1x1 transparant GIF.
*/
const char image_blank_data[] =
"\000\001\000\000\002\002D\001\000;";
#endif
+/**
+ * The size of the image_pattern, in bytes.
+ */
const size_t image_pattern_length = sizeof(image_pattern_data) - 1;
+
+/**
+ * The size of the image_blank, in bytes.
+ */
const size_t image_blank_length = sizeof(image_blank_data) - 1;
+/**
+ * The "Out of memory" CGI response. This is statically allocated
+ * and is initialized at startup, for obvious reasons. It's
+ * read-only. finish_http_response() and free_http_response()
+ * have been special-cased to do nothing if they are passed
+ * this structure.
+ */
static struct http_response cgi_error_memory_response[1];
+
static struct http_response *dispatch_known_cgi(struct client_state * csp,
const char * path);
static struct map *parse_cgi_parameters(char *argstring);
return NULL;
}
+ /*
+ * IE 5 does, of course, violate RFC 2316 Sect 4.1 and sends
+ * the fragment identifier along with the request, so we must
+ * cut it off here, so it won't pollute the CGI params:
+ */
+ if (NULL != (p = strchr(argstring, '#')))
+ {
+ *p = '\0';
+ }
+
pairs = ssplit(argstring, "&", vector, SZ(vector), 1, 1);
for (i = 0; i < pairs; i++)
struct tm *t;
time_t current_time;
+#if defined(HAVE_GMTIME_R) && !defined(OSX_DARWIN)
+ /*
+ * Declare dummy up here (instead of inside get/set gmt block) so it
+ * doesn't go out of scope before it's potentially used in snprintf later.
+ * Wrapping declaration inside HAVE_GMTIME_R keeps the compiler quiet when
+ * !defined HAVE_GMTIME_R.
+ */
+ struct tm dummy;
+#endif
assert(buf);
/* get and save the gmt */
{
-#ifdef HAVE_GMTIME_R
- struct tm dummy;
+#ifdef OSX_DARWIN
+ pthread_mutex_lock(&gmtime_mutex);
+ t = gmtime(¤t_time);
+ pthread_mutex_unlock(&gmtime_mutex);
+#elif HAVE_GMTIME_R
t = gmtime_r(¤t_time, &dummy);
#else
t = gmtime(¤t_time);
if (!err) err = map(exports, "code-status", 1, CODE_STATUS, 1);
if (!err) err = map(exports, "user-manual", 1, csp->config->usermanual ,1);
if (!err) err = map(exports, "actions-help-prefix", 1, ACTIONS_HELP_PREFIX ,1);
+#ifdef FEATURE_TOGGLE
if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB);
+#endif
snprintf(buf, 20, "%d", csp->config->hport);
if (!err) err = map(exports, "my-port", 1, buf, 1);