X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=cgi.c;h=ef98085e5f0cb2d3456736a353834723a61514ab;hb=a84f5650eeaae447745938c9c12d868b6c021a41;hp=8a0ce49ed3ea4d6ad53866af15438a7184f3e553;hpb=293c60b328abf1a73336fe73954425e9400e292c;p=privoxy.git diff --git a/cgi.c b/cgi.c index 8a0ce49e..ef98085e 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.106 2008/05/21 15:24:38 fabiankeil Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.113 2008/09/04 08:13:58 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ @@ -11,7 +11,7 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.106 2008/05/21 15:24:38 fabiankeil Exp $" * Functions declared include: * * - * Copyright : Written by and Copyright (C) 2001-2004, 2006-2007 + * Copyright : Written by and Copyright (C) 2001-2004, 2006-2008 * the SourceForge Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -38,6 +38,37 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.106 2008/05/21 15:24:38 fabiankeil Exp $" * * Revisions : * $Log: cgi.c,v $ + * Revision 1.113 2008/09/04 08:13:58 fabiankeil + * Prepare for critical sections on Windows by adding a + * layer of indirection before the pthread mutex functions. + * + * Revision 1.112 2008/08/31 16:08:12 fabiankeil + * "View the request headers" isn't more equal than the other + * menu items and thus doesn't need a trailing dot either. + * + * Revision 1.111 2008/08/31 15:59:02 fabiankeil + * There's no reason to let remote toggling support depend + * on FEATURE_CGI_EDIT_ACTIONS, so make sure it doesn't. + * + * Revision 1.110 2008/08/31 14:55:43 fabiankeil + * Add a @date@ symbol to include a date(1)-like time string + * in templates. Modified version of the patch Endre Szabo + * submitted in #2026468. + * + * Revision 1.109 2008/07/26 09:40:27 fabiankeil + * Remove the unconditional block in get_http_time(). + * It's pointless now that it's no longer used to limit + * dummy's scope. While at it, remove obvious comments + * and a trailing space. + * + * Revision 1.108 2008/05/26 17:30:53 fabiankeil + * Provide an OpenSearch Description to access the + * show-url-info page through "search engine plugins". + * + * Revision 1.107 2008/05/26 16:23:19 fabiankeil + * - Fix spelling in template-not-found message. + * - Declare referrer_is_safe()'s alternative_prefix[] static. + * * Revision 1.106 2008/05/21 15:24:38 fabiankeil * Mark csp as immutable for a bunch of functions. * @@ -628,9 +659,9 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.106 2008/05/21 15:24:38 fabiankeil Exp $" #include "miscutil.h" #include "cgisimple.h" #include "jbsockets.h" -#ifdef FEATURE_CGI_EDIT_ACTIONS +#if defined(FEATURE_CGI_EDIT_ACTIONS) || defined(FEATURE_TOGGLE) #include "cgiedit.h" -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ +#endif /* defined(FEATURE_CGI_EDIT_ACTIONS) || defined (FEATURE_TOGGLE) */ #include "loadcfg.h" /* loadcfg.h is for global_toggle_state only */ #ifdef FEATURE_PTHREAD @@ -670,19 +701,19 @@ static const struct cgi_dispatcher cgi_dispatchers[] = { TRUE }, { "show-request", cgi_show_request, - "View the request headers.", + "View the request headers", TRUE }, { "show-url-info", cgi_show_url_info, "Look up which actions apply to a URL and why", TRUE }, -#ifdef FEATURE_CGI_EDIT_ACTIONS #ifdef FEATURE_TOGGLE { "toggle", cgi_toggle, "Toggle Privoxy on or off", FALSE }, #endif /* def FEATURE_TOGGLE */ +#ifdef FEATURE_CGI_EDIT_ACTIONS { "edit-actions", /* Edit the actions list */ cgi_edit_actions, NULL, FALSE }, @@ -768,6 +799,9 @@ static const struct cgi_dispatcher cgi_dispatchers[] = { { "t", cgi_transparent_image, NULL, TRUE /* Send a transparent image (short name) */ }, + { "url-info-osd.xml", + cgi_send_url_info_osd, + NULL, TRUE /* Send templates/url-info-osd.xml */ }, { "user-manual", cgi_send_user_manual, NULL, TRUE /* Send user-manual */ }, @@ -1961,34 +1995,26 @@ void get_http_time(int time_offset, char *buf, size_t buffer_size) struct tm *t; time_t current_time; #if defined(HAVE_GMTIME_R) - /* - * 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; + struct tm dummy; #endif assert(buf); - assert(buffer_size > 29); + assert(buffer_size > (size_t)29); - time(¤t_time); /* get current time */ + time(¤t_time); current_time += time_offset; /* get and save the gmt */ - { #if HAVE_GMTIME_R - t = gmtime_r(¤t_time, &dummy); + t = gmtime_r(¤t_time, &dummy); #elif FEATURE_PTHREAD - pthread_mutex_lock(&gmtime_mutex); - t = gmtime(¤t_time); - pthread_mutex_unlock(&gmtime_mutex); + privoxy_mutex_lock(&gmtime_mutex); + t = gmtime(¤t_time); + privoxy_mutex_unlock(&gmtime_mutex); #else - t = gmtime(¤t_time); + t = gmtime(¤t_time); #endif - } /* Format: "Sun, 06 Nov 1994 08:49:37 GMT" */ snprintf(buf, buffer_size, @@ -2004,6 +2030,51 @@ void get_http_time(int time_offset, char *buf, size_t buffer_size) } +/********************************************************************* + * + * Function : get_locale_time + * + * Description : Get the time in a date(1)-like format + * according to the current locale - e.g.: + * "Fri Aug 29 19:37:12 CEST 2008" + * + * XXX: Should we allow the user to change the format? + * + * Parameters : + * 1 : buf = Destination for result. + * 2 : buffer_size = Size of the buffer above. Must be big + * enough to hold 29 characters plus a + * trailing zero. + * + * Returns : N/A + * + *********************************************************************/ +static void get_locale_time(char *buf, size_t buffer_size) +{ + struct tm *timeptr; + time_t current_time; +#if defined(HAVE_LOCALTIME_R) + struct tm dummy; +#endif + + assert(buf); + assert(buffer_size > (size_t)29); + + time(¤t_time); + +#if HAVE_LOCALTIME_R + timeptr = localtime_r(¤t_time, &dummy); +#elif FEATURE_PTHREAD + privoxy_mutex_lock(&localtime_mutex); + timeptr = localtime(¤t_time); + privoxy_mutex_unlock(&localtime_mutex); +#else + timeptr = localtime(¤t_time); +#endif + + strftime(buf, buffer_size, "%a %b %d %X %Z %Y", timeptr); + +} /********************************************************************* * @@ -2577,7 +2648,7 @@ jb_err template_fill_for_cgi(const struct client_state *csp, *********************************************************************/ struct map *default_exports(const struct client_state *csp, const char *caller) { - char buf[20]; + char buf[30]; jb_err err; struct map * exports; int local_help_exists = 0; @@ -2603,6 +2674,8 @@ struct map *default_exports(const struct client_state *csp, const char *caller) } err = map(exports, "version", 1, html_encode(VERSION), 0); + get_locale_time(buf, sizeof(buf)); + if (!err) err = map(exports, "time", 1, html_encode(buf), 0); if (!err) err = map(exports, "my-ip-address", 1, html_encode(ip_address ? ip_address : "unknown"), 0); freez(ip_address); if (!err) err = map(exports, "my-hostname", 1, html_encode(hostname ? hostname : "unknown"), 0); @@ -2696,7 +2769,7 @@ jb_err map_block_killer(struct map *exports, const char *name) assert(exports); assert(name); - assert(strlen(name) < 490); + assert(strlen(name) < (size_t)490); snprintf(buf, sizeof(buf), "if-%s-start.*if-%s-end", name, name); return map(exports, buf, 1, "", 1); @@ -2726,7 +2799,7 @@ jb_err map_block_keep(struct map *exports, const char *name) assert(exports); assert(name); - assert(strlen(name) < 490); + assert(strlen(name) < (size_t)490); snprintf(buf, sizeof(buf), "if-%s-start", name); err = map(exports, buf, 1, "", 1); @@ -2773,7 +2846,7 @@ jb_err map_conditional(struct map *exports, const char *name, int choose_first) assert(exports); assert(name); - assert(strlen(name) < 480); + assert(strlen(name) < (size_t)480); snprintf(buf, sizeof(buf), (choose_first ? "else-not-%s@.*@endif-%s"