diff options
author | Andrew J. Schorr <ajschorr@alumni.princeton.edu> | 2007-03-20 20:48:27 +0000 |
---|---|---|
committer | Andrew J. Schorr <ajschorr@alumni.princeton.edu> | 2007-03-20 20:48:27 +0000 |
commit | afb88a669167358ea2be64aa0d10c8c42fa7509c (patch) | |
tree | 2439441fa56db6ecbae310473af7f1e1808916f2 /lib/log.c | |
parent | ad81f8cc2e77275cdeef1267d1ff4173eb89e093 (diff) |
[lib] Make message lookup function more robust.
2007-03-20 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* log.c: (mes_lookup) Make the function more robust: check for
cases where the index does not match the key value at that position.
If so, give a warning and fall back to a linear search.
And improve the error message in cases where even that fails.
Diffstat (limited to 'lib/log.c')
-rw-r--r-- | lib/log.c | 31 |
1 files changed, 23 insertions, 8 deletions
@@ -693,17 +693,32 @@ lookup (struct message *mes, int key) return ""; } -/* Very old hacky version of message lookup function. Still partly - used in bgpd and ospfd. FIXME Seems that it's not used any more. */ +/* Older/faster version of message lookup function, but requires caller to pass + in the array size (instead of relying on a 0 key to terminate the search). */ const char * mes_lookup (struct message *meslist, int max, int index) { - if (index < 0 || index >= max) - { - zlog_err ("message index out of bound: %d", max); - return NULL; - } - return meslist[index].str; + /* first check for best case: index is in range and matches the key + value in that slot */ + if ((index >= 0) && (index < max) && (meslist[index].key == index)) + return meslist[index].str; + + /* fall back to linear search */ + { + int i; + + for (i = 0; i < max; i++, meslist++) + { + if (meslist->key == index) + { + zlog_warn("message index %d [%s] found in position %d (max is %d)", + index, meslist->str, i, max); + return meslist->str; + } + } + } + zlog_err("message index %d not found (max is %d)", index, max); + return NULL; } /* Wrapper around strerror to handle case where it returns NULL. */ |