]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
core: Add formats %{z} and %{strftime-format} to ErrorLogFormat. PR 62161.
authorYann Ylavic <ylavic@apache.org>
Tue, 14 Mar 2023 11:11:24 +0000 (11:11 +0000)
committerYann Ylavic <ylavic@apache.org>
Tue, 14 Mar 2023 11:11:24 +0000 (11:11 +0000)
%{z} prints the timezone offset (i.e. "[+-]nnnn") and %{strftime-format} allows
any %-format handled by [apr_]strftime().

* include/util_time.h():
  Define new AP_CTIME_OPTION_GMTOFF option for ap_recent_ctime_ex().

* server/util_time.c(ap_recent_ctime_ex):
  Handle AP_CTIME_OPTION_GMTOFF to print "[+-]nnnn" timezone.

* server/log.c(log_ctime):
  If the format contains a '%' it's for strftime(), otherwise it's builtin
  with new 'z' as AP_CTIME_OPTION_GMTOFF.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1908380 13f79535-47bb-0310-9956-ffa450edef68

changes-entries/errorlogformat.txt [new file with mode: 0644]
include/util_time.h
server/log.c
server/util_time.c

diff --git a/changes-entries/errorlogformat.txt b/changes-entries/errorlogformat.txt
new file mode 100644 (file)
index 0000000..4906ae5
--- /dev/null
@@ -0,0 +1,3 @@
+  *) core: Add formats %{z} and %{strftime-format} to ErrorLogFormat.
+     PR 62161.  [Yann Ylavic]
+
index 9f54c912a3f9075f2e29c4806950acde7e23ba82..6ba24a2e0566da571b9c95839fe92a97172fa8df 100644 (file)
@@ -47,6 +47,8 @@ extern "C" {
 #define AP_CTIME_OPTION_USEC    0x1
 /* Use more compact ISO 8601 format */
 #define AP_CTIME_OPTION_COMPACT 0x2
+/* Add timezone offset from GMT ([+-]hhmm) */
+#define AP_CTIME_OPTION_GMTOFF  0x4
 
 
 /**
index 6295f1a89c458b07dbe6046468ac3682e558b728..f3347d98346e591d4d4589e67aba2bf11867b951 100644 (file)
@@ -573,14 +573,32 @@ static int log_ctime(const ap_errorlog_info *info, const char *arg,
     int time_len = buflen;
     int option = AP_CTIME_OPTION_NONE;
 
-    while (arg && *arg) {
-        switch (*arg) {
-            case 'u':   option |= AP_CTIME_OPTION_USEC;
-                        break;
-            case 'c':   option |= AP_CTIME_OPTION_COMPACT;
-                        break;
+    if (arg) {
+        if (arg[0] == 'u' && !arg[1]) { /* no ErrorLogFormat (fast path) */
+            option |= AP_CTIME_OPTION_USEC;
+        }
+        else if (!ap_strchr_c(arg, '%')) { /* special "%{cuz}t" formats */
+            while (*arg) {
+                switch (*arg++) {
+                case 'u':
+                    option |= AP_CTIME_OPTION_USEC;
+                    break;
+                case 'c':
+                    option |= AP_CTIME_OPTION_COMPACT;
+                    break;
+                case 'z':
+                    option |= AP_CTIME_OPTION_GMTOFF;
+                    break;
+                }
+            }
+        }
+        else { /* "%{strftime %-format}t" */
+            apr_size_t len = 0;
+            apr_time_exp_t expt;
+            ap_explode_recent_localtime(&expt, apr_time_now());
+            apr_strftime(buf, &len, buflen, arg, &expt);
+            return (int)len;
         }
-        arg++;
     }
 
     ap_recent_ctime_ex(buf, apr_time_now(), option, &time_len);
index 995716b318f55bcdf828fa7d7f852097d5ab85b1..95df38d8b9f1432cdc4bde313da925100cde0ca6 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "util_time.h"
 #include "apr_env.h"
+#include "apr_strings.h"
 
 
 
@@ -27,6 +28,8 @@
 /* Length of ISO 8601 date/time */
 #define AP_CTIME_COMPACT_LEN      20
 
+/* Length of timezone offset from GMT ([+-]hhmm) plus leading space */
+#define AP_CTIME_GMTOFF_LEN       6
 
 /* Cache for exploded values of recent timestamps
  */
@@ -183,6 +186,10 @@ AP_DECLARE(apr_status_t) ap_recent_ctime_ex(char *date_str, apr_time_t t,
         needed += AP_CTIME_USEC_LENGTH;
     }
 
+    if (option & AP_CTIME_OPTION_GMTOFF) {
+        needed += AP_CTIME_GMTOFF_LEN;
+    }
+
     /* Check the provided buffer length */
     if (len && *len >= needed) {
         *len = needed;
@@ -195,9 +202,10 @@ AP_DECLARE(apr_status_t) ap_recent_ctime_ex(char *date_str, apr_time_t t,
     }
 
     /* example without options: "Wed Jun 30 21:49:08 1993" */
-    /*                           123456789012345678901234  */
     /* example for compact format: "1993-06-30 21:49:08" */
-    /*                              1234567890123456789  */
+    /* example for compact+usec+gmtoff format:
+     *     "1993-06-30 22:49:08.123456 +0100"
+     */
 
     ap_explode_recent_localtime(&xt, t);
     real_year = 1900 + xt.tm_year;
@@ -251,7 +259,19 @@ AP_DECLARE(apr_status_t) ap_recent_ctime_ex(char *date_str, apr_time_t t,
         *date_str++ = real_year % 100 / 10 + '0';
         *date_str++ = real_year % 10 + '0';
     }
-    *date_str++ = 0;
+    if (option & AP_CTIME_OPTION_GMTOFF) {
+        int off = xt.tm_gmtoff;
+        char sign = '+';
+        if (off < 0) {
+            off = -off;
+            sign = '-';
+        }
+        apr_snprintf(date_str, AP_CTIME_GMTOFF_LEN + 1, " %c%.2d%.2d",
+                     sign, off / 3600, (off % 3600) / 60);
+    }
+    else {
+        *date_str = 0;
+    }
 
     return APR_SUCCESS;
 }