)]}'
{
  "commit": "49ff6d9d7a9ef9419dd7aab58ac9f7806e3e1040",
  "tree": "bb9e1d36b5bef56d2e47c69b6bab1ef54cf9696e",
  "parents": [
    "62d8e96a06e664c929a164bfb66b515d1c6877a8"
  ],
  "author": {
    "name": "ajs",
    "email": "ajs",
    "time": "Thu Nov 04 19:26:16 2004 +0000"
  },
  "committer": {
    "name": "ajs",
    "email": "ajs",
    "time": "Thu Nov 04 19:26:16 2004 +0000"
  },
  "message": "2004-11-04 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* vty.c: Vtysh connections to daemons should use buffering.\n\t  (vty_out) Remove exception for vty_shell_serv, just use buffer_write.\n\t  (vty_new) Increase output buffer size to 4096 rounded up to a\n\t  multiple of pagesize.\n\t  (vtysh_read) After command has been executed and all output buffered,\n\t  call buffer_flush_available and schedule further writes if the\n\t  buffers are not yet empty.\n\t  (vtysh_write) New function to flush output to vtysh when the socket\n\t  is writeable.\n\t  (vty_event) Added new VTYSH_WRITE event for flushing buffers to vtysh\n\t  clients.  Also, should save read thread in vty-\u003et_read so the\n\t  thread can be cancelled in vty_close.\n\t* buffer.h: In struct buffer_data, remove unused \"parent\" field.\n\t  Convert \"unsigned char *data\" to \"unsigned char data[0]\" to save\n\t  a malloc.  Declare new function buffer_flush_available that works\n\t  with non-blocking sockets.\n\t* buffer.c: (buffer_data_new) Use a single malloc now that data is\n\t  a variable-size array at end of structure.\n\t  (buffer_data_free) Just a single free now that data is part of the\n\t  structure.\n\t  (buffer_write) Simplify the logic to make behavior more transparent.\n\t  (buffer_flush) Decrease b-\u003elength as data is written out.\n\t  (buffer_flush_vty_all) Decrease b-\u003elength as buffers are freed.\n\t  (buffer_flush_vty) Decrease b-\u003elength as data is written out.\n\t  (buffer_flush_available) New function to flush non-blocking sockets.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "0e4a2233f2b662f7616fb900550fd652756751b9",
      "old_mode": 33188,
      "old_path": "lib/ChangeLog",
      "new_id": "75ff444b28880dd6e8dea5cb022abe6ba1c20877",
      "new_mode": 33188,
      "new_path": "lib/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "904b4aa9b9a4cc85d83b17b997957200f56a81cb",
      "old_mode": 33188,
      "old_path": "lib/buffer.c",
      "new_id": "9d931a9b84f5387d19c5c01df7835f0d565c0761",
      "new_mode": 33188,
      "new_path": "lib/buffer.c"
    },
    {
      "type": "modify",
      "old_id": "9d453b1d069e00d980e9901be05879c453ec92ca",
      "old_mode": 33188,
      "old_path": "lib/buffer.h",
      "new_id": "2acd571fdebafdcb6219076a80c1c20582b73744",
      "new_mode": 33188,
      "new_path": "lib/buffer.h"
    },
    {
      "type": "modify",
      "old_id": "e37c99f56abafe498773650890b606440a044bb2",
      "old_mode": 33188,
      "old_path": "lib/vty.c",
      "new_id": "e6bcb61ae478db1e8805e6818c310e667b0dde67",
      "new_mode": 33188,
      "new_path": "lib/vty.c"
    }
  ]
}
