)]}'
{
  "log": [
    {
      "commit": "3293bc280f15d8e3c04e0bf9b0a8d54d342a87a9",
      "tree": "cbc3dc09016553de6bf9d97c641a4d9caaa40fda",
      "parents": [
        "f85592e05ae6463727433893e61afd1081fcf7e0"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:41:01 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:31:02 2015 +0200"
      },
      "message": "route table: constify some APIs\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7aa9dcef80b2ce50ecaa77653d87c8b84e009c49",
      "tree": "bd4a8d881336a1551146725d7ae06b3e68553e4d",
      "parents": [
        "010ebbbca6396f272cc2d50d147dd922dda68213"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Fri Sep 19 14:42:23 2014 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Sep 23 16:32:34 2014 +0100"
      },
      "message": "Fix most compiler warnings in default GCC build.\n\nFix lots of warnings. Some const and type-pun breaks strict-aliasing\nwarnings left but much reduced.\n\n* bgp_advertise.h: (struct bgp_advertise_fifo) is functionally identical to\n  (struct fifo), so just use that.  Makes it clearer the beginning of\n  (struct bgp_advertise) is compatible with with (struct fifo), which seems\n  to be enough for gcc.\n  Add a BGP_ADV_FIFO_HEAD macro to contain the right cast to try shut up\n  type-punning breaks strict aliasing warnings.\n* bgp_packet.c: Use BGP_ADV_FIFO_HEAD.\n  (bgp_route_refresh_receive) fix an interesting logic error in\n  (!ok || (ret !\u003d BLAH)) where ret is only well-defined if ok.\n* bgp_vty.c: Peer commands should use bgp_vty_return to set their return.\n* jhash.{c,h}: Can take const on * args without adding issues \u0026 fix warnings.\n* libospf.h: LSA sequence numbers use the unsigned range of values, and\n  constants need to be set to unsigned, or it causes warnings in ospf6d.\n* md5.h: signedness of caddr_t is implementation specific, change to an\n  explicit (uint_8 *), fix sign/unsigned comparison warnings.\n* vty.c: (vty_log_fixed) const on level is well-intentioned, but not going\n  to fly given iov_base.\n* workqueue.c: ALL_LIST_ELEMENTS_RO tests for null pointer, which is always\n  true for address of static variable.  Correct but pointless warning in\n  this case, but use a 2nd pointer to shut it up.\n* ospf6_route.h: Add a comment about the use of (struct prefix) to stuff 2\n  different 32 bit IDs into in (struct ospf6_route), and the resulting\n  type-pun strict-alias breakage warnings this causes.  Need to use 2\n  different fields to fix that warning?\n\ngeneral:\n\n* remove unused variables, other than a few cases where they serve a\n  sufficiently useful documentary purpose (e.g.  for code that needs\n  fixing), or they\u0027re required dummies.  In those cases, try mark them as\n  unused.\n* Remove dead code that can\u0027t be reached.\n* Quite a few \u0027no ...\u0027 forms of vty commands take arguments, but do not\n  check the argument matches the command being negated.  E.g., should\n  \u0027distance X \u003cprefix\u003e\u0027 succeed if previously \u0027distance Y \u003cprefix\u003e\u0027 was set?\n  Or should it be required that the distance match the previously configured\n  distance for the prefix?\n  Ultimately, probably better to be strict about this.  However, changing\n  from slack to strict might expose problems in command aliases and tools.\n* Fix uninitialised use of variables.\n* Fix sign/unsigned comparison warnings by making signedness of types consistent.\n* Mark functions as static where their use is restricted to the same compilation\n  unit.\n* Add required headers\n* Move constants defined in headers into code.\n* remove dead, unused functions that have no debug purpose.\n"
    },
    {
      "commit": "6b0655a25194c7c0331154edaa6124cf783e5e5e",
      "tree": "c0c7d479f2684531249668210da27a60322ba395",
      "parents": [
        "fdb913aedb5a9807ad60715e8badb4f25d57acea"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 06:53:35 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 06:58:02 2014 +0200"
      },
      "message": "*: nuke ^L (page feed)\n\nQuagga sources have inherited a slew of Page Feed (^L, \\xC) characters\nfrom ancient history.  Among other things, these break patchwork\u0027s\nXML-RPC API because \\xC is not a valid character in XML documents.\n\nNuke them from high orbit.\n\nPatches can be adapted simply by:\n\tsed -e \u0027s%^L%%\u0027 -i filename.patch\n(you can type page feeds in some environments with Ctrl-V Ctrl-L)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "28971c8cb1138700e87dc7da673e59b5596bb51b",
      "tree": "0e55c3f830681449cd96bb36eb04a6a1293d8b44",
      "parents": [
        "67174041d2d9d8908f8b2c915bc0d186d8442c68"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:50 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:50:48 2012 +0200"
      },
      "message": "lib/table: add route_table_get_next() and iterator\n\n  * lib/table.[ch]\n\n    - Add a function (route_table_get_next()) to get the route_node in\n      a tree that succeeds a given prefix in iteration order.\n\n      This allows one to reliably walk nodes in a tree while allowing\n      modifications, and is useful for achieving scale and\n      performance. Other approaches are also possible -- the main plus\n      point of this one is that it does not require any state about\n      the walk to be maintained in the table data structures.\n\n    - Add an iterator for walking the nodes in a tree. This introduces\n      a new structure (route_table_iter_t) and the following main\n      functions.\n\n        route_table_iter_init()\n        route_table_iter_pause()\n        route_table_iter_next()\n        route_table_iter_cleanup()\n\n      The iterator normally uses node pointers and the existing\n      route_next() function to walk nodes efficiently. When an\n      iteration is \u0027paused\u0027 with route_table_iter_pause(), it stores\n      the last prefix processed. The next call to\n      route_table_iter_next() transparently invokes\n      route_table_get_next() with the prefix to resume iteration.\n\n  * bgpd/bgp_table.[ch]\n\n    Add wrappers for the new table features described above.\n\n  * tests/table_test.c\n\n    Add tests for the new table code.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f9c1b7bb9b98342f1f3b0bfe3af01844f364dce9",
      "tree": "350c8e0d98e4dcc53b126c6ce1c7568c440fcb06",
      "parents": [
        "3eb8ef37bc463f88bfa36bd26fd43f7f6ad36c20"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:48 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:48:49 2012 +0200"
      },
      "message": "lib: prepare table code for reuse by bgp_table\n\n  * lib/table.[ch]\n\n    - Add a macro (ROUTE_NODE_FIELDS) that expands to all the fields\n      of a route_node structure.\n\n    - Add the route_table_delegate_t structure, a function vector\n      which allows clients to customize the behavior of one or more\n      tables.\n\n      The delegate currently contains the \u0027create_node\u0027 and\n      \u0027destroy_node\u0027 functions, and hence enables a table to use an\n      alternative node structure. The alternative node is expected to\n      embed the fields of a route_node using ROUTE_NODE_FIELDS.\n\n    - Add route_table_init_with_delegate() to create a new table with\n      a given delegate.\n\n    - Make route_table_init() a thin wrapper around\n      route_table_init_with_delegate(). The delegate it passes in\n      simply creates/destroys route_node structures as before.\n\n    - Add a user data pointer (info) to the route_table\n      structure. This can be used by a client to keep per-table state.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3eb8ef37bc463f88bfa36bd26fd43f7f6ad36c20",
      "tree": "6238a10b945d98b5b06f5bf4620406579d687aa6",
      "parents": [
        "ed6e297972318a0070ad4d973401fbc6e0def558"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:47 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:48:48 2012 +0200"
      },
      "message": "lib: bring some changes over from bgp_table to table\n\n  * lib/table.c\n\n    - Maintain table node count. Expose it via the route_table_count()\n      function (from revision cbdfbaa5).\n\n    - route_unlock_node(): Add assertion (from revision 228da428).\n\n    - route_table_free(): Make static and fix up cleanup code (from\n      revision 228da428).\n\n    - route_node_delete(): Change to be static.\n\n    - Add \u0027const\u0027 qualifier in a couple places.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "47d3b6078a6c885e03d28bae3397b71a827473f5",
      "tree": "b3a6a1de537c9be50c839cf088be89ee91c6b38e",
      "parents": [
        "f018db83a0746f9336d04e50dd06f3bbf6565f1c"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:11 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:51 2012 +0200"
      },
      "message": "micro-op bgp_node_[get|lookup]() and route_node_[get|lookup]()\n\n  Reduce indirection for values that doesn\u0027t change in the loop.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\n[adjusted after dropping previous patch]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f8416810aad4cba6f622c6b3f9352abdd54cd01e",
      "tree": "7ca0d68cd44ea6c0b4d838f6526b3ccadcb836f9",
      "parents": [
        "d358344759d85a965bbd767f4a994695f99b842e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Apr 13 22:42:33 2010 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Dec 08 17:06:12 2010 +0000"
      },
      "message": "lib: Fix bug in prefix trie lookup\n\n* lib/table.c: (route_node_match) fix overshoot that was causing this\n  function to go 1 bit too far and thus reading past end of prefix.\n  (route_node_lookup) be defensive - don\u0027t assume others will clean up\n  leaves when removing info.\n"
    },
    {
      "commit": "1352ef32d70dcc102074814de63b5d08e591dd2d",
      "tree": "a0a4a40bf9a7726914f76cfa3a108529c7cc59df",
      "parents": [
        "3949a60c350fea947d2701e2fe709b174ae7af16"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Wed Dec 09 14:43:17 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Dec 09 14:43:17 2009 +0300"
      },
      "message": "lib: move check_bit into prefix common code\n\nMake one version of check prefix bit, and put it inline\nwith proper prototype. This gets rid of some macro\u0027s and also some\nassert() that can never happen on a non-broken compiler.\n\n* bgpd/bgp_table.c\n  * CHECK_BIT(): sayonara\n  * check_bit(): sayonara\n  * SET_LINK(): sayonara\n  * set_link(): make use of prefix_bit() instead of check_bit()\n  * bgp_node_match(): idem\n  * bgp_node_lookup(): idem\n  * bgp_node_get(): idem\n* lib/prefix.h\n  * prefix_bit(): new inline version of check_bit()\n* lib/table.c\n  * CHECK_BIT(): sayonara\n  * check_bit(): sayonara\n  * SET_LINK(): sayonara\n  * set_link(): make use of prefix_bit() instead of check_bit()\n  * route_node_match(): idem\n  * route_node_lookup(): idem\n  * route_node_get(): idem\n* ospf6d/ospf6_lsdb.c\n  * CHECK_BIT(): sayonara\n  * ospf6_lsdb_lookup_next(): make use of prefix_bit() instead of\n    CHECK_BIT()\n  * ospf6_lsdb_type_router_head(): idem\n  * ospf6_lsdb_type_head(): idem\n* ospf6d/ospf6_route.c\n  * CHECK_BIT(): sayonara\n  * ospf6_route_match_head() make use of prefix_bit() instead of\n  * CHECK_BIT()\n"
    },
    {
      "commit": "38cc00cd823fe945c7748de18c3e8932d98dd8f8",
      "tree": "51f79a6ff37f8858b569f55f27480c4b47eb2aac",
      "parents": [
        "0d6388abc7a5da2a20a4854c400c8e176127e480"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Dec 08 12:00:50 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 08 12:00:50 2009 +0300"
      },
      "message": "lib: make match functions take const args\n\n* table.c: general type safety and compiler help:\n  * maskbit[]: become const\n  * route_node_match(): take const args\n  * route_node_match_ipv4(): idem\n  * route_node_match_ipv6(): idem\n  * check_bit(): idem, plus adjust local vars typing\n"
    },
    {
      "commit": "0d6388abc7a5da2a20a4854c400c8e176127e480",
      "tree": "effe14c7fc1e958b6082685026a1c3ad92b2451a",
      "parents": [
        "78e6cd98dd88393d0863388caf37dae45435db7a"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Dec 07 19:19:13 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Dec 07 19:19:13 2009 +0300"
      },
      "message": "lib: remove unused function: route_dump_node()\n"
    },
    {
      "commit": "8cc4198f9fabe5f10f5a773de1503d82f33a01fb",
      "tree": "77045da709ff66629bd12029b9ee17700360909b",
      "parents": [
        "e7fe8c88c3d552400e1ae3ae9243319ab95d6f2d"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:25:49 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:25:49 2005 +0000"
      },
      "message": "2005-05-06 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* (general) extern and static\u0027ification of functions in code and\n\t  header.\n\t  Cleanup any definitions with unspecified arguments.\n\t  Add casts for callback assignments where the callback is defined,\n\t  typically, as passing void *, but the function being assigned has\n\t  some other pointer type defined as its argument, as gcc complains\n\t  about casts from void * to X* via function arguments.\n\t  Fix some old K\u0026R style function argument definitions.\n\t  Add noreturn gcc attribute to some functions, as appropriate.\n\t  Add unused gcc attribute to some functions (eg ones meant to help\n\t  while debugging)\n\t  Add guard defines to headers which were missing them.\n\t* command.c: (install_node) add const qualifier, still doesnt shut\n\t  up the warning though, because of the double pointer.\n\t  (cmp_node) ditto\n\t* keychain.c: (key_str2time) Add GET_LONG_RANGE() macro, derived\n\t  fromn vty.h ones to fix some of the (long) \u003c 0 warnings.\n\t* thread.c: (various) use thread_empty\n\t  (cpu_record_hash_key) should cast to uintptr_t, a stdint.h type\n\t* vty.h: Add VTY_GET_IPV4_ADDRESS and VTY_GET_IPV4_PREFIX so they\n\t  removed from ospfd/ospf_vty.h\n\t* zebra.h: Move definition of ZEBRA_PORT to here, to remove\n\t  dependence of lib on zebra/zserv.h\n"
    },
    {
      "commit": "9bca8ebc4fcc369ad17b9a8caf8b14e62ad87e4a",
      "tree": "68d520ef0c07c4f1413eda2935efb6b7e64c29fe",
      "parents": [
        "0b24b4c759a6fb77c4b6043891b81574fbb229dc"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 29 17:18:47 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 29 17:18:47 2003 +0000"
      },
      "message": "lib/table.c: Fix the SET_LINK macro. (not that its of any worth)\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"
    }
  ]
}
