summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/helper/command.c5
-rw-r--r--src/helper/startup.tcl24
2 files changed, 26 insertions, 3 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index 23175baf..ba041571 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -314,9 +314,8 @@ static int register_command_handler(struct command *c)
}
/* we now need to add an overrideable proc */
- const char *override_name = alloc_printf("proc %s {args} {"
- "if {[catch {eval ocd_%s $args}] == 0} "
- "{return \"\"} else {return -code error}}",
+ const char *override_name = alloc_printf(
+ "proc %s {args} {eval ocd_bouncer %s $args}",
full_name, full_name);
if (NULL == override_name)
goto free_full_name;
diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl
index f11d5b68..cb5fb026 100644
--- a/src/helper/startup.tcl
+++ b/src/helper/startup.tcl
@@ -10,6 +10,30 @@ proc exit {} {
ocd_throw exit
}
+# All commands are registered with an 'ocd_' prefix, while the "real"
+# command is a wrapper that calls this function. Its primary purpose is
+# to discard 'handler' command output,
+proc ocd_bouncer {name args} {
+ set cmd [format "ocd_%s" $name]
+ set type [eval command type $cmd $args]
+ if {$type == "native"} {
+ return [eval $cmd $args]
+ } else {if {$type == "simple"} {
+ if {[catch {eval $cmd $args}] == 0} {
+ return ""
+ } else {
+ set errmsg "Command handler execution failed"
+ }
+ } else {if {$type == "group"} {
+ catch {eval help $name $args}
+ set errmsg [format "%s: command requires more arguments" \
+ [concat $name " " $args]]
+ } else {
+ set errmsg [format "Unknown command type: %s" $type]
+ }}}
+ return -code error $errmsg
+}
+
# Try flipping / and \ to find file if the filename does not
# match the precise spelling
proc find {filename} {