Author: rjung Date: Tue Nov 20 09:29:26 2007 New Revision: 596747 URL: http://svn.apache.org/viewvc?rev=596747&view=rev Log: Add comments to explain timestamp formatting for sub seconds resolution.
Furthermore increased the accepted format length a bit. Before we accepted JK_TIME_MAX_SIZE=64 bytes after replacing the first subsecond format character, now we accept the same size before replacing the formatting character. Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_util.c?rev=596747&r1=596746&r2=596747&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_util.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_util.c Tue Nov 20 09:29:26 2007 @@ -124,7 +124,7 @@ /* * define the log format, we're using by default the one from error.log * - * [Mon Mar 26 19:44:48 2001] [jk_uri_worker_map.c (155)]: Into jk_uri_worker_map_t::uri_worker_map_alloc + * [Mon Mar 26 19:44:48.123 2001] [jk_uri_worker_map.c (155)]: Into jk_uri_worker_map_t::uri_worker_map_alloc * log format used by apache in error.log */ #define JK_TIME_CONV_MILLI "%Q" @@ -137,7 +137,17 @@ #define JK_TIME_SUBSEC_NONE (0) #define JK_TIME_SUBSEC_MILLI (1) #define JK_TIME_SUBSEC_MICRO (2) -#define JK_TIME_MAX_SIZE (64) +/* The size of the longest format string we can handle, + * including the terminating '\0'. + */ +#define JK_TIME_MAX_FMT_SIZE (64) +/* We increase the maximum format string size by the biggest + * size increment, that happens during replacement of a + * sub second format character by it's zero digit string. + * At the moment, this is + * strlen(JK_TIME_PATTERN_MICRO)-strlen(JK_TIME_CONV_MICRO) = 6-2 = 4. + */ +#define JK_TIME_MAX_SIZE (JK_TIME_MAX_FMT_SIZE + 4) /* Visual C++ Toolkit 2003 support */ #if defined (_MSC_VER) && (_MSC_VER == 1310) @@ -353,11 +363,21 @@ #endif } +/* Replace the first occurence of a sub second time format character + * by a series of zero digits with the right precision. + * We format our timestamp with strftime, but this can not handle + * sub second timestamps. + * So we first patch the milliseconds or microseconds literally into + * the format string, and then pass it on the strftime. + * In order to do that efficiently, we prepare a format string, that + * already has placeholder digits for the sub second time stamp + * and we save the position and resultion of this placeholder. + */ void jk_set_time_fmt(jk_logger_t *l, const char *jk_log_fmt) { if (l) { char *s; - char log_fmt_safe[JK_TIME_MAX_SIZE]; + char log_fmt_safe[JK_TIME_MAX_FMT_SIZE]; char *fmt; if (!jk_log_fmt) { @@ -373,35 +393,57 @@ l->log_fmt_subsec = jk_log_fmt; l->log_fmt = jk_log_fmt; - fmt = (char *)malloc(JK_TIME_MAX_SIZE + strlen(JK_TIME_PATTERN_MICRO)); +/* This has enough space for JK_TIME_MAX_FMT_SIZE chars plus the longest + * sub second replacement we might do in the format string. + */ + fmt = (char *)malloc(JK_TIME_MAX_SIZE); if (fmt) { - strncpy(log_fmt_safe, jk_log_fmt, JK_TIME_MAX_SIZE); +/* Ignore all chars in format string after position JK_TIME_MAX_FMT_SIZE. + * This is simply for truncating the jk_log_fmt input param without + * destroying the original. + */ + strncpy(log_fmt_safe, jk_log_fmt, JK_TIME_MAX_FMT_SIZE); + log_fmt_safe[JK_TIME_MAX_FMT_SIZE-1] = '\0'; if ((s = strstr(log_fmt_safe, JK_TIME_CONV_MILLI))) { +/* We will replace the first occurence of JK_TIME_CONV_MILLI by JK_TIME_PATTERN_MILLI. */ size_t offset = s - log_fmt_safe; size_t len = strlen(JK_TIME_PATTERN_MILLI); l->log_fmt_type = JK_TIME_SUBSEC_MILLI; l->log_fmt_offset = offset; +/* fmt has enough space for the truncated original format string plus + * replacement of JK_TIME_CONV_MILLI by JK_TIME_PATTERN_MILLI. */ strncpy(fmt, log_fmt_safe, offset); strncpy(fmt + offset, JK_TIME_PATTERN_MILLI, len); strncpy(fmt + offset + len, s + strlen(JK_TIME_CONV_MILLI), JK_TIME_MAX_SIZE - offset - len); +/* Now we put a stop mark into fmt to make it's length at most JK_TIME_MAX_SIZE-1 + * plus terminating '\0'. This should not be necessary, because we already terminated + * log_fmt_safe, but it makes the code more robust. + */ fmt[JK_TIME_MAX_SIZE-1] = '\0'; l->log_fmt_subsec = fmt; l->log_fmt_size = strlen(fmt); } else if ((s = strstr(log_fmt_safe, JK_TIME_CONV_MICRO))) { +/* We will replace the first occurence of JK_TIME_CONV_MICRO by JK_TIME_PATTERN_MICRO. */ size_t offset = s - log_fmt_safe; size_t len = strlen(JK_TIME_PATTERN_MICRO); l->log_fmt_type = JK_TIME_SUBSEC_MICRO; l->log_fmt_offset = offset; +/* fmt has enough space for the truncated original format string plus + * replacement of JK_TIME_CONV_MICRO by JK_TIME_PATTERN_MICRO. */ strncpy(fmt, log_fmt_safe, offset); strncpy(fmt + offset, JK_TIME_PATTERN_MICRO, len); strncpy(fmt + offset + len, s + strlen(JK_TIME_CONV_MICRO), JK_TIME_MAX_SIZE - offset - len); +/* Now we put a stop mark into fmt to make it's length at most JK_TIME_MAX_SIZE-1 + * plus terminating '\0'. This should not be necessary, because we already terminated + * log_fmt_safe, but it makes the code more robust. + */ fmt[JK_TIME_MAX_SIZE-1] = '\0'; l->log_fmt_subsec = fmt; l->log_fmt_size = strlen(fmt); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]