)]}'
{
  "log": [
    {
      "commit": "a49ad236da5cff707bdb54e14e7852d63ee3c9ea",
      "tree": "7012778d844e3e0fcea3b04e6ed7daff8817ea69",
      "parents": [
        "412008568bddbc9475eafba224d1a1703d6cca97"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 03 13:00:54 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 03 13:00:54 2005 +0000"
      },
      "message": "2005-11-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* memtypes.h: Update auto-built file.\n"
    },
    {
      "commit": "9c4f1c6f10d4770933c0558528a0e59557b96230",
      "tree": "3e5d6c73e9e78b0aa6ed2cc8ffe276f2b19f3548",
      "parents": [
        "484315fd274b3782f72abc95c9796c604e53bcc9"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 03 11:04:07 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 03 11:04:07 2005 +0000"
      },
      "message": "2005-11-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* if.c: (connected_free) use MTYPE for connected label.\n\t  memtypes.c: Add MTYPE_CONNECTED_LABEL\n"
    },
    {
      "commit": "34204aac424f8c29317d863d64f1c3bb4d241a50",
      "tree": "a7ad861d7b3454dbe96b6e7a31d7dbacc4ad24e3",
      "parents": [
        "35a60c2d3c217e3b835821a7f6ea458e2eff44cf"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 03 09:00:23 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 03 09:00:23 2005 +0000"
      },
      "message": "2005-11-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* zebra.h: BSD BYTE_ORDER define isn\u0027t available everywhere,\n\t  define if needs be.\n\t* checksum.h: new file. checksum.c exports in_cksum, provide\n\t  a header for it.\n\t* checksum.c: (in_cksum) callers shouldn\u0027t have to know it uses\n\t  a u_short internally, change to void *.\n\t* Makefile.am: Add checksum.h\n\t* command.h: remove bogus trailling slash.\n\t* md5.c: (general) Update it for the twentieth century. ANSI\n\t  declarations are widely supported now.. Don\u0027t include system\n\t  headers, only include zebra.h. Use POSIX types (the\n\t  alternative is to define u_int64_t in a portable way - rest\n\t  of Quagga needs same cleanup).\n\t  Make endian-conditional code be compiler conditional rather\n\t  than preprocessor conditional, so that breakage gets noticed\n\t  quicker.\n\t* md5.h: POSIX types. Get rid of the odd __P() non-ANSI capable\n\t  compiler compatibility hack.\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": "0241684ea77e8aa20ad2cb3903589559f4a7b009",
      "tree": "2bb64a53f5d8c1091839be9e1afb6e4625828f38",
      "parents": [
        "216565ab68148d3161422c0d73730614bfeccd7c"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 26 05:05:16 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 26 05:05:16 2005 +0000"
      },
      "message": "2005-10-26 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) Cleanup a some calls to XFREE,strdup, etc. to use\n\t  the memory.h macros.\n\t* memtypes.c: Add MTYPE_IF_RMAP_NAME, MTYPE_PQUEUE,\n\t  MTYPE_PQUEUE_DATA and MTYPE_HOST.\n\t* memtypes.h: update auto-built file.\n\t* if_rmap.c: Use MTYPE_IF_RMAP_NAME.\n\t* pqueue.c: Use the two MTYPE_PQUEUE mtypes for allocations.\n"
    },
    {
      "commit": "c188c37caaf589a17b22e9889e63ec96f2f57106",
      "tree": "018d7f024a08c986a5558425ede05590518c9a23",
      "parents": [
        "f9ad937f537df92bf3119686eee97db7b7176674"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Oct 21 02:57:41 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Oct 21 02:57:41 2005 +0000"
      },
      "message": "2005-10-20 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* sockopt.c: (setsockopt_multicast_ipv4) If IP_ADD_MEMBERSHIP\n\t  fails with errno equal to EADDRINUSE, then issue an info\n\t  message and try IP_DROP_MEMBERSHIP followed by IP_ADD_MEMBERSHIP.\n"
    },
    {
      "commit": "24065a3d4a61a136a17996a48df02b0b180bc6f0",
      "tree": "e1e6463a5d56500d94abb74b320bcb6b99d4c6a1",
      "parents": [
        "38d3c163cff92465c94732cb7ecb9761053d2038"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Oct 20 22:28:14 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Oct 20 22:28:14 2005 +0000"
      },
      "message": "2005-10-20 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* memory.c: (show_memory_vty) Omit zero statistics.  Print separators\n\t  only if some non-zero stats have been printed in between.\n\t  (show_separator) New function to print a separator.\n\t  (show_memory_all) Keep track of whether a separator is needed\n\t  between the different memory statistics groups.\n"
    },
    {
      "commit": "5012322ddb0219138ee3583c50fd6e99c5a1d857",
      "tree": "8b6d5f43579428b29c72167ac099fe215ae1d9e9",
      "parents": [
        "eb3da6dfa92be8083bbe1b4436818754be158b93"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Oct 18 20:19:13 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Oct 18 20:19:13 2005 +0000"
      },
      "message": "2005-10-18 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* memtypes.h: Add MTYPE_OSPF_VERTEX_PARENT (to match memtypes.c).\n"
    },
    {
      "commit": "eb3da6dfa92be8083bbe1b4436818754be158b93",
      "tree": "72067c3eb6ec2f5fd1678d555062424f163c6599",
      "parents": [
        "3623814abc4df8435d2fc50697c6d7fc66f21088"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Oct 18 04:20:33 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Oct 18 04:20:33 2005 +0000"
      },
      "message": "2005-10-18 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) SPF memory management cleanup and fix for rare\n\t  double-free bug.\n\t* ospf_spf.h: (struct vertex_parent) New struct to hold parent\n\t  specific data, eg the backlink and the parent vertex pointer,\n\t  and point to the appropriate general struct vertex_nexthop.\n\t  (struct vertex_nexthop) remove parent vertex pointer, so\n\t  this struct can be shared across vertices.\n\t  (struct vertex) rename list child to list children. Remove\n\t  list of nexthops, replace with list of vertex_parents.\n\t* ospf_spf.c: (update_stat) trivial, remove cast from void *.\n\t  (vertex_nexthop_new) remove init of parent - field is gone\n          from struct vertex_nexthop.\n          (ospf_canonical_nexthops_free) Remove the canonical\n          vertex_nexthop memory objects. These are the vertex_nexthops\n          attached to the first level of router vertices from the root.\n          (vertex_parent_new) new function, create a vertex_parent.\n          (vertex_parent_free) ditto, but free it.\n          (ospf_vertex_new) Update to match changes to struct vertex.\n          (ospf_vertex_free) Recursively free a struct vertex and its\n          children. The parent list is used as a reference count.\n          vertex_nexthops must be free seperately, if required.\n          (ospf_vertex_dump) update to match struct vertex changes.\n          Print out backlink of parents too.\n          (ospf_vertex_add_parent) ditto.\n          (ospf_lsa_has_link) update comment.\n          (ospf_nexthop_add_unique) removed, not needed anymore.\n          (ospf_nexthop_merge) ditto.\n          (ospf_spf_consider_nexthop) renamed to ospf_spf_add_parent.\n          Simplified to just create vertex_parent and add it.\n          (ospf_spf_flush_parents) new function, flush out the parent\n\t  list.\n\t  (ospf_nexthop_calculation) Take the relevant route_lsa_link\n\t  as an argument, which simplifies things and removes the need\n\t  for the hack in ospf_nexthop_add_unique - ospf_spf_next\n\t  already knew exactly which link the cost calculated was for.\n\t  Update to match struct vertex changes too.\n\t  (ospf_spf_next) Don\u0027t create a vertex for W unnecessarily, if\n          it\u0027s there\u0027s a vertex already created for W, use it, and\n          hence there\u0027s no need to free it either.\n          Update some manipulation/comparisons of distance to match.\n          Flush the parent list if a lower cost path is found.\n          (ospf_spf_route_free) unused, removed.\n          (ospf_spf_dump) match the struct vertex changes, and dump the\n          ifname if possible.\n          (ospf_spf_calculate) At end of SPF, free the canonical nexthops\n          and call ospf_vertex_free on the root vertex to free the\n\t  entire tree.\n\t* ospf_interface.c: (ospf_vl_set_params) match struct vertex\n          changes.\n        * ospf_route.c: (ospf_intra_route_add) ditto\n          (ospf_route_copy_nexthops_from_vertex) ditto\n\t* memtypes.c: (memory_list_ospf) Add MTYPE_OSPF_VERTEX_PARENT.\n"
    },
    {
      "commit": "f52d13cb2e8e7197934d5f241f88647f9b9d78b8",
      "tree": "b0aa01befc07f57ed47e83ac7dfb383284c49d26",
      "parents": [
        "c05612b9a702d0f49c379c92deb6daab55372aea"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Oct 01 17:38:06 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Oct 01 17:38:06 2005 +0000"
      },
      "message": "2005-10-01 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zebra.h: Declare new functions zebra_route_string() and\n\t  zebra_route_char().\n\t* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New\n\t  functions to map zebra route numbers to strings.\n\t* zebra_vty.c: (route_type_str) Remove obsolete function: use new\n\t  library function zebra_route_string() instead.  Note that there\n\t  are a few differences: for IPv6 routes, we now get \"ripng\" and\n\t  \"ospf6\" instead of the old behavior (\"rip\" and \"ospf\").\n\t  (route_type_char) Remove obsolete function: ues new library function\n\t  zebra_route_char() instead.  Note that there is one difference:\n\t  the old function returned \u0027S\u0027 for a ZEBRA_ROUTE_SYSTEM route,\n\t  whereas the new one returns \u0027X\u0027.\n\t  (vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace\n\t  route_type_str() with zebra_route_string().\n\t  (vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()\n\t  with zebra_route_char().\n\t* bgp_vty.c: (bgp_config_write_redistribute) Use new library function\n\t  zebra_route_string instead of a local hard-coded table.\n\t* ospf6_asbr.c: Remove local hard-coded tables zroute_name and\n\t  zroute_abname. Change the ZROUTE_NAME macro to use new library\n\t  function zebra_route_string().  Remove the ZROUTE_ABNAME macro.\n\t  (ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with\n\t  a call to zebra_route_char(), and be sure to fix the format string,\n\t  since we now have a char instead of a char *.\n\t* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and\n\t  zebra_route_abname.  Note that the zebra_route_name[] table\n\t  contained mixed-case strings, whereas the zebra_route_string()\n\t  function returns lower-case strings.\n\t  (ospf6_zebra_read_ipv6): Change debug message to use new library\n\t  function zebra_route_string() instead of zebra_route_name[].\n\t  (show_zebra): Use new library function zebra_route_string() instead\n\t  of zebra_route_name[].\n\t* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.\n\t  (ospf_redist_string) New function implemented using new library\n\t  function zebra_route_string().  Note that there are a few differences\n\t  in the output that will result: the new function returns strings\n\t  that are lower-case, whereas the old table was mixed case.  Also,\n\t  the old table mapped ZEBRA_ROUTE_OSPF6 to \"OSPFv3\", whereas the\n\t  new function returns \"ospf6\".\n\t* ospfd.h: Remove extern struct message ospf_redistributed_proto[],\n\t  and add extern const char *ospf_redist_string(u_int route_type)\n\t  instead.\n\t* ospf_asbr.c: (ospf_external_info_add) In two messages, use\n\t  ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).\n\t* ospf_vty.c: Remove local hard-coded table distribute_str.\n\t  (config_write_ospf_redistribute,config_write_ospf_distribute): Use\n\t  new library function zebra_route_string() instead of distribute_str[].\n\t* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,\n\t  ospf_redistribute_default_set,ospf_redistribute_check)\n\t  In debug messages, use ospf_redist_string() instead of\n\t  LOOKUP(ospf_redistributed_proto).\n\t* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded\n\t  table str[]. Replace str[] with calls to new library function\n\t  zebra_route_string().\n\t* ripd.c: Remove local hard-coded table route_info[].\n\t  (show_ip_rip) Replace uses of str[] with calls to new library\n\t  functions zebra_route_char and zebra_route_string.\n\t* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded\n\t  table str[].  Replace str[i] with new library function\n\t  zebra_route_string(i).\n\t* ripngd.c: Remove local hard-coded table route_info[].\n\t  (show_ipv6_ripng) Use new library function zebra_route_char() instead\n\t  of table route_info[].\n"
    },
    {
      "commit": "5e4914c31ead7b99eeed73067451367336b21422",
      "tree": "f2c49d5c8182d4ee1b8ad8ca5005fe1223da18c8",
      "parents": [
        "ceacedba227e77156f92f7676b274c48a2817e8f"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Sep 29 16:34:30 2005 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Sep 29 16:34:30 2005 +0000"
      },
      "message": "2005-09-29 Alain Ritoux \u003calain.ritoux@6wind.com\u003e\n\n    * lib/smux.[ch]: allow to retreive global OID (identified by \u003c0\n      namelen).\n    * ospf_ism.c: generate SNMP traps on Interface state change\n    * ospf_nsm.c: generate SNMP traps on Neighbour state change\n    * ospf_snmp.[ch]: support for SNMP traps for interface and neighbours.\n"
    },
    {
      "commit": "ceacedba227e77156f92f7676b274c48a2817e8f",
      "tree": "f362ecc8f6f183347ebe45ab79727b54d2f527a6",
      "parents": [
        "e62178797d0ee5f326fd587b84ee965cf88833e4"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Sep 29 14:39:32 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Sep 29 14:39:32 2005 +0000"
      },
      "message": "2005-09-29 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac: Add the test for Solaris least-privileges. Set\n\t  defines for whether capabilities are supported and whether of\n\t  the linux or solaris variety.\n\t  Add missing-prototypes, missing-declarations, char-subscripts\n\t  and cast-qual warnings to default cflags, cause Hasso enjoys warnings,\n\t  and we really should clean the remaining ones up. (ie isisd..).\n\t* (*/*main.c) Update the zebra_capabilities_t arrays in the various\n\t  daemons to match the changes made in lib/privs.h.\n\t* zebra.h: Solaris capabilities requires priv.h to be included.\n\t* privs.{c,h}: Add support for Solaris Least-Privileges.\n\t  privs.h: Reduce some of the abstract capabilities, which do\n\t  not have rough equivalents on both systems. Rename the net\n\t  related caps to _NET, as they should have been in first\n\t  place.\n\t  (zprivs_terminate) should take the zebra_privs_t as argument so\n\t  that it can update change pointer.\n\t  Add an additional privilege state, ZPRIVS_UNKNOWN.\n\t* privs.c: (various capability functions) Add\n\t  Solaris privileges variants.\n\t  (zprivs_state) Use privs.c specific generic types to\n          represent various capability/privilege related types, so that\n          each can be typedef\u0027d as appropriate on each platform.\n\t  (zprivs_null_state) static added, to hold the state the null\n\t  method should report (should be raised by default, and\n          LOWERED if zprivs_terminate has been called)\n          (zprivs_state_null) Report back the zprivs_null_state.\n          (cap_map) Make it able to map abstract capability to multiple\n          system capabilities.\n          (zcaps2sys) Map to abstract capabilities to multiple system\n          privileges/capabilities.\n          (zprivs_init) move capability related init to seperate\n\t  function, zprivs_caps_init.\n          (zprivs_terminate) ditto, moved to zprivs_caps_terminate.\n          Set the change_state callback to the NULL state, so the\n          user can continue to run and use the callbacks.\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": "c1a03d4774f8ecc30a21267469d48cb2276de48c",
      "tree": "1bf9309bc99e316a5633d18f7724330d8d6fa836",
      "parents": [
        "aa2e32be264710ef208516dfe1661b8148c3eede"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Wed Sep 28 15:47:44 2005 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Wed Sep 28 15:47:44 2005 +0000"
      },
      "message": "2005-09-28 Alain Ritoux \u003calain.ritoux@6wind.com\u003e\n\n    * lib/md5-gnu.h: removed\n    * lib/md5.h: replaces md5-gnu.h\n    * lib/Makefile.am: use correct md5.h\n    * lib/md5.c: import from WIDE\n    * ospfd/ospf_packet.c: use new md5 API\n    * ripd/ripd.c: use new md5 API\n"
    },
    {
      "commit": "75b2dd025af1d839279a21ee4b3035085d17331c",
      "tree": "19435808ccbdc15bc1e19fbe2c6bdb44d2b6a782",
      "parents": [
        "319572cc52267bfd55cca5eaab405df4db27ddaf"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Sep 21 14:06:35 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Sep 21 14:06:35 2005 +0000"
      },
      "message": "2005-09-21 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* memtypes.{c,h}: Add MTYPE_AS_SEG_DATA.\n"
    },
    {
      "commit": "e6a4feb763749ff0c63558db456e617915fd1386",
      "tree": "e348859f9ef281521ad13552e062ea6da44a2248",
      "parents": [
        "96e30387f164148fe47da6d4481283a61d761c97"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Sep 19 09:53:21 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Sep 19 09:53:21 2005 +0000"
      },
      "message": "\t* configure.ac: Test existance of strndup.\n\t* lib/str.[ch]: Add strndup() from glibc.\n"
    },
    {
      "commit": "eb820afe3b53321624317cfa6b426ecae1392f24",
      "tree": "55557a19a1918bdca547c3a3d0e7f6c7802b78b4",
      "parents": [
        "c89c05dd04d097bd8213125a42d67204bb681de5"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Sep 05 11:54:13 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Sep 05 11:54:13 2005 +0000"
      },
      "message": "2005-09-05 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (install_element) be more robust. Eg, cmd_init\n\t  need not have been called, some applications may use other\n\t  library subsystems, which call install_element, without the\n          application wanting commands and hence not calling cmd_init.\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": "0312f0cd92e26d8097145d00dfad4638ed687f02",
      "tree": "0eb8c8b39c1b20cbac4690f85d5b7d4846d78b7e",
      "parents": [
        "01018ce479cce0af61d3797e5200cc340fe6ec0e"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Wed Aug 10 13:20:03 2005 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Wed Aug 10 13:20:03 2005 +0000"
      },
      "message": "2005-08-10  Greg Troxel  \u003cgdt@fnord.ir.bbn.com\u003e\n\n        * getopt.h: Don\u0027t declare getopt (rather than getopt_long), since\n        quagga doesn\u0027t need it.\n        * getopt.c (getopt): Don\u0027t define getopt.\n\n\nFixes build breakage on NetBSD, and seems likely to work on most\nplatforms since it avoids the entire issue of system getopt\ndeclarations and whether they conform to POSIX.2.  Note that this\nchange doesn\u0027t address system getopt_long declarations, but also\ndoesn\u0027t change anything about getopt_long.\n"
    },
    {
      "commit": "7907c6c9d34a4f19dd7d4d8d81c3c8ae5000ee07",
      "tree": "c57450ba246a26d4c37f1c2339b977d8293ee04d",
      "parents": [
        "330009f7b3742462ebd90f9c16f1ab734344b68c"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Jul 26 19:55:31 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Jul 26 19:55:31 2005 +0000"
      },
      "message": "2005-07-26 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\t* prefix.c: (prefix_ipv4_new, prefix_ipv6_new): Call prefix_new\n\t  to allocate the memory to make sure that all struct prefix pointers\n\t  point to objects of the same length (avoids memory overruns\n\t  on struct prefix assignments).\n\t  (prefix_ipv4_free, prefix_ipv6_free): Simply call prefix_free.\n\t  It is interesting to note that these functions are never actually\n\t  called anywhere in the code.  Instead prefix_free was already\n\t  being called directly, despite the previous MTYPE incompatibility.\n\n\t[backport candidate]\n"
    },
    {
      "commit": "330009f7b3742462ebd90f9c16f1ab734344b68c",
      "tree": "9d3ddbf26da3205989e136cd2b3858c65584ef94",
      "parents": [
        "c898775c95a2aad505911eccb6a70a12d4e49f1d"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Jul 26 14:35:37 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Jul 26 14:35:37 2005 +0000"
      },
      "message": "2005-07-26 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* prefix.c: (ip_masklen) While loop should test that \u0027pnt\u0027 pointer is\n\t  in range before dereferencing it.\n\n\t[backport candidate]\n"
    },
    {
      "commit": "510e209d26c6f1a0fd7f7005f05a98ac71ae1832",
      "tree": "2f19320763222efda4a26b46c8b97013400f0e30",
      "parents": [
        "8469bd7552843333f299e0607f0a2efb7ca056f6"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 24 01:20:25 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 24 01:20:25 2005 +0000"
      },
      "message": "2005-06-24 Pawel Worach \u003cpawel.worach@gmail.com\u003e\n\n\t* getopt.h: add further tests for full getopt declaration on\n\t  various systems.\n"
    },
    {
      "commit": "354f3b66355f7b658d4cc5e8681c80326af13ee7",
      "tree": "f74cca8d76ab62803bfae09ed3dded1a95b16c14",
      "parents": [
        "e210cf9fd09c938b92dc1a993b254d8d5a8b312c"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Jun 18 16:55:20 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Jun 18 16:55:20 2005 +0000"
      },
      "message": "2005-06-18 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* memtypes.h: update autobuilt file to match memtypes.c changes\n"
    },
    {
      "commit": "200df115ea0ba6f54151d60fe5e9a7f6948de7c3",
      "tree": "2aedc0af80d2e805cdf2cefd50432423d2871216",
      "parents": [
        "b31b813671d96ea9e96801508442a90f0ef503fa"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Jun 01 11:17:05 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Jun 01 11:17:05 2005 +0000"
      },
      "message": "2005-06-01 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgpd/(general) refcount struct peer and bgp_info, hence allowing us\n\t  add work_queues for bgp_process.\n\t* bgpd/bgp_route.h: (struct bgp_info) Add \u0027lock\u0027 field for refcount.\n\t  Add bgp_info_{lock,unlock} helper functions.\n\t  Add bgp_info_{add,delete} helpers, to remove need for\n\t  users managing locking/freeing of bgp_info and bgp_node\u0027s.\n\t* bgpd/bgp_table.h: (struct bgp_node) Add a flags field, and\n\t  BGP_NODE_PROCESS_SCHEDULED to merge redundant processing of\n\t  nodes.\n\t* bgpd/bgp_fsm.h: Make the ON/OFF/ADD/REMOVE macros lock and unlock\n\t  peer reference as appropriate.\n\t* bgpd/bgp_damp.c: Remove its internal prototypes for\n\t  bgp_info_delete/free. Just use bgp_info_delete.\n\t* bgpd/bgpd.h: (struct bgp_master) Add work_queue pointers.\n\t  (struct peer) Add reference count \u0027lock\u0027\n\t  (peer_lock,peer_unlock) New helpers to take/release reference\n\t  on struct peer.\n\t* bgpd/bgp_advertise.c: (general) Add peer and bgp_info refcounting\n\t  and balance how references are taken and released.\n\t  (bgp_advertise_free) release bgp_info reference, if appropriate\n\t  (bgp_adj_out_free) unlock peer\n\t  (bgp_advertise_clean) leave the adv references alone, or else\n\t  call bgp_advertise_free cant unlock them.\n\t  (bgp_adj_out_set) lock the peer on new adj\u0027s, leave the reference\n\t  alone otherwise. lock the new bgp_info reference.\n\t  (bgp_adj_in_set) lock the peer reference\n\t  (bgp_adj_in_remove) and unlock it here\n\t  (bgp_sync_delete) make hash_free on peer conditional, just in\n\t  case.\n\t* bgpd/bgp_fsm.c: (general) document that the timers depend on\n\t  bgp_event to release a peer reference.\n\t  (bgp_fsm_change_status) moved up the file, unchanged.\n\t  (bgp_stop) Decrement peer lock as many times as cancel_event\n\t  canceled - shouldnt be needed but just in case.\n\t  stream_fifo_clean of obuf made conditional, just in case.\n\t  (bgp_event) always unlock the peer, regardless of return value\n\t  of bgp_fsm_change_status.\n\t* bgpd/bgp_packet.c: (general) change several bgp_stop\u0027s to BGP_EVENT\u0027s.\n\t  (bgp_read) Add a mysterious extra peer_unlock for ACCEPT_PEERs\n\t  along with a comment on it.\n\t* bgpd/bgp_route.c: (general) Add refcounting of bgp_info, cleanup\n\t  some of the resource management around bgp_info. Refcount peer.\n\t  Add workqueues for bgp_process and clear_table.\n\t  (bgp_info_new) make static\n\t  (bgp_info_free) Ditto, and unlock the peer reference.\n\t  (bgp_info_lock,bgp_info_unlock) new exported functions\n\t  (bgp_info_add) Add a bgp_info to a bgp_node in correct fashion,\n\t  taking care of reference counts.\n\t  (bgp_info_delete) do the opposite of bgp_info_add.\n\t  (bgp_process_rsclient) Converted into a work_queue work function.\n\t  (bgp_process_main) ditto.\n\t  (bgp_processq_del) process work queue item deconstructor\n\t  (bgp_process_queue_init) process work queue init\n\t  (bgp_process) call init function if required, set up queue item\n\t  and add to queue, rather than calling process functions directly.\n\t  (bgp_rib_remove) let bgp_info_delete manage bgp_info refcounts\n\t  (bgp_rib_withdraw) ditto\n\t  (bgp_update_rsclient) let bgp_info_add manage refcounts\n\t  (bgp_update_main) ditto\n\t  (bgp_clear_route_node) clear_node_queue work function, does\n\t  per-node aspects of what bgp_clear_route_table did previously\n\t  (bgp_clear_node_queue_del) clear_node_queue item delete function\n\t  (bgp_clear_node_complete) clear_node_queue completion function,\n\t  it unplugs the process queues, which have to be blocked while\n\t  clear_node_queue is being processed to prevent a race.\n\t  (bgp_clear_node_queue_init) init function for clear_node_queue\n\t  work queues\n\t  (bgp_clear_route_table) Sets up items onto a workqueue now, rather\n\t  than clearing each node directly. Plugs both process queues to\n\t  avoid potential race.\n\t  (bgp_static_withdraw_rsclient) let bgp_info_{add,delete} manage\n\t  bgp_info refcounts.\n\t  (bgp_static_update_rsclient) ditto\n\t  (bgp_static_update_main) ditto\n\t  (bgp_static_update_vpnv4) ditto, remove unneeded cast.\n\t  (bgp_static_withdraw) see bgp_static_withdraw_rsclient\n\t  (bgp_static_withdraw_vpnv4) ditto\n\t  (bgp_aggregate_{route,add,delete}) ditto\n\t  (bgp_redistribute_{add,delete,withdraw}) ditto\n\t* bgpd/bgp_vty.c: (peer_rsclient_set_vty) lock rsclient list peer\n\t  reference\n\t  (peer_rsclient_unset_vty) ditto, but unlock same reference\n\t* bgpd/bgpd.c: (peer_free) handle frees of info to be kept for lifetime\n\t  of struct peer.\n\t  (peer_lock,peer_unlock) peer refcount helpers\n\t  (peer_new) add initial refcounts\n\t  (peer_create,peer_create_accept) lock peer as appropriate\n\t  (peer_delete) unlock as appropriate, move out some free\u0027s to\n\t  peer_free.\n\t  (peer_group_bind,peer_group_unbind) peer refcounting as\n\t  appropriate.\n\t  (bgp_create) check CALLOC return value.\n\t  (bgp_terminate) free workqueues too.\n\t* lib/memtypes.c: Add MTYPE_BGP_PROCESS_QUEUE and\n\t  MTYPE_BGP_CLEAR_NODE_QUEUE\n"
    },
    {
      "commit": "8176c19f6104c6fa6bee88618b41719938fb42cc",
      "tree": "8344d38d4578eba51862a265c69cf04d1b6f63d8",
      "parents": [
        "00d252cb5ff21ecc537ab40385316b41622a95e2"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue May 24 09:33:52 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue May 24 09:33:52 2005 +0000"
      },
      "message": "2005-05-24 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* memtypes.h: update this auto-built file. (maybe we should just\n\t  remove it, is GNU awk a terrible dependency to have?)\n"
    },
    {
      "commit": "269d74fdc39a612da8f627bf97628c68d25a16ab",
      "tree": "8add14e852e83369123ee576a995b28f006800d4",
      "parents": [
        "a94feb380df46bdfc742257648c9825e8e7b17c0"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 13:42:46 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 13:42:46 2005 +0000"
      },
      "message": "2005-05-23 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* workqueue.h: Add a WQ_QUEUE_BLOCKED item_status return code,\n\t  to allow a queue function to indicate the queue is not\n\t  ready/blocked - rather than any problem with the item at hand.\n\t  Add a notion of being able to \u0027plug\u0027 and \u0027unplug\u0027 a queue.\n\t  Add helpers to plug/unplug a queue.\n\t  Add a completion callback, to be called when a queue is emptied.\n\t* workqueue.c: (work_queue_new) remove useless list_free.\n\t  (work_queue_schedule) new internal helper function to schedule\n\t  queue, if appropriate.\n\t  (work_queue_add) use work_queue_schedule\n\t  (show_work_queues) Print \u0027P\u0027 if queue is plugged.\n\t  (work_queue_plug) new API function, plug a queue - ie prevent it\n\t  from \u0027drained\u0027 / processed / scheduled.\n\t  (work_queue_unplug) unplug a queue, allowing it to be drained\n\t  / scheduled / processed again.\n\t  (work_queue_run) Add support for WQ_QUEUE_BLOCKED.\n\t  Add comment for RETRY_NOW case.\n\t  Make hysteris more aggresive in ramping up granularity, improves\n\t  performance significantly.\n\t  Add support for calling completion callback when queue is emptied,\n\t  possibly useful for knowing when to unplug a queue.\n"
    },
    {
      "commit": "d4f0960cb23abc7528d7282fa08c68131eae5f93",
      "tree": "8a1bc8eac474c49ca76f27971c65f74fd5a74c89",
      "parents": [
        "d5c925396629ef93cb38c2a63c3ac63911a341a6"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 12:43:34 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 12:43:34 2005 +0000"
      },
      "message": "2005-05-23 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* routemap.c: (rmap_onmatch_goto) fix crash if \u0027continue\u0027 command\n\t  is used, which does not supply an argv[0].\n\t  this is a backport candidate /iff/ the trailing ; is removed\n\t  from VTY_GET_INTEGER_RANGE\n\t* vty.h: fix the VTY_GET macros, do {..} while(0) so they have\n\t  correct function like syntax in usage.\n"
    },
    {
      "commit": "d5c925396629ef93cb38c2a63c3ac63911a341a6",
      "tree": "9bc19245fec73ec4e1f488775483f51b143e3b67",
      "parents": [
        "e387e6654fe75a5f043ea21b483e78bf0f3d4447"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 12:33:58 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 12:33:58 2005 +0000"
      },
      "message": "2005-05-23 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* memtypes.awk: use character classes, which work correctly in\n\t  all LC_COLLATE environments, unlike A-Z, which doesnt work in\n\t  eg estonian collate order. Reported by Hasso.\n"
    },
    {
      "commit": "e387e6654fe75a5f043ea21b483e78bf0f3d4447",
      "tree": "928bed31a8597bf7c52dcedc51e02a7f5b063e1d",
      "parents": [
        "e83e2080cecffa86267c07b46bbb5a9677b37996"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 02:13:28 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 02:13:28 2005 +0000"
      },
      "message": "2005-05-19 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* memtypes.c: (memory_list_bgp) add MTYPE_BGP_PEER_HOST\n"
    },
    {
      "commit": "2ba9a37add807b1fbd103424b1365fac8fb2b78f",
      "tree": "5b9143db0816baf0a02db384c6dab0dcde5dda6d",
      "parents": [
        "dc81807a5b2b3dc8138d74e23ece71402a6c03b4"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 01:37:50 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 01:37:50 2005 +0000"
      },
      "message": "2005-05-19 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* sockunion.c: (sockunion_getsockname) use MTYPE_SOCKUNION, not TMP\n\t  (sockunion_getpeername) ditto\n"
    },
    {
      "commit": "dc81807a5b2b3dc8138d74e23ece71402a6c03b4",
      "tree": "7f2850cf793ea8c5241b85b18e971bd763707f14",
      "parents": [
        "a3387a4488c35d322d3c78973c967b2be5967b6e"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 01:30:53 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 01:30:53 2005 +0000"
      },
      "message": "2005-05-19 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* thread.c: (thread_cancel_event) the number of pending events\n\t  cancelled is potentially useful information, dont throw it away,\n\t  pass it back to the caller.\n"
    },
    {
      "commit": "024a7f06979b467299a85e915b78af456a89e3a6",
      "tree": "e9c28719f8812dd808699dd6108532d9526a476b",
      "parents": [
        "14c1f187acdca1278e035e30d4c036d6eacf9721"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun May 15 14:25:08 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun May 15 14:25:08 2005 +0000"
      },
      "message": "2005-05-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* getopt.h: It\u0027s not just __GNU_LIBRARY__ which defines\n\t  getopt, eg __EXTENSIONS__ does too on SunOS. It still seems\n\t  awfully fragile though.\n\t* getopt.c: include zebra.h after config.h, before including\n\t  getopt.h so that things at least are consistent..\n\t* getopt1.c: ditto\n"
    },
    {
      "commit": "42c981994adcf7fb2e1c2bea170cc5f196d5a1d7",
      "tree": "ba2bae75f527d0a034cb42ee3177db9f47802fda",
      "parents": [
        "4dadc291e56195886fd047690ded9686f4e013fa"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat May 07 02:22:51 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat May 07 02:22:51 2005 +0000"
      },
      "message": "2005-05-07 Yar Tikhiy \u003cyar@comp.chem.msu.su\u003e\n\n\t* configure.ac: Check for OSes which support passing ifindex in\n\t  struct ip_mreq.\n\t* lib/sockopt.c: Add support for BSD style ifindex in ip_mreq.\n\t* ospfd/ospf_network.c: Log ifindex on multicast membership leave/join\n\t  events.\n"
    },
    {
      "commit": "8cc4198f9fabe5f10f5a773de1503d82f33a01fb",
      "tree": "77045da709ff66629bd12029b9ee17700360909b",
      "parents": [
        "e7fe8c88c3d552400e1ae3ae9243319ab95d6f2d"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:25:49 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:25:49 2005 +0000"
      },
      "message": "2005-05-06 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* (general) extern and static\u0027ification of functions in code and\n\t  header.\n\t  Cleanup any definitions with unspecified arguments.\n\t  Add casts for callback assignments where the callback is defined,\n\t  typically, as passing void *, but the function being assigned has\n\t  some other pointer type defined as its argument, as gcc complains\n\t  about casts from void * to X* via function arguments.\n\t  Fix some old K\u0026R style function argument definitions.\n\t  Add noreturn gcc attribute to some functions, as appropriate.\n\t  Add unused gcc attribute to some functions (eg ones meant to help\n\t  while debugging)\n\t  Add guard defines to headers which were missing them.\n\t* command.c: (install_node) add const qualifier, still doesnt shut\n\t  up the warning though, because of the double pointer.\n\t  (cmp_node) ditto\n\t* keychain.c: (key_str2time) Add GET_LONG_RANGE() macro, derived\n\t  fromn vty.h ones to fix some of the (long) \u003c 0 warnings.\n\t* thread.c: (various) use thread_empty\n\t  (cpu_record_hash_key) should cast to uintptr_t, a stdint.h type\n\t* vty.h: Add VTY_GET_IPV4_ADDRESS and VTY_GET_IPV4_PREFIX so they\n\t  removed from ospfd/ospf_vty.h\n\t* zebra.h: Move definition of ZEBRA_PORT to here, to remove\n\t  dependence of lib on zebra/zserv.h\n"
    },
    {
      "commit": "e7fe8c88c3d552400e1ae3ae9243319ab95d6f2d",
      "tree": "57344fab75787ff46b96867fa2b739d5b1991aa7",
      "parents": [
        "15935e9ae1619288f0f78fcc0dac15c1c25d41c6"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri May 06 19:33:35 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri May 06 19:33:35 2005 +0000"
      },
      "message": "\t* sockunion.c: Fix warning message.\n"
    },
    {
      "commit": "0dab930314e215a627f848ffa824ed995eb2e13c",
      "tree": "f84189f12990561a616c65be59d8cb6ebef94569",
      "parents": [
        "0c2029e9121d4c80380c174c2503b7deaf4e03ce"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue May 03 09:07:56 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue May 03 09:07:56 2005 +0000"
      },
      "message": "2005-05-03 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* stream.h: Add comment about the special zero-ing ability of\n\t  stream_put.\n\t  (stream_recvmsg, stream_write) should return ssize_t and size_t\n\t  respectively. Should both be extern linkage.\n\t  (stream_recvfrom) Stream aware wrapper around recvfrom, in style\n\t  of stream_read_try.\n\t* stream.c: (stream_recvfrom) new function, wrapper around recvfrom.\n\t  (stream_recvmsg, stream_write) ssize_t and size_t return values\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": "3df537822f594ffefe4d5e121c0b2430c9c12806",
      "tree": "63f845e4b45f4010fa5f24384352fb1dade48152",
      "parents": [
        "a7bca0f5d27b9b8e6eb73890003a4f664d849188"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Apr 27 16:29:54 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Apr 27 16:29:54 2005 +0000"
      },
      "message": "2005-04-27 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* workqueue.c (show_work_queues): Remove unused gettimeofday call.\n"
    },
    {
      "commit": "a7bca0f5d27b9b8e6eb73890003a4f664d849188",
      "tree": "81f4c85245047c5f17aaf3b5e657148b218ca642",
      "parents": [
        "843696841b55343e45d6cfdad19035882a67b99f"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Apr 27 12:44:54 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Apr 27 12:44:54 2005 +0000"
      },
      "message": "2005-04-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* memory.h: memtypes is built source, default includes points to\n\t  top_builddir, so we should refer to lib/memtypes.h\n"
    },
    {
      "commit": "843696841b55343e45d6cfdad19035882a67b99f",
      "tree": "62e6224fae2ea014023117b21b0980605b98472a",
      "parents": [
        "07334da01ca0a7b77cb11add3102b57077eb03eb"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Apr 27 12:39:27 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Apr 27 12:39:27 2005 +0000"
      },
      "message": "2005-04-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* workqueue.h: (struct work_queue_item) change retry_count to ran,\n\t  its a count of number item has been run.\n\t* workqueue.c: (show_work_queues) Fix formating of slightly\n\t  bugfix: fix SIGFPE if wq-\u003eruns is 0.\n\t  (work_queue_run) retry logic was slightly wrong.\n\t  cycles.best is 0 initialy, granularity is 1, so update best\n\t  if cycles \u003e\u003d granularity, not just \u003e.\n"
    },
    {
      "commit": "07334da01ca0a7b77cb11add3102b57077eb03eb",
      "tree": "f1c9c9cc0b4919588e0de7f08b54d81db56c7d67",
      "parents": [
        "2e7d9ebac1a2698d548fab85bf717b427378c3c1"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Apr 26 17:14:30 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Apr 26 17:14:30 2005 +0000"
      },
      "message": "2005-04-26 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* buffer.c (buffer_write): Comment out call to buffer_flush_available.\n\t  This should speed up buffering at the expense of a possible increase\n\t  in latency in flushing the data if inside a long-running thread.\n"
    },
    {
      "commit": "147aff0fa4c3c1f54270881851b6c2c23418b031",
      "tree": "b29a667bb7780ad9a8616df0eddb3a4b3868dd0e",
      "parents": [
        "354d119a6569b2c6335ae9309e4606e5cccedb6a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 16:29:10 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 16:29:10 2005 +0000"
      },
      "message": "- forgot to commit changelog, belongs to previous commit.\n"
    },
    {
      "commit": "354d119a6569b2c6335ae9309e4606e5cccedb6a",
      "tree": "e29bb213c52bb46b3454f845fa5892df306b82e2",
      "parents": [
        "b64d92a8a88e69f711976a3c12c17667ecaba4ee"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 16:26:42 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 16:26:42 2005 +0000"
      },
      "message": "2005-04-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* workqueue.{c,h}: Helper API for setting up and running queues via\n\t  background threads.\n\t* command.c: install the \u0027show workqueues\u0027 command\n\t* memtypes.c: Add work queue mtypes, and a rib-queue type for\n\t  a zebra rib work queue.\n\t* memtypes.h: Updated to match memtypes.c\n\t* Makefile.am: Add new workqueue files to build.\n"
    },
    {
      "commit": "907873a076a62a51cd5f832b9853274e2ecd0eee",
      "tree": "cf3ea7afe998d0da60a452c37a1b1b39f82edce5",
      "parents": [
        "c4d23bba6d522336755676a028a8f4355500ab67"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 14:53:46 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 14:53:46 2005 +0000"
      },
      "message": "2005-04-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* thread.c: Kill unused TIMER_NO_SORT bits\n"
    },
    {
      "commit": "c4d23bba6d522336755676a028a8f4355500ab67",
      "tree": "0d86b64de84a076a0395826a2383cbf4b7ce1f3a",
      "parents": [
        "2c1de2a8b89f3d3364ad716cfbba295097c7fc61"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 14:18:43 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 14:18:43 2005 +0000"
      },
      "message": "- arg, fix the missing slash. Beat myself with the diff of the last commit\n  to HACKING (which I added..)\n"
    },
    {
      "commit": "2c1de2a8b89f3d3364ad716cfbba295097c7fc61",
      "tree": "48b6dfef347eae56afdac7d0be14a9c547a2149b",
      "parents": [
        "ab59ae3519d986d4544ba1ca15d6c17b3f52f86b"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 14:02:44 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 14:02:44 2005 +0000"
      },
      "message": "2005-04-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* memory.c: Make the string field much wider\n\t* memtypes.c: Correct the prefix list str/entry strings\n"
    },
    {
      "commit": "ab59ae3519d986d4544ba1ca15d6c17b3f52f86b",
      "tree": "d95735cfce66337328c6503410f7b0d1fa1ff676",
      "parents": [
        "74a2dd7b773e9f8db0f38c40b3e6e9b32d597a0a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 13:52:26 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 25 13:52:26 2005 +0000"
      },
      "message": "2005-04-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* Makefile.am: Refer to source files via srcdir variable, fix\n\t  out-of-tree build breakage.\n"
    },
    {
      "commit": "fb9e46bbb1a639cf365d06a75007e708c278b6bd",
      "tree": "775879c0333b8785ebd436163d3db5d8e955a987",
      "parents": [
        "e1e53ed5d7aaa70e23abac6f7d21ef1646bad123"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 22 14:23:34 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 22 14:23:34 2005 +0000"
      },
      "message": "2005-04-22 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* thread.h: Fix type for struct thread_master add_type: should be\n\t  unsigned char.  Also, add some documentation of thread_add_background\n\t  args.  And remove extraneous declaration of\n\t  show_thread_work_queues_cmd.\n"
    },
    {
      "commit": "e1e53ed5d7aaa70e23abac6f7d21ef1646bad123",
      "tree": "5c2f5232cc8927179e6c0c76a0d392bda40a2228",
      "parents": [
        "a0e64a63846e75cd038ade65669b27eeaec41cf1"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 13:44:17 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 13:44:17 2005 +0000"
      },
      "message": "2005-04-22 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* memory.h: Move include of memtypes.h to after the definition of\n\t  struct memory_list, gcc 4.0 doesn\u0027t like arrays of incomplete\n\t  types.\n"
    },
    {
      "commit": "17fc128d6422d3c6045ff671973911c17db39276",
      "tree": "9adb150b7215d04151c293d5177b96037468efd9",
      "parents": [
        "1d2c893b61211761a17bb2e51345a2eaed12cf1f"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:57:03 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:57:03 2005 +0000"
      },
      "message": "- fix comment\n"
    },
    {
      "commit": "a48b4e6d074a4e61ce9e8bf78fdb8ea9c57c6e64",
      "tree": "7967366e5c4c650d36fbaa1cf5f9d30584ff9846",
      "parents": [
        "cb0663c41a5c61c6261f6d5607526e56be0ed2d4"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:43:47 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:43:47 2005 +0000"
      },
      "message": "2005-04-22 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* thread.h: Add background thread type and thread_add_background\n\t  macro and accompanying funcname_... function.\n\t  export thread_should_yield, background threads can use it.\n\t  Lower thread yield time to 10ms, 100ms is noticeable lag and\n\t  a thread would only be /starting/ to finish sometime afterward.\n\t* thread.c: (general) Add background thread type and schedule\n\t  nearly all thread types through the ready list for fairness.\n\t  (timeval_adjust) static qualifier missing\n\t  (vty_out_cpu_thread_history) add support for printout of\n\t  background threads\n\t  (show_thread_cpu) ditto.\n\t  (thread_master_debug) add debug of background list\n\t  (thread_master_create) fixup long line\n\t  (thread_add_unuse) add asserts for required state.\n\t  (thread_master_free) free background thread list\n\t  (funcname_thread_add_timer_timeval) make generic, able to\n\t  support arbitrary timer-like thread types.\n\t  (funcname_thread_add_timer) pass thread type to .._add_timer_timeval\n\t  (funcname_thread_add_timer_msec) ditto\n\t  (funcname_thread_add_background) Add a background thread, with an\n\t  optional millisecond delay factor, using .._add_timer_timeval.\n\t  (thread_cancel) Add background thread type.\n\t  Move the thread_list_delete common to all cases to bottom of\n\t  function, after the switch statement..\n\t  (thread_cancel_event) indent\n\t  (thread_timer_wait) Static qualifier, and make it able to cope\n\t  with arbitrary timer-like thread lists, so its of use to\n\t  background threads too.\n\t  (thread_process_fd) static qualifier. Again, make it take a list\n\t  reference rather than thread_master. Fix indentation.\n\t  (thread_timer_process) Check for ready timer-like threads in the\n\t  given list and move them on to the ready list - code originally\n\t  embedded in thread_fetch.\n\t  (thread_fetch) Schedule all threads, other than events, through\n\t  the ready list, to ensure fairness. Timer readying code moved to\n\t  thread_timer_process so it can be reused for background threads.\n\t  Remove the unneeded quagga_sigevent_process, as pointed out by\n\t  John Lin \u003cjohn.ch.lin@gmail.com\u003e.\n\t  (thread_should_yield) make this available.\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": "dc830cbfac8dd9633e070550359a5d6f8dac8fe5",
      "tree": "9b412c3e737868b0ef3917b97c5b62165ca6cf13",
      "parents": [
        "03ecfb6789c25d65a35e050661fa7f23f1e4e66e"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Apr 16 15:51:05 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Apr 16 15:51:05 2005 +0000"
      },
      "message": "2005-04-16 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* memtypes.c: the comment about use of comments in the comments\n\t  headers was causing comment within comment warnings from compiler\n\t* memtypes.awk: Add extensive comments on the file format for\n\t  memtypes.c.\n\t  tighten the pattern for the MTYPE matching action (suggestion from\n\t  Andrew) and tighten which field we try the match on.\n"
    },
    {
      "commit": "d45f1f1c3f85952651f27a8a98861ea45fd03789",
      "tree": "a3685403e9f78331e63b3032553d638289fa3aad",
      "parents": [
        "f482ed4d13e73c27424a45e4c8cfaaa363a35d89"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 15 22:18:37 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 15 22:18:37 2005 +0000"
      },
      "message": "2005-04-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n        * Makefile.am: memtypes.awk is gawk dependent, use the GAWK automake\n\t  var.\n\t* memtypes.h: New file, auto-generated, checked in for convenience.\n"
    },
    {
      "commit": "2fd2fd5d4c0e5a67f1b84abe18b54417237b20ab",
      "tree": "106e9f02a377c796ce41f3033beea2404c6e0e58",
      "parents": [
        "d98b74b504554d851d1281017724984069340cad"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 15 11:47:15 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 15 11:47:15 2005 +0000"
      },
      "message": "2005-04-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* memtypes.c: The new, unified location for memory type definitions.\n\t  The memtype enum and declarations for memory_lists are built from\n          this automatically and put into memtypes.h.\n        * memtypes.awk: New script to generate memtypes.h from memtypes.c\n        * memory.h: Finally, the enum can banished!\n        * memory.c: Finally, the seperate mtype memory_list definitions can\n          be banished!\n          (log_memstats) Increase width of fields\n          (show_memory_zebra_cmd) display zebra specific memory types.\n          Increase width of fields.\n        * Makefile.am: Add memtypes.{c,h}, add BUILT_SOURCES for memtypes.h\n          Add a rule to build memtypes.h using memtypes.awk.\n          Add memtypes.awk to EXTRA_DIST.\n"
    },
    {
      "commit": "634f9ea20fce82c94407cb677b5487b65bde1973",
      "tree": "32db82e4ae3b0f409d6d06a0fda401f9d5df5cc9",
      "parents": [
        "dfb9a545f8e3500e6a99518193872f526c1f56ba"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Mon Apr 11 15:51:40 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Mon Apr 11 15:51:40 2005 +0000"
      },
      "message": "2005-04-11 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\tImplement non-blocking zclient I/O with buffering.\n\t* zclient.h (struct zclient): Add two fields to support non-blocking\n\t  I/O: struct buffer *wb, and struct thread *t_write.\n\t  (zclient_free): Remove function.\n\t  (zebra_redistribute_send): Change 2nd arg from socket fd to\n\t  struct zclient * (needed to support non-blocking I/O and buffering).\n\t  (zclient_send_message): New function to send an arbitrary\n\t  message with non-blocking I/O.\n\t* zclient.c (zclient_new): Create write buffer.\n\t  (zclient_free): Remove unused function.\n\t  (zclient_stop): Must cancel new t_write thread.  Also, reset\n\t  all buffers: ibuf, obuf, and wb.\n\t  (zclient_failed): New helper function for typical error handling.\n\t  (zclient_flush_data): New thread to flush queued data.\n\t  (zclient_send_message): New function to send the message in\n\t  zclient-\u003eobuf to zebra using non-blocking I/O and buffering.\n\t  (zebra_message_send, zapi_ipv4_route, zapi_ipv6_route): Use\n\t  new zclient_send_message function instead of calling writen.\n\t  (zclient_start): Set socket non-blocking.  Also, change 2nd arg\n\t  to zebra_redistribute_send from zclient-\u003esock to zclient.\n\t  (zebra_redistribute_send): Change 2nd arg to struct zclient *.\n\t  Can now use zclient-\u003eobuf to assemble the message instead of\n\t  allocating a temporary stream.  And call zclient_send_message to\n\t  send the message instead of writen.\n\t  (zclient_read): Convert to support non-blocking I/O by using\n\t  stream_read_try instead of deprecated stream_read.\n\t  (zclient_redistribute): Change 2nd arg to zebra_redistribute_send\n\t  from zclient-\u003esock to zclient.\n\t* ospf6_zebra.c (ospf6_zebra_redistribute, ospf6_zebra_no_redistribute):\n\t  Change 2nd arg to zebra_redistribute_send from zclient-\u003esock\n\t  to zclient.\n\t* ospf_zebra.c (ospf_zebra_add): Call zclient_send_message instead\n\t  of writen.\n\t* rip_zebra.c (rip_redistribute_set, rip_redistribute_unset,\n\t  rip_redistribute_clean): Change 2nd arg to zebra_redistribute_send\n\t  from zclient-\u003esock to zclient.\n\t* ripng_zebra.c (ripng_redistribute_unset, ripng_redistribute_clean):\n\t  Change 2nd arg to zebra_redistribute_send from zclient-\u003esock\n\t  to zclient.\n\t* bgp_zebra.c (bgp_redistribute_set, bgp_redistribute_unset):\n\t  The 2nd arg to zebra_redistribute_send is now zclient instead of\n\t  zclient-\u003esock.\n\t* isis_zebra.h (isis_zebra_finish): Remove declaration of unused\n\t  function.\n\t* isis_zebra.c (isis_zebra_route_add_ipv4): Call zclient_send_message\n\t  to send the message to zebra instead of calling writen directly, since\n\t  zclient_send_message understands non-blocking I/O and will manage\n\t  the buffer queue appropriately.\n\t  (isis_zebra_finish): Remove unused function, particularly since\n\t  the zclient_free function has been removed.\n"
    },
    {
      "commit": "5bb4c1981a518315bf7f4fc81a85baf2061e32fa",
      "tree": "21c20e1b3dbd312049f92147792421c16f96677c",
      "parents": [
        "a8a80d532f3248567b6926b5dbd12509eadd6b43"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sat Apr 09 13:27:50 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sat Apr 09 13:27:50 2005 +0000"
      },
      "message": "\t* routemap.c: Show description in \"show route-map\" output.\n"
    },
    {
      "commit": "67bf16c0f8179af05bcff04d19226866a8b7e806",
      "tree": "4ff6db9b640602b6b99bd03b3405aeffcbf58850",
      "parents": [
        "926fe8f1fce88d0889e47a9f5c6d78c6bc11f3f6"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 08 19:02:04 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 08 19:02:04 2005 +0000"
      },
      "message": "2005-04-08 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* sigevent.c: On GNU_LINUX, check whether __USE_GNU is already defined.\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": "d66a7b56634f88181dd2dd23706c30bf23366424",
      "tree": "42569fbc2de9016ad91db7669565e7b737ca3c11",
      "parents": [
        "6811845b67999861388cf00d3ca0ee8471d29876"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 08 16:42:03 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 08 16:42:03 2005 +0000"
      },
      "message": "2005-04-08 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zebra.h: If GNU_LINUX is defined, then define _GNU_SOURCE.  This\n\t  fixes a problem where we were not getting the declaration of strnlen\n\t  in \u003cstring.h\u003e.\n"
    },
    {
      "commit": "4a8164e5b310094315e2c50d73aeea489766a48a",
      "tree": "683c5f04667486d29fc72a094957773ded6aea3b",
      "parents": [
        "3a2ce6a14e3e302c3fdca2ff99143cfd06b145e6"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 14:20:18 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 14:20:18 2005 +0000"
      },
      "message": "\t* routemap.[ch]: Added \"description ...\" command.\n\t  Closes Bugzilla #167.\n"
    },
    {
      "commit": "3a2ce6a14e3e302c3fdca2ff99143cfd06b145e6",
      "tree": "f27ec1418be4c3e9a123e67ef22ca090bca28906",
      "parents": [
        "528bed4a9a997216ba95e3ae445efa79436cc551"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 01:30:51 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 01:30:51 2005 +0000"
      },
      "message": "\t* prefix.[hc]: Pass argument to the inet6_ntoa by value making it more\n\t  inet_ntoa alike.\n\t* ripngd.[hc], ripng_interface.c, ripng_peer.c: inet6_ntoa() takes\n\t  argument now by value.\n"
    },
    {
      "commit": "1eb8ef2584833f18fb674e127d59cb5a7f771482",
      "tree": "f5b09d4781de9a9b08839fefb6530e64d2d2ec31",
      "parents": [
        "5920990fecba7e2430af3cfaa8bcbaed40d0ba1a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Apr 07 07:30:20 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Apr 07 07:30:20 2005 +0000"
      },
      "message": "2005-04-07 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global): Fix up list loops to match changes in lib/linklist,\n\t  and some basic auditing of usage.\n\t* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES\n\t* HACKING: Add notes about deprecating interfaces and commands.\n\t* lib/linklist.h: Add usage comments.\n\t  Rename getdata macro to listgetdata.\n\t  Rename nextnode to listnextnode and fix its odd behaviour to be\n\t  less dangerous.\n\t  Make listgetdata macro assert node is not null, NULL list entries\n          should be bug condition.\n          ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use\n          with for loop, Suggested by Jim Carlson of Sun.\n          Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the\n          \"safety\" of previous macro.\n\t  LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to\n\t  distinguish from the similarly named functions, and reflect their\n\t  effect better.\n\t  Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section\n\t  with the old defines which were modified above,\n\t  for backwards compatibility - guarded to prevent Quagga using it..\n\t* lib/linklist.c: fix up for linklist.h changes.\n\t* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single\n\t  scan of the area list, rather than scanning all areas first for\n\t  INTER_ROUTER and then again for INTER_NETWORK. According to\n\t  16.2, the scan should be area specific anyway, and further\n\t  ospf6d does not seem to implement 16.3 anyway.\n"
    },
    {
      "commit": "5920990fecba7e2430af3cfaa8bcbaed40d0ba1a",
      "tree": "d91dd49e4ed2c03cd0c007660232716f11172a56",
      "parents": [
        "6a52470660000bb6ddba971dc5c40b3422ab49bc"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Apr 05 14:36:49 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Apr 05 14:36:49 2005 +0000"
      },
      "message": "\t* lib/prefix.[hc]: inet6_ntoa utility function copied from\n\t  ripngd/ripngd.c (inet6_ntop).\n\t* ripngd.[hc]: Remove inet6_ntop() and any usage of it. inet6_ntoa()\n\t  from lib is used now.\n\t* ripng_interface.c: inet6_ntop() -\u003e inet6_ntoa().\n\t* ripng_peer.c: inet6_ntop() -\u003e inet6_ntoa().\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": "08dbfb691d8e03c7200138d55447fc29916e0362",
      "tree": "54d8718c7bdb035197cebcedef7d3de4f0038d55",
      "parents": [
        "e4319de388b748ba66551f33fecdf7446e754b80"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Apr 03 03:40:52 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Apr 03 03:40:52 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* if_ioctl.c: (interface_list_ioctl) Use if_get_by_name_len.\n\t* if_proc.c: (ifaddr_proc_ipv6) Increase size of ifname buffer to\n\t  avoid overflow.\n\t* kernel_socket.c: (ifan_read) Use if_get_by_name_len.\n\t* if.h: Fix comments to reflect that if_lookup_by_name and\n\t  if_get_by_name now require the argument strings to be NUL-terminated.\n\t* if.c: (if_lookup_by_name) Compare using strcmp.\n\t  (if_get_by_name) Pass strlen(ifname) as 2nd arg to if_create.\n"
    },
    {
      "commit": "018546e9656b141eeecdf59f627fcdc9b7381840",
      "tree": "dda8f27fcde00ae6c7ab080224f97b9c9a29dabe",
      "parents": [
        "a349198fd3e4e5692cdc91223f8153cb53c086ce"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 23:05:56 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 23:05:56 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* if.c: (if_nametoindex) The man page is rather vague, but it seems\n\t  like the argument to if_nametoindex has an implicit maximum length\n\t  of IFNAMSIZ characters.\n"
    },
    {
      "commit": "a349198fd3e4e5692cdc91223f8153cb53c086ce",
      "tree": "e5b366a8ab7ab9ed1c9670faf1f18eef26877ade",
      "parents": [
        "f695b01ff8e9aebc46bdf41f104ad4abbb0ef59e"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 22:50:38 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 22:50:38 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* if.h: (if_lookup_by_name_len, if_get_by_name_len) New functions.\n\t* if.c: (if_lookup_by_name_len, if_get_by_name_len) New functions.\n\t  (if_get_by_name) Tighten up code.\n\t  (interface) Use new function if_get_by_name_len.\n\t* zclient.c: (zebra_interface_add_read) Use new if_get_by_name_len\n\t  function.\n\t  (zebra_interface_state_read) Use new if_lookup_by_name_len function.\n\t* kernel_socket.c: (ifm_read) Use new if_lookup_by_name_len function\n\t  to save a memcpy.\n\t* if_ioctl_solaris.c: (interface_list_ioctl) Fix subtle bug with new\n\t  if_get_by_name_len function.\n\t* ospf_interface.c: (ospf_vl_new) Use strnlen to fix call to if_create.\n"
    },
    {
      "commit": "851adbd947692bab9985e08865330d75c56ff253",
      "tree": "3295c305da371df1c12398b7e68a9677ddc38b55",
      "parents": [
        "d2fc88962a9a494ecb34167871bb9e7273a25d33"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 18:48:39 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 18:48:39 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* str.c: Replace strlcpy and strlcat with actual working versions\n\t  copied from rsync-2.6.2/lib/compat.c.\n"
    },
    {
      "commit": "d2fc88962a9a494ecb34167871bb9e7273a25d33",
      "tree": "304a1c1a744972bc10b1f677a134907c404b361d",
      "parents": [
        "386e61502d391adb985ac1487825349ec85e6a8c"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 18:38:43 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 18:38:43 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\tFix problems when netlink interfaces are renamed (same ifindex used\n\tfor a new interface).  Start cleaning up some problems with the way\n\tinterface names are handled.\n\t* interface.c: (if_new_intern_ifindex) Remove obsolete function.\n\t  (if_delete_update) After distributing the interface deletion message,\n\t  set ifp-\u003eifindex to IFINDEX_INTERNAL.\n\t  (if_dump_vty) Detect pseudo interface by checking if ifp-\u003eifindex is\n\t  IFINDEX_INTERNAL.\n\t  (zebra_interface) Check return code from interface_cmd.func.\n\t  Do not set internal ifindex values to if_new_intern_ifindex(),\n\t  since we now use IFINDEX_INTERNAL for all pseudo interfaces.\n\t* kernel_socket.c: (ifm_read) Fix code and comments to reflect that\n\t  all internal interfaces now have ifp-\u003eifindex set to IFINDEX_INTERNAL.\n        * rt_netlink.c: (set_ifindex) New function used to update ifp-\u003eifindex.\n\t  Detects interface rename events by checking if that ifindex is already\n\t  being used.  If it is, delete the old interface before assigning\n\t  the ifindex to the new interface.\n\t  (netlink_interface, netlink_link_change) Call set_ifindex to update\n\t  the ifindex.\n\t* if.h: Remove define for IFINDEX_INTERNBASE and add define\n\t  IFINDEX_INTERNAL 0, since all internal (i.e. non-kernel) pseudo-\n\t  interfaces should have ifindex set to 0.\n\t  (if_new) Remove function.\n\t  (if_delete_retain) New function to delete an interface without\n\t  removing from iflist and freeing the structure.\n\t  (ifname2ifindex) New function.\n\t* if.c: (if_new) Remove function (absorb into if_create).\n\t  (if_create) Replace function if_new with call to calloc.\n\t  Set ifp-\u003eifindex to IFINDEX_INTERNAL.  Fix off-by-one error\n\t  in assert to check length of interface name.  Add error message\n\t  if interface with this name already exists.\n\t  (if_delete_retain) New function to delete an interface without\n\t  removing from iflist and freeing the structure.\n\t  (if_delete) Implement with help of if_delete_retain.\n\t  (ifindex2ifname) Reimplement using if_lookup_by_index.\n\t  (ifname2ifindex) New function to complement ifindex2ifname.\n\t  (interface) The interface command should check the name length\n\t  and fail with a warning message if it is too long.\n\t  (no_interface) Fix spelling in warning message.\n\t  (if_nametoindex) Reimplement using if_lookup_by_name.\n\t  (if_indextoname, ifaddr_ipv4_lookup) Reimplement using\n\t  if_lookup_by_index.\n\t* bgp_zebra.c: (bgp_interface_delete) After deleting, set ifp-\u003eifindex\n\t  to IFINDEX_INTERNAL.\n\t* isis_zebra.c: (isis_zebra_if_del) Call if_delete_retain instead\n\t  of if_delete, since it is generally not safe to remove interface\n\t  structures.  After deleting, set ifp-\u003eifindex to IFINDEX_INTERNAL.\n\t  (zebra_interface_if_lookup) Tighten up code.\n\t* ospf6_zebra.c: (ospf6_zebra_if_del) Previously, this whole function\n\t  was commented out.  But this is not safe: we should at least update\n\t  the ifindex when the interface is deleted.  So the new version\n\t  updates the interface status and sets ifp-\u003eifindex to\n\t  IFINDEX_INTERNAL.\n\t  (ospf6_zebra_route_update) Use if_indextoname properly.\n\t* ospf_vty.c: (show_ip_ospf_interface_sub) Show ifindex and interface\n\t  flags to help with debugging.\n\t* ospf_zebra.c: (ospf_interface_delete) After deleting, set ifp-\u003eifindex\n\t  to IFINDEX_INTERNAL.\n\t  (zebra_interface_if_lookup) Make function static.  Tighten up code.\n\t* rip_interface.c: (rip_interface_delete) After deleting, set\n\t  ifp-\u003eifindex to IFINDEX_INTERNAL.\n\t* ripng_interface.c: (ripng_interface_delete) After deleting, set\n\t  ifp-\u003eifindex to IFINDEX_INTERNAL.\n"
    },
    {
      "commit": "3cb98dee9067372756964f461eb2c931a1c75138",
      "tree": "726827878765c01c45e5be08b909974ae54ce79f",
      "parents": [
        "47004ec501bd70d558c11af05d8bacd66a8c7c25"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 16:01:05 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 16:01:05 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* configure.ac: Add strnlen to AC_CHECK_FUNCS.\n\t* zebra.h: Should include str.h to pick up missing functions.\n\t* str.h: Declare strnlen if needed.\n\t* str.c: Do not include str.h since zebra.h now includes it.\n\t  (strnlen) New function.\n"
    },
    {
      "commit": "2d58228ecabb23b064e8a06e6241cf0d7e5ca785",
      "tree": "443509e8113598c7dadaa5e9cdbb153c147d0ffe",
      "parents": [
        "17eff7cb9010c0ba386ab801c220811ded4242b3"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Mar 28 15:29:07 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Mar 28 15:29:07 2005 +0000"
      },
      "message": "\t* configure.ac, */Makefile.am: Fix previous commit. SNMP includes\n\t  must be after lib/ includes in some systems. Introduce SNMP_INCLUDES\n\t  for that.\n"
    },
    {
      "commit": "44f8a757904a58bbff8b6a976722e1e21f439af2",
      "tree": "ce792140d5c9c4439d4e3d2e22a76506268690d5",
      "parents": [
        "a0fb71a5601bcaad4eba2ad16556b9cf36c57277"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sat Mar 26 14:13:40 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sat Mar 26 14:13:40 2005 +0000"
      },
      "message": "Trying to finish previous commit ...\n"
    },
    {
      "commit": "db8eaac6615dacf17eb3958b0f3b6ea58f8f1e1d",
      "tree": "24e261e3e5be531ed987d3e040ea731ca6a1016c",
      "parents": [
        "55468c86040081320f557b696e509b76ddfd6c83"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Mar 16 16:13:06 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Mar 16 16:13:06 2005 +0000"
      },
      "message": "2005-03-16 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zebra.h: Must check whether __attribute__ should be defined before\n\t  including zassert.h.\n\n\t[backport candidate]\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": "909a215508fd42473fcbe4f5292a59404e5473af",
      "tree": "26b0977fb1b922565919a3e3b87c88d1ec9a8183",
      "parents": [
        "b89614766b083c83f6a84126a02c88311129e12d"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 17:41:45 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 17:41:45 2005 +0000"
      },
      "message": "2005-03-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (various) Fix indentation and other whitespace.\n"
    },
    {
      "commit": "b89614766b083c83f6a84126a02c88311129e12d",
      "tree": "51b3f37416bc394f70bb9b8b9e41690bbe1ac72e",
      "parents": [
        "9dbc797274ca5df614d61784658b8f809bbd8e2b"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 17:35:52 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 17:35:52 2005 +0000"
      },
      "message": "2005-03-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (sort_node) use vector_max instead of referencing\n\t  (struct vector *)-\u003emax directly. Test that vector_max is \u003e 0\n\t  before using it to calculate an index.\n\t  Fixup vector loop to make main body conditional on vector slot\n\t  not being empty.\n\t  (cmd_cmdsize) Fixup vector loop to make main body conditional on\n\t  vector slot not being empty.\n\t  (cmd_filter_by_completion) ditto\n\t  (cmd_filter_by_string) ditto\n\t  (is_cmd_ambiguous) ditto\n\t  (cmd_describe_command_real) Change index integers to unsigned.\n\t  Test that vector_max is \u003e 0 before using it to calculate an index.\n\t  Return immediately with CMD_ERR_NO_MATCH if vline has no\n\t  active slots.\n\t  Fixup vector loop to make main body conditional on vector slot\n\t  not being empty.\n\t  (cmd_complete_command_real) ditto.\n\t  (cmd_execute_command_strict) Fixup vector loop to be conditional\n\t  on non-null slot.\n"
    },
    {
      "commit": "4275b1de3a54650a81f82999c296b756ee5b5679",
      "tree": "34770ac1723285391c43a623028fd1e8e6c986ed",
      "parents": [
        "9e92eeab6cc40bc65ed9b1b7950e161fd1434d48"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Mar 09 13:42:23 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Mar 09 13:42:23 2005 +0000"
      },
      "message": "2005-03-09 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (config_list_cmd) Don\u0027t list hidden or deprecated\n\t  commands, hiding these from tab completion is still to be done.\n"
    },
    {
      "commit": "9e92eeab6cc40bc65ed9b1b7950e161fd1434d48",
      "tree": "40a277021d7dee4910cc9aa982680ac137f6e0dd",
      "parents": [
        "060d438cb1be51d2f7fb7954a8b7b1cd491f555f"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Mar 09 13:39:26 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Mar 09 13:39:26 2005 +0000"
      },
      "message": "2005-03-09 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: Undo commit of sign warning fix and hidden command\n\t  in list_cmd. Sign warning is more subtle. list_cmd on its own\n\t  will be committed after.\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": "9c5d8562f8d24574ba1f43881d47cbc8ffc62027",
      "tree": "816690e607e208aa66b257fb9ef01ae8bd80acb6",
      "parents": [
        "b45da6f01612e8ec1938cacfe0ea0ef34ad1afca"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 15:56:42 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Mar 08 15:56:42 2005 +0000"
      },
      "message": "2005-03-08 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* command.c: (cmd_describe_command_real) sign compile warning fix\n\t  (cmd_complete_command_real) ditto.\n\t  (config_list_cmd) Don\u0027t list hidden or deprecated commands,\n\t  hiding these from tab completion is still to be done.\n\t* command.h: cmd attr enum should start at 1.\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": "81fb32404c942432d2bea1e50a4d53bf75fd0f70",
      "tree": "107d5d94061c110773c5b2985e383d2075bc6044",
      "parents": [
        "0d7e9134d828d5aee8c83960bb706a726cdc2ec4"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 24 16:02:53 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 24 16:02:53 2005 +0000"
      },
      "message": "2005-02-24 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* stream.c: (stream_read_try) Log a warning message if a fatal\n\t  I/O error occurs.\n\t  (stream_fifo_new) Fix prototype.\n\t* stream.h: Fix prototype for stream_fifo_new (need void arg).\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": "c3c07f28dcd226975b5ed0c1f8842f51968a3288",
      "tree": "417176baf15d9f9528c7ef6fc65171fcfa68583d",
      "parents": [
        "e40dcce1f5966d4129b5ecadd905dc2952ac5b30"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Feb 21 18:17:52 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Feb 21 18:17:52 2005 +0000"
      },
      "message": "\t* pqueue.[ch]: Introduce \"update\" function to meet ospf spf needs. It\n\t  will allow to update node when:\n\t  i) a node is inserted into the priority queue;\n\t  ii) a node position is modified in the priority queue;\n\t* pqueue.h: Export trickle_down() function.\n"
    },
    {
      "commit": "109ac96f0296fd66d5a1d37def44db3cef7ca0fb",
      "tree": "aa6e12891391dd9d0a890b2a89c39222ad6409e6",
      "parents": [
        "518cde8d6ce0434b02bd5d7cf7e9627d57af6952"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Feb 19 01:17:07 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Feb 19 01:17:07 2005 +0000"
      },
      "message": "2005-02-19 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* stream.c: (stream_new) fix dumb mistake.\n"
    },
    {
      "commit": "53270116df3f54b1f9411f0832567e9effa87593",
      "tree": "08fab8ea890f84694a0f9fcaaf55a13fbf698ef3",
      "parents": [
        "d7e2a8188f6e9eaccb5e1c1bd7b9d5af79429c0c"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 17 20:07:22 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 17 20:07:22 2005 +0000"
      },
      "message": "2005-02-17 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* stream.c: (stream_read_try) Use new ERRNO_IO_RETRY macro.\n"
    },
    {
      "commit": "d7e2a8188f6e9eaccb5e1c1bd7b9d5af79429c0c",
      "tree": "6abb03907d0eeaa5f343e3927ef6d9e619e6f079",
      "parents": [
        "038163fa87d5b41503c721bb097faea6b25661c9"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 17 20:02:49 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 17 20:02:49 2005 +0000"
      },
      "message": "2005-02-17 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* network.h: Define a new ERRNO_IO_RETRY macro to test whether an I/O\n\t  operation should be retried.  This eliminates the need to duplicate\n\t  the same logic testing for EAGAIN or EINTR in multiple places.\n"
    },
    {
      "commit": "262feb1ad0838bb585955b6ada5acbe106dbc9bf",
      "tree": "392f66d5d71bcfdd87e5db32e89325ed9ef06c44",
      "parents": [
        "42218e71256cb86b5078c99c931030c7b0ce9bab"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 16 20:35:47 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 16 20:35:47 2005 +0000"
      },
      "message": "2005-02-16 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* stream.h: Declare new function stream_read_try suitable for use\n\t  with non-blocking file descriptors.  Indicate that stream_read\n\t  and stream_read_unblock are deprecated.\n\t* stream.c: (stream_read_try) New function for use with non-blocking\n\t  I/O.\n\t  (stream_recvmsg) Should return -1 if the stream is too small to\n\t  contain the data.\n"
    },
    {
      "commit": "42218e71256cb86b5078c99c931030c7b0ce9bab",
      "tree": "32331f692e292f258b295727d2f2467617fe80ba",
      "parents": [
        "a269d613fe0536a01eb86367a545e337e51d1309"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 16 16:25:39 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 16 16:25:39 2005 +0000"
      },
      "message": "2005-02-16 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* network.c: (set_nonblocking) Should check return code from\n\t  fcntl(F_GETFL).\n"
    },
    {
      "commit": "a269d613fe0536a01eb86367a545e337e51d1309",
      "tree": "21e648eaac2a1569af79dcbc75a962481b6cbc75",
      "parents": [
        "6ea7cdc593f7637e26da54192ef67245185994f3"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 16 00:45:37 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Feb 16 00:45:37 2005 +0000"
      },
      "message": "2005-02-15 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* network.h: Declare new function set_nonblocking.  Indicate that\n\t  readn and writen are deprecated.\n\t* network.c: (set_nonblocking) New function to make a file descriptor\n\t  non-blocking, since it seems silly to have fcntl calls sprinkled\n\t  throughout the code.\n"
    },
    {
      "commit": "1dd13d41d09487c3d595b13a087b2ec87b7f4ce8",
      "tree": "981310e2b5a5a30b955f4dd2eca094b01a1b93e1",
      "parents": [
        "bfdc44af118e235e6979be42d4e4f2c1353f7bf0"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Feb 14 23:49:09 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Feb 14 23:49:09 2005 +0000"
      },
      "message": "- oops, date was wrong in actual ChangeLog\n"
    },
    {
      "commit": "050c013ac35337d86b03f140fb17d2e8e33a8baa",
      "tree": "7241e3972e2116f67b762a37305c31ee7d8d9671",
      "parents": [
        "f2e6c429375adf0d3c5deaa409734d5d41ac15ce"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Feb 14 23:47:47 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Feb 14 23:47:47 2005 +0000"
      },
      "message": "2005-02-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* stream.h: Unsigned long updated to size_t\n\t* stream.c: ditto\n\t* stream.h: Add stream_copy, stream_dup, stream_recvmsg.\n\t  Add comment describing struct stream abstraction, and various\n\t  other comments.\n\t  Deprecate several unsafe/ambigious macros.\n\t  Add STREAM_WRITEABLE and STREAM_READABLE.\n\t  Add (stream_getl_from) for symmetry.\n\t  Update stream_forward_{endp,getp} to use size_t offset.\n\t  Make stream data a 0 length array, rather than a seperate malloc.\n\t* stream.c: Add consistency checks. Update to follow stream.h\n\t  changes.\n\t  (stream_new) Alloc stream+data in one go.\n\t  (stream_copy) new function, copy a stream.\n\t  (stream_dup) new function, dup a stream.\n\t  (stream_recvmsg) new function, recvmsg data into a stream.\n\t  (stream_empty) no need to check getp \u003d\u003d 0.\n"
    },
    {
      "commit": "f2e6c429375adf0d3c5deaa409734d5d41ac15ce",
      "tree": "73c056492bff8eb06eb7350909d0b2fa8baba772",
      "parents": [
        "082253f5d08577e2c7b61ed2302be88295b459eb"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Feb 12 14:35:49 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Feb 12 14:35:49 2005 +0000"
      },
      "message": "2005-02-12 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* stream.h: Unsigned long updated to size_t\n\t* stream.c: ditto\n"
    },
    {
      "commit": "9985f83ce7102f64b15f744b60320f8d14a8a5ff",
      "tree": "344629bdc2b4a7d53b8d7ca1705c9be2ca282d18",
      "parents": [
        "083ee9d9cdbf72a452b9af96e62d0625ea712cd9"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Feb 09 15:51:56 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Feb 09 15:51:56 2005 +0000"
      },
      "message": "2005-02-09 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global) Update code to match stream.h changes.\n\t  stream_get_putp effectively replaced with stream_get_endp.\n\t  stream_forward renamed to stream_forward_getp.\n\t  stream_forward_endp introduced to replace some previous\n\t  setting/manual twiddling of putp by daemons.\n\t* lib/stream.h: Remove putp. Update reference to putp with endp.\n\t  Add stream_forward_endp, which daemons were doing manually.\n\t  Rename stream_forward to stream_forward_getp.\n\t  lib/stream.c: Remove/update references to putp.\n\t  introduce stream_forward_endp.\n"
    },
    {
      "commit": "548e6f7d58a08e28132936431bba75428412857f",
      "tree": "4d168f4ea30a0fedc496ec158ac6fb58b2cd14cd",
      "parents": [
        "ba6454ec1fd1ca7266b10eba07d016becb22db74"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Feb 08 15:57:25 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Tue Feb 08 15:57:25 2005 +0000"
      },
      "message": "2005-02-08 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zebra.h: Change macro definitions SET_FLAG and UNSET_FLAG\n\t  to use compound assignment operators (aesthetic change).\n"
    },
    {
      "commit": "c4c7d0c48b1219d7ed9ed1377cea1be239c45d5d",
      "tree": "2dda4470cf7a5b0a5277edc06484f0065ef7bcc1",
      "parents": [
        "c70257d0afa4df7c838dc7c8f5948baca5f12657"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 03 19:22:05 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Feb 03 19:22:05 2005 +0000"
      },
      "message": "2005-02-03 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* log.c: (zlog_signal,zlog_backtrace_sigsafe) Eliminate use of fileno()\n\t  since it is not async-signal-safe.\n\t  (_zlog_assert_failed) Rewrite crashlog logic more compactly.\n\t  (zlog_set_file,zlog_reset_file,zlog_rotate) Update logfile_fd\n\t  for use in signal handler.\n"
    }
  ],
  "next": "1e2213541bbda26c49667b699a333d87bcc0f2e6"
}
