)]}'
{
  "commit": "0362326de13b4934887b58cb95d868604881c648",
  "tree": "08e29803eb74ae1cb1bbaa3428f1b92a3e31bff9",
  "parents": [
    "93c24912ed81db1f7e13bf2cd1b39c1d28cd52f2"
  ],
  "author": {
    "name": "Barret Rhoden",
    "email": "brho@cs.berkeley.edu",
    "time": "Thu Dec 22 15:48:28 2016 -0500"
  },
  "committer": {
    "name": "Barret Rhoden",
    "email": "brho@cs.berkeley.edu",
    "time": "Mon Jan 09 19:01:40 2017 -0500"
  },
  "message": "ip: Use a synthetic buffer for iproute\n\nTake a look at how routeread() works.  It\u0027s a mess.  Using getline() on it\nwould occasionally fail - usually with one line that was the size of the\niproute file, with no spaces or \\n, and apparently a leading 0.\n\nInstead, this just does what most sythetic files with actual content should\ndo: alloc a buffer, generate it once, then do reads from that buffer.  This\nis safe from situations where the synth file changes in between reads\n(which glibc often does even for short files).\n\nNote ipwrite() did not change.  Your writes are commands, not attempts to\nchange the synth file manually.\n\nSigned-off-by: Barret Rhoden \u003cbrho@cs.berkeley.edu\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "38e3b74d9f24d1e887b6a43232193f6fa9003639",
      "old_mode": 33188,
      "old_path": "kern/src/net/devip.c",
      "new_id": "e4a2b13efa7ce9f03753f9c9ed72b18a14a73a23",
      "new_mode": 33188,
      "new_path": "kern/src/net/devip.c"
    }
  ]
}
