[rt-commit] r200 - in /redwax-tool/trunk: ChangeLog redwax-tool.c redwax_openssl.c

rt-commit at redwax.eu rt-commit at redwax.eu
Tue Feb 18 11:26:11 CET 2025


Author: minfrin at redwax.eu
Date: Tue Feb 18 11:26:01 2025
New Revision: 200

Log:
Add a dedicated exit code for options that are not
implemented on a specific platform.

Modified:
    redwax-tool/trunk/ChangeLog
    redwax-tool/trunk/redwax-tool.c
    redwax-tool/trunk/redwax_openssl.c

Modified: redwax-tool/trunk/ChangeLog
==============================================================================
--- redwax-tool/trunk/ChangeLog	(original)
+++ redwax-tool/trunk/ChangeLog	Tue Feb 18 11:26:01 2025
@@ -1,5 +1,9 @@
 
 Changes with v0.9.8
+
+ *) Add a dedicated exit code for options that are not
+    implemented on a specific platform.
+    [Graham Leggett]
 
  *) \e is a GCC extension, use \033 instead.
     [Graham Leggett]

Modified: redwax-tool/trunk/redwax-tool.c
==============================================================================
--- redwax-tool/trunk/redwax-tool.c	(original)
+++ redwax-tool/trunk/redwax-tool.c	Tue Feb 18 11:26:01 2025
@@ -135,34 +135,34 @@
 
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, initialise,
         (redwax_tool_t * r), (r), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_dns_server,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_dns_trust_anchor,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_verify_param,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_dns_server,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_dns_trust_anchor,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_verify_param,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, complete_verify_param,
         (redwax_tool_t * r, apr_hash_t *params), (r, params), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_verify_date,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_verify_expiry,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_verify_date,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_verify_expiry,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, complete_verify_expiry,
         (redwax_tool_t * r, apr_hash_t *params), (r, params), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_verify_dane,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_verify_dane,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, complete_verify_dane,
         (redwax_tool_t * r, apr_hash_t *params), (r, params), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_purpose,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_purpose,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, complete_purpose,
         (redwax_tool_t * r, apr_hash_t *purposes), (r, purposes), OK, DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_tlsa,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_tlsa,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, process_tlsa,
         (redwax_tool_t * r, redwax_dns_t *dns), (r, dns), DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(rt, REDWAX, int, set_smimea,
-        (redwax_tool_t * r, const char *arg), (r, arg), OK, DECLINED)
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_smimea,
+        (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, process_smimea,
         (redwax_tool_t * r, redwax_dns_t *dns), (r, dns), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, process_pem_in,
@@ -214,15 +214,15 @@
         (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, process_ssh_public_out,
         (redwax_tool_t * r, const char *arg, const char *secret), (r, arg, secret), DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, set_format_out,
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_format_out,
         (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, complete_format_out,
         (redwax_tool_t * r, apr_hash_t *formats), (r, formats), DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, set_order_out,
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_order_out,
         (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, complete_order_out,
         (redwax_tool_t * r, apr_hash_t *orders), (r, orders), DECLINED)
-APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, set_calendar_alarm,
+APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, apr_status_t, set_calendar_alarm,
         (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(rt, REDWAX, int, process_jwks_out,
         (redwax_tool_t * r, const char *arg), (r, arg), DECLINED)
@@ -326,6 +326,7 @@
 #define REDWAX_EXIT_OPTIONS 2
 #define REDWAX_EXIT_FILTER 3
 #define REDWAX_EXIT_AUTH 4
+#define REDWAX_EXIT_NOTIMPL 5
 
 #define REDWAX_PASSTHROUGH "passthrough"
 
@@ -1222,22 +1223,19 @@
     return APR_SUCCESS;
 }
 
-static apr_status_t redwax_set_dns_server(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_dns_server(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_FILTER;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_dns_trust_anchor(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_dns_trust_anchor(r, arg);
-
-    if (status) {
+static apr_status_t redwax_set_option(redwax_tool_t *r, const char *arg,
+        apr_status_t (fn)(redwax_tool_t *r, const char *arg),
+        const char *name)
+{
+    apr_status_t status = fn(r, arg);
+
+    if (DECLINED == status) {
+        redwax_print_error(r,
+                           "Error: --%s not supported on this platform.\n", name);
+        r->rc = REDWAX_EXIT_NOTIMPL;
+    }
+
+    else if (status) {
         r->rc = REDWAX_EXIT_FILTER;
     }
 
@@ -1468,6 +1466,32 @@
     return NULL;
 }
 
+apr_status_t redwax_complete_hash(redwax_tool_t *r, const char *arg,
+        apr_status_t (fn)(redwax_tool_t *r, apr_hash_t *options),
+                redwax_token_quoted_e quoted)
+{
+    apr_hash_t *options = apr_hash_make(r->pool);
+
+    apr_hash_index_t *hi;
+    void *val;
+    int arglen =  strlen(arg);
+
+    fn(r, options);
+
+    for (hi = apr_hash_first(r->pool, options); hi; hi = apr_hash_next(hi)) {
+        apr_hash_this(hi, NULL, NULL, &val);
+
+        if (!strncmp(arg, (const char *)val, arglen)) {
+
+            apr_file_printf(r->out, "%s \n",
+                    redwax_pescape_echo_quoted(r->pool,
+                            (const char *)val, quoted, 1));
+        }
+    }
+
+    return APR_SUCCESS;
+}
+
 apr_status_t redwax_complete_user(redwax_tool_t *r, const char *arg,
         redwax_token_quoted_e quoted)
 {
@@ -2432,85 +2456,6 @@
     return APR_SUCCESS;
 }
 
-static apr_status_t redwax_set_verify_param(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_verify_param(r, arg);
-
-    /* FIXME: detect DECLINED and exit with REDWAX_EXIT_NOTIMPL */
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_verify_date(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_verify_date(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_verify_expiry(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_verify_expiry(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_verify_dane(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_verify_dane(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_tlsa(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_tlsa(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_smimea(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_smimea(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
-static apr_status_t redwax_set_purpose(redwax_tool_t *r, const char *arg)
-{
-    apr_status_t status = rt_run_set_purpose(r, arg);
-
-    if (status) {
-        r->rc = REDWAX_EXIT_OPTIONS;
-    }
-
-    return status;
-}
-
 static apr_status_t redwax_set_threshold(redwax_tool_t *r, const char *arg)
 {
     r->threshold = atoi(arg) * 86400;
@@ -2658,35 +2603,11 @@
     return status;
 }
 
-static apr_status_t redwax_format_out(redwax_tool_t *r, const char *arg)
-{
-
-    apr_status_t status = rt_run_set_format_out(r, arg);
-
-    return status;
-}
-
-static apr_status_t redwax_order_out(redwax_tool_t *r, const char *arg)
-{
-
-    apr_status_t status = rt_run_set_order_out(r, arg);
-
-    return status;
-}
-
 static apr_status_t redwax_calendar_out(redwax_tool_t *r, const char *arg)
 {
     arg = redwax_home(r, arg);
 
     apr_status_t status = rt_run_process_calendar_out(r, arg);
-
-    return status;
-}
-
-static apr_status_t redwax_calendar_alarm(redwax_tool_t *r, const char *arg)
-{
-
-    apr_status_t status = rt_run_set_calendar_alarm(r, arg);
 
     return status;
 }
@@ -2758,14 +2679,16 @@
             break;
         }
         case REDWAX_TOOL_DNS_SERVER: {
-            if (redwax_set_dns_server(r, optarg)) {
-                return REDWAX_EXIT_AUTH;
+            if (redwax_set_option(r, optarg, &rt_run_set_dns_server,
+                    "dns-server")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_DNS_TRUST_ANCHOR: {
-            if (redwax_set_dns_trust_anchor(r, optarg)) {
-                return REDWAX_EXIT_AUTH;
+            if (redwax_set_option(r, optarg, &rt_run_set_dns_trust_anchor,
+                    "dns-trust-anchor")) {
+                return r->rc;
             }
             break;
         }
@@ -2871,44 +2794,51 @@
             break;
         }
         case REDWAX_TOOL_FILTER_VERIFY_PARAM: {
-            if (redwax_set_verify_param(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_verify_param,
+                    "filter-verify-params")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_FILTER_DATE: {
-            if (redwax_set_verify_date(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_verify_date,
+                    "filter-date")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_FILTER_EXPIRY: {
-            if (redwax_set_verify_expiry(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_verify_expiry,
+                    "filter-exiry")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_FILTER_DANE: {
-            if (redwax_set_verify_dane(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_verify_dane,
+                    "filter-dane")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_FILTER_PURPOSE: {
-            if (redwax_set_purpose(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_purpose,
+                    "filter-purpose")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_FILTER_VERIFY_TLSA: {
-            if (redwax_set_tlsa(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_tlsa,
+                    "filter-verify-tlsa")) {
+                return r->rc;
             }
             break;
         }
         case REDWAX_TOOL_FILTER_VERIFY_SMIMEA: {
-            if (redwax_set_smimea(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_smimea,
+                    "filter-verify-smimea")) {
+                return r->rc;
             }
             break;
         }
@@ -3092,7 +3022,10 @@
             break;
         }
         case REDWAX_TOOL_CALENDAR_ALARM: {
-            redwax_calendar_alarm(r, optarg);
+            if (redwax_set_option(r, optarg, &rt_run_set_calendar_alarm,
+                    "calendar-alarm")) {
+                return r->rc;
+            }
             break;
         }
         case REDWAX_TOOL_REMINDER_OUT: {
@@ -3104,12 +3037,16 @@
             break;
         }
         case REDWAX_TOOL_FORMAT_OUT: {
-            redwax_format_out(r, optarg);
+            if (redwax_set_option(r, optarg, &rt_run_set_format_out,
+                    "format-out")) {
+                return r->rc;
+            }
             break;
         }
         case REDWAX_TOOL_ORDER_OUT: {
-            if (redwax_order_out(r, optarg)) {
-                return REDWAX_EXIT_OPTIONS;
+            if (redwax_set_option(r, optarg, &rt_run_set_order_out,
+                    "order-out")) {
+                return r->rc;
             }
             break;
         }
@@ -3257,7 +3194,7 @@
                 break;
             }
             case REDWAX_TOOL_FILTER: {
-                redwax_complete_filter(r, optarg, state.isquoted);
+                redwax_complete_hash(r, optarg, &rt_run_complete_filter, state.isquoted);
                 break;
             }
             case REDWAX_TOOL_FILTER_HOSTNAME: {
@@ -3481,7 +3418,7 @@
             break;
         }
         case REDWAX_TOOL_FILTER: {
-            redwax_complete_filter(r, "", state.isquoted);
+            redwax_complete_hash(r, "", &rt_run_complete_filter, state.isquoted);
             break;
         }
         case REDWAX_TOOL_FILTER_EMAIL: {

Modified: redwax-tool/trunk/redwax_openssl.c
==============================================================================
--- redwax-tool/trunk/redwax_openssl.c	(original)
+++ redwax-tool/trunk/redwax_openssl.c	Tue Feb 18 11:26:01 2025
@@ -2242,9 +2242,9 @@
 
         redwax_print_error(r,
                 "verify-filter: DANE TLSA record not found "
-        		"(%d bogus, %d insecure, %d nxdomain, %d malformed): %s\n",
-				r->dane_bogus, r->dane_insecure, r->dane_nxdomain,
-				r->dane_malformed, r->dane_basename);
+                "(%d bogus, %d insecure, %d nxdomain, %d malformed): %s\n",
+                r->dane_bogus, r->dane_insecure, r->dane_nxdomain,
+                r->dane_malformed, r->dane_basename);
 
         return APR_ENOENT;
 
@@ -5447,7 +5447,10 @@
         return APR_SUCCESS;
     }
 
-    return DECLINED;
+    redwax_print_error(r, "format-out: '%s' must be one of xml, json, yaml\n",
+            arg);
+
+    return APR_EINVAL;
 }
 
 apr_status_t redwax_openssl_complete_order_out(redwax_tool_t *r,
@@ -5480,7 +5483,12 @@
         return APR_SUCCESS;
     }
 
-    return DECLINED;
+    redwax_print_error(r,
+                       "order-out: '%s' must be one of " REDWAX_ORDER_ALL_TEXT ", "
+                       REDWAX_ORDER_KEY_FIRST_TEXT ", " REDWAX_ORDER_KEY_LAST_TEXT "\n",
+                       arg);
+
+    return APR_EINVAL;
 }
 
 static apr_status_t redwax_openssl_process_jwks_out(redwax_tool_t *r,



More information about the rt-commit mailing list