1.0.0 2009-11-28
* libnih is no longer intended to be copied into an application source tree and linked statically, but is now installed onto the system and dynamically linked normally. The nihify script has been removed accordingly. * Future 1.0.x versions will contain bug fixes, but no API or ABI changes. Future 1.x.0 versions may introduce new things to the API or ABI but will be backwards compatible with previous versions. Future x.0.0 versions will not be backwards compatible. * The NIH_INIT macro has been removed, to check for libnih or libnih-dbus you should now use pkg-config, e.g.: PKG_CHECK_MODULES([NIH], [libnih >= 1.0.0]) any other checks should be added as necessary instead of relying on that macro to do them for you. * An external pre-built nih-dbus-tool may be used instead of the built copy by passing NIH_DBUS_TOOL to configure. If you are cross-compiling, this will be automatically searched for in the PATH and a warning output if it doesn't exist and you fail to specify it. (Bug: #426740) * nih_alloc() has been fixed to work on platforms with alignment greater than 4 bytes. (Bug: #436758) * nih_alloc() no longer permits objects to have zero references, passing NULL for the parent now creates a special reference from a NULL parent. * nih_discard() removes this special reference before checking whether remaining references free the object. * nih_ref() and nih_unref() may have NULL as the parent reference and add or remove the special reference respectively. * nih_ref() does not remove the NULL reference, you must now use nih_discard() or nih_local to construct floating objects. * Since nih_ref() may be used when parent is NULL, there's no reason for an nih_unref_only() function so it has been dropped; the following code is now perfectly safe: nih_ref (obj, new_parent); nih_unref (object, old_parent); * nih_alloc_parent() has changed again, now when passed NULL it only returns TRUE if the object has the special NULL parent. * TEST_ALLOC_PARENT() has likewise changed, restoring the previous behaviour that TEST_ALLOC_PARENT(ptr, NULL) tests whether it has the NULL parent. * The TEST_ALLOC_ORPHAN() macro has been dropped, objects may no longer have no parents. * A new TEST_ALLOC_NOT_PARENT() macro has been added that is the exact inverse of TEST_ALLOC_PARENT() * These changes solve the problem where the object "obj" in the following code would be freed, even though it was intended that it be a top-level object: obj = nih_new (NULL, Obj); nih_ref (obj, tmp_obj); nih_unref (obj, tmp_obj); This comes at a cost of breaking the previous behaviour where a NULL-parented object could be considered floating and ignored once referenced. This kind of code was brittle anyway and nih_local far better solves it, e.g. replace code such as: Obj *obj; obj = nih_new (NULL, Obj); func_that_will_ref (obj); with: nih_local Obj *obj = NULL; obj = nih_new (NULL, Obj); func_that_will_ref (obj); * nih_log_message() will set the glibc __abort_msg variable to any log message of NIH_LOG_FATAL priority or greater, this means that should you call abort() core dump analysers can retrieve the message; especially useful for nih_assert(). (Bug: #429411) * nih-dbus-tool generated code has been fixed so that when a method call function is called on a disconnected connection it returns a raised DBUS_ERROR_DISCONNECTED rather than causing an assertion error. (Bug: #477116) 0.3.2 2009-08-02 * D-Bus 1.2.16 is now required. * Fixed compilation on ia64. * nih-dbus-tool(1) manpage will not be installed, since the binary is not. (Bug: #403103) 0.3.1 2009-07-09 * The licence for libnih has been changed back to version 2 of the GNU GPL. * D-Bus 1.2.15 is now required, this is the current GIT HEAD pending a 1.2.16 release. * TEST_EXPECTED_STR and TEST_EXPECTED_FILE added. These compare the contents of a string and file respectively against the contents of a given filename relative to the "expected" directory alongside the test binary, e.g.: TEST_EXPECTED_STR (code, "foo.c"); in tests/test_foo will be TRUE if the contents of the C string "code" match the contents of the file tests/expected/foo.c * NihFileFilter (the function type passed to nih_dir_walk and nih_watch_new) now has an extra is_dir argument, this is set without calling stat() * NihTimer now uses a monotonic clock, so is unaffected by changes in the system clock; this means that you'll need to use clock_gettime (CLOCK_MONOTONIC) when manually adjusting the due time rather than time (). (Bug: #389589) * NihError may now be directly embedded into other structures with the NIH_ERROR_MEMBERS macro. * NihDBusError now directly embeds the members of NihError, there is no longer an "error" member, instead you can directly access "number" and "message" members. * NihDBusProxy has gained an auto_start member, TRUE by default. If you do not want method calls to automatically start a service, you may set this to FALSE after creating the proxy. nih-dbus-tool generated method calls will respect this flag. * nih_dbus_proxy_connect() no longer has both a parent and proxy argument, it now only takes the proxy and is always a child of it. * NihDBusProxySignal no longer has connection, name or path members and instead has a proxy member from which the values can be found. * nih_dbus_proxy_new() will now begin tracking any name given, even if there is no lost_handler passed. This (and the above changes) allows signal handlers to compare the sender of a signal (which is always a unique name) against the owner of the associated proxy. * Attempting to read from a D-Bus property that is write-only, or attempting to write to a D-Bus property that is read-only will now return the DBUS_ERROR_ACCESS_DENIED error rather than DBUS_ERROR_UNKNOWN_METHOD. * An empty com.netsplit.Nih.Symbol annotation is no longer permitted for D-Bus interfaces. Instead use the new --default-interface option to nih-dbus-tool. * nih-dbus-tool now properly supports structures, including arrays of structures and arrays of dictionary entries. The default naming of the structure is derived from the method or signal name and argument or the property name; the default naming of the members is "item0".."itemN". Structure definitions appear in the generated header file. * nih-dbus-tool now generates prefix_interface_get_all() and prefix_interface_get_all_sync() methods for each interface, these get the values of all of the properties and store them in a PrefixInterfaceProperties structure defined in the header file. * A side-effect of the above is that it's no longer possible to name properties after C keywords. 0.3.0 2009-06-17 * The licence for libnih has been changed to MIT/X11. * The --enable-compiler-warnings configure option has been extended to add -Wextra, but turns off a few of the more extreme warnings * TEST_FILE_MATCH() added to allow matching of a line in a file against a wildcard string * NIH_MUST(), NIH_ZERO() and NIH_SHOULD() now expand to an expression with the value of the expression inside. This means that the code like the following is now valid: ret = NIH_SHOULD (some_function_call ()); if (ret < 0) ... This style is preferred to the previous way of doing it (set ret inside the macro call) and the code has been updated. * nih_option_parser() fixed to not eat an argument containing a lone dash. * nih_error_raise_again() renamed to nih_error_raise_error(). * Errors are no longer removed from the context when you call nih_error_get(), this means that to clear the error you must free it and it's now a bug to call nih_error_raise_error() to raise it again. * Unhandled errors now result in an assertion error, rather than a log message being emitted. This assertion will include the filename, line number and function name where the error was originally raised. The assertion may be generated on exit from the program. * nih_option_help() produces slightly different output if the bug reporting address is a URL. * GNU C Library v2.4 (or backported inotify support) is required * D-Bus object and proxy interface structure definitions have been moved to nih-dbus/dbus_interface.h, this file is still included by nih-dbus/dbus_object.h and nih-dbus/dbus_proxy.h so there may be no need to include it directly. * nih_dbus_proxy_new() has additional arguments, a lost handler function which enables tracking of the owner of the well-known name, and a data pointer. NihDBusProxy has a new owner member which contains this. * Signals may be connected using nih_dbus_proxy_connect(), this requires both a handler function and an intermediate filter function. The NihDBusSignal structure gained a filter member to specify the latter. * The D-Bus binding tool has moved into a separate nih-dbus-tool subdirectory, and rewritten from Python to C. * The D-Bus binding tool now uses annotations rather than XML namespaced attributes to adjust the output: - set com.netsplit.Nih.Method.Async to "true" instead of using nih:object="async" - com.netsplit.Nih.Symbol may be used to override C symbol name generation - org.freedesktop.DBus.Deprecated results in a deprecated attribute on external API * Function names generated by the D-Bus binding tool now include the last element of the interface name; my_method() would now be named my_interface_method(). The interface name can be ommitted by setting the com.netsplit.Nih.Symbol annotation to "" * Proxy method functions are now asynchronous by default, the synchronous version has _sync() appended to its name. * Signal function names now always include "emit" in them. * Signal filter functions are generated by the binding tool for use with nih_dbus_proxy_connect() * Get and Set access functions are now generated for properties, and in object mode are expected to be provided. * Arrays of arrays are now fully supported; if the array is an array of basic types, the function will have two arguments; a NULL-terminated array of arrays, and a second NULL-terminated array of those array lengths. This is supported to infinite depths. * D-Bus 1.2.4 is now required. * pkg-config 0.22 is now required, it probably was anyway but we now explicitly check for it. * Dependency on Python for the D-Bus binding tool has been dropped and replaced with a dependency on expat 2.0.0 * The NIH_DBUS_ERROR and NIH_DBUS_INVALID_ARGS error enums have been moved to nih-dbus/errors.h 0.2.0 2009-01-29 * nih_alloc_set_allocator() is now a macro that casts the function to the right typedef, so such casts are no longer needed * nih_alloc() now permits multiple parent references - nih_ref(ptr, parent) creates a new parent reference - nih_unref(ptr, parent) drops a reference and frees if the last - nih_unref_only(ptr, parent) drops a reference without freeing - nih_free() unconditionally frees as it always has - nih_discard() only frees if there are no references * nih_local may be added to variable definitions to have the pointer automatically discarded when it goes out of scope, unless it is referenced in the meantime: { nih_local char *str = NULL; str = nih_strdup (NULL, "some string"); pass_to_func (str); } * nih_alloc_reparent() has been dropped, it can be replaced with an nih_unref_only()/nih_ref() pair - however many uses of this are no longer necessary and it's worth taking some time to refactor the code. * nih_alloc_parent() has changed; it now accepts both an object ptr and a parent and returns TRUE if the object has that parent, if parent is NULL is returns TRUE of the object has any parent. (previously it was used to return _the_ parent). * TEST_ALLOC_PARENT() now behaves as nih_alloc_parent(), which means testing for no parent with NULL has the exact opposite behaviour use the new TEST_ALLOC_ORPHAN(ptr) macro instead. * nih_str_array_addp() now references the passed pointer, instead of reparenting it. Calling code should be modified to make sure it either calls nih_discard() or uses nih_local to be safe in case of error. * nih_strv_free() has been dropped since it did not match the behaviour of the other functions * new NIH_LIST_ITER(iter, type, member) macro to handle the case of an offset head in an iterated structure * nih_hash_pointer_new(), nih_hash_pointer_key(), nih_hash_pointer_hash() and nih_hash_pointer_cmp() have been dropped since they did strange things to pointers that probably aren't legal C. * nih_config_parse() now reads the file into memory, instead of using mmap(). The API is unchanged, however the errors may be different. * The D-Bus bindings have been moved into a separate sub-directory and split out into multiple files. You will need to update your includes as follows: - NihDBusError and nih_dbus_error_*() are in nih-dbus/dbus_error.h - nih_dbus_connect(), nih_dbus_bus(), nih_dbus_setup() and nih_dbus_server() are in nih-dbus/dbus_connection.h - NihDBusMessage and nih_dbus_message_*() are in nih-dbus/dbus_message.h - NihDBusObject, NihDBusInterface and nih_dbus_object_new() are in nih-dbus/dbus_object.h - NihDBusProxy and nih_dbus_proxy_new() are in nih-dbus/dbus_proxy.h - nih_dbus_path() is now in nih-dbus/dbus_util.h * The D-Bus test macros are now in nih-dbus/test_dbus.h * nih_dbus_message_new() now exists as a function in its own right * Asynchronous method callbacks must take a reference to the NihDBusMessage object they are passed, otherwise it will be freed * Reply functions and nih_dbus_message_error() no longer free the message passed in, this is consistent with the above change. * libtool 2.2.4 is now required * The MIN() and MAX() macros are no longer defined, instead use nih_min() and nih_max() which do not re-evaluate their parameters multiple times. * The nih_main_package_string() function has been dropped, instead just access the package_string global set by nih_main_init_full() 0.1.0 2008-10-24 * Initial public release. |