)]}'
{
  "log": [
    {
      "commit": "880e31ca2d8a8a8fcbc28bfeac9bd13fc76dd2c1",
      "tree": "bcaadd39adfb96a286d1ece6cc5bf8b27f0dad5d",
      "parents": [
        "2ab67a7591d7693bb726dd82795017c8c3f52d99"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:40 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: use constant to replace magic value for length of quagga_timestamp\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "811577eaede8b6a7ea6ba3731c82eed1c4d07500",
      "tree": "b6b5ac6a5bc2248830e47e6a4ed044d7098cc38f",
      "parents": [
        "985c3556921fa669f86fe5e62130fbeb93d94ca9"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Mar 10 20:16:48 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Remove unnecessary parentheses\n\nThe freebsd compiler complains that there is an extra set of ()\u0027s\naround the if statement.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "86b2a0a12ace817e64e8e4a719b1ba9a8e6af253",
      "tree": "d077de18b7d595f88dc4fb423a5dba91f8650741",
      "parents": [
        "f53585d59b62b12d68282154af346796b75c7f2f"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 12:19:51 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:29 2016 +0100"
      },
      "message": "lib: change command logging to be off by default\n\n* lib/vty.c: add \u0027log_command\u0027 to enable logging of vty commands executed.\n  Default command logging to off.\n"
    },
    {
      "commit": "a3fda886cdd48b6d8c421ebb1401142fa9ee93b0",
      "tree": "42a5e6fda0978185128544fd199caf8ed93e58a3",
      "parents": [
        "637035710a2f8e1e5944ee714135b7f88ac15ac4"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:04 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgpd, lib, vtysh: hook up bgp ENCAP CLI node\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "13c378d96a57017f5995b2e0df46cfc31123f0e8",
      "tree": "6b4669bf22264a816ef451f3058cd8f59872eab5",
      "parents": [
        "9da04bca0e994ec92b9242159bf27d89c6743354"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:56 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd, lib, vtysh: hook up bgp VPNv6 CLI node\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c7f7e49a4f68c92152384582ff70d64609858170",
      "tree": "44838e385af5ac715247037db1e6e1b48a500707",
      "parents": [
        "f9ec4190f1eaf2dba355a9808bca8d7148bc8a55"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:49 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "lib: add facility to log all CLI commands\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "672900382d47137638086bd8351b2678f589a546",
      "tree": "c6b482ed46f8dc8f0be79144173ccae152a3a726",
      "parents": [
        "40278bd4c51939ccf8ec06ef1f33aedf8f05e86c"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:46 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:41 2016 +0000"
      },
      "message": "lib: fix bookkeeping for libreadline malloc()s\n\nWhen libreadline is used, we mistakenly mix in strdup() done in\nlibreadline with Quagga\u0027s lib/memory bookkeeping/counting, leading to\ncounter underflows on MTYPE_TMP.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "eeef0db2e9260fe76acb328a339025c432eb7c22",
      "tree": "48bc6b2b1e3e71658fcf345ed381d3d4bf10c8c4",
      "parents": [
        "ee162617ead116ebcda93b145a043231647b3380"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Oct 14 08:50:38 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 10:53:22 2015 +0000"
      },
      "message": "lib: Fix duplicate variable name in smux.c and vty.c\n\nBoth smux.c and vty.c have the same:\nstatic struct thread_master *master;\n\nas global variables for the file.  This can and will lead to confusion\nname the variables something appropriate for the file it is in.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c1c69e43cda64122b599746df4d1c6c5d8b52e37",
      "tree": "cccc035647931b79657438087f92bc6a387aae96",
      "parents": [
        "80c9354835bb924983d12b0efad957e78f219287"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:40:57 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:30:44 2015 +0200"
      },
      "message": "lib: allow caller to provide prefix storage in sockunion2hostprefix\n\nAvoids a dynamic allocation which is usually freed immediate afterwards.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "90d313578f035110422799ca2e188d745ceb3733",
      "tree": "9ec0ef3c8cca4cb52dc5d1340f2a3cb8191ae586",
      "parents": [
        "464ccf36b4aa1b942cad413ea30267b4bf9e6315"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 14 14:24:06 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:41 2015 +0200"
      },
      "message": "lib/vty: don\u0027t clear output buffer on input EOF\n\nA VTY\u0027s input can be closed without the output becoming unavailable.\nThis happens both on stdio when stdin ends, as well as over TCP when an\nunidirectional input shutdown() happens.\n\nIn such a case, resetting the output buffer is not appropriate since\nthere might still be data to be successfully written.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "464ccf36b4aa1b942cad413ea30267b4bf9e6315",
      "tree": "1d0a46df5f2b00e5a4cfe81e0fcce5d94ee4abab",
      "parents": [
        "ba53a8fdecef07577dcc4109e5c82bb124d49c58"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 12 21:56:18 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:41 2015 +0200"
      },
      "message": "lib/vty: add vty_stdio at-close hook\n\nThis is intended to be used for either \"exit on close\", \"fork on close\"\nor \"reopen vty on close\" functionality for the stdio vty.  Which of\nthese options to take depends on the context, the use case right now is\ntest programs exiting on EOF.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ba53a8fdecef07577dcc4109e5c82bb124d49c58",
      "tree": "82b3cd36a4812e4f34baaeac106bb28ad0f49bb8",
      "parents": [
        "ba5dc5ebb4dba56cb3a64acc21e71aa34df375d9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 11:04:46 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:40 2015 +0200"
      },
      "message": "lib/vty: put stdin in raw mode for vty\n\nThe interactive CLI actually works just fine, if we just put the\nterminal in raw mode to get keystrokes as they come.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ba5dc5ebb4dba56cb3a64acc21e71aa34df375d9",
      "tree": "af180446cdaaa0bdab5171630249fd1db9fd5b86",
      "parents": [
        "4715a53b4d390e72a06c864a6a505971841e3dc9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Thu May 30 16:33:45 2013 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:40 2015 +0200"
      },
      "message": "lib/vty: add vty_stdio()\n\nthis introduces a new public/API function to the vty code for opening a\nVTY on stdin/stdout.  Intended for unrestricted use by the individual\ndaemons, i.e. \"offical API\".\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4715a53b4d390e72a06c864a6a505971841e3dc9",
      "tree": "a7618f437bd55b6695c9f8e4b03a252a0513f6d5",
      "parents": [
        "ee53c8b9f7979c79beada960746ca35046016a45"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Thu May 30 16:31:49 2013 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:40 2015 +0200"
      },
      "message": "lib/vty: add separate output fd support to VTYs\n\nto be used with stdin/stdout terminals, this adds support for writing to\na different FD than we\u0027re reading from.  Also fixes error messages from\nconfig load being written to stdin.\n\n[v2: fixed config write]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a91a3bac14976c04bf22b20c7e4bada787ec79b1",
      "tree": "1c16b21c785b22c4f7c093e80dcf2c2af20243d1",
      "parents": [
        "3cf4053a9e832408fad33a8246ecbd189f23a956"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 09:06:51 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:01 2015 +0200"
      },
      "message": "vtysh: don\u0027t use \u0027\\0\u0027 as NULL\n\nfor some reason, the vty code was using \u0027\\0\u0027 in place of NULL.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "6d6df30386423518b5daef93c2f047b4140f85f4",
      "tree": "7da3226d3276e019c49a4b4a673911a85297ecc7",
      "parents": [
        "0f048b90b5d6e4bd185913945b68dd254126eb9f"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Jun 28 21:12:37 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Feb 14 19:18:49 2015 +0100"
      },
      "message": "build: remove INRIA, NRL and MUSICA IPv6 quirks\n\nValar dohaeris.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nAcked-by: Greg Troxel \u003cgdt@ir.bbn.com\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\nAcked-by: Paul Jakma \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "42e3078a1e4a0bbb033351ad5a65729a17c1fa19",
      "tree": "8b9a3ae347e5a03a3d938a905fc54c1ad365ef30",
      "parents": [
        "3e92c456b01bb9364a0e68e0124c9ff36edc0b4b"
      ],
      "author": {
        "name": "Everton Marques",
        "email": "everton.marques@gmail.com",
        "time": "Wed Nov 18 17:19:43 2009 -0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Feb 04 06:07:52 2015 +0100"
      },
      "message": "[pim] Clean-up\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": "ea55500409651b0f8fd2c8a02fdbf245acc96dd8",
      "tree": "74f195200f595ae96363e007103e77654ace3f4d",
      "parents": [
        "d4a8607d12e1d3f655055647f1633ec154685545"
      ],
      "author": {
        "name": "Steve Hill",
        "email": "quagga@cheesy.sackheads.org",
        "time": "Tue Jul 28 16:36:14 2009 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Sep 19 22:14:54 2014 +0100"
      },
      "message": "lib: Improve error reporting from broken config files\n\n* command.h: (config_from_file) Add variable to interface for line\n      number reporting.\n    * command.c: (config_from_file) Set \u0026 increment \u0027line_num\u0027 while parsing.\n    * vty.c: (vty_read_file) Report parse errors in the correct order to\n      stderr, with added line numbers.\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": "cd40b329a2e4da882bcad0431c048c876bbeafbd",
      "tree": "cfbdec5a7559c6d3e56766797896a18809aa1746",
      "parents": [
        "e712d0e3667ffad8109ef8bce3ce01927ee95bb7"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Mon Sep 30 12:27:51 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 01 20:21:41 2014 +0200"
      },
      "message": "lib/command.c: rewrite command matching/parsing\n\nAdd support for keyword commands.\n\nIncludes new documentation for DEFUN() in lib/command.h, for preexisting\nfeatures as well as new keyword specification.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a11e012e8661629d665e992e765741a5eaa7d017",
      "tree": "d6967d9c5044f8c924aa2f4b62bac8e3bda358e2",
      "parents": [
        "b52aef18a9f3acc8b24ab5c2631dc574b8e2ec70"
      ],
      "author": {
        "name": "Remi Gacogne",
        "email": "rgacogne-github@coredump.fr",
        "time": "Sun Sep 08 13:48:34 2013 +0000"
      },
      "committer": {
        "name": "Vincent JARDIN",
        "email": "vincent.jardin@6wind.com",
        "time": "Tue Feb 11 10:28:03 2014 +0100"
      },
      "message": "security: Fix some typos and potential NULL-deref\n\nThis patch against the git tree fixes minor typos, some of them possibily\nleading to NULL-pointer dereference in rare conditions.\n\nSigned-off-by: Remi Gacogne \u003crgacogne-github@coredump.fr\u003e\nSigned-off-by: Joachim Nilsson \u003ctroglobit@gmail.com\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "677bcbbf153fe73e57cb44f668977cbd26661fd4",
      "tree": "545636b73b23f02c3ec13261c71ec3058cf089b7",
      "parents": [
        "b68da446e977f8069fb72bce73402e2234ffc1d9"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Wed Feb 27 13:47:23 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 09 22:35:29 2013 +0200"
      },
      "message": "lib/vty: register vtysh socket in server socket vector (BZ#754)\n\nRegister the vtysh socket in Vvty_serv_thread so it will be\ncorrectly closed on vty_reset instead of being leaked.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d227617a972bb20a974be68bea5032e692a0970f",
      "tree": "550ab426e690a34ffe8955eeccf2c93a616adef2",
      "parents": [
        "0c5ed3ed00f630ae95dc2dfd4b5a938683e2a99e"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Tue Apr 10 16:57:23 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Wed May 02 17:03:27 2012 +0200"
      },
      "message": "lib: remove last uses of sockunion_su2str()\n\nUse of this function is prone to memory leaks.\n\nThis fixes a memory accounting bug for vty denied connections.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\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": "9206f9ecd5526778bf449bbb12f056d681d3b040",
      "tree": "cd11853fe47a30bb2a28838f6ad8f8d49300b4fa",
      "parents": [
        "b48cebbba0dc01ad7d1fbd7cbcc39a11e1ae972d"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Sun Dec 18 19:43:40 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sun Dec 18 20:21:21 2011 +0400"
      },
      "message": "fix set never used warnings\n\n(This patch was modified to leave calls to stream_getl() in place, they\nare necessary for the stream\u0027s internal pointer to advance to the\ncorrect position. -- Denis)\n\nSigned-off-by: Denis Ovsienko \u003cinfrastation@yandex.ru\u003e\n\nFix gcc warnings about varables that are set but never used.\n\n* bgpd/bgp_attr.c\n  * cluster_unintern(): ret\n  * transit_unintern(): ret\n  * bgp_attr_default_intern(): attre\n  * bgp_mp_reach_parse(): rd_high, rd_low\n* bgpd/bgp_route.c\n  * bgp_announce_check_rsclient(): bgp\n* bgpd/bgp_zebra.c\n  * zebra_read_ipv4(): ifindex\n  * zebra_read_ipv6(): ifindex\n* bgpd/bgpd.c\n  * bgp_config_write_peer(): filter\n* lib/distribute.c\n  * distribute_list_all(): dist\n  * distribute_list(): dist\n  * distribute_list_prefix_all(): dist\n  * distribute_list_prefix(): dist\n* lib/if_rmap.c\n  * if_rmap(): if_rmap\n* lib/vty.c\n  * vty_accept(): vty\n* lib/zclient.c\n  * zclient_read(): ret\n* zebra/irdp_interface.c\n  * if_group(): zi\n* zebra/rt_netlink.c\n  * kernel_read(): ret, sock\n"
    },
    {
      "commit": "ca0512692156d5bbb902523d2f123fc89dbec1ab",
      "tree": "6dd0206cb175c3e790023f9e5d5d755b57181b0d",
      "parents": [
        "e0ca5fde7be5b5ce90dae78c2477e8245aecb8e9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Sun Oct 04 16:21:49 2009 +0200"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 19:23:38 2011 +0400"
      },
      "message": "lib: add sockopt helper for setting IPV6_V6ONLY and use it\n\ngetaddrinfo returns a list of socket parameters for listening. it\nwill contain both IPv4 and IPv6 listening sockets. unless we use\nIPV6_V6ONLY on the IPv6 ones, only the socket listed first will\nwork. if the IPv4 one came first, the IPv6 one would get an\n\"Address in use\" error.\n\nthis functionality was already present for bgpd and its listening\nsockets. as it is needed for vtys as well, make it a common helper.\n\nConflicts:\n\n\tlib/sockunion.c\n"
    },
    {
      "commit": "46901400a3401a4a6caa40435241b4546bb2a5c5",
      "tree": "797a251402d8b288835078ee2da4228dfc319d53",
      "parents": [
        "075e12f57d6c0b115cd177c7b244d9810460e3ff"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Dec 10 17:19:09 2009 +0000"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Dec 07 01:23:48 2011 +0400"
      },
      "message": "vty_serv_sock_family unused\n\nIf the vty_serv_sock_addrinfo is being used, then vty_serv_sock_family\nis unsed. Fix by adjusting ifdef/else/endif\n"
    },
    {
      "commit": "b830c89a4532819a78c251c559566767b89ee5ac",
      "tree": "ee399053b3d043cdbb8d14f18da6472fe77649f2",
      "parents": [
        "b16793870794919ecc34138bdc51703cc3f409ca"
      ],
      "author": {
        "name": "Nico Golde",
        "email": "nion@debian.org",
        "time": "Sun Aug 01 15:24:35 2010 +0200"
      },
      "committer": {
        "name": "Greg Troxel",
        "email": "gdt@ir.bbn.com",
        "time": "Fri Sep 17 13:36:44 2010 -0400"
      },
      "message": "lib/vty.c: add missing format string when printing out motd message\n\nSigned-off-by: G.Balaji \u003cbalajig81@gmail.com\u003e\n"
    },
    {
      "commit": "78e6cd98dd88393d0863388caf37dae45435db7a",
      "tree": "3c1e57265ea8f54055eb67b3ceb147da90920e0d",
      "parents": [
        "64bf3ab7291cc5c39c5add0dc1a7de447914248b"
      ],
      "author": {
        "name": "heasley",
        "email": "heas@shrubbery.net",
        "time": "Mon Dec 07 16:41:14 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Dec 07 16:41:14 2009 +0300"
      },
      "message": "lib: log source of vty connections (bug #566)\n\nheasley: I\u0027ve used this for a while to track usage.\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": "62687ff1cd3d4460cdbd4b0fbf1e3298fe277ad2",
      "tree": "6bea5c1cf07d9d702c95fabe356fcec418b91398",
      "parents": [
        "b38309a4ee831a440ef78f8a27db584f2f8e8276"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sat Aug 23 14:27:06 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sat Aug 23 14:27:06 2008 +0100"
      },
      "message": "[vty] Add support for a \u0027restricted mode\u0027 with anonymous vty connections\n\n\t* lib/command.h: Add a RESTRICTED_NODE, intended for use with\n\t  anonymous, \u0027no login\u0027 vtys, to provide a subset of \u0027view\u0027 mode\n\t  commands.\n\t* lib/command.c: Add RESTRICTED_NODE bits, nothing special, just\n\t  following VIEW_NODE.\n\t* lib/vty.c: (vty_auth) enable authentication should fall back to\n\t  restricted/view node as appropriate.\n\t  (vty_create) init vty\u0027s to restricted/view node as appropriate,\n\t  for the \u0027no login\u0027 case.\n\t  (vty_{no_,}restricted_mode_cmd) config commands to enable\n\t  \u0027anonymous restricted\u0027 in vty configuration.\n\t  (vty_config_write) \u0027anonymous restricted\u0027 config.\n\t  (vty_init) Install some commands to restricted mode, and the\n\t  \u0027anonymous restricted\u0027 config commands into VTY_NODE.\n\t* bgpd/*.c: Install some of the safe(r) BGP commands into\n\t  \u0027restricted mode\u0027, i.e. lookup commands of non-sensitive data.\n\t  Useful with looking-glass route-servers.\n"
    },
    {
      "commit": "7f794f2bb079c1a5bb0fdebb815921c168c00e90",
      "tree": "7107c63dc002db8b76fc1d6b6e3dea0ca25a035e",
      "parents": [
        "fe86b484e2303103107a6ec7fc02e4e0acaf31c7"
      ],
      "author": {
        "name": "Roy",
        "email": "quagga@de.vio.us",
        "time": "Wed Aug 13 17:27:38 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:57 2008 +0100"
      },
      "message": "[vty] Allow delete during password entry\n\n2008-08-13 roy \u003cquagga@de.vio.us\u003e\n\n\t* lib/vty.c: (vty_delete_char) move check for authentication\n\t  down a bit, so we do the delete, but still not re-write of line.\n\nSigned-off-by: Paul Jakma \u003cpaul@quagga.net\u003e\n"
    },
    {
      "commit": "6f0e3f6e17687eb25b7b77c4fdc8324837d4700f",
      "tree": "8a94d9212060f0f2ee7cbd0079c2687eed7348dc",
      "parents": [
        "08d3d5b398ae81de7659509f159e814d1bbd4375"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 10 02:38:51 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 10 02:38:51 2007 +0000"
      },
      "message": "[autoconf] bugs 162,303,178: Fix \u0027present but can not be compiled\u0027 warnings\n\n2007-05-09 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac: sys/conf.h depends on sys/param.h, at least on\n\t  FBSD 6.2.\n\t  (bug #363) Should check for in_pktinfo for IRDP\n\n2006-05-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac: General cleanup of header and type checks, introducing\n\t  an internal define, QUAGGA_INCLUDES, to build up a list of\n\t  stuff to include so as to avoid \u0027present but cant be compiled\u0027\n\t  warnings.\n\t  Misc additional checks of things missing according to autoscan.\n\t  Add LIBM, for bgpd\u0027s use of libm, so as to avoid burdening\n\t  LIBS, and all the binaries, with libm linkage.\n\t  Remove the bad practice of using m4 changequote(), just\n\t  quote the []\u0027s in the case statements properly.\n\t  This should fix bugs 162, 303 and 178.\n\t* */*.{c,h}: Update all HAVE_* to the standard autoconf namespaced\n\t  HAVE_* defines. I.e. HAVE_SA_LEN -\u003e HAVE_STRUCT_SOCKADDR_SA_LEN,\n\t* bgpd/Makefile.am: Add LIBM to bgpd\u0027s LDADD, for pow().\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": "9d0a3260b2d1b57b7edfd3f72885d861883d4621",
      "tree": "019901060c5b0b34154b084e9ae551af33319a6d",
      "parents": [
        "74542d730198a37a872b7114643e29e99c551bcf"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Jul 11 00:06:49 2006 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Jul 11 00:06:49 2006 +0000"
      },
      "message": "[lib] Do not call vty_close in vty_log_out to avoid possible free memory access\n\n2006-07-10 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.c: (vty_log_out) Do not call vty_close, because this could\n\t  result in a parent function\u0027s accessing the freed memory.\n\t  Instead, set status VTY_CLOSE and call shutdown(vty-\u003efd, SHUT_RDWR).\n\t  And add a comment on vty_close.\n"
    },
    {
      "commit": "74542d730198a37a872b7114643e29e99c551bcf",
      "tree": "0b224588a9579f45cda632ac9e33c783405824a3",
      "parents": [
        "1f2c2743ac188b909114a1bf054a9a41a0cd5635"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Mon Jul 10 18:09:42 2006 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Mon Jul 10 18:09:42 2006 +0000"
      },
      "message": "[lib] Fix infinite recursion for errors on vtys with terminal monitor enabled\n\n2006-07-10 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.c: (vty_log_out, vty_read, vty_flush, vtysh_flush, vtysh_read)\n\t  After an I/O error, must set vty-\u003emonitor to 0 before calling\n\t  zlog_warn, otherwise an infinite recursion could occur\n\t  (since zlog_warn triggers a message to be written to the vty,\n\t  and that in turn triggers another error message when it fails, etc.).\n"
    },
    {
      "commit": "08942da588b78f41916ebd6c75fa668b18160ee7",
      "tree": "bca0de6933e8146751a88870e3b0798983837b4e",
      "parents": [
        "27b472533bc8bb0fdb37dcda7596c385d3b9f414"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Mon Jul 03 20:58:29 2006 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Mon Jul 03 20:58:29 2006 +0000"
      },
      "message": "[debug] Debug messages to terminal vty sessions should include timestamps\n\n2006-07-03 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.c: (vty_log_out) Debug messages to terminal vty sessions\n\t  should include timestamps.\n"
    },
    {
      "commit": "a4b303038363185f60dfef7023cb02715a9a4315",
      "tree": "1eea12d93c580da94af435666428a7a02e67da8e",
      "parents": [
        "d09552d0c7d389f83c3833bf82f7a97da37007da"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun May 28 08:18:38 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun May 28 08:18:38 2006 +0000"
      },
      "message": "[lib] vty_log shouldn\u0027t crash if called when vty isn\u0027t initiliased\n\n2006-05-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* vty.c: (vty_log/vty_log_fixed) dont crash if called when vty\n\t  hasn\u0027t been initiliased.\n"
    },
    {
      "commit": "d16e04335968ea05fda60cec01b48df8c345a8ce",
      "tree": "9ae64651811fa1dfbaba9dc4d114c0a72ace2a55",
      "parents": [
        "0b26f81bf9e81be0f65787c48061709427c70d10"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon May 15 10:56:46 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon May 15 10:56:46 2006 +0000"
      },
      "message": "[lib] CID #39, Fix the vty completion leak-fix to only free when desired\n\n2006-05-13 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* vty.c: (vty_describe_command) CID #39 fix was too hasty, just\n\t  cause it /can/ leak doesn\u0027t mean it always will have, check\n\t  first.\n"
    },
    {
      "commit": "2fe8aba3a09b3e2a64ee1861d8eeb389efaf1eb0",
      "tree": "f2c18e4f6c17430fccf12efdc76a9e9e6041e2ef",
      "parents": [
        "d2519962b71b512eb5fd55a378f8ef748d17c30f"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri May 12 23:22:01 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri May 12 23:22:01 2006 +0000"
      },
      "message": "[lib] CID #39, fix leak in error path, vty_describe_command\n\n2006-05-12 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* vty.c: (vty_describe_command) fix leak of describe vector in\n\t  error path, CID #39.\n"
    },
    {
      "commit": "789f78ac5a5bf1c22c9c053c883f60d45761e89b",
      "tree": "ff7e4a00e6ff72fc3f15c8cd648a34f9c0160f34",
      "parents": [
        "7d0b0c4b7f510178a8960b0e00368be017ed5a08"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jan 17 17:42:03 2006 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jan 17 17:42:03 2006 +0000"
      },
      "message": "[lib/vty] Add \u0027no terminal monitor\u0027 alias\n\n2006-01-17 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* vty.c: (no_terminal_monitor_cmd) New ALIAS for\n\t  terminal_no_monitor, in the more normal negating format,\n\t  to be kind to my fingers.\n\t  (vty_init) install new ALIAS.\n"
    },
    {
      "commit": "f80a016fbd5ba51dc08412d7fd0794b51223c978",
      "tree": "6be9f97cfb52681d692c2c40fb3e4ffe47e1ac23",
      "parents": [
        "6083e1f82ce3a33d9929dea8c64cbc5ffe486000"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Thu Dec 29 16:03:32 2005 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Thu Dec 29 16:03:32 2005 +0000"
      },
      "message": "2005-12-29  Greg Troxel  \u003cgdt@fnord.ir.bbn.com\u003e\n\n        * vty.c (vty_hello): add cast to quiet lint (from David Young)\n\n(patch-lint)\n"
    },
    {
      "commit": "05865c90ab0bc95b8ca1a54c794809891666cdce",
      "tree": "885eb032e62c4acd4706e27c24c7bc49aa259899",
      "parents": [
        "0241684ea77e8aa20ad2cb3903589559f4a7b009"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 26 05:49:54 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 26 05:49:54 2005 +0000"
      },
      "message": "2005-10-26 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: Use MTYPE_HOST, MTYPE_STRVEC. Some other fixups,\n\t  including fixing some likely leaks in config_write_file.\n\t* vty.c: memory macro usage fixes.\n\t  (vty_read_config) fix leak where relative config file is\n\t  specified.\n"
    },
    {
      "commit": "fbf5d033041e406ecefd27c2deebf5a4953d1155",
      "tree": "e9173ab5e05fc86e95f325d2cb2a7a123eb33327",
      "parents": [
        "3fdb2dd9dd8b4ab3517896092dd1b677d191adf9"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Sep 29 11:25:50 2005 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Sep 29 11:25:50 2005 +0000"
      },
      "message": "2005-09-29 Alain Ritoux \u003calain.ritoux@6wind.com\u003e\n\n    * lib/filer.c: show protocol name in filter_show()\n    * lib/plist.c: show protocol name in vty_show_prefix_entry()\n    * routemap.c: show protocol name in vty_show_route_map_entry()\n    * lib/vty.c: in vty_command(), show protocol name if command unknown\n\n    * zebra/zserv.c: Always provide distance fo route add\n\n    * ripd/rip_snmp.c: rip2IfConfReceive() sends values in conformance\n      with RFC. Also PeerDomain is now set to a STRING type.\n    * ripd/ripd.h: rip_redistribute_add() API includes metric and distance\n    * ripd/ripd.c: rip_redistribute_add() API i.e. stores metric and distance\n      Now allows a RIP-route to overcome a redistributed route coming\n      from a protocol with worse (higher) administrative distance\n      Metrics from redistribution are shown in show ip rip\n    * ripd/rip_zebra.c: adapt to the rip_redistribute_add() API, i.e.\n      provide distance and metric\n    * ripd/rip_interface.c: adapt to the rip_redistribute_add() API\n    * ripd/rip_routemap.c: no RMAP_COMPILE_ERROR on (metric \u003e 16) usage\n      rather a CMD_WARNING, because set metric ius shared with other\n      protocols using larger values (such as OSPF)\n      The match metric action takes first external metric if present\n      (from redistribution) then RIP metric.\n"
    },
    {
      "commit": "1e83659026e5b9c5876273c83e86fd229dd98c88",
      "tree": "cad15dd7ea31d3c0e18f1c0cd868168a3391e01e",
      "parents": [
        "b40d939b477a08d79dbee947aea42ac652090f85"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Aug 22 22:39:56 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Aug 22 22:39:56 2005 +0000"
      },
      "message": "2005-08-22 Hugo Santos \u003chsantos@av.it.pt\u003e\n\n\t* command.h: (enum node_type) Add BGP_IPV6M_NODE\n\t* command.c: (node_parent) Handle BGP_IPV6M_NODE node\n\t  (config_exit, config_end) ditto\n\t* vty.c: (vty_end_config) Handle BGP_IPV6M_NODE node\n"
    },
    {
      "commit": "8b70d0b04f6bba2f30827d71084dd74fd00808b3",
      "tree": "245969be7b29246bcb5ca39fc6661f0aeea7dd75",
      "parents": [
        "3df537822f594ffefe4d5e121c0b2430c9c12806"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Apr 28 01:31:13 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Apr 28 01:31:13 2005 +0000"
      },
      "message": "2005-04-27 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\tAdd wall-clock timing statistics to \u0027show thread cpu\u0027 output.\n\t* thread.h: Define struct rusage_t to contain wall-clock time\n\t  and cpu time.  Change GETRUSAGE macro to collect both pieces\n\t  of data.  Make appropriate changes to struct cpu_thread_history\n\t  to track CPU time and real time.  Change proto for\n\t  thread_consumed_time to return real and cpu time elapsed.\n\t  And declare a new global variable \u0027struct timeval recent_time\u0027.\n\t* thread.c (struct timeval recent_time): New global timestamp variable.\n\t  (timeval_adjust): If timeout is negative, set to 0 (not 10\n\t  microseconds).  And remove upper bound of 1,000,000 seconds, since\n\t  this does not seem to make any sense (and it breaks\n\t  funcname_thread_add_timer_timeval).\n\t  (timeval_cmp): Should return long, not int.\n\t  (vty_out_cpu_thread_history): Show CPU time and real time.\n\t  (cpu_record_hash_print): Calculate totals for CPU and real time.\n\t  (cpu_record_print): Change \u0027show thread cpu\u0027 title to show CPU and\n\t  real time.\n\t  (thread_timer_remain_second): Put current time in global recent_time.\n\t  (funcname_thread_add_timer_timeval): Fix assert.  Replace 2-case\n\t  switch assignment with a ternary expression.  Use global recent_time\n\t  variable.  Fix use of timeval_adjust (previously, the value was not\n\t  actually being adjusted).\n\t  (thread_cancel): Add missing \"break\" statement in case\n\t  THREAD_BACKGROUND.\n\t  (thread_timer_wait): Use global recent_time value instead of calling\n\t  gettimeofday.  And there\u0027s no need to check for negative timeouts,\n\t  since timeval_subtract already sets these to zero.\n\t  (thread_timer_process): Timers are sorted, so bail out once we\n\t  encounter a timer that has not yet popped.  And remove some\n\t  extraneous asserts.\n\t  (thread_fetch): Do not process foreground timers before calling\n\t  select.  Instead, add them to the ready list just after the select.\n\t  Also, no need to maintain a count of the number of ready threads,\n\t  since we don\u0027t care how many there are, just whether there\u0027s\n\t  one at the head of the ready list (which is easily checked).\n\t  Stick current time in global variable recent_time to reduce\n\t  the number of calls to gettimeofday.  Tighten logic for\n\t  calculating the select timeout.\n\t  (thread_consumed_time): Now returns real time and puts the elapsed\n\t  cpu time in an additional argument.\n\t  (thread_should_yield): Use real (wall-clock) time to decide whether\n\t  to yield.\n\t  (thread_call): Maintain CPU and real time statistics.\n\t* vty.c (vty_command): For slow commands, show real and cpu time.\n"
    },
    {
      "commit": "924b9229717b749e303f3fb161616bebf53b5cdc",
      "tree": "4788cd7cdc18bfc1cd12916ba506c091e9d73fb8",
      "parents": [
        "dc830cbfac8dd9633e070550359a5d6f8dac8fe5"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 16 17:11:24 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 16 17:11:24 2005 +0000"
      },
      "message": "2005-04-16 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* configure.ac: Added AC_ARG_ENABLE(time-check).  By default,\n\t  warning messages will now be printed for threads or commands that take\n\t  longer than 5 seconds, but this configure argument can be used\n\t  to disable the checks or change the threshold.\n\t* thread.h (thread_consumed_time): Declare new function to calculate\n\t  elapsed microseconds.\n\t* thread.c (thread_consumed_time): Must be global not static so we\n\t  can call it from lib/vty.c:vty_command.\n\t  (thread_should_yield): Surround with `#if 0\u0027 to make clear that this\n\t  function is not currently being used anywhere.\n\t  (thread_call): If CONSUMED_TIME_CHECK is defined, print a CPU HOG\n\t  warning message if the thread takes more than CONSUMED_TIME_CHECK\n\t  microseconds.\n\t* vty.c (vty_command): If CONSUMED_TIME_CHECK is defined, print a CPU\n\t  HOG warning message if the command takes more than CONSUMED_TIME_CHECK\n\t  microseconds.\n"
    },
    {
      "commit": "926fe8f1fce88d0889e47a9f5c6d78c6bc11f3f6",
      "tree": "78e9dc040253454b518a1a7bab6468a2cbceeb89",
      "parents": [
        "d66a7b56634f88181dd2dd23706c30bf23366424"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 08 18:50:40 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 08 18:50:40 2005 +0000"
      },
      "message": "2005-04-08 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.c: (vty_log_fixed) Use casts to (void *) to try to eliminate\n\t  compiler warnings when assigning a (const char *) value to\n\t  struct iovec iov_base.\n"
    },
    {
      "commit": "3d1dc85765816a92f06e0b11f52411dac0f8abae",
      "tree": "d20333a4ddbc271e11998834a4fdbc0e3acd719d",
      "parents": [
        "5b0875287206a0ac1ebe1dca1f6235b8f3df1764"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Apr 05 00:45:23 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Apr 05 00:45:23 2005 +0000"
      },
      "message": "2004-04-05 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* lib/vty.c: Improve logging of failures to open vty socket(s).\n\t  See bugid #163.\n\t* zebra/zserv.c: print more helpful errors when we fail to successfully\n\t  bind and listen on zserv socket. Closes bugzilla #163.\n"
    },
    {
      "commit": "55468c86040081320f557b696e509b76ddfd6c83",
      "tree": "3ee726f155f8776d4a220997681d14c0b09addd0",
      "parents": [
        "909a215508fd42473fcbe4f5292a59404e5473af"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 20:19:01 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 20:19:01 2005 +0000"
      },
      "message": "2005-03-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global) update all c files to match the lib/vector.h rename of\n\t  (struct vector).active to max, and vector_max macro to\n\t  vector_active.\n\t* lib/vector.h: Rename to (struct vector).max to slightly less\n\t  confusing active, for the number of active slots, distinct from\n\t  allocated or active-and-not-empty. Rename vector_max to\n\t  vector_active for same reason.\n"
    },
    {
      "commit": "220851816a699d9977702ea2b2501d4ede76e898",
      "tree": "7c7b2a35e838ea6969258ce83f1f56f770972500",
      "parents": [
        "9c5d8562f8d24574ba1f43881d47cbc8ffc62027"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 16:00:12 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 16:00:12 2005 +0000"
      },
      "message": "2005-03-08 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (no_banner_motd_cmd) use XFREE.\n\t* vty.c: (vty_hello) fix the indentation and comment.\n"
    },
    {
      "commit": "b45da6f01612e8ec1938cacfe0ea0ef34ad1afca",
      "tree": "670671d335524f7b44bee3e32bdba1a75aecc7df",
      "parents": [
        "3b0c5d9a56560cfbfb1a8f5b9e6cc71025eb5490"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 15:16:57 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 15:16:57 2005 +0000"
      },
      "message": "2005-03-08 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (banner_motd_file_cmd) use XSTRDUP/XFREE\n\t* vty.c: (vty_hello) suggestions from Andrew, read by line and\n\t  stub out trailling non-printable characters on each line thus\n\t  allowing us to specify VTY_NEWLINE to vty_out.\n"
    },
    {
      "commit": "3b0c5d9a56560cfbfb1a8f5b9e6cc71025eb5490",
      "tree": "a4b9c7506cb74223635135902e0479fda0b46fe2",
      "parents": [
        "c3d26c72982bc95906afb58fb46f1268bc915a3b"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 10:43:43 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 10:43:43 2005 +0000"
      },
      "message": "2005-03-08 Jeroen Massar \u003cjeroen@unfix.org\u003e\n\n\t* vty.c: (vty_hello) display motd file, if set\n\t* command.h: add char *motdfile to struct host\n\t* command.c: (config_write_host) write out motdfile config\n\t  (banner_motd_file_cmd) new command, allow motd to be read from\n\t  file.\n\t  (no_banner_motd_cmd) free motdfile string, if needs be.\n\t  (cmd_init) init (struct host).motdfile. Add new motd file\n\t  commands.\n"
    },
    {
      "commit": "12f6ea2300402c821595297ff0c2c75055e50031",
      "tree": "503bfaf41cd13b637d8ec21034d896347828a9d7",
      "parents": [
        "42a66d7c484f95615e0364c4aa109ce5d095776a"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Mar 07 08:35:39 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Mar 07 08:35:39 2005 +0000"
      },
      "message": "\t* command.c: host.name might be NULL.\n\t* vty.c: Fix fd leak.\n\n\t[backport candidate]\n"
    },
    {
      "commit": "cdb6ee94bc2b9d1b66cfa1adcc5acaccbd648e0f",
      "tree": "e2ddd54488f20a3402ce94fcc4fb337fb883f61c",
      "parents": [
        "5c33349b3efff36a6acd36c6600b61e7cc2dbffc"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 23 15:48:32 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 23 15:48:32 2005 +0000"
      },
      "message": "2005-02-23 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* {vty.h,vty.c}: Remove vty_finish (duplicate of vty_reset).\n\t* isis_main.c: (reload) Call vty_reset instead of vty_finish (both\n\t  functions were exactly the same).\n"
    },
    {
      "commit": "9fc7ebf10b7bb638ddf6d1b4b2d562dd417866fc",
      "tree": "e2e49aa4ea2530be5b86df581ed1adcd37822f3a",
      "parents": [
        "338b3424154af85b0762713796397d3f2345d54f"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 23 15:12:34 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 23 15:12:34 2005 +0000"
      },
      "message": "2005-02-23 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* buffer.h: Make the struct buffer and struct buffer_data structures\n\t  private by moving them inside buffer.c.  Add comments for all\n\t  functions.  Rename buffer_write as buffer_put (to be more consistent\n\t  with the buffer_putc and buffer_putstr functions).  Declare a new\n\t  buffer_write function that is used to write data to a file descriptor\n\t  and/or add it to the buffer queue.  Remove unused function\n\t  buffer_flush_vty_all.  Create a new enum typedef buffer_status_t\n\t  to be used as the return code for all buffer_flush* functions\n\t  and buffer_write.\n\t* buffer.c: The struct buffer and struct buffer_data declarations\n\t  are now private to this file.  In conjunction with that, remove\n\t  some unnecessary fields: struct buffer (alloc, unused_head,\n\t  unused_tail, length), struct buffer_data (prev).\n\t  (buffer_data_new) Removed: functionality incorporated into buffer_add.\n\t  (buffer_data_free) Removed: use a macro BUFFER_DATA_FREE instead.\n\t  (buffer_new) Use calloc instead of malloc + memset(zero).\n\t  Supply an appropriate default size if the specified size is 0.\n\t  (buffer_free) Eliminate code duplication by calling buffer_reset to\n\t  free the contents of the buffer (and remove unused code related\n\t  to unused_head).\n\t  (buffer_empty,buffer_putc,buffer_putstr) Aesthetic change (make more\n\t  compact).\n\t  (buffer_reset) Use macro BUFFER_DATA_FREE.  No need to set\n\t  alloc and length to 0 (these fields have been removed).\n\t  (buffer_add) Fix scope to be static.  Call XMALLOC directly instead\n\t  of calling removed buffer_data_new function.  Simplify the logic\n\t  (since it\u0027s now a singly-linked list instead of doubly-linked).\n\t  (buffer_write) Renamed to buffer_put.  Change to void, since return\n\t  code of 1 was meaningless.  No need to adjust length field, since\n\t  it has been removed.\n\t  (buffer_putw,buffer_flush,buffer_flush_vty_all,buffer_flush_vty)\n\t  Remove unused functions.\n\t  (buffer_flush_all) Rewrite using buffer_flush_available to eliminate\n\t  a possible failure mode if IOV_MAX is less than the number of buffers\n\t  on the queue.\n\t  (buffer_flush_window) Incorporate logic from buffer_flush_vty.\n\t  Log an error message if there is a writev error.\n\t  (buffer_flush_available) Be more paranoid: check for case where\n\t  buffer is already empty.  Use new ERRNO_IO_RETRY macro, and use\n\t  new enum for return codes.  Simplify deletion logic (since it\u0027s\n\t  now a singly-linked list).\n\t  (buffer_write) New function for use with non-blocking I/O.\n\t* vty.h: Replace the struct vty sb_buffer field with a fixed-size\n\t  (5-character) sb_buf field and an sb_len field, since using\n\t  a struct buffer was inappropriate for this task.  Add some useful\n\t  comments about telnet window size negotiation.\n\t* vty.c: Include \u003carpa/telnet.h\u003e (no longer included by zebra.h).\n\t  Remove VTY_OBUF_SIZE (instead use buffer_new default size).\n\t  Make telnet_backward_char and telnet_space_char static const.\n\t  (vty_out) Replace buffer_write with buffer_put.\n\t  (vty_log_out) Check for I/O errors.  If fatal, close the vty session.\n\t  Consolidate 3 separate writes into a single write call.\n\t  (vty_will_echo,vty_command,vty_next_line,vty_previous_line,\n\t  vty_end_config,vty_describe_fold,vty_clear_buf,vty_serv_sock_addrinfo,\n\t  vty_serv_sock_family,vty_serv_un,vty_use_backup_config,exec_timeout,\n\t  vty_config_write,vty_save_cwd) Fix scope to static.\n\t  (vty_new) Let buffer_new use its default buffer size.\n\t  (vty_write) Fix signature: 2nd arg should be const char *.\n\t  Replaced buffer_write with buffer_put.\n\t  (vty_telnet_option) Fix minor bug (window height or width greater than\n\t  255 was broken).  Use sb_buf and sb_len instead of removed sb_buffer\n\t  (which was being used improperly).\n\t  (vty_read) On error, use ERRNO_IO_RETRY to decide whether it\u0027s fatal.\n\t  If the error is fatal, call buffer_reset so vty_close does not attempt\n\t  to flush the data.  Use new sb_buf and sb_len instead of sb_buffer\n\t  to store the SB negotiation string.\n\t  (vty_flush) When vty-\u003elines is 0, call buffer_flush_available instead\n\t  of buffer_flush_window.  Look at the return code from buffer_flush\n\t  to detect I/O errors (and in that case, log an error message and\n\t  close the vty).\n\t  (vty_create) Fix scope to static.  Initialize sb_len to 0 instead\n\t  of creating sb_buffer.\n\t  (vty_accept) Set socket nonblocking.\n\t  (vtysh_accept) Use new set_nonblocking function instead of calling\n\t  fcntl directly.\n\t  (vtysh_flush) New function called from vtysh_read (after command\n\t  execution) and from vtysh_write.  This flushes the buffer\n\t  and reacts appropriately to the return code (by closing the vty\n\t  or scheduling further flushes).\n\t  (vtysh_read) Check whether error is fatal using ERRNO_IO_RETRY.\n\t  If not, just try again later.  Otherwise, call buffer_reset before\n\t  calling vty_close (to avoid trying to flush the buffer in vty_close).\n\t  Fix logic to allow case where a command does not arrive atomically\n\t  in a single read call by checking for the terminating NUL char.\n\t  (vtysh_write) Use new vtysh_flush helper function.\n\t  (vty_close) No need to call buffer_empty, just call buffer_flush_all\n\t  in any case (it will check whether the buffer is empty).\n\t  Do not free sb_buffer (since it has been removed).\n\t  (vty_log_fixed) Use writev instead of write.\n\t* zebra.h: Do not include \u003carpa/telnet.h\u003e, since this is used only\n\t  by lib/vty.c.\n"
    },
    {
      "commit": "6a52d0d155fc8b892e30cdb5e3fbe4c2779bd4cd",
      "tree": "d4bfab8286e497e30c5ebfed099c317a9397c623",
      "parents": [
        "656b4eeec1fb30402ad2001976c05c6f44fafb34"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Jan 30 18:49:28 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Jan 30 18:49:28 2005 +0000"
      },
      "message": "2005-01-30 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* daemon.c: (daemon) Replace perror with zlog_err.\n\t* vty.c: (vty_serv_un) Replace perror with zlog_err.\n\t* ripd.c: (rip_create_socket) Replace perror with zlog_err.\n\t* ioctl.c: (if_ioctl,if_ioctl_ipv6,if_get_flags) Replace perror with\n\t  zlog_err.\n\t* ioctl_solaris.c: (if_ioctl,if_ioctl_ipv6) Replace perror with\n\t  zlog_err.\n"
    },
    {
      "commit": "87d683b071dc7abfb30b666960ec480e64e19ce4",
      "tree": "ec56b3ce34f6871c4b3687681df2b97aa38da57a",
      "parents": [
        "b854038bd03e6c54b46d35bf4e40d0f39e30dfde"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Jan 16 23:31:54 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Jan 16 23:31:54 2005 +0000"
      },
      "message": "\t* command.[ch], vty.c: cmd_execute_command() function must not attempt\n\t  to walk up in the node tree if called from vtysh. Different daemons\n\t  might have commands with same syntax in different nodes (for example\n\t  \"router-id x.x.x.x\" commands in zebra/ospfd/ospf6d daemons).\n\n\t* vtysh.c: Reflect changes in lib. cmd_execute_command() should know\n\t  now that it\u0027s called from vtysh and must not attempt to walk up in\n\t  the node tree.\n\n\t[pullup candidate]\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": "546e20d6754a0a4c6bc48d642b5bfb4a3db6d7c3",
      "tree": "3bd96758136cff028812ede48132ae052d4a55cd",
      "parents": [
        "b3c8c4650216e128189d26755b93f711b5be9327"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 26 13:22:38 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 26 13:22:38 2004 +0000"
      },
      "message": "Remove unused va_list variable that was introduced by mistake in the last patch\nto stdarg handling.\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": "6099b3b56956322567323c11fd698b2328c6826b",
      "tree": "fa537bd0eaa9f7d824f39445eabc928db59050ca",
      "parents": [
        "ae5e24d8678f1e3a60dde58d3382c5ba73d6bb27"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Nov 20 02:06:59 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Nov 20 02:06:59 2004 +0000"
      },
      "message": "2004-11-19 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* global: Replace strerror with safe_strerror.  And vtysh/vtysh.c\n\t  needs to include \"log.h\" to pick up the declaration.\n"
    },
    {
      "commit": "976d8c734bc1568ac05b968954ed3c3dc5796b9a",
      "tree": "f261b02cbea081d22f1de5a426a209532b536940",
      "parents": [
        "5932020bb11c1b5447f4aa4423062f275ab1fa94"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 10 15:40:09 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Nov 10 15:40:09 2004 +0000"
      },
      "message": "Remove unused dont_more variable in vty_flush and add return 0 to vtysh_write.\n"
    },
    {
      "commit": "5a64665039dc98c341fd8d50458ec2a72c5ebbf5",
      "tree": "e89689f085b7b8eed09a0558e2a80dadb4826033",
      "parents": [
        "f3ae74cdf0768d0bd35f26f728f72439f2d8bd6f"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 05 01:25:55 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Nov 05 01:25:55 2004 +0000"
      },
      "message": "2004-11-04 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.h: Remove fields in struct vty that were related to VTY_CONTINUE\n\t  capabilities (that were used only in bgpd/bgp_route.c and are now\n\t  removed).  Also remove some other fields that were not being\n\t  used at all.\n\t* vty.c: (vty_execute) Do not test for obsolete status values VTY_START\n\t  and VTY_CONTINUE.\n\t  (vty_read) Remove calls to vty-\u003eoutput_func since that was part\n\t  of the VTY_CONTINUE infrastructure that has been removed.\n\t  (vty_flush) Remove code to support VTY_START and VTY_CONTINUE.\n\t  (vty_close) Remove code to cancel vty-\u003et_output thread, since that\n\t  thread was never actually used.\n\t* bgp_route.c: Remove all code related to VTY_CONTINUE; this feature\n\t  is deprecated because the output did not represent a single point\n\t  in time.  All output needs to be generated inline and buffered\n\t  by the library code.\n\t  (route_vty_out,route_vty_out_tag,damp_route_vty_out,\n\t   flap_route_vty_out) Remove code to count number of lines of output,\n\t   since this was only useful for VTY_CONTINUE behavior.\n\t  (bgp_show_callback) Removed.\n\t  (bgp_show_table) Remove hooks for VTY_CONTINUE callback support.\n\t  As a result, there\u0027s a new output_arg argument to this function.\n\t  Make function static.\n\t  (bgp_show) Make function static and add a new output_arg argument.\n\t  Change all functions that call bgp_show or bgp_show_table to\n\t  pass the new output_arg argument (that used to be passed inside\n\t  vty-\u003eoutput_arg).\n\t* bgp_mplsvpn.c: Remove declarations of functions defined in\n\t  bgp_route.c; these declarations belong in bgp_route.h.\n\t* bgp_route.h: Declare 3 global functions used in both bgp_route.c\n\t  and in bgp_mplsvpn.c.\n"
    },
    {
      "commit": "49ff6d9d7a9ef9419dd7aab58ac9f7806e3e1040",
      "tree": "bb9e1d36b5bef56d2e47c69b6bab1ef54cf9696e",
      "parents": [
        "62d8e96a06e664c929a164bfb66b515d1c6877a8"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Nov 04 19:26:16 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Nov 04 19:26:16 2004 +0000"
      },
      "message": "2004-11-04 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.c: Vtysh connections to daemons should use buffering.\n\t  (vty_out) Remove exception for vty_shell_serv, just use buffer_write.\n\t  (vty_new) Increase output buffer size to 4096 rounded up to a\n\t  multiple of pagesize.\n\t  (vtysh_read) After command has been executed and all output buffered,\n\t  call buffer_flush_available and schedule further writes if the\n\t  buffers are not yet empty.\n\t  (vtysh_write) New function to flush output to vtysh when the socket\n\t  is writeable.\n\t  (vty_event) Added new VTYSH_WRITE event for flushing buffers to vtysh\n\t  clients.  Also, should save read thread in vty-\u003et_read so the\n\t  thread can be cancelled in vty_close.\n\t* buffer.h: In struct buffer_data, remove unused \"parent\" field.\n\t  Convert \"unsigned char *data\" to \"unsigned char data[0]\" to save\n\t  a malloc.  Declare new function buffer_flush_available that works\n\t  with non-blocking sockets.\n\t* buffer.c: (buffer_data_new) Use a single malloc now that data is\n\t  a variable-size array at end of structure.\n\t  (buffer_data_free) Just a single free now that data is part of the\n\t  structure.\n\t  (buffer_write) Simplify the logic to make behavior more transparent.\n\t  (buffer_flush) Decrease b-\u003elength as data is written out.\n\t  (buffer_flush_vty_all) Decrease b-\u003elength as buffers are freed.\n\t  (buffer_flush_vty) Decrease b-\u003elength as data is written out.\n\t  (buffer_flush_available) New function to flush non-blocking sockets.\n"
    },
    {
      "commit": "75e15fe4430bf6f9c5bd65b851d771e88bbd2096",
      "tree": "85c8d0038e8fc51702b9e78a6c51b18303022c35",
      "parents": [
        "dccfb1902c5ed8126a304b9ca12830a378933d1f"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Oct 31 02:13:09 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Oct 31 02:13:09 2004 +0000"
      },
      "message": "2004-10-31 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* vty.c: As per Andrew\u0027s suggestions..\n\t  (vty_serv_un) remove flags.\n\t  (vtysh_accept) close socket if we cant set NONBLOCK. Add flags.\n"
    },
    {
      "commit": "dccfb1902c5ed8126a304b9ca12830a378933d1f",
      "tree": "69028a740d83992fa6e5092066d3c92672bcd0ff",
      "parents": [
        "28f79728b6ec46f545fc9978a9238e6d58c7a5d2"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Oct 29 08:29:36 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Oct 29 08:29:36 2004 +0000"
      },
      "message": "2004-10-29 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* vty.c: Move setting of sock to O_NONBLOCK from vty_serv_un\n\t  to vtysh_accept, where sock is the actual fd we wanted to set to\n          O_NONBLOCK, ie the /connected/ vtysh unix socket.\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": "6ad96ea16ee54578391bb4ca88d047ac9d3654fc",
      "tree": "7a09427aaafcc48fe644ed4c2e6804005732b88f",
      "parents": [
        "015253c3f14cacad85a761fae0259ad32f083d4a"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Thu Oct 07 19:33:46 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Thu Oct 07 19:33:46 2004 +0000"
      },
      "message": "Make more strings const.\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": "e7168df4eff0d377621c45deb32cfcfa72e0dd83",
      "tree": "86c4017761ffd8cfdbc16223915a9f537844c4f2",
      "parents": [
        "eef1fe11b89c5ec3c035ff6e4a9acfbc5780b539"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Oct 03 20:11:32 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Oct 03 20:11:32 2004 +0000"
      },
      "message": "Big vtysh cleanup. See changelogs for details.\n"
    },
    {
      "commit": "e473b032b860444b9656cee1654b0120f77b52b1",
      "tree": "8885e2b15c70fb231e775dead3cc30bea18311ce",
      "parents": [
        "c83dcd3f81ed21c72ad50e56a6c515c7eacac44c"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Sep 26 16:08:11 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Sep 26 16:08:11 2004 +0000"
      },
      "message": "Compiler warnings fixes.\n"
    },
    {
      "commit": "c0618de64ca81b9f1f2fd05e43c24f155234b451",
      "tree": "0ebc88399e56746bd72df617aed4f049dc2024f3",
      "parents": [
        "2990460691f1d674180154fd4bcee64d8f745277"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Aug 18 21:52:58 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Aug 18 21:52:58 2004 +0000"
      },
      "message": "2004-08-18 Paul Jakma \u003cpaul@dishone.st\u003e\n\n        * vty.c: (vty_serv_un) set unix vty socket to nonblocking\n          to prevent inadvertent blocking of daemons by use of\n          vtysh. TODO: disentangle manual paging from the buffer_write\n          path so that unix vty can use this path too and be reliable.\n"
    },
    {
      "commit": "320ec10a24d8dd81d0aa011dc92e07877e4e02f8",
      "tree": "867cc29d5981b58bad9392cb7eb471daeb8250a1",
      "parents": [
        "6c0f9a782a7be49de53b5ae00980990d96edbf03"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Jun 20 19:54:37 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Jun 20 19:54:37 2004 +0000"
      },
      "message": "Removing code which looked at current dir for config file before attempting\nto read system one.\n"
    },
    {
      "commit": "02ff83c52592427623db0d8367ca9b3395fa321f",
      "tree": "0aa278809140486f55012a98616106fc995d91e6",
      "parents": [
        "51a8798e8d36dddfdeb6b0bfd01bf32a646e8bb1"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 11 11:27:03 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 11 11:27:03 2004 +0000"
      },
      "message": "2004-06-11 Sowmini Varadhan \u003csowmini.varadhan@sun.com\u003e\n\n        * filter.c: (access_list_remark_cmd) buffer_putstr doesnt need cast\n          to u_char. (ipv6_access_list_remark_cmd) ditto.\n          if.c: ditto\n        * network.c: (readn/writen) pointer arg should be type u_char.\n        * plist.c: needs to include stream.h, not declare stream functions\n          internally.\n          (various) Add static qualifier to internal functions.\n          (prefix_list_type_str) extraneous breaks in switch statement.\n          (ip_prefix_list_description_cmd) buffer_putstr doesnt need cast\n        * stream.h: depends on plist.h and export stream_put_prefix\n        * vty.c: (vty_\u003ctelnet option build functions\u003e) should use\n          unsigned char, telnet options are 0 -\u003e 255.\n        * zclient.c: various u_char\u003c-\u003echar type cleanups.\n        * zebra.h: Having to define CMSG_* can apply to more than just\n          BSDI_NRL.\n        * ripd.c: (rip_distribute_update_all) distribute list hook\n          function pointer prototype requires struct prefix_list * arg.\n          (rip_distribute_update_all_wrapper) update to pass required arg,\n          NULL.\n"
    },
    {
      "commit": "5e4fa1646cafe9e6f8dd78501bea0d2fe1eafdb4",
      "tree": "6f2aa13346f91f0924ada9cb9696589264a90552",
      "parents": [
        "253e9336982599957514ad87610e8cd58822fc7a"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Tue Mar 16 14:38:36 2004 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Tue Mar 16 14:38:36 2004 +0000"
      },
      "message": "2004-03-16 David Young \u003cdyoung@pobox.com\u003e\n\n\t* (many) reference \u003clib/version.h\u003e rather than \"version.h\",\n\tbecause version.h is a generated file and not present in the\n\tsource tree when using objdir builds.\n\n(committed by gdt)\nworks fine with normal builds; didn\u0027t try objdir\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": "3dbf99698a3be2e920871c3127ea089e061a127c",
      "tree": "8652a4b960116adc4cade4652729474ced8e5ba9",
      "parents": [
        "aa593d5e2638566ead1e69381e60639550991ff2"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Mon Dec 22 20:18:18 2003 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Mon Dec 22 20:18:18 2003 +0000"
      },
      "message": "Reorder free(f); unlink(f); to unlink before freeing.\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": "e937253b72b9fa526a56866bd4b827bf05bfb80c",
      "tree": "ca04ee467b851042cd1e1f1462d02048580edb5a",
      "parents": [
        "bb46e94fcccd9ede513bef8d8e22fe5fafdfbd10"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Oct 26 21:36:07 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Oct 26 21:36:07 2003 +0000"
      },
      "message": "2003-10-26 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* lib/vty.c: (vty_read) additional change i had applied to Jay\u0027s\n\t  telnet sub-option processing crash fix was incorrect, revert.\n"
    },
    {
      "commit": "ccc9235e602ebd578fbeba3c98499b3933069d96",
      "tree": "c03f38a5d99e63212a9addf54b35e04e4de34015",
      "parents": [
        "d1724b6555510c22d2df55a9245fe4e6f1b08922"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 22 02:49:38 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 22 02:49:38 2003 +0000"
      },
      "message": "2003-10-22 Paul Jakma \u003cpaul@dishone.st\u003e\n\n        * lib/vty.c: cleanup getcwd again. just pass the buffer in to getcwd.\n"
    },
    {
      "commit": "5b8c1b0d6af736b0633309b4b3490298b9a20742",
      "tree": "9ffdf1bfbb4d4ecc5d3a26e265fbc98c9869ed96",
      "parents": [
        "79ad27982af1440a841298b684d94732ae07d003"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 15 23:08:55 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 15 23:08:55 2003 +0000"
      },
      "message": "2003-10-15 Jay Fenlason \u003cfenlason@redhat.com\u003e\n\n        * lib/vty.c: (vty_telnet_option) Remote DoS exists if a telnet\n          end-sub-negotation is sent when no sub-negotation data has been\n          sent. Return immediately if no sub-negotation is in progress.\n          (vty_read) do not attempt to process options if no sub-negotation\n          is in progress.\n"
    },
    {
      "commit": "79ad27982af1440a841298b684d94732ae07d003",
      "tree": "38396c6632528ac715d098fc15fb7c9496be0ea6",
      "parents": [
        "affe1d9c7f333e0d0373505c4a57994ab1a03822"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 15 22:09:28 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 15 22:09:28 2003 +0000"
      },
      "message": "2003-10-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* lib/vty.c: (vty_save_cwd) dont crash if getcwd fails. try fallback\n          to SYSCONFDIR. Allocate cwd from the stack rather than relying on\n          (non-portable) getcwd() allocation (which we didnt seem to be\n\t  freeing).\n"
    },
    {
      "commit": "7021c425a9f5bd9f62b934124becbaadd961cac0",
      "tree": "cf386f6923eac9f1c665400d0557448c4f5a89e0",
      "parents": [
        "8fc0f64b143ed2155567f5c9f0faad756252146a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jul 15 12:52:22 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jul 15 12:52:22 2003 +0000"
      },
      "message": "2003-07-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n        * lib/version.h: add ZEBRA_URL (unused for now)\n        * lib/vty.c: CMD_ERR_NOTHING_TODO when reading conf file should not\n          be fatal. slight reformating.\n        * ospfd/ospf_zebra.c: ignore reject/blackhole routes if zebra sends\n          these type of routes. probably should be a new type of route to\n          allow daemons to more easily choose whether to redistribute them\n          - rathen than just a flag (eg for reject/blackhole).\n          reorder the is_prefix_default test for ZEBRA_IPV4_ROUTE_DELETE to\n          avoid the inverted test - slightly more readable.\n        * redhat/zebra.spec.in: Add ospfapi port to services file, if\n          with_ospfapi.\n        * zebra/rib.h: Change nexthop types to an enum.\n        * zebra/rt_netlink.c: run it through indent -nut.\n          Add nexthop_types_desc[] descriptive array for nexthop types.\n          (netlink_route_multipath) debug statements indicate which branch\n          they are in and print out nexthop type.\n        * zebra/zebra_rib.c: slight reformatting.\n        * zebra/zebra_vty.c: Pass ZEBRA_FLAG_BLACKHOLE flag to\n          static_add_ipv4() if Null0 route is configured. print out Null0 if\n          STATIC_IPV4_BLACKHOLE route, and ignore flags (shouldnt be\n          possible to set flags from vty) for config and show route.\n"
    },
    {
      "commit": "b21b19c5785487f2ff4a6ce38f45c2e6c35f4363",
      "tree": "c79f90ce7bd798b3f1391010153d9fdf7c7418f0",
      "parents": [
        "0e4f190ebf5a26e4b66fb49cd74ae0ff0c7e0863"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Jun 15 01:28:29 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Jun 15 01:28:29 2003 +0000"
      },
      "message": "2003-06-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* lib/vty.{c,h}: Remove vty layer depending on a \u0027master\u0027 global,\n\t  pass the thread master in explicitly to vty_init. Sort out some\n\t  header dependency problems with lib/command.h\n\t* zebra/: Move globals to struct zebrad. Update vty_init().\n\t* (.*)/\\1_main.c: update call to vty_init().\n"
    },
    {
      "commit": "edd7c245d3a77012abf801da00d5664ebaa5f749",
      "tree": "d4fada229d7980fb751f28c9a979aa88de1a0af0",
      "parents": [
        "a159ed935b580ed99111a185734ddd9c973e7691"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Jun 04 13:59:38 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Jun 04 13:59:38 2003 +0000"
      },
      "message": "2003-06-04 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* Merge of zebra privileges\n"
    },
    {
      "commit": "1921e6f8965701040fe1b4f27619b2d7f3fec254",
      "tree": "9f8dc5d94e1fb11a86585864e45401f552ecf2dd",
      "parents": [
        "68f43848fa0f8ac16c768bafb8891495dcf232ae"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 08:12:36 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 08:12:36 2003 +0000"
      },
      "message": "Allow group access to vty socket.\n"
    },
    {
      "commit": "29db05b4a5d9144e4fbfd7139c27e50902e50fda",
      "tree": "68e81cc092c64ec14f58adb5716ac50d46bfdeb0",
      "parents": [
        "bca84274cf9b525d8a4ae8f06d94dfbfd8af1afb"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 08 20:10:22 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 08 20:10:22 2003 +0000"
      },
      "message": "From: Sergiy Vyshnevetskiy \u003cserg @ vostok.net\u003e\nSubject: [zebra 19019] [PATCH] daemons -A option\n\nWorks now. Patch attached. Not tested for IPv6, but should work there too.\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"
    }
  ]
}
