)]}'
{
  "log": [
    {
      "commit": "f8a246d6df0556fb897e1785d1c2ea81caf8956d",
      "tree": "e78438d35439685d7427dd5bfbc404f5c32f4b5c",
      "parents": [
        "87c271c69330cfcea7955503eba3ed15a15cb634"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Jan 11 18:18:56 2012 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 25 17:06:52 2012 +0100"
      },
      "message": "lib: update proto_redistnum() for Babel\n"
    },
    {
      "commit": "5734509c0545ebd95a5b8e3f22a911c1a39ffa1b",
      "tree": "2f35ad50d793080db1f858c2de2228cfd2946dfd",
      "parents": [
        "fe67e668881b8b8d71b1570575c913cd287fafcf"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Dec 25 17:52:09 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 25 17:06:51 2012 +0100"
      },
      "message": "babeld: Initial import, for Babel routing protocol.\n\n* Initial import of the Babel routing protocol, ported to Quagga.\n* LICENCE: Update the original LICENCE file to include all known potentially\n  applicable copyright claims.  Ask that any future contributors to babeld/\n  grant MIT/X11 licence to their work.\n* *.{c,h}: Add GPL headers, in according with the SFLC guidance on\n  dealing with potentially mixed GPL/other licensed work, at:\n\n  https://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html\n"
    },
    {
      "commit": "4c78376f96cd2ca56f1c6476b76fd659654431f5",
      "tree": "1019b6adbea4ef0305c9574a9588e20345539028",
      "parents": [
        "e854095932260b3e6187902aa9a7baa0e96b9428"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Jan 21 22:50:19 2012 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Feb 21 21:34:21 2012 +0400"
      },
      "message": "lib: fix logging of ZEBRA_HELLO message\n"
    },
    {
      "commit": "e0ca5fde7be5b5ce90dae78c2477e8245aecb8e9",
      "tree": "0e0b32ddbed4a84a3b2de9dd7217165cb81f52fa",
      "parents": [
        "ebf08631cad8a420fc6bfb7c45af5496dc11023e"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Wed Sep 16 01:52:42 2009 +0200"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 19:13:17 2011 +0400"
      },
      "message": "lib: put route_types.txt to real use\n\nthis replaces most occurences of routing protocol lists by preprocessor\ndefines from route_types.h. the latter is autogenerated from\nroute_types.txt by a perl script (previously awk). adding a routing\nprotocol now is mostly a matter of changing route_types.txt and log.c.\n\nConflicts:\n\n\tlib/route_types.awk\n"
    },
    {
      "commit": "51abba509a0997f05427a8acbe74dd07d8d6026e",
      "tree": "c9f19fc4eaf2aa01d96bde18b9ec09f1b92724e4",
      "parents": [
        "eda3529e9cf163ccbcf47c889b16fd707d2aed76"
      ],
      "author": {
        "name": "Dmitrij Tejblum",
        "email": "tejblum@yandex-team.ru",
        "time": "Wed Sep 21 17:41:41 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:45:53 2011 +0400"
      },
      "message": "lib: provide more information in case of failed LOOKUP.\n\n* log.[ch]\n  * mes_lookup: add a parameter with the name of the message list, print\n    the name in case of failure.\n  * LOOKUP macro: pass the name of the message list.\n"
    },
    {
      "commit": "b82cdeb18f8e68feb797f0b4780ded672635b545",
      "tree": "474532dc205c0b648c5690dc5c2efba6aa8f12ef",
      "parents": [
        "6159928d28285938356a3d48d2477fbdb7890e61"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Aug 01 16:52:03 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:34:26 2011 +0400"
      },
      "message": "delete CVS keywords\n"
    },
    {
      "commit": "7e69d993673597334b1e1b3d1072a4c064f293d5",
      "tree": "cf0362e38edca6f487aa638cc67c3c994a4cfcf1",
      "parents": [
        "4bd045d5dd28653af899c01d6f0c413d74677114"
      ],
      "author": {
        "name": "Tom Goff",
        "email": "thomas.goff@boeing.com",
        "time": "Wed Nov 10 13:01:17 2010 -0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:30:54 2011 +0000"
      },
      "message": "lib: zlog should clean up its memory\n\n* log.c: (closezlog) Also free the dynamically allocated filename when\n    a log is closed.\n"
    },
    {
      "commit": "228da42898c4f7bd72d9c1ee4135108e8d40d860",
      "tree": "a780ed018bfeb97c174958f188c770c74a48bad9",
      "parents": [
        "54a15182e05ca757db3bb90a4135e9f8fd3c84f2"
      ],
      "author": {
        "name": "Chris Caputo",
        "email": "ccaputo@alt.net",
        "time": "Sat Jul 18 05:44:03 2009 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jul 19 18:28:08 2009 +0100"
      },
      "message": "[bgpd] Stability fixes including bugs 397, 492\n\nI\u0027ve spent the last several weeks working on stability fixes to bgpd.\nThese patches fix all of the numerous crashes, assertion failures, memory\nleaks and memory stomping I could find.  Valgrind was used extensively.\n\nAdded new function bgp_exit() to help catch problems.  If \"debug bgp\" is\nconfigured and bgpd exits with status of 0, statistics on remaining\nlib/memory.c allocations are printed to stderr.  It is my hope that other\ndevelopers will use this to stay on top of memory issues.\n\nExample questionable exit:\n\n  bgpd: memstats: Current memory utilization in module LIB:\n  bgpd: memstats:  Link List                     :          6\n  bgpd: memstats:  Link Node                     :          5\n  bgpd: memstats:  Hash                          :          8\n  bgpd: memstats:  Hash Bucket                   :          2\n  bgpd: memstats:  Hash Index                    :          8\n  bgpd: memstats:  Work queue                    :          3\n  bgpd: memstats:  Work queue item               :          2\n  bgpd: memstats:  Work queue name string        :          3\n  bgpd: memstats: Current memory utilization in module BGP:\n  bgpd: memstats:  BGP instance                  :          1\n  bgpd: memstats:  BGP peer                      :          1\n  bgpd: memstats:  BGP peer hostname             :          1\n  bgpd: memstats:  BGP attribute                 :          1\n  bgpd: memstats:  BGP extra attributes          :          1\n  bgpd: memstats:  BGP aspath                    :          1\n  bgpd: memstats:  BGP aspath str                :          1\n  bgpd: memstats:  BGP table                     :         24\n  bgpd: memstats:  BGP node                      :          1\n  bgpd: memstats:  BGP route                     :          1\n  bgpd: memstats:  BGP synchronise               :          8\n  bgpd: memstats:  BGP Process queue             :          1\n  bgpd: memstats:  BGP node clear queue          :          1\n  bgpd: memstats: NOTE: If configuration exists, utilization may be expected.\n\nExample clean exit:\n\n  bgpd: memstats: No remaining tracked memory utilization.\n\nThis patch fixes bug #397: \"Invalid free in bgp_announce_check()\".\n\nThis patch fixes bug #492: \"SIGBUS in bgpd/bgp_route.c:\nbgp_clear_route_node()\".\n\nMy apologies for not separating out these changes into individual patches.\nThe complexity of doing so boggled what is left of my brain.  I hope this\nis all still useful to the community.\n\nThis code has been production tested, in non-route-server-client mode, on\na linux 32-bit box and a 64-bit box.\n\nRelease/reset functions, used by bgp_exit(), added to:\n\n  bgpd/bgp_attr.c,h\n  bgpd/bgp_community.c,h\n  bgpd/bgp_dump.c,h\n  bgpd/bgp_ecommunity.c,h\n  bgpd/bgp_filter.c,h\n  bgpd/bgp_nexthop.c,h\n  bgpd/bgp_route.c,h\n  lib/routemap.c,h\n\nFile by file analysis:\n\n* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.\n\n* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().\n\n* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from\n  bgp_exit().\n\n* bgpd/bgp_filter.c: Fix aslist-\u003ename use without allocation check, and\n  also fix memory leak.\n\n* bgpd/bgp_main.c: Created bgp_exit() exit routine.  This function frees\n  allocations made as part of bgpd initialization and, to some extent,\n  configuration.  If \"debug bgp\" is configured, memory stats are printed\n  as described above.\n\n* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for\n  ibuf/obuf, so bgp_scan_init() shouldn\u0027t do it too.  Also, made it so\n  zlookup is global so bgp_exit() can use it.\n\n* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()\n  adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.\n\n* bgpd/bgp_route.h: Correct reference counter \"lock\" to be signed.\n  bgp_clear_route() now accepts a bgp_clear_route_type of either\n  BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n* bgpd/bgp_route.c:\n  - bgp_process_rsclient(): attr was being zero\u0027ed and then\n    bgp_attr_extra_free() was being called with it, even though it was\n    never filled with valid data.\n\n  - bgp_process_rsclient(): Make sure rsclient-\u003egroup is not NULL before\n    use.\n\n  - bgp_processq_del(): Add call to bgp_table_unlock().\n\n  - bgp_process(): Add call to bgp_table_lock().\n\n  - bgp_update_rsclient(): memset clearing of new_attr not needed since\n    declarationw with \"\u003d { 0 }\" does it.  memset was already commented\n    out.\n\n  - bgp_update_rsclient(): Fix screwed up misleading indentation.\n\n  - bgp_withdraw_rsclient(): Fix screwed up misleading indentation.\n\n  - bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n  - bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also\n    free struct bgp_clear_node_queue used for work item.\n\n  - bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in\n    case peer is released by peer_unlock() call.\n\n  - bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.  Use\n    struct bgp_clear_node_queue to supply data to worker.  Add call to\n    bgp_table_lock().\n\n  - bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or\n    BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n  - bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.\n\n  Bug 397 fixes:\n\n    - bgp_default_originate()\n    - bgp_announce_table()\n\n* bgpd/bgp_table.h:\n  - struct bgp_table: Added reference count.  Changed type of owner to be\n    \"struct peer *\" rather than \"void *\".\n\n  - struct bgp_node: Correct reference counter \"lock\" to be signed.\n\n* bgpd/bgp_table.c:\n  - Added bgp_table reference counting.\n\n  - bgp_table_free(): Fixed cleanup code.  Call peer_unlock() on owner if\n    set.\n\n  - bgp_unlock_node(): Added assertion.\n\n  - bgp_node_get(): Added call to bgp_lock_node() to code path that it was\n    missing from.\n\n* bgpd/bgp_vty.c:\n  - peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment\n    to owner.  Handle failure gracefully.\n\n  - peer_rsclient_unset_vty(): Add call to bgp_clear_route() with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.\n\n* bgpd/bgpd.c:\n  - peer_lock(): Allow to be called when status is \"Deleted\".\n\n  - peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to\n    bgp_clear_route() call.\n\n  - peer_delete(): Common variable listnode pn.  Fix bug in which rsclient\n    was only dealt with if not part of a peer group.  Call\n    bgp_clear_route() for rsclient, if appropriate, and do so with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n  - peer_group_get(): Use XSTRDUP() instead of strdup() for conf-\u003ehost.\n\n  - peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n  - bgp_create(): Use XSTRDUP() instead of strdup() for peer_self-\u003ehost.\n\n  - bgp_delete(): Delete peers before groups, rather than after.  And then\n    rather than deleting rsclients, verify that there are none at this\n    point.\n\n  - bgp_unlock(): Add assertion.\n\n  - bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.\n\n* lib/command.c,h: Compiler warning fixes.  Add cmd_terminate().  Fixed\n  massive leak in install_element() in which cmd_make_descvec() was being\n  called more than once for the same cmd-\u003estrvec/string/doc.\n\n* lib/log.c: Make closezlog() check fp before calling fclose().\n\n* lib/memory.c: Catch when alloc count goes negative by using signed\n  counts.  Correct #endif comment.  Add log_memstats_stderr().\n\n* lib/memory.h: Add log_memstats_stderr().\n\n* lib/thread.c: thread-\u003efuncname was being accessed in thread_call() after\n  it had been freed.  Rearranged things so that thread_call() frees\n  funcname.  Also made it so thread_master_free() cleans up cpu_record.\n\n* lib/vty.c,h: Use global command_cr.  Add vty_terminate().\n\n* lib/zclient.c,h: Re-enable zclient_free().\n"
    },
    {
      "commit": "8e4c09307d9eafbbbf7fbffb3d3483287cea169b",
      "tree": "c9b39213248d64fdaa28bc419e77ce1e3866a585",
      "parents": [
        "fc52f95373b1dc0bec5f5a474bafa362b02a63ae"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Fri May 15 09:47:34 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 18 20:18:29 2009 +0100"
      },
      "message": "[cleanup] Allow message tables to be constant\n\nAvoid bugs, and improve cache locality by allowing message lists\nto be read/only.\n"
    },
    {
      "commit": "94fc1dd41cd0267acb9c67dd3dcf1e64ef8713af",
      "tree": "95ade8cc41fe0d758b22d01d50b02b7b88499f38",
      "parents": [
        "e5862a2df2b5f65b0c050987c5f145836e0b75b3"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Mon Mar 09 16:09:50 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 18 20:18:27 2009 +0100"
      },
      "message": "[lib] Put symbolic backtrace on system log\n\nWhen BGP crashes, sometimes all we get to see is syslog.\n"
    },
    {
      "commit": "30a2231a4881f53deca61ef7a62b225a43dab4c5",
      "tree": "f26dff922a4f85d302fa67bbd9a120108db41c44",
      "parents": [
        "f5612dd382d9c0f4089b08ec164c25a8082d9f89"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Aug 15 14:05:22 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:59 2008 +0100"
      },
      "message": "[warnings] Fix various SOS warnings\n\n2008-08-15 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* */*: Fix various problems flagged by Sun Studio compiler.\n\t  - \u0027\u003cqualifier\u003e \u003cstorage\u003e\u0027 obsolescent in declarations\n\t  - empty statements (\u0027;\u0027 after ALIAS definitions)\n\t  - implicit declarations (e.g printstack in lib/log.c)\n\t  - \"\\%\" in printf string instead of \"%%\"\n\t  - loops that return on the first iteration (legitimately, but\n \t    compiler can\u0027t really know), e.g. bgp_routemap.c\n \t  - internal declarations which mask prototypes.\n"
    },
    {
      "commit": "1423c809cc4ddc2e013ba6264c49a11e5719c6f2",
      "tree": "db0389e7de020bbcb9fd78d45417b0842a6adb0b",
      "parents": [
        "89d9fa301e146193093ff876f96b3612dc390bbb"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Thu Aug 14 17:59:25 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:58 2008 +0100"
      },
      "message": "[lib] mes_lookup string lookup table argument should be marked const\n\n2008-08-14 Stephen Hemminger \u003cstephen.hemminger@vyatta.com\u003e\n\n\t* lib/log.{c,h}: struct message argument should point to const\n\t* */*.c: adjust to suit,\n\nSigned-off-by: Paul Jakma \u003cpaul@quagga.net\u003e\n"
    },
    {
      "commit": "11486b5265b2e0e2cf8b140018c47bd9a35cba93",
      "tree": "ccc5dfb967b156d43cb6d8ffda1816224dcf118a",
      "parents": [
        "5f56808431778fe8878ea8ea94225cca08884b48"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Feb 28 23:26:02 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Feb 28 23:26:02 2008 +0000"
      },
      "message": "[lib] Fix the struct message LOOKUP function to be more robust\n\n2008-02-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* log.c: (mes_lookup) Sowmini Varadhan diagnosed a problem where\n\t  this function can cause a NULL dereference, on lookups for unknown\n\t  indices, or messages with NULL strings. Can occur, e.g., debug\n\t  logging code when processing received messages. Fixed to accept a\n\t  pointer to a default string to be used if there is no match.\n\t* log.h: LOOKUP adjusted to match\n"
    },
    {
      "commit": "6d58272b4cf96f0daa846210dd2104877900f921",
      "tree": "a97f2c9c797bd96b298aa64f03ed69115d63e78b",
      "parents": [
        "dfdb8f18c008e7ad306588c86b12fbef337427ca"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Aug 06 15:21:45 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Aug 06 15:21:45 2007 +0000"
      },
      "message": "[bgpd] cleanup, compact and consolidate capability parsing code\n\n2007-07-26 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) Clean up and compact capability parsing slightly.\n\t  Consolidate validation of length and logging of generic TLV, and\n\t  memcpy of capability data, thus removing such from cap specifc\n\t  code (not always present or correct).\n\t* bgp_open.h: Add structures for the generic capability TLV header\n\t  and for the data formats of the various specific capabilities we\n\t  support.  Hence remove the badly named, or else misdefined, struct\n\t  capability.\n\t* bgp_open.c: (bgp_capability_vty_out) Use struct capability_mp_data.\n\t  Do the length checks *before* memcpy()\u0027ing based on that length\n\t  (stored capability - should have been validated anyway on input,\n\t  but..).\n\t  (bgp_afi_safi_valid_indices) new function to validate (afi,safi)\n\t  which is about to be used as index into arrays, consolidates\n\t  several instances of same, at least one of which appeared to be\n\t  incomplete..\n\t  (bgp_capability_mp) Much condensed.\n\t  (bgp_capability_orf_entry) New, process one ORF entry\n\t  (bgp_capability_orf) Condensed. Fixed to process all ORF entries.\n\t  (bgp_capability_restart) Condensed, and fixed to use a\n\t  cap-specific type, rather than abusing capability_mp.\n\t  (struct message capcode_str) added to aid generic logging.\n\t  (size_t cap_minsizes[]) added to aid generic validation of\n\t  capability length field.\n\t  (bgp_capability_parse) Generic logging and validation of TLV\n\t  consolidated here. Code compacted as much as possible.\n\t* bgp_packet.c: (bgp_open_receive) Capability parsers now use\n\t  streams, so no more need here to manually fudge the input stream\n\t  getp.\n\t  (bgp_capability_msg_parse) use struct capability_mp_data. Validate\n\t  lengths /before/ memcpy. Use bgp_afi_safi_valid_indices.\n\t  (bgp_capability_receive) Exported for use by test harness.\n\t* bgp_vty.c: (bgp_show_summary) fix conversion warning\n\t  (bgp_show_peer) ditto\n\t* bgp_debug.h: Fix storage \u0027extern\u0027 after type \u0027const\u0027.\n        * lib/log.c: (mes_lookup) warning about code not being in\n          same-number array slot should be debug, not warning. E.g. BGP\n          has several discontigious number spaces, allocating from\n          different parts of a space is not uncommon (e.g. IANA\n          assigned versus vendor-assigned code points in some number\n          space).\n"
    },
    {
      "commit": "7514fb7739f74311830e9ddd1381d0d228224f61",
      "tree": "4d4b9a4fdfcea4cb6fa496085327f1aae9a9a380",
      "parents": [
        "5fa05099567bbe42aae87a9bef8fd630b3666a4d"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed May 02 16:05:35 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed May 02 16:05:35 2007 +0000"
      },
      "message": "[zebra] Routemap support on received routes, with \u0027set src\u0027 command (linux)\n\n2007-05-01 David L Stevens \u003cdlstevens@us.ibm.com\u003e\n\n\t* (general) These changes collectively add route-map and\n\t  prefix-list support to zebra and fix a bug in \"show\n\t  route-map\" (with no argument).\n\t* doc/main.texi: added route-map, prefix-list, ip protocol\n\t  and set src documentation\n\t* lib/command.h: added PROTOCOL_NODE type\n\t* lib/log.c: (proto_name2num) new function, protocol name to\n\t  number translation.\n\t* lib/routemap.c: (vty_show_route_map) fixed \"show route-map\"\n\t  without route-map name\n\t* lib/routemap.h: added RMAP_ZEBRA type\n\t* lib/zebra.h: added proto_name2num() prototype\n\t* vtysh/extract.pl.in: added VTYSH_ZEBRA flag for route-map and\n\t  plist\n\t* vtysh/Makefile.am: added zebra_routemap.c\n\t* vtysh/vtysh.h: added VTYSH_ZEBRA flag to VTYSH_RMAP\n\t* zebra/connected.c: (connected_up_ipv4) added src preference argument\n\t  to rib_add_ipv4()\n\t* zebra/kernel_socket.c: (rtm_read) ditto\n\t* zebra/main.c: added prefix list initialization\n\t* zebra/Makefile.am: added zebra_routemap.c source file\n\t* zebra/rib.h: added generic address union \"g_addr\" and use in\n\t  existing places that had an explicit union.\n\t  Added \"src\" to struct nexthop.\n\t  Added preferred src arg to nexthop_ipv4_add and rib_add_ipv4.\n\t* zebra/rt_netlink.c: (netlink_routing_table) set preferred source on\n\t  netlink messages.\n\t  (netlink_route_change) ditto\n\t  (netlink_route_multipath) ditto.\n\t* zebra/rtread_getmsg.c: (handle_route_entry) added (NULL) src to\n\t  rib_add_ipv4() call.\n\t* zebra/rtread_proc.c: (proc_route_read) ditto\n\t* zebra/zebra_rib.c: (nexthop_ipv4_add) add src argument.\n\t  (nexthop_ipv4_ifindex_add) ditto\n\t  (rib_add_ipv4) ditto\n\t  (nexthop_active_check) Add route-map processing.\n\t* zebra/zebra_routemap.c: new file for zebra route-map commands.\n\t* zebra/zebra_vty.c: (ip_protocol_cmd) Apply route-map to protocol\n\t  (vty_show_ip_route_detail) added \"src\" printing\n\t  (vty_show_ip_route) ditto\n\t  (show_ip_protocol_cmd) new command, list routemaps.\n\t  (config_write_protocol) write out routemap protocl config.\n\t  (zebra_vty_init) Install the new routemap protocol commands.\n\t* zebra/zserv.c: (zread_ipv4_add) added (NULL) src arg\n\t  (zebra_init) init zebra route-maps.\n\t* zebra/zserv.h: add zebra_route_map_init\n"
    },
    {
      "commit": "bcdda30bae1fef67d998211c54c06270ba42864c",
      "tree": "e4daad51d00adb3188154d9961f908aa7f204b90",
      "parents": [
        "d3d7e237fdc661d1d1d00a8b43657d1d719410e6"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Sun Apr 29 15:48:22 2007 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Sun Apr 29 15:48:22 2007 +0000"
      },
      "message": "[logging] Minor performance tweak\n\n2007-04-29 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (quagga_timestamp) Optimize the subsecond timestamp generation.\n"
    },
    {
      "commit": "1ed72e0b3a643fa1be6f1efa904965798a575cd1",
      "tree": "052341ede20e44b6aa23b1cd799d08f9b762c1c2",
      "parents": [
        "eda9ba743c1eb7c32b2ae9b8989d3555f1890758"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Sat Apr 28 22:14:10 2007 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Sat Apr 28 22:14:10 2007 +0000"
      },
      "message": "[logging] Add new \"log timestamp precision\" command for subsecond timestamps\n\n2007-04-28 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* command.c: (config_write_host) Save \"log timestamp precision\"\n\t  if not default value.\n\t  (show_logging) Show configured timestamp precision.\n\t  (config_log_timestamp_precision) Enable configuration of timestamp\n\t  precision.\n\t  (no_config_log_timestamp_precision) Restore default timestamp\n\t  precision.\n\t  (cmd_init) Install new timestamp precision commands.\n\t* log.h: (struct zlog) New timestamp_precision field.\n\t  (quagga_timestamp) New function to generate a timestamp with the\n\t  desired precision.\n\t  (struct timestamp_control) Declare a structure for use in avoiding\n\t  repeated duplicate calls to quagga_timestamp.\n\t* log.c: (quagga_timestamp) New function to generate a timestamp\n\t  of the desired precision.\n\t  (time_print) Call quagga_timestamp if the time hasn\u0027t already been\n\t  calculated.\n\t  (vzlog) Initialize a timestamp_control structure and pass it to\n\t  time_print and vty_log.\n\t  (zlog_backtrace) Fix 64-bit problem: cannot print size_t with %u.\n\t* vty.h: Must now include \"log.h\".\n\t  (vty_log) Takes an additional struct timestamp_control argument.\n\t* vty.c: (vty_log_out) Use new struct timestamp_control and new\n\t  quagga_timestamp function to print timestamps of the desired\n\t  precision.\n\t  (vty_time_print) Use new quagga_timestamp function.\n\t  (vty_log) Accept new struct timestamp_control argument and pass it\n\t  down to vty_log_out.\n"
    },
    {
      "commit": "afb88a669167358ea2be64aa0d10c8c42fa7509c",
      "tree": "2439441fa56db6ecbae310473af7f1e1808916f2",
      "parents": [
        "ad81f8cc2e77275cdeef1267d1ff4173eb89e093"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Mar 20 20:48:27 2007 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Mar 20 20:48:27 2007 +0000"
      },
      "message": "[lib] Make message lookup function more robust.\n\n2007-03-20 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (mes_lookup) Make the function more robust: check for\n\t  cases where the index does not match the key value at that position.\n\t  If so, give a warning and fall back to a linear search.\n\t  And improve the error message in cases where even that fails.\n"
    },
    {
      "commit": "fb66b29c6701129f0222275eaa206f7ac8ab30cc",
      "tree": "b9a3d53d867ead2e9f8dbb8c1add9c2eb63b1943",
      "parents": [
        "a4b303038363185f60dfef7023cb02715a9a4315"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun May 28 08:26:15 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun May 28 08:26:15 2006 +0000"
      },
      "message": "[lib] Add support for Sun libc printstack to zlog_backtrace_sigsafe\n\n2006-05-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac:\n\t  Check for Sun libc printstack(), add a general HAVE_STACK_TRACE\n\t  define for lib/log.c, if any supported stack symbol dumping\n\t  function is found (glibc backtrace/sun libc printstack).\n\t* log.c: (general) Add support for Sun libc printstack().\n\t  (hex_append) make the cpp conditional on general HAVE_STACK_TRACE\n\t  define.\n\t  (zlog_backtrace_sigsafe) Ditto. Add printstack() version of the\n\t  the DUMP macro in this function.\n"
    },
    {
      "commit": "d6d672aaf930661f502a623d18d7a4abb4f184f2",
      "tree": "fc85e80d1a268dfc420ab5f4f6a306b8e246fc46",
      "parents": [
        "d16e04335968ea05fda60cec01b48df8c345a8ce"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon May 15 16:56:51 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon May 15 16:56:51 2006 +0000"
      },
      "message": "[lib] Add string mapping table for Zserv commands\n\n2006-05-15 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* log.c: (general) Generalise struct zebra_route_desc into\n\t  struct zebra_desc_table and, similar to route_types, add a\n\t  command_types table to describe Zserv protocol commands.\n\t  (route_types[]) use a macro to use designated initialisers\n\t  while avoiding tedious duplication.\n\t  (zserv_command_string) lookup string from zebra_desc_table,\n\t  similar to zebra_route_string\n\t* zebra.h: Add declaration for zserv_command_string, adjust the\n\t  comments to reflect zebra_desc_table.\n"
    },
    {
      "commit": "f52d13cb2e8e7197934d5f241f88647f9b9d78b8",
      "tree": "b0aa01befc07f57ed47e83ac7dfb383284c49d26",
      "parents": [
        "c05612b9a702d0f49c379c92deb6daab55372aea"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Oct 01 17:38:06 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Oct 01 17:38:06 2005 +0000"
      },
      "message": "2005-10-01 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zebra.h: Declare new functions zebra_route_string() and\n\t  zebra_route_char().\n\t* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New\n\t  functions to map zebra route numbers to strings.\n\t* zebra_vty.c: (route_type_str) Remove obsolete function: use new\n\t  library function zebra_route_string() instead.  Note that there\n\t  are a few differences: for IPv6 routes, we now get \"ripng\" and\n\t  \"ospf6\" instead of the old behavior (\"rip\" and \"ospf\").\n\t  (route_type_char) Remove obsolete function: ues new library function\n\t  zebra_route_char() instead.  Note that there is one difference:\n\t  the old function returned \u0027S\u0027 for a ZEBRA_ROUTE_SYSTEM route,\n\t  whereas the new one returns \u0027X\u0027.\n\t  (vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace\n\t  route_type_str() with zebra_route_string().\n\t  (vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()\n\t  with zebra_route_char().\n\t* bgp_vty.c: (bgp_config_write_redistribute) Use new library function\n\t  zebra_route_string instead of a local hard-coded table.\n\t* ospf6_asbr.c: Remove local hard-coded tables zroute_name and\n\t  zroute_abname. Change the ZROUTE_NAME macro to use new library\n\t  function zebra_route_string().  Remove the ZROUTE_ABNAME macro.\n\t  (ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with\n\t  a call to zebra_route_char(), and be sure to fix the format string,\n\t  since we now have a char instead of a char *.\n\t* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and\n\t  zebra_route_abname.  Note that the zebra_route_name[] table\n\t  contained mixed-case strings, whereas the zebra_route_string()\n\t  function returns lower-case strings.\n\t  (ospf6_zebra_read_ipv6): Change debug message to use new library\n\t  function zebra_route_string() instead of zebra_route_name[].\n\t  (show_zebra): Use new library function zebra_route_string() instead\n\t  of zebra_route_name[].\n\t* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.\n\t  (ospf_redist_string) New function implemented using new library\n\t  function zebra_route_string().  Note that there are a few differences\n\t  in the output that will result: the new function returns strings\n\t  that are lower-case, whereas the old table was mixed case.  Also,\n\t  the old table mapped ZEBRA_ROUTE_OSPF6 to \"OSPFv3\", whereas the\n\t  new function returns \"ospf6\".\n\t* ospfd.h: Remove extern struct message ospf_redistributed_proto[],\n\t  and add extern const char *ospf_redist_string(u_int route_type)\n\t  instead.\n\t* ospf_asbr.c: (ospf_external_info_add) In two messages, use\n\t  ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).\n\t* ospf_vty.c: Remove local hard-coded table distribute_str.\n\t  (config_write_ospf_redistribute,config_write_ospf_distribute): Use\n\t  new library function zebra_route_string() instead of distribute_str[].\n\t* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,\n\t  ospf_redistribute_default_set,ospf_redistribute_check)\n\t  In debug messages, use ospf_redist_string() instead of\n\t  LOOKUP(ospf_redistributed_proto).\n\t* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded\n\t  table str[]. Replace str[] with calls to new library function\n\t  zebra_route_string().\n\t* ripd.c: Remove local hard-coded table route_info[].\n\t  (show_ip_rip) Replace uses of str[] with calls to new library\n\t  functions zebra_route_char and zebra_route_string.\n\t* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded\n\t  table str[].  Replace str[i] with new library function\n\t  zebra_route_string(i).\n\t* ripngd.c: Remove local hard-coded table route_info[].\n\t  (show_ipv6_ripng) Use new library function zebra_route_char() instead\n\t  of table route_info[].\n"
    },
    {
      "commit": "c4c7d0c48b1219d7ed9ed1377cea1be239c45d5d",
      "tree": "2dda4470cf7a5b0a5277edc06484f0065ef7bcc1",
      "parents": [
        "c70257d0afa4df7c838dc7c8f5948baca5f12657"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 03 19:22:05 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 03 19:22:05 2005 +0000"
      },
      "message": "2005-02-03 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (zlog_signal,zlog_backtrace_sigsafe) Eliminate use of fileno()\n\t  since it is not async-signal-safe.\n\t  (_zlog_assert_failed) Rewrite crashlog logic more compactly.\n\t  (zlog_set_file,zlog_reset_file,zlog_rotate) Update logfile_fd\n\t  for use in signal handler.\n"
    },
    {
      "commit": "1e2213541bbda26c49667b699a333d87bcc0f2e6",
      "tree": "23ed10aeadeb22a4f3e40c794a829604cc25cb7e",
      "parents": [
        "847947f20b152f0b64057a7115e118b44d238b5c"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 03 16:42:40 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 03 16:42:40 2005 +0000"
      },
      "message": "2005-02-03 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (syslog_sigsafe) Reduce scope of syslog_fd: it is accessed\n\t  inside this function only.\n\t  (open_crashlog) New function to open /var/tmp/quagga.\u003cdaemon\u003e.crashlog\n\t  with flags O_WRONLY|O_CREAT|O_EXCL to save some crash info.\n\t  (zlog_signal,_zlog_assert_failed) Increase logging priority from\n\t  LOG_ERR to LOG_CRIT.  If no file logging is configured, try to use\n\t  open_crashlog to create a crash logfile.\n\t  (zlog_backtrace_sigsafe) If a crashlog file descriptor is open,\n\t  dump a backtrace to that file.\n"
    },
    {
      "commit": "31364274ddd1da6b77dd99e1d5d164b5c643732b",
      "tree": "4f0ae083583fb605508ef981e96fb230d7110c41",
      "parents": [
        "92365889d1f856f323af452bad76f54c15ccdf45"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Jan 18 22:18:59 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Jan 18 22:18:59 2005 +0000"
      },
      "message": "2005-01-18 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.h: Test for SA_SIGINFO to see whether zlog_signal takes final\n\t  two args (siginfo and program_counter).\n\t* log.c: (hex_append) Include this function only if SA_SIGINFO or\n\t  HAVE_GLIBC_BACKTRACE is defined.\n\t  (zlog_signal) Final two args (siginfo and program_counter) now\n\t  depend on whether SA_SIGINFO is defined on this platform.\n\t* sigevent.c: (program_counter) Do not include this function if\n\t  SA_SIGINFO is not defined on this platform.\n\t  (exit_handler,core_handler) Test for SA_SIGINFO to decide whether\n\t  2nd \u0026 3rd arguments are present and to decide how to invoke\n\t  zlog_signal.\n\t  (trap_default_signals) Test for SA_SIGINFO and invoke sigaction\n\t  appropriately.\n"
    },
    {
      "commit": "239c26fdeae4dbccb43da359f9ea034041440831",
      "tree": "aefdb215d2e9ad88afe04d105c07cb9d8550bf96",
      "parents": [
        "f127165de02a66934082f23810fab37d7efbce8b"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Mon Jan 17 15:22:28 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Mon Jan 17 15:22:28 2005 +0000"
      },
      "message": "2005-01-17 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.h: Change prototype for zlog_backtrace_sigsafe to take additional\n\t  program_counter argument.\n\t* log.c: (zlog_backtrace_sigsafe) Add additional program_counter\n\t  argument.  If it is non-NULL, use backtrace_symbols_fd to resolve\n\t  the address.\n\t  (zlog_signal) Call zlog_backtrace_sigsafe with additional\n\t  program_counter argument.\n\n\t[pullup candidate]\n"
    },
    {
      "commit": "40abf2392ba9f14935dab556f43e674cb5c47cf3",
      "tree": "3c5ff5794940f408b411c5d0204e27dac1014378",
      "parents": [
        "6cf9df088e10baefe04139897f8745a42ea0c772"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Jan 12 17:27:27 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Jan 12 17:27:27 2005 +0000"
      },
      "message": "2005-01-12 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* configure.ac: Test for header file \u003cucontext.h\u003e (for use in\n\t  signal processing).\n\t* sigevent.c: (trap_default_signals) Use the SA_SIGINFO flag to\n\t  pass additional siginfo_t and ucontext_t arguments to core_handler\n\t  and exit_handler.\n\t  (core_handler,exit_handler) Now invoked with 3 arguments (using\n\t  SA_SIGINFO).  Pass additional info to zlog_signal.\n\t  (program_counter) New function to find program counter in ucontext_t,\n\t  needs to be enhanced to support more platforms (currently works only\n\t  on Linux/x86).\n\t* log.h: Change the zlog_signal prototype to add new arguments\n\t  siginfo_t * and program_counter.\n\t* log.c: (zlog_signal) Add new arguments siginfo and program_counter.\n\t  Include si_addr and program counter (if non-NULL) in message.\n\t  And remove #ifdef HAVE_GLIBC_BACKTRACE around hex_append, since\n\t  that is now used to render the si_addr and PC pointers.\n"
    },
    {
      "commit": "3378d2099440cb3a14dc7531a3221d4140e186e2",
      "tree": "098f20625c9a7cd329c68865502da0d1a23ccd79",
      "parents": [
        "c3324c63b5f6b39c5f63329a679628b80b63e1bc"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Dec 10 22:43:17 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Dec 10 22:43:17 2004 +0000"
      },
      "message": "2004-12-10 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (zlog_signal,_zlog_assert_failed) Change logging level back to\n\t  LOG_ERR instead of LOG_EMERG.\n"
    },
    {
      "commit": "c3324c63b5f6b39c5f63329a679628b80b63e1bc",
      "tree": "ee3350541aab91dc957007c31d95b3b11cfd31f6",
      "parents": [
        "3fb9de74bbd3de3a264c20b1b486f9853f908c79"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Dec 09 17:26:31 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Dec 09 17:26:31 2004 +0000"
      },
      "message": "2004-12-09 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (hex_append) No need to include this function if\n\t  HAVE_GLIBC_BACKTRACE is not defined.\n"
    },
    {
      "commit": "ad572396fc8306cee92af37d1099e317856a99d0",
      "tree": "6f402b91c6099a62247ef788359b52b4b602ede4",
      "parents": [
        "91f3e525a95d6a86f916872116af162eb3bdae5d"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Thu Dec 09 14:53:32 2004 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Thu Dec 09 14:53:32 2004 +0000"
      },
      "message": "add XXX comment about hex_append being unused.\n(only used if HAVE_GLIBC_BACKTRACE, so perhaps ifdef it?)\n"
    },
    {
      "commit": "274a4a4447b13f89f8237156a887d05a24a73cc6",
      "tree": "d5c2c6ee94bb77ef4346bcc07834808a75210bfd",
      "parents": [
        "5e76477456ce8bc4a1eeaccb5c5e1d3d99ab1300"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Dec 07 15:39:31 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Dec 07 15:39:31 2004 +0000"
      },
      "message": "2004-12-07 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* bgp_main.c: (main) The 2nd argument to openzlog has been removed.\n\t* isis_main.c: (main) The 2nd argument to openzlog has been removed.\n\t* ospf6_main.c: (main) The 2nd argument to openzlog has been removed.\n\t  Note that stdout logging will no longer be enabled by default when\n\t  not running as a daemon.\n\t* ospf_main.c: (main) The 2nd argument to openzlog has been removed.\n\t* rip_main.c: (main) The 2nd argument to openzlog has been removed.\n\t* ripng_main.c: (main) The 2nd argument to openzlog has been removed.\n\t* main.c: (main) The 2nd argument to openzlog has been removed.\n\t  So stdout logging will no longer be enabled by default.\n\t* irdp_main.c: (irdp_finish) Reduce severity of shutdown message\n\t  from LOG_WARNING to LOG_INFO.\n\t* vtysh.c: Make several functions static instead of global.\n\t  Added several commands to support destination-specific logging levels.\n\t  (vtysh_completion) This function is unused, so comment it out.\n\t* basic.texi: Document new logging features.  Separate basic config\n\t  commands from basic VTY commands.\n\t* log.h: Replace struct zlog flags and maskpri fields with maxlvl\n\t  array to support individual logging levels for each destination.\n\t  Remove the 2nd argument to openzlog since the default logging config\n\t  should be standardized inside the library.  Replaced the\n\t  zlog_set_flag and zlog_reset_flag functions with zlog_set_level.\n\t  And zlog_set_file now requires an additional log_level argument.\n\t  Declare zlog_proto_names for use inside command.c in the\n\t  \"show logging\" command.  Added defines useful for command\n\t  construction.\n\t* log.c: (vzlog) Decide where to send the message based on the\n\t  individual logging levels configured for each destination.\n\t  Remove support for ZLOG_STDERR since it was never actually used.\n\t  Support record-priority for terminal monitors.\n\t  (zlog_signal,zlog_backtrace_sigsafe) Support destination-specific\n\t  logging levels.  Remove stderr support (was never used).  Added\n\t  support for terminal monitor logging.\n\t  (_zlog_assert_failed) Increase message severity to LOG_EMERG.\n\t  (openzlog) Remove 2nd argument since default config should be\n\t  standardized in library.  By default, terminal monitoring\n\t  is set to debug, and all other logging is disabled.\n\t  (zlog_set_flag,zlog_reset_flag) Removed.\n\t  (zlog_set_level) New function to replace zlog_set_flag and\n\t  zlog_reset_flag.  Supports destination-specific logging levels.\n\t  (zlog_set_file,zlog_reset_file) Support file-specific logging level.\n\t  (zlog_rotate) Log an error message if fopen fails, and support\n\t  new file-specific logging level.\n\t* command.h: Change DEFUN_CMD_FUNC_DECL and DEFUN_CMD_FUNC_TEXT so that\n\t  command functions will be static instead of global.  Remove\n\t  declarations for config_exit and config_help.  Define new macros\n\t  DEFUNSH_ATTR, DEFUNSH_HIDDEN, and DEFUNSH_DEPRECATED so we can\n\t  have deprecated commands in vtysh.  Similarly, for completeness,\n\t  define macros ALIAS_SH, ALIAS_SH_HIDDEN, and ALIAS_SH_DEPRECATED.\n\t  Also, fix bug in ALIAS_ATTR macro (didn\u0027t matter because it\n\t  was never used).\n\t* command.c: Make many functions static instead of global.\n\t  (facility_name,facility_match,level_match) New functions\n\t  to support enhanced destination-specific logging levels.\n\t  (config_write_host) Support new destination-specific logging levels.\n\t  (config_logmsg) Added new \"logmsg\" command to help test logging\n\t  system.\n\t  (show_logging) Added \"show logging\" command to show the current\n\t  configuration of the logging system.\n\t  (config_log_stdout_level) Support explicit stdout logging level.\n\t  (no_config_log_stdout) Now takes optional LEVEL arg.\n\t  (config_log_monitor,config_log_monitor_level,no_config_log_monitor)\n\t  New commands creating new \"log monitor\" commands to set terminal\n\t  monitoring log level.\n\t  (config_log_file_level) Support explicit file logging level.\n\t  (config_log_syslog_level) Support explicit syslog logging level.\n\t  (config_log_facility,no_config_log_facility) Implement new\n\t  \"log facility\" command.\n\t  (cmd_init) Add hooks for new commands: \"show logging\", \"logmsg\",\n\t  \"log stdout \u003clevel\u003e\", \"log monitor\", \"log monitor \u003clevel\u003e\",\n\t  \"no log monitor\", \"log file \u003cfilename\u003e \u003clevel\u003e\",\n\t  \"no log file \u003cfilename\u003e \u003clevel\u003e\", \"log syslog \u003clevel\u003e\",\n\t  \"log facility\", and \"no log facility\".\n\t* vty.h: Added a \"level\" argument to vty_log so it can support\n\t  \"log record-priority\".  Declare new function vty_log_fixed for\n\t  use in signal handlers.\n\t* vty.c: (vty_log,vty_log_out) Added a \"level\" argument to support\n\t  \"log record-priority\" for vty terminal monitors.\n\t  (vty_down_level) Use config_exit_cmd.func instead of calling\n\t  config_exit directly (since command functions will now be static\n\t  instead of global).\n\t  (vty_log_fixed) New function to send terminal monitor messages\n\t  from inside a signal handler.\n"
    },
    {
      "commit": "7d149b8e48ef72021aefddf44f400bccaf391870",
      "tree": "67a7aeda5a2d98aabcafabe9e936a5711076ad41",
      "parents": [
        "2557aed16aa98f90d70a14ad4546742c79af7668"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Nov 28 23:00:01 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Nov 28 23:00:01 2004 +0000"
      },
      "message": "2004-11-28 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.h: Remove several unused fields from struct zlog.  Add comments\n\t  for other fields, and add one new field syslog_options that is\n\t  used in the new syslog_sigsafe implementation.\n\t* log.c: (syslog_sigsafe) New function to send syslog messages in\n\t  an async-signal safe way that can be used inside a signal handler.\n\t  (syslog_connect) New function to connect to syslog daemon inside a\n\t  signal handler.  This function supports only systems where /dev/log\n\t  is a unix datagram socket (e.g. not Solaris).\n\t  (zlog_signal) Call syslog_sigsafe if syslog logging is enabled.\n\t  (zlog_backtrace_sigsafe) Call syslog_sigsafe if syslog logging is\n\t  enabled.\n\t  (openzlog) Save syslog_options for use in syslog_sigsafe.\n\t  (num_append) Fix bug: handle 0 properly.\n\t  (hex_append) New function to print a u_long in hex format.\n"
    },
    {
      "commit": "48d6c69b345096425644b7796a7bc6b36bf0e974",
      "tree": "ad132074b26d440c8db8e3558361b144c187595e",
      "parents": [
        "5b85facc638d219a7281b75bec8a08dcf79a46ce"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 26 20:52:59 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 26 20:52:59 2004 +0000"
      },
      "message": "2004-11-26 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c, log.h, memory.c: Change function name from zlog_backtrace_safe\n\t  to the more self-explanatory zlog_backtrace_sigsafe.\n"
    },
    {
      "commit": "063ee52af64472474af2fa4b3cb2ba9ced746b9f",
      "tree": "d9d0f9dac723159cefd21d350195fabe286032e5",
      "parents": [
        "d1c51d7c27a1c5f5c838ef5f09e98e33527bfddc"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 26 18:11:14 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 26 18:11:14 2004 +0000"
      },
      "message": "2004-11-26 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (zlog_backtrace) New function to log a backtrace.\n\t  (zlog_backtrace_safe) Log a backtrace in an async-signal-safe way.\n\t  Unfortunately, this function does not support syslog logging yet.\n\t  (zlog_signal) Move backtrace code into separate function\n\t  zlog_backtrace_safe.\n\t  (_zlog_assert_failed) Call zlog_backtrace before aborting.\n\t* log.h: Declare new functions zlog_backtrace and zlog_backtrace_safe.\n\t* memory.c: (zerror) Call zlog_backtrace before aborting.\n"
    },
    {
      "commit": "ad4d974d06ba3344e2e0df3277f7e0c42f018a4e",
      "tree": "17f417d142dda46926dcd8ce7fdc259572315cef",
      "parents": [
        "101ec7099a0c725f8836f51e2f9ad2138eb43502"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 24 18:20:30 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 24 18:20:30 2004 +0000"
      },
      "message": "In zlog_signal, should probably check the return code from backtrace, just\nto be safe.\n"
    },
    {
      "commit": "101ec7099a0c725f8836f51e2f9ad2138eb43502",
      "tree": "8cb6731e527174866b31b97fabaa615fc2e82bad",
      "parents": [
        "cee3df1e4b1b8103bf81e5281a46aab7881f93df"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 24 18:05:15 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 24 18:05:15 2004 +0000"
      },
      "message": "In zlog_signal, change type of size since backtrace actually returns an int.\n"
    },
    {
      "commit": "cee3df1e4b1b8103bf81e5281a46aab7881f93df",
      "tree": "40d7cc8c22da9634739256a9d577b140b41730b8",
      "parents": [
        "b9e0ee31864c94c729fb6b6f6b2ccbc79dbcd474"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 24 17:14:49 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 24 17:14:49 2004 +0000"
      },
      "message": "2004-11-24 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zassert.h: New header file to declare a quagga-specific assert macro.\n\t* log.c: (_zlog_assert_failed) New function called when assert fails\n\t  to log the error and abort.\n\t* zebra.h: Include \"zassert.h\" instead of \u003cassert.h\u003e.\n\t* regex.c: Include \"zassert.h\" instead of \u003cassert.h\u003e.\n\t* dict.c: Include \"zassert.h\" instead of \u003cassert.h\u003e.\n"
    },
    {
      "commit": "59a06a915da9129a4e756c2b4d42449aa71a0ee4",
      "tree": "44090f696cbec97cab5e5b090b22c7431a5d6490",
      "parents": [
        "d246bd965898f0ba6781f2b2048af9a5eba079d3"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Nov 23 18:19:14 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Nov 23 18:19:14 2004 +0000"
      },
      "message": "2004-11-23 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* sigevent.c: (signal_init) Set up some default signal handlers\n\t  so that processes will issue an error message before terminating\n\t  or dumping core.\n\t  (trap_default_signals) New function to set up signal handlers\n\t  for various signals that may kill the process.\n\t  (exit_handler) Call zlog_signal, then _exit.\n\t  (core_handler) Call zlog_signal, then abort.\n\t* log.h: Declare new function zlog_signal.\n\t* log.c: (zlog_signal) New function to log information about\n\t  a received signal before the process dies.  Try to log a\n\t  backtrace also.\n\t  (quagga_signal_handler,signal_set) Should be static.\n"
    },
    {
      "commit": "d246bd965898f0ba6781f2b2048af9a5eba079d3",
      "tree": "80ed32d986e3845d041cc2bc08bcc2b03a8ec75d",
      "parents": [
        "8686fc746cad9fda26812c88df5faaff0f418650"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Nov 23 17:35:08 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Nov 23 17:35:08 2004 +0000"
      },
      "message": "2004-11-23 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (vzlog) Take a single va_list argument and use va_copy\n\t  as necessary for multiple traversals.\n\t  (zlog) Pass only one va_list to vzlog.\n\t  (zlog_*,plog_*) Use a macro for boilerplate code; pass only one\n\t  va_list to vzlog.\n\t  (zlog_set_file) Remove unused 2nd argument (flags).\n\t  (zlog_save_cwd,zlog_get_cwd,zlog_free_cwd) Remove unused functions.\n\t* log.h: Remove ZLOG_*_INDEX defines (no longer used).\n\t  Remove unused 2nd argument from zlog_set_file prototype.\n\t  Fix prototype for zlog_rotate.\n\t* command.c: (config_log_file) Remove unused 2nd arg to zlog_set_file.\n\t* vty.c: (vty_out) Fix stdarg usage to perform multiple traversals\n\t  properly.\n\t  (vty_log) Must use va_copy for multiple traversals of va_list arg.\n"
    },
    {
      "commit": "ca35976927190883368ef3bd32bbf9f174575bd6",
      "tree": "aa3b9fa981719c48f0418abb06355e88ee39dbcb",
      "parents": [
        "ff29bb31505b485e8ffa561e21d075d28ac7d5e7"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 19 23:40:16 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 19 23:40:16 2004 +0000"
      },
      "message": "2004-11-19 David Young \u003cdyoung@pobox.com\u003e\n\n\t* log.c: (safe_strerror) New function: safe wrapper for strerror.\n"
    },
    {
      "commit": "9035efaa924c69f4f4fcb1049c7dc4f43b9da980",
      "tree": "f81d25b0e069ad8fb5f2843172a4e60fa0d6cbdf",
      "parents": [
        "ddd119fd3d94e95dd44aa9fb3bc3fca4f26078a0"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Oct 10 11:56:56 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Oct 10 11:56:56 2004 +0000"
      },
      "message": "2004-10-10 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* version.h.in: (pid_output*) add const qualifier.\n\t* command.h: Change DEFUN func to take const char *[] rather\n          than char **, to begin process of fixing compile warnings in lib/.\n          Nearly all other changes in this commit follow from this change.\n        * buffer.{c,h}: (buffer_write) pointer-arithmetic is gccism, take\n          const void * and cast an automatic const char *p to it.\n          (buffer_putstr) add const\n        * command.c: (zencrypt) const qualifier\n          (cmd_execute_command_real) ditto\n          (cmd_execute_command_strict) ditto\n          (config_log_file) ditto.\n          Fix leak of getcwd() returned string.\n        * memory.{c,h}: Add MTYPE_DISTRIBUTE_IFNAME for struct dist ifname.\n        * distribute.{c,h}: Update with const qualifier.\n          (distribute_free) use MTYPE_DISTRIBUTE_IFNAME\n          (distribute_lookup) Cast to char *, note that it\u0027s ok.\n          (distribute_hash_alloc) use MTYPE_DISTRIBUTE_IFNAME.\n          (distribute_get)  Cast to char *, note that it\u0027s ok.\n        * filter.c: Update with const qualifier.\n        * if.{c,h}: ditto.\n        * if_rmap.{c,h}: ditto.\n          (if_rmap_lookup) Cast to char *, note that it\u0027s ok.\n          (if_rmap_get) ditto.\n        * log.{c,h}: Update with const qualifier.\n        * plist.{c,h}: ditto.\n        * routemap.{c,h}: ditto.\n        * smux.{c,h}: ditto. Fix some signed/unsigned comparisons.\n        * sockopt.c: (getsockopt_cmsg_data) add return for error case.\n        * vty.c: Update with const qualifier.\n"
    },
    {
      "commit": "8c328f1106cf0498333c2d8a96940e7b4581e316",
      "tree": "9bf24cca6a68a9dd5d4dda586484e497d0c19ca6",
      "parents": [
        "98c91ac6ac085713c00af00a6ac41779be6b50b3"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Oct 05 21:01:23 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Oct 05 21:01:23 2004 +0000"
      },
      "message": "Number of warnings is down to 3 again in lib directory. A lot of const\u0027s\nadded to strings and a lot of int -\u003e unsigned int changes.\n"
    },
    {
      "commit": "b04c699ecfb4704a67f4583e4ea929a6a3e49856",
      "tree": "9149adb41b7bc1acca6c882ab413f68b19b2a64d",
      "parents": [
        "97c52f4e397848fb18c689dfe161d0b8f7803722"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Oct 04 19:10:31 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Oct 04 19:10:31 2004 +0000"
      },
      "message": "First small part of lib cleanup. Mainly \"constification\" of arguments and\nadding FIXME\u0027s.\n"
    },
    {
      "commit": "9e867fe663c4eb43c36f35067c0dd092e8c83c14",
      "tree": "f29461b6a2dc8c38037dc0cf91e70392f9ed4ab2",
      "parents": [
        "eb5d44eb8dcf25a1b328e57d1eabb1f89e3bc59b"
      ],
      "author": {
        "name": "jardin",
        "email": "jardin",
        "time": "Tue Dec 23 08:56:18 2003 +0000"
      },
      "committer": {
        "name": "jardin",
        "email": "jardin",
        "time": "Tue Dec 23 08:56:18 2003 +0000"
      },
      "message": "Merge isisd into the Quagga\u0027s framework:\n  - add privs support\n  - use misc quagga\u0027s definitions\n  - make it compile\"able\"\n  - fix segfault cases related to hostname()\n  - add debug isis xxx command\n\nThis patch has been approved by Paul Jakma.\n"
    },
    {
      "commit": "aa593d5e2638566ead1e69381e60639550991ff2",
      "tree": "c865f642c1029fa47b8fc6cc86302468b9b2aef4",
      "parents": [
        "47ce02a8f12134a6ba515fbf1d2b9276e39d4c06"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Mon Dec 22 20:15:53 2003 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Mon Dec 22 20:15:53 2003 +0000"
      },
      "message": "2003-12-22 Christian Hammers \u003cch@lathspell.de\u003e\n\n        * configure.ac (and everywhere a regular file is opened for\n          writing): use file permissions from configure rather than\n          compiled-in umask.\n"
    },
    {
      "commit": "828eb7fb46a61ab7bc5fdf393dc8c5b65fd1ec24",
      "tree": "6d1753c204fdcd349e28e5a42a2725af1139bf3d",
      "parents": [
        "736d3441e267c76056d6fcc2f59cd09a90f3af21"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Jul 26 06:05:18 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Jul 26 06:05:18 2003 +0000"
      },
      "message": "2003-07-26 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* lib/command.c: Add config_log_syslog_facility_cmd, to set\n          syslog facility. This was a commit to zebra.org on May 20,\n          merge in to zebra-pj.\n"
    },
    {
      "commit": "718e3744195351130f4ce7dbe0613f4b3e23df93",
      "tree": "bac2ad39971cd43f31241ef123bd4e470f695ac9",
      "parents": [],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "message": "Initial revision\n"
    }
  ]
}
