2010-02-04  Scott James Remnant  <scott@netsplit.com>

	* NEWS: Release 1.0.1

	* nih/logging.c (__abort_msg): Make a weak symbol reference.
	(nih_log_abort_message): Check whether __abort_msg has an address
	before saving.
	* nih/tests/test_logging.c (__abort_msg): Make a weak symbol reference.
	(test_log_message): Skip __abort_msg tests if there is no address
	for it.

2010-02-03  Scott James Remnant  <scott@netsplit.com>

	* nih/libnih.ver: Add missing export for __nih_* so you can build
	test cases; not bumping the library age here since this isn't an API
	change but a bug.

	* nih-dbus-tool/Makefile.am ($(com_netsplit_Nih_Test_object_OUTPUTS)):
	($(com_netsplit_Nih_Test_proxy_OUTPUTS)): Make compatible with
	am-silent-rules by using $(AM_V_GEN) and combining the mkdir and
	nih-dbus-tool lines.

	* configure.ac: Bump copyright year to 2010.
	* NEWS: Begin new release.

2009-11-29  Scott James Remnant  <scott@netsplit.com>

	* configure.ac (AM_INIT_AUTOMAKE): Drop dist-bzip2, since we don't
	use them.

	* configure.ac: Bump version to 1.0.1

2009-11-28  Scott James Remnant  <scott@netsplit.com>

	* NEWS: Release 1.0.0

	* nih-dbus-tool/main.c (source_file_path, header_file_path): Use a
	not reached assertion rather than an initial one, to avoid gcc
	warnings.
	* nih/tests/test_string.c (test_array_addp),
	* nih/tests/test_logging.c (test_log_message): Add a couple more
	initialisations for gcc, found with -O2

	* TODO: Update.

	* nih/tests/test_error.c (test_raise_error, test_pop_context): Also
	unlink core.PID form of core file, and unlink a valgrind core of the
	same name as well while we're in there.
	* nih/tests/test_child.c (test_poll): Do the same here, except it
	turns out that under valgrind we might still have NIH_CHILD_KILLED
	but a core file - always clean up core files anyway.

	* nih/libnih.supp, nih-dbus/libnih-dbus.supp: Valgrind got a whole
	bunch more strict in the 3.5 release.  That's a good thing because
	we catch more errors, but it means it's somewhat picker about things
	like our reference allocations.  Redo the suppressions against 3.5,
	taking an opportunity to clean up the files and insert documentation
	as to why they are there.
	* nih/tests/test_signal.c (test_poll): The two signal structures
	allocated in this function were not being freed at the end.
	* nih/tests/test_watch.c (test_reader): On termination of this test
	we were not freeing the last path copied.
	* nih-dbus/tests/test_dbus_connection.c (test_connect, test_bus)
	(test_setup): Free signal handlers before exiting the child,
	unlike other test cases we can't make these children of any other
	object since we don't actually have one!
	* nih-dbus-tool/tests/test_annotation.c (test_start_tag)
	(test_end_tag): Missing call to discard the NULL reference from the
	various objects after pushing onto the stack.
	* nih-dbus-tool/tests/test_parse.c (test_stack_push): Thanks to
	the updated valgrind, I can now see that this test case wasn't updated
	for the new nih_alloc() behaviour.  We now need to free the object
	even after it's been referenced, because it still has our NULL
	reference.
	(test_start_tag, test_end_tag): Also need to discard the NULL
	reference in each of these cases.

2009-11-24  Scott James Remnant  <scott@netsplit.com>

	* nih/logging.c (nih_log_message): Split the abort message saving
	out into its own function.
	(nih_log_abort_message): This makes it easier to suppress.
	* nih/libnih.supp: Add suppressions.

	* NEWS: Update.

	* nih/libnih.supp: Add new tmpfile suppression

	* nih-dbus-tool/interface.c (interface_proxy_get_all_function),
	* nih-dbus-tool/method.c (method_proxy_function),
	* nih-dbus-tool/property.c (property_proxy_get_function)
	(property_proxy_set_function): The dbus_connection_send_with_reply()
	function can return TRUE without setting a pending_call in the case
	of a non-connected connection.  Convert this into the
	DBUS_ERROR_DISCONNECTED error to match send_with_reply_and_block
	* nih-dbus-tool/tests/test_interface.c (test_proxy_get_all_function),
	* nih-dbus-tool/tests/test_method.c (test_proxy_function),
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_function)
	(test_proxy_set_function),
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_ordinary_method)
	(test_nameless_method, test_async_method, test_byte_to_str)
	(test_str_to_byte, test_boolean_to_str, test_str_to_boolean)
	(test_int16_to_str, test_str_to_int16, test_uint16_to_str)
	(test_str_to_uint16, test_int32_to_str, test_str_to_int32)
	(test_uint32_to_str, test_str_to_uint32, test_int64_to_str)
	(test_str_to_int64, test_uint64_to_str, test_str_to_uint64)
	(test_double_to_str, test_str_to_double)
	(test_object_path_to_str, test_str_to_object_path)
	(test_signature_to_str, test_str_to_signature)
	(test_struct_to_str, test_str_to_struct)
	(test_int32_array_to_str, test_str_to_int32_array)
	(test_str_array_to_str, test_str_to_str_array)
	(test_int32_array_array_to_str, test_str_to_int32_array_array)
	(test_struct_array_to_str, test_str_to_struct_array)
	(test_dict_entry_array_to_str, test_str_to_dict_entry_array)
	(test_get_byte, test_set_byte, test_get_boolean)
	(test_set_boolean, test_get_int16, test_set_int16)
	(test_get_uint16, test_set_uint16, test_get_int32)
	(test_set_int32, test_get_uint32, test_set_uint32)
	(test_get_int64, test_set_int64, test_get_uint64)
	(test_set_uint64, test_get_double, test_set_double)
	(test_get_string, test_set_string, test_get_object_path)
	(test_set_object_path, test_get_signature, test_set_signature)
	(test_get_structure, test_set_structure, test_get_int32_array)
	(test_set_int32_array, test_get_str_array, test_set_str_array)
	(test_get_int32_array_array, test_set_int32_array_array)
	(test_get_struct_array, test_set_struct_array)
	(test_get_dict_entry_array, test_set_dict_entry_array)
	(test_get_all): Add test cases for sending to a disconnected
	connection and getting the error reply back straight away.
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_structure.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_array.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_array.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_standard.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_structure.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_methods.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_signals.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_properties.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_only_properties.c:
	Update expected function output to match.
	* nih-dbus-tool/tests/test_interface.c (test_proxy_get_all_sync_function),
	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function),
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_sync_function)
	(test_proxy_set_sync_function),
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_ordinary_method_sync)
	(test_nameless_method_sync, test_async_method_sync)
	(test_byte_to_str_sync, test_str_to_byte_sync)
	(test_boolean_to_str_sync, test_str_to_boolean_sync)
	(test_int16_to_str_sync, test_str_to_int16_sync)
	(test_uint16_to_str_sync, test_str_to_uint16_sync)
	(test_int32_to_str_sync, test_str_to_int32_sync)
	(test_uint32_to_str_sync, test_str_to_uint32_sync)
	(test_int64_to_str_sync, test_str_to_int64_sync)
	(test_uint64_to_str_sync, test_str_to_uint64_sync)
	(test_double_to_str_sync, test_str_to_double_sync)
	(test_object_path_to_str_sync, test_str_to_object_path_sync)
	(test_signature_to_str_sync, test_str_to_signature_sync)
	(test_struct_to_str_sync, test_str_to_struct_sync)
	(test_int32_array_to_str_sync, test_str_to_int32_array_sync)
	(test_str_array_to_str_sync, test_str_to_str_array_sync)
	(test_int32_array_array_to_str_sync)
	(test_str_to_int32_array_array_sync)
	(test_struct_array_to_str_sync, test_str_to_struct_array_sync)
	(test_dict_entry_array_to_str_sync)
	(test_str_to_dict_entry_array_sync, test_get_byte_sync)
	(test_set_byte_sync, test_get_boolean_sync)
	(test_set_boolean_sync, test_get_int16_sync)
	(test_set_int16_sync, test_get_uint16_sync)
	(test_set_uint16_sync, test_get_int32_sync, test_set_int32_sync)
	(test_get_uint32_sync, test_set_uint32_sync)
	(test_get_int64_sync, test_set_int64_sync, test_get_uint64_sync)
	(test_set_uint64_sync, test_get_double_sync)
	(test_set_double_sync, test_get_string_sync)
	(test_set_string_sync, test_get_object_path_sync)
	(test_set_object_path_sync, test_get_signature_sync)
	(test_set_signature_sync, test_get_structure_sync)
	(test_set_structure_sync, test_get_int32_array_sync)
	(test_set_int32_array_sync, test_get_str_array_sync)
	(test_set_str_array_sync, test_get_int32_array_array_sync)
	(test_set_int32_array_array_sync, test_get_struct_array_sync)
	(test_set_struct_array_sync, test_get_dict_entry_array_sync)
	(test_set_dict_entry_array_sync, test_get_all_sync):
	Add test cases for a sync() function on a disconnected connection,
	which should return the same error internally inside D-Bus.

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c: These
	tests weren't passing under valgrind, because I got lazy and gave
	up.  Most of the reason was that the main signal handler wasn't
	freed; fix that by attaching the signal to the D-Bus object.

	* nih/test_process.h (TEST_CHILD, TEST_CHILD_WAIT): Flush standard
	output and error before forking, to avoid the typical strange
	buffering issues when piping to less.

	* nih/alloc.c (NihAllocCtx): The recent alignment changes mean
	there's always 4 bytes of spare space in this structure, use those
	to remember the allocation size rather than relying on malloc()
	to do it.  This makes us more portable to alternative (and debugging)
	malloc implementations.
	(nih_alloc, nih_realloc): Update the size field
	(nih_alloc_size): Just return the size field.

	* TODO: Update.

2009-11-21  Scott James Remnant  <scott@netsplit.com>

	* nih/option.c: Add a note that --debug is deliberately hidden.

	* nih/macros.h (NIH_ALIGN_SIZE): Fix rounding to be twice size
	of size_t, or alignment of long long - which is what we decided
	in the bug.
	* nih/alloc.c (NIH_ALLOC_SIZE): Formatting.

	* nih/Makefile.am (libnih_la_LDFLAGS): Bump version
	* nih-dbus/Makefile.am (libnih_dbus_la_LDFLAGS): Bump version

	* configure.ac (AC_PRERQ): Update to 2.62
	(AM_INIT_AUTOMAKE): Update to 1.11, add color-tests and silent-rules
	to the options
	(AM_SILENT_RULES): Explicitly make silent rules the default
	(AM_MAINTAINER_MODE): Add, but with "enable" as the default, so
	distributions may turn it off with --disable-maintainer-mode
	(AM_GNU_GETTEXT_VERSION): Update to 0.17
	* HACKING: Update requirements; document that we support the
	standard options.

2009-11-21  John Cater  <katre50@gmail.com>

	* nih/macros.h (NIH_ALIGN_SIZE): Add macro to guess at the maximum
	alignment of a type
	* nih/alloc.c (NIH_ALLOC_SIZE): Define the size of the context
	based off its size and the maximum alignment macro, thus hopefully
	ensuring the following pointer is generically aligned
	(NIH_ALLOC_CTX, NIH_ALLOC_PTR): Redefine based on NIH_ALLOC_SIZE
	(nih_alloc, nih_realloc, nih_alloc_size): Use NIH_ALLOC_SIZE
	instead of sizeof (NihAllocCtx)

2009-11-21  Scott James Remnant  <scott@netsplit.com>

	* NEWS: Update

	* nih-dbus-tool/main.c: Add option to supply the package name
	and store in a global variable for the output code to access.
	* nih-dbus-tool/output.c (output_preamble): Use the supplied package
	name in preference to "libnih" when generating preamble comments.
	(output_sentinel): Use the supplied package name in preference to
	"libnih" when generating header sentinels.
	* nih-dbus-tool/output.h: Add variable declaration
	* m4/Makefile.am (nih_dbus_tool_LDADD): Turns out that this doesn't
	link with libnih-dbus at all

	* nihify: Remove the script to copy into other source directories

	* nih/libnih.ver, nih-dbus/libnih-dbus.ver: Update versions

	* nih-dbus-tool/Makefile.am (bin_PROGRAMS): Always install the tool
	(dist_man_MANS): Always install the manual page
	(EXTRA_DIST): We don't need to distribute the manual page with this
	now

	* nih/libnih.pc.in, nih-dbus/libnih-dbus.pc.in: Source to pkg-config
	data files
	* configure.ac: Generate the actual pkg-config files from the sources
	* nih/Makefile.am (lib_LTLIBRARIES): Always install libnih.la
	(include_HEADERS): Always install the header files
	(pkgconfig_DATA): Install the pkg-config file
	(EXTRA_DIST): Distribute the source to it
	* nih-dbus/Makefile.am (lib_LTLIBRARIES): Always install libnih-dbus.la
	(include_HEADERS): Always install the header files
	(pkgconfig_DATA): Install the pkg-config file
	(EXTRA_DIST): Distribute the source to it

	* Makefile.am: Always build libnih-dbus and nih-dbus-tool

	* m4/misc.m4, m4/compiler.m4, m4/linker.m4: Merge together into
	a single libnih.m4 file for easier aclocal inclusion.
	* m4/libnih.m4 (NIH_INIT): Drop this macro, libnih shouldn't need
	software to call any special macros other than the ones they
	probably need anyway.
	* m4/libs.m4: Drop this source and the NIH_LIB_DBUS macro, since
	we'll always build this
	* m4/Makefile.am: Unconditionally install the new macro file
	* configure.ac: Replace NIH_INIT with the bits we actually want to
	check for here.

	* README: Remove the usage instructions, since this is going to
	be an ordinary shared library; rewrite the Dependencies section
	language to be better; add a Cross-compiling section.

	* configure.ac: Since this library is now being used in several
	places, it's time to start caring about API and stop compiling it
	statically into things.  Bump version to 1.0.0.  Bug fixes without
	any API changes will be named 1.0.x; backwards compatible API
	changes 1.x.0, etc.
	* NEWS: Bump version to 1.0.0
	* TODO: Update with missing bits for 1.0 and plans for 1.1/2.0

2009-10-03  Scott James Remnant  <scott@netsplit.com>

	* m4/libs.m4 (NIH_LIB_DBUS): Allow an external nih-dbus-tool to
	be used by setting NIH_DBUS_TOOL when calling configure; when
	cross-compiling, if this is not set, look for it in the PATH and
	warn if we fall back to using our built copy.
	* nih-dbus-tool/Makefile.am ($(com_netsplit_Nih_Test_object_OUTPUTS)): 
	($(com_netsplit_Nih_Test_proxy_OUTPUTS)): Use an externally built
	nih-dbus-tool for the tests if given, not strictly right but the
	best we can do when cross-compiling (when we probably won't run
	"make check" anyway)

	* nih/file.c (nih_dir_walk_sort): Add static function to replace
	alphasort() which we can't call anymore.  It would be deeply ironic
	to bitch about glibc breaking API in the libnih changelog.
	(nih_dir_walk_scan): Replace alphasort() with nih_dir_walk_sort()

2009-08-11  Johan Kiviniemi  <johan@kiviniemi.name>

	* nih/logging.c: Expose the glibc-internal __abort_msg symbol
	so that we can set it.
	(nih_log_message): Save a copy of any fatal or higher log message
	into this variable; assuming that abort() is the next function call
	as is the case for nih_assert()

2009-08-11  Scott James Remnant  <scott@netsplit.com>

	* nih/test_alloc.h (TEST_ALLOC_NOT_PARENT): Add the opposite test
	for a known parent, making sure that something is not a parent.

2009-08-04  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_alloc.c (test_ref, test_unref): Add tests for
	multiple identical parents.
	* nih/alloc.h: Document that we specifically permit multiple
	references between two objects.

	* configure.ac: 0.4.0 is a bit far, and the nih_alloc() changes are
	largely minor in effect outside the library; let's call this 0.3.5
	* NEWS: Change version

	* nih-dbus-tool/node.c (node_start_tag): Make node object local.
	(node_end_tag): Replace use of nih_unref_only with a simple
	nih_ref()/nih_unref() pair
	* nih-dbus-tool/interface.c (interface_start_tag): Make interface
	object local
	* nih-dbus-tool/method.c (method_start_tag): Make method object
	local.
	* nih-dbus-tool/signal.c (signal_start_tag): Make signal object
	local.
	* nih-dbus-tool/argument.c (argument_start_tag): Make argument
	object local.
	* nih-dbus-tool/property.c (property_start_tag): Make property
	object local.
	* nih-dbus-tool/tests/test_type.c (test_of): Replace
	TEST_ALLOC_ORPHAN(ptr) with TEST_ALLOC_PARENT(ptr, NULL)
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal): Replace
	TEST_ALLOC_ORPHAN(ptr) with TEST_ALLOC_PARENT(ptr, NULL)
	* nih-dbus-tool/tests/test_node.c (test_end_tag): 
	Replace TEST_ALLOC_ORPHAN(ptr) with TEST_ALLOC_PARENT(ptr, NULL)
	(test_start_tag, test_end_tag): Discard stack objects after pushing
	* nih-dbus-tool/tests/test_interface.c (test_start_tag)
	(test_end_tag): Discard stack objects after pushing
	* nih-dbus-tool/tests/test_method.c (test_start_tag)
	(test_end_tag): Discard stack objects after pushing
	* nih-dbus-tool/tests/test_signal.c (test_start_tag)
	(test_end_tag): Discard stack objects after pushing
	* nih-dbus-tool/tests/test_property.c (test_start_tag)
	(test_end_tag): Discard stack objects after pushing
	* nih-dbus-tool/tests/test_argument.c (test_start_tag)
	(test_end_tag): Discard stack objects after pushing

	* nih/io.c (nih_io_read_message): Replace use of nih_unref_only
	with a simple nih_ref()/nih_unref() pair
	(nih_io_write): Use nih_local for the message, we either reference
	it when we send or we throw it away on returning.
	* nih/tests/test_io.c (test_watcher): After sending the message
	we need to discard it, it's only referenced not stolen now.
	(test_read_message): Replace TEST_ALLOC_ORPHAN(msg) with
	TEST_ALLOC_PARENT(msg, NULL)

	* nih/tests/test_string.c (test_sprintf, test_vsprintf)
	(test_strdup, test_strndup): Replace TEST_ALLOC_ORPHAN(ptr)
	checks with TEST_ALLOC_PARENT(ptr, NULL)
	(test_array_addp): Fix bad uses of TEST_ALLOC_FAIL on data
	allocated outside of the loop, necessary now that the pointer
	won't be "stolen" by the function merely referenced

	* nih/alloc.c (nih_alloc_ref_new): Allow parent to be NULL, when
	it is we store NULL in ref->parent and leave the children_entry
	as an empty list node.
	(NIH_ALLOC_CTX): Context for a NULL pointer is NULL
	(nih_alloc): Always allocate a reference, even when the parent is
	NULL creating a NULL ref
	(nih_discard): Lookup a NULL reference and free that before checking
	for existing references.
	(nih_ref, nih_unref, nih_alloc_ref_lookup): Allow parent to be NULL
	(nih_unref_only): We don't need this function anymore so drop
	(nih_alloc_parent): Since NULL can be a parent, this now looks
	that up - there's no function for "has a parent"
	* nih/alloc.h: Remove nih_unref_only prototype, update documentation
	* nih/test_alloc.h (TEST_ALLOC_PARENT): Update documentation to
	reflect that NULL is valid again
	(TEST_ALLOC_ORPHAN): Drop this macro.
	* nih/tests/test_alloc.c (test_new, test_alloc, test_realloc):
	Replace TEST_ALLOC_ORPHAN checks with TEST_ALLOC_PARENT (ptr, NULL)
	(test_ref): Make sure that the NULL reference is not removed by
	adding another; add new test for adding a new NULL reference.
	(test_unref): Add tests for removing the NULL reference and
	freeing or leaving the object.
	(test_parent): Add test for looking up NULL Parent
	* nih/libnih.supp: Add suppressions for nih_alloc_ref_new in the
	appropriate places.
	* NEWS: Update

2009-08-03  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_set_string_sync)
	(test_set_object_path_sync, test_set_signature_sync): Fix the incorrect
	parent tests to actually check for the specific parent rather than
	just a parent.

2009-08-02  Scott James Remnant  <scott@netsplit.com>

	* configure.ac: Bump version to 0.4.0
	* NEWS: Begin new release

	* NEWS: Release 0.3.2

2009-07-29  Michael Biebl  <mbiebl@gmail.com>

	* nih/child.h: Remove unnecessary sys/ptrace.h and linux/ptrace.h
	headers, that prevent compilation on ia64.

2009-07-22  Michael Biebl  <mbiebl@gmail.com>

	* nih-dbus-tool/Makefile.am (dist_man_MANS): Don't install the
	manpages unless INSTALL_NIH, take care to make sure they're still
	distributed.

2009-07-15  Scott James Remnant  <scott@netsplit.com>

	* m4/libs.m4 (NIH_LIB_DBUS): Now that D-Bus 1.2.16 proper has been
	released, update our version requirements to that.
	* README: Update documentation.

2009-07-14  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_main.c (test_init): Add a test for being called
	as a login shell.
	* nih/main.c (nih_main_init_full): Check for and skip initial dash.

2009-07-11  Scott James Remnant  <scott@netsplit.com>

	* configure.ac: Bump version to 0.3.2
	* NEWS: Begin new release

2009-07-09  Scott James Remnant  <scott@netsplit.com>

	* NEWS: Release 0.3.1

	* m4/libs.m4 (NIH_LIB_DBUS): Increase D-Bus dependency to current
	GIT HEAD (1.2.15)
	* README: Update documentation.
	* NEWS: Note the change.

	* nih-dbus-tool/demarshal.c (demarshal_array): Always initialise
	all arrays to NULL first, and then only allocate the arrays after
	to avoid gcc's uninitialised warnings.
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal): Update
	expected output to match
	* nih-dbus-tool/tests/expected/test_method_proxy_notify_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_notify_function_array.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_no_input.c:
	Update the method tests expected output too

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c (test_new_struct_array)
	(test_new_dict_entry_array): Initialise alloc-safe variables to
	NULL to avoid gcc warning

	* nih-dbus/dbus_connection.c (nih_dbus_timeout_toggled): Use the
	monotonic clock to recalculate the timer
	* nih-dbus/Makefile.am (libnih_dbus_la_LIBS): Rename to _LIBADD
	(libnih_dbus_la_LIBADD): Link with librt

	* nih/timer.c (nih_timer_add_timeout, nih_timer_add_periodic)
	(nih_timer_poll): Use a monotonic clock for timers, not the realtime
	clock.
	* nih/main.c (nih_main_loop): Calculate select time based on the
	monotonic clock.
	* nih/Makefile.am (libnih_la_LIBADD): Link with librt

	* README: Bump the recommended D-Bus

2009-07-08  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_dir_walk_scan): Should compare against DT_DIR
	not use S_ISDIR

	* NEWS: Update.

	* nih/file.h (NihFileFilter): Add an is_dir argument
	* nih/file.c (nih_dir_walk_scan): Pass the new argument
	* nih/watch.c (nih_watch_handle): Pass the extra argument
	* nih/tests/test_file.c (my_filter): Add the extra argument but
	ignore
	* nih/tests/test_watch.c (my_filter): Add here too

2009-07-03  Scott James Remnant  <scott@netsplit.com>

	* nih/error.h (NihError): Declare this a slightly odd way to
	permit the members to be directly embedded in sub-classes rather
	than referring back through an accessor variable.
	* nih-dbus/dbus_error.h (nih_dbus_error): Embed the NihError
	members directly using the new macro.
	* nih-dbus/dbus_error.c (nih_dbus_error_raise)
	(nih_dbus_error_raise_printf): Just set number and message directly;
	cast before raising.
	* nih-dbus/dbus_object.c (nih_dbus_object_property_get)
	(nih_dbus_object_property_get_all, nih_dbus_object_property_set): 
	Access message through the dbus_err cast.
	* nih-dbus/tests/test_dbus_error.c (test_error_raise)
	(test_error_raise_printf): Test directly accessing the number
	and message.

2009-07-02  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/tests/test_dbus_proxy.c (test_connect): We can end up
	with a lot of stray signals with these tests, so open and close
	the connections for each one.

	* NEWS: Update.
	* TODO: Update.

	* nih-dbus-tool/interface.c (interface_proxy_get_all_function)
	(interface_proxy_get_all_sync_function),
	* nih-dbus-tool/method.c (method_proxy_function)
	(method_proxy_sync_function),
	* nih-dbus-tool/property.c (property_proxy_get_function)
	(property_proxy_set_function, property_proxy_get_sync_function)
	(property_proxy_set_sync_function): Set the auto_start flag in
	new method calls that we create.
	* tests/expected/test_interface_proxy_get_all_function_standard.c,
	* tests/expected/test_interface_proxy_get_all_sync_function_standard.c,
	* tests/expected/test_interface_proxy_get_all_sync_function_structure.c,
	* tests/expected/test_method_proxy_function_array.c,
	* tests/expected/test_method_proxy_function_deprecated.c,
	* tests/expected/test_method_proxy_function_no_args.c,
	* tests/expected/test_method_proxy_function_standard.c,
	* tests/expected/test_method_proxy_function_structure.c,
	* tests/expected/test_method_proxy_sync_function_array_input.c,
	* tests/expected/test_method_proxy_sync_function_deprecated.c,
	* tests/expected/test_method_proxy_sync_function_no_args.c,
	* tests/expected/test_method_proxy_sync_function_no_input.c,
	* tests/expected/test_method_proxy_sync_function_no_output.c,
	* tests/expected/test_method_proxy_sync_function_standard.c,
	* tests/expected/test_method_proxy_sync_function_structure_input.c,
	* tests/expected/test_method_proxy_sync_function_structure_output.c,
	* tests/expected/test_property_proxy_get_function_standard.c,
	* tests/expected/test_property_proxy_get_function_deprecated.c,
	* tests/expected/test_property_proxy_get_sync_function_standard.c,
	* tests/expected/test_property_proxy_get_sync_function_structure.c,
	* tests/expected/test_property_proxy_get_sync_function_deprecated.c,
	* tests/expected/test_property_proxy_set_function_standard.c,
	* tests/expected/test_property_proxy_set_function_structure.c,
	* tests/expected/test_property_proxy_set_function_array.c,
	* tests/expected/test_property_proxy_set_function_deprecated.c,
	* tests/expected/test_property_proxy_set_sync_function_standard.c,
	* tests/expected/test_property_proxy_set_sync_function_structure.c,
	* tests/expected/test_property_proxy_set_sync_function_array.c,
	* tests/expected/test_property_proxy_set_sync_function_deprecated.c,
	* tests/expected/test_node_proxy_functions_standard.c,
	* tests/expected/test_node_proxy_functions_no_methods.c,
	* tests/expected/test_node_proxy_functions_no_signals.c,
	* tests/expected/test_node_proxy_functions_no_properties.c,
	* tests/expected/test_node_proxy_functions_only_properties.c,
	* tests/expected/test_node_proxy_functions_structure.c,
	* tests/expected/test_output_proxy_standard.c:
	Update expected output.
	
	* nih-dbus/dbus_proxy.h (NihDBusProxy): Add an auto_start member
	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_new): Initialise auto_start
	member to TRUE (the D-Bus default).
	* nih-dbus/tests/test_dbus_proxy.c (test_new): Add checks for
	auto-start being TRUE.
	* nih-dbus-tool/signal.c (signal_proxy_function): Look up connection
	and path through the proxy object; if the proxy object has a name,
	compare the signal sender against the OWNER of that name, not the
	name.
	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Drop
	parent argument from calls to nih_dbus_proxy_connect.  Add test
	cases for signal catching on peer-to-peer and well-known name (we
	were previously just using unique).
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_new_byte)
	(test_new_boolean, test_new_int16, test_new_uint16)
	(test_new_int32, test_new_uint32, test_new_int64)
	(test_new_uint64, test_new_double, test_new_string)
	(test_new_object_path, test_new_signature, test_new_struct)
	(test_new_int32_array, test_new_str_array)
	(test_new_int32_array_array, test_new_struct_array)
	(test_new_dict_entry_array): Drop the parent argument from calls
	to nih_dbus_proxy_connect
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_standard.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_structure.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_standard.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_methods.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_properties.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_structure.c,
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.c:
	Update expected output

	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_new): Track the name whenever
	one is given, not just when we have a lost handler.
	(nih_dbus_proxy_name_track): lost_handler is not compulsory
	(nih_dbus_proxy_name_owner_changed): Make the lost handler optional
	(nih_dbus_proxy_destroy): name tracking must be cleaned up when
	there's a name, not a lost handler
	* nih-dbus/tests/test_dbus_proxy.c (test_name_owner_changed): Add
	tests for both well-known and unique names with both being tracked.
	(test_name_owner_changed): Add a test case for tracking a unique
	name.

	* nih-dbus/dbus_proxy.h (NihDBusProxySignal): Go back to just
	holding a reference to the proxy in the connected signal, we need
	its name owner tracking.
	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_connect): Keep a reference
	to the proxy, don't copy the members in; be allocated as a child
	of the proxy.

	* nih-dbus/tests/test_dbus_proxy.c (test_connect): Add a test
	case for connecting to a signal by well-known name, rather than
	just unique name

	* nih-dbus-tool/output.c (output): Don't know where the word
	"Forward" came from in this comment, delete it.
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.c,
	* nih-dbus-tool/tests/expected/test_output_object_standard.c: 
	Delete from the expected output as well.

	* nih-dbus-tool/main.c: Add a --default-interface argument that
	takes the place of setting the Symbol annotation to "".  This is
	much cleaner, and allows the user of the code to decide, not the
	author of the interface.

	* nih-dbus-tool/interface.c (interface_annotation): Don't allow
	the symbol annotation to be empty again.
	(interface_end_tag): Which means that the symbol can never be
	empty when we get to here.
	* nih-dbus-tool/tests/test_interface.c (test_annotation): Drop the
	test case for the empty annotation.
	(test_end_tag): And drop the empty string test case.

	* nih-dbus/tests/test_dbus_object.c (test_object_property_get)
	(test_object_property_set): We actually want "Access Denied" returned
	instead of "No Such Method".
	* nih-dbus/dbus_object.c (nih_dbus_object_property_get)
	(nih_dbus_object_property_set): Rework so that we can return
	"access denied".

	* nih-dbus/tests/test_dbus_object.c (test_object_property_get)
	(test_object_property_set, test_object_property_get): Add some test
	cases for property access.

	* TODO: Update.

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_get_all)
	(test_get_all_sync): End-to-end test of the proxy get_all functions.

	* nih-dbus-tool/interface.c (interface_proxy_get_all_notify_function)
	(interface_proxy_get_all_sync_function): We can't use continue to
	repeat the loop, because there might be inner loops.  Use the
	local label trick.
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_notify_function_standard.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_notify_function_structure.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_sync_function_standard.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_sync_function_structure.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_standard.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_methods.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_signals.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_only_properties.c,
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.c: Update
	expected output for test cases

2009-07-01  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_struct_to_str)
	(test_struct_to_str_sync, test_str_to_struct)
	(test_str_to_struct_sync, test_struct_array_to_str)
	(test_struct_array_to_str_sync, test_str_to_struct_array)
	(test_str_to_struct_array_sync, test_dict_entry_array_to_str)
	(test_dict_entry_array_to_str_sync)
	(test_str_to_dict_entry_array)
	(test_str_to_dict_entry_array_sync, test_new_struct)
	(test_new_struct_array, test_new_dict_entry_array)
	(test_get_structure, test_get_structure_sync)
	(test_set_structure, test_set_structure_sync)
	(test_get_struct_array, test_get_struct_array_sync)
	(test_set_struct_array, test_set_struct_array_sync)
	(test_get_dict_entry_array, test_get_dict_entry_array_sync)
	(test_set_dict_entry_array, test_set_dict_entry_array_sync): Proxy
	test functions for structures, arrays of structures, and arrays
	of dictionary entries in converstion, signal and property get/set
	form.

	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c (my_test_get_struct_array)
	(my_test_get_dict_entry_array): Be consistent about what generates
	a D-Bus error and what generates a generic error.
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c (test_get_struct_array)
	(test_get_dict_entry_array): Update to match.

	* nih-dbus-tool/tests/com.netsplit.Nih.Test.xml: Add methods, signals
	and properties that take a structure, an array of structures and an
	array of dictionary entries to the tests.
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.h: Add structure
	definition for the property we store behind the scenes, add extern
	variables for the structure and structure/dictionary array properties
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c (my_test_struct_to_str)
	(my_test_str_to_struct, my_test_struct_array_to_str)
	(my_test_str_to_struct_array, my_test_dict_entry_array_to_str)
	(my_test_str_to_dict_entry_array, my_test_get_structure)
	(my_test_set_structure, my_test_get_struct_array)
	(my_test_set_struct_array, my_test_get_dict_entry_array)
	(my_test_set_dict_entry_array): Add implementation for the structure
	and structure/dictionary array conversion functions and property
	get/set functions.  Signal emission is implemented entirely by the
	binding tool.
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c (test_struct_to_str)
	(test_str_to_struct, test_struct_array_to_str)
	(test_str_to_struct_array, test_dict_entry_array_to_str)
	(test_str_to_dict_entry_array, test_new_struct)
	(test_new_struct_array, test_new_dict_entry_array)
	(test_get_structure, test_set_structure, test_get_struct_array)
	(test_set_struct_array, test_get_dict_entry_array)
	(test_set_dict_entry_array): Add new test cases for structures,
	structure arrays and dictionaries.

2009-06-30  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_node.c (test_proxy_functions): Structures
	of readable properties come after all writable ones

	* nih-dbus-tool/tests/com.netsplit.Nih.Test.xml: Can't just call the
	property "double" now it ends up in a structure, apply an annotation
	to change the symbol.
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c (my_test_get_double)
	(my_test_set_double): Rename
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_get_double)
	(test_get_double_sync, test_set_double, test_set_double_sync): Call
	the renamed functions.

	* nih-dbus-tool/tests/test_marshal.c (test_marshal): Add missing test
	cases for arrays of dictionary entries.
	* nih-dbus-tool/tests/marshal_factory.c: Generate a dict entry test
	* nih-dbus-tool/tests/marshal_code.h: Add the expected structure type
	and prototypes.
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal): Add missing
	test cases for arrays of dictionary entries.
	* nih-dbus-tool/tests/demarshal_code.h: Add the expected structure
	type and prototypes.
	* nih-dbus-tool/tests/demarshal_factory.c: Generate a dict entry test

	* nih-dbus-tool/marshal.c, nih-dbus-tool/demarshal.c,
	* nih-dbus-tool/node.c, nih-dbus-tool/method.c, nih-dbus-tool/signal.c,
	* nih-dbus-tool/property.c: Add missing mention of @structs in
	function documentation.

	* nih-dbus-tool/tests/test_interface.c (test_proxy_get_all_function)
	(test_proxy_get_all_notify_function)
	(test_proxy_get_all_sync_function): Include a mix of readwrite, read
	and writable properties in the test - only the first two should
	appear in the output.

	* nih-dbus-tool/output.c (output): Source should include string.h and
	stdint.h for the following code, header should include stdint.h
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.c:
	Add the headers and the get_all functions to the expected output
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.h: 
	Add the headers, properties structure and get_all function prototypes
	to the expected output
	* nih-dbus-tool/tests/expected/test_output_object_standard.c,
	* nih-dbus-tool/tests/expected/test_output_object_standard.h,
	* nih-dbus-tool/tests/expected/test_output_object_no_interfaces.c,
	* nih-dbus-tool/tests/expected/test_output_object_no_interfaces.h,
	* nih-dbus-tool/tests/expected/test_output_proxy_no_interfaces.c: 
	* nih-dbus-tool/tests/expected/test_output_proxy_no_interfaces.h: 
	Add the headers to the expected output

	* nih/test_files.h (TEST_EXPECTED_STR): Don't just compare the start
	of the string, make sure we compare the whole string - easiest way
	is to check the length first
	(TEST_EXPECTED_FILE): Make sure the files are the same length

	* nih-dbus-tool/node.c (node_proxy_functions): If there are
	properties, include the async and sync versions of the get_all
	function.  These define all the property structs, so the only ones
	we need are the write-only ones.
	* nih-dbus-tool/tests/test_node.c (test_proxy_functions): Add
	the expected externs, prototypes, typedefs and structs for the
	get_all function.
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_standard.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_methods.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_signals.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_only_properties.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_structure.c:
	Add the "get_all" function expected output.

2009-06-29  Scott James Remnant  <scott@netsplit.com>

	* nih/test_files.h (TEST_EXPECTED_STR): Display the full original
	string, not just the first part.

	* nih-dbus-tool/interface.c (interface_proxy_get_all_function)
	(interface_proxy_get_all_notify_function)
	(interface_proxy_get_all_sync_function): Add functions to generate
	proxy methods that get all of the properties of the given interface,
	returned as members of a structure.
	* nih-dbus-tool/interface.h: Add prototypes.
	* nih-dbus-tool/tests/interface_factory.c: Call the new functions
	to generate other functions that we can test
	* nih-dbus-tool/tests/interface_code.h: Expected structure definitions,
	typedefs and prototypes for generated code.
	* nih-dbus-tool/tests/test_interface.c (test_proxy_get_all_function)
	(test_proxy_get_all_notify_function)
	(test_proxy_get_all_sync_function): Test both the generator functions
	themselves and the code that they generate.
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_function_standard.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_notify_function_standard.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_notify_function_structure.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_sync_function_standard.c,
	* nih-dbus-tool/tests/expected/test_interface_proxy_get_all_sync_function_structure.c:
	Expected output from generators
	* nih-dbus-tool/Makefile.am (check_PROGRAMS): Build the interface
	factory binary
	(test_interface_SOURCES): Depend on the header file
	(nodist_test_interface_SOURCES): Build and link the generated source
	(test_interface_LDADD): Need to link to libnih-dbus.la
	(interface_factory_SOURCES, interface_factory_LDFLAGS)
	(interface_factory_LDADD, tests/interface_code.c): Details to build
	interface factory binary
	(CLEANFILES): Make sure we clean up
	(EXTRA_DIST): Distribute expected files

2009-06-28  Scott James Remnant  <scott@netsplit.com>

	* nih/test_files.h (TEST_EXPECTED_STR, TEST_EXPECTED_FILE): It's
	getting increasingly annoying to have very large strings containing
	C source which we compare, add a couple of macros to let us compare
	a string or file against the contents of a file under tests/expected
	* nih-dbus-tool/tests/test_method.c,
	* nih-dbus-tool/tests/test_signal.c,
	* nih-dbus-tool/tests/test_property.c,
	* nih-dbus-tool/tests/test_node.c,
	* nih-dbus-tool/tests/test_output.c: Cut out the embedded C source
	into separate files
	* nih-dbus-tool/tests/expected/test_method_object_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_no_input.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_no_output.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_structure_input.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_structure_output.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_async.c,
	* nih-dbus-tool/tests/expected/test_method_object_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_method_reply_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_reply_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_method_reply_function_structure.c,
	* nih-dbus-tool/tests/expected/test_method_reply_function_array.c,
	* nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_structure.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_array.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_notify_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_notify_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_notify_function_structure.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_notify_function_array.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_standard.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_no_input.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_no_output.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_structure_input.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_structure_output.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_array_input.c,
	* nih-dbus-tool/tests/expected/test_method_proxy_sync_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_signal_object_function_standard.c,
	* nih-dbus-tool/tests/expected/test_signal_object_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_signal_object_function_structure.c,
	* nih-dbus-tool/tests/expected/test_signal_object_function_array.c,
	* nih-dbus-tool/tests/expected/test_signal_object_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_standard.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_no_args.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_structure.c,
	* nih-dbus-tool/tests/expected/test_signal_proxy_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_object_get_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_object_get_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_object_get_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_object_set_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_object_set_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_object_set_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_notify_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_notify_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_notify_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_array.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_notify_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_notify_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_sync_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_sync_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_get_sync_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_sync_function_standard.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_sync_function_structure.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_sync_function_array.c,
	* nih-dbus-tool/tests/expected/test_property_proxy_set_sync_function_deprecated.c,
	* nih-dbus-tool/tests/expected/test_node_interfaces_array_object.c,
	* nih-dbus-tool/tests/expected/test_node_interfaces_array_proxy.c,
	* nih-dbus-tool/tests/expected/test_node_interfaces_array_none.c,
	* nih-dbus-tool/tests/expected/test_node_object_functions_standard.c,
	* nih-dbus-tool/tests/expected/test_node_object_functions_no_methods.c,
	* nih-dbus-tool/tests/expected/test_node_object_functions_no_signals.c,
	* nih-dbus-tool/tests/expected/test_node_object_functions_no_properties.c,
	* nih-dbus-tool/tests/expected/test_node_object_functions_only_properties.c,
	* nih-dbus-tool/tests/expected/test_node_object_functions_structure.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_standard.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_methods.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_signals.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_no_properties.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_only_properties.c,
	* nih-dbus-tool/tests/expected/test_node_proxy_functions_structure.c,
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.c,
	* nih-dbus-tool/tests/expected/test_output_proxy_standard.h,
	* nih-dbus-tool/tests/expected/test_output_proxy_no_interfaces.c,
	* nih-dbus-tool/tests/expected/test_output_proxy_no_interfaces.h,
	* nih-dbus-tool/tests/expected/test_output_object_standard.c,
	* nih-dbus-tool/tests/expected/test_output_object_standard.h,
	* nih-dbus-tool/tests/expected/test_output_object_no_interfaces.c,
	* nih-dbus-tool/tests/expected/test_output_object_no_interfaces.h:
	Expected output texts
	* nih-dbus-tool/Makefile.am (EXTRA_DIST): Distribute the expected
	source files

	* nih-dbus-tool/output.c (output): Pass a structs list to calls to
	node_output_functions() and node_proxy_functions() and place the
	formatted output in the header file before the typedefs.
	* nih-dbus-tool/tests/test_output.c (test_output): Make sure we
	test having a structure in both proxy and object mode.

	* nih-dbus-tool/node.c (node_object_functions)
	(node_proxy_functions): Call the various function generators with
	a structs list, which we copy up into our own new structs argument.
	* nih-dbus-tool/node.h: Add structs arguments to prototypes
	* nih-dbus-tool/tests/test_node.c (test_object_functions)
	(test_proxy_functions): Pass the structs argument in; make sure the
	structures are passed back as well without duplicating the definitions
	when we have multiple functions that declare them.

2009-06-26  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/property.c (property_object_get_function)
	(property_object_set_function)
	(property_proxy_get_notify_function)
	(property_proxy_set_function, property_proxy_get_sync_function)
	(property_proxy_set_sync_function):  Call marshal() and demarshal()
	with the extra arguments, obtaining most of them from our arguments
	including the Interface and Property structures.  Copy back the list
	of structures returned into a new structs argument that these
	functions accept.
	(property_proxy_get_function)
	(property_proxy_set_notify_function): Add the extra structs argument
	for consistency, though we don't do anything with it
	* nih-dbus-tool/property.h: Update prototypes to add new argument
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_object_set_function, test_proxy_get_notify_function)
	(test_proxy_set_function, test_proxy_get_sync_function)
	(test_proxy_set_sync_function): Pass in the structs array, add tests
	to make sure that members of this array are passed back when the
	property is a structure
	(test_proxy_get_function, test_proxy_set_notify_function): Pass in
	the structs array, no need to tests passing back because none ever
	will be,
	* nih-dbus-tool/tests/property_factory.c: Pass expected structs
	list when generating the code.

	* nih-dbus-tool/symbol.c (symbol_typedef): Allow the postfix to
	be NULL (property structures)
	* nih-dbus-tool/tests/test_symbol.c (test_typedef): Add tests for
	without postfix with/without other arguments.

	* nih-dbus-tool/signal.c (signal_object_function)
	(signal_proxy_function): Call marshal() and demarshal() with the
	extra arguments, obtaining most of them from our arguments including
	the Interface and Signal structures.  Copy back the list of
	structures returned into a new structs argument that these functions
	accept.
	* nih-dbus-tool/signal.h: Update prototypes to add new argument
	* nih-dbus-tool/tests/test_signal.c (test_object_function)
	(test_proxy_function): Pass in the structs array, add tests to
	make sure that members of this array are passed back when the signal
	has structure arguments
	* nih-dbus-tool/tests/signal_factory.c: Pass expected structs list
	when generating the code.

	* nih-dbus-tool/method.c (method_object_function)
	(method_reply_function, method_proxy_function)
	(method_proxy_notify_function, method_proxy_sync_function): Call
	marshal() and demarshal() with the extra arguments, obtaining most
	of them from our arguments including the Interface and Method
	structures.  Copy back the list of structures returned into a new
	structs argument that these functions accept.
	* nih-dbus-tool/method.h: Update prototypes to add new argument
	* nih-dbus-tool/tests/test_method.c (test_object_function)
	(test_reply_function, test_proxy_function)
	(test_proxy_notify_function, test_proxy_sync_function): Pass in the
	structs array, add tests to make sure that members of this array
	are passed back when the method has array arguments
	* nih-dbus-tool/tests/method_factory.c: Pass expected structs list
	when generating the code.

	* nih-dbus-tool/demarshal.c (demarshal_struct): Generate the structure
	name using symbol_typedef() rather than expecting type_of() to do
	it for us.  To do this we need extra arguments giving us the
	interface, member and variable symbol names.  Create a TypeStruct
	for it, adding members as we go, and return it via the extra structs
	list.
	(demarshal_array): Take the same extra arguments as demarshal_struct()
	so we can support arrays of structures, pass them to our recursive
	demarshal() call and make sure we pass structs back up.  Create a
	custom symbol for the structure array, so that it becomes
	"PrefixInterfaceMemberArgElement".
	(demarshal_basic): Take the extra arguments for consistency, though
	we don't do anything with them.
	(demarshal): Take the extra arguments, pass down to the static
	functions.
	* nih-dbus-tool/demarshal.h: Update prototypes.
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal): Pass in
	strings and structs list, check the structs list contents on the
	way out
	* nih-dbus-tool/tests/demarshal_factory.c (demarshal_function): Pass
	expected structs and structs list when generating the code.
	* nih-dbus-tool/tests/demarshal_code.h: Changes required in the name
	of the expected structures
	* nih-dbus-tool/Makefile.am (demarshal_factory_LDADD): Link to symbol

	* nih-dbus-tool/marshal.c (marshal_struct): Generate the structure
	name using symbol_typedef() rather than expecting type_of() to do
	it for us.  To do this we need extra arguments giving us the
	interface, member and variable symbol names.  Create a TypeStruct
	for it, adding members as we go, and return it via the extra structs
	list.
	(marshal_array): Take the same extra arguments as marshal_struct()
	so we can support arrays of structures, pass them to our recursive
	marshal() call and make sure we pass structs back up.  Create a
	custom symbol for the structure array, so that it becomes
	"PrefixInterfaceMemberArgElement".
	(marshal_basic): Take the extra arguments for consistency, though
	we don't do anything with them.
	(marshal): Take the extra arguments, pass down to the static
	functions.
	* nih-dbus-tool/marshal.h: Update prototypes.
	* nih-dbus-tool/tests/test_marshal.c (test_marshal): Pass in strings
	and structs list, check the structs list contents on the way out
	* nih-dbus-tool/tests/marshal_factory.c (marshal_function): Pass
	expected structs and structs list when generating the code.
	* nih-dbus-tool/tests/marshal_code.h: Changes required in the name
	of the expected structures
	* nih-dbus-tool/Makefile.am (marshal_factory_LDADD): Link to symbol

	* nih-dbus-tool/type.c (type_of): Simplify type_of() so that it
	only works for basic types.
	* nih-dbus-tool/tests/test_type.c (test_of): Remove complex types

	* nih-dbus-tool/type.h (TypeStruct): Add another type for structure
	definitions, we need to know the name and a list of members.
	* nih-dbus-tool/type.c (type_struct_new, type_struct_to_string):
	Function to allocate the new type and convert it to a string
	definition.
	* nih-dbus-tool/tests/test_type.c (test_struct_new)
	(test_struct_to_string): Add tests for the two new functions.
	* nih-dbus-tool/Makefile.am (test_type_LDADD): Link to indent & symbol
	(test_marshal_LDADD, test_demarshal_LDADD): These need to link to
	symbol as well.

	* nih-dbus/dbus_proxy.h: Since we use INT_MAX in a macro, we need
	to include limits.h

2009-06-23  Scott James Remnant  <scott@netsplit.com>

	* COPYING: Change licence to version 2 of the GNU GPL.
	All files have been updated to reflect this.

2009-06-21  Scott James Remnant  <scott@netsplit.com>

	* configure.ac: Bump version to 0.3.1
	* NEWS: Begin new release.

2009-06-17  Scott James Remnant  <scott@netsplit.com>

	* NEWS: Release 0.3.0

	* nih-dbus-tool/tests/test_interface.c (test_annotation): Add test
	case for an empty symbol annotation
	* nih-dbus-tool/interface.c (interface_annotation): Explicitly allow
	the symbol to be empty

	* configure.ac: Bump version up to 0.3.0, I think the nih-dbus-tool
	changes are enough to warrant it

	* nih/tests/test_error.c (test_pop_context): Initialise pid to avoid
	gcc issue where it believes the value can be uninitialised
	(test_raise_error): Initialise errors and pid.
	* nih-dbus/tests/test_dbus_connection.c (test_connect): Initialise
	variables allocated inside test constructs.
	* nih-dbus/tests/test_dbus_message.c (test_message_error): Initialise
	variables
	* nih-dbus/tests/test_dbus_proxy.c (test_name_owner_changed): More
	initialisation
	* nih-dbus-tool/tests/test_main.c (test_mode_option): Have to
	initialise ret.
	* nih-dbus-tool/tests/test_node.c (test_start_tag): And another
	* nih-dbus-tool/tests/test_interface.c (test_start_tag): One more
	* nih-dbus-tool/tests/test_method.c (test_start_tag)
	(test_end_tag, test_annotation): Bunch more ret initialises.
	(test_object_function, test_reply_function, test_proxy_function)
	(test_proxy_notify_function): Various other variables
	* nih-dbus-tool/tests/test_signal.c (test_start_tag): Another ret
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_object_set_function, test_proxy_get_notify_function)
	(test_proxy_set_notify_function): More miscellaneous ones
	* nih-dbus-tool/tests/test_argument.c (test_start_tag): Another ret
	* nih-dbus-tool/tests/test_annotation.c (test_start_tag): Yet another
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c: Even more
	in this one.

	* nih-dbus-tool/method.c (method_object_function): Don't translate
	the string we return to the caller.
	* nih-dbus-tool/property.c (property_object_set_function): Likewise
	don't translate.
	* nih-dbus-tool/tests/test_method.c (test_object_function): Update
	expected output in tests.
	* nih-dbus-tool/tests/test_property.c (test_object_set_function):
	Likewise
	* nih-dbus-tool/tests/test_node.c (test_object_functions): Likewise
	* nih-dbus-tool/tests/test_output.c (test_output): Likewise.
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c: Too many
	to count in this source file

	* nih-dbus-tool/Makefile.am (test_com_netsplit_Nih_Test_object_SOURCES)
	(test_com_netsplit_Nih_Test_proxy_SOURCES): Finally decided that we're
	not going to ship these built sources, we'd just regenerate them every
	build anyway because nih-dbus-tool will have changed.  Make them
	nodist.
	(AM_CPPFLAGS): Which means we also need to include files from the
	build directory, as well as the source directory
	(BUILT_SOURCES): Change explanation of why it's in built sources
	(CLEANFILES): Clean after build.

	* nih/tests/test_error.c (test_raise_error, test_pop_context): Unlink
	the core file after the assert tests.

	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c,
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c,
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c: #include
	quoted paths will only look in the source directory or current
	working directory, for out of tree builds the current working
	directory won't contain the header so we need to prefix with tests/
	so we can lookup from the source directory
	* nih-dbus-tool/tests/marshal_factory.c,
	* nih-dbus-tool/tests/demarshal_factory.c,
	* nih-dbus-tool/tests/method_factory.c,
	* nih-dbus-tool/tests/signal_factory.c,
	* nih-dbus-tool/tests/property_factory.c: Update generated code to
	prefix includes with tests/

	* nih/tests/test_error.c (test_raise_error, test_pop_context):
	Make sure we don't expect the filename to be always relative,
	e.g. out-of-tree builds.

2009-06-16  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/marshal.c (marshal_array, marshal_struct): In the
	array of structures situation, we can't just close the container
	because it's not been completed - instead we use the new abandon
	function to free the resources while hosing the message.
	* nih-dbus-tool/property.c (property_object_get_function)
	(property_proxy_set_function, property_proxy_set_sync_function):
	Likewise abandon the variant container, strictly speaking probably
	not required but worthwhile for consistenc
	* nih-dbus-tool/tests/test_marshal.c (test_marshal): Update the
	output checks to match
	* nih-dbus-tool/tests/test_method.c (test_object_function)
	(test_proxy_function, test_proxy_sync_function): More output updates
	* nih-dbus-tool/tests/test_signal.c (test_object_function): Update
	the output check
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_proxy_set_function, test_proxy_set_sync_function): Yet more
	* nih-dbus-tool/tests/test_node.c (test_object_functions)
	(test_proxy_functions): More output updates.
	* nih-dbus-tool/tests/test_output.c (test_output): Also update the
	top-level output

	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c: Update the
	property functions to raise the no memory error where appropriate,
	also include code to return D-Bus and generic errors for testing.
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c (test_get_byte)
	(test_get_boolean, test_get_int16, test_get_uint16)
	(test_get_int32, test_get_uint32, test_get_int64)
	(test_get_uint64, test_get_string, test_get_object_path)
	(test_get_signature, test_get_int32_array, test_get_str_array)
	(test_get_int32_array_array): Add tests for the get function returning
	an D-Bus error and a generic error.
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_get_byte)
	(test_get_boolean, test_get_int16, test_get_uint16, test_get_int32)
	(test_get_uint32, test_get_int64, test_get_uint64, test_get_double)
	(test_get_string, test_get_object_path, test_get_signature)
	(test_get_int32_array, test_get_int32_array_array): Add D-Bus error
	and generic error test cases to the async functions, making sure that
	the error handler is raised.
	(test_get_byte_sync, test_get_boolean_sync, test_get_int16_sync)
	(test_get_uint16_sync, test_get_int32_sync)
	(test_get_uint32_sync, test_get_int64_sync)
	(test_get_uint64_sync, test_get_double_sync, test_get_string_sync)
	(test_get_object_path_sync, test_get_signature_sync)
	(test_get_int32_array_sync, test_get_str_array_sync)
	(test_get_int32_array_array_sync): Also add D-Bus and generic error
	test cases to the sync functions, which are slightly harder to test
	because of the need for a separate server process; still, this tests
	the error return code.

	* nih-dbus-tool/tests/test_node.c (test_object_functions): Update the
	output tests to expect the error raises.
	* nih-dbus-tool/tests/test_output.c (test_output): Update the output
	tests to match as well.

	* nih-dbus-tool/property.c (property_object_get_function): Raise the
	no memory error when we return.
	* nih-dbus-tool/tests/test_property.c (test_object_get_function): Make
	sure that the output matches, and test the generated function with
	normal output, out of memory, dbus error and generic error returns.

	* nih-dbus/dbus_object.c (nih_dbus_object_property_get): It makes
	sense to be able to return an error when getting a property, at the
	very least it might be a PolicyKit authorisation error.
	(nih_dbus_object_property_get_all): If we get an error while getting
	any property, we have to return that error to the user, such is the
	manner in which D-Bus messages have to be built.
	* nih-dbus/tests/test_dbus_object.c (test_object_property_get):
	Update function to test for property getter functions returning
	errors.
	(test_object_property_get_all): Include a couple of test cases
	here too.

	* TODO (dbus): Update on no_reply, still not completely clear what
	we should do with this annotation as the results are surprising

	* nih-dbus-tool/method.c (method_end_tag): Ignore the NoReply
	annotation if the method has output arguments; ignore the Async
	annotation if the method is NoReply.
	* nih-dbus-tool/tests/test_method.c (test_end_tag): Make sure the
	annotations are amended and warnings emitted as appropriate.

	* nih-dbus-tool/node.c (node_object_functions): Don't generate reply
	functions for non-async method implementations
	* nih-dbus-tool/tests/test_node.c (test_object_functions): Make the
	peek method async so that's the only one that should have a reply
	function.  Also add an output value to another method to check
	ordinary return values.
	* nih-dbus-tool/tests/test_output.c (test_output): Apply the same
	changes to this test as well.

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c: Turns out
	I was using the wrong timeout value everywhere, this is why macros are
	useful -- replace the wrong "0" with NIH_DBUS_TIMEOUT_DEFAULT

	* nih-dbus/dbus_proxy.h (NIH_DBUS_TIMEOUT_DEFAULT)
	(NIH_DBUS_TIMEOUT_NEVER): Add macros so we don't have to remember
	what the timeout magic numbers are

	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c: Use
	TEST_FUNCTION with proper function names instead of TEST_GROUP

2009-06-15  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.h,
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c, 
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c,
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c: Completely
	rewrite these tests using TEST_DBUS, making sure we test as much of the
	newly generated code as possible.

	* nih-dbus-tool/tests/com.netsplit.Nih.Test.xml: Various slight
	updates to better test the newer code; add arrays of arrays to the
	tests; rename "data" to "value" to avoid clash with data argument;
	remove the glue we won't use it anymore.

	* nih-dbus-tool/Makefile.am ($(com_netsplit_Nih_Test_proxy_OUTPUTS)):
	Use "proxy" as the prefix again, "your" just looks silly.

	* nih-dbus-tool/type.c (type_strcat_assert): And now the other
	corner case we found, size arrays can be NULL if the first element
	of the array is NULL.
	* nih-dbus-tool/tests/test_type.c (test_strcat_assert): Add tests
	* nih-dbus-tool/method.c (method_reply_function)
	(method_proxy_function, method_proxy_sync_function),
	* nih-dbus-tool/signal.c (signal_object_function),
	* nih-dbus-tool/property.c (property_proxy_set_function)
	(property_proxy_set_sync_function): Think-o, we can't look at the
	previous iterated we have to look at the last function argument

	* nih-dbus-tool/type.c (type_strcat_assert): We're starting to get
	a lot of corner cases in that simple assert block, separate it out
	so we don't have to repeatedly get it wrong.
	* nih-dbus-tool/type.h: Add prototype
	* nih-dbus-tool/tests/test_type.c (test_strcat_assert): The all
	important tests.
	* nih-dbus-tool/method.c (method_reply_function)
	(method_proxy_function, method_proxy_sync_function): Use the new
	function.
	* nih-dbus-tool/signal.c (signal_object_function): Likewise.
	* nih-dbus-tool/property.c (property_proxy_set_function)
	(property_proxy_set_sync_function): Likewise.

	* nih-dbus-tool/method.c (method_reply_function)
	(method_proxy_function, method_proxy_sync_function): Input array
	arguments of basic types (those with a size_t argument following)
	may be NULL if that size_t argument is zero.  Check for this when
	adding asserts.
	* nih-dbus-tool/tests/test_method.c (test_reply_function)
	(test_proxy_function, test_proxy_sync_function): Add test cases for
	an array input argument to make sure we generate the right assert
	* nih-dbus-tool/signal.c (signal_object_function): Needs exactly
	the same patch
	* nih-dbus-tool/tests/test_signal.c (test_object_function): Add
	the test case for this one too.
	* nih-dbus-tool/property.c (property_proxy_set_function)
	(property_proxy_set_sync_function): We also need the same patch
	for this one too.
	* nih-dbus-tool/tests/test_property.c (test_proxy_set_function)
	(test_proxy_set_sync_function): And test as well

2009-06-14  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_connect): Total thinko with
	the API; I'd expected the signal structures to be public, but we
	don't generally want that.  Better just to take a signal name.
	* nih-dbus/dbus_proxy.h: Update prototype.
	* nih-dbus/tests/test_dbus_proxy.c (test_connect): Update tests
	(test_signal_destroy): Also update this one
	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Also update

2009-06-13  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/output.c (output): Need dbus_pending_data.h in the
	header too for the error handler typedef.
	* nih-dbus-tool/tests/test_output.c (test_output): Add to tests

2009-06-11  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_output.c (test_output): We want an extra
	line between extern variables and functions, but only when there are
	both.
	* nih-dbus-tool/output.c (output): Adjust the code to make that so

	* nih/child.h,
	* nih/io.h,
	* nih/logging.h,
	* nih/main.h,
	* nih/signal.h: Make sure we prefix variables with "extern"

	* nih-dbus-tool/node.c (node_interfaces_array): Make the structure
	prototypes that we export "extern", since they go in the header
	file.
	* nih-dbus-tool/tests/test_node.c (test_interfaces_array): Make sure
	that the returned variable types all include "extern" in the lists,
	but not in the output.
	* nih-dbus-tool/tests/test_output.c (test_output): Update the output
	checks of the headers to expect extern in front of variables.

2009-06-10  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/signal.c (signal_proxy_function): Eliminate the
	proxy passthrough and use proxied members directly.
	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Update
	expected output of tests to match.
	* nih-dbus-tool/tests/test_node.c (test_proxy_functions): Update
	expected output.
	* nih-dbus-tool/tests/test_output.c (test_output): Update as well

	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Pass
	the extra arguments to nih_dbus_proxy_connect(), which means we
	actually move the data pointer to the connect call now.

	* nih-dbus/dbus_proxy.h (NihDBusProxySignal): Rather than reference
	the proxy itself, copy the members that we want out of it.
	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_connect): Accept a parent
	argument, as well as a separate data argument, copy the members
	from proxy into the object, taking a reference to the connection
	as we do so.
	(nih_dbus_proxy_signal_destroy): Don't forget to unref the connection
	(nih_dbus_proxy_signal_rule): Take members directly
	* nih-dbus/tests/test_dbus_proxy.c (test_connect): Call the function
	with the two new arguments, update tests to check for the new members
	(test_signal_destroy): Call with the two new arguments.

	* nih-dbus-tool/property.c (property_proxy_set_sync_function): Add
	a parent argument to the methods, even though we never use it;
	otherwise it's irritatingly inconsistent with methods and property
	get functions.
	* nih-dbus-tool/tests/property_code.h: Adjust the expected prototype
	* nih-dbus-tool/tests/test_property.c (test_proxy_set_sync_function):
	Adjust expected output to include the parent argument
	* nih-dbus-tool/tests/test_node.c (test_proxy_functions): Update
	expected output to match
	* nih-dbus-tool/tests/test_output.c (test_output): Update as well

	* nih-dbus/dbus_proxy.h (NihDBusSignalhandler): Remove the proxy
	argument.
	* nih-dbus/tests/test_dbus_proxy.c (my_signal_handler): Remove the
	argument from here too

	* nih-dbus-tool/signal.c (signal_proxy_function): Don't pass the
	proxy to the signal handler function; we don't pass it for method
	or property reply handlers because we don't have it, it's inconsitent
	to pass it here as well - we can always make a new proxy for the origin
	after all.
	* nih-dbus-tool/tests/signal_code.h: Update typedef
	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Update
	the tests
	* nih-dbus-tool/tests/test_node.c (test_proxy_functions): Update
	expected output
	* nih-dbus-tool/tests/test_output.c (test_output): Update expected
	output.

	* nih-dbus-tool/method.c (method_proxy_notify_function): Symbol
	name for a notify function should be implementation, it's static
	(method_proxy_function): Call with the implementation name
	* nih-dbus-tool/tests/method_code.h: Update name of notify function
	we expect to be generated
	* nih-dbus-tool/tests/method_factory.c: Updadate the name of the
	notify function we'll supply in the test
	* nih-dbus-tool/tests/test_method.c (test_proxy_notify_function): 
	Rename notify function in output and when we call it
	(test_proxy_function): Rename notify function in output
	* nih-dbus-tool/tests/test_node.c (test_proxy_functions): Update
	expected output
	* nih-dbus-tool/tests/test_output.c (test_output): Update expected
	output

	* NEWS: Update
	* TODO: Update

	* nih-dbus-tool/tests/com.netsplit.Nih.Test.xml: Update to newer
	XML format, using annotations instead of namespaces.  Add a couple
	of extra tests cases, and in particular add properties.
	* nih-dbus-tool/Makefile.am ($(com_netsplit_Nih_Test_object_OUTPUTS)): 
	($(com_netsplit_Nih_Test_proxy_OUTPUTS)): Use the C version of the
	nih-dbus-tool to generate the output; currently not compatible with
	the tests, but should generate good code.  Be sure to make the
	output directory first (out of tree builds)
	(nodist_test_marshal_SOURCES, nodist_test_demarshal_SOURCES)
	(nodist_test_method_SOURCES, nodist_test_signal_SOURCES)
	(nodist_test_property_SOURCES): We don't want to distribute the
	*_code.c files so move them into a nodist prefixed
	(MAINTAINERCLEANFILES): BUILT_SOURCES are always maintainer-clean,
	so drop this
	(EXTRA_DIST): Sources are always distributed, so drop the outputs
	from this leaving only the XML
	(tests/marshal_code.c, tests/demarshal_code.c)
	(tests/method_code.c, tests/signal_code.c)
	(tests/property_code.c): Drop the temporary output, no need for it
	(CLEANFILES): Specify by expanding the nodist_*_SOURCES variables

	* nih-dbus-tool/nih_dbus_tool.py: Drop the python version

	* TODO: Update.

	* nih-dbus-tool/main.c: Actually output the source and header files

	* nih-dbus-tool/main.c: Generate the source and header paths earlier,
	using an nih_local string so we don't have to free.  Make sure we
	close the input file descriptor.  Don't put meaningless content into
	the errors we output.

	* nih-dbus-tool/main.c (mode_option): Rather than set a random enum,
	just use TRUE/FALSE as the output and node methods do.
	* nih-dbus-tool/tests/test_main.c (test_mode_option): Update.

	* nih-dbus-tool/man/nih-dbus-tool.1: Make a start on a man page for
	the tool.

	* nih-dbus-tool/output.c (output): Primary function to output C
	source and header files for a node in either object or proxy mode.
	(output_preamble): Support function to generate the preamble comment
	(output_sentinel): Support function to generate the header sentinel
	(output_write): Support file to write out to the file descriptor
	* nih-dbus-tool/output.h: Headers
	* nih-dbus-tool/tests/test_output.c: Tests for the code
	* nih-dbus-tool/Makefile.am (nih_dbus_tool_SOURCES): Compile and link
	the new source file
	(TESTS): Run the new tests
	(test_output_SOURCES, test_output_LDFLAGS, test_output_LDADD): Details
	for the new tests

	* nih-dbus-tool/type.c (type_func_to_typedef, type_func_layout):
	Use type_var_to_string instead of doing things by hand.

	* nih-dbus-tool/tests/test_type.c (test_func_layout): Noticed that
	I have no test cases for no arguments or returning void, extend the
	existing cases.
	* nih-dbus-tool/type.c (type_func_layout): Glad I did that - I didn't
	cope with no arguments.

	* nih-dbus-tool/type.c (type_func_to_typedef): We need to be able to
	lay typedefs out individually, thus add this function.
	* nih-dbus-tool/type.h: Add prototype
	* nih-dbus-tool/tests/test_type.c (test_func_to_typedef): Add tests

2009-06-09  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/node.c (node_object_functions)
	(node_proxy_functions): Implement functions that call all the
	necessary other functions to return C code for a node's object or
	proxy implementations.
	* nih-dbus-tool/node.h: Add prototypes.
	* nih-dbus-tool/tests/test_node.c (test_object_functions)
	(test_proxy_functions): Test cases for the functions.

2009-06-04  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/main.c: Change the default output mode to proxy,
	which makes a bit more sense for the majority case.

	* nih-dbus-tool/signal.c (signal_proxy_function): Name the signal
	functions _signal to match _method
	* nih-dbus-tool/tests/signal_code.h: Update to match
	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Update

	* nih-dbus-tool/node.c (node_interfaces_array): The last member
	should be just NULL, it's an array of pointers.
	* nih-dbus-tool/tests/test_node.c (test_interfaces_array): Adjust
	test case output to match.

	* nih-dbus/dbus_object.c (nih_dbus_object_introspect): Cope with
	name-less arguments.
	* nih-dbus/tests/test_dbus_object.c (test_object_introspect): Update
	input and expected return string.

	* nih-dbus-tool/interface.c (interface_end_tag): If the symbol is
	given as "", set it to NULL.
	* nih-dbus-tool/tests/test_interface.c (test_end_tag): Add a test
	case for the empty symbol.

	* nih-dbus-tool/node.c (node_interfaces_array): Generate the array
	of interfaces for a given node.
	* nih-dbus-tool/node.h: Add prototype.
	* nih-dbus-tool/tests/test_node.c (test_interfaces_array): Add tests
	for the new function

	* nih-dbus-tool/interface.c (interface_methods_array)
	(interface_signals_array, interface_properties_array): Return the
	prototype with the name set, and thus don't return a static argument
	array.
	(interface_struct): Rewrite to reuse the name and insert the static
	* nih-dbus-tool/interface.h: Update prototypes
	* nih-dbus-tool/tests/test_interface.c (test_methods_array)
	(test_signals_array, test_properties_array): Adjust to match

	* nih-dbus-tool/interface.c (interface_methods_array)
	(interface_signals_array): Restructure to expect prototypes to be
	returned from the args array functions, using that to get the name
	of those and generally making things a bit more readable.  Make
	static along the way too.

	* nih-dbus-tool/tests/test_interface.c (test_struct): Make sure the
	returned items aren't arrays.

	* nih-dbus-tool/signal.c (signal_args_array): Return the prototype
	with the name set, and thus don't return a static argument array.
	* nih-dbus-tool/signal.h: Update prototype
	* nih-dbus-tool/tests/test_signal.c (test_args_array): Adjust to match

	* nih-dbus-tool/method.c (method_args_array): Return the prototype
	with the name set, and thus don't return a static argument array.
	* nih-dbus-tool/method.h: Update prototype
	* nih-dbus-tool/tests/test_method.c (test_args_array): Adjust to match

	* nih-dbus-tool/type.h (type_var): Add an array member.
	* nih-dbus-tool/type.c (type_var_new): Initialise array to FALSE.
	(type_var_to_string, type_var_layout): Append [] if the var is an
	array
	* nih-dbus-tool/tests/test_type.c (test_var_new): Check array is FALSE
	(test_var_to_string, test_var_layout): Add checks for array

	* nih-dbus-tool/interface.c (interface_struct): Generate a structure
	variable for an interface, along with the members code.
	* nih-dbus-tool/interface.h: Add prototype
	* nih-dbus-tool/tests/test_interface.c (test_struct): Tests.

2009-06-03  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/method.c (method_args_array): Add missing NihDBusArg
	* nih-dbus-tool/tests/test_method.c (test_args_array): Update
	expected test output
	* nih-dbus-tool/signal.c (signal_args_array): Add missing NihDBusArg
	* nih-dbus-tool/tests/test_signal.c (test_args_array): Update
	expected test output
	* nih-dbus-tool/interface.c (interface_methods_array)
	(interface_signals_array, interface_properties_array): Add missing
	NihDBusMethod, NihDBusSignal and NihDBusProperty type names.
	* nih-dbus-tool/tests/test_interface.c (test_methods_array)
	(test_signals_array, test_properties_array): Update expected
	test output

	* nih-dbus-tool/interface.c (interface_properties_array): Generate
	the array of properties for an interface
	* nih-dbus-tool/interface.h: Add prototype
	* nih-dbus-tool/tests/test_interface.c (test_properties_array): Tests

	* nih-dbus-tool/method.c (method_args_array): Use method_args instead
	of args to distinguish from signals.
	* nih-dbus-tool/tests/test_method.c (test_args_array): Update.
	* nih-dbus-tool/signal.c (signal_args_array): Use signal_args instead
	of args to distinguish from methods.
	* nih-dbus-tool/tests/test_signal.c (test_args_array): Update.
	* nih-dbus-tool/interface.c (interface_methods_array)
	(interface_signals_array): Update to match
	* nih-dbus-tool/tests/test_interface.c (test_methods_array)
	(test_signals_array): Also update.

	* nih-dbus-tool/interface.c (interface_signals_array): Generate the
	array of signals for an interface, including the arguments.
	* nih-dbus-tool/interface.h: Add prototype
	* nih-dbus-tool/tests/test_interface.c (test_signals_array): Tests.

	* nih-dbus-tool/interface.c (interface_methods_array): Generate the
	array of methods for an interface, including the arguments.
	* nih-dbus-tool/interface.h: Add prototype
	* nih-dbus-tool/tests/test_interface.c (test_methods_array): Tests.

	* nih-dbus-tool/signal.c (signal_args_array): Generate the array
	of arguments for a signal.
	* nih-dbus-tool/signal.h: Add prototype.
	* nih-dbus-tool/tests/test_signal.c (test_args_array): Tests.

	* nih-dbus-tool/method.c (method_args_array): Generate the array
	of arguments for a method.
	* nih-dbus-tool/method.h: Add prototype.
	* nih-dbus-tool/tests/test_method.c (test_args_array): Tests.

	* nih-dbus-tool/symbol.c (symbol_impl): Allow the symbol name and
	postfix to be NULL, as is the case for structure definitions.
	* nih-dbus-tool/tests/test_symbol.c (test_impl): Extend test cases
	to cover new cases.

2009-06-02  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/property.c (property_object_get_function)
	(property_object_set_function, property_proxy_get_function)
	(property_proxy_get_notify_function)
	(property_proxy_set_function)
	(property_proxy_set_notify_function)
	(property_proxy_get_sync_function)
	(property_proxy_set_sync_function): Rather than accepting precanned
	names, accept prefix, interface and property and generate them every
	time.
	* nih-dbus-tool/property.h: Update prototypes.
	* nih-dbus-tool/tests/property_factory.c: Create an interface and
	pass it to the functions.
	* nih-dbus-tool/tests/property_code.h: Prototypes all change
	* nih-dbus-tool/tests/test_property.c: Update tests.

	* nih-dbus-tool/signal.c (signal_object_function)
	(signal_proxy_function): Rather than accepting precanned names, accept
	prefix, interface and signal and generate them every time
	* nih-dbus-tool/signal.h: Update prototypes.
	* nih-dbus-tool/tests/signal_factory.c: Create an interface and
	pass it to the functions
	* nih-dbus-tool/tests/signal_code.h: Filter function name changes
	as a result.
	* nih-dbus-tool/tests/test_signal.c: Update tests.

	* nih-dbus-tool/method.c (method_object_function)
	(method_reply_function, method_proxy_function)
	(method_proxy_notify_function, method_proxy_sync_function): Rather
	than accepting precanned names, accept prefix, interface and method
	and generate them every time.
	* nih-dbus-tool/method.h: Update prototypes.
	* nih-dbus-tool/tests/method_factory.c: Create an interface and pass
	it to the functions
	* nih-dbus-tool/tests/method_code.h: A couple of names of generated
	functions change as a result (becoming proper)
	* nih-dbus-tool/tests/test_method.c: Update tests

	* nih-dbus-tool/interface.c (interface_lookup_method): Move to method.c
	(interface_lookup_signal): Move to signal.c
	(interface_lookup_property): Move to property.c
	* nih-dbus-tool/interface.h: Also move prototypes
	* nih-dbus-tool/tests/test_interface.c: Also move test cases
	* nih-dbus-tool/method.c (interface_lookup_method): Rename
	to method_lookup
	* nih-dbus-tool/method.h: Update prototype.
	* nih-dbus-tool/tests/test_method.c (test_lookup_method): Rename
	to test_lookup
	* nih-dbus-tool/signal.c (interface_lookup_signal): Rename
	to signal_lookup
	* nih-dbus-tool/signal.h: Update prototype.
	* nih-dbus-tool/tests/test_signal.c (test_lookup_signal): Rename
	to test_lookup
	* nih-dbus-tool/property.c (interface_lookup_property): Rename
	to property_lookup
	* nih-dbus-tool/property.h: Update prototype
	* nih-dbus-tool/tests/test_property.c (test_lookup_property): Rename
	to test_lookup

	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_name_owner_changed): Add
	missing DBUS_TYPE_INVALID sentinel to the dbus_message_get_args()
	call.

2009-05-29  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_node.c (test_lookup_interface): Extend
	test case to look for NULL
	* nih-dbus-tool/node.c (node_lookup_interface): Allow NULL symbol
	lookup, which returns an Interface with a NULL symbol (ie. the
	default).

	* nih-dbus-tool/symbol.c (symbol_impl, symbol_extern)
	(symbol_typedef): Name generation functions
	(symbol_strcat_interface, symbol_strcat_title): Utility functions
	used for the above
	* nih-dbus-tool/symbol.h: Add prototypes
	* nih-dbus-tool/tests/test_symbol.c (test_impl, test_extern)
	(test_typedef): Test cases for the new functions

2009-05-27  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/method.c (method_proxy_sync_function): sync function
	returns an integer, so should not be malloc
	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function):
	Remove from tests as well

	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function):
	Do the child process stuff before creating the proxy, otherwise
	it holds a reference to the connection.
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_sync_function)
	(test_proxy_set_sync_function): Likewise.

2009-05-26  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/nih_dbus_tool.py: Rename conn to connection
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c: Update conn
	to connection here too

	* nih-dbus-tool/tests/test_method.c,
	* nih-dbus-tool/tests/test_signal.c, 
	* nih-dbus-tool/tests/test_property.c: Update variable names in
	test cases too

	* nih-dbus-tool/method.c,
	* nih-dbus-tool/signal.c,
	* nih-dbus-tool/property.c: Update accessor of message, proxy and
	object functions

	* nih-dbus/tests/test_dbus_message.c,
	* nih-dbus/tests/test_dbus_object.c,
	* nih-dbus/tests/test_dbus_pending_data.c,
	* nih-dbus/tests/test_dbus_proxy.c: Update to match conn/connection

	* nih-dbus/dbus_proxy.c: rename conn to connection
	* nih-dbus/dbus_proxy.h (NihDBusProxy): rename conn to connection

	* nih-dbus/dbus_object.c: rename conn to connection
	* nih-dbus/dbus_object.h (NihDBusObject): rename conn to connection
 
	* nih-dbus/dbus_pending_data.c: rename conn to connection
	* nih-dbus/dbus_pending_data.h (NihDBusPendingData): rename conn
	to connection

	* nih-dbus/dbus_message.c: rename conn to connection
	* nih-dbus/dbus_message.h (NihDBusMessage): rename conn to connection

	* nih-dbus/dbus_interface.h: Rename conn arguments to connection.

	* nih-dbus/dbus_connection.c: Rename conn arguments/variables to
	connection, for style-wise stuff
	* nih-dbus/dbus_connection.h: Update prototypes

	* nih-dbus-tool/signal.c (signal_proxy_function): Function to
	generate D-Bus connection filter functions to catch signal
	messages and pass them to a handler
	* nih-dbus-tool/signal.h: Add prototype
	* nih-dbus-tool/tests/signal_factory.c: Call the function to
	generate a filter function for testing
	* nih-dbus-tool/tests/signal_code.h: Expected prototype for
	generated function, and the typedef it casts handler functions to
	* nih-dbus-tool/tests/test_signal.c (test_proxy_function): Test
	cases for the function and the generated function

	* nih-dbus/dbus_interface.h (NihDBusSignalFilter): Rename the
	message argument to signal, since we use message for the context

2009-05-25  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_interface.h (NihDBusSignal): Add filter function
	member, which is a D-Bus connection filter that will call a proxied
	handler function.
	(NihDBusProxySignal): add advanced typedef
	(NihDBusSignalFilter): typedef for signal filter function

	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_connect): Function to
	connect a signal handler to a proxy using the filter function
	defined in the NihDBusSignal structure.
	(nih_dbus_proxy_signal_destroy): Destructor for a proxied signal
	that removes the match on the bus daemon and the filter
	(nih_dbus_proxy_signal_rule): Function to generate signal rule
	* nih-dbus/dbus_proxy.h (NihDBusProxySignal): Structure with the
	information we need about a connected signal.
	(NihDBusSignalHandler): Typedef for signal handler function we
	accept for nih_dbus_proxy_connect()
	* nih-dbus/tests/test_dbus_proxy.c (test_connect)
	(test_signal_destroy): Test the new functions

	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_destroy)
	(nih_dbus_proxy_name_track): If we don't pass a DBusError to
	dbus_bus_remove_match() then it won't wait for the reply, which
	leaks a method call reply elsewhere.

2009-05-24  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_method.c (test_proxy_function)
	(test_proxy_sync_function),
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_function)
	(test_proxy_set_function, test_proxy_get_sync_function)
	(test_proxy_set_sync_function),
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c (test_method_dispatch): 
	Update arguments to nih_dbus_proxy_new() calls

	* nih-dbus/dbus_proxy.h (NihDBusProxy): Add owner member to
	store the unique name of the proxied object, also add a handler
	function for the owner dropping off the bus and a data pointer to
	pass to it.
	(NihDBusLostHandler): typedef for lost handler function
	* nih-dbus/dbus_proxy.c (nih_dbus_proxy_new): Accept the lost handler
	and data members, setting in the function.  If the lost handler is
	passed (which may only be passed if name is not NULL) then we'll
	track that name on the bus.
	(nih_dbus_proxy_destroy): We need a destructor to tear down and
	remove bus matches and connection filters, and also unreference the
	connection.
	(nih_dbus_proxy_name_track): Set up tracking for a name, which is
	far more complicated than it needs to be; arranges for the
	NameOwnerChanged signal to be received, and obtains the current owner
	of the name.
	(nih_dbus_proxy_name_rule): Function to generate the match rule
	used for the NameOwnerChanged signal.
	(nih_dbus_proxy_name_owner_changed): Handle the NameOwnerChanged
	rule, updating the owner member of the proxy and calling the lost
	handler if the name becomes NULL.
	* nih-dbus/dbus_interface.h: Add a pre-declaration for the
	NihDBusProxy typedef since we'll need to pass this to signal filter
	functions defined here later on

2009-05-22  Scott James Remnant  <scott@netsplit.com>

	* nih/inotify.h: Remove this wrapper, we require a libc with
	inotify support.
	* m4/misc.m4 (NIH_INIT): Remove the check for sys/inotify.h
	* nih/watch.c, 
	* nih/watch.h,
	* nih/tests/test_watch.c: Update includes.
	* nih/Makefile.am (nihinclude_HEADERS): Remove inotify.h

	* COPYING: Change licence from GPL-2+ to MIT.
	All files have been updated to reflect this.

2009-05-21  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_object.h: Separate out the actual structure
	definitions for an interface, the overlap is getting difficult
	to manage and they're shared with proxies anyway.
	* nih-dbus/dbus_interface.h: File for the separated out interfaces
	* nih-dbus/libnih-dbus.h: Include new header
	* nih-dbus/Makefile.am (nihdbusinclude_HEADERS): Ship and install it

2009-05-19  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/signal.c (signal_emit_function): Rename to
	signal_object_function for consistency
	* nih-dbus-tool/signal.h: Update header
	* nih-dbus-tool/tests/signal_factory.c: Update.
	* nih-dbus-tool/tests/test_signal.c (test_emit_function): Rename to
	test_object_function to match; update

	* nih-dbus-tool/method.c (method_proxy_sync_function): Also
	following the property code, rework method calls to return an
	integer as well - which means some tricksy cleanup code in the
	case of argument errors now we don't have a top-level message
	to free.
	* nih-dbus-tool/tests/method_code.h: Update the expected prototype
	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function):
	Update the tests to match

	* nih-dbus-tool/method.c (method_proxy_notify_function): Of course,
	that's only useful if the notify function handles there being no
	reply handler, so put an if around the calling of it.
	* nih-dbus-tool/tests/test_method.c (test_proxy_notify_function):
	Update the output tests to look for the if.  Add test cases for
	that as well.

	* nih-dbus-tool/method.c (method_proxy_function): Make the same
	modification that we made to the property functions, allowing the
	reply handler to be NULL as long as the error handler isn't
	* nih-dbus-tool/tests/test_method.c (test_proxy_function): Adjust
	the output test functions, and also add a test in for no reply
	handler but an error handler

	* nih-dbus-tool/property.c (property_proxy_set_function)
	(property_proxy_set_notify_function): Functions to generate functions
	to make an asynchronous method call to set the value of a property.
	* nih-dbus-tool/property.h: Add prototypes
	* nih-dbus-tool/tests/property_factory.c: Use the functions to
	generate functions for testing purposes
	* nih-dbus-tool/tests/property_code.h: Expected prototypes of
	generated functions, along with the handler typedef that we need
	* nih-dbus-tool/tests/test_property.c (test_proxy_set_function)
	(test_proxy_set_notify_function): Test the functions and the
	generated code

2009-05-18  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_pending_data.c (nih_dbus_pending_data_new): Allow
	handler to be NULL.
	* nih-dbus/tests/test_dbus_pending_data.c (test_new): Make sure
	that NULL is permitted.

	* nih-dbus-tool/property.c (property_proxy_get_function)
	(property_proxy_get_notify_function): Functions to generate functions
	to make an asynchronous method call to get the value of a property.
	* nih-dbus-tool/property.h: Add prototypes
	* nih-dbus-tool/tests/property_factory.c: Use the functions to
	generate functions for testing purposes
	* nih-dbus-tool/tests/property_code.h: Expected prototypes of
	generated functions, along with the handler typedef that we need
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_function)
	(test_proxy_get_notify_function): Test the functions and the
	generated code

	* nih-dbus-tool/property.c (property_proxy_get_sync_function)
	(property_proxy_set_sync_function): Make sure we clean up in
	cases of out-of-memory for the interface name and property name
	arguments.
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_sync_function)
	(test_proxy_set_sync_function): Adjust test cases to match

	* nih-dbus-tool/method.c (method_proxy_notify_function): No need
	to use NIH_MUST when we're in an emomem loop.
	* nih-dbus-tool/tests/test_method.c (test_proxy_notify_function): 
	Update output tests to match.

	* nih-dbus-tool/property.c (property_proxy_get_sync_function)
	(property_proxy_set_sync_function): Functions to generate functions
	to make a synchronous method call to get or set the value of a
	property respectively.
	* nih-dbus-tool/property.h: Add prototypes
	* nih-dbus-tool/tests/property_factory.c: Call the two functions
	to generate functions for testing
	* nih-dbus-tool/tests/property_code.h: Prototypes for expected
	generated functions
	* nih-dbus-tool/tests/test_property.c (test_proxy_get_sync_function)
	(test_proxy_set_sync_function): Test the code generator and the
	generated code.

2009-05-17  Scott James Remnant  <scott@netsplit.com>

	* NEWS: Add entry for move of nih-dbus errors

2009-05-15  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_error.c (test_raise_no_memory): Fix missing
	nih_error_get ()
	(test_raise_error): Free the second error
	* nih/libnih.supp: Suppress the abort()-related leak

	* nih-dbus-tool/method.c (method_object_function): Rename externs
	to handlers
	* nih-dbus-tool/method.h: Update prototype
	* nih-dbus-tool/tests/method_factory.c: Update calls
	* nih-dbus-tool/tests/test_method.c (test_object_function): Update
	variable names in tests

	* nih-dbus-tool/method.c (method_reply_function)
	(method_proxy_sync_function): Remove the unused externs parameters
	* nih-dbus-tool/method.h: Update prototypes
	* nih-dbus-tool/tests/method_factory.c: Don't pass when we don't
	use them
	* nih-dbus-tool/tests/test_method.c (test_reply_function)
	(test_proxy_sync_function): Remove the empty list checks

	* nih-dbus-tool/property.c (property_object_get_function)
	(property_object_set_function): Rename externs to handlers
	* nih-dbus-tool/property.h: Update prototypes
	* nih-dbus-tool/tests/property_factory.c: Update calls
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_object_set_function): Update variable names in tests.

	* nih-dbus-tool/signal.c (signal_emit_function): Remove the externs
	parameter, which is not used.
	* nih-dbus-tool/signal.h: Update prototype
	* nih-dbus-tool/tests/signal_factory.c: Drop externs handling
	* nih-dbus-tool/tests/test_signal.c (test_emit_function): Drop
	tests for empty externs list

	* nih/errors.h: Remove the D-Bus errors from this file
	* nih-dbus/errors.h: Place them in a new file.
	* nih-dbus/libnih-dbus.h: Include the new header
	* nih-dbus/Makefile.am (nihdbusinclude_HEADERS): Install the new
	header.
	* nih-dbus/dbus_error.c,
	* nih-dbus/dbus_object.c: 
	* nih-dbus/tests/test_dbus_connection.c,
	* nih-dbus/tests/test_dbus_error.c,
	* nih-dbus-tool/tests/method_factory.c,
	* nih-dbus-tool/tests/signal_factory.c,
	* nih-dbus-tool/tests/property_factory.c,
	* nih-dbus-tool/tests/test_method.c,
	* nih-dbus-tool/tests/test_property.c,
	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c: Update
	headers included
	* nih-dbus-tool/nih_dbus_tool.py (Output.sourceFile): Update generated
	includes.

	* nih-dbus/dbus_object.h (NihDBusPropertySetter): Change prototype
	to return an int, instead of a handler result.  This allows us to
	introduce interesting new SetMany-like methods later.
	* nih-dbus/dbus_object.c (nih_dbus_object_property_set): Expand
	the function to do the reply handling here, this actually makes
	things much better for the ENOMEM case.
	* nih-dbus/tests/test_dbus_object.c (test_object_property_set): 
	Adjust test cases to match
	
	* nih-dbus-tool/property.c (property_object_set_function): Rework
	the prototype of property setter functions, we just want to return
	int and have the nih-dbus core deal with sending the reply.
	* nih-dbus-tool/tests/property_code.h: Update prototype.
	* nih-dbus-tool/tests/test_property.c (test_object_set_function):
	Update tests to match

	* nih-dbus-tool/method.c (method_object_function): Push an error
	context around the handler call
	* nih-dbus-tool/tests/test_method.c (test_object_function): Adjust
	tests to expect the error context

	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function): Make
	sure the methods aren't marked to expect no reply (completeness)

	* nih-dbus-tool/method.c (method_proxy_sync_function): Fix nih_strcat
	call to not overwrite variable with return value

	* nih-dbus-tool/method.c (method_proxy_function)
	(method_proxy_notify_function): Functions to generate the two
	functions required for an asynchronous method call, the first makes
	the call and the second is the pending call notify function for it
	that calls the reply handler.
	* nih-dbus-tool/method.h: Prototypes.
	* nih-dbus-tool/tests/method_factory.c: Call both functions to
	generate functions for testing
	* nih-dbus-tool/tests/method_code.h: Expected prototypes for the
	generated functions.
	* nih-dbus-tool/tests/test_method.c (test_proxy_function)
	(test_proxy_notify_function): Test the code generator and the
	generated code.

2009-05-14  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_pending_data.c (nih_dbus_pending_data_new): Allocate
	a new NihDBusPendingData structure, referencing the D-Bus connection.
	(nih_dbus_pending_data_destroy): Unreference the attached connection.
	* nih-dbus/dbus_pending_data.h: Function typedefs, structure and
	function prototype.
	* nih-dbus/tests/test_dbus_pending_data.c: Test suite.	
	* nih-dbus/libnih-dbus.h: Include the header
	* nih-dbus/Makefile.am (libnih_dbus_la_SOURCES): Build and link
	the new source file
	(nihdbusinclude_HEADERS): Install the header
	(TESTS): Run the test suite
	(test_dbus_pending_data_SOURCES, test_dbus_pending_data_LDFLAGS)
	(test_dbus_pending_data_LDADD): Test suite details.

	* nih-dbus/dbus_object.c (nih_dbus_object_new): Add a comment to
	explain why we don't reference the connection in NihDBusObject.
	* nih-dbus/dbus_object.h (NihDBusObject): Document that no
	reference is held on @conn

2009-05-13  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/method.c (method_proxy_sync_function): Rename the
	message local to method_call and the msg local to message to match
	other functions.
	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function): 
	Update tests to match

	* nih-dbus-tool/method.c (method_proxy_sync_function): Unreference
	the D-Bus method call we're building, not the message we'll return.
	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function):
	Adjust output functions to account for the change.

	* nih-dbus-tool/method.c (method_object_function): We can't just
	use a do { .. } while (0) loop and continue in the case of ENOMEM
	because that won't work for arrays.  Instead use a local label to
	goto the continuation of an outer loop like we do in
	method_proxy_sync_function()
	* nih-dbus-tool/tests/test_method.c (test_object_function): Adjust
	output tests to account for the change.

	* nih-dbus-tool/tests/test_method.c (test_object_function)
	(test_reply_function): Add tests for argument-less methods.
	* nih-dbus-tool/tests/test_signal.c (test_emit_function): Add
	test for argument-less signal, and missing test for deprecated
	signals.
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_object_set_function): Add missing tests for deprecated
	properties.
	* nih-dbus-tool/method.c (method_object_function)
	(method_reply_function): Build the assert block up as we go
	* nih-dbus-tool/signal.c (signal_emit_function): Build up the
	assert block as we go.

	* nih-dbus-tool/method.c (method_proxy_sync_function): Generate a
	function to make a synchronous method call to a remote D-Bus object.
	* nih-dbus-tool/method.h: Prototype.
	* nih-dbus-tool/tests/method_factory.c: Use the function to
	generate a function for testing
	* nih-dbus-tool/tests/method_code.h: Add expected prototype of
	generated function.
	* nih-dbus-tool/tests/test_method.c (test_proxy_sync_function): Test
	the generator function and the generated function.

	* nih-dbus/dbus_message.c (nih_dbus_message_new): Pass parent to
	nih_new() not NULL.

	* nih/error.h (nih_error_raise_no_memory): Finally succum and
	add this macro.
	(nih_return_no_memory_error): Use that macro in this.
	* nih/tests/test_error.c (test_raise_no_memory): Add test case.

2009-05-12  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/method_factory.c,
	* nih-dbus-tool/tests/signal_factory.c,
	* nih-dbus-tool/tests/property_factory.c: Use the returned externs
	list for the prototypes, rather than hard-coding them.

	* nih-dbus-tool/type.c (type_to_static, type_to_extern): Methods
	to prepend "static" and "extern" onto a type.
	* nih-dbus-tool/type.h: Prototypes.
	* nih-dbus-tool/tests/test_type.c (test_to_static)
	(test_to_extern): Test the methods.

	* nih-dbus-tool/tests/test_parse.c (test_parse_xml): Update due to
	change in error from D-Bus 1.2.14

	* nih-dbus-tool/method.c (method_object_function)
	(method_reply_function): Replace the hand-coded function layout code
	with a call to type_func_to_string()
	* nih-dbus-tool/tests/test_method.c (test_object_function)
	(test_reply_function): Adjust tests to account for the indentation
	differences.
	* nih-dbus-tool/signal.c (signal_emit_function): Replace code
	* nih-dbus-tool/tests/test_signal.c (test_emit_function): Adjust tests
	* nih-dbus-tool/property.c (property_object_get_function)
	(property_object_set_function): Replace code
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_object_set_function): Adjust tests

2009-05-11  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/property.c (property_get_function, property_set_function):
	Accept list arguments for prototypes and externs, filling them in.
	* nih-dbus-tool/property.h: Adjust prototypes.
	* nih-dbus-tool/tests/property_factory.c: Pass in the prototypes
	and extern lists, but don't actually use them just yet.
	* nih-dbus-tool/tests/test_property.c (test_get_function)
	(test_set_function): Add tests for returned prototype, including
	a test for not having a deprecated attribute.

	* nih-dbus-tool/signal.c (signal_reply_function): Accept list
	arguments for prototypes and externs, filling in the prototypes
	one.
	* nih-dbus-tool/signal.h: Adjust prototype.
	* nih-dbus-tool/tests/signal_factory.c: Pass in the prototypes
	and extern lists, but don't actually use them just yet.
	* nih-dbus-tool/tests/test_signal.c (test_reply_function): Add
	tests for returned prototype, including a test for not having a
	deprecated attribute.

	* nih-dbus-tool/demarshal.c (demarshal_array),
	* nih-dbus-tool/marshal.c (marshal_array),
	* nih-dbus-tool/method.c (method_object_function)
	(method_reply_function),
	* nih-dbus-tool/signal.c (signal_emit_function),
	* nih-dbus-tool/property.c (property_object_get_function)
	(property_object_set_function): Line-up variable blocks.
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal),
	* nih-dbus-tool/tests/test_marshal.c (test_marshal),
	* nih-dbus-tool/tests/test_method.c (test_object_function)
	(test_reply_function): 
	* nih-dbus-tool/tests/test_signal.c (test_emit_function): 
	* nih-dbus-tool/tests/test_property.c (test_object_get_function): 
	Adjust string output checks for the slight difference in indentation

	* nih-dbus-tool/type.c (type_func_to_string, type_func_layout):
	Functions to convert TypeFunc entries into strings.
	* nih-dbus-tool/type.h: Add prototypes.
	* nih-dbus-tool/tests/test_type.c (test_func_to_string)
	(test_func_layout): Test cases for the functions.

2009-05-10  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/type.c (type_var_to_string, type_var_layout):
	Functions to convert TypeVar entries into strings.
	* nih-dbus-tool/type.h: Prototypes.
	* nih-dbus-tool/tests/test_type.c (test_var_to_string)
	(test_var_layout): Test cases.

	* nih-dbus-tool/tests/test_marshal.c (test_marshal): Make sure
	the input and local variable parents are correct, and make sure the
	lists are empty in case of memory error.
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal): Make sure
	the output and local variable parents are correct, and make sure the
	lists are empty in case of memory error.

	* nih-dbus-tool/method.c (method_reply_function): Accept list
	arguments for prototypes and externs, filling in the prototypes
	one.
	* nih-dbus-tool/method.h: Adjust prototype.
	* nih-dbus-tool/tests/method_factory.c: Pass in the prototypes
	and extern lists, but don't actually use them just yet.
	* nih-dbus-tool/tests/test_method.c (test_reply_function): Add
	tests for returned prototype, including a test for not having a
	deprecated attribute.

	* nih-dbus-tool/method.c (method_object_function): Accept list
	arguments for prototypes and externs.
	* nih-dbus-tool/method.h: Add prototype.
	* nih-dbus-tool/tests/method_factory.c: Pass in the prototypes
	and extern lists, but don't actually use them just yet.x
	* nih-dbus-tool/tests/test_method.c (test_object_function): Add
	tests for returned prototype, and add a test for not having a
	deprecated attribute

	* nih-dbus-tool/type.h (TypeFunc): Structure to represent a function
	definition.
	* nih-dbus-tool/type.c (type_func_new): Function to create a new
	TypeFunc structure.
	* nih-dbus-tool/tests/test_type.c (test_func_new): Test for the
	function.

2009-05-09  Scott James Remnant  <scott@netsplit.com>

	* nih/error.c (nih_error_steal): Add a new function to get an
	error and remove it from the context, needed for stashing errors
	while trying something else - or raising an error outside of a
	context.
	* nih/error.h: Add prototype.
	* nih/tests/test_error.c (test_steal): Add test cases.

	* nih/error.h: Update documentation.

	* TODO: Update.

	* nih/main.c (nih_main_daemonise): Don't just ignore the raised
	error when we fail to write the pid file, at least warn about it.
	* nih/tests/test_main.c (test_daemonise): Hide the output from
	nih_main_daemonise() which will usually bitch about permissions

	* nih/tests/test_io.c (test_watcher): In various tests, we close
	the file descriptor when reading or writing and check for an error
	being raised - but had forgotten that we'd get the error again
	when the structure is closed as it tries to close the descriptor
	(test_message_recv, test_message_send, test_reopen)
	(test_destroy): Add a few contexts around critical bits to make
	sure we're not leaking any other errors.

	* nih/error.c (nih_error_clear): Make an unhandled error an
	assertion failure
	* nih/tests/test_error.c (test_pop_context): Make sure the
	unhandled error is asserted
	(test_raise_error): Make sure a double-raise is asserted.

	* nih/error.c (nih_error_clear): Allow the function to be called
	when there is no current error in the context
	(nih_error_init): Register as an atexit() function so that unhandled
	errors are caught when the process exits.
	(_nih_error_raise_error, nih_error_pop_context): Don't double check,
	just call the function to clear the context.

	* nih/error.c (_nih_error_raise_error): Don't allow the same
	error to be raised twice anymore.
	* nih/tests/test_error.c (test_pop_context): No need to raise the
	error twice.
	* nih/io.c (nih_io_watcher): Don't double-raise the error.
	* nih/watch.c (nih_watch_add): Again, don't double-raise the error
	* nih/tests/test_file.c (my_error_handler): No need to double-raise
	* nih-dbus-tool/annotation.c (annotation_start_tag): Don't need
	to double-raise either

	* nih/error.h (NIH_SHOULD): We don't need to raise the error again,
	simply don't free it.
	* nih/error.c (_nih_error_raise_error): Don't accept a NULL
	filename anymore.

	* nih/error.c (_nih_error_raise, _nih_error_raise_printf)
	(_nih_error_raise_system): Don't make the error a child of the
	context.

	* nih/error.h (NihError): Add filename, line and function members
	set when the error is raised.
	(NIH_SHOULD): Re-raise using _nih_error_raise_error() directly
	passing NULL for the filename and such so it's not overwritten (this
	is a temporary hack)
	(nih_error_raise, nih_error_raise_printf)
	(nih_error_raise_system, nih_error_raise_error): Macros to wrap the
	underlying functions passing the filename, line and function name
	in which they were expanded.
	* nih/error.c (nih_error_raise, nih_error_raise_printf)
	(nih_error_raise_system, nih_error_raise_error): Rename to have
	an initial underscore, accepting filename, line and function
	arguments from the wrapping macros.
	(_nih_error_raise_error): Set the filename, line and function
	members of the raised error (we just overwrite these).
	(nih_error_clear): Report where the unhandled error came from.

	* nih/error.c (nih_error_destroy): Add destructor functions for error
	messages, this clears the error from the current error context.
	(nih_error_raise_error): Set the destructor.
	(nih_error_clear): Assert that the destructor frees the error, don't
	do it ourselves.
	(nih_error_get): Do not clear the error from the context.
	(nih_error_raise_error): Check for the error being double-raised
	which is currently permitted.

2009-05-07  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/annotation.c (annotation_start_tag): Update
	error call to nih_error_raise_error().

	* nih/tests/test_error.c (test_raise_error): Use TEST_ALLOC_FAIL
	and a separate error context for each test.

	* nih/error.c (nih_error_raise_again): Rename to nih_error_raise_error()
	(nih_error_raise, nih_error_raise_printf)
	(nih_error_raise_system): Update calling.
	* nih/error.h (NIH_SHOULD): Update calling.
	Update prototype.
	* nih/tests/test_error.c (test_raise_again): Rename and change calls.
	* nih/io.c (nih_io_watcher): Update call.
	* nih/watch.c (nih_watch_add): Update call.
	* nih/tests/test_file.c (my_error_handler): Update call.
	* nih-dbus/dbus_error.c (nih_dbus_error_raise)
	(nih_dbus_error_raise_printf): Update calls.

2009-04-28  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/marshal.c (marshal_array, marshal_struct): We
	have to close a container in out-of-memory situations, unrefing
	the message isn't sufficient.
	* nih-dbus-tool/tests/test_marshal.c (test_marshal): Make sure
	all those containers are closed.
	* nih-dbus-tool/tests/test_method.c (test_object_function)
	(test_reply_function): Make sure containers called from method
	functions are closed on error too
	* nih-dbus-tool/property.c (property_object_get_function): Close
	containers in case of out-of-memory error.
	* nih-dbus-tool/tests/test_property.c (test_object_get_function): 
	Make sure the close container code is added.

	* nih-dbus/tests/test_dbus_object.c (test_object_message): Add a
	test where the first handler declines
	(test_object_property_set): Make sure that the Set handler cannot
	decline, as we can't do the same for the Get handler.
	* nih-dbus/dbus_object.c (nih_dbus_object_message): Move onto the
	next handler if the handler declines.

	* nih-dbus-tool/Makefile.am (nih_dbus_tool_LDADD)
	(test_method_LDADD, test_signal_LDADD)
	(test_com_netsplit_Nih_Test_object_LDADD)
	(test_com_netsplit_Nih_Test_proxy_LDADD): Always put libnih.la
	after libnih-dbus.la

	* nih-dbus/dbus_object.h (NihDBusMethod): Move the method handler
	to be the last member.
	* nih-dbus/tests/test_dbus_object.c: Update.
	* nih-dbus-tool/nih_dbus_tool.py (Interface.methodsArray): Update.

	* nih-dbus/Makefile.am (libnih_dbus_la_LIBS): Include libnih.la
	as it's a dependency.
	(test_dbus_error_LDADD, test_dbus_connection_LDADD)
	(test_dbus_message_LDADD, test_dbus_object_LDADD)
	(test_dbus_proxy_LDADD, test_dbus_util_LDADD): Specify libnih-dbus.la
	first since it's what we're testing, and deps go the other way

	* nih-dbus/tests/test_dbus_object.c (test_object_introspect): Add
	a missing test case for too many arguments to the Introspect call.
	* nih-dbus/dbus_object.c (nih_dbus_object_introspect): Which reveals
	we didn't catch this.

	* nih-dbus/tests/test_dbus_object.c (test_object_property_get)
	(test_object_property_get_all, test_object_property_set): Add
	missing test cases for argument errors.

	* nih-dbus/dbus_object.c (nih_dbus_object_property_get_all): Add
	function to retrieve all properties at once.
	(nih_dbus_object_message): Call out to it.
	* nih-dbus/tests/test_dbus_object.c (test_object_property_get_all):
	Test the new function.

	* nih-dbus/dbus_object.h (NihDBusPropertyGetter)
	(NihDBusPropertySetter): Add function typedefs for property get
	and set functions.
	(NihDBusProperty): Add getter and setter members.
	* nih-dbus/dbus_object.c (nih_dbus_object_property_get)
	(nih_dbus_object_property_set): Functions to handle calling the
	getter and setter functions for a single property Get or Set method.
	(nih_dbus_object_message): Call out to the new functions.
	* nih-dbus/tests/test_dbus_object.c (test_object_property_get)
	(test_object_property_set): Test the new single property get/set
	functions.

	* nih-dbus/dbus_object.h (NihDBusMarshaller): Rename to
	NihDBusMethodHandler, since this prototype only applies to methods
	and not to properties.
	(nih_dbus_method): Change type and name of marshaller member to
	handler.
	* nih-dbus/dbus_object.c (nih_dbus_object_message): Update name
	of function pointer member we use.
	* nih-dbus/tests/test_dbus_object.c: Avoid using the word "marshal"
	and use "handler" instead.

	* nih-dbus/dbus_object.c (nih_dbus_object_introspect): Put the
	Introspect interface last, since it's the least important one;
	we always want the object's own interfaces first, followed by
	properties, followed by introspection, followed by children nodes.
	* nih-dbus/tests/test_dbus_object.c (test_object_introspect):
	Update tests to match.

	* nih-dbus/tests/test_dbus_object.c (test_object_message): Split
	out the introspection test cases into a new function.
	(test_object_introspect): Add a test for having no properties.

	* nih-dbus/tests/test_dbus_object.c (test_object_new)
	(test_object_destroy, test_object_unregister)
	(test_object_message): Convert to test using TEST_DBUS rather than
	a hodge-podge of different buses and servers.

	* nih-dbus/test_dbus.h (TEST_DBUS_DISPATCH): Equivalent to
	TEST_DBUS_MESSAGE but dispatches the message internally rather
	than stealing it.

	* nih-dbus/tests/test_dbus_connection.c (test_connect): Add tests
	for a fake disconnected signal (as much as we can test anyway).

2009-04-27  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_connection.h: Note on allocation.

	* nih-dbus/dbus_message.h: Add documentation string.

	* nih-dbus/tests/test_dbus_message.c (test_message_new): Add missing
	call to dbus_shutdown() after test case.
	(test_message_error): Rewrite using TEST_DBUS and using
	TEST_ALLOC_FAIL to check for memory issues.

	* nih-dbus/dbus_connection.h: Add documentation.

	* nih-dbus/dbus_connection.c (nih_dbus_setup): We actually want
	to attempt to setup the watch, timeout and wake-up functions each
	time through nih_dbus_setup() so it can be called in a loop in
	cases of out-of-memory so do this first before setting the main
	loop function, and unwind in case of error.
	(nih_dbus_watch_toggled): D-Bus could try and change the flags
	with a toggle?

	* nih-dbus/dbus_connection.h (NihDBusConnectHandler): Add missing
	Returns to documentation string.

	* nih-dbus/dbus_error.h: Add documentation string.

	* nih-dbus/dbus_connection.c (nih_dbus_connect, nih_dbus_bus):
	Clarify that it's ok to unreference a connection obtained with
	these functions - indeed we do so everywhere in the test suite.

	* nih-dbus/dbus_connection.c (nih_dbus_connect, nih_dbus_bus)
	(nih_dbus_server): Return ENOMEM raised on insufficient memory
	rather than the D-Bus equivalent; we don't just convert these
	everywhere because sometimes we want to know that it's the
	remote side that's out of memory and we don't want to use ENOMEM
	for that.

	* nih-dbus/tests/test_dbus_connection.c: Various cleanup fixes,
	making sure we unref everything that we use.  Increase timeout
	for method calls since things get slower when under valgrind.

	* nih-dbus/dbus_connection.c (nih_dbus_connection_disconnected):
	Push an error context while calling the handler.
	(nih_dbus_new_connection): Push an error context while calling
	the handler.

	* nih/timer.c (nih_timer_poll): The timer callback can free the
	timer, so we need to adjust the due time before we call it.  In
	the case of timeouts, we hold a reference while calling and
	always free after returning.  Also push an error context during
	it so we don't leak errors.

2009-04-24  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/tests/test_dbus_connection.c (test_connect): Add tests
	for a method call being made and its reply received through the
	main loop, and for a method call timing out within the main loop.
	This exercises the watch and timeout functions.

2009-04-23  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/tests/test_dbus_connection.c (test_server): Add tests
	for address in use,

	* nih/tests/test_logging.c (my_logger): Safely strdup the message.
	(test_set_logger, test_set_priority, test_log_message): Make sure
	all calls are wrapped with TEST_ALLOC_FAIL
	(test_logger_printf): Call TEST_ALLOC_FAIL for everything.

	* nih/Makefile.am (.PHONY): Mark tests phony.
	* nih-dbus/Makefile.am (.PHONY): Mark tests phony.
	* nih-dbus-tool/Makefile.am (.PHONY): Mark tests phony.

	* nih-dbus/Makefile.am (libnih_dbus_la_CFLAGS, AM_CFLAGS): Replace
	the former with the latter.
	(test_dbus_error_CFLAGS, test_dbus_connection_LDFLAGS)
	(test_dbus_message_CFLAGS, test_dbus_object_CFLAGS)
	(test_dbus_proxy_CFLAGS, test_dbus_util_CFLAGS): Remove.

	* nih-dbus/tests/test_dbus_connection.c: Wrap every test in
	NIH_ALLOC_FAIL, to properly make sure that we handle failure
	cases properly.
	* nih-dbus/dbus_connection.c (nih_dbus_server): Disconnect the
	server before unreferencing it.

2009-04-22  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/nih_dbus_tool.py (Method.marshalFunction): Also fix
	async method handler return to match.

	* nih-dbus-tool/tests/test_main.c,
	* nih-dbus-tool/tests/test_node.c,
	* nih-dbus-tool/tests/test_interface.c,
	* nih-dbus-tool/tests/test_method.c,
	* nih-dbus-tool/tests/test_signal.c,
	* nih-dbus-tool/tests/test_property.c,
	* nih-dbus-tool/tests/test_argument.c,
	* nih-dbus-tool/tests/test_annotation.c,
	* nih-dbus-tool/tests/test_parse.c: All tests cases should use
	TEST_ALLOC_FAIL, even the ones testing for errors.  To get around
	situations where some allocations may be repeated, but others will
	fail, check the return value to see which happened.

2009-04-21  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/tests/test_dbus_message.c (my_return_error): Return
	DBUS_HANDLED_RESULT_HANDLED otherwise the message will be ignored.

	* nih-dbus-tool/property.c (property_object_get_function)
	(property_object_set_function): Generate code for functions to get
	and set, respectively, properties using a handler function.
	* nih-dbus-tool/property.h: Add prototypes.
	* nih-dbus-tool/tests/property_factory.c: Call the two functions
	to generate their resulting property get and set functions and
	place them in a C file for testing.
	* nih-dbus-tool/tests/property_code.h: Expected prototypes for
	generated functions.
	* nih-dbus-tool/tests/test_property.c (test_object_get_function)
	(test_object_set_function): Tests for the code, and for the
	resulting generated code.
	* nih-dbus-tool/Makefile.am (check_PROGRAMS): Run the program
	to generate the C code.
	(property_factory_SOURCES)
	(property_factory_LDFLAGS, property_factory_LDADD)
	(tests/property_code.c): Details for code generator.
	(CLEANFILES): Clean up after.
	(test_property_SOURCES): Link to the generated code.

	* nih-dbus/dbus_object.c: Add missing include for previous commit.

2009-04-20  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/dbus_object.c (nih_dbus_object_message): Call the
	marshaller function inside a context so that errors aren't leaked.

	* nih-dbus/dbus_object.c (nih_dbus_object_message): We don't need
	any special handling for async functions now we have nih_local, the
	function simply needs to reference the message.  Drop the requirement
	that it returns DBUS_HANDLER_RESULT_NOT_YET_HANDLED.
	* nih-dbus-tool/method.c (method_object_function): Always return
	DBUS_HANDLER_RESULT_HANDLED, even for async methods.
	* nih-dbus-tool/tests/test_method.c (test_object_function): Replace
	tests for not yet handled with ones for the ordinary handled result.

2009-04-18  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/signal.c (signal_emit_function): Generate code for
	a function that emits a signal.
	* nih-dbus-tool/signal.h: Add prototype.
	* nih-dbus-tool/tests/signal_factory.c: Call signal_emit_function()
	to generate a signal emission function and place it in a C file
	for testing.
	* nih-dbus-tool/tests/signal_code.h: Expected prototype for generated
	function.
	* nih-dbus-tool/tests/test_signal.c (test_emit_function): Test the
	generator function and generated function.
	* nih-dbus-tool/Makefile.am (check_PROGRAMS): Run the program to
	generate the C code.
	(signal_factory_SOURCES, signal_factory_LDFLAGS)
	(signal_factory_LDADD, tests/signal_code.c): Details for generator
	(CLEANFILES): Clean up after.
	(test_signal_SOURCES): Link to the generated code.

	* nih-dbus-tool/method.c (method_object_function)
	(method_reply_function): Add missing asserts.

2009-04-17  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/test_method.c: Oops, commented out the test.

	* nih-dbus-tool/tests/test_method.c (test_object_function): Add
	test cases for the no reply expected flag on an incoming message.

	* nih-dbus-tool/method.c (method_reply_function): Generate code for
	a function that sends a reply to an asynchronous method call.
	* nih-dbus-tool/method.h: Add prototype.
	* nih-dbus-tool/tests/method_factory.c: Call method_reply_function()
	to generate a reply function and place it in a C file for testing.
	* nih-dbus-tool/tests/method_code.h: Expected prototype.
	* nih-dbus-tool/tests/test_method.c (test_reply_function): Add test
	cases for the code, the generated code, and the no reply expected
	case.

	* nih-dbus-tool/tests/test_method.c (test_object_function): Add
	tests for too many arguments in method call
	* nih-dbus-tool/method.c (method_object_function): Add a block of
	code to check for extra function arguments.

	* nih-dbus-tool/method.c (method_object_function): When the method
	is marked async, ignore the output arguments and don't try and send
	any reply - instead returning the magic "not yet handled" code.
	* nih-dbus-tool/tests/method_factory.c: Generate an async version
	of the same function for testing.
	* nih-dbus-tool/tests/method_code.h: Add prototype
	* nih-dbus-tool/tests/test_method.c (test_object_function): Test
	code generation and the generated code for an asynchronous method.

	* nih-dbus-tool/method.c (method_object_function): Generate code for
	a function that handles an incoming method call, and calls a handler
	function for it.
	* nih-dbus-tool/method.h: Add prototype.
	* nih-dbus-tool/tests/test_method.c (test_object_function): Tests
	cases for the function and the function code it generates.
	* nih-dbus-tool/tests/method_factory.c: Call method_object_function()
	to generate a function, and place it in a C file for testing.
	* nih-dbus-tool/tests/method_code.h: Prototype for generated function.
	* nih-dbus-tool/Makefile.am (check_PROGRAMS): Build the method_factory
	program when running tests
	(nih_dbus_tool_SOURCES, TESTS): Marshalling/demarshalling code now
	has to come before parsing and method code since we use it.
	(method_factory_SOURCES, method_factory_LDFLAGS)
	(method_factory_LDADD, tests/method_code.c): Run the method_factory
	tool to generate tests/method_code.c
	(test_method_SOURCES, test_method_LDADD): Link to the output of
	the method_factory tool
	(CLEANFILES): Clean up
	(test_node_LDADD, test_interface_LDADD, test_signal_LDADD)
	(test_property_LDADD, test_argument_LDADD)
	(test_annotation_LDADD, test_parse_LDADD): Add marshal/demarshal
	object files

2009-04-16  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/tests/marshal_factory.c (marshal_function): Remove
	code to get type which we never use now we have the demarshalling
	function outputs
	* nih-dbus-tool/tests/demarshal_factory.c (demarshal_function): Remove
	code to get type which we never use now we have the marshalling
	function inputs.

	* nih-dbus-tool/demarshal.c (demarshal_basic): Do not make the output
	variable a pointer, when used in method object/signal proxy mode we
	actually have this as a local variable and want the demarshalled
	value placed directly into it.
	(demarshal_array, demarshal_struct): Instead of making the output
	variable a pointer, demarshal into a local and copy that into the
	output variable.
	* nih-dbus-tool/tests/demarshal_factory.c (demarshal_function): Make
	passed in outputs pointers, copy into them after demarshalling
	* nih-dbus-tool/tests/test_demarshal.c (test_demarshal): Make sure
	that const does not appear in the inputs, or comments, but that all
	locals are still const (as they are only copies) even in source.

2009-04-15  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/marshal.c (marshal_basic): Do not make the input
	variable const, when used in method object/signal proxy mode we
	might modify the local variable before passing it to the marshalling
	code so can't have it const.
	(marshal_array, marshal_struct): Instead of making the input
	variable const, make the local we copy into const.
	* nih-dbus-tool/tests/marshal_factory.c (marshal_function): Make
	passed-in inputs const.
	* nih-dbus-tool/tests/test_marshal.c (test_marshal): Make sure that
	const does not appear in the inputs, or comments, but that all locals
	are still const (as they are only copies) even in source.

	* nih-dbus-tool/type.c (type_of): can't pass a size_t to a format
	length, and don't want to cast down to int in case of underrun

	Continue porting the D-Bus binding tool from Python to C, this code
	implements the type marshalling and demarshalling with additional
	support for arrays of arrays of fixed types and structures that the
	Python code never had.

	* nih-dbus-tool/type.c, nih-dbus-tool/type.h: Functions to identify
	C types from D-Bus type signatures, and to handle variable
	declarations
	* nih-dbus-tool/test_type.c: Test cases
	* nih-dbus-tool/marshal.c, nih-dbus-tool/marshal.h: Generate code
	to marshal data from C standard types with given variable names
	into a D-Bus message.
	* nih-dbus-tool/tests/marshal_factory.c: Generate functions that
	contain the generated code for types that we test
	* nih-dbus-tool/tests/marshal_code.h: Header for generated code
	* nih-dbus-tool/tests/test_marshal.c: Test both the output strings
	and the behaviour of the generated code
	* nih-dbus-tool/demarshal.c, nih-dbus-tool/demarshal.h: Generate
	code to demarshal data from a D-Bus message into C standard types
	with requested variable names.
	* nih-dbus-tool/tests/demarshal_factory.c: Generate functions that
	contain the generated code for types that we test
	* nih-dbus-tool/tests/demarshal_code.h: Header for generated code
	* nih-dbus-tool/tests/test_demarshal.c: Test both the output strings
	and the behaviour of the generated code
	* nih-dbus-tool/Makefile.am (nih_dbus_tool_SOURCES): Build and
	link new source files
	(TESTS): Run test cases for new source files
	(test_type_SOURCES, test_type_LDFLAGS, test_type_LDADD)
	(test_marshal_SOURCES, test_marshal_LDFLAGS, test_marshal_LDADD)
	(test_demarshal_SOURCES, test_demarshal_LDFLAGS)
	(test_demarshal_LDADD): Details for test cases.
	(check_PROGRAMS, marshal_factory_SOURCES)
	(marshal_factory_LDFLAGS, marshal_factory_LDADD)
	(tests/marshal_code.c, demarshal_factory_SOURCES)
	(demarshal_factory_LDFLAGS, demarshal_factory_LDADD)
	(tests/demarshal_code.c, CLEANFILES): In order to test the output
	code, we generate a C file containing it and link it to the test
	cases.  This gets cleaned up on "clean" rather than maintainer-clean
	
2009-04-04  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/parse.c (parse_start_tag, parse_xml): Cast return
	value of XML_GetCurrentLineNumber and XML_GetCurrentColumnNumber to
	size_t and use %zu
	* nih-dbus-tool/node.c (node_start_tag): Likewise.
	* nih-dbus-tool/interface.c (interface_start_tag): Likewise.
	* nih-dbus-tool/method.c (method_start_tag): Likewise.
	* nih-dbus-tool/signal.c (signal_start_tag): Likewise.
	* nih-dbus-tool/property.c (property_start_tag): Likewise.
	* nih-dbus-tool/annotation.c (annotation_start_tag): Likewise.
	* nih-dbus-tool/argument.c (argument_start_tag): Likewise.
	(argument_end_tag): Use %zu for the unsigned count, not %zi

2009-03-30  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/main.c (main): open() returns less-than-zero on error
	not zero, which is standard input!

	* nih-dbus-tool/Makefile.am (test_com_netsplit_Nih_Test_object_CFLAGS)
	(test_com_netsplit_Nih_Test_proxy_CFLAGS): Remove the CFLAGS
	overrides, we set this globally in the file.

	* nih-dbus-tool/indent.c (indent): Function to indent the lines in
	a string using the specified number of tabs.
	(comment): Function to prepend the traditional " * " comment prefix
	to the lines in a string.
	* nih-dbus-tool/indent.h: Prototypes.
	* nih-dbus-tool/tests/test_indent.c: Test cases.
	* nih-dbus-tool/Makefile.am (TESTS): Build the indent test cases
	(test_indent_SOURCES, test_indent_LDFLAGS, test_indent_LDADD): Details
	for indent test cases

	* nih-dbus-tool/main.c: Re-order so that the option variables, the
	options list and the main() function can be contained inside a #if
	directive so we can test the rest.
	(source_file_path, header_file_path): Factor out the code from
	main() that generated the source and header file paths so we can
	test; at the same time, fix them so they don't cast ptrdiff_t to int
	and always output to the current working directory unless output_path
	includes one.
	* nih-dbus-tool/tests/test_main.c: Which means we can test the
	mode_option(), source_file_path() and header_file_path() functions
	* nih-dbus-tool/Makefile.am (TESTS): Build and run test_main
	(test_main_SOURCES, test_main_LDFLAGS, test_main_LDADD): usual
	details for test_main, except we use main.c as a SOURCE rather than
	linking in LDADD like we normally do
	(test_main_CFLAGS): Override CFLAGS to set -DTEST, this causes us
	to recompile main.c specially for test_main with the main() function
	#ifdef'd out.

	* nih-dbus/Makefile.am (tests): Move to the bottom of the file
	* nih/Makefile.am (tests): Move to the bottom of the file
	* nih-dbus-tool/Makefile.am (tests): Move to the bottom of the file

	Begin replacing the old Python D-Bus bindings tool with one
	written in C, starting with the code that parses the introspection
	data.

	* nih-dbus-tool/Makefile.am (bin_SCRIPTS, noinst_SCRIPTS)
	(bin_PROGRAMS, noinst_PROGRAMS): Replace the nih-dbus-tool script
	with a program that we need to compile.
	(CLEANFILES, EXTRA_DIST, do_subst, nih-dbus-tool): Drop the rules
	to generate the script by replacing bits out of the Python source
	(nih_dbus_tool_SOURCES, nih_dbus_tool_LDADD): Instead build from
	C sources, and link to libnih, libnih-dbus, expat and libdbus
	(AM_CFLAGS): Require the D-Bus CFLAGS when compiling the tool
	(AM_CPPFLAGS): Include quoted headers from the source directory
	so the test suite can get at them
	(TESTS): Add tests for the various bits of the C tool
	(tests): Rule to generate binaries for the test suite
	(test_symbol_SOURCES, test_symbol_LDFLAGS, test_symbol_LDADD)
	(test_node_SOURCES, test_node_LDFLAGS, test_node_LDADD)
	(test_interface_SOURCES, test_interface_LDFLAGS)
	(test_interface_LDADD, test_method_SOURCES, test_method_LDFLAGS)
	(test_method_LDADD, test_signal_SOURCES, test_signal_LDFLAGS)
	(test_signal_LDADD, test_property_SOURCES)
	(test_property_LDFLAGS, test_property_LDADD)
	(test_argument_SOURCES, test_argument_LDFLAGS)
	(test_argument_LDADD, test_annotation_SOURCES)
	(test_annotation_LDFLAGS, test_annotation_LDADD)
	(test_parse_SOURCES, test_parse_LDFLAGS, test_parse_LDADD): Test
	suite details
	* nih-dbus-tool/main.c, nih-dbus-tool/symbol.c, nih-dbus-tool/symbol.h,
	nih-dbus-tool/tests/test_symbol.c, nih-dbus-tool/node.c,
	nih-dbus-tool/node.h, nih-dbus-tool/tests/test_node.c,
	nih-dbus-tool/interface.c, nih-dbus-tool/interface.h,
	nih-dbus-tool/tests/test_interface.c, nih-dbus-tool/method.c,
	nih-dbus-tool/method.h, nih-dbus-tool/tests/test_method.c,
	nih-dbus-tool/signal.c, nih-dbus-tool/signal.h,
	nih-dbus-tool/tests/test_signal.c, nih-dbus-tool/property.c,
	nih-dbus-tool/property.h, nih-dbus-tool/tests/test_property.c,
	nih-dbus-tool/argument.c, nih-dbus-tool/argument.h,
	nih-dbus-tool/tests/test_argument.c, nih-dbus-tool/annotation.c,
	nih-dbus-tool/annotation.h, nih-dbus-tool/tests/test_annotation.h,
	nih-dbus-tool/parse.c, nih-dbus-tool/parse.h,
	nih-dbus-tool/tests/test_parse.c, nih-dbus-tool/errors.h: Source
	for the tool
	* m4/misc.m4 (NIH_INIT): Explicitly check for pkg-config 0.22
	* m4/libs.m4 (NIH_LIB_DBUS): Replace check for Python with a check
	for the expat library, removing the HAVE_PYTHON conditional
	entirely.  Update required D-Bus version to 1.2.4
	* README: Update dependencies documentation

2009-03-27  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_file_read, nih_file_map): Cast to the bigger type.

	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c: Add missing
	signal.h include.

	* m4/compiler.m4: Add -Wextra, but turn off some of the silly ones.
	* nih/io.c (nih_io_buffer_resize): Remove unnecessary assert.
	* nih/file.c (nih_file_read, nih_file_map): Be explicit when
	comparing signed and unsigned types.
	* nih/option.c (nih_option_long): Cast pointer difference to size_t
	(nih_option_group_help): Use unsigned constant.
	* nih/command.c (nih_command_group_help): Use unsigned constant.
	* nih/tests/test_config.c (test_parse_stanza): Cast -1 to size_t
	to get the real number.
	* nih-dbus/dbus_object.c (nih_dbus_object_vtable): Move static to
	before const.
	* nih-dbus/tests/test_dbus_message.c (my_error_connect): Put
	static before const.

2009-03-22  Scott James Remnant  <scott@netsplit.com>

	* nih/Makefile.am (tests): Add rule to build all test cases without
	running them (useful when using valgrind).
	* nih-dbus/Makefile.am (tests): Add the same rule.

	* nih/test_values.h (TEST_EQ_STR, TEST_EQ_STRN, TEST_EQ_MEM)
	(TEST_NE_STR, TEST_NE_STRN, TEST_NE_MEM): Guard against NULL being
	parsed.
	* nih/test_alloc.h (TEST_ALLOC_SIZE, TEST_ALLOC_PARENT)
	(TEST_ALLOC_ORPHAN): Also guard against NULL for these.

	* nih/test_files.h (TEST_FILE_MATCH): Add test that lets us match
	the content of a file line against a wildcard pattern.

2009-02-20  Scott James Remnant  <scott@netsplit.com>

	* nih/option.c (nih_option_help),
	* nih/command.c (nih_command_help),
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c (my_str_to_int32_array): 
	No need for a new_* temporary variable when looping over nih_realloc
	with NIH_MUST.

	* nihify: Add nih-dbus-tool symlink too

	* nih/watch.c (nih_watch_new): Update to set variable outside of
	NIH_SHOULD and NIH_MUST macros.
	(nih_watch_add, nih_watch_handle),
	* nih/alloc.c (nih_alloc_ref_new),
	* nih/timer.c (nih_timer_init),
	* nih/signal.c (nih_signal_init),
	* nih/child.c (nih_child_init),
	* nih/io.c (nih_io_init),
	* nih/file.c (nih_dir_walk, nih_dir_walk_scan)
	(nih_dir_walk_visit),
	* nih/main.c (nih_main_init_full, nih_main_version)
	(nih_main_set_pidfile, nih_main_get_pidfile)
	(nih_main_write_pidfile, nih_main_loop_init),
	* nih/option.c (nih_option_parser, nih_option_handle_arg)
	(nih_option_join, nih_option_help, nih_option_group_help),
	* nih/command.c (nih_command_parser, nih_command_join)
	(nih_command_help, nih_command_group_help),
	* nih/logging.c (nih_log_message),
	* nih/error.c (nih_error_init, nih_error_raise)
	(nih_error_raise_printf, nih_error_raise_system)
	(nih_error_push_context),
	* nih/tests/test_string.c (test_array_copy, test_array_append),
	* nih/tests/test_watch.c (my_create_handler, my_modify_handler)
	(my_delete_handler),
	* nih-dbus/dbus_error.c (nih_dbus_error_raise)
	(nih_dbus_error_raise_printf),
	* nih-dbus-tool/tests/com.netsplit.Nih.Test_impl.c ()
	(my_test_async_method, my_str_to_int32_array): Update to set
	variable outside of NIH_MUST macro.

2009-02-20  Casey Dahlin  <cdahlin@redhat.com>

	* nih/macros.h (NIH_MUST, NIH_ZERO): Use the GCC statement
	expression extension (also used by nih_min and nih_max) to allow
	these macros to return the value of their expression.
	* nih/error.h (NIH_SHOULD): Also return its value.

2009-02-20  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus-tool/Makefile.am (test_com_netsplit_Nih_Test_object_LDADD)
	(test_com_netsplit_Nih_Test_proxy_LDADD): Fix path to libnih-dbus.la

	* nih/option.c (nih_option_parser): Fix a bug where a lone dash
	would be eaten instead of treated as an argument
	* nih/tests/test_option.c (test_parser): Add test case

	* nih/option.c (nih_option_help): Support the bugs address being
	a URL, and slightly change the wording we use.

	* nih/libnih.ver: We have to export anything beginning _nih_* and
	the program_name and package_* variables.

	* configure.ac (AC_INIT): Give bugs address as a URL

2009-01-30  Scott James Remnant  <scott@netsplit.com>

	* Makefile.am (SUBDIRS): po needs to be last, so always append

	* configure.ac: Create nih-dbus-tool Makefile
	* Makefile.am (SUBDIRS): Add nih-dbus-tool sub-directory
	* nih-dbus-tool/Makefile.am: Include rules to create nih-dbus-tool
	and its tests
	* nih-dbus/Makefile.am: Remove those rules from here
	* nih-dbus/nih_dbus_tool.py: Move to nih-dbus-tool/nih_dbus_tool.py
	* nih-dbus/tests/com.netsplit.Nih.Test.xml,
	nih-dbus/tests/com.netsplit.Nih.Test_impl.c,
	nih-dbus/tests/com.netsplit.Nih.Test_impl.h,
	nih-dbus/tests/test_com.netsplit.Nih.Test_object.c,
	nih-dbus/tests/test_com.netsplit.Nih.Test_proxy.c: Move to
	nih-dbus-tool/tests
	
	* Makefile.am (SUBDIRS): conditionally add the nih-dbus directory
	depending on HAVE_DBUS
	* nih-dbus/Makefile.am: which means we don't have to conditionalise
	anything in this file, cleaning things up a bit.

2009-01-29  Scott James Remnant  <scott@netsplit.com>

	* nih-dbus/tests/test_com.netsplit.Nih.Test_proxy.c (test_method_dispatch): 
	Fix the test case to not compare a void * with strcmp

2008-01-29  Casey Dahlin  <cdahlin@redhat.com>

	* nih/nih_dbus_tool.py (Method.asyncDispatchPrototype): Prototype for
	new asynchronous dispatch function, explained below.
	(Method.asyncDispatchFunction): The asynchronous dispatch function
	takes a proxy, the arguments to the given method, a callback and an
	"errback" function pointer, and a void pointer. It calls the DBus
	method, but does not wait for a reply. Instead it sets up the
	callback to be called upon reply. If an error occurs, the errback
	is called instead. Either function will recieve the proxy and the
	value in the void pointer as arguments. The normal callback also
	receives arguments for anything returned by the method.
	(Method.asyncNotifyPrototype): Prototype for new asynchronous
	notification function. See below.
	(Method.asyncNotifyFunction): When the asynchronous dispatch function
	sets up a method call, it specifies the function generated by this
	function as the callback, and passes it an NihAsyncNotifyData struct
	containing the user-provided callback and errback. The asynchronous
	notify function then sets up the error to be handled by the errback
	or marshalls the return values to the callback.
	(Generator.exportTypedefs): This function returns a list of tuples
	* nih-dbus/tests/test_com.netsplit.Nih.Test_proxy.c (test_method_dispatch): 
	of (type, name, args) format for typedefs to be placed in the
	generated header file. Args is present for defining function
	arguments for function pointer typedefs.
	(lineup_typedefs): Works like the other lineup_*s. Outputs typedef
	text from (type, name, args) tuples (see above) in a prettified,
	well-spaced format.
	(typedef_lineup_prefix): Used to make names line up well in
	lineup_typedefs. If a string begins with (* it is returned as is.
	If it begins with * it is returned with one leading space. Otherwise
	it gets two leading spaces.
	* nih-dbus/tests/test_com.netsplit.Nih.Test_proxy.c (test_method_dispatch): 
	Test asynchronous method dispatch

2009-01-29  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_alloc_real_set_destructor): Does not modify the
	actual data, so the pointer can be const.
	(nih_ref): Does not modify the actual data, so the pointer can be
	const.
	(nih_unref_only): Does not modify the actual data, and unlike
	nih_unref(), does not free it; so the pointer can be const
	* nih/alloc.h: Update prototypes.

	* configure.ac: Bump version to 0.2.1
	* NEWS: Begin 0.2.1

	* NEWS: Update

	* nih/test_alloc.h (TEST_ALLOC_FAIL): Initialise the count in the
	loop pre-condition, still doesn't solve gcc's issues but I prefer
	it.

	* nih/tests/test_command.c (test_help): Array was too small, increase
	the size.

	* nih/tests/test_string.c (test_str_split): Oops, left some debugging
	in here.

	* nih/file.c (nih_file_read): Never trust a changelog entry that
	says "minor clean-up"; make sure we raise the error before returning
	NULL.

	* nih-dbus/dbus_connection.c (nih_dbus_setup)
	(nih_dbus_add_watch, nih_dbus_add_timeout): We should discard
	objects attached to the D-Bus connection since they're floating;
	nobody should take a reference, but good practice and all that.

	* nih/alloc.h: Document the different usage patterns

	* nih/io.c (nih_io_buffer_resize): Use nih_unref() instead of
	nih_free(), while nothing should have taken a reference, it's a
	good pattern to stick to.
	(nih_io_message_recv): Use nih_local for ctrl_buf
	(nih_io_message_send): Use nih_local for ctrl_buf
	(nih_io_send_message): Take a reference to messages on the send q
	(nih_io_watcher_write): Unreference the message from the NihIo
	object instead of freeing, in case a reference is used elsewhere
	(nih_io_read): Unreference instead of freeing
	(nih_io_get): Unreference instead of freeing
	(nih_io_message_new): Parent should not be the NihIo
	(nih_io_write): Obey that rule here

	* nih/tests/test_io.c (test_send_message): Make sure that a
	reference is taken after all.
	(test_watcher): Don't create object with parent as io

	* nih/file.c (nih_file_read): Minor clean-up

	* nih/main.c (nih_main_set_pidfile): Discard the pid file in case
	someone took a reference to it.

	* nih/main.c (nih_main_init_full): Discard the package string in
	case another part of the code has taken a reference to it; since
	it never changes unless this function is called, generate it here
	(nih_main_package_string): dropping this function
	(nih_main_version): Fetch package_string
	* nih/main.h: Add external package_string and drop function proto.
	* nih/tests/test_main.c (test_package_string): Fold these tests into
	(test_init): here.
	* nih/libnih.supp: Update suppression

	* nih/logging.c (nih_log_message): Use nih_local for message

	* nih/io.c (nih_io_printf): Use nih_local for str

	* nih/config.c (nih_config_parse_stanza): Use nih_local for name.

2009-01-28  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_dir_walk_visit): Can't allocate nih_local var
	with a parent, otherwise it'll never be cleaned up.

	* nih/config.c (nih_config_parse): Initialise nih_local var to NULL.

	* nih/alloc.c (nih_alloc_context_free): After the destructor has
	been called, an object is dead.  Attempting to reference it should
	fail, so we need to store a flag that this has happened.
	(nih_realloc, nih_free, nih_discard, nih_alloc_real_set_destructor)
	(nih_alloc_ref_new, nih_unref, nih_alloc_parent)
	(nih_alloc_ref_lookup, nih_alloc_size): Forbid operations on
	finalised objects.

	* nih/tests/test_alloc.c (test_free): Once again I've tripped over
	bugs where the ordering of allocations between siblings in a child
	matters if they refer to each other in their destructor (typical
	case, a hash table in a struct).
	* nih/alloc.c (nih_realloc, nih_alloc_ref_new): Reverse the free
	order, so that the last member allocated is the first one freed.
	This was the original fix for the above bug, but this just moves
	the problem without really fixing it.  I do think it's generally
	correct that the order should be backwards though.
	(nih_free): Since this is the only function that needs to do it,
	take care of casting off parents here.
	(nih_unref): Again, since this is the only function that needs
	to free the context when there are no parents, do it here after
	freeing the reference.
	(nih_alloc_ref_free): Which means this function no longer needs
	to recurse; nih_free() and nih_discard() always directly free a
	context, and nih_unref() knows to if there are no parents left;
	nih_unref() explicitly doesn't free the context.
	(nih_unref_only): No need to pass FALSE to nih_alloc_ref_free() now.
	(nih_alloc_context_free): This gets the big rewrite; rather than
	just recursively freeing the heirarchy, finalise them first by
	calling destructors and then reparenting them to the context
	being freed.  Only free the objects after all destructors are called.

	* nih/macros.h (MIN, MAX): Replace with newer evaluation-safe
	nih_min() and nih_max()
	* nih/io.c (nih_io_select_fds): Replace MAX with nih_max
	(nih_io_buffer_pop): Replace MIN with nih_min
	(nih_io_buffer_shrink): Replace MIN with nih_min
	* nih/command.c (nih_command_group_help): Replace MAX with nih_max,
	nicely avoiding multiple function call there.
	* nih/option.c (nih_option_group_help): Likewise.
	* nih/tests/test_io.c (test_select_fds): Replace MAX with nih_max

	* nih-dbus/nih_dbus_tool.py (Method.replyFunction): Don't free the
	message passed in to the function.  Since we now require the handler
	function to take a reference to the message during async processing,
	we can't just go around freeing it.
	(Method.replyPrototype): Warn if the error from the reply function
	is ignored, since this is important.
	* nih-dbus/dbus_message.c (nih_dbus_message_error): Likewise we
	should not free the message when passed in for a caller either.
	* nih-dbus/tests/test_dbus_message.c (my_return_error_cb): Update
	to make sure the message is not freed.
	* nih-dbus/tests/com.netsplit.Nih.Test_impl.c (async_method_reply):
	Make sure message is not freed.
	* NEWS: Document the change

2009-01-26  Scott James Remnant  <scott@netsplit.com>

	* configure.ac: Officially mandate libtool 2.2
	* HACKING: Bump dependency on libtool to 2.2.4
	* NEWS: Document change.

	* configure.ac (AC_INIT): Bump version to 0.2.0 since we're making
	a number of large API changes.
	(AC_COPYRIGHT): Bump the copyright year too.
	* NEWS (0.1.0): Declare 0.1.0 to have happened at revision 600 before
	we started the most recent round of changes; this is the version
	shipped with Upstart 0.5 but with the fixed list iteration.
	(0.2.0): Begin documenting changes in the API since then; this file
	can therefore be used as a checklist for updating software.

	* nih-dbus/dbus.c, nih-dbus/dbus.h: Seperate out the code into
	separate files to make maintenance much easier.  The new files are
	nih-dbus/dbus_error.c, nih-dbus/dbus_error.h,
	nih-dbus/dbus_connection.c, nih-dbus/dbus_connection.h,
	nih-dbus/dbus_message.c, nih-dbus/dbus_message.h,
	nih-dbus/dbus_object.c, nih-dbus/dbus_object.h,
	nih-dbus/dbus_proxy.c, nih-dbus/dbus_proxy.h,
	nih-dbus/dbus_util.c, nih-dbus/dbus_util.h.
	* nih-dbus/nih_dbus_tool.py (Output.sourceFile): Change include
	to separate ones for error, message, object and proxy.
	(Output.headerFile): Change include to separate ones for message,
	object and proxy.
	* nih-dbus/dbus_message.c (nih_dbus_message_new): New function
	separated out of nih_dbus_object_message(); also no need to cast
	the destructor.
	* nih-dbus/dbus_object.c (nih_dbus_object_message): Clean up to
	call new nih_dbus_message_new function.
	* nih-dbus/libnih-dbus.h: New top-level header to include everything
	* nih-dbus/tests/test_dbus.c: Separate out the tests into files
	to match the sources.  The new files are
	nih-dbus/tests/test_dbus_error.c,
	nih-dbus/tests/test_dbus_connection.c,
	nih-dbus/tests/test_dbus_message.c,
	nih-dbus/tests/test_dbus_object.c,
	nih-dbus/tests/test_dbus_proxy.c,
	nih-dbus/tests/test_dbus_util.c.
	* nih-dbus/tests/test_dbus_error.c (test_error_raise_printf):
	Looks like this function was never run in the old test suite, oops.
	* nih-dbus/tests/test_dbus_message.c (test_message_new): Test the
	new function
	* nih-dbus/tests/test_com.netsplit.Nih.Test_object.c: Drop includes
	we don't actually seem to use the library!
	* nih-dbus/tests/test_com.netsplit.Nih.Test_proxy.c: Update includes
	to include proxy
	* nih-dbus/tests/com.netsplit.Nih.Test_impl.c: Replace includes
	with separate ones.
	* nih-dbus/tests/com.netsplit.Nih.Test_impl.h: Drop include.
	* nih-dbus/Makefile.am (include_HEADERS): Install the top-level header
	(nihdbusinclude_HEADERS): Update paths to new headers
	(libnih_dbus_la_SOURCES): Build from new sources
	(TESTS, test_dbus_error_SOURCES, test_dbus_error_CFLAGS)
	(test_dbus_error_LDFLAGS, test_dbus_error_LDADD)
	(test_dbus_connection_SOURCES, test_dbus_connection_CFLAGS)
	(test_dbus_connection_LDFLAGS, test_dbus_connection_LDADD)
	(test_dbus_message_SOURCES, test_dbus_message_CFLAGS)
	(test_dbus_message_LDFLAGS, test_dbus_message_LDADD)
	(test_dbus_object_SOURCES, test_dbus_object_CFLAGS)
	(test_dbus_object_LDFLAGS, test_dbus_object_LDADD)
	(test_dbus_proxy_SOURCES, test_dbus_proxy_CFLAGS)
	(test_dbus_proxy_LDFLAGS, test_dbus_proxy_LDADD)
	(test_dbus_util_SOURCES, test_dbus_util_CFLAGS)
	(test_dbus_util_LDFLAGS, test_dbus_util_LDADD): Add details for
	new tests, replacing old ones

	* nih/dbus.c, nih/dbus.h, nih/libnih-dbus.supp, nih/libnih-dbus.ver,
	nih/nih_dbus_tool.py, nih/test_dbus.h,
	nih/tests/com.netsplit.Nih.Test.xml,
	nih/tests/com.netsplit.Nih.Test_impl.c,
	nih/tests/com.netsplit.Nih.Test_impl.h,
	nih/tests/test_com.netsplit.Nih.Test_object.c,
	nih/tests/test_com.netsplit.Nih.Test_proxy.c,
	nih/tests/test_dbus.c: Move all D-Bus related code into a new
	sub-directory
	* nih/Makefile.am: Move D-Bus related rules into
	* nih-dbus/Makefile.am: here.
	* nih-dbus/tests/test_dbus.c: Update include path for D-Bus test
	macros and dbus.h
	* nih-dbus/tests/test_com.netsplit.Nih.Test_object.c: Update include
	path for dbus.h
	* nih-dbus/tests/test_com.netsplit.Nih.Test_proxy.c: Update include
	path for dbus.h
	* nih-dbus/tests/com.netsplit.Nih.Test_impl.c: Update include path
	for dbus.h
	* nih-dbus/tests/com.netsplit.Nih.Test_impl.h: Update include path
	for dbus.h
	* nih-dbus/nih_dbus_tool.py (Output.sourceFile, Output.headerFile):
	Generate includes with correct path for dbus.h
	* Makefile.am (SUBDIRS): Iterate into new sub-directory
	* configure.ac (AC_CONFIG_FILES): Generate new Makefile
	* nihify: Create symlink to nih-dbus as well

	* nih/tests/com.netsplit.Nih.Test_impl.c (my_test_async_method):
	Take a reference to the message
	* nih/libnih-dbus.supp: Update D-Bus suppressions.

	* TODO: Update

	* nih/libnih.supp: Update suppressions for new calling stack

	* nih/dbus.c (nih_dbus_object_new): Update documentation to match
	new nih_alloc(), no need to cast destructor
	(nih_dbus_proxy_new, nih_dbus_path): Update documentation to match
	new nih_alloc()
	(nih_dbus_object_message): Make the message nih_local, this means
	the handler must now reference the message otherwise it will be
	freed.
	(nih_dbus_object_introspect): Make the xml string nih_local
	(nih_dbus_message_error): Make the string nih_local
	* nih/tests/test_dbus.c (test_error_raise)
	(test_error_raise_printf): Don't check for no parent if we don't
	need to.
	(my_return_error): Must reference the message
	(test_error_raise, test_error_raise_printf): Must mean TEST_ALLOC_FAIL

	* nih/main.c (nih_main_loop_add_func): Update documentation to match
	new nih_alloc(), no need to cast destructor function.
	(nih_main_version): Use nih_local
	(nih_main_write_pidfile): Use nih_local
	* nih/tests/test_main.c: Include limits.h

	* nih/io.c (nih_io_watcher): Can't just break if we catch a free,
	we have to at least process errors first!

	* nih/watch.c (nih_watch_new): Update documentation to match new
	nih_alloc(), no need to cast destructor function.
	(nih_watch_add): No need to cast destructor function; free the
	not a directory error as well.
	(nih_watch_handle): Use nih_local on the path so it's always cleaned
	up if we don't reference it; reference it when delaying the create
	handler instead of reparenting
	* nih/tests/test_watch.c: Include limits.h
	(test_new): Free watch inside loop, don't select fds; no idea why
	this code is here.
	(test_reader): Can't just call select then handle, we actually have
	to wait for activity first.
	(my_create_handler, my_modify_handler, my_delete_handler): Loop over
	allocations, we can't use TEST_ALLOC_SAFE if we don't know we're in
	a TEST_ALLOC_FAIL.

2009-01-25  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_file_read): Update documentation to match
	new nih_alloc()
	(nih_dir_walk, nih_dir_walk_visit): No need to cast destructor
	function, use nih_local to clean up code a little bit.
	(nih_dir_walk_scan): Use nih_local to make this easier.
	* nih/tests/test_file.c: Include limits.h
	(my_visitor): No need to cast destructor

	* nih/test.h: Include config.h since that defines _GNU_SOURCE
	* nih/tests/test_child.c, nih/tests/test_signal.c: Remove extra
	double include.

	* nih/test_alloc.h (TEST_FREE_TAG): Remove incorrect "extern"

	* nih/alloc.c (nih_unref_only): Add function to allow unreferencing
	without freeing, for example if we return something from our state
	and want to reparent but still allow NULL.
	* nih/alloc.h: Add prototype.

	* nih/io.c (nih_io_add_watch, nih_io_message_new, nih_io_reopen):
	Update documentation to match new nih_alloc(), no need to cast
	destructor function.
	(nih_io_buffer_new, nih_io_buffer_pop, nih_io_read, nih_io_get):
	Update documentation to match new nih_alloc()
	(nih_io_read_message): Update documentation to match new nih_alloc(),
	reparent message by referencing to parent before unreferencing from
	io structure.
	* nih/tests/test_io.c (test_read_message, test_send_message):
	Replace TEST_ALLOC_PARENT with NULL parent with TEST_ALLOC_OPRHAN
	(test_read_message): Message must reference the io watch
	(test_message_add_control): Remove strange allocator changing.
	(test_message_recv): Call nih_error_init to avoid valgrind issue

	* nih/child.c (nih_child_add_watch): Update documentation to match new
	nih_alloc(), no need to cast destructor function.
	* nih/tests/test_child.c: Include config.h
	
	* nih/signal.c (nih_signal_add_handler): Update documentation to
	match new nih_alloc(), no need to cast destructor function.
	* nih/tests/test_signal.c: Include config.h

	* nih/timer.c (nih_timer_add_timeout, nih_timer_add_periodic)
	(nih_timer_add_scheduled): Update documentation to match new
	nih_alloc(), no need to cast destructor function.

	* nih/alloc.c (nih_alloc_parent, nih_alloc_size): Pointer argument
	should be const since we don't modify it.
	* nih/alloc.h: Update prototype.

	* nih/error.h: Add documentation for header.
	(NIH_SHOULD): Much needed docstring.

	* nih/logging.c: Include nih/macros.h
	* nih/logging.h: Add documentation for header.

	* nih/config.c (nih_config_next_token, nih_config_next_arg)
	(nih_config_parse_args, nih_config_parse_command)
	(nih_config_parse_block): Update documentation to match new
	nih_alloc()
	(nih_config_parse): Rewrite to use nih_file_read() into an nih_local
	variable, instead of mmap which has strange behaviours in the face
	of updates.
	* nih/config.h: Add documentation header.
	* nih/tests/test_config.c: Include limits.h

	* nih/command.c (nih_command_parser): Update documentation to
	match new nih_alloc(), use nih_local where possible to clean up
	code.
	(nih_command_join): Update documentation to match new nih_alloc()
	(nih_command_handle): Update documentation to match new nih_alloc(),
	use nih_local where possible to clean up code.
	(nih_command_help): Use nih_local for groups array
	(nih_command_group_help): Use nih_local for wrapped string
	* nih/command.h: Add documentation string for header.

	* nih/option.c (nih_option_parser): Update documentation to match
	new nih_alloc(), should not use parent for any old allocation.
	(nih_option_join): Update documentation to match new nih_alloc()
	(nih_option_help): Use nih_local for temporary strings and groups
	(nih_option_group_help): Use nih_local for temporary string.
	* nih/option.h: Add documentation string for header.

	* nih/list.h, nih/hash.h: Provide a much better documentation string.

	* nih/tree.c (nih_tree_new, nih_tree_entry_new): Update documentation
	to match new nih_alloc(); no need to cast destructor function
	* nih/tree.h: Add documentation string for the header.

	* nih/hash.c (nih_hash_new): Update documentation to match
	new nih_alloc(); update comment to reflect what we actually do to
	pick a prime.
	(nih_hash_pointer_key, nih_hash_pointer_hash)
	(nih_hash_pointer_cmp): Drop these, we were looking at the raw bytes
	of a pointer, which is almost certainly naughty.
	* nih/hash.h: Add documentation string, remove prototypes.
	(NIH_HASH_FOREACH, NIH_HASH_FOREACH_SAFE): Update documentation in
	same manner as the list functions.
	(nih_hash_pointer_new): Drop, this is probably illegal C ;-)
	(nih_hash_string_new): Update documentation to match new nih_alloc()
	* nih/tests/test_hash.c (test_pointer_new, test_pointer_key): Drop.
	(test_lookup): Modify to use string hashes instead.
	(test_foreach, test_foreach_safe): Fix function name comment.

	* nih/list.c (nih_list_new, nih_list_entry_new): Update documentation
	to match new nih_alloc(); No need to cast the destructor function
	anymore.
	* nih/list.h: Add documentation string for the header.
	(NIH_LIST_FOREACH, NIH_LIST_FOREACH_SAFE): Improve documentation
	about which is best.
	(NIH_LIST_ITER): Add macro to make iterating a list with an offset
	head easier.

	* nih/macros.h: Add sorely-missed documentation strings, including
	one for the header itself.
	(NULL): Drop, NULL is defined by the C compiler.

	* nih/string.c: Update all documentation to match new nih_alloc()
	(nih_str_array_addp): Take a reference to the passed variable
	instead of reparenting (which isn't possible anymore).
	(nih_str_array_add, nih_str_array_addn): Since these just call
	nih_str_array_addp() which now takes a reference rather than
	reparents, we can change these functions to make new_str as a
	local variable.
	(nih_strv_free): Drop this function, it's not used and it's utterly
	inconsistent with the others as it expressly isn't used with
	nih_alloc().
	(nih_strncat): This function worryingly did not work if NULL was
	passed, catch that and call nih_strndup() instead.
	* nih/string.h: Add a documentation string and drop prototype.
	* nih/tests/test_string.c (test_strv_free): Drop.
	(test_sprintf, test_vsprintf, test_strdup, test_strndup): Replace
	TEST_ALLOC_PARENT calls with NULL as the second argument with
	TEST_ALLOC_ORPHAN instead.
	(test_strcat, test_strncat, test_strcat_sprintf)
	(test_strcat_vsprintf): Strangely these test cases don't appear to
	have worked before, the functions return NULL in case of memory
	allocation failure so we need to check the string against a temporary
	copy stored before, and we need to free that string as well. 
	Also add test cases for NULL being passed in as the source string.

	* nih/test_alloc.h: Expose references to nih_alloc()'s pointers to
	malloc, realloc and free so we can replace them for testing purposes.
	(TEST_ALLOC_SIZE): Since this returns the size of the allocated object,
	rather than the request, check that the block is at least as large
	as the argument given - not exactly as large.
	(TEST_ALLOC_PARENT): Call nih_alloc_parent directly with both
	arguments, since it's compatible with our calling - can't output the
	current parent now they're may be multiple though.  When passed NULL
	this now checks if it *has* a parent (almost the exact inverse of the
	previous meaning).
	(TEST_ALLOC_ORPHAN): New test to make sure that an object does not
	have a parent.
	(_test_free_tag): Reimplement to lookup the tag block in a linked
	list, instead of a static array, and only return TRUE or FALSE.
	(_test_destructor): Drop, we can just use nih_list_destroy instead.
	(TEST_FREE_TAG): Reimplement to allocate the tag struct itself as
	the child, and place in a linked list.
	(_test_malloc): Add malloc wrapper.
	(_test_allocator): Rename to _test_realloc
	(TEST_ALLOC_FAIL, TEST_ALLOC_SAFE): Change allocator through the
	exposed variables.

	* nih/alloc.h (nih_local): Macro to add a variable attribute that
	calls a nih_discard() as a cleanup function when the variable goes
	out of scope.
	* nih/alloc.c (_nih_discard_local): gcc cleanup function wrapper that
	takes the address of the local variable, it gets the actual pointer
	out and passes it to nih_discard().  Unlike the other functions,
	this actually allows the pointer to be NULL.
	* nih/tests/test_alloc.c (test_local): Test local variables work!

	* nih/alloc.c (nih_alloc_has_ref): Rename back to nih_alloc_parent.
	(nih_alloc_parent): Accept NULL, if given returns TRUE if there are
	any parents.
	* nih/alloc.h: Update prototype.
	* nih/tests/test_alloc.c (test_parent): Since it's a bit more
	complex, we should probably explicitly test this ;-)

	* nih/test.h, nih/test_output.h, nih/test_values.h, nih/test_process.h,
	nih/test_divert.h, nih/test_files.h, nih/test_alloc.h, nih/test_list.h,
	nih/test_hash.h, nih/test_dbus.h: Split the test macros out into
	separate files to make maintaining them easier.  None of them may
	be included directly, execept nih/test_dbus.h which is now no longer
	included by default.
	* nih/Makefile.am (nihinclude_HEADERS): Install new headers.

	* nih/alloc.c: Re-implement as a multi-reference allocator; an object
	may now have as many parents as you wish, each one holding its own
	reference to it.
	(NihAllocCtx): Restructure.
	(NihAllocRef): New object linked by context to hold a reference.
	(nih_alloc_init, nih_alloc_set_allocator, nih_alloc_using): Drop
	support for custom allocators, knowing that we always use malloc
	is useful for the implementation - we still allow the test suite
	to change them, but nothing else.
	(nih_alloc): Reimplement from original nih_alloc_using() function,
	now calls nih_alloc_ref_new() if parent is not NULL.
	(nih_realloc): Reimplement for multi-referenceness; much of the
	this remains the same.
	(nih_free): Reimplement as a wrap around nih_alloc_context_free().
	(nih_discard): New function to discard an object if it has no
	parent references, used if you believe references may have been
	taken by functions you have called.
	(nih_alloc_context_free): Common function to free an object, calling
	its destructor after discarding parent references but before cleaning
	up children.
	(nih_alloc_reparent): Drop, it's no longer possible to simply reparent
	an object.  Instead you should call the new functions:
	(nih_ref, nih_alloc_ref_new, nih_unref, nih_alloc_ref_free): Handle
	NihAllocRef objects, linking them to a context and removing them from
	a context; when the last reference to a child is removed, we
	automatically call nih_alloc_context_free().
	(nih_alloc_parent, nih_alloc_has_ref): Replace the former function
	with the latter, it's no longer possible to query the exact parent
	since there isn't one.
	(nih_alloc_ref_lookup): Internal function to find a reference.
	(nih_alloc_size): Reimplement assuming malloc, which saves us some
	space in the context structure.
	* nih/alloc.h: Update all prototypes and documentation, including
	adding module documentation to the top of the header file.
	(NihAllocator): Drop typedef.
	(nih_alloc_set_destructor): Add casting macro with name of original
	function that calls nih_alloc_real_set_destructor().
	* nih/tests/test_alloc.c (test_new, test_alloc): Fix to check for a
	reference rather than the explicit parent; also include a test for
	allocation failure using a malloc hook.
	(test_realloc): Fix to check for a reference rather than the
	explicit parent, change allocatil failure test to use a realloc hook
	instead of a different allocator.
	(test_free): Add a with parent test.
	(test_discard): New test, as test_free() but with different expected
	result for the parent test.
	(test_set_allocator): Drop test.
	(test_reparent, test_ref, test_unref): Drop the former test and
	replace with checking that referencing and unreferencing works.

2008-10-24  Scott James Remnant  <scott@netsplit.com>

	* nih/list.h (NIH_LIST_FOREACH_SAFE): Mark the cursor to be
	automatically cleaned up should we exit the loop; this somewhat
	simplifies the definition and allows returning from within the loop.

	* nih/list.h (NIH_LIST_FOREACH_SAFE): Fix a typo that caused only
	once cursor variable to be used, rather than one per iteration.

	* nih/main.h, nih/main.c, nih/dbus.c, nih/tests/test_dbus.c: Revert
	previous "delete" patch now that we can iterate linked lists
	without tripping over the bug we found here.

	* nih/libnih-dbus.supp: Update suppressions for newer glibc and
	D-Bus without debugging enabled.

	* nih/list.h (NIH_LIST_FOREACH_SAFE): Replace with a more ingenious
	version based on work by Casey Dahlin and myself; instead of caching
	the next pointer, place a cursor node in the list instead.  This
	solves the issue where the next pointer may be changed or freed, and,
	in fact solves all issues of list rearrangement.
	* nih/tests/test_list.c (test_foreach_safe): Add test cases.
	* nih/hash.h (NIH_HASH_FOREACH_SAFE): Update comment to match.

2008-08-12  Casey Dahlin  <cdahlin@redhat.com>

	* nih/main.h (NihMainLoopFunc): Add delete member.
	* nih/main.c (nih_main_loop): Don't run the callback for any function
	marked for deletion, instead call nih_free on it.
	(nih_main_loop_add_func): Initialise delete to FALSE.
	* nih/dbus.c (nih_dbus_release_callback): Add function to mark a
	loop function as deleted.
	(nih_dbus_setup): and use it as the free function instead of nih_free.
	* nih/tests/test_dbus.c (test_connect, test_bus, test_setup): Check
	that the loop functions are marked for deletion instead of freed.

	* nih/nih_dbus_tool.py (Output.sourceFile): Include limits.h

2008-07-02  Scott James Remnant  <scott@netsplit.com>

	* nih/Makefile.am (test_com_netsplit_Nih_Test_object_SOURCES)
	(test_com_netsplit_Nih_Test_proxy_SOURCES): Add forgotten header.

2008-07-01  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update.

	* nih/tests/test_com.netsplit.Nih.Test_proxy.c (test_method_dispatch):
	Add test cases for input and output arguments of various types.

	* nih/nih_dbus_tool.py (DBusArray.marshal): Add extra parens in
	array setting call for precedence reasons.

	* nih/tests/test_com.netsplit.Nih.Test_proxy.c (test_method_dispatch):
	Add basic tests of calls to synchronous and async methods, and the
	usual error returns.
	* nih/tests/com.netsplit.Nih.Test_impl.c (async_method_reply): 
	Add replies that have the wrong combinations of arguments.

	* nih/tests/com.netsplit.Nih.Test_impl.c,
	* nih/tests/test_com.netsplit.Nih.Test_object.c (my_connect_handler)
	(my_setup, my_teardown): Move these functions across too.
	* nih/tests/com.netsplit.Nih.Test_impl.h: Add prototypes.

	* nih/dbus.c (nih_dbus_proxy_new): Allow name to be NULL.
	* nih/tests/test_dbus.c (test_proxy_new): Test without a name.

	* nih/tests/test_com.netsplit.Nih.Test_object.c,
	* nih/tests/com.netsplit.Nih.Test_impl.c: Separate out the server
	object implementation so that the proxy code could use it.
	* nih/tests/com.netsplit.Nih.Test_impl.h: Header for object definition
	* nih/Makefile.am (test_com_netsplit_Nih_Test_object_SOURCES)
	(test_com_netsplit_Nih_Test_proxy_SOURCES): Include the object
	implementation code.

	* nih/tests/test_com.netsplit.Nih.Test_proxy.c: Stub file for proxy
	test cases.
	* nih/Makefile.am (TESTS): Build the proxy test suite.
	(test_com_netsplit_Nih_Test_proxy_SOURCES)
	(test_com_netsplit_Nih_Test_proxy_CFLAGS)
	(test_com_netsplit_Nih_Test_proxy_LDFLAGS)
	(test_com_netsplit_Nih_Test_proxy_LDADD): Details for the proxy
	test suite, which actually includes the object code since it needs
	to implement objects too

	* nih/nih_dbus_tool.py (MemberWithArgs.variables): Only include arg
	array in object mode.

	* nih/Makefile.am ($(com_netsplit_Nih_Test_object_OUTPUTS)): 
	($(com_netsplit_Nih_Test_proxy_OUTPUTS)): Must be newer than the
	source for the python tool

	* nih/nih_dbus_tool.py (Interface.variables, Interface.exports):
	Only include the interface definition in object mode, we will need
	something for proxying signals later, but right now this means
	problems when building an object and its proxy together.

	* nih/Makefile.am (com_netsplit_Nih_Test_proxy_OUTPUTS)
	(com_netsplit_Nih_Test_proxy_XML)
	($(com_netsplit_Nih_Test_proxy_OUTPUTS)): Generate sources in proxy
	mode for the test interfaces.
	(BUILT_SOURCES, MAINTAINERCLEANFILES, EXTRA_DIST): Build if necessary
	before anything else, clean in maintainer-clean and include in the
	distribution.

2008-06-30  Scott James Remnant  <scott@netsplit.com>

	* m4/libs.m4 (NIH_LIB_DBUS): Always check for Python, but don't error
	or disable D-Bus unless the install option is defined.  Otherwise if
	we don't have it, don't define HAVE_PYTHON.
	* nih/Makefile.am (noinst_SCRIPTS): Only build if we have python.

	* nih/Makefile.am: Redress the Makefile such that the generated test
	sources are actually included in the distribution tarball.

	* nih/dbus.h (NihDDusProxy): Add definition for proxy structure
	and prototype for function to create one.
	* nih/nih_dbus_tool.py (Method.dispatchFunction): Adjust name of
	destination member in the proxy.
	* nih/dbus.c (nih_dbus_proxy_new): Simple function to create a new
	proxy object.
	* nih/tests/test_dbus.c (test_proxy_new): Add simple test for the
	simple function, which will get more complicated if we add signal
	filter registration later.

	* nih/errors.h (NIH_DBUS_INVALID_ARGS): Add error caused when the
	reply arguments on a method call were not what we expected.

	* nih/nih_dbus_tool.py: Implement the simplest of the method dispatch
	cases, a blocking method call with the reply data returned as arguments
	to the call.

	* nih/nih_dbus_tool.py: Allocate a copy of string arguments when
	passing, this makes them consistent with arrays, and also means that
	we can actually do method dispatching which requires the reply data
	to last longer than the underlying message.

	* nih/nih_dbus_tool.py: Add parent argument to marshal functions for
	when we need to allocate something (ie. arrays)

	* nih/nih_dbus_tool.py (DBusArray.marshal): Add extra parens around
	possible deferenced length variable, not needed for precedence but
	helps clarity in generated code.
	(DBusArray.dispatch): Increment the length inside the for loop, rather
	than always leaving it at zero, useful for debugging.

	* nih/nih_dbus_tool.py: Have a bash at sorting out the whole pointer
	and const problem again.  Make them properties of a group, passed to
	type functions that can add * and const as appropriate, and allows
	DBusArray to be more clever about things.  Works for the existing
	cases, anyway.

	* nih/nih_dbus_tool.py (Method.handlerPrototype): Only include
	function pointers when the mode is object.

	* nih/nih_dbus_tool.py: Allow mode to be changed to proxy, but don't
	specify anything to be generated for that mode yet.

2008-06-11  Scott James Remnant  <scott@netsplit.com>

	* Makefile.am (SUBDIRS): po has to come last to make sure we've
	built any auto-generated code before update-po

	* nih/nih_dbus_tool.py (Method.marshalFunction): Allow the message
	for the invalid args/type message to be translated.

	* nih/tests/test_child.c (test_poll): We end up creating a core file,
	so unlink it.

	* nih/Makefile.am (tests/com.netsplit.Nih.Test_object.c tests/com.netsplit.Nih.Test_object.h):
	Create the tests directory.

2008-06-08  Scott James Remnant  <scott@netsplit.com>

	* nih/Makefile.am (tests/com.netsplit.Nih.Test_object.c tests/com.netsplit.Nih.Test_object.h):
	Make the tests directory in the output.

	* nih/Makefile.am (EXTRA_DIST): Forgot to distribute the test XML

	* nih/file.c (nih_file_read): Implement a simpler function for reading
	a file into memory that does literally just that, better than map
	for various reasons.
	* nih/file.h: Add prototype.
	* nih/tests/test_file.c (test_read): Test it works.

2008-06-06  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_DBUS, TEST_DBUS_OPEN, TEST_DBUS_MESSAGE)
	(TEST_DBUS_CLOSE, TEST_DBUS_END): Various useful macros to set up,
	connect to, pop messages from, close and kill D-Bus connections to
	a private bus daemon.

	* nih/tests/test_string.c (test_array_copy): Add a test case for a
	zero-length array, which we need to be able to support.
	* nih/string.c (nih_str_array_copy): Fix it by always creating a
	new array to copy into, since array can't be NULL.

2008-06-04  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_com.netsplit.Nih.Test_object.c (test_method_marshal):
	Why would I be allocating a string array using sizeof (int32_t),
	fix C&P error to make amd64 happy again.

2008-06-02  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_DBUS): Initialise _test_address to zeros so
	valgrind shuts up.

	* nih/test.h (TEST_DBUS, TEST_DBUS_END): Macros to set up a
	temporary D-Bus session bus for testing purposes.

	* nih/tests/test_dbus.c (test_object_new, test_object_destroy)
	(test_object_unregister): Use the system bus for testing, since
	there may be no session bus.

	* nih/tests/test_dbus.c (test_bus): We get an error when the
	session bus is not available, so we should eat that before skipping.

2008-06-01  Scott James Remnant  <scott@netsplit.com>

	* nih/dbus.c (nih_dbus_object_message): Keep a reference on the
	connection, as well as the message; otherwise if the connection is
	disconnected while handling a async method, we'll end up trying to
	send it to a freed connection instead of just a disconnected and
	forgotten one.
	(nih_dbus_message_destroy): Unreference the connection when freeing
	the message object.

2008-05-28  Scott James Remnant  <scott@netsplit.com>

	* TODO (main, timers): Update.

	* nih/nih_dbus_tool.py: The C type of string-like types should be
	just "char *"; instead we should add "const" when needed, such as
	in the prototype of handlers and in reply functions.  This avoids
	some const-bending games.
	* nih/tests/test_com.netsplit.Nih.Test_object.c (my_emit_signal):
	Adjust type of string array to match.

2008-05-24  Scott James Remnant  <scott@netsplit.com>

	* HACKING: Changed branch location again.

2008-05-18  Scott James Remnant  <scott@netsplit.com>

	* nih/error.h (nih_return_no_memory_error): Add a convenience macro
	for raising the ENOMEM system error with the right string, rather
	than setting errno just do it directly.
	* nih/tests/test_error.c (test_return_no_memory_error): Make sure
	the macro is tested.
	* nih/dbus.c (nih_dbus_connect, nih_dbus_bus, nih_dbus_server):
	Use new macro to return ENOMEM when we're not sure that it's the
	current errno.

2008-05-14  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update.

	* nih/tests/test_com.netsplit.Nih.Test_object.c (my_str_to_int32_array):
	Forgot to clean up parts after splitting.
	(test_method_marshal): Forgot to free self-allocated arrays, and
	we have to free a string array returned by D-Bus as well.
	(test_signal_dispatch): Another string array to be freed.

	* nih/tests/test_dbus.c (test_object_message): Don't use timeouts
	to guess when the reply should have arrived, just use a pending
	call notify function.  This speeds the whole thing up a hundred
	fold and removes valgrind slowness issues.

	* nih/dbus.c (nih_dbus_message_error): Asynchronous messages need
	a way to return an error message to the sender after the handler
	function has terminated; this function fulfills that need
	* nih/dbus.h: Add prototype.
	* nih/tests/test_dbus.c (test_message_error): Add test case for
	replying to an asynchronous message with an error; this ends up
	somewhat evil since we're not using the bindings.

	* nih/nih_dbus_tool.py: Use a namespaced attribute to specify
	whether methods should be generated synchronous (reply generated
	after handler returns) or asynchronous (handler expected to keep
	the message object and call a reply function later).
	* nih/tests/com.netsplit.Nih.Test.xml: Add a test asynchronous
	method, the same basic method as the ordinary test method, but
	which is specified to generate an asynchronous call.
	* nih/tests/test_com.netsplit.Nih.Test_object.c: Add many tests
	for async calls, in fact, we pretty much just duplicate the sync
	tests but use a timer in the server to deliver the reply.

	* nih/dbus.c (nih_dbus_object_message): Set a destructor for the
	message that unreferences the attached D-Bus message when it
	is freed, and don't unreference it ourselves.  Also allow the
	handler to return "not yet handled" to mean that the method
	has actually been handled, but the reply hasn't been sent yet.
	(nih_dbus_message_destroy): Destructor for the message.

2008-05-11  Scott James Remnant  <scott@netsplit.com>

	* nih/nih_dbus_tool.py: Implement handling for arrays of simple C
	types with an extra length variable, and handling for arrays of
	pointer types with an extra NULL element
	* nih/tests/com.netsplit.Nih.Test.xml: Add test methods with an
	int32 and string array as input and output, and test signals
	with both array types.
	* nih/tests/test_com.netsplit.Nih.Test_object.c: Add tests for
	the new methods and signals, testing the underlying automatic
	generation.

2008-05-10  Scott James Remnant  <scott@netsplit.com>

	* nih/string.c (nih_strncat, nih_strcat_vsprintf): Ok, there
	was a minor technical reason after all; don't strlen the
	string if we don't have it.

	* nih/string.c (nih_strcat, nih_strncat, nih_strcat_sprintf)
	(nih_strcat_vsprintf): Remove the restriction that the string
	must be pre-allocated, there's no technical reason for it, I was
	just trying to enforce a style.

2008-05-09  Scott James Remnant  <scott@netsplit.com>

	* nih/nih_dbus_tool.py: Drop the data type argument, and just
	pass around void *; we never have the types available, and since
	we have our own prototype anyway, we never upset gcc.

	* nih/dbus.c (nih_dbus_path): Empty path components are named
	as "_" instead.
	* nih/tests/test_dbus.c (test_path): Test the new functionality.

2008-05-08  Casey Dahlin  <cdahlin@redhat.com>

	* nih/file.c (nih_file_is_packaging): Add matches for various
	RPM temporary and atomicity files.

2008-05-08  Scott James Remnant  <scott@netsplit.com>

	* nih/dbus.c (nih_dbus_error_raise_printf): Add formatted error
	function, I held out as long as I could
	* nih/dbus.h: Add prototype.
	* nih/tests/test_dbus.c (test_error_raise_printf): And test for it.
	* nih/error.h: Add missing attribute

	* nih/Makefile.am: No need for version info if not installing

2008-05-06  Scott James Remnant  <scott@netsplit.com>

	* m4/compiler.m4: -Wformat is already in -Wall

	* nih/main.c (nih_main_daemonise): Deliberately ignore chdir
	return value, repeat the dup calls until they work.
	(nih_main_loop_interrupt): repeat write call until it succeeds.
	* nih/test.h (TEST_CHILD, TEST_CHILD_WAIT, TEST_CHILD_RELEASE):
	assert that pipe() returns zero and read() and write() both return 1.
	(TEST_DIVERT_STDOUT_FD, TEST_DIVERT_STDERR_FD): assert that dup2
	returns a file descriptor.
	(TEST_FILE_RESET): assert ftruncate works.
	* nih/tests/test_io.c (test_add_watch, test_select_fds)
	(test_handle_fds, test_reopen, test_shutdown, test_destroy)
	(test_watcher, test_read_message, test_send_message, test_read)
	(test_write, test_get, test_printf, test_set_nonblock)
	(test_set_cloexec): assert that the pipe() calls work.
	(test_watcher): assert that write() returns expected number.
	* nih/tests/test_file.c (test_map): Check the fgets works.
	(test_dir_walk): assert that the symlink call works.
	* nih/tests/test_main.c (test_daemonise): assert pipe(), write()
	and getcwd() calls work.
	* nih/tests/test_com.netsplit.Nih.Test_object.c (my_setup):
	initialise wait_fd to get around gcc's blindness.
	(my_emit_signal): initialise ret.

	* m4/compiler.m4: Add -Wformat, -Wformat-security and
	-D_FORTIFY_SOURCE=2 to our default CFLAGS unless compiler warnings
	are disabled.

2008-04-29  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_com.netsplit.Nih.Test_object.c (test_method_marshal)
	(test_signal_dispatch):	For some reason valgrind needs some
	reassurance that it's ok to pass uninitialised data around in various
	cases; probably good for testing anyway.

	* nih/dbus.c (nih_dbus_path): Function to generate D-Bus paths with
	appropriate escaping of non-root elements.
	* nih/dbus.h: Add prototype.
	* nih/tests/test_dbus.c (test_path): Test the new function.

	* nih/dbus.c (nih_dbus_object_introspect): Free the introspection
	string after sending the message (oops!)

2008-04-27  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/com.netsplit.Nih.Test.xml: Add signals to the test
	interface for the variety of basic argument types, we also need
	a glue function to make the server emit the signal.
	* nih/tests/test_com.netsplit.Nih.Test_object.c (my_emit_signal)
	(test_signal_dispatch): Test the signals are emitted and dispatched
	properly by catching them and checking them.

2008-04-26  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_GROUP): Add macro for when we don't test functions.
	* nih/tests/test_com.netsplit.Nih.Test_object.c (test_method_marshal):
	Use TEST_GROUP here.

	* nih/tests/com.netsplit.Nih.Test.xml: Add more methods to test,
	one generic method and two methods (in and out) for each basic type.
	* nih/tests/test_com.netsplit.Nih.Test_object.c: Slightly redo the
	way we do the tests, do the basic set of tests using a single method
	that can return cases such as errors, etc.  Then have input and output
	marshal tests for each of the basic types.
	* nih/nih_dbus_tool.py (NAME_RE): Cope with numerics in member names,
	treat them the same as lowerspace characters.

2008-04-25  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update, adding missing pieces for D-Bus support and an
	idea for changing the way that timers/signals/io/etc. work.

	* nih_dbus_tool.py: Handle the basic D-Bus types and generate
	marshalling functions for methods and dispatch functions for
	signals, along with all of the glue needed for nih_dbus_object_new()
	* nih/tests/com.netsplit.Nih.Test.xml: Interface to be used for
	testing of the generated code.
	* nih/tests/test_com.netsplit.Nih.Test_object.c: Test suite for
	the generated code (in object mode), so far this just tests a
	couple of methods but will be adding a lot more tests soon.
	* nih/Makefile.am (TESTS): Add the above test suite.
	(test_com_netsplit_Nih_Test_object_SOURCES)
	(test_com_netsplit_Nih_Test_object_CFLAGS)
	(test_com_netsplit_Nih_Test_object_LDFLAGS)
	(test_com_netsplit_Nih_Test_object_LDADD): Details for the test suite.
	(BUILT_SOURCES): Interface definitions are auto-generated and need
	to be done so at the start of the build so deps work properly.
	(CLEANFILES): All built sources need to be cleaned on "make clean"
	(tests/com.netsplit.Nih.Test_object.c tests/com.netsplit.Nih.Test_object.h):
	Generate the interface definitions with the binding tool, being
	sure to regenerate if the XML or binding tool change.

	* nih/dbus.c (nih_dbus_object_new): Register an object with D-Bus
	and hook it up to an internal message handling function that deals
	with introspection and the like, while passing off actual handling
	to marshaller functions for individual methods.
	(nih_dbus_object_destroy): When the object is freed, unregister
	it from the bus making sure that doing so doesn't try to free it
	a second time.
	(nih_dbus_object_unregister): When the bus connection is dropped
	or object otherwise unregistered, free it, making sure that doing
	so doesn't try to unregister it a second time.
	(nih_dbus_object_message): Handle messages for the object, locate
	the marshaller function in the interface structures or pass off
	to internal handler for introspection.
	(nih_dbus_object_introspect): Handle the Introspect method by
	generating XML which we return in a reply.
	* nih/dbus.h: Add prototype for new function.
	(NihDBusObject, NihDBusMessage, NihDBusMarshaller, NihDBusArgDir)
	(NihDBusArg, NihDBusMethod, NihDBusSignal, NihDBusAccess)
	(NihDBusProperty, NihDBusInterface): Add the truly insane number
	of structures and enums we need to fully specify the interfaces
	that a D-Bus object provides; you'll never do this by hand! :-)
	* nih/tests/test_dbus.c (test_object_new, test_object_destroy)
	(test_object_unregister, test_object_message): Test cases for new
	functions.
	(test_connect, test_bus): Check error messages using the macros
	rather than by name.

2008-04-23  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_nih_dbus_tool.py: In hindsight, it's unnecessary
	to test the binding tool directly since the tests will basically
	just compare the output to an expected C file which will make
	maintaining it damned hard and doesn't actually guarantee it works;
	instead we'll test generated output.
	* nih/Makefile.am (TESTS): Remove the call to the Python test suite,
	and reverse the TESTS/check_PROGRAMS thing again to match.

2008-04-22  Scott James Remnant  <scott@netsplit.com>

	* nih/libnih-dbus.supp: D-Bus init_system_db() related leaks
	were likely a missing dbus_shutdown() since they've gone away
	now.

	* nih/dbus.c (nih_dbus_add_timeout, nih_dbus_timeout_toggled):
	Slightly adjust the millisecond to second conversion to always
	round up to the nearest whole second rather than down; that way
	we have a 1s minimum timeout instead of an immediate one.

2008-04-21  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_dbus.c (test_bus): Cope when the session bus
	is not available.

	* nih/libnih-dbus.supp: Suppress annoying NSS problems on i686
	as well (we did x86-64 last time).  Also found that a couple of
	the suppressions were caused by failing to shutdown properly,
	so remove those (and uncover a D-Bus bug or two in the process).

	* nih/tests/test_dbus.c: Remove unnecessary SIGPIPE setting.

	* nih/libnih-dbus.supp: I keep finding ways in which D-Bus holds
	on to data, not to mention annoying NSS problems.

	* nih/libnih.supp: Add long-missing suppression for the main loop
	functions list, seems we've never actually tested that without
	freeing it manually.

2008-04-18  Scott James Remnant  <scott@netsplit.com>

	* nih/dbus.c (nih_dbus_connect, nih_dbus_bus): Functions to connect
	to an abitrary address or a well-known bus, calling our own handler
	on disconnect instead of exit() and setting things up in the main
	loop properly.
	(nih_dbus_setup): Function called by the above, and callable
	externally, to set up the disconnect handler and main loop hook-ups;
	deals with shared connections by checking the main loop slot.
	(nih_dbus_server): Similar function to create a listening server
	and hook it up to the main loop.
	(nih_dbus_add_watch, nih_dbus_remove_watch)
	(nih_dbus_watch_toggled, nih_dbus_watcher): Glue functions so that
	D-Bus can watch file descriptors using our main loop.
	(nih_dbus_add_timeout, nih_dbus_remove_timeout)
	(nih_dbus_timeout_toggled, nih_dbus_timer): Glue functions so that
	D-Bus can set timeouts using our main loop.
	(nih_dbus_wakeup_main): Glue function so that D-Bus can interrupt
	the main loop (I think this is really for multi-threaded apps, but
	it does no harm to force an iteration).
	(nih_dbus_callback): Glue function to dispatch D-Bus messages
	within the main loop.
	(nih_dbus_connection_disconnected): Filter function to catch the
	org.freedesktop.DBus.Local.Disconnected signal and call any
	disconnect handler before unreferencing the connection.
	(nih_dbus_new_connection): Handle new server connections by calling
	the connect handler if set, referencing the new connection then
	setting it up in the main loop.
	* nih/dbus.h (NihDBusDisconnectHandler, NihDBusConnectHandler):
	Function prototype typedefs for disconnect and connect handlers.
	* nih/tests/test_dbus.c (test_connect, test_bus, test_setup)
	(test_server): Test the new functions as best we can.
	* nih/libnih-dbus.supp: D-Bus slot allocator doesn't free memory.

	* nih/main.c (nih_main_loop_init): Make a non-static function.
	* nih/main.h: Add prototype.

2008-04-16  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_FILE_NE, TEST_FILE_NE_N): Fix logic of tests.

2008-04-12  Scott James Remnant  <scott@netsplit.com>

	* nih/Makefile.am: If we're not installing the library then we
	want to still make the script but don't want to install it.

	* nih/nih_dbus_tool.py: Skeleton code for the Python binding tool.
	* nih/tests/test_nih_dbus_tool.py: Test cases for the dbus tool.
	* nih/Makefile.am (TESTS): When building the dbus library, also run
	the Python test suite for the Python binding tool; this requires
	reversing the check_PROGRAMS/TESTS setting since it needs to only
	be in TESTS.

	* nih/libnih-dbus.supp, nih/libnih-dbus.ver: Library support files.

	* nih/dbus.c (nih_dbus_error_raise): Begin the D-Bus library with
	a function to raise an NihError that can be converted into a
	DBusError when necessary (to be used in function returns).
	* nih/dbus.h (NihDBusError): Type for the structure since we need
	to include a name member.
	* nih/tests/test_dbus.c (test_error_raise): Test case.
	* nih/errors.h: Add NIH_DBUS_ERROR error; no string for this since
	each individual error will have its own.

2008-04-11  Scott James Remnant  <scott@netsplit.com>

	* m4/misc.m4: Reverse the sense of the noinstall option, so that
	"install" needs to be present for libnih to be installed.
	* configure.ac: Install libnih when built from its own source.

2008-03-29  Scott James Remnant  <scott@netsplit.com>

	* nih/Makefile.am (libraries): Build optional libnih-dbus.la
	(libnih_dbus_la_SOURCES, libnih_dbus_la_CFLAGS)
	(libnih_dbus_la_LIBS, -version-info 0, libnih_dbus_la_LDFLAGS):
	Details for optional library.
	(EXTRA_DIST): Distribute the version script and suppressions files.
	(nihinclude_HEADERS): Install the optional libdbus header
	(bin_SCRIPTS): Build optional nih-dbus-tool binding tool script
	(CLEANFILES, EXTRA_DIST, do_subst, nih-dbus-tool): Create installed
	script by substituting in another, be sure to distribute the other
	and clean the intermediate file.
	(TESTS): Optional test suite
	(test_dbus_SOURCES, test_dbus_CFLAGS, test_dbus_LDFLAGS)
	(test_dbus_LDADD): Details for the optional dbus test suite.
	* m4/misc.m4 (AC_COPYRIGHT): Also add a Makefile PACKAGE_COPYRIGHT
	variable for substitution.
	(NIH_INIT): We have separate cflags for dbus-related tools, so we
	need to check that gcc supports -c and -o.

	* m4/libs.m4 (NIH_LIB_DBUS): Macro to detet whether pkg-config,
	D-Bus and Python are available and decide based on that whether or
	not we can build an optional D-Bus binding library; configure options
	and arguments determine whether being unable to is a warning or an
	error.
	* m4/misc.m4: Add the dbus option to the help and the call to check
	for the libraries.
	* README: Add a section on the dependencies this introduces.

	* m4/libs.m4: Add an empty file to hold macros relating to library
	detection.
	* m4/Makefile.am (dist_aclocal_DATA): Install and distribute the
	new macro file.
	* nihify: Symlink the new macro file across as well.

2008-03-19  Scott James Remnant  <scott@netsplit.com>

	* nih/hash.c (nih_hash_pointer_hash): Fix hash generation on 64-bit
	systems by using each byte rather than trying to be clever.

2008-03-14  Scott James Remnant  <scott@netsplit.com>

	* nih/hash.c (nih_hash_new): Also require hash and cmp functions
	and store in the structure.
	(nih_hash_add, nih_hash_add_unique, nih_hash_add_replace)
	(nih_hash_search, nih_hash_lookup): Change key type to void,
	use hash and cmp functions from the structure.
	(fnv_hash): Rename to nih_hash_string_key
	(nih_hash_string_cmp): String comparison function.
	(nih_hash_pointer_key, nih_hash_pointer_hash, nih_hash_pointer_cmp):
	Pointer hash functions.
	* nih/hash.h (NihHashFunction): Prototype for hash function.
	(NihCmpFunction): Prototype for key comparison function.
	(NihHash): Add hash_function and cmp_function members.
	(nih_hash_pointer_new, nih_hash_string_new): Macros to wrap function
	and pass in common key, hash and cmp functions.
	* nih/tests/test_hash.c: Update tests to include new functions and
	macros.
	* nih/watch.c: Use nih_hash_string_new() to create the hash table.

	* nih/command.c: Add const to local structures.
	(nih_command_join): Expect to not change the structures passed
	(nih_command_handle): Iterate structure as const.
	* nih/command.h: Add const to prototype.
	* nih/option.c: Add const to local structures.
	(nih_option_join): Expect to not change the structures passed
	* nih/option.h: Add const to prototype.

	* nih/error.c (nih_error_init): Make extern for consistency.
	* nih/error.h: Add prototype.
	* nih/logging.c (nih_log_init): Make extern for consistency.
	* nih/logging.h: Add prototype.

	* nih/child.c (child_watches): Rename to nih_child_watches and
	make extern.
	(nih_child_init): Make extern, update name of global.
	(nih_child_add_watch, nih_child_poll): Update name of global.
	* nih/child.h: Add prototypes.
	* nih/io.c (io_watches): Rename to nih_io_watches and make extern.
	(nih_io_init): Make extern, update name of global.
	(nih_io_add_watch, nih_io_select_fds, nih_io_handle_fds): Update
	name of global.
	* nih/io.h: Add prototypes.
	* nih/main.c (loop_functions): Rename to nih_main_loop_functions
	and make extern.
	(nih_main_loop_init, nih_main_loop, nih_main_loop_add_func): Update
	name of global.
	* nih/main.h: Add prototype.
	* nih/signal.c (signals): Rename to nih_signals and make extern.
	(nih_signal_init): Make extern, update name of global.
	(nih_signal_add_handler, nih_signal_poll): Update name of global.
	* nih/signal.h: Add prototypes.
	* nih/timer.c (timers): Rename to nih_timers and make extern.
	(nih_timer_init): Make extern, update name of global.
	(nih_timer_add_timeout, nih_timer_add_periodic)
	(nih_timer_add_scheduled, nih_timer_next_due, nih_timer_poll): Update
	name of global.
	* nih/timer.h: Add prototypes.

	* m4/misc.m4 (NIH_INIT): Allow the macro to take options, the first
	of which shall be "noinstall" which defines a Makefile conditional
	that prevents installation of files -- useful when embedded in
	things like Upstart.
	* m4/Makefile.am (dist_aclocal_DATA): Don't install if "noinstall"
	is defined.
	* nih/Makefile.am (lib_LTLIBRARIES): If "noinstall" is defined,
	still build the library but do not install it.
	(include_HEADERS): Don't install if "noinstall" is defined.

2008-03-08  Scott James Remnant  <scott@netsplit.com>

	* HACKING: Don't even need /product/ anymore.

	* HACKING: Terminology changes: Bazaar-NG is now just Bazaar;
	Malone is now just Launchpad's bug tracking system.

2008-03-07  Scott James Remnant  <scott@netsplit.com>

	* nih/error.h (NIH_SHOULD): We quite often need to loop while
	we get ENOMEM, but break on another error; this does that.
	* nih/watch.c (nih_watch_new): Use here, fixing a bug in the process
	where we didn't re-raise the error again.

2008-03-06  Scott James Remnant  <scott@netsplit.com>

	* nih/string.c (nih_strcat, nih_strncat, nih_strcat_sprintf)
	(nih_strcat_vsprintf): I'm needing to use realloc more than I should
	for string concatenation, so lets have some functions to do that.
	* nih/string.h: Prototypes for new functions.
	* nih/tests/test_string.c (test_strcat, test_strncat)
	(test_strcat_sprintf, test_strcat_vsprintf): Test the new functions.

	* TODO: Update.

2008-03-03  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_config.c (test_token): Also check that backslashes
	can escape themselves; since you may want a literal one followed by
	whitespace or a newline.
	* nih/config.c (nih_config_token): Dequote blackslash following a
	blackslash.

	* nih/tests/test_config.c (test_token): We don't want to dequote
	anything other than newlines and whitespace, since the quote
	characters may be important for the value (e.g. \$FOO being different
	to $FOO).  Add tests to make sure we don't.
	* nih/config.c (nih_config_token): After a slash, only dequote
	whitespace otherwise if we're copying, copy a literal slash character
	first.

	* nih/tests/test_string.c (test_array_append): Should work with a
	NULL array argument.
	* nih/string.c (nih_str_array_append): Make it work.
	(nih_str_array_copy): Which makes this function somewhat simpler.

2008-03-02  Scott James Remnant  <scott@netsplit.com>

	* nih/libnih.supp (nih-command-parser, nih-option-parser): Suppress
	leak of internal state during --help tests.
	(nih-main-package-string-test): Modify suppression to also catch
	when it's allocated within a test case.

2008-03-01  Scott James Remnant  <scott@netsplit.com>

	* nih/tree.h (NIH_TREE_FOREACH_FULL, NIH_TREE_FOREACH_PRE_FULL)
	(NIH_TREE_FOREACH_POST_FULL): The lack of these macros was silly.
	* nih/tests/test_tree.c (test_foreach_full)
	(test_foreach_pre_full, test_foreach_post_full): Add tests.

	* nih/tree.c (nih_tree_next, nih_tree_prev, nih_tree_next_pre)
	(nih_tree_prev_pre, nih_tree_next_post, nih_tree_prev_post): Rename
	these functions to *_full and add filter and data pointers, where
	the filter must return FALSE if given otherwise a node is ignored.
	* nih/tree.h: Update prototypes, and keep previous behaviour with
	the old names through the use of macros.  Typedef the filter function
	pointer type.
	* nih/tests/test_tree.c (test_next_full, test_prev_full)
	(test_next_pre_full, test_prev_pre_full, text_next_post_full)
	(test_prev_post_full): Test iteration with filters.

2008-01-16  Scott James Remnant  <scott@netsplit.com>

	* nih/tree.c (nih_tree_next, nih_tree_prev, nih_tree_next_pre)
	(nih_tree_prev_pre, nih_tree_next_post, nih_tree_prev_post): It's
	never possible to break out of the loop since we always return
	inside it.

	* nih/tests/test_child.c (test_poll): Add test case for the watch
	being on the wrong event.

	* m4/compiler.m4 (NIH_COMPILER_COVERAGE): Allow this to disable
	use of -Os, which otherwise wouldn't be.

	* configure.ac (AC_COPYRIGHT): Update copyright to 2008.

2008-01-15  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_child.c (test_poll): Don't run the ptrace tests
	under valgrind, since they upset it somewhat and return different
	things (I expect we end up tracing valgrind itself).

	* nih/main.c (nih_main_daemonise): Formatting fix.

2008-01-14  Scott James Remnant  <scott@netsplit.com>

	* HACKING: Correct bzr URL to trunk.

2007-12-06  Scott James Remnant  <scott@netsplit.com>

	* nih/child.c (nih_child_poll): I give up.  The wait queue can change
	between an invocation of waitid with WNOWAIT and the invocation later
	to "remove" the entry.  WNOWAIT is a waste of time, and no matter how
	useful it might have been, I just see no way of actually using it.
	* nih/child.h: Update documentation.

2007-12-02  Scott James Remnant  <scott@netsplit.com>

	* nih/signal.c (nih_signal_set_handler): Drop the SA_NOCLDSTOP flag
	from when we were setting SIGCHLD, I've no idea why this crept in
	and it now stops us doing things we want to.
	* nih/tests/test_signal.c (test_set_handler): Remove the test for it.

	* nih/tests/test_child.c (test_poll): Fix for AMD64, the data
	argument for PTRACE_GETEVENTMSG is unsigned long, which is larger
	than pid_t here.

	* nih/tests/test_child.c (test_poll): Fix up several race
	conditions in the ptrace test cases, there are a lot of quirks you
	have to remember when dealing this most insane of syscalls.
	(signal from traced child): Once we've finished the test we must
	detach from the child otherwise we'll trap our own SIGTERM and the
	child won't exit.  Tthere's no need to send SIGCONT since this
	is an ordinary ptrace signal trap.
	(exec by traced child): Detach and send SIGCONT in case the process
	we run gets a signal delivered to it; if that happened, we'd trap
	that signal and the child would never exit.
	(fork by traced child): This is the most pathalogical.  We had a
	race where nih_child_poll() was actually reaping the event for the
	child stopping.  Change to get the child pid and wait for it before
	calling the poll function.  Don't bother waiting for the child to
	terminate, we shouldn't ever find out if we've detached properly.

2007-11-29  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_write_pidfile): Have to cast the difference
	in pointers to int, otherwise we get a compiler warning on amd64.

	* nih/child.c (nih_child_poll): Remove the hacks that shift the
	status information back now that we have a kernel patch in akpm's
	tree to fix it.

2007-11-15  Scott James Remnant  <scott@netsplit.com>

	* nih/child.c (nih_child_poll): I found out what was causing the
	signal information to be missing for CLD_STOPPED, a kernel bug;
	cope with it for now by shifting the status across 8 bits for
	CLD_TRAPPED and CLD_STOPPED until I get Roland to fix that bit.
	* nih/tests/test_child.c (test_poll): Replace sleeps with waitid
	WNOWAIT calls now that that particular kernel bug is fixed; add
	a couple of pauses so that the child doesn't exit and clean up
	the wait queue before we get a chance to look.  Add a wait on the
	child stopping after fork to avoid a race condition where the child
	isn't actually running yet when we try and detach from it.

	* nih/child.h (NihChildWatch): Add events member and rename reaper
	to handler, since it can now be called for things like stop, trap
	and ptrace events.
	(NihReaper): Rename to NihChildHandler
	(NihChildEvents): Enumeration/bit flags for events member
	* nih/child.c (WAITOPTS): Define wait options in one place to make
	repeating them easier.
	(nih_child_add_watch): Add events argument and change type and name
	of function argument, set in the structure.
	(nih_child_poll): Rather than just working out a killed boolean (which
	was wrong anyway since it didn't take CLD_DUMPED into account), we
	store one of many events in the event argument and convert status if
	necessary (bit shifting for CLD_TRAPPED and ptrace events).  Check
	this event against the events mask in the watch, and pass to the
	handler.
	* nih/tests/test_child.c (test_add_watch): Check that events and
	handler are initialised correctly.
	(test_poll): Many new test cases for exiting, killing, aborting,
	stopping, continuing, trapping and ptracing.

2007-11-03  Scott James Remnant  <scott@netsplit.com>

	* nih/watch.h (NihWatch): Add created hash table so we can easily
	delay the create_handler until the file is closed.
	* nih/watch.c (nih_watch_new): Initialise the created hash table.
	(nih_watch_handle): When a file is created, add an entry to the
	created hash table and return without calling a handler -- for all
	paths, check for and remove any remove any existing created entry;
	call create_handler instead of modify_handler if this exists, and
	don't call delete_handler at all.
	* nih/tests/test_watch.c (test_new): Check created is initialised.
	(test_reader): Test that creating a file doesn't trigger create
	until it's closed and that unlinking a file before it's been closed
	doesn't trigger at all.

	* nih/test.h (TEST_FREE_TAG): assert that we don't use this on
	a NULL pointer.

2007-11-02  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_FUNCTION_FEATURE): Add macro for when we're
	testing a specific feature of a function.

2007-10-27  Scott James Remnant  <scott@netsplit.com>

	* m4/compiler.m4 (NIH_COMPILER_OPTIMISATIONS): Add extra [...]

	* m4/compiler.m4 (NIH_COMPILER_WARNINGS): Add missing [...] around
	the second argument to AS_IF.
	(NIH_COMPILER_OPTIMISATIONS): Fix wrong use of [..][..] to [....]
	(NIH_COMPILER_COVERAGE): Remove extraneous comma

	* m4/linker.m4 (NIH_LINKER_VERSION_SCRIPT): Restore AM_CONDITIONAL
	that was mistakenly dropped.

2007-10-26  Scott James Remnant  <scott@netsplit.com>

	* m4/linker.m4 (NIH_LINKER_SYMBOLIC_FUNCTIONS): Test that checks
	for -Bsymbolic-functions

	* m4/linker.m4: Style fix.

	* m4/compiler.m4 (NIH_COMPILER_COVERAGE, NIH_COMPILER_OPTIMISATIONS)
	(NIH_COMPILER_WARNINGS): Update to use AS_IF.

	* m4/compiler.m4 (NIH_C_THREAD): Shell fix.

	* m4/linker.m4 (NIH_LINKER_OPTIMISATIONS): Update to use AS_IF.

	* m4/linker.m4 (NIH_LINKER_VERSION_SCRIPT): Update so it supports
	a config.cache

2007-10-24  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_file_map): Catch a file larger than the length of
	size_t and raise the standard EFBIG error message.  Noticed by
	Kees Cook.

2007-10-15  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_alloc_using, nih_alloc_reparent, nih_realloc):
	Change the order in which children allocations are stored in the
	list such that the last allocation is freed first rather than
	the other way around.  This solves issues of children being stored
	inside an allocated hash table which will be freed first.

	* m4/misc.m4 (NIH_INIT): Use AC_PROG_CC_C99 instead of NIH_C_C99
	* configure.ac: Bump Autoconf dependency to 2.61
	* HACKING: Likewise increase documentation

	* HACKING: Correct Bazaar branch now we're natively hosted on LP

	* nih/test.h (_test_allocator): Mark used in case it isn't.
	(_test_free_tag, _test_free_tags, _test_destructor)
	(TEST_FREE_TAG, TEST_FREE, TEST_NOT_FREE): Since destructors are
	now intended for internal use by an object, we shouldn't abuse them
	in test cases like we were doing - since we might not chain up
	properly and miss vital behaviour as a result.  Instead implement
	some tests that use a destructor on an nih_alloc() child of the object
	to determine freeness.
	* nih/tests/test_watch.c (test_reader): Use TEST_FREE instead of
	a custom destructor, which are no longer favoured for this kind
	of work.
	* nih/tests/test_error.c (test_raise_again, test_pop_context): 
	Use TEST_FREE instead of custom destructor.
	* nih/tests/test_timer.c (test_poll): Use TEST_FREE/TEST_NOT_FREE
	* nih/tests/test_child.c (test_poll): Use TEST_FREE, etc.
	* nih/tests/test_io.c (test_shutdown, test_watcher)
	(test_read_message, test_read, test_get): Use TEST_FREE, etc.

	* nih/hash.c, nih/timer.c, nih/signal.c, nih/child.c, nih/io.c,
	nih/watch.c: Document why non-allocated versions of functions
	are missing.
	* TODO: Update.

2007-10-14  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_free): Call destructors before freeing children,
	this makes them more consistent with being structure clean-up
	functions rather than using them to detect a free.  Don't return
	values from children destructors.
	* nih/tests/test_alloc.c (test_free): Adjust test, return values
	from children destructors are never returned.

	* nih/watch.c (nih_watch_new): Make the io structure an nih_alloc
	child of the watch, now that we don't perform any kind of lazy
	freeing or closing.
	(nih_watch_destroy): No need to close the io structure since it'll
	be automatically freed, just set the flag to be caught in the reader.
	* nih/tests/test_watch.c (test_new): Check parent of watch->io
	is watch, not NUL.
	(test_destroy): Don't use the destructor anymore, nih_alloc is tested
	elsewhere.
	(test_reader): Don't use destructor to test watch->io
	(my_destructor): Always call nih_watch_destroy since this is only
	used for that.

	* nih/io.c (nih_io_close): Rename to nih_io_destroy, setting a free
	flag in the structure if necessary before closing the descriptor
	and calling the error handler if there's a problem.
	(nih_io_reopen): Set destructor
	(nih_io_watcher): Rename lazy_close to caught_free and check its
	value after any calls to the reader, error handler or close handler
	functions; if true, simply bail out.  Reorder leaving so that a
	shutdown check happens last (since this can free the structure).
	(nih_io_closed): Now simply calls the close handler if it exists,
	otherwise frees the structure.
	* nih/io.h (NihIo): Rename close member to free.
	Update prototypes.
	* nih/tests/test_io.c (my_reader, test_reopen): Use nih_free
	instead of nih_io_close.
	(test_reopen): Create new fds each time, since they are closed
	on free now.
	(destructor_called): Chain up to call nih_io_destroy
	(test_close): Rename to test_destroy and alter appropriately.
	(test_watcher): Adjust documentation to say we're checking that free
	is called in the reader.
	(test_send_message, test_write, test_printf): Open pipes rather
	than just stdout, because that will end up closed.

2007-10-12  Scott James Remnant  <scott@netsplit.com>

	* nih/watch.h (NihCreateHandler, NihModifyHandler, NihDeleteHandler):
	Modify doc strings to mention nih_free instead of nih_watch_free

	* nih/tests/test_file.c (my_visitor): Set destructor for the list
	entries we create as we go.

	* nih/watch.c (nih_watch_reader): Rework the function slightly,
	instead of using the free pointer to free at the end of the handler,
	use it to detect the free after the handler returns and immediately
	abort -- it means we won't process remaining watches but meh.
	(nih_watch_handle): Get passed the caught_free flag and check it
	after calling any handlers to make sure we abort properly.
	(nih_watch_free): Rename to nih_watch_destroy and just handle the
	internal cleanup.
	(nih_watch_new): Set the destructor properly.
	* nih/watch.h: Update prototypes.
	* nih/tests/test_watch.c (test_free): Rename to test_destroy.
	(my_delete_handler): Use nih_free not nih_watch_free
	(my_destructor): Chain up to nih_watch_destroy for NihWatch.

	* nih/tests/test_watch.c (my_destructor): Neither NihWatch nor NihIo
	need a destructor to be called.

	* nih/tests/test_child.c (test_poll): Fix erroneous removal of "1"

	* TODO: Update.

2007-10-11  Scott James Remnant  <scott@netsplit.com>

	* nih/option.c, nih/command.c, nih/config.c: Remove references to
	nih_alloc_set_destructor() from doc strings since this is now
	considered bad practice.

	* nih/main.c (nih_main_loop_add_func): Adjust call to set destructor
	* nih/tests/test_main.c (test_main_loop)
	(test_main_loop_add_func): Call nih_free instead of nih_list_free

	* nih/watch.c (nih_watch_add, nih_watch_handle): Call nih_free
	instead of nih_list_free
	(nih_watch_add): Set destructor to nih_list_destroy for now.
	* nih/tests/test_watch.c (my_destructor): Call nih_list_destroy
	for NihWatch structure.

	* nih/file.c (nih_dir_walk_visit): Call nih_free instead of
	nih_list_free
	(nih_dir_walk, nih_dir_walk_visit): Set destructor on object.

	* nih/tests/test_io.c (test_add_watch, test_select_fds)
	(test_handle_fds, test_shutdown, test_watcher): Call nih-free
	instead of nih_list_free
	(destructor_called): Call nih_list_destroy when passed an
	NihIoMessage; a bit icky since this is also called for an NihIo
	which doesn't have a destructor (yet)

	* nih/io.c (nih_io_watcher_write, nih_io_read, nih_io_get): Call
	nih_free instead of nih_list_free.
	(nih_io_add_watch): Adjust call to set destructor
	(nih_io_message_new): Set a destructor so the message is removed
	from a list when freed.

	* nih/child.c (nih_child_add_watch): Adjust call to set destructor
	(nih_child_poll): Call nih_free instead of nih_list_free
	* nih/tests/test_child.c (test_add_watch, test_poll): Call nih_free
	instead of nih_list_free.
	(my_destructor): Call nih_list_destroy().

	* nih/string.c: Fix documentation as below.

	* nih/hash.c: Fix doc string, destructors are now considered internal
	and shouldn't be set by callers.

	* nih/signal.c (nih_signal_add_handler): Adjust call to set destructor
	* nih/tests/test_signal.c (test_add_handler): Call nih_free instead
	of nih_list_free

	* nih/timer.c: Fix doc strings

	* nih/timer.c (nih_timer_add_timeout, nih_timer_add_periodic)
	(nih_timer_add_scheduled): Adjust calls to set destructor.
	(nih_timer_poll): Call nih_free rather than nih_list_free.
	* nih/tests/test_timer.c (test_add_timeout, test_add_periodic)
	(test_add_scheduled, test_next_due): Call nih_free rather than
	nih_list_free
	(my_destructor): Call the list destructor.

	* nih/tree.c (nih_tree_destructor): Rename to nih_tree_destroy()
	(nih_tree_free): Drop.
	(nih_tree_new, nih_tree_entry_new): Set destructor.
	* nih/tree.h: Update prototypes.
	* nih/tests/test_tree.c (test_destructor): Rename.
	(test_free): Drop

	* nih/: Documentation string fix.

	* nih/tests/test_hash.c (test_string_key): Replace nih_list_free
	call with nih_free, since we're not overriding the destructor.

	* nih/list.c (nih_list_free): Drop this function.
	(nih_list_destructor): Rename to nih_list_destroy()
	(nih_list_new, nih_list_entry_new): Set destructor function.
	* nih/list.h: Update prototypes.
	* nih/tests/test_list.c (test_destructor): Rename.
	(test_free): Drop.
	(test_add): Replace nih_list_free calls with nih_free

2007-10-08  Scott James Remnant  <scott@netsplit.com>

	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.16.1 since this
	version of gettext is needed for compatibility with Automake 1.10
	* HACKING: Bump version in the docs too.

	* Makefile.am (ACLOCAL_AMFLAGS): Specify that aclocal install
	ordinarily system-wide macros into m4 (libtool.m4, specifically).
	This makes it easier for packagers to modify autoconfery since
	aclocal is no longer a destructive event.
	* configure.ac (AM_INIT_AUTOMAKE): Increase Automake requirement to
	1.10 to ensure we have aclocal --instal
	* HACKING: Increase Automake version in the docs.

2007-06-22  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_tree.c (test_next, test_prev, test_next_pre)
	(test_prev_pre, test_next_post, test_pre_post): Add tests for a
	single-node tree, because we found a bug where it didn't work.
	* nih/tree.c (nih_tree_next): Bug fix; check there is a right node
	before checking whether we've returned from it, otherwise we could
	confuse it with starting at the top of the tree.
	(nih_tree_prev): Likewise check there is a left node before checking
	whether we've returned from it.

2007-06-20  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c (nih_config_parse_stanza): Free name after use.

	* nih/config.c (nih_config_parse_stanza): Don't dequote stanza
	names, since otherwise they can't be made non-special; if we don't
	recognise the stanza we parsed, raise the error without updating
	pos, since we want it to point to the start of the token.
	* nih/tests/test_config.c (test_parse_stanza): Update pos in test.

2007-06-18  Scott James Remnant  <scott@netsplit.com>

	* nih/list.h (NihListEntry): Define structure combining an NihList
	with a union of common types.
	* nih/list.c (nih_list_entry_new): Add a helper function for when
	we need a simple entry without any extra structure around it.
	* nih/tests/test_list.c (test_entry_new): Test the new function.
	* nih/tree.h (NihTreeEntry): Define structure combining an NihTree
	with a union of common types.
	* nih/tree.c (nih_tree_entry_new): Add a helper function for when
	we need a simple node without any extra structure around it.
	* nih/tests/test_tree.c (test_entry_new): Test the new function.

2007-06-15  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_tree.c (test_next, test_foreach, test_prev) 
	(test_next_pre, test_foreach_pre, test_prev_pre, test_next_post) 
	(test_foreach_post, test_prev_post): Add tests for partial tree
	traversal, we don't expect to break out of the confines of the
	root that we've set, even if it has a parent.
	* nih/tree.c (nih_tree_next, nih_tree_prev, nih_tree_next_pre)
	(nih_tree_prev_pre, nih_tree_next_post, nih_tree_prev_post): Before
	moving up to the parent node, check whether the current node is the
	tree root; if it is, return NULL instead since we've iterated the
	sub-tree we were looking at.

	* nih/tests/test_tree.c (test_next, test_foreach, test_prev) 
	(test_next_pre, test_foreach_pre, test_prev_pre, test_next_post) 
	(test_foreach_post, test_prev_post): Use two different arrays to
	make it really obvious how the tree is constructed and what order
	we really expect it to be in.  This makes it easier to get ready for
	the next bit ...

	* nih/tree.c (nih_tree_next, nih_tree_prev): Minor bug fix, set the
	previous to the tree's parent when visiting for the first time so that
	partial	tree iterations might be able to work.  Make algorithm code
	simpler and more readable.
	(nih_tree_next_pre, nih_tree_prev_pre): Algorithm for non-recursive
	pre-order tree iteration, note that unlike the above, these are not
	symmetrical.
	(nih_tree_next_post, nih_tree_prev_post): Algorithm for non-recursive
	post-order tree iteration, note that these aren't symmetrical with
	each other, but are the symmetrical equivalents of the pre-order
	functions.
	* nih/tree.h: Add prototypes for new functions.
	(NIH_TREE_FOREACH_PRE, NIH_TREE_FOREACH_POST): Add convenience
	iteration macros for pre-order and post-order iteration.
	* nih/tests/test_tree.c (test_next, test_foreach, test_prev): Add
	some documentation for the tree shape, and how we work out the node
	numbers.  In each case, we were accidentally giving the expected
	first node (which fortunately always worked); to test this harder,
	give the root node instead!
	(test_next_pre, test_foreach_pre, text_prev_pre): Test pre-order
	tree iteration with the same basic code.
	(test_next_post, test_foreach_post, text_prev_post): Test post-order
	tree iteration with the same basic code.

2007-06-12  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_HASH_NOT_EMPTY): Add missing ;

	* nih/main.c (nih_main_unlink_pidfile): Add for completeness.
	* nih/main.h: Add prototype.
	* nih/tests/test_main.c: Use the new function here for testing.

	* nih/main.c (nih_main_pidfile): Rename to nih_main_write_pidfile
	(nih_main_set_pidfile, nih_main_get_pidfile) 
	(nih_main_read_pidfile): Add companion functions to set and get the
	current location, and also read from it.
	* nih/main.h: Add prototypes.
	* nih/tests/test_main.c (test_set_pidfile, test_read_pidfile) 
	(test_write_pidfile): Test the functions as best we can.

	* nih/main.c (nih_main_daemonise): Cut the pid file writing out
	(nih_main_pidfile): and place it into its own function, since we
	seem to use this elsewhere too.
	* nih/main.h: add prototype.

	* nih/main.c (nih_main_daemonise): Don't just write the pid file
	directly, and hope it works.  Write to a temporary file, flush and
	sync it, then rename to the real filename.  This provides a "if the
	pid file exists, a pid can be read from it" contract - or at least,
	the nearest we can to that.

2007-06-11  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c (nih_config_skip_block): Simple function to skip over
	a block inline without parsing it into a string.
	* nih/config.h: Add prototype.
	* nih/tests/test_config.c (test_skip_block): Test the new function.

2007-06-10  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_HASH_EMPTY, TEST_HASH_NOT_EMPTY): Add some
	tests for hash emptyness.

2007-06-03  Scott James Remnant  <scott@netsplit.com>

	* nih/file.h (NihFileFilter): add missing data pointer to definition.
	* nih/file.c (nih_dir_walk_scan): Take the data pointer and pass it
	to the filter function.
	(nih_dir_walk, nih_dir_walk_visit): Pass data pointer to scan function.
	(nih_file_ignore): Accept and ignore a data pointer.
	* nih/tests/test_file.c (my_filter): Add data pointer.
	(test_ignore): Pass NULL for data pointer.
	* nih/watch.c (nih_watch_handle): Pass data to filter function.
	* nih/tests/test_watch.c (my_filter): Add data pointer.

2007-05-27  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c (nih_config_parse): Since we've elimated all of the
	uses of ssize_t in this code, we're safe to parse a file larger
	than SSIZE_MAX, so drop the check.
	* nih/errors.h (NIH_CONFIG_TOO_LONG): Drop this error, since there
	can be no such case anymore; technically we don't handle very large
	files since we can only map 4GB of memory, but we fail by mapping
	a smaller part of the file, rather than overrunning any buffers.

	* nih/config.c (nih_config_parse_block): Don't use -1 in ws to
	indicate we've not counted it yet, instead use the current value
	of lines; this elimates the last ssize_t from the code.

	* nih/config.c (nih_config_block_end): Modify to return TRUE or
	FALSE, and set the end position through an argument instead.
	(nih_config_parse_block): Update the way we call nih_config_block_end
	to receive the end location via the pointer, rather than as the
	return value.

	* nih/config.c (nih_config_token): Change return value to an int,
	and return the token length through an argument pointer if given.
	This eliminates a need for ssize_t for this function.
	(nih_config_next_token, nih_config_parse_command): Update way we
	call nih_config_token to obtain the length through a pointer, and
	directly check the return value to decide whether to abandon it.
	* nih/config.h: Update prototype.
	* nih/tests/test_config.c (test_token): Update the tests to check
	the pointed value for the length, and the return value for error.

2007-05-18  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_string.c (test_array_append): Make sure that the
	array is returned unaltered (at least, apparently) if any allocation
	fails during the append.
	* nih/string.c (nih_str_array_append): Record the original length,
	and pass always pass our local length variable to nih_str_array_add.
	Before returning, overwrite the returned length; if any allocation
	fails, unwind other allocations and restore the NULL pointer before
	returning NULL.

	* nih/string.c (nih_str_array_copy, nih_str_array_append): Add a
	couple of functions to copy a string array, and to append one onto
	the end of another.  Saves reimplementing this each time.
	* nih/string.h: Add prototypes.
	* nih/tests/test_string.c (test_array_copy, test_array_append):
	Test the new functions.

2007-04-24  Scott James Remnant  <scott@netsplit.com>

	* nih/string.c (nih_vsprintf): Add va_end to va_copy; C standard
	says so.

2007-03-13  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_io.c (test_get_family): The elmos of this world
	like to disable various networking protocols, so expect that and
	skip test cases.

	* nih/io.h: Change int_data type to a plain old int; there's no
	reason for it to be a fixed width type, and we may as well think
	about supporting ILP64 in case someone does something silly one day.

2007-03-11  Scott James Remnant  <scott@netsplit.com>

	* m4/compiler.m4: Don't check for __thread unless --enable-threading
	given to configure, instead define it to empty.

	* TODO: Update.

2007-03-09  Scott James Remnant  <scott@netsplit.com>

	* nih/logging.c: Make the current log priority available globally
	through the nih_log_priority variable.
	* nih/logging.h: Update.

2007-03-08  Scott James Remnant  <scott@netsplit.com>

	* nih/macros.h (_n): Add a macro to wrap ngettext() for plural forms.

2007-03-02  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_watch.c: Skip these tests if inotify is not
	available, since there's not much we can do.

2007-02-16  Scott James Remnant  <scott@netsplit.com>

	* nih/tree.c (nih_tree_next, nih_tree_prev): Add non-recursive
	functions to iterate a tree in-order either forwards or backwards.
	* nih/tree.h (NIH_TREE_FOREACH): Standard macro for wrapping
	nih_tree_next and turning it into a for loop.
	* nih/tests/test_tree.c (test_next, test_foreach, test_prev): Test
	things with a complex tree to see whether they work out ok.

	* nih/list.h: Fix formatting and ordering.
	* nih/list.c: Fix function ordering.

	* nih/tree.c: Add generic code to implement pure binary trees.
	* nih/tree.h: Structures, typedefs and prototypes.
	* nih/tests/test_tree.c: Binary tree test suite.
	* nih/libnih.h: Include tree.h
	* nih/Makefile.am (libnih_la_SOURCES): Build and link tree.c
	(nihinclude_HEADERS): Install tree.h
	(TESTS): Build and run binary tree test suite.
	(test_tree_SOURCES, test_tree_LDFLAGS, test_tree_LDADD): Details for
	binary tree test suite binary.

2007-02-15  Scott James Remnant  <scott@netsplit.com>

	* nih/watch.c (INOTIFY_EVENTS): Use IN_CLOSE_WRITE instead of
	IN_MODIFY; since that guarantees the file has actually been closed,
	and is probably on the filesystem now.

2007-02-13  Scott James Remnant  <scott@netsplit.com>

	* nih/signal.c: Add SIGUNUSED to the list of signals that might not
	exist.

	* nih/tests/test_option.c (test_parser): gcc doesn't like using
	variables inside fixed for loops, so initialise it deliberately.
	* nih/tests/test_command.c (test_help): Was mistakenly repeatedly
	opening output.
	(test_parser): Similar for loop issue.

	* nih/signal.c: Update signal name list, some signals don't exist on
	sparc and some turn up unexpectedly.

2007-02-11  Johan Kiviniemi  <johan@kiviniemi.name>

	* nih/hash.h (NIH_HASH_FOREACH, NIH_HASH_FOREACH_SAFE): Added missing
	parenthesis around hash, in case it's a complicated expression with
	unsurprising precedence results.

2007-02-11  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c (nih_config_skip_whitespace): It turns out that when
	parsing, it's often useful to skip any whitespace while retaining the
	"step over newlines" behaviour.  Seperate it out into its own 
	function.
	(nih_config_next_token): Call the new function.
	* nih/config.h: Add prototype.
	* nih/tests/test_config.c (test_skip_whitespace): Check the function

	* nih/config.c: Remove macro definitions
	* nih/config.h: and make them public instead
	* nih/tests/test_config.c: Use macros.

	* nih/config.c (nih_config_next_token): Strange hybrid function,
	it behaves like next_arg() but accepts the same arguments as token();
	it skips whitespace, but only if the initial whitespace character is
	in the delim argument.
	(nih_config_next_arg): This becomes a wrapper around next_token.
	* nih/config.h: Add prototype.
	* nih/tests/test_config.c (test_next_token): Check the new function.

	* nih/config.c (nih_config_next_token): Rename to nih_config_token,
	since this doesn't behave like the next_arg() function, and we want
	a similar token function that behaves like that.
	* nih/config.h: Update.
	* nih/tests/test_config.c (test_next_token): Rename and update.

2007-02-09  Scott James Remnant  <scott@netsplit.com>

	* nih/hash.h (NIH_HASH_FOREACH_SAFE): Oops, s/list/hash/

	* nih/hash.h (NIH_HASH_FOREACH, NIH_HASH_FOREACH_SAFE): Add macros
	to iterate over an entire hash table.
	* nih/tests/test_hash.c (test_foreach, test_foreach_safe): Test the
	macros.

	* nih/hash.c (nih_hash_string_key): Add a useful function to return
	the first member after the list header.
	* nih/hash.h: Add prototype.
	* nih/tests/test_hash.c (test_string_key): Add test case.

	* nih/file.c (nih_file_is_packaging): Check for common packaging
	filenames -- I swore I wrote this, but I can't find it.
	(nih_file_ignore): Ignore packaging files.
	* nih/file.h: Update.
	* nih/tests/test_file.c (test_is_packaging, test_ignore): Test.

2007-02-07  Scott James Remnant  <scott@netsplit.com>

	* nih/logging.c (nih_logger_printf): Change printf logger to not
	prefix anything intended for stdout.
	* nih/logging.h: Rearrange.
	* nih/tests/test_logging.c (test_logger_printf): Make sure that
	we don't prefix the program name for messages that go to stdout.

2007-02-06  Scott James Remnant  <scott@netsplit.com>

	* nih/signal.c (nih_signal_from_name): Table changed to not contain
	SIG, so this now strips it off the front if present.
	* nih/tests/test_signal.c (test_to_name): Strip SIG from the front
	(test_from_name): Check that we can omit SIG from the front.

	* nih/signal.c (nih_signal_to_name, nih_signal_from_name): Functions
	annoyingly missing from the standard library; convert signal names
	and numbers between each other (e.g. SIGTERM -> 15).
	* nih/signal.h: Add prototypes.
	* nih/tests/test_signal.c (test_to_name, test_from_name): Put the
	new functions through their paces.

	* nih/string.c (nih_str_array_add, nih_str_array_addn): Correct leak
	when array allocation fails.

	* nih/string.c (nih_str_array_add, nih_str_array_addn) 
	(nih_str_array_addp): Allow the array pointed to to be NULL, after all,
	realloc works anyway.  Also allow len to be NULL, in which case, we
	count the elements automatically.
	* nih/tests/test_string.c (test_array_addp): Update test cases.

	* nih/config.c (nih_config_parse_args): Use nih_str_array functions.
	* nih/file.c (nih_dir_walk_scan): Use nih_str_array functions.
	* nih/option.c (nih_option_parser): Use nih_str_array functions.
	(nih_option_add_arg): Drop this function now.

	* nih/string.c (nih_str_array_addp): Yet another variation on a theme;
	this one saves duplicating allocs, which is always messy.
	(nih_str_array_addn): Wrap around the above function.
	(nih_str_array_add): Make this a wrapper around addp instead.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_array_addp): Check that one works.

	* nih/string.c (nih_str_split): Use nih_str_array functions.

	* nih/string.c (nih_str_array_addn): Add a version of nih_str_array_add
	that calls nih_strndup instead of nih_strdup.
	(nih_str_array_add): turn into a thin wrapper around the above.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_array_addn): Test new function.
	
	* nih/string.c (nih_str_array_add): Flip array and parent arguments
	to make it more like realloc.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_array_add): Update.

	* nih/string.c (nih_str_array_new, nih_str_array_add): Functions
	to handle the common cases of arrays of strings.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_array_new, test_array_add): Test.

	* nih/watch.c (nih_watch_handle): Never assert on data received from
	an untrusted source (well, the kernel, anyway).  Also make sure nobody
	sneaks a '/' into the name of an inotify event.

2007-02-05  Scott James Remnant  <scott@netsplit.com>

	* nih/string.c (nih_vsprintf): Make sure vsnprintf never returns
	a negative value; C99 says it can't, of course, but Kees was
	paranoid.

2007-02-03  Scott James Remnant  <scott@netsplit.com>

	* nih/watch.c (nih_watch_new): Tidy up ENOMEM loop.

	* nih/tests/test_file.c (test_dir_walk): Fix leak of directory caused
	by not removing a symlink.
	* nih/tests/test_watch.c (test_new, test_add): Fix leaks of
	directories caused by not changing permissions back so we can unlink
	under them.

	* nih/watch.h (NihCreateHandler, NihModifyHandler): Add stat argument.
	* nih/watch.c (nih_watch_handle): stat any object created or modified,
	and pass the stat buf to the handler function.
	(nih_watch_add_visitor): Pass stat argument here too.

	* nih/tests/test_watch.c: Add arguments.

	* nih/option.c (nih_option_int): Function to parse integer values
	on the command line.
	* nih/option.h: Add prototype.
	* nih/tests/test_option.c (test_int): test case for it.

	* nih/file.c (nih_file_is_hidden, nih_file_is_backup) 
	(nih_file_is_swap, nih_file_is_rcs): Functions to match common
	file types by their path.
	(nih_file_ignore): Function to combine calls to all of the above.
	* nih/file.h: Add prototypes.
	* nih/tests/test_file.c: Add test cases for the new functions.
	* TODO: Update.

2007-02-02  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update.

	* nih/watch.c (nih_watch_new): Add a create argument to avoid
	walking a directory tree twice; store in the structure.
	(nih_watch_add_visitor): Call the create handler if necessary.
	* nih/watch.h: Update structure to include member and prototype.
	* nih/tests/test_watch.c (test_new): Check that, when called with
	create, the handler is called for each file that exists.
	(test_reader): Check that a directory is recursed when moved in
	or created with existing files.

	* nih/tests/test_watch.c (test_reader): Add test case for watching
	sub-directories again.

	* nih/watch.c (nih_watch_new, nih_watch_add): Make safe against
	ENOMEM; otherwise it's just tricky to decide when it's good and bad
	to throw things out.
	* nih/tests/test_watch.c: Update test cases accordingly.

	* nih/watch.c (nih_watch_add): It's not an error for subdirs to be
	TRUE when we get passed a filename.
	* nih/tests/test_watch.c (test_add): Check that it works.

	* nih/file.c (nih_dir_walk): Initialise ret to zero, otherwise
	can return an uninitialised value when walking an empty directory.

	* nih/tests/test_child.c (test_poll): Reap the child we kill,
	otherwise the next test might fail sometimes.

	* nih/watch.c (nih_watch_add): Make being unable to recurse into
	sub-directories to watch them an error.
	* nih/tests/test_watch.c (test_new, test_add): Update test cases.

	* nih/file.c (nih_dir_walk): Rework this function to support
	detection of directory loops, and reporting of errors with a callback
	handler rather than just aborting the walk.
	(nih_dir_walk_scan): Build up a sorted list of paths under a directory,
	filtered with the filter function.  Split out because it has different
	error handling semantics.
	(nih_dir_walk_visit): Visit a single path and if it's a directory,
	descend into it.
	* nih/file.h (NihFileVisitor): Add arguments to pass the top-level
	directory and the stat buffer of the path (to avoid stating the same
	things multiple times).
	(NihFileErrorHandler): Duplicate prototype for the error handler.
	* nih/errors.h (NIH_DIR_LOOP_DETECTED): Add new error.
	* nih/tests/test_file.c (test_dir_walk): Update test cases, improving
	test coverage at the same time.
	* nih/watch.c (nih_watch_add_visitor): Update to check the stat
	passed to the visitor, as well as accept the directory name,

2007-02-01  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_io.c: Replace NIH_ZERO in test cases with assert0

	* nih/tests/test_main.c (test_main_loop): Eliminate use of NIH_MUST
	* nih/tests/test_io.c (test_watcher): Remove unnecessary NIH_MUST

	* nih/test.h (assert0): Add an assert wrapper for the common
	alternate case.

2007-01-30  Scott James Remnant  <scott@netsplit.com>

	* nih/io.c (nih_io_buffer_resize): Always keep a buffer filled with
	zeros when we extend it, so we never pass uninitialised data to
	syscalls.

	* m4/misc.m4 (NIH_INIT): Detect valgrind/valgrind.h
	* nih/tests/test_signal.c: Detect valgrind and don't check the error
	values from trying to set SIG_DFL or SIG_IGN for SIGKILL; which for
	no readily apparent reason, works under valgrind.

	* HACKING: Add newline to end of file.

	* nih/test.h (TEST_ALLOC_SAFE): Add macro to guard allocations so
	they aren't counted.
	* nih/tests/test_file.c (my_visitor, test_dir_walk): Use
	TEST_ALLOC_SAFE instead of changing the allocator by hand.
	* nih/tests/test_io.c (test_watcher): Use TEST_ALLOC_SAFE instead of
	changing the allocator by hand,

	* nih/macros.h (NIH_MUST_NOT): Rename to NIH_ZERO
	* nih/io.c (nih_io_message_recv): Use NIH_ZERO, instead of == 0
	* nih/main.c (nih_main_loop_init): Use NIH_ZERO, instead of == 0
	* nih/tests/test_io.c: Use NIH_ZERO not NIH_MUST...== 0

	* nih/tests/test_io.c (test_watcher): Ensure that we don't ignore
	the return value from nih_io_printf; but also don't fail it.

	* HACKING: Clarify that returning to indicate insufficient memory
	warrants warn_unused_result.

	* nih/io.h: Add warn_unused_result attribute to nih_io_printf.
	* nih/string.c: Correct doc strings.

	* nih/string.c (nih_vsprintf): We need to copy the arguments before
	iterating either time, otherwise we could return NULL after moving
	the current argument off the end.

	* TODO: Update.

2007-01-22  Scott James Remnant  <scott@netsplit.com>

	* nih/io.c (nih_io_reopen): Raises an error (usually ENOMEM), since
	it can also raise EBADF.
	* nih/tests/test_io.c (test_reopen): Make sure ENOMEM is raised.
	* nih/watch.c: New watch API, this is a little higher level than
	what previously existing in nih/file.c; but is substantially easier
	to use and should cover all of the corner cases.
	(INOTIFY_EVENTS): inotify events we always watch for.
	(nih_watch_new): The master function; this creates a new inotify
	instance and adds a watch for a path in it.
	(nih_watch_handle_by_wd): Obtain a watch handle by descriptor
	(nih_watch_handle_by_path): Obtain a watch handle by path
	(nih_watch_add): Another useful function, adds a second path to
	an existing watch; normally used just for sub-directories, but
	possible for anything.
	(nih_watch_add_visitor): nih_dir_walk() callback that calls the above
	(nih_watch_free): Free a watch, and the associated NihIo; closing the
	inotify descriptor.
	(nih_watch_reader): Reader function; handles the incoming stream of
	inotify events by locating the watch handle and dispatching through
	(nih_watch_handle): this function which handles all the various
	event ordering corner-cases and dispatches to the watch functions
	proper.
	* nih/watch.h: Typedefs, structures and prototypes for the new watch
	API.
	* nih/tests/test_watch.c: Test suite for the watch code; covers most
	of the paths -- though malloc checking here is tricky and could do
	with improving later.
	* nih/libnih.h: Include nih/watch.h
	* nih/Makefile.am (libnih_la_SOURCES): Build and link watch.c
	(nihinclude_HEADERS): Install watch.h
	(TESTS): Build and run watch test suite
	(test_watch_SOURCES, test_watch_LDFLAGS, test_watch_LDADD): Details
	for watch test suite binary.

	* nih/file.c: Strip out anything related to inotify, leaving us
	with just three functions; nih_file_map(), nih_file_unmap() and
	nih_dir_walk().  Others that will turn up here will be matching
	and filtering functions.
	* nih/file.h: Strip out typedefs, structures and prototypes for
	anything watch-related; add attributes to functions as necessary.
	* nih/tests/test_file.c: Remove watch-related test cases, and
	use TEST_ALLOC_FAIL for test_dir_walk().

	* nih/tests/test_io.c (test_shutdown): Test NIH_IO_MESSAGE using
	AF_UNIX socketpairs, not pipes.

	* HACKING: Document the requirements for function attributes and
	using TEST_ALLOC_FAIL in test cases.
	* TODO: Update.

	* nih/tests/test_signal.c (test_set_handler): Check that SIGCHLD
	gets the SA_NOCLDSTOP flag, and that SIGKILL returns an error.
	(test_set_default, test_set_ignore): Check SIGKILL returns error.

	* nih/tests/test_option.c (test_parser): Check that duplicated
	options result in the previous string being freed.

	* nih/main.c (nih_main_daemonise): SIGHUP can always be ignored.

	* nih/tests/test_io.c (test_reopen): Make sure that we can't reopen
	a closed file descriptor.
	(test_set_nonblock, test_set_cloexec): Check with closed descriptors.

	* nih/config.c: When we call nih_config_skip_comment, we can usually
	assert that this will never fail; so do so.

	* nih/tests/test_command.c (test_help): Check a few missing pieces
	of the command help output to make sure it's right.

	* nih/file.c (nih_dir_walk): Correct doc string to indicate that
	this function raises errors.

	* nih/alloc.h: Fix prototype orders.
	* nih/child.h: Add attributes to important return values.
	* nih/config.c: Add attributes to important return values.
	* nih/config.h: Add attributes to important return values.
	* nih/error.h: Add attributes to important return values.
	* nih/io.h: Add attributes to important return values.
	* nih/main.h: Add attributes to important return values.
	* nih/signal.h: Add attributes to important return values.
	* nih/string.h: Add attributes to important return values.
	* nih/timer.h: Add attributes to important return values.
	* nih/io.c (nih_io_reopen): Don't ignore failure to ignore SIGPIPE.
	(nih_io_set_cloexec, nih_io_set_nonblock): The only useful errors
	returned is EBADF, so just return -1 for that.
	* nih/main.c (nih_main_daemonise): Don't ignore failure to ignore
	SIGHUP.
	* nih/signal.c (nih_signal_set_handler, nih_signal_set_default) 
	(nih_signal_set_ignore): The only useful error sigaction returns
	is EINVAL, so just return -1.
	(nih_signal_reset): Ignore EINVAL errors.
	* nih/tests/test_io.c: Use NIH_MUST around function calls that
	can fail.
	* nih/tests/test_main.c: Use NIH_MUST around function calls that
	can fail.

2007-01-21  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_ALLOC_FAIL): Macro that loops over a block of code
	as many times as malloc is called within it, causing each malloc in
	turn to be failed so we can increase code coverage.
	(nih_test_allocator): Support function for the above; allows dumping
	of malloc calls.
	* nih/tests/test_child.c (test_add_watch): Use TEST_ALLOC_FAIL
	and call nih_child_poll() first to not debug the init function
	(test_poll): Remove race conditions by making sure the signal
	has reached the child using waitid().  Test the "child we don't
	know about has died" branch, along with waitid returning 0 with no
	pid (needs a child process).
	* nih/tests/test_command.c (test_parser, test_help): Use
	TEST_ALLOC_FAIL
	* nih/tests/test_config.c (test_next_arg, test_parse_args) 
	(test_parse_command, test_parse_block): Use TEST_ALLOC_FAIL
	* nih/tests/test_error.c (test_raise, test_raise_printf) 
	(test_push_context, test_return_error): Use TEST_ALLOC_FAIL, to
	make sure allocations are retried.
	(test_pop_context): Split out from test_push_context.
	* nih/tests/test_hash.c (test_new): Use TEST_ALLOC_FAIL
	* nih/tests/test_io.c (test_add_watch, test_buffer_new) 
	(test_buffer_resize, test_buffer_pop, test_buffer_shrink) 
	(test_buffer_push, test_message_new, test_message_add_control) 
	(test_message_recv, test_message_send, test_reopen, test_watcher) 
	(test_read, test_write, test_get, test_printf): Use TEST_ALLOC_FAIL
	liberally, make sure every code path involving a malloc gets tested.
	* nih/tests/test_list.c (test_new): Use TEST_ALLOC_FAIL
	* nih/tests/test_logging.c (test_log_message): Use TEST_ALLOC_FAIL
	* nih/tests/test_main.c (test_main_loop_add_func): Use TEST_ALLOC_FAIL
	(test_package_string): Use TEST_ALLOC_FAIL and also check repeated
	calls return the same string.
	(test_version): Use TEST_ALLOC_FAIL to check that allocation can
	never fail.
	* nih/tests/test_option.c (test_parser, test_version, test_help):
	Use TEST_ALLOC_FAIL to make sure we behave
	* nih/tests/test_signal.c (test_add_handler): Use TEST_ALLOC_FAIL
	and call nih_signal_poll() first to not debug the init function
	* nih/tests/test_string.c (test_sprintf, test_vsprintf) 
	(test_strdup, test_strndup, test_str_split, test_str_wrap) 
	(test_str_screen_wrap): Use TEST_ALLOC_FAIL
	(test_str_screen_width): Check that we discard an illegal columns
	variable.
	* nih/tests/test_timer.c (test_add_timeout, test_add_periodic) 
	(test_add_scheduled): Use TEST_ALLOC_FAIL and call nih_timer_poll()
	first to make sure we don't debug the init function
	* nih/config.c (nih_config_next_arg, nih_config_parse_args) 
	(nih_config_parse_command, nih_config_parse_block): Allow us to fail
	reading a configuration file because we run out of memory; it's not
	that important.
	* nih/io.c (nih_io_get): Catch failure to remove the string, and
	don't remove the delimiter if that happens.
	(nih_io_printf): Fix doc, this returns zero, not a length.
	* nih/io.h: Fix prototype of nih_io_printf
	* nih/logging.c (nih_log_message): Potentially failing message output
	is crazy; loop until the alloc succeeds.
	* nih/option.c (nih_option_handle): Free the options and arguments
	before exiting; not really necessary, but makes valgrind happier.
	* nih/string.c (nih_strndup): Failed to correctly detect a failed
	allocation.
	(nih_str_split): Correct some mistakes with allocations not
	being checked.
	* nih/libnih.supp: Add tmpfile.
	* TODO: Update.

2007-01-11  Scott James Remnant  <scott@netsplit.com>

	* nih/file.h (NihDirWatch): New structure that defines a high-level
	watch on a directory with various handlers to be called.
	(NihCreateHandler, NihChangeHandler, NihDeleteHandler): Typedefs.
	* nih/file.c (nih_dir_add_watch): Function to create an NihDirWatch
	structure and fill it in.
	(nih_dir_add_file_watch): Add a watch on a single directory,
	catching errors and logging a warning if we can't watch it.
	(nih_dir_watcher): Deal with inotify events within a directory tree,
	taking care of issues such as re-organising of the directory structure
	without ending up with duplicate watches.
	(nih_file_reader): Only call the first matching watcher; we hit a
	limitation in the inotify API caused by our usage of a single
	descriptor.  Will fix that shortly.
	* nih/tests/test_file.c (test_dir_add_watch): Test that we can add
	watches and have everything filled in nicely.

2007-01-10  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_dir_walk): Function to walk a directory tree
	calling a function for each object found.
	* nih/file.h (NihFileFilter, NihFileVisitor): typedefs for
	function pointers used for nih_dir_walk.
	* nih/tests/test_file.c (test_walk): Test the walker.

	* nih/file.c (nih_file_reader): Pass the cookie to the watcher.
	* nih/file.h (NihFileWatcher): Add cookie argument.
	* nih/tests/test_file.c (test_add_watch): Check the cookie is
	passed for a rename.

	* nih/file.c (nih_file_add_watch): Fix this to not add the inotify
	watch unless it can allocate memory to handle it.

2007-01-09  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c (nih_config_get_stanza): Catch entries with a zero
	length name, and return one instead of NULL if it exists.
	* nih/tests/test_config.c (test_parse_stanza): Make sure that ""
	in a stanza table acts as a catch-all.

	* nih/test.h (TEST_FILENAME): Use dashes not colons, to make things
	more clear.

2007-01-08  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c (nih_config_has_token): add a very small test function
	so parsers can peek to see whether there is a next argument or not.
	(nih_config_skip_comment, nih_config_parse_args) 
	(nih_config_parse_file): Use the new test function to make it more
	obvious what we're doing.
	* nih/config.h: Add prototype.
	* nih/tests/test_config.c (test_has_token): Add test cases.

	* nih/config.c: Allow all functions to be called with a zero length
	file, we're completely guarded against pos going past the length,
	so this cannot be a bad thing.  Plus this allows zero-length tokens
	to be extracted trivially.
	(nih_config_next_arg): Raise an error if called in a position where
	there is no argument.  If you want to speculatively check for args,
	peek first.
	(nih_config_parse_stanza): No need to check for an empty stanza now,
	nih_config_next_arg() handles that for us.
	(nih_config_skip_comment): Function to allow us to skip only a
	comment, while raising an error if we hit anything else.
	(nih_config_parse_args, nih_config_parse_command): Skip comment only,
	to guard against parser errors.
	* nih/config.h: Update.
	* nih/tests/test_config.c (test_next_arg): Check the new error is
	raised, instead of the empty string being returned.
	(test_parse_stanza): Check the expected token error is raised.
	(test_skip_comment): Test the new function.
	* nih/errors.h: Add new errors.

	* nih/errors.h: Fix capitalisation of error messages.

	* nih/tests/test_config.c (test_parse_command): Add missing free
	calls to strings obtained.

2007-01-07  Scott James Remnant  <scott@netsplit.com>

	* nih/config.c: Convert this file to use size_t where appropriate
	instead of ssize_t, and raise exceptions for parsing errors rather
	than logging them.
	(nih_config_parse): Check a size is not greater then SSIZE_MAX (2GB)
	to avoid overflows.
	* nih/config.h: Update prototypes and handler function typedef.
	* nih/errors.h: Add new error codes and strings.
	* nih/tests/test_config.c: Adjust test cases.

	* nih/config.c (nih_config_parse_file): Function to parse a mapped
	file or string line-by-line starting from the given position.
	(nih_config_parse): Function to map a file into memory and parse it
	* nih/config.h: Add prototypes.
	* nih/tests/test_config.c (test_parse_file): Test the function with
	a small variety of different valid files.
	(test_parse): Check we can parse a file, and get an error if it
	doesn't exist.

	* nih/config.c (nih_config_parse_stanza): Take a data pointer and
	pass it to the handler, otherwise we can't fill in structures.
	* nih/config.h: Update.
	* nih/tests/test_config.c (test_parse_stanza): Check the data
	pointer is passed properly.

	* nih/tests/test_option.c (test_version, test_help): Capture the
	return value from nih_option_parser, as we've set gcc attributes to
	not let us do otherwise.

	* nih/config.h: Add structures, typedefs and macros to allow lists
	of configuration stanzas to be built up.
	* nih/config.c (nih_config_parse_args): Split argument parsing into
	(nih_config_next_arg): This new function that wraps next_token and
	also skips following whitespace.
	(nih_config_next_line): Another new function that skips to the end
	of the line, replacing severael copies of this code.
	(nih_config_get_stanza): Simple function to find a stanza in a table
	by its name.
	(nih_config_parse_stanza): Simple stanza dispatch function; parses an
	argument at the current position, looks it up in the table, then
	calls the function.
	* nih/tests/test_config.c (test_next_arg): Check this function works,
	we know it does because it was covered by other tests, but it's worth
	having its own as well.
	(test_next_line): Check this function works too.
	(test_parse_stanza): Make sure the dispatcher works properly.
	* nih/config.c: Write from the code that was used for upstart,
	making them exported functions to act as a configuration file kit.
	(nih_config_parse_args): Fix a bug where lineno wasn't incremented
	for an embedded newline in between arguments.  Fix another bug where
	a line containing only whitespace or whitespace and a comment would
	hit an assertion - not a problem in practice, but it's a bug.
	* nih/config.h: Function prototypes.
	* nih/libnih.h: Include config.h
	* nih/tests/test_config.c: Write an all new test suite that tests
	the individual parsing functions for their functionality, rather
	than trying to squeeze it into something larger.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link config.c
	(nihinclude_HEADERS): Install config.h
	(TESTS): Build and run config test suite
	(test_config_SOURCES, test_config_LDFLAGS, test_config_LDADD): Config
	test suite binary details.

2007-01-06  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_io.c (test_watcher): Missing a priority that needed
	changing to message.

	* nih/command.h: Warn against unused results.

	* nih/option.h: Warn against unused results.
	
	* nih/logging.h (NihLogLevel): Add a message level between info
	and warn, as we can't just re-use warn as that goes to stderr!
	(nih_message): Change to use the new message level.
	* nih/logging.c (nih_logger_syslog): Output messages at the notice
	level, rather than the warning level.
	(nih_log_init): Change the default priority to message.
	* nih/tests/test_logging.c (test_log_message): Check that messages
	are logged with the new message priority; reset to the new default.
	(test_logger_printf): Make sure that ordinary messages go to stdout
	and warning messages go to stderr.
	(test_set_logger, test_set_priority): Reset to the new default.
	* nih/tests/test_option.c (test_quiet, test_verbose, test_debug):
	Check that messages are also logged, as well as warning; and set
	the new default priority.
	* nih/tests/test_error.c (test_raise_again, test_push_context):
	Set log priority to the new default.
	* nih/tests/test_io.c (test_watcher): Reset priority to the new
	default.

2007-01-05  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_io.c (test_shutdown): Uncomment the test for
	shutdown when all messages are processed by the watcher.

	* nih/io.c (nih_io_message_recv): Remove note about the remote end
	being closed; when in message mode, this doesn't usually happen.
	(nih_io_watcher): Only check for a zero length return if we're in
	stream mode, otherwise it just means we got a zero length message.
	(nih_io_watcher_read): Accept zero length messages and return them.
	* nih/tests/test_io.c (test_watcher): Remove tests that tried to
	mix a message-mode io and a dgram socket, that way lies disaster.

	* nih/io.c (nih_io_watcher_read, nih_io_watcher_write): Initialise
	len to zero, as valgrind can be fussy about this when we call things
	directly.

	* nih/io.h (NihIoMessage): Add a user data field to the message
	structure so we can carry the pid around when queuing notification
	messages in upstart.

2007-01-02  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.h, nih/child.h, nih/command.h, nih/file.h, nih/hash.h:
	nih/io.h, nih/logging.h, nih/main.h, nih/option.h, nih/signal.h:
	nih/timer.h: Give names for all arguments in function pointer typedefs
	so the documentation strings make more sense.

	* nih/test.h (TEST_EQ_MEM, TEST_NE_MEM): Cast argument for number
	of bytes to size_t.

	* configure.ac (AC_COPYRIGHT): Update copyright to 2007.

2006-12-29  Scott James Remnant  <scott@netsplit.com>

	* nih/errors.h: Drop the NIH_IO_MESSAGE_TRUNCATED error.

	* nih/io.h (NihIoMessage): Rename msg_buf member to data, and change
	ctrl_buf member to be an array of cmsg structures called control.
	* nih/io.c: Update references to NihIoMessage members.
	(nih_io_message_push_control): Rename to nih_io_message_add_control
	(nih_io_message_add_control): Rewrite to add the control message
	header onto the end of an array, rather than a control buffer,
	(nih_io_message_recv): After receiving the message, extract all
	control messages and put them into the array.
	(nih_io_message_send): Take control messages from the array into a
	single buffer and send them.

	* nih/tests/test_io.c: Update references to NihIoMessage members.
	(test_message_new): Check that the control member is initialised to
	a one-element array containing NULL.
	(test_message_push_control): Rename to test_message_add_control.
	(test_message_add_control): Check the array is extended.

	* nih/io.c (nih_io_message_recv): Loop over a call to recvmsg() with
	MSG_PEEK in its arguments to avoid ever returning truncated messages.
	* nih/tests/test_io.c (test_message_recv): Adjust test for truncated
	messages to make sure they do in fact work.
	(test_watcher): Remove the oversized message error check.

2006-12-21  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_option.c (test_verbose): Add missing call to free
	args.

	* nih/io.c (nih_io_message_send): Change to return the ssize_t
	received from sendmsg(), rather than an int.
	(nih_io_watcher_read): Move read functionality out of
	nih_io_watcher into a separate function that can deal with both
	stream and message mode.
	(nih_io_watcher_write): Move write functionality out of nih_io_watcher
	into a separate function that can deal with both stream and message
	mode.
	(nih_io_watcher): Call the separate functions, and handle calling
	the reader when in message mode.  In addition, we now check the
	error code when writing to a socket as well; there are useful errors
	there (like ECONNREFUSED).
	* nih/io.h: Update prototype of nih_io_message_send.
	* nih/tests/test_io.c (test_message_send): Update return checks.
	(test_watcher): Test that the error handled can now be called when
	writing data to a socket, as well as just when reading.  Test
	message mode behaviour.

	* nih/io.c (nih_io_send_message): Watch socket for writability.
	(nih_io_write): Extend this function to work in message mode;
	it allocates a new message, stores the data in that buffer, and
	adds it to the send queue.
	(nih_io_printf): Remove restriction that this only be called in
	stream mode; the fact this calls nih_io_write is sufficient to
	ensure correct behaviour.
	* nih/tests/test_io.c (test_send_message): Check that we're testing
	for writability.
	(test_write): Test that this works in message mode.
	(test_printf): Check that this works too, even though this only
	really calls nih_io_write.

	* nih/io.c (nih_io_get): Extend so that this can operate in message
	mode on the oldest message in the queue.
	* nih/tests/test_io.c (test_get): Check that this works properly
	in message mode; complete with shutdown check.

	* nih/io.c (nih_io_message_new): Do not assign a default list
	destructor, it's not in a hidden list and there are bad consequences
	of freeing a child with a default destructor if the list its in gets
	freed first; new rule - default destructors only if the list is hidden
	and never freed!
	(nih_io_closed, nih_io_shutdown): Don't call the close handler if
	the structure is already marked to be closed; there seems little
	point, and we could accidentally call it multiple times.
	(nih_io_read_message, nih_io_read, nih_io_get): Check whether we
	need to shutdown the socket here, in case the watcher isn't polled
	again.
	* nih/tests/test_io.c (test_shutdown): Check that shutdown works
 	with message-mode structures (part of this disabled for now).
	(test_read_message, test_read, test_get): Check that a shutdown
	socket is closed when these are called.

2006-12-20  Scott James Remnant  <scott@netsplit.com>

	* nih/io.c (nih_io_read): Extend so that it can be called in
	message mode, it reads from the first message until it has been
	exhausted; at which point it frees the message and the next call
	would read from the next.
	* nih/tests/test_io.c (test_read): Check that the new functionality
	works properly.

	* nih/io.c (nih_io_first_message): Simple static function to obtain
	the oldest message in the receive queue.
	(nih_io_read_message, nih_io_send_message): Functions to take the
	oldest message out of the receive queue and append a message to the
	send queue.
	* nih/io.h: Add prototypes.
	* nih/tests/test_io.c (test_read_message, test_send_message): Check
	the new functions do what they say on the tin.

	General clean-up of nih_io, fixing a few API issues and making it
	more suitable for using in message mode.

	* nih/io.c (nih_io_buffer_pop, nih_io_buffer_shrink): Remove the
	silly restrictions that these cannot be called with a length greater
	than the buffer size, instead just truncate it to the buffer size.
	(nih_io_buffer_pop): Length is now updated to the actual number of
	bytes being returned.
	(nih_io_message_add_control): Rename to nih_io_message_push_control.
	(nih_io_message_recv): Change the len parameter to a pointer that's
	updated with the actual number of bytes read.
	(nih_io_stream_watcher): Rename back to nih_io_watcher.
	(nih_io_reopen): Use a single watcher function again, initialise close
	to NULL.  Treat failure to set a descriptor non-blocking as a failure
	to open; otherwise we'll end up screwing up the main loop.
	(nih_io_watcher): Remove the restriction that this is only called
	when in the stream mode.  Leave data in the receive buffer if there's
	no reader function, it's now valid to query the buffer size and read
	by other means.  Catch the ENOMEM error and ignore it.  Set and keep
	an eye on the structure close member, if it is TRUE before we return,
	close the socket.  This also means we check for shutdown sockets in
	the case of error, which we probably should have done.
	(nih_io_maybe_shutdown): Rename to nih_io_shutdown_check.
	(nih_io_close): If the close member of the structure is not NULL
	we're inside a watcher function, so need to set the variable this
	points to to TRUE instead of closing or freeing the structure.
	(nih_io_read): Change the len parameter to be updated with the
	actual number of bytes being returned.
	* nih/io.h: Renamed function prototype.  Updated documentation for
	function typedefs to clarify that they may all call nih_io_close,
	but may not call nih_free.
	* nih/errors.h: Rename NIH_TRUNCATED_MESSAGE to
	NIH_IO_MESSAGE_TRUNCATED, we should probably namespace these.
	* nih/tests/test_io.c (test_buffer_pop, test_buffer_shrink): Check
	that we can pop or shrink the entire buffer if we ask for more.
	(test_message_add_control): Rename to test_push_control.
	(test_message_recv): Check that the cases of remote end closed,
	error received or truncated message are handled properly.
	(test_message_send): Check that an error is handled.
	(test_stream_watcher): Rename back to test_watcher.
	(test_reopen): Check that the socket is not being shutdown or closed.
	(test_shutdown): Drain the buffer before calling handle on it, as
	it's not done automatically now.
	(test_close): Check that a lazy close is performed if io->close is
	not NULL.
	* nih/file.c (nih_file_reader): Update call to nih_io_read.

	* nih/logging.h (nih_assert_notreached): Rename to
	nih_assert_not_reached, this was annoying me.

2006-12-19  Scott James Remnant  <scott@netsplit.com>

	* nih/io.c (nih_io_read, nih_io_write, nih_io_get, nih_io_printf):
	Ensure the NihIo structure is in stream mode; as these only really
	make sense if there's a limitless buffer.

	* nih/tests/test_io.c (test_shutdown): Make sure the socket is
	shut down immediately.
	* nih/io.c (nih_io_shutdown): Bugfix, should close the socket
	immediately if there's nothing in the queue, otherwise it may
	hang around forever if it never polls.

	* nih/io.c (nih_io_reopen): Receive the type from the arguments,
	instead of hard-coding to be stream.  Set up the structure accordingly.
	* nih/io.h: Update prototype.
	* nih/tests/test_io.c (test_reopen): Check message mode is allocated
	properly.
	* nih/file.c (nih_file_init): Open in stream mode.

	* nih/io.c (nih_io_message_new): Catch failure to allocate message
	or control buffer.
	(nih_io_message_add_control): No need to try and allocate the control
	buffer here.
	(nih_io_message_recv): Only need to resize the buffers here as well.
	(nih_io_message_send): No need to deal with there being no message
	or control buffer here either.
	* nih/tests/test_io.c: Fix test assumptions based on above.
	* nih/libnih.supp: Add missing nih_io_init suppression.

	* nih/tests/test_io.c (test_message_add_control): Non need to check
	allocation of the buffer itself.

	* nih/io.c (nih_io_message_add_control): Function to add a control
	message to the control buffer, to save mucking around with difficult
	bits ourselves.
	* nih/io.h: Add prototype.
	* nih/tests/test_io.c (test_message_add_control): Check that it
	works properly.

	* nih/io.c (nih_io_buffer_shrink): Make an exported function, resize
	the buffer once done to save on memory.
	(nih_io_buffer_pop, nih_io_stream_watcher): No need to explicitly
	resize here now, as it gets called from shrink.
	* nih/io.h: Add prototype.
	* nih/tests/test_io.c (test_buffer_shrink): Test shrink.

	* nih/io.c (nih_io_message_recv, nih_io_message_send): Functions
	to send and receive a message over a socket, hiding the difficult
	bits of dealing with msghdr/iovec.
	(nih_io_get_family): Function to detect the family of a socket.
	* nih/io.h: Update.
	* nih/errors.h: Add truncated message error.
	* nih/tests/test_io.c (test_message_recv, test_message_send): Check
	that we can send and receive messages by using socket pairs.
	(test_get_family): Check that we can get the families of the standard
	three socket types.

2006-12-18  Scott James Remnant  <scott@netsplit.com>

	* nih/io.h (NihIoMessage): Structure that represents an individual
	message in a queue; has a buffer for the message, and for ancillary
	control data, as well as an address that the message is being sent
	to or received from.
	(NihIoType): Enum to select whether an NihIo structure is in stream
	mode or message mode.
	(NihIo): Add a type member to select whether this is in stream or
	message mode, and a union to select whether we're using buffers
	or message queues.
	* nih/io.c (nih_io_message_new): Allocate an NihIoMessage and its
	child buffers.
	(nih_io_reopen): Initialise the type to NIH_IO_STREAM.
	(nih_io_watcher): Rename to nih_io_stream_watcher.
	* nih/tests/test_io.c (test_message_new): Check that the new message
	structure is initialised properly.
	(test_reopen): Check that we get a stream structure by default.
	(test_watcher): Rename to test_stream_watcher.

2006-12-17  Scott James Remnant  <scott@netsplit.com>

	* nih/logging.h (nih_assert_notreached): Add an assertion for the
	use in default bits of switches, etc.

	* nih/test.h (TEST_EQ_U, TEST_NE_U): Versions of the original macros
	that cast to size_t for display, instead of ssize_t.

	* nih/tests/test_logging.c, nih/tests/test_string.c: Set local
	variables to avoid gcc thinking that they may be unused when
	using TEST_DIVERT_*.

2006-12-14  Scott James Remnant  <scott@netsplit.com>

	* HACKING: Correct some typos.

2006-12-13  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_FILENAME): Wrap with do { ... } while (0)
	in case this gets used as a single line statement.

2006-12-13  Johan Kiviniemi  <johan@kiviniemi.name>

	* nih/test.h (TEST_FILE_RESET): Wrap with do { ... } while (0)
	in case this gets used as a single line statement.

2006-12-13  Scott James Remnant  <scott@netsplit.com>

	* nihify: Link to the nih ChangeLog.

2006-12-12  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_CHILD_WAIT, TEST_CHILD_RELEASE): Sometimes the
	primitive "when the child is running" locking provided by TEST_CHILD
	isn't sufficient, and we actually need to perform some actions in
	the child before we let the parent carry on.  These two macros
	allow that.

	* nih/libnih.supp: Include a valgrind suppressions file.
	* nih/Makefile.am (EXTRA_DIST): Distribute the suppressions file.

	* nih/tests/test_alloc.c (test_realloc): Fix missing free.

	* configure.ac (AM_GNU_GETTEXT_VERSION): Quote version number.

2006-12-09  Scott James Remnant  <scott@netsplit.com>

	* nih/test.h (TEST_DIVERT_STDOUT_FD, TEST_DIVERT_STDERR_FD): Flush
	before dup2ing the original file descriptor back, otherwise we end
	up with the content still in the buffer later.

2006-12-08  Scott James Remnant  <scott@netsplit.com>

	* HACKING: Document that test cases are expected.

	* nih/tests/test_command.c: Port to the new test framework.

	* nih/tests/test_option.c: Drop unused include.

	* nih/tests/test_option.c: Port to the new test framework.

2006-12-07  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_io.c: Port to the new test framework.

	* nih/tests/test_hash.c: Drop use of assert.

	* nih/tests/test_timer.c (test_poll): Formatting fix.

	* nih/tests/test_string.c: Port to the new test framework.

	* nih/test.h (TEST_DIVERT_STDOUT_FD, TEST_DIVERT_STDERR_FD): Macros
	to divert to a file descriptor instead of a file.
	(TEST_DIVERT_STDOUT, TEST_DIVERT_STDERR): Redefine as wrappers around
	the new macros.

	* nih/tests/test_timer.c: Port to the new test framework.

	* nih/tests/test_signal.c: Port to the new test framework.

	* nih/tests/test_main.c: Port to the new test framework.

	* nih/test.h: Cast strlen return value to int when used to give
	the length of a string in printf.

	* nih/tests/test_logging.c: Port to the new test framework.

	* nih/test.h (TEST_DIVERT_STDOUT, TEST_DIVERT_STDERR): Crazy macros
	to divert stdout or stderr to a different file, making sure it's
	flushed before both dups.
	(TEST_EQ_STRN, TEST_NE_STRN): Functions to check a string up to a
	particular point.
	(TEST_FILE_EQ, TEST_FILE_EQ_N, TEST_FILE_NE, TEST_FILE_NE_N):
	Functions to grab a line from a file and check it against a string.
	(TEST_FILE_END): Function to determine end of file.
	(TEST_FILE_RESET): Another function so I don't need to remember the
	runes to flush, rewind and truncate a file.

2006-12-06  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_file.c: Port to the new test framework.

	* nih/test.h (TEST_EQ_MEM, TEST_NE_MEM): Tests that wrap memcmp.
	(TEST_FILENAME): Macro to generate a filename.

	* nih/tests/test_error.c: Port to the new test framework.

	* nih/tests/test_alloc.c, nih/tests/test_list.c, nih/tests/test_hash.c:
	Undo over-zealous removing of includes.

	* nih/tests/test_child.c: Port to the new test framework.

	* nih/test.h (TEST_CHILD): Macro to spawn an interlocked child
	process, so we don't keep having to remember how to.

	* nih/test.h (TEST_ALLOC_SIZE, TEST_ALLOC_PARENT): Include the
	expression that generated the pointer, as well as the pointer.
	(TEST_LIST_EMPTY, TEST_LIST_NOT_EMPTY): Check whether a list is
	empty or not.
	* nih/tests/test_list.c (test_empty, test_foreach_safe): Use the
	new list test macros instead of TEST_TRUE/TEST_FALSE.
	* nih/tests/test_hash.c (test_new): Likewise.

2006-12-05  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_hash.c: Port to the new test framework.

	* nih/tests/test_list.c: Port to the new test framework.

	* nih/tests/test_alloc.c: Port to the new test framework.
	(test_set_allocator): Test that the allocator is called with zero
	as the argument.

	* nih/test.h: Include config.h on behalf of the test suites.

	* nih/test.h (TEST_EQ_STR, TEST_NE_STR): String comparison tests.

	* nih/test.h (TEST_FAILED): abort is much better than exit

	* nih/test.h (INIT_TEST): Drop this, we'll just return directly.
	(TEST_FAILED): Return directly on failure.
	(CALL_TEST): Drop this again.

	* nih/test.h (CALL_TEST): Add "call a function" macro.

	* nih/test.h: Macros that implement a simple test framework based
	on the patterns I was using anyway.
	* nih/Makefile.am (nihinclude_HEADERS): Install nih/test.h

	* nih/tests/test_command.c (test_parser, test_help): flush stdout
	or stderr before calling dup2().

	* nih/tests/test_option.c (test_parser, test_version, test_help):
	flush stdout or stderr before calling dup2().

	* nih/tests/test_io.c: Formatting fix.

	* nih/file.c (nih_file_map): Tidy up; in particular don't allow
	opening in just write mode, seeing as that doesn't work.
	* nih/tests/test_file.c (test_unmap): Test unmap separately.
	(test_map): Update for new checks.

	* nih/file.c (nih_file_add_watch): No need to set ENOMEM if
	nih_new fails, that will be already set.
	(nih_file_reader): Clarify why nih_io_read must return a pointer.

	* nih/tests/test_string.c (test_str_screen_width) 
	(test_str_screen_wrap): flush stdout before calling dup2().

	* nih/tests/test_main.c (test_suggest_help, test_version): flush
	stdout or stderr before calling dup2().

	* nih/tests/test_logging.c (test_logger_printf): flush stdout or
	stderr before calling dup2(), otherwise we don't know which stream
	the buffered output will be going to.

	* nih/tests/test_error.c (test_push_context): Check that unhandled
	errors within a context are notified and freed if the context is
	popped.

	* nih/alloc.c (nih_alloc_reparent): Function to reparent a pointer
	to a new parent or just orphan it.
	* nih/alloc.h: Update.
	* nih/tests/test_alloc.c (test_reparent): Make sure it works.

	* nih/tests/test_alloc.c (test_alloc_using): Check that this works
	properly if the allocator returns NULL.
	(test_realloc): A few cases to check here; make sure that it works
	if the pointer to realloc is NULL, actually test the children
	reparenting code here and test the reallocator returning NULL.

	* README: Correct typo.

2006-11-12  Scott James Remnant  <scott@netsplit.com>

	* nih/Makefile.am (INCLUDES, DEFS): Drop these two variables
	(AM_CPPFLAGS): in favour of this combined variable.

	* configure.ac (AM_INIT_AUTOMAKE): Include nostdinc so we don't get
	Automake's broken default includes.
	* nih/Makefile.am (INCLUDES): Include $top_builddir and $top_srcdir,
	everything else wants relative paths from there.
	(DEFAULT_INCLUDES): Drop override now we don't need it.

	* m4/compiler.m4 (NIH_C_THREAD): Define a macro in the manner of
	AC_C_CONST that will #define __thread to empty if it isn't supported
	by the compiler.
	* m4/misc.m4 (NIH_INIT): libnih uses __thread.

2006-10-13  Scott James Remnant  <scott@netsplit.com>

	* nih/command.h: Adjust type of NihCommandAction to include const.
	* nih/tests/test_command.c (my_action): Update.

2006-10-12  Scott James Remnant  <scott@netsplit.com>

	* configure.ac: Expand AC_GNU_SOURCE so we get _GNU_SOURCE and so
	that gettext doesn't complain.
	(AM_GNU_GETTEXT_VERSION): Increase to 0.15
	(AC_PREREQ): Increase to 2.60
	* HACKING: Update autoconf and gettext requirements.

2006-10-11  Scott James Remnant  <scott@netsplit.com>

	* nih/string.c (nih_str_screen_wrap): Don't quite fill the screen,
	instead leave a character spare as it looks somehow neater that way.
	* nih/option.c (nih_option_group_help): Likewise.
	* nih/tests/test_string.c (test_str_screen_wrap): Update tests.
	* nih/tests/test_option.c (test_help): Fix wrapping test.

	* TODO: Update.

	* nih/command.c: Implement a command parser that uses the first
	non-option argument (or program name) and selects different help
	and options based on that.
	* nih/command.h: Structures and prototypes.
	* nih/libnih.h: Include command.h
	* nih/tests/test_command.c: Test suite for command parser.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link command.c
	(nihinclude_HEADERS): Install command.h
	(TESTS): Build and run command test cases
	(test_command_SOURCES, test_command_LDFLAGS, test_command_LDADD):
	Details for command test suite binary.

	* nih/tests/test_option.c: Keep a copy of last_option otherwise
	it's freed while we're not around.

	* nih/option.c (nih_option_set_footer): Add a footer string.
	(nih_option_help): Also add the footer string.
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_help): Check the footer.

	* nih/option.c (nih_option_set_usage_stem): Add function to set
	the "[OPTION]..." bit of the usage line.
	(nih_option_help): Use the usage stem if set.
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_help): Check the usage stem.

	* nih/option.c (nih_option_join): Add function to combine two lists
	of options.
	(nih_option_parser): Join the options and default_options lists,
	don't play with arrays of lists.
	(nih_option_get_short, nih_option_get_long): Simply by just iterating
	the one array.
	(nih_option_help, nih_option_group_help): Again simply by just
	iterating the one array.
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_parser): Don't check addresses of
	options as they've moved.

	* nih/option.c (nih_option_set_usage, nih_option_set_synopsis) 
	(nih_option_set_help): Allow NULL to be set to override existing
	strings.

	* nih/option.c (nih_option_help): Make static.
	* nih/option.h: Update.

2006-10-10  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update.

	* nih/option.c (nih_option_group_help): Use a factor of the screen
	width when formatting help options, but keep at least 20 chars
	visible at all times.

	* nih/string.c (nih_str_screen_width): Add function to return just
	the screen width.
	(nih_str_screen_wrap): Use that function.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_str_screen_width): Check function.

	* nih/option.c (nih_option_set_synopsis): Function to set a synopsis
	string that follows the usage.
	(nih_option_set_help): Function to set the help string that follows
	the options.
	(nih_option_help): Output synopsis and help strings.
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_help): Check behaviour

	* TODO: Update.

	* nih/main.c (nih_main_version): Use nih_str_screen_wrap to output
	the GPL preamble bit.
	* nih/tests/test_main.c (test_version): Unset COLUMNS just in case.

	* nih/string.c (nih_str_screen_wrap): Add wrapper around
	nih_str_wrap that obtains the screen width and uses that for len.
	* nih/string.h: Add prototype.
	* nih/tests/test_string.c (test_str_screen_wrap): Test new function.
	* nih/Makefile.am (test_string_LDADD): Link with -lutil so we can
	use openpty in our "fake terminal" tests.

	* nih/tests/test_option.c: Fix minor test case memory leak.

	* nih/tests/test_child.c (test_poll, test_poll): Use better
	interlocks then usleep.

	* nih/tests/test_option.c (main): Enable test of --debug, oops.

	* nih/main.c (nih_main_daemonise): Document why this is better than
	daemon(), and thus not nih.
	* nih/tests/test_main.c (test_daemonise): Test the daemonise
	function works properly.

	* nih/timer.h: Fix comments.

	* nih/hash.c (nih_hash_new): This needs a parent pointer too.
	* nih/hash.h: Update prototype.
	* nih/tests/test_hash.c: Update test cases.

	* nih/child.c: Clarify child_watches item types.
	* nih/file.c: Clarify file_watches item types.
	* nih/io.c: Clarify io_watches item types.
	* nih/main.c: Clarify loop_functions item types.
	* nih/timer.c: Clarify timers item types.

	* nih/signal.h (NihSignalCb): Rename to NihSignalHandler.
	(NihSignal): Change callback name to handler and type
	to NihSignalHandler.
	* nih/signal.c (nih_signal_add_callback): Rename to
	nih_signal_add_handler.
	* nih/tests/test_signal.c: Update.

	* nih/list.c (nih_list_new): Take a parent pointer like everything
	else, showing its age slightly.
	* nih/list.h: Update prototype.
	* nih/tests/test_list.c: Update test cases.
	* nih/child.c (nih_child_init): Pass NULL to nih_list_new().
	* nih/error.c (nih_error_init): Pass NULL to nih_list_new().
	* nih/file.c (nih_file_init): Pass NULL to nih_list_new().
	* nih/io.c (nih_io_init): Pass NULL to nih_list_new().
	* nih/main.c (nih_main_loop_init): Pass NULL to nih_list_new().
	* nih/signal.c (nih_signal_init): Pass NULL to nih_list_new().
	* nih/timer.c (nih_timer_init): Pass NULL to nih_list_new().
	* nih/tests/test_hash.c: Pass NULL to nih_list_new().

	* nih/alloc.c, nih/alloc.h, nih/child.c, nih/child.h, nih/error.c,
	nih/error.h, nih/file.c, nih/file.h, nih/hash.c, nih/hash.h,
	nih/io.c, nih/io.h, nih/list.c, nih/list.h, nih/main.c, nih/main.h,
	nih/option.c, nih/option.h, nih/signal.c, nih/signal.h, nih/string.c,
	nih/string.h, nih/timer.c, nih/timer.h: Clean up documentation and
	parent return values.

	* HACKING: Detail function documentation requirement and format.

	* nih/tests/test_signal.c (test_set_default, test_set_ignore) 
	(test_reset): amd64 seems to set the SA_NODEFER flag even when
	you pass zero, so just check we clear important bits.

2006-09-27  Scott James Remnant  <scott@netsplit.com>

	* m4/misc.m4 (NIH_INIT): Add easier macro for using libnih.
	* m4/compiler.m4: Remove hack to include misc.m4
	* configure.ac: Drop the macro set and replace with NIH_INIT
	* README: Update.
	* nihify: Warn if NIH_INIT not present.

2006-09-25  Scott James Remnant  <scott@netsplit.com>

	* TODO (main): Update.

	* nih/logging.h (nih_message): Add nih_message as an alias for
	nih_warn.
	* nih/tests/test_logging.c (test_log_message): Check new macro.

2006-09-20  Michael Biebl  <mbiebl@gmail.com>

	* nih/tests/test_file.c: Include nih/inotify.h when sys/inotify.h
	is not available.

2006-09-19  Michael Biebl  <mbiebl@gmail.com>

	* nih/Makefile.am (nihinclude_HEADERS): Install inotify.h just in
	case it's required

2006-09-18  Michael Biebl  <mbiebl@gmail.com>

	* configure.ac: Check for sys/inotify.h
	* nih/inotify.h: Taken from udev, this defines the syscalls
	and flags, etc. for inotify on glibc 2.3
	* nih/file.c, nih/file.h: Include nih/inotify.h if we do not have
	sys/inotify.h

2006-09-13  Scott James Remnant  <scott@netsplit.com>

	* nih/child.c (nih_child_poll): Zero the siginfo_t struct before
	every call to waitid(), the kernel doesn't do it for us when
	running the compat syscall (but does for the native one *sigh).

2006-09-08  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update.

	* nih/option.c (nih_option_help): Allow the usage string to be
	customised.
	(nih_option_set_usage): Using this function.
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_help): Test the usage string.

	* nih/main.c (nih_main_daemonise): Use program_name for the pid file.
	* nih/main.h: Update.

	* nih/main.c (nih_main_daemonise): Add a daemonise function,
	pretty standard really.
	* nih/main.h: Update.

2006-09-07  Scott James Remnant  <scott@netsplit.com>

	* AUTHORS: Mention the ChangeLog file.

2006-09-04  Scott James Remnant  <scott@netsplit.com>

	* README: Add some documentation for the curious.

	* nih/file.c (nih_file_add_watch): Set nih_file_remove_watch as
	the default destructor so that nih_free can be called or work in
	a tree.
	(nih_file_remove_watch): Modify to not call nih_free and work if
	called multiple times.

	* nih/signal.c (nih_signal_set_default, nih_signal_set_ignore):
	Set flags to zero when defaulting or ignoring signals.
	* nih/tests/test_signal.c (test_set_default, test_set_ignore)
	(test_reset): Modify test cases appropriately.

	* nih/hash.h: Add missing attribute for nih_hash_new
	* nih/list.h: Add missing attribute for nih_list_new

2006-09-01  Scott James Remnant  <scott@netsplit.com>

	* nih/option.c (nih_option_group_help): Cast linelen to not induce
	a warning.

2006-08-31  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_loop_interrupt): Always initialise the
	interrupt pipe.
	(nih_main_loop_init): Move interrupt pipe initialisation to here
	so that it's always available.
	(nih_main_loop): Drop the extra call to nih_signal_poll().

	* nih/option.c (nih_option_get_short, nih_option_get_long): Allow
	catch-all options.
	* nih/tests/test_option.c (test_parser): Test catch-all options.

	* TODO: Update.

	* nih/option.c (nih_option_handle_arg): Free any existing option
	value.

2006-08-30  Scott James Remnant  <scott@netsplit.com>

	* nih/option.c (nih_option_debug): Add a hidden --debug option that
	sets the logging level up really high.
	(nih_option_handle): Just compare the names rather than offset
	within a list that can change.
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_debug): Check that it works.

	* nih/option.c (nih_option_group_help): Output "Options" where we
	only have the one group.

	* nih/option.c (nih_option_group_help): Don't output options without
	help strings.
	* nih/tests/test_option.c (test_help): Update.

2006-08-25  Scott James Remnant  <scott@netsplit.com>

	* nih/io.c (nih_io_watcher): Clean up the handling of the out of
	memory condition while extending the buffer so that we just return
	to be called again rather than end up performing some random action.

2006-08-24  Scott James Remnant  <scott@netsplit.com>

	* nihify (src_dir): Also copy m4/Makefile.am

	* nih/file.c (nih_file_remove_watch): Raise the error before
	performing other actions so errno is not lost.

	* nih/io.c (nih_io_watcher): Fix a pretty critical bug, we weren't
	saving the value of errno so it was usually zero by the time we
	looked at it.

	* nih/logging.c (nih_logger_syslog): Useful alternative to
	nih_logger_printf.
	* nih/logging.h: Update.

2006-08-23  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_string.c: Add missing free calls.

	* nih/tests/test_io.c (test_watcher): Silence the error message.
	* nih/tests/test_option.c (test_parser): Add some forgotten calls
	to nih_free

	* nih/main.c (nih_main_init_full): Free the package string when
	overwriting it.

	* nih/tests/test_logging.c: Keep a copy of the last message
	otherwise we're reading free'd memory (again).

	* nih/tests/test_list.c: Memory cleanups.

	* nih/signal.c (nih_signal_set_default, nih_signal_set_ignore):
	Don't initialise the signals list, there's no need.

	* nih/tests/test_hash.c: Various missing calls to nih_free.

	* nih/file.c (nih_file_remove_watch): Fix another wrong call to
	nih_free.

	* nih/tests/test_child.c (test_poll): Free the watcher.

	* nih/file.c (nih_file_remove_watch): Remove from the containing
	list before freeing.
	* nih/tests/test_file.c (my_watcher): Make sure we copy the name
	as it will be freed by the time we get back to the test.

	* nih/list.c (nih_list_free): Don't throw away the destructor
	return value.

	* nih/tests/test_error.c: Further missing calls to nih_free

	* nih/tests/test_alloc.c: Correct a few missing nih_free's

	* nih/file.c (nih_file_map): Correct a thinko, have to mask
	flags by O_ACCMODE and compare for equality to extract the open
	access mode.

2006-08-22  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c (nih_file_map, nih_file_unmap): Add an easier to use
	wrapper around mmap() when we just want the file in memory.
	* nih/file.h: Add prototypes.
	* nih/tests/test_file.c (test_map): Test the functions.

2006-08-21  Scott James Remnant  <scott@netsplit.com>

	* nih/file.c: Wrap the inotify syscalls with something a little
	friendlier to deal with.
	* nih/file.h: Typedefs, structures and prototypes.
	* nih/libnih.h: Include file.h
	* nih/io.h: Correct typo in argument name.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link file.c
	(nihinclude_HEADERS): Install file.h
	(TESTS): Build and run file test cases
	(test_file_SOURCES, test_file_LDFLAGS, test_file_LDADD): Details
	for file test case binary

2006-08-19  Scott James Remnant  <scott@netsplit.com>

	* nih/option.c (nih_option_parser): Finish option processing when
	the first non-option argument is found (command-mode)
	* nih/option.h: Update.
	* nih/tests/test_option.c (test_parser): Test command-mode.

	* nih/option.c: Implement a simple, yet flexible option parser.
	* nih/option.h: Typedefs, structures and prototypes.
	* nih/libnih.h: Include option.h
	* nih/tests/test_option.c: Test it all pretty thoroughly.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link option.c
	(nihinclude_HEADERS): Install option.h
	(TESTS): Run the option test cases
	(test_option_SOURCES, test_option_LDFLAGS, test_option_LDADD):
	Details for the option test case binary.
	* TODO: Update.

	* nih/string.c (nih_str_wrap): Implement a function to wrap a
	string into the desired number of characters wide.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_str_wrap): Test the new function
	to make sure it does the right things.

2006-08-18  Scott James Remnant  <scott@netsplit.com>

	* TODO: Update.

	* nih/main.h (nih_main_init_gettext): Macro that expands to the
	usual gettext initialisation spiel if ENABLE_NLS is set, or nothing
	if not.
	(nih_main_init): Expand nih_main_init_gettext as well, we almost
	always want to do that, after all.
	* nih/macros.h: Include locale.h if ENABLE_NLS is set, as that
	contains setlocale, amongst other things.
	* nih/tests/test_main.c (test_init_gettext): Check the macro does
	the right things.

	* nih/io.h (NihIoCb): Rename to NihIoWatcher.
	(NihIoReadCb): Rename to NihIoReader.
	(NihIoCloseCb): Rename to NihIoCloseHandler.
	(NihIoErrorCb): Rename to NihIoErrorHandler.
	(NihIoWatch): Rename callback member to watcher.
	(NihIo): Rename read_cb member to reader, close_cb member to
	close_handler and error_cb member to error_handler.
	* nih/io.c: Update to use new names.
	(nih_io_cb): Rename to nih_io_watcher.
	* nih/tests/test_io.c: Update to use new names.

	* TODO: Update.

2006-08-16  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_loop_add_func): Add a loop function
	(nih_main_loop): Run the loop functions.
	* nih/main.h (NihMainLoopCb, NihMainLoopFunc): Typedefs and
	structures for main loop callbacks.
	* nih/tests/test_main.c (test_main_loop_add_func): Check that
	the loop function is allocated correctly.
	(test_main_loop): Make sure it actually gets called.

	* nih/io.c (nih_io_cb): Add a couple of check assertions.

	* nih/macros.h (N_): Should be defined to be a no-op.

2006-08-14  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_realloc): Yet another fix to realloc, we
	forgot to reinitialise our entry in the parent's children list in
	the case of no parent.  After fixing this and tracing the code, I
	realised that the previous fix was inelegant and there is a way to
	deal with children without modifying the pointers until after the
	reallocation.  Documented the reasoning in the function.

	* nih/io.c (nih_io_reopen): Report on the error rather than just
	suppressing it.
	(nih_io_error): Likewise, report on the error.

2006-08-12  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_loop_close): Drop this function
	(nih_main_loop): Instead mark them close on exec.
	* nih/main.h: Update.

	* nih/main.c (nih_main_loop): Change the main loop to use select
	instead of poll, as its semantics are a lot easier to deal with.
	We also use allow select to be interrupted by writing to a pipe
	from the signal handlers, for when Linux gets around to supporting
	SA_RESTART properly.
	(nih_main_loop_interrupt): Write to the pipe so the select call gets
	interrupted.
	(nih_main_loop_exit): Interrupt the main loop, in case we're
	waiting forever.
	(nih_main_loop_close): Close the interrupt pipe, used in children.
	* nih/main.h: Update.
	* nih/io.c (nih_io_add_watch): Change type of events parameter.
	(nih_io_poll_fds): Remove this function.
	(nih_io_select_fds): And replace with this that sets the select
	file descriptor sets instead.
	(nih_io_handle_fds): Now receives select file descriptor sets, and
	becomes rather more obvious in the process.  Restore the previous
	behaviour where a callback isn't called unless requests events
	occur.
	(nih_io_reopen): Always poll for reading so we pick up errors.
	(nih_io_cb): Change type of events parameter and events settings.
	(nih_io_write): Change event settings.
	* nih/io.h: Update.
	(NihIoEvents): replace the previous poll events with a new enum.
	* nih/signal.c (nih_signal_handler): Interrupt the select call in
	the main loop.
	* nih/tests/test_io.c: Update with new test cases.
	* nih/tests/test_child.c: Use select() rather than poll()

	* nih/tests/test_io.c (test_buffer_push, test_write): Correct
	uninitialised return value.

	* nih/main.c (nih_main_loop): Correct a memory leak, we forgot
	to clean up the poll fds list.

	* nih/io.c (nih_io_handle_fds): Always call the callback, even if
	unexpected events happen, otherwise we'll miss ERR, HUP, etc.
	(nih_io_shutdown): Allow a socket to be closed lazily, so we can
	send (or receive) a whole bunch of stuff and expect the structure to
	go away afterwards.
	(nih_io_cb): If the shutdown flag has been marked and we run out
	of things in either buffer, act as if one end was closed.
	(nih_io_reopen): Mark sockets as not shutdown by default.
	* nih/io.h: Update.
	* nih/tests/test_io.c (test_shutdown): Test behaviour.
	(test_handle_fds): Take out some of the tests due to changed
	behaviour.  While "clever" I think overall this is undesirable.

	* nih/io.c (nih_io_set_cloexec): Function to set the FD_CLOEXEC flag.
	* nih/io.h: Update.
	* nih/tests/test_io.c (test_set_cloexec): Test the function.

2006-08-11  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.h, nih/child.h, nih/hash.h, nih/logging.h, nih/signal.h,
	nih/timer.h: Document arguments to function pointers.

	* nih/io.c: Add a whole bunch of code to provide us with a high-
	throughput, async file/socket layer; largely copied from the
	dircproxy code (well, it works!).  This allows read and write calls
	to happen inside the main loop based on whenever poll thinks either
	is possible, while user space can just write what it likes or get
	called when there's data in the recv buffer.
	* nih/io.h: Add the new typedefs, structures and prototypes.
	* nih/tests/test_io.c: Lots of test cases for this stuff.

2006-08-10  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_realloc): Fix a fairly critical bug, we weren't
	dealing with the fact that the children list head can move;
	do some fancy shifting to make that work.

	* nih/string.c (nih_str_split): Add a function to split a string
	based on delimiters into an array.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_str_split): Test the new function.

2006-08-09  Scott James Remnant  <scott@netsplit.com>

	* nih/tests/test_child.c (test_poll): Add extra sleep calls for
	safety.

	* nih/libnih.h: Include errors.h

2006-08-04  Scott James Remnant  <scott@netsplit.com>

	* nih/errors.h: Include errno.h for helpfulness.

2006-08-03  Scott James Remnant  <scott@netsplit.com>

	* nih/child.c (nih_child_add_watch): Also takes a parent now.
	* nih/child.h: Update.
	* nih/tests/test_child.c: Update.

	* nih/io.c (nih_io_add_watch): And once more, with feeling; takes
	a parent for the watch.
	* nih/io.h: Update.
	* nih/tests/test_io.c: Update.

	* nih/signal.c (nih_signal_add_callback): Give this the same treatment,
	it takes the parent for the signal callback.
	* nih/signal.h: Update.
	* nih/tests/test_signal.c: Update.

	* nih/timer.c (nih_timer_add_timeout, nih_timer_add_periodic) 
	(nih_timer_add_scheduled): Use nih_alloc properly by taking a parent
	for the timer object and setting a destructor on it so that it's
	automatically removed when the parent is freed.
	* nih/timer.h: Update.
	* nih/tests/test_timer.c: Update function calls.
	* nih/tests/test_main.c (test_main_loop): Update also.

	* nih/list.c (nih_list_destructor): Add a destructor function that
	just cuts the entry out of the list in preperation for being freed.
	* nih/list.h: Update.
	* nih/tests/test_list.c (test_destructor): Test the behaviour of
	the new function.

	* nih/tests/test_error.c: Include fixes.

2006-08-02  Scott James Remnant  <scott@netsplit.com>

	* nih/signal.c (nih_signal_set_handler, nih_signal_set_default) 
	(nih_signal_set_ignore): Reset sa_flags so that we don't pass
	uninitialised data for SIGALRM.
	(nih_signal_reset): Add function to reset signals back to their
	default state.
	* nih/signal.h: Update.
	* nih/tests/test_signal.c (test_reset): Add test case.

	* nih/error.c (nih_error_raise_system): Be a lot more careful in
	this function!  Save the value of errno in case we overwrite it
	and call nih_error_init()

	* nih/signal.c (nih_signal_set_handler): Add the SA_NOCLDSTOP
	signal for SIGCHLD.

	* nih/main.c (nih_main_loop): Drop the code that masked out the
	child signal, it was inherently racy and there's no particular
	reason to do it anyway since we use SA_RESTART in signal.c for
	most things.

	* nih/signal.c (nih_signal_set_handler, nih_signal_set_default)
	(nih_signal_set_ignore): don't set SA_RESTART for SIGALRM.

	* nih/signal.c (nih_signal_set_handler, nih_signal_set_default)
	(nih_signal_set_ignore): use nih_return_system_error to make the
	code rather cleaner.

	* nih/error.h (nih_return_error): Add missing doc for retval
	(nih_return_system_error): Add additional useful function.
	* nih/tests/test_error.c (test_return_system_error): Add test
	case for the new macro.

	* nih/child.c (nih_child_poll): Convert to use waitid() so that
	we can obtain the information about the dead child without reaping
	it until we're done processing; useful because it means /proc/$PID
	and the child itself is still around during the handlers.
	* nih/child.h (NihReaper): Gains a new third argument that indicates
	whether the child exited normally or was killed.
	* nih/tests/test_child.c (test_poll): Update.

	* nihify: Add a few useful sanity checks so that it works with
	relative paths and already-nihified directories.

	* m4/misc.m4: Remove older force code.

	* TODO: Updated.

	* m4/Makefile.am (dist_aclocal_DATA): Distribute misc.m4, long
	missed.

	* nihify: Add useful script for symlinking into source trees until
	we intend to get released.

	* HACKING: Correct typo (our -> out)

2006-07-28  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_term_signal): Handy signal callback.
	* nih/main.h: Update.
	* nih/tests/test_main.c (my_timeout): Cheat and ensure the latest
	exit status is used.

	* nih/main.c (nih_main_loop): Implement a main loop by calling
	various other functions in the right manner.
	(nih_main_loop_exit): Function to break the main loop.
	* nih/main.h: Update.
	* nih/tests/test_main.c (test_main_loop): Add a trivial test case
	for the main loop, it's damned difficult to test, but at least this
	ensures the bases are touched.

	* nih/signal.c (nih_signal_poll): Add missing call to
	nih_signal_init()
	* nih/child.c (nih_child_poll): Add missing call to nih_child_init()
	* nih/io.c (nih_io_poll_fds, nih_io_handle_fds): Add missing calls
	to nih_io_init()

	* nih/io.c: Code for watching file descriptors and sockets for
	events through poll(), but not actually the poll() call itself.
	* nih/io.h: Typedefs, structures and prototypes.
	* nih/libnih.h: Include io.h
	* nih/tests/test_io.c: Test cases for I/O watches.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link io.c
	(nihinclude_HEADERS): Install io.h
	(TESTS): Build and run I/O test cases
	(test_io_SOURCES, test_io_LDFLAGS, test_io_LDADD): Details for I/O
	test case binary.

	* nih/tests/test_timer.c (test_poll): Free entry after testing.

	* nih/child.c (nih_child_poll): When the reaper is for a particular
	process, be sure to remove it from the list.
	* nih/tests/test_child.c (test_poll): Test for that.
	
	* nih/child.c: Simple bit of code to wait for children to
	terminate and dispatch the reaper functions for them.
	* nih/child.h: Typedefs, structures and prototypes.
	* nih/libnih.h: Include child.h
	* nih/tests/test_child.c: Test cases for child handling code.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link child.c
	(nihinclude_HEADERS): Install child.h
	(TESTS): Build and run child test cases
	(test_child_SOURCES, test_child_LDFLAGS, test_child_LDADD): Details
	for child test case binary.

	* nih/timer.c (nih_timer_add_timeout, nih_timer_add_periodic)
	(nih_timer_add_scheduled): Change argument order so that the time
	information is first, to match signal functions.
	* nih/timer.h: Update.
	* nih/tests/test_timer.c: Update.

	* nih/signal.h: Include the system signal.h for ease of use.

	* nih/signal.c: Code for handling signals inside the main loop,
	rather than trying to fit delicate code in a signal handler; and
	for making it generally easier to handle signals.
	* nih/signal.h: Typedefs and prototypes.
	* nih/libnih.h: Include signal.h
	* nih/Makefile.am (libnih_la_SOURCES): Build and link signal.c
	(nihinclude_HEADERS): Install signal.h
	(TESTS): Build and run signal test cases
	(test_signal_SOURCES, test_signal_LDFLAGS, test_signal_LDADD): Details
	for signal test case binary.

2006-07-27  Scott James Remnant  <scott@netsplit.com>

	* nih/timer.c: Code for timeouts, periodic and scheduled timers,
	note that the actual scheduling part of scheduled timers it not
	implemented yet (we need to think a bit more about it)
	* nih/timer.h: Structures, macros and prototypes.
	* nih/libnih.h: Include timer.h
	* nih/tests/test_timer.c: Test cases for timer code.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link timer.c
	(nihinclude_HEADERS): Install timer.h
	(TESTS): Build and run timer test cases
	(test_timer_SOURCES, test_timer_LDFLAGS, test_timer_LDADD): Details
	for timer test case binary.

	* nih/alloc.c (nih_free): Use new safe list iteration macro.

	* nih/hash.c (nih_hash_add_unique, nih_hash_replace)
	(nih_hash_search): Use new list iteration macros.

	* nih/list.h (NIH_LIST_FOREACH): New macro that expands to the usual
	list iteration for loop, prevents mistakes.
	(NIH_LIST_FOREACH_SAFE): Macro that does the same as above, but also
	includes a "next" variable to allow safe iteration; especially useful
	to prevent us getting this wrong!
	* nih/tests/test_list.c (test_foreach, test_foreach_safe): Add test
	cases for iteration.

	* nih/error.c (nih_error_init): Make inline and check value first.
	(nih_error_raise, nih_error_raise_printf, nih_error_raise_again)
	(nih_error_push_context): Unconditionally call nih_error_init.

	* nih/alloc.c (nih_alloc_init): Make inline and check value first.
	(nih_alloc): Unconditionally call nih_alloc_init.

	* nih/logging.c (nih_log_init): Use the proper functions to
	initialise details, check values first; also make inline.
	(nih_log_message): Unconditionally call nih_log_init.

	* nih/Makefile.am (DEFS): Append to the default DEFS list, rather
	than overriding, otherwise we lose HAVE_CONFIG_H

	* nih/macros.h: Check for ENABLE_NLS instead of HAVE_GETTEXT and
	include libintl.h if defined as well.

2006-07-20  Scott James Remnant  <scott@netsplit.com>

	* nih/string.c (nih_strv_free): Add a function to free an array
	of strings.
	* nih/string.h: Update.
	* nih/tests/test_string.c (test_strv_free): Test the function.

	* nih/error.c: Error handling code.
	* nih/error.h: Structures, macros and prototypes.
	* nih/errors.h: Error enum and message definitions.
	* nih/libnih.h: Include error.h and errors.h
	* nih/tests/test_error.c: Error handling test cases.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link error.h
	(nihinclude_HEADERS): Install error.h
	(TESTS): Build and run error handling test cases.
	(test_error_SOURCES, test_error_LDFLAGS, test_error_LDADD): Binary
	for error handling test cases.

	* nih/macros.h (NIH_MUST, NIH_MUST_NOT): Add handy macros to spin
	until we get a true or false value from an assignment.  Usually
	used around a call to memory allocation functions that we can't
	deal with failing.

	* nih/main.c (nih_main_package_string): Change package_string
	to be a module-level static so it can be reset by a call to
	nih_main_init_full.  Always return if not NULL.
	* nih/tests/test_main.c (test_package_string): Call nih_main_init_full
	instead of futzing with variables so the static string is reset.

	* nih/alloc.c (nih_alloc_using, nih_alloc, nih_realloc)
	(nih_alloc_size, nih_alloc_parent): Make various argument pointers
	const.
	* nih/alloc.h: Update.

	* nih/libnih.h, nih/logging.c, nih/main.c: Update to include
	string.h not strutil.h

	* nih/strutil.c: Renamed to nih/string.c
	* nih/strutil.h: Renamed to nih/string.h
	* nih/tests/test_strutil.c: Renamed to nih/tests/test_string.h
	* nih/Makefile.am (DEFAULT_INCLUDES): Override to stop automake doing
	silly things like putting -I. in the pre-processor flags.
	(libnih_la_SOURCES, nihinclude_HEADERS, TESTS)
	(test_string_SOURCES, test_string_LDFLAGS, test_string_LDADD): Update.

2006-07-19  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.h, nih/logging.h, nih/strutil.h: Reformat attribute
	declarations to not upset emacs indentation.

2006-07-17  Scott James Remnant  <scott@netsplit.com>

	* nih/strutil.c (nih_strdup): Implement an nih_alloc-based strdup.
	(nih_strdup): and strndup.
	* nih/strutil.h: Update.
	* nih/tests/test_strutil.c: Test new functions.

2006-07-13  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_free): Remove the entry from the parent's list.

	* nih/logging.h (nih_assert): Reexpress to avoid polluting if
	statements without an else.

	* nih/alloc.c (nih_realloc): Implement a function that reallocates
	a block of memory with the original allocator.
	(nih_alloc_init): Don't double-check the allocator.
	* nih/alloc.h: Update.
	* nih/tests/test_alloc.c (test_realloc): Check behaviour of realloc.

	* nih/alloc.c (NihAllocCtx): Drop the name pointer, we never used
	that anyway.
	(nih_alloc_using): Drop name parameter.
	(nih_alloc_named): Rename to nih_alloc.
	(nih_alloc_set_name): Drop this function.
	(nih_alloc_name): And this one.
	* nih/alloc.h (nih_new): Simplify.
	(nih_alloc): Drop entirely now it's unneeded.
	* nih/tests/test_alloc.c: Update.
	* nih/tests/test_list.c (test_new): Test using nih_alloc_size
	rather than nih_alloc_name.

	* nih/logging.h: Put the log priorities back in ascending order,
	but use the zero to mean "unknown".  Fix up the descriptions to be
	a little more consistent.
	* nih/logging.c: Rename max_priority back to min_priority so it
	all makes more sense again.
	(nih_log_init): Warning is the default minimum priority to show.
	(nih_log_set_priority): Set minimum priority.
	(nih_log_message): Discard messages below the minimum priority.
	(nih_logger_printf): Use stderr when priority is greater than or
	equal to warning.
	* nih/tests/test_logging.c: Update to match.

	* nih/logging.c (nih_log_message): Use nih_vsprintf which makes the
	function not core dump (always good, that).

2006-07-12  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_package_string): Use nih_sprintf and make
	the function rather simpler.

	* nih/tests/test_alloc.c (main): Formatting fix.

	* nih/strutil.c (nih_sprintf): Function to wrap sprintf, allocating
	the necessary space using nih_alloc first.
	(nih_vsprintf): Function to wrap vsprintf, allocating the necessary
	space using nih_alloc first.
	* nih/strutil.h: Prototypes.
	* nih/libnih.h: Include strutil.h
	* nih/Makefile.am (libnih_la_SOURCES): Build and link strutil.c
	(nihinclude_HEADERS): Install strutil.h
	(TESTS): Build and run strutil test cases
	(test_strutil_SOURCES, test_strutil_LDFLAGS)
	(test_strutil_LDADD): Binary for strutil test cases.

2006-07-05  Scott James Remnant  <scott@netsplit.com>

	* nih/logging.c (nih_log_message): Don't bother catching
	vsnprintf's return value, C99 doesn't allow it to fail.
	* nih/main.c (nih_main_package_string): Likewise for here.

	* nih/logging.c (nih_log_message): Don't use a static variable
	for no apparent reason, just free afterwards.  Catch vsnprintf and
	malloc failing.
	* nih/main.c (nih_main_package_string): Catch snprintf and realloc
	failing here too.

2006-05-30  Scott James Remnant  <scott@netsplit.com>

	* nih/logging.h (nih_assert): Assertion macro that uses our logging
	rather than stderr.
	* nih/alloc.c, nih/hash.c, nih/list.c, nih/logging.c, nih/main.c:
	Use nih_assert rather than assert.
	* nih/Makefile.am (test_alloc_LDFLAGS, test_list_LDFLAGS)
	(test_hash_LDFLAGS, test_main_LDFLAGS, test_logging_LDFLAGS): Link
	libraries statically.
	(test_alloc_LDADD, test_list_LDADD, test_hash_LDADD)
	(test_main_LDADD, test_logging_LDADD): Just link to the library.

	* nih/macros.h (NIH_STRINGIFY): Correct typo (-s -> _s)
	(NIH_LIKELY, NIH_UNLIKELY): Add branch prediction macros.

2006-05-29  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_alloc_init): Restore this function, it's better
	style to keep variables in shared libraries as zero.
	(nih_alloc_named): Call nih_alloc_init once more.
	* nih/logging.h: Reorder such that NONE is the lowest value.
	* nih/logging.c (min_priority): Rename to max_priority and set value
	to NIH_LOG_NONE (zero).
	(nih_log_init): Initialise the default logger and priority.
	(nih_log_set_priority): Assert priority is greater than NONE.
	(nih_log_message): Initialise the logging if necessary.
	(nih_logger_printf): Check priority with <=

	* TODO: Update.

	* nih/logging.c: Code for formatting log messages and filtering
	based on priority.
	* nih/logging.h: Prototypes and macros.
	* nih/libnih.h: Include logging.h
	* nih/tests/test_logging.c: Logging test cases.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link logging.c
	(nihinclude_HEADERS): Install logging.h
	(TESTS): Build and run logging test cases.
	(test_logging_SOURCES, test_logging_LDADD): Binary for logging
	test cases.

	* nih/tests/test_main.c (test_package_string, test_suggest_help)
	(test_version): Add missing comments before tests.
	(test_suggest_help, test_version): Close the duplicated stdout/stderr
	before leaving the test.

	* nih/alloc.h: Declare nih_alloc_named and nih_alloc_using with
	the warn_unused_result and malloc attributes.

2006-05-27  Scott James Remnant  <scott@netsplit.com>

	* m4/compiler.m4 (NIH_COMPILER_WARNINGS): Drop -pedantic as we
	usually want gcc extensions (all the world IS gcc).

2006-05-26  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_init_full): Only take the basename of
	the program name, not the full path.
	(nih_main_package_string): Use an allocated piece of memory rather
	than some on the stack, with C99-style snprintf to do the right thing
	with it.
	* nih/tests/test_main.c (test_init): Include check for basename.
	(test_package_string): Drop tests involving basename here.

	* m4/compiler.m4 (NIH_TRY_C99): Macro that tries compiling
	some code full of C99 features.
	(NIH_C_C99): Use the above macro to determine whether the compiler
	supports C99, or whether it can do it with a compiler flag.
	* configure.ac: Make sure the compiler does C99.

	* nih/list.c: Add missing prototype for nih_list_cut.
	* nih/hash.c: Add missing prototype for fnv_hash.

	* nih/macros.h (_, N_): Define gettext-wrapper macros if
	HAVE_GETTEXT, otherwise define them to just expand to their string.

	* nih/main.h: Drop comments for global variables.
	* nih/main.c: Provide proper docstrings for them here.

	* nih/alloc.c (nih_alloc_init): Drop this function, instead just
	initialise the static variable directly.
	(nih_alloc_set_allocator): Correct parameter name in docstring,
	don't call nih_alloc_init (it's already initialised).

2006-05-24  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c (nih_main_package_string): Clarify documentation.

2006-05-23  Scott James Remnant  <scott@netsplit.com>

	* nih/main.c: Add code for the various little functions that we
	usually call from main().
	* nih/main.h: Prototypes and macros.
	* nih/libnih.h: Include main.h
	* nih/Makefile.am (libnih_la_SOURCES): Build and link main.c
	(nihinclude_HEADERS): Install main.h
	(TESTS): Build and run main test-cases
	(test_main_SOURCES, test_main_LDADD): Code for main tests.
	* m4/misc.m4 (AC_COPYRIGHT): Wraps the Autoconf AC_COPYRIGHT macro
	but also defines PACKAGE_COPYRIGHT
	* m4/compiler.m4: Temporary hack to make sure misc.m4 gets dragged
	in as aclocal doesn't notice it, will go away once we get something
	that aclocal will notice.

2006-04-26  Scott James Remnant  <scott@netsplit.com>

	* nih/hash.c: Add code for FNV hash tables that uses NihList for
	the actual bins so is largely polymorphic.
	* nih/hash.h: Prototypes, macros and structures.
	* nih/macros.h: Include stdint.h as well, we use that a lot.
	* nih/libnih.h: Include hash.h
	* nih/tests/test_hash.c: Test cases for new hash table code.
	* nih/Makefile.am (libnih_la_SOURCES): Build and link hash.c
	(nihinclude_HEADERS): Install hash.h
	(TESTS): Build and run hash table test-cases.
	(test_hash_SOURCES, test_hash_LDADD): Code for hash table tests.
	* TODO: Update.

	* nih/tests/test_list.c (test_empty): Fix faulty test case that
	actually proved one-entry lists were showing up as empty!
	* nih/list.h (NIH_LIST_EMPTY): Compare the next and previous pointers
	against the list pointer itself!

	* nih/list.c (nih_list_cut): Add an inline function that does the
	job of nih_list_remove without calling nih_list_init afterwards.
	(nih_list_remove): Call nih_list_cut rather than modifying pointers.
	(nih_list_free): Use nih_list_cut for efficiency, no point fixing
	the pointers if we're just going to free it.
	(nih_list_add, nih_list_add_after): Use nih_list_cut as the pointers
	get modified afterwards anyway, more efficient this way.

2006-04-25  Scott James Remnant  <scott@netsplit.com>

	* nih/list.c: Remove unnecessary include of stdlib.h

	* nih/list.c (nih_list_new): Fix formatting of docstring.
	* nih/alloc.c (nih_alloc_using, nih_alloc_parent): Fix formatting
	of docstring.
	(nih_alloc_named): Fix docstring to mention NULL can be returned.
	* nih/tests/test_alloc.c, nih/tests/test_list.c: Add missing blank
	line before includes.

	* nih/alloc.c (nih_alloc_using): Return NULL if the allocation
	fails.
	* nih/list.c (nih_list_new): Also return NULL if the allocation
	fails.

	* nih/alloc.c (nih_alloc_set_allocator, nih_alloc_using)
	(nih_free, nih_alloc_set_name, nih_alloc_set_destructor)
	(nih_alloc_name, nih_alloc_size, nih_alloc_parent): Use assert
	to uncover programming errors.
	* nih/list.c (nih_list_init, nih_list_remove, nih_list_free)
	(nih_list_add, nih_list_add_after): Use assert to uncover
	programming errors.
	(nih_list_new): Comment that nih_new may return NULL and we need
	to make sure we catch that.

2006-04-24  Scott James Remnant  <scott@netsplit.com>

	* m4/Makefile.am (dist_aclocal_DATA): Add missing \
	* nih/Makefile.am (INCLUDES): Include top_srcdir otherwise we
	can't be built out of tree.

	* m4/Makefile.am (dist_aclocal_DATA): Install the m4 files into
	the aclocal directory, not a package specific one.
	* m4/compiler.m4, m4/linker.m4: Fix closing comment style.

	* TODO: Add TODO file.
	* nih/list.h (NIH_LIST_EMPTY): Document what this actually does.

2006-04-19  Scott James Remnant  <scott@netsplit.com>

	* nih/list.c (nih_list_entry_new): Removed.  This makes the list
	code more focussed and generic, but also we'll nearly always want
	the data member to be an nih_alloc child of the list, rather than
	the other way around!
	* nih/list.h (NihListEntry, nih_list_add_new)
	(nih_list_add_new_after): Likewise, remove the structure and helper
	macros; if we find ourselves wanting this, we can put it in a new
	file and just make it polymorphic like we plan for hashes.
	* nih/tests/test_list.c: Replace all uses of NihListEntry with plain
	NihList, we never checked the data members anyway.
	(test_entry_new): Remove test case.
	(test_add): Remove test of nih_list_add_new macro.
	(test_add_after): Remove test of nih_list_add_new_after macro.
	(test_empty): Check macro works with any list entry.
	(test_remove): Test removal of the last list entry, and removal
	on an already empty list.
	(test_free): Don't check the pointers of a block we've just freed!

2006-04-18  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (nih_alloc_init): Call nih_alloc_set_allocator.
	* nih/alloc.h (NihDestructor): Clarify docstring to not refer
	to internal structures.
	* nih/list.h (NIH_LIST_EMPTY): Add convenience macro for this
	common operation.
	* nih/tests/test_list.c (test_empty): Test the new macro.

2006-04-16  Scott James Remnant  <scott@netsplit.com>

	* nih/list.c (nih_list_new, nih_list_entry_new): Call nih_new rather
	than malloc so the list can be a context for data members.
	(nih_list_free): Call nih_free rather than free.
	* nih/tests/test_list.c: Test cases should not be static.
	(test_new, test_entry_new): Check the new object was allocated using
	our nih_alloc function.
	(test_remove): Test a second removal.
	(destructor_called): Function to test whether destructor was called.
	(test_free): Test now that we can use an NihDestructor.
	* nih/Makefile.am (test_list_LDADD): Link alloc.o now that lists
	depend on the allocator.

	* nih/list.c, nih/list.h: Fix docstrings to use references where
	useful.  Split functions into blocks separated by a newline.

	* nih/alloc.h: Update and fix formatting.
	(NihAllocDestructor): Rename to NihDestructor.
	* nih/alloc.c (nih_alloc_init): Make safe against repeated calls.
	(nih_alloc_set_allocator): New function to set the default allocator,
	overriding any set already.
	(nih_alloc_set_destructor): Update type of destructor argument..
	(NihAllocCtx): Update type of destructor member.
	* nih/tests/test_alloc.c (my_realloc): Wrapper around realloc so
	we can check custom allocators are called properly.
	(test_alloc_using): Test allocation with a custom allocator.
	(test_free): Check that the block is freed using the allocator,
	also update destructor checking.
	(test_set_allocator): Test new allocator is used.

	* nih/alloc.c (nih_alloc_using): New one-shot function to use a given
	realloc-style function to make a named block of memory of a given size.
	(nih_alloc_named): Replace with a thin-wrapper around nih_alloc_using
	that passes in the default allocator.
	(NihAllocCtx): Add new allocator member to store the allocator used,
	so we free with the right one.
	(nih_alloc_init): Set the default allocator to realloc().  Drop
	pool initialisation code.
	(nih_free): Call the context's original allocator with zero size.
	(used_pool, unused_pool, NIH_ALLOC_SMALLEST): Remove, these really
	belong in distinct memory handling code.
	(nih_alloc_set, nih_alloc_new): Drop functions only needed if we're
	doing our own memory management.
	(nih_alloc_size, nih_alloc_parent): Add a couple of useful functions.
	* nih/alloc.h (NihAllocator): Typedef for allocator function prototype.
	(nih_alloc): Rename to nih_new.
	(nih_alloc_size): Rename to nih_alloc.
	* nih/tests/test_alloc.c (test_alloc_named, test_new, test_alloc): Test
	behaviour of standard functions with and without parents.
	(destructor_called): Allow it to be called multiple times, change
	to static to enforce modularity.
	(child_destructor_called): Another function for testing multiple
	destructors.
	(test_free): Test nih_free using alloc destructors.
	(test_alloc_set_name): Rename to just test_set_name for consistency.

	* nih/macros.h (NIH_STRINGIFY): Generic hack to turn a numeric
	macro into a string.
	* nih/alloc.h (nih_alloc, nih_alloc_size): Use generic NIH_STRINGIFY
	macro instead of our home-cooked one.

2006-03-31  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c, nih/alloc.h, nih/list.c, nih/list.h, nih/macros.h,
	nih/libnih.h, nih/tests/test_alloc.c,
	nih/tests/test_list.c: Update FSF address in GPL header.

2006-03-03  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c, nih/alloc.h, nih/list.c, nih/list.h: Formatting fixes,
	correct erroneous references to d_* functions and D* structures.
	* nih/list.h: Correct docstring for nih_list_new and nih_list_entry_new
	functions so that @data is described for the right one.
	* nih/Makefile.am: Add blank line between SOURCES and LDFLAGS.

2005-09-29  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c, nih/alloc.h, nih/list.c, nih/list.h: Fix docstring
	terminators to be **/ not */.
	* nih/alloc.h: Align function parameters.
	* nih/tests/test_alloc.c (test_alloc_set_name): Fix to return
	ret and not zero all the time.

2005-08-29  Scott James Remnant  <scott@netsplit.com>

	* nih/alloc.c (NIH_ALLOC_SMALLEST): Set to the size of the
	NihAllocCtx structure shifted left twice; this will divide evenly
	into a page.

	* nih/alloc.c (nih_alloc_init): No need to pass NULL to nih_list_new.
	(nih_alloc_new): No need to initialise data member of NihList structs
	or cast children member.
	(nih_alloc_named): Can cast NihList directly to NihAllocCtx now,
	simplify difference test.
	(nih_free): Use iter as variable name for clarity.
	(nih_alloc_return_unused): Cast NihList directly to NihAllocCtx.
	* nih/tests/test_alloc.c: Output "BAD:" instead of "FAIL:"

	* nih/list.h (NihList): Remove data pointer, it'll save us 4 bytes
	where we want to make lists of structures that are always in lists.
	(NihListEntry): Define new structure for those still wanting data
	pointers.
	(nih_list_add_new, nih_list_add_new_after): Use nih_list_entry_new.
	* nih/list.c (nih_list_new): Remove argument and don't initialise
	data pointer, this simply allocates and initialises the two-pointer
	structure.
	(nih_list_entry_new): New function to allocate and initialise an
	NihListEntry structure.
	* nih/tests/test_list.c: Output "BAD:" instead of "FAIL:"
	(test_new): Test without data pointer.
	(test_entry_new): Test with data pointer.
	(test_add, test_add_after, test_remove): Mix and cast NihList and
	NihListEntry properly.

	* nih/alloc.c: Implement a heirarchial allocator in a similar
	style to halloc and talloc, but designed never to return data to
	the system and re-use it instead.
	* nih/alloc.h: Prototypes and macros for allocator.
	* nih/libnih.h: Include allocator header.
	* nih/tests/test_alloc.c: Test-cases for allocator.
	* nih/macros.h (MIN, MAX): Define MIN and MAC macros if not already
	available.
	* nih/Makefile.am (libnih_la_SOURCES): Compile and link alloc.c
	(nihinclude_HEADERS): Install alloc.h
	(TESTS): Build and run the allocator test-cases.
	(test_alloc_SOURCES, alloc_list_LDADD): Identify the test sources and
	objects it needs.

2005-08-28  Scott James Remnant  <scott@netsplit.com>

	* nih/list.c (nih_list_init): Add new function for dealing with
	statically allocated list entries, and initialising them.
	(nih_list_new): Use nih_list_init() to initialise the list.
	(nih_list_new): Use nih_list_init() to re-initialise the list
	to a single-member.
	* nih/list.h: Add prototype for nih_list_init.
	(NihListIter): Remove the iterator structure, it turns
	out to be harder work to try and use lists in an "all nodes are
	interesting" manner; so we'll iterate them normally instead.
	(NIH_LIST_FIRST, NIH_LIST_LAST): Remove iterator test functions.
	(NIH_LIST_PREV, NIH_LIST_NEXT): Remove iterator change functions.
	* nih/tests/test_list.c: Use NULL for nih_list_new in all functions.
	(test_init): New test case for nih_list_init().
	(test_iterator): Removed iterator tests.

2005-08-21  Scott James Remnant  <scott@netsplit.com>

	* nih/list.c: Add code for generic circular doubly-linked lists.
	* nih/list.h: Prototypes and macros.
	* nih/macros.h: Some generic macros.
	* nih/libnih.h: Header to import everything.
	* nih/tests/test_list.c: Test-cases for linked-list code.
	* nih/Makefile.am (libnih_la_SOURCES): Link list.c in.
	(nihincludedir): Define directory to contain header files to be
	$includedir/nih.
	(include_HEADERS): Install libnih.h into the main include directory.
	(nihinclude_HEADERS): Install header files.
	(TESTS): Build and run the list test-cases.
	(test_list_SOURCES, test_list_LDADD): Identify the test sources and
	objects it needs.

	* nih/libnih.ver: Add simple "everything beginning nih_* is global"
	version script.
	* nih/Makefile.am (libnih_la_LDFLAGS): Use the version script
	if we can pass an argument to do that to the linker.
	(EXTRA_DIST): Distribute the version script.

2005-07-09  Scott James Remnant  <scott@netsplit.com>

	* m4/compiler.m4 (NIH_COMPILER_WARNINGS): Macro to add -Wall,
	-Werror and -pedantic to CFLAGS and CXXFLAGS if using gcc or g++.
	(NIH_COMPILER_OPTIMISATIONS): Macro to remove any optimisation
	arguments from CFLAGS and CXXFLAGS and replace them with -O0 to
	override any default level.
	(NIH_COMPILER_COVERAGE): Macro to add compiler coverage testing
	arguments to CFLAGS and CXXFLAGS.
	* m4/linker.m4 (NIH_LINKER_OPTIMISATIONS): Macro to add -Wl,-O1
	to LDFLAGS to increase the optimisation of the linker hash tables.
	(NIH_LINKER_VERSION_SCRIPT): Macro to test for the right argument
	to pass a version script to the linker and define
	HAVE_VERSION_SCRIPT and VERSION_SCRIPT_ARG.
	* m4/Makefile.am (dist_pkgdata_DATA): Ship macros.
	* configure.ac: Use new macros.

	* ChangeLog: Initial project infrastructure created.

