diff options
-rw-r--r-- | src/helper/command.c | 5 | ||||
-rw-r--r-- | src/helper/startup.tcl | 24 |
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} { |