Currently extract.pl.in is used to build the vtysh cli.  When two
different cli's collide with the same command name, the original
cli is never called, because it is dropped.  This code notes the
silent drop and tracks the number of drops.  If they change then
the code will fail the build.

If you have added to the problem, the solution is to fix your cli
command to not stomp on someone else's command.  If you have removed
a stomp, safely modify extract.pl.in as part of your commit.

Signed-off-by: Donald Sharp <[email protected]>
---
 vtysh/extract.pl.in |   25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/vtysh/extract.pl.in b/vtysh/extract.pl.in
index 99d80ed..8385eb5 100755
--- a/vtysh/extract.pl.in
+++ b/vtysh/extract.pl.in
@@ -59,6 +59,8 @@ $ignore{'"terminal monitor"'} = "ignore";
 $ignore{'"terminal no monitor"'} = "ignore";
 $ignore{'"show history"'} = "ignore";
 
+my $cli_stomp = 0;
+
 foreach (@ARGV) {
     $file = $_;
 
@@ -132,6 +134,12 @@ foreach (@ARGV) {
        $defun_body = join (", ", @defun_array);
 
        # $cmd -> $str hash for lookup
+       if (exists($cmd2str{$cmd})) {
+           warn "Duplicate CLI Function: $cmd\n";
+           warn "\tFrom cli: $cmd2str{$cmd} to New cli: $str\n";
+           warn "\tOriginal Protocol: $cmd2proto{$cmd} to New Protocol: 
$protocol\n";
+          $cli_stomp++;
+       }
        $cmd2str{$cmd} = $str;
        $cmd2defun{$cmd} = $defun_body;
        $cmd2proto{$cmd} = $protocol;
@@ -165,6 +173,23 @@ foreach (@ARGV) {
     }
 }
 
+my $bad_cli_stomps = 78;
+# Currently we have $bad_cli_stomps.  When we have cli commands
+# that map to the same function name, we can introduce subtle
+# bugs due to code not being called when we think it is.
+#
+# If extract.pl fails with a error message and you've been
+# modifying the cli, then go back and fix your code to
+# not have cli command function collisions.
+#
+# If you've removed a cli overwrite, you can safely subtract
+# one from $bad_cli_stomps.  If you've added to the problem
+# please fix your code before submittal
+if ($cli_stomp != $bad_cli_stomps) {
+    warn "Expected $bad_cli_stomps command line stomps, but got $cli_stomp 
instead\n";
+    exit $cli_stomp;
+}
+
 # Check finaly alive $cmd;
 foreach (keys %odefun) {
     my ($node, $str) = (split (/,/));
-- 
1.7.10.4


_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to