[oe] 答复: [meta-oe][PATCH] libnih: add new recipe to meta-oe

Dai, Caiyun daicy.fnst at cn.fujitsu.com
Wed Jul 27 03:36:33 UTC 2016


Thanks , I will resend this patch.

-----邮件原件-----
发件人: openembedded-devel-bounces at lists.openembedded.org [mailto:openembedded-devel-bounces at lists.openembedded.org] 代表 Martin Jansa
发送时间: 2016年7月26日 18:51
收件人: openembedded-devel at lists.openembedded.org
主题: Re: [oe] [meta-oe][PATCH] libnih: add new recipe to meta-oe

On Tue, Apr 19, 2016 at 05:57:36AM +0300, Dai Caiyun wrote:
> meta-webos hasn't been maitained for about 2years.
> So, how about add libnih into meta-oe.
> 
> Fix the error as foloowing:
> invalid tag value("^[A-Za-z0-9+._]+$") Release: Release: r2-4ubuntu16.

This didn't make it into ML until today and it's also missing in
patchwork, can you please resend if you still need this?

> Signed-off-by: Dai Caiyun <daicy.fnst at cn.fujitsu.com>
> ---
>  .../libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch      | 3593 ++++++++++++++++++++
>  meta-oe/recipes-support/libnih/libnih_1.0.3.bb     |   40 +
>  2 files changed, 3633 insertions(+)
>  create mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
>  create mode 100644 meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> 
> diff --git a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> new file mode 100644
> index 0000000..5d125c8
> --- /dev/null
> +++ b/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> @@ -0,0 +1,3593 @@
> +--- libnih-1.0.3.orig/ChangeLog
> ++++ libnih-1.0.3/ChangeLog
> +@@ -1,3 +1,84 @@
> ++2013-03-13  Steve Langasek  <steve.langasek at ubuntu.com>
> ++
> ++	* nih/watch.c (nih_watch_walk_filter): New NihFileFilter function
> ++	passed to nih_dir_walk_scan() to ensure the nih_watch_new() filter
> ++	function is passed the NihWatch data rather than the data passed to
> ++	the nih_dir_walk() NihFileVisitor function (LP: #776532).
> ++
> ++	* nih/tests/test_watch.c (test_new): New test "with filter and data"
> ++	to ensure filter is passed correct value.
> ++
> ++2013-02-28  James Hunt  <james.hunt at ubuntu.com>
> ++
> ++	* Removal of gcc 'malloc' function attribute resulting from
> ++	  a clarification in its description which makes its use invalid.
> ++	  (LP: #1123588).
> ++
> ++2013-02-05  James Hunt  <james.hunt at ubuntu.com>
> ++
> ++	* nih/logging.c: nih_log_abort_message(): Remove erroneous check
> ++	  left over from use of __abort_msg weak symbol.
> ++	* nih/tests/test_logging.c: Remove unecessary check on whether
> ++	  __nih_abort_msg has an address.
> ++
> ++2012-12-13  Stéphane Graber  <stgraber at ubuntu.com>
> ++
> ++	* nih-dbus-tool/type.c, nih-dbus-tool/marshal.c: Update dbus code
> ++	generator to allow for empty lists for type 'as'.  This drops the
> ++	!= NULL check for NULL terminated arrays and moves the iteration
> ++	loop inside an 'if' statement.
> ++
> ++2012-12-11  Dmitrijs Ledkovs  <dmitrijs.ledkovs at canonical.com>
> ++
> ++	* nih/file.c (nih_dir_walk_scan): Fallback to lstat, if the
> ++	non-portable dirent.d_type is not available (LP: #672643) (Closes:
> ++	#695604).
> ++
> ++2012-12-10  Petr Lautrbach  <plautrba at redhat.com>
> ++
> ++	* nih/tests/test_file.c: don't use dirent.d_type (not portable)
> ++
> ++2012-10-25  James Hunt  <james.hunt at ubuntu.com>
> ++
> ++	* nih/logging.c: Use our own __nih_abort_msg rather than the
> ++	(e)glibc private symbol __abort_msg to avoid upgrade issues (LP: #997359).
> ++	* nih/tests/test_logging.c: Update tests for __nih_abort_msg.
> ++
> ++2011-08-31  James Hunt  <james.hunt at ubuntu.com>
> ++
> ++	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> ++	(test_unix_fd_to_str): Sanity check value before invoking strchr in
> ++	case it returns address of null (which would give a misleading test
> ++	pass).
> ++	* nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> ++	(test_unix_fd_to_str, test_unix_fd_to_str_sync): Sanity check value
> ++	before invoking strchr in case it returns address of null (which would
> ++	give a misleading test pass).
> ++	* nih/config.c (): nih_config_block_end: Add check to ensure strchr()
> ++	doesn't return address of null since this would result in a misleading
> ++	return value of TRUE.
> ++
> ++	* nih/string.c (nih_str_split): Fixes to avoid over-running
> ++	input string and also returning an empty string array entry
> ++	when repeat is true (LP: #834813).
> ++	* nih/tests/test_string.c (test_str_split): Added a lot of new
> ++	tests for nih_str_split().
> ++
> ++2011-08-26  James Hunt  <james.hunt at ubuntu.com>
> ++
> ++	* nih/io.c (nih_io_select_fds): Ensure number of fds being managed
> ++	is within limits.
> ++
> ++	* nih/config.c, nih/error.h, nih/io.c, nih/test_files.h: Correct
> ++	typos in comments.
> ++
> ++2011-06-20  James Hunt  <james.hunt at ubuntu.com>
> ++
> ++	* nih/watch.c (nih_watch_handle): Handle non-directory watches;
> ++	previously a file watch resulted in an invalid file path ending in
> ++	a single slash (LP:#777097).
> ++	* nih/tests/test_watch.c: Added explicit test for watch on a file.
> ++
> + 2010-12-23  Scott James Remnant  <scott at netsplit.com>
> + 
> + 	* NEWS: Release 1.0.3
> +--- libnih-1.0.3.orig/nih/watch.c
> ++++ libnih-1.0.3/nih/watch.c
> +@@ -2,8 +2,8 @@
> +  *
> +  * watch.c - watching of files and directories with inotify
> +  *
> +- * Copyright © 2009 Scott James Remnant <scott at netsplit.com>.
> +- * Copyright © 2009 Canonical Ltd.
> ++ * Copyright © 2011 Scott James Remnant <scott at netsplit.com>.
> ++ * Copyright © 2011 Canonical Ltd.
> +  *
> +  * This program is free software; you can redistribute it and/or modify
> +  * it under the terms of the GNU General Public License version 2, as
> +@@ -71,6 +71,9 @@
> + 					      uint32_t events, uint32_t cookie,
> + 					      const char *name,
> + 					      int *caught_free);
> ++static int             nih_watch_walk_filter (void *data, const char *path,
> ++					      int is_dir)
> ++	__attribute__ ((warn_unused_result));
> + 
> + 
> + /**
> +@@ -91,7 +94,7 @@
> +  * sub-directories will be automatically watched.
> +  *
> +  * Additionally, the set of files and directories within @path can be
> +- * limited by passing a @filter function which will recieve the paths and
> ++ * limited by passing a @filter function which will receive the paths and
> +  * may return TRUE to indicate that the path received should not be watched.
> +  *
> +  * When a file is created within @path, or moved from outside this location
> +@@ -104,7 +107,7 @@
> +  * files that exist under @path when the watch is first added.  This only
> +  * occurs if the watch can be added.
> +  *
> +- * This is a very high level wrapped around the inotify API; lower levels
> ++ * This is a very high level wrapper around the inotify API; lower levels
> +  * can be obtained using the inotify API itself and some of the helper
> +  * functions used by this one.
> +  *
> +@@ -185,6 +188,35 @@
> + }
> + 
> + 
> ++ /**
> ++ * nih_watch_walk_filter:
> ++ * @data: NihWatch,
> ++ * @path: path to file,
> ++ * @is_dir: TRUE if @path is a directory.
> ++ *
> ++ * Callback function for nih_dir_walk(), used by nih_watch_add() to wrap
> ++ * the user-specified NihFileFilter (watch->filter) with a filter that can
> ++ * take watch itself as an argument.
> ++ *
> ++ * Returns: TRUE if the path should be ignored, FALSE otherwise.
> ++ **/
> ++static int
> ++nih_watch_walk_filter (void *data, const char *path, int is_dir)
> ++{
> ++    NihWatch *watch;
> ++
> ++    watch = (NihWatch *)data;
> ++
> ++    nih_assert (watch);
> ++
> ++    /* No filter, so accept all files */
> ++    if (! watch->filter)
> ++           return FALSE;
> ++
> ++    return watch->filter (watch->data, path, is_dir);
> ++}
> ++
> ++
> + /**
> +  * nih_watch_handle_by_wd:
> +  * @watch: watch to search,
> +@@ -295,7 +327,7 @@
> + 	 * one; errors within the walk are warned automatically, so if this
> + 	 * fails, it means we literally couldn't watch the top-level.
> + 	 */
> +-	if (subdirs && (nih_dir_walk (path, watch->filter,
> ++	if (subdirs && (nih_dir_walk (path, nih_watch_walk_filter,
> + 				      (NihFileVisitor)nih_watch_add_visitor,
> + 				      NULL, watch) < 0)) {
> + 		NihError *err;
> +@@ -494,12 +526,21 @@
> + 		return;
> + 	}
> + 
> ++	/* Every other event must come with a name */
> ++	if (name && *name) {
> + 
> +-	/* Every other event must come with a name. */
> +-	if ((! name) || strchr (name, '/'))
> +-		return;
> ++		/* If name refers to a directory, there should be no associated
> ++		 * path - just the name of the path element.
> ++		 */
> ++		if (strchr (name, '/'))
> ++			return;
> + 
> +-	path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
> ++		/* Event occured for file within a watched directory */
> ++		path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
> ++	} else {
> ++		/* File event occured */
> ++		path = NIH_MUST (nih_strdup (NULL, handle->path));
> ++	}
> + 
> + 	/* Check the filter */
> + 	if (watch->filter && watch->filter (watch->data, path,
> +--- libnih-1.0.3.orig/nih/hash.h
> ++++ libnih-1.0.3/nih/hash.h
> +@@ -141,7 +141,7 @@
> +  * @hash: hash table to iterate,
> +  * @iter: name of iterator variable.
> +  *
> +- * Expans to nested for statements that iterate over each entry in each
> ++ * Expands to nested for statements that iterate over each entry in each
> +  * bin of @hash, except for the bin head pointer, setting @iter to each
> +  * entry for the block within the loop.  A variable named _ at iter_i is used
> +  * to iterate the hash bins.
> +@@ -203,7 +203,7 @@
> + 				   NihKeyFunction key_function,
> + 				   NihHashFunction hash_function,
> + 				   NihCmpFunction cmp_function)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NihList *   nih_hash_add          (NihHash *hash, NihList *entry);
> + NihList *   nih_hash_add_unique   (NihHash *hash, NihList *entry);
> +--- libnih-1.0.3.orig/nih/main.h
> ++++ libnih-1.0.3/nih/main.h
> +@@ -138,7 +138,7 @@
> + 
> + NihMainLoopFunc *nih_main_loop_add_func  (const void *parent,
> + 					  NihMainLoopCb callback, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void             nih_main_term_signal    (void *data, NihSignal *signal);
> + 
> +--- libnih-1.0.3.orig/nih/command.h
> ++++ libnih-1.0.3/nih/command.h
> +@@ -123,7 +123,7 @@
> + 
> + NihCommand *nih_command_join   (const void *parent,
> + 				const NihCommand *a, const NihCommand *b)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih/config.h
> ++++ libnih-1.0.3/nih/config.h
> +@@ -140,10 +140,10 @@
> + char *    nih_config_next_token      (const void *parent, const char *file,
> + 				      size_t len, size_t *pos, size_t *lineno,
> + 				      const char *delim, int dequote)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *    nih_config_next_arg        (const void *parent, const char *file,
> + 				      size_t len, size_t *pos, size_t *lineno)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + void      nih_config_next_line       (const char *file, size_t len,
> + 				      size_t *pos, size_t *lineno);
> + 
> +@@ -155,15 +155,15 @@
> + 
> + char **   nih_config_parse_args      (const void *parent, const char *file,
> + 				      size_t len, size_t *pos, size_t *lineno)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *    nih_config_parse_command   (const void *parent, const char *file,
> + 				      size_t len, size_t *pos, size_t *lineno)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    nih_config_parse_block     (const void *parent, const char *file,
> + 				      size_t len, size_t *pos, size_t *lineno,
> + 				      const char *type)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + int       nih_config_skip_block      (const char *file, size_t len,
> + 				      size_t *lineno, size_t *pos,
> + 				      const char *type, size_t *endpos)
> +--- libnih-1.0.3.orig/nih/io.c
> ++++ libnih-1.0.3/nih/io.c
> +@@ -2,8 +2,8 @@
> +  *
> +  * io.c - file and socket input/output handling
> +  *
> +- * Copyright © 2009 Scott James Remnant <scott at netsplit.com>.
> +- * Copyright © 2009 Canonical Ltd.
> ++ * Copyright © 2011 Scott James Remnant <scott at netsplit.com>.
> ++ * Copyright © 2011 Canonical Ltd.
> +  *
> +  * This program is free software; you can redistribute it and/or modify
> +  * it under the terms of the GNU General Public License version 2, as
> +@@ -165,6 +165,7 @@
> + 	nih_assert (readfds != NULL);
> + 	nih_assert (writefds != NULL);
> + 	nih_assert (exceptfds != NULL);
> ++	nih_assert (*nfds <= FD_SETSIZE);
> + 
> + 	nih_io_init ();
> + 
> +@@ -186,6 +187,9 @@
> + 			*nfds = nih_max (*nfds, watch->fd + 1);
> + 		}
> + 	}
> ++
> ++	/* Re-check in case we exceeded the limit in the loop */
> ++	nih_assert (*nfds <= FD_SETSIZE);
> + }
> + 
> + /**
> +@@ -901,7 +905,7 @@
> +  * read and placed into the receive buffer or queue, and the reader function
> +  * is called if set.
> +  *
> +- * Any data or messaages in the send buffer or queue are written out if the
> ++ * Any data or messages in the send buffer or queue are written out if the
> +  * @events includes NIH_IO_WRITE.
> +  *
> +  * Errors are handled when data is read, and result in the error handled
> +@@ -1211,7 +1215,7 @@
> +  * This function is called when the local end of a file descriptor being
> +  * managed by NihIo should be closed.  Usually this is because the remote
> +  * end has been closed (without error) but it can also be because no
> +- * error handler was given
> ++ * error handler was given.
> +  *
> +  * Normally this just calls the close handler, or if not available, it
> +  * closes the file descriptor and frees the structure (which may be
> +@@ -1291,7 +1295,7 @@
> +  * @io: structure to be destroyed.
> +  *
> +  * Closes the file descriptor associated with an NihIo structure so that
> +- * the structure can be freed.  IF an error is caught by closing the
> ++ * the structure can be freed.  If an error is caught by closing the
> +  * descriptor, the error handler is called instead of the error being raised;
> +  * this allows you to group your error handling in one place rather than
> +  * special-case close.
> +--- libnih-1.0.3.orig/nih/watch.h
> ++++ libnih-1.0.3/nih/watch.h
> +@@ -156,7 +156,7 @@
> + 			     NihCreateHandler create_handler,
> + 			     NihModifyHandler modify_handler,
> + 			     NihDeleteHandler delete_handler, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int       nih_watch_add     (NihWatch *watch, const char *path, int subdirs)
> + 	__attribute__ ((warn_unused_result));
> +--- libnih-1.0.3.orig/nih/tree.h
> ++++ libnih-1.0.3/nih/tree.h
> +@@ -344,9 +344,9 @@
> + 
> + void          nih_tree_init           (NihTree *tree);
> + NihTree *     nih_tree_new            (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + NihTreeEntry *nih_tree_entry_new      (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NihTree *     nih_tree_add            (NihTree *tree, NihTree *node,
> + 				       NihTreeWhere where);
> +--- libnih-1.0.3.orig/nih/file.c
> ++++ libnih-1.0.3/nih/file.c
> +@@ -65,7 +65,7 @@
> + /* Prototypes for static functions */
> + static char **nih_dir_walk_scan  (const char *path, NihFileFilter filter,
> + 				  void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + static int    nih_dir_walk_visit (const char *dirname, NihList *dirs,
> + 				  const char *path, NihFileFilter filter,
> + 				  NihFileVisitor visitor,
> +@@ -619,6 +619,8 @@
> + 	struct dirent  *ent;
> + 	char          **paths;
> + 	size_t          npaths;
> ++	int             isdir;
> ++	struct stat     statbuf;
> + 
> + 	nih_assert (path != NULL);
> + 
> +@@ -640,7 +642,15 @@
> + 		subpath = NIH_MUST (nih_sprintf (NULL, "%s/%s",
> + 						 path, ent->d_name));
> + 
> +-		if (filter && filter (data, subpath, ent->d_type == DT_DIR))
> ++		if (ent->d_type == DT_UNKNOWN) {
> ++			if ( lstat (subpath, &statbuf))
> ++				isdir = 0;
> ++			else
> ++				isdir = S_ISDIR(statbuf.st_mode);
> ++		} else
> ++			isdir = ent->d_type == DT_DIR;
> ++
> ++		if (filter && filter (data, subpath, isdir))
> + 			continue;
> + 
> + 		NIH_MUST (nih_str_array_addp (&paths, NULL, &npaths, subpath));
> +--- libnih-1.0.3.orig/nih/alloc.c
> ++++ libnih-1.0.3/nih/alloc.c
> +@@ -119,8 +119,7 @@
> + static inline int          nih_alloc_context_free   (NihAllocCtx *ctx);
> + 
> + static inline NihAllocRef *nih_alloc_ref_new        (NihAllocCtx *parent,
> +-						     NihAllocCtx *child)
> +-	__attribute__ ((malloc));
> ++						     NihAllocCtx *child);
> + static inline void         nih_alloc_ref_free       (NihAllocRef *ref);
> + static inline NihAllocRef *nih_alloc_ref_lookup     (NihAllocCtx *parent,
> + 						     NihAllocCtx *child);
> +--- libnih-1.0.3.orig/nih/timer.h
> ++++ libnih-1.0.3/nih/timer.h
> +@@ -59,7 +59,7 @@
> +  * @months: months (1-12),
> +  * @wdays: days of week (0-7).
> +  *
> +- * Indidcates when scheduled timers should be run, each member is a bit
> ++ * Indicates when scheduled timers should be run, each member is a bit
> +  * field where the bit is 1 if the timer should be run for that value and
> +  * 0 if not.
> +  **/
> +@@ -117,14 +117,14 @@
> + 
> + NihTimer *nih_timer_add_timeout   (const void *parent, time_t timeout,
> + 				   NihTimerCb callback, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + NihTimer *nih_timer_add_periodic  (const void *parent, time_t period,
> + 				   NihTimerCb callback, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + NihTimer *nih_timer_add_scheduled (const void *parent,
> + 				   NihTimerSchedule *schedule,
> + 				   NihTimerCb callback, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NihTimer *nih_timer_next_due       (void);
> + void      nih_timer_poll           (void);
> +--- libnih-1.0.3.orig/nih/config.c
> ++++ libnih-1.0.3/nih/config.c
> +@@ -2,8 +2,8 @@
> +  *
> +  * config.c - configuration file parsing
> +  *
> +- * Copyright © 2009 Scott James Remnant <scott at netsplit.com>.
> +- * Copyright © 2009 Canonical Ltd.
> ++ * Copyright © 2011 Scott James Remnant <scott at netsplit.com>.
> ++ * Copyright © 2011 Canonical Ltd.
> +  *
> +  * This program is free software; you can redistribute it and/or modify
> +  * it under the terms of the GNU General Public License version 2, as
> +@@ -657,7 +657,7 @@
> +  * of the returned string are freed, the returned string will also be
> +  * freed.
> +  *
> +- * Returns: the command found or NULL on raised error.
> ++ * Returns: the newly allocated command found or NULL on raised error.
> +  **/
> + char *
> + nih_config_parse_command (const void *parent,
> +@@ -714,7 +714,7 @@
> +  * @lineno: line number,
> +  * @type: block identifier.
> +  *
> +- * Extracts a block of text from @line, stopping when the pharse "end @type"
> ++ * Extracts a block of text from @line, stopping when the phrase "end @type"
> +  * is encountered without any quotes or blackslash escaping within it.
> +  *
> +  * @file may be a memory mapped file, in which case @pos should be given
> +@@ -950,7 +950,7 @@
> + 		return FALSE;
> + 
> + 	/* Must be whitespace after */
> +-	if (! strchr (NIH_CONFIG_WS, file[p + 3]))
> ++	if (file[p + 3] && ! strchr (NIH_CONFIG_WS, file[p + 3]))
> + 		return FALSE;
> + 
> + 	/* Find the second word */
> +--- libnih-1.0.3.orig/nih/option.h
> ++++ libnih-1.0.3/nih/option.h
> +@@ -124,11 +124,11 @@
> + char **    nih_option_parser         (const void *parent,
> + 				      int argc, char *argv[],
> + 				      NihOption *options, int break_nonopt)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NihOption *nih_option_join           (const void *parent,
> + 				      const NihOption *a, const NihOption *b)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int        nih_option_count          (NihOption *option, const char *arg);
> + int        nih_option_int            (NihOption *option, const char *arg);
> +--- libnih-1.0.3.orig/nih/signal.h
> ++++ libnih-1.0.3/nih/signal.h
> +@@ -76,7 +76,7 @@
> + 
> + NihSignal * nih_signal_add_handler (const void *parent, int signum,
> + 				   NihSignalHandler handler, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void        nih_signal_handler     (int signum);
> + void        nih_signal_poll        (void);
> +--- libnih-1.0.3.orig/nih/list.h
> ++++ libnih-1.0.3/nih/list.h
> +@@ -37,7 +37,7 @@
> +  * after a known entry, and remove an entry from the list.
> +  *
> +  * List entries may be created in one of two ways.  The most common is to
> +- * embed the NihList structure as the frist member of your own structure,
> ++ * embed the NihList structure as the first member of your own structure,
> +  * and initialise it with nih_list_init() after allocating the structure.
> +  * Alternatively you may create NihListEntry structures with
> +  * nih_list_entry_new() and point at your own data from them.
> +@@ -196,10 +196,10 @@
> + 
> + void          nih_list_init      (NihList *entry);
> + NihList *     nih_list_new       (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NihListEntry *nih_list_entry_new (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + 
> + NihList *     nih_list_add       (NihList *list, NihList *entry);
> +--- libnih-1.0.3.orig/nih/logging.c
> ++++ libnih-1.0.3/nih/logging.c
> +@@ -39,11 +39,11 @@
> + 
> + 
> + /**
> +- * __abort_msg:
> ++ * __nih_abort_msg:
> +  *
> +- * A glibc variable that keeps the assertion message in the core dump.
> ++ * A variable that keeps the assertion message in the core dump.
> +  **/
> +-extern char *__abort_msg __attribute__ ((weak));
> ++char *__nih_abort_msg = NULL;
> + 
> + /**
> +  * logger:
> +@@ -114,19 +114,16 @@
> +  * nih_log_abort_message:
> +  * @message: message to be logged.
> +  *
> +- * Save @message in the glibc __abort_msg variable so it can be retrieved
> ++ * Save @message in the __nih_abort_msg variable so it can be retrieved
> +  * by debuggers if we should crash at this point.
> +  **/
> + static void
> + nih_log_abort_message (const char *message)
> + {
> +-	if (! &__abort_msg)
> +-		return;
> ++	if (__nih_abort_msg)
> ++		nih_discard (__nih_abort_msg);
> + 
> +-	if (__abort_msg)
> +-		nih_discard (__abort_msg);
> +-
> +-	__abort_msg = NIH_MUST (nih_strdup (NULL, message));
> ++	__nih_abort_msg = NIH_MUST (nih_strdup (NULL, message));
> + }
> + 
> + /**
> +--- libnih-1.0.3.orig/nih/test_files.h
> ++++ libnih-1.0.3/nih/test_files.h
> +@@ -1,7 +1,7 @@
> + /* libnih
> +  *
> +- * Copyright © 2009 Scott James Remnant <scott at netsplit.com>.
> +- * Copyright © 2009 Canonical Ltd.
> ++ * Copyright © 2011 Scott James Remnant <scott at netsplit.com>.
> ++ * Copyright © 2011 Canonical Ltd.
> +  *
> +  * This program is free software; you can redistribute it and/or modify
> +  * it under the terms of the GNU General Public License version 2, as
> +@@ -39,7 +39,7 @@
> +  * TEST_FILENAME:
> +  * @_var: variable to store filename in.
> +  *
> +- * Generate a filename that may be used for testing, it's unlinked it if
> ++ * Generate a filename that may be used for testing, it's unlinked if it
> +  * exists and it's up to you to unlink it when done.  @_var should be at
> +  * least PATH_MAX long.
> +  **/
> +--- libnih-1.0.3.orig/nih/test_process.h
> ++++ libnih-1.0.3/nih/test_process.h
> +@@ -36,7 +36,7 @@
> +  * Spawn a child in which a test can be performed without affecting the
> +  * main flow of the process.  The pid of the child is stored in @_pid.
> +  *
> +- * This macro ensures that the child has begun exectution before the
> ++ * This macro ensures that the child has begun execution before the
> +  * parent is allowed to continue through the usual use of a pipe.
> +  *
> +  * A block of code should follow this macro, which is the code that will
> +--- libnih-1.0.3.orig/nih/child.h
> ++++ libnih-1.0.3/nih/child.h
> +@@ -98,7 +98,7 @@
> + NihChildWatch *nih_child_add_watch (const void *parent, pid_t pid,
> + 				    NihChildEvents events,
> + 				    NihChildHandler handler, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void           nih_child_poll      (void);
> + 
> +--- libnih-1.0.3.orig/nih/alloc.h
> ++++ libnih-1.0.3/nih/alloc.h
> +@@ -299,7 +299,7 @@
> +  * It is permissible to take references to foo within its scope, or by
> +  * functions called, in which case it will not be freed.  Also it is
> +  * generally nonsensical to allocate with a parent, since this too will
> +- * prevent it from beign freed.
> ++ * prevent it from being freed.
> +  **/
> + #define nih_local __attribute__ ((cleanup(_nih_discard_local)))
> + 
> +@@ -307,11 +307,11 @@
> + NIH_BEGIN_EXTERN
> + 
> + void * nih_alloc                     (const void *parent, size_t size)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void * nih_realloc                   (void *ptr, const void *parent,
> + 				      size_t size)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int    nih_free                      (void *ptr);
> + int    nih_discard                   (void *ptr);
> +--- libnih-1.0.3.orig/nih/io.h
> ++++ libnih-1.0.3/nih/io.h
> +@@ -269,7 +269,7 @@
> + NihIoWatch *  nih_io_add_watch           (const void *parent, int fd,
> + 					  NihIoEvents events,
> + 					  NihIoWatcher watcher, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void          nih_io_select_fds          (int *nfds, fd_set *readfds,
> + 					  fd_set *writefds, fd_set *exceptfds);
> +@@ -278,12 +278,12 @@
> + 
> + 
> + NihIoBuffer * nih_io_buffer_new          (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int           nih_io_buffer_resize       (NihIoBuffer *buffer, size_t grow);
> + char *        nih_io_buffer_pop          (const void *parent,
> + 					  NihIoBuffer *buffer, size_t *len)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + void          nih_io_buffer_shrink       (NihIoBuffer *buffer, size_t len);
> + int           nih_io_buffer_push         (NihIoBuffer *buffer,
> + 					  const char *str, size_t len)
> +@@ -291,7 +291,7 @@
> + 
> + 
> + NihIoMessage *nih_io_message_new         (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int           nih_io_message_add_control (NihIoMessage *message, int level,
> + 					  int type, socklen_t len,
> +@@ -300,7 +300,7 @@
> + 
> + NihIoMessage *nih_io_message_recv        (const void *parent, int fd,
> + 					  size_t *len)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + ssize_t       nih_io_message_send        (NihIoMessage *message, int fd)
> + 	__attribute__ ((warn_unused_result));
> + 
> +@@ -310,7 +310,7 @@
> + 					  NihIoCloseHandler close_handler,
> + 					  NihIoErrorHandler error_handler,
> + 					  void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + void          nih_io_shutdown            (NihIo *io);
> + int           nih_io_destroy             (NihIo *io);
> + 
> +@@ -319,14 +319,14 @@
> + 
> + char *        nih_io_read                (const void *parent, NihIo *io,
> + 					  size_t *len)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + int           nih_io_write               (NihIo *io, const char *str,
> + 					  size_t len)
> + 	__attribute__ ((warn_unused_result));
> + 
> + char *        nih_io_get                 (const void *parent, NihIo *io,
> + 					  const char *delim)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int           nih_io_printf              (NihIo *io, const char *format, ...)
> + 	__attribute__ ((warn_unused_result, format (printf, 2, 3)));
> +--- libnih-1.0.3.orig/nih/test_output.h
> ++++ libnih-1.0.3/nih/test_output.h
> +@@ -61,10 +61,10 @@
> + 
> + /**
> +  * TEST_FEATURE:
> +- * @_feat: name of function feature being tested.
> ++ * @_feat: name of function or group feature being tested.
> +  *
> +- * Output a message indicating that a sub-test of a function is being
> +- * performed, specifically the feature named _feat.
> ++ * Output a message indicating that a sub-test of a function or
> ++ * group is being performed, specifically the feature named _feat.
> +  **/
> + #define TEST_FEATURE(_feat) \
> + 	printf ("...%s\n", _feat);
> +--- libnih-1.0.3.orig/nih/error.h
> ++++ libnih-1.0.3/nih/error.h
> +@@ -1,7 +1,7 @@
> + /* libnih
> +  *
> +- * Copyright © 2009 Scott James Remnant <scott at netsplit.com>.
> +- * Copyright © 2009 Canonical Ltd.
> ++ * Copyright © 2011 Scott James Remnant <scott at netsplit.com>.
> ++ * Copyright © 2011 Canonical Ltd.
> +  *
> +  * This program is free software; you can redistribute it and/or modify
> +  * it under the terms of the GNU General Public License version 2, as
> +@@ -111,7 +111,7 @@
> +  * @message: human-readable message.
> +  *
> +  * Raises an error with the given details in the current error context,
> +- * if an unhandled error already exists then an error message is emmitted
> ++ * if an unhandled error already exists then an error message is emitted
> +  * through the logging system; you should try to avoid this.
> +  *
> +  * @message should be a static string, as it will not be freed when the
> +@@ -126,7 +126,7 @@
> +  * @format: format string for human-readable message.
> +  *
> +  * Raises an error with the given details in the current error context,
> +- * if an unhandled error already exists then an error message is emmitted
> ++ * if an unhandled error already exists then an error message is emitted
> +  * through the logging system; you should try to avoid this.
> +  *
> +  * The human-readable message for the error is parsed according to @format,
> +@@ -140,7 +140,7 @@
> +  * nih_error_raise_system:
> +  *
> +  * Raises an error with details taken from the current value of errno,
> +- * if an unhandled error already exists then an error message is emmitted
> ++ * if an unhandled error already exists then an error message is emitted
> +  * through the logging system; you should try to avoid this.
> +  **/
> + #define nih_error_raise_system() \
> +@@ -162,7 +162,7 @@
> +  * @error: existing object to raise.
> +  *
> +  * Raises the existing error object in the current error context,
> +- * if an unhandled error already exists then an error message is emmitted
> ++ * if an unhandled error already exists then an error message is emitted
> +  * through the logging system; you should try to avoid this.
> +  *
> +  * This is normally used to raise a taken error that has not been handled,
> +@@ -182,7 +182,7 @@
> +  * @message: human-readable message.
> +  *
> +  * Raises an error with the given details in the current error context,
> +- * if an unhandled error already exists then an error message is emmitted
> ++ * if an unhandled error already exists then an error message is emitted
> +  * through the logging system; you should try to avoid this.
> +  *
> +  * Will return from the current function with @retval, which may be left
> +@@ -199,7 +199,7 @@
> +  * @retval: return value for function.
> +  *
> +  * Raises an error with details taken from the current value of errno,
> +- * if an unhandled error already exists then an error message is emmitted
> ++ * if an unhandled error already exists then an error message is emitted
> +  * through the logging system; you should try to avoid this.
> +  *
> +  * Will return from the current function with @retval, which may be left
> +--- libnih-1.0.3.orig/nih/string.h
> ++++ libnih-1.0.3/nih/string.h
> +@@ -35,60 +35,60 @@
> + NIH_BEGIN_EXTERN
> + 
> + char * nih_sprintf          (const void *parent, const char *format, ...)
> +-	__attribute__ ((format (printf, 2, 3), warn_unused_result, malloc));
> ++	__attribute__ ((format (printf, 2, 3), warn_unused_result));
> + 
> + char * nih_vsprintf         (const void *parent, const char *format,
> + 			     va_list args)
> +-	__attribute__ ((format (printf, 2, 0), warn_unused_result, malloc));
> ++	__attribute__ ((format (printf, 2, 0), warn_unused_result));
> + 
> + char * nih_strdup           (const void *parent, const char *str)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char * nih_strndup          (const void *parent, const char *str, size_t len)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char * nih_strcat           (char **str, const void *parent, const char *src)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char * nih_strncat          (char **str, const void *parent, const char *src,
> + 			     size_t len)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char * nih_strcat_sprintf   (char **str, const void *parent,
> + 			     const char *format, ...)
> +-	__attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> ++	__attribute__ ((format (printf, 3, 4), warn_unused_result));
> + char * nih_strcat_vsprintf  (char **str, const void *parent,
> + 			     const char *format, va_list args)
> +-	__attribute__ ((format (printf, 3, 0), warn_unused_result, malloc));
> ++	__attribute__ ((format (printf, 3, 0), warn_unused_result));
> + 
> + char **nih_str_split        (const void *parent, const char *str,
> + 			     const char *delim, int repeat)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char **nih_str_array_new    (const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char **nih_str_array_add    (char ***array, const void *parent, size_t *len,
> + 			     const char *str)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char **nih_str_array_addn   (char ***array, const void *parent, size_t *len,
> + 			     const char *str, size_t strlen)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char **nih_str_array_addp   (char ***array, const void *parent, size_t *len,
> + 			     void *ptr)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char **nih_str_array_copy   (const void *parent, size_t *len,
> + 			     char * const *array)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char **nih_str_array_append (char ***array, const void *parent, size_t *len,
> + 			     char * const *args)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char * nih_str_wrap         (const void *parent, const char *str, size_t len,
> + 		             size_t first_indent, size_t indent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + size_t nih_str_screen_width (void);
> + char * nih_str_screen_wrap  (const void *parent, const char *str,
> + 			     size_t first_indent, size_t indent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih/string.c
> ++++ libnih-1.0.3/nih/string.c
> +@@ -405,7 +405,7 @@
> + 		const char  *ptr;
> + 
> + 		/* Skip initial delimiters */
> +-		while (repeat && strchr (delim, *str))
> ++		while (repeat && *str && strchr (delim, *str))
> + 			str++;
> + 
> + 		/* Find the end of the token */
> +@@ -413,6 +413,13 @@
> + 		while (*str && (! strchr (delim, *str)))
> + 			str++;
> + 
> ++		/* Don't create an empty string array element in repeat
> ++		 * mode if there is no token (as a result of a
> ++		 * duplicated delimiter character).
> ++		 */
> ++		if (repeat && (str == ptr))
> ++			continue;
> ++
> + 		if (! nih_str_array_addn (&array, parent, &len,
> + 					  ptr, str - ptr)) {
> + 			nih_free (array);
> +--- libnih-1.0.3.orig/nih/file.h
> ++++ libnih-1.0.3/nih/file.h
> +@@ -82,7 +82,7 @@
> + 
> + char *nih_file_read         (const void *parent, const char *path,
> + 			     size_t *length)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void *nih_file_map          (const char *path, int flags, size_t *length)
> + 	__attribute__ ((warn_unused_result));
> +--- libnih-1.0.3.orig/nih/tests/test_option.c
> ++++ libnih-1.0.3/nih/tests/test_option.c
> +@@ -1574,7 +1574,7 @@
> + 		output = tmpfile ();
> + 		TEST_CHILD (pid) {
> + 			TEST_DIVERT_STDOUT (output) {
> +-				char **args;
> ++				char **args __attribute__((unused));
> + 
> + 				args = nih_option_parser (NULL, argc, argv,
> + 							  options, FALSE);
> +@@ -1652,7 +1652,7 @@
> + 			unsetenv ("COLUMNS");
> + 
> + 			TEST_DIVERT_STDOUT (output) {
> +-				char **args;
> ++				char **args __attribute__((unused));
> + 
> + 				args = nih_option_parser (NULL, argc, argv,
> + 							  options, FALSE);
> +--- libnih-1.0.3.orig/nih/tests/test_logging.c
> ++++ libnih-1.0.3/nih/tests/test_logging.c
> +@@ -31,7 +31,7 @@
> + #include <nih/main.h>
> + 
> + 
> +-extern char *__abort_msg __attribute__ ((weak));
> ++extern char *__nih_abort_msg;
> + 
> + static NihLogLevel last_priority = NIH_LOG_UNKNOWN;
> + static char *      last_message = NULL;
> +@@ -156,68 +156,63 @@
> + 	}
> + 
> + 
> +-	/* Check that a fatal message is also stored in the glibc __abort_msg
> ++	/* Check that a fatal message is also stored in the __nih_abort_msg
> + 	 * variable.
> + 	 */
> +-	if (&__abort_msg) {
> +-		TEST_FEATURE ("with fatal message");
> +-		TEST_ALLOC_FAIL {
> +-			__abort_msg = NULL;
> +-			last_priority = NIH_LOG_UNKNOWN;
> +-			last_message = NULL;
> +-
> +-			ret = nih_log_message (NIH_LOG_FATAL,
> +-					       "message with %s %d formatting",
> +-					       "some", 20);
> +-
> +-			TEST_EQ (ret, 0);
> +-			TEST_EQ (last_priority, NIH_LOG_FATAL);
> +-			TEST_EQ_STR (last_message, "message with some 20 formatting");
> +-
> +-			TEST_NE_P (__abort_msg, NULL);
> +-			TEST_ALLOC_PARENT (__abort_msg, NULL);
> +-			TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
> ++	TEST_FEATURE ("with fatal message");
> ++	TEST_ALLOC_FAIL {
> ++		__nih_abort_msg = NULL;
> ++		last_priority = NIH_LOG_UNKNOWN;
> ++		last_message = NULL;
> + 
> +-			free (last_message);
> +-		}
> ++		ret = nih_log_message (NIH_LOG_FATAL,
> ++				"message with %s %d formatting",
> ++				"some", 20);
> + 
> ++		TEST_EQ (ret, 0);
> ++		TEST_EQ (last_priority, NIH_LOG_FATAL);
> ++		TEST_EQ_STR (last_message, "message with some 20 formatting");
> + 
> +-		/* Check that a fatal message can safely overwrite one already stored
> +-		 * in the glibc __abort_msg variable.
> +-		 */
> +-		TEST_FEATURE ("with second fatal message");
> +-		TEST_ALLOC_FAIL {
> +-			TEST_ALLOC_SAFE {
> +-				msg = nih_strdup (NULL, "test");
> +-			}
> +-
> +-			__abort_msg = msg;
> +-			TEST_FREE_TAG (msg);
> +-
> +-			last_priority = NIH_LOG_UNKNOWN;
> +-			last_message = NULL;
> +-
> +-			ret = nih_log_message (NIH_LOG_FATAL,
> +-					       "message with %s %d formatting",
> +-					       "some", 20);
> +-
> +-			TEST_EQ (ret, 0);
> +-			TEST_EQ (last_priority, NIH_LOG_FATAL);
> +-			TEST_EQ_STR (last_message, "message with some 20 formatting");
> +-
> +-			TEST_FREE (msg);
> +-
> +-			TEST_NE_P (__abort_msg, NULL);
> +-			TEST_ALLOC_PARENT (__abort_msg, NULL);
> +-			TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
> ++		TEST_NE_P (__nih_abort_msg, NULL);
> ++		TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
> ++		TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
> + 
> +-			free (last_message);
> +-		}
> +-	} else {
> +-		printf ("SKIP: __abort_msg not available\n");
> ++		free (last_message);
> + 	}
> + 
> + 
> ++	/* Check that a fatal message can safely overwrite one already stored
> ++	 * in the __nih_abort_msg variable.
> ++	 */
> ++	TEST_FEATURE ("with second fatal message");
> ++	TEST_ALLOC_FAIL {
> ++		TEST_ALLOC_SAFE {
> ++			msg = nih_strdup (NULL, "test");
> ++		}
> ++
> ++		__nih_abort_msg = msg;
> ++		TEST_FREE_TAG (msg);
> ++
> ++		last_priority = NIH_LOG_UNKNOWN;
> ++		last_message = NULL;
> ++
> ++		ret = nih_log_message (NIH_LOG_FATAL,
> ++				"message with %s %d formatting",
> ++				"some", 20);
> ++
> ++		TEST_EQ (ret, 0);
> ++		TEST_EQ (last_priority, NIH_LOG_FATAL);
> ++		TEST_EQ_STR (last_message, "message with some 20 formatting");
> ++
> ++		TEST_FREE (msg);
> ++
> ++		TEST_NE_P (__nih_abort_msg, NULL);
> ++		TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
> ++		TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
> ++
> ++		free (last_message);
> ++	}
> ++
> + 	/* Check that the nih_debug macro wraps the call properly and
> + 	 * includes the function in which the message occurred.
> + 	 */
> +--- libnih-1.0.3.orig/nih/tests/test_hash.c
> ++++ libnih-1.0.3/nih/tests/test_hash.c
> +@@ -470,7 +470,8 @@
> + test_lookup (void)
> + {
> + 	NihHash *hash;
> +-	NihList *entry1, *entry2, *entry3, *ptr;
> ++	NihList *entry1, *entry2, *ptr;
> ++	NihList *entry3 __attribute__((unused));
> + 
> + 	TEST_FUNCTION ("nih_hash_lookup");
> + 	hash = nih_hash_string_new (NULL, 0);
> +--- libnih-1.0.3.orig/nih/tests/test_main.c
> ++++ libnih-1.0.3/nih/tests/test_main.c
> +@@ -457,7 +457,7 @@
> + test_main_loop (void)
> + {
> + 	NihMainLoopFunc *func;
> +-	NihTimer        *timer;
> ++	NihTimer        *timer __attribute__((unused));
> + 	int              ret;
> + 
> + 	/* Check that we can run through the main loop, and that the
> +--- libnih-1.0.3.orig/nih/tests/test_watch.c
> ++++ libnih-1.0.3/nih/tests/test_watch.c
> +@@ -2,8 +2,8 @@
> +  *
> +  * test_watch.c - test suite for nih/watch.c
> +  *
> +- * Copyright © 2009 Scott James Remnant <scott at netsplit.com>.
> +- * Copyright © 2009 Canonical Ltd.
> ++ * Copyright © 2011 Scott James Remnant <scott at netsplit.com>.
> ++ * Copyright © 2011 Canonical Ltd.
> +  *
> +  * This program is free software; you can redistribute it and/or modify
> +  * it under the terms of the GNU General Public License version 2, as
> +@@ -39,6 +39,8 @@
> + #include <nih/error.h>
> + #include <nih/logging.h>
> + 
> ++/* Read "The Hitchhikers Guide to the Galaxy" */
> ++#define FILTER_VALUE 42
> + 
> + static int
> + my_filter (void       *data,
> +@@ -54,6 +56,26 @@
> + 	return FALSE;
> + }
> + 
> ++/* Set by my_filter2 () so it knows if it has already been called */
> ++static int my_filter2_called = 0;
> ++
> ++static int
> ++my_filter2 (int       *value,
> ++	   const char *path,
> ++	   int         is_dir)
> ++{
> ++	/* we only want to toggle the value once */
> ++	if (my_filter2_called)
> ++		return TRUE;
> ++
> ++	my_filter2_called = 1;
> ++
> ++	nih_assert (value && *value == FILTER_VALUE);
> ++	*value = 0;
> ++
> ++	return FALSE;
> ++}
> ++
> + static int create_called = 0;
> + static int modify_called = 0;
> + static int delete_called = 0;
> +@@ -553,6 +575,44 @@
> + 		nih_free (watch);
> + 	}
> + 
> ++	/* Ensure the file filter gets passed the correct data pointer.
> ++	 */
> ++	TEST_FEATURE ("with filter and data");
> ++
> ++	/* Ensure we have a new directory */
> ++	TEST_FILENAME (dirname);
> ++	mkdir (dirname, 0755);
> ++
> ++	/* Create a single file */
> ++	strcpy (filename, dirname);
> ++	strcat (filename, "/foo");
> ++
> ++	fd = fopen (filename, "w");
> ++	fprintf (fd, "test\n");
> ++	fclose (fd);
> ++
> ++	TEST_ALLOC_FAIL {
> ++		int watch_data = FILTER_VALUE;
> ++
> ++		/* Reset required to appease TEST_ALLOC_FAIL */
> ++		my_filter2_called = 0;
> ++
> ++		watch = nih_watch_new (NULL, dirname,
> ++				TRUE, TRUE,
> ++				(NihFileFilter)my_filter2,
> ++				NULL, NULL, NULL,
> ++				&watch_data);
> ++
> ++		TEST_NE_P (watch, NULL);
> ++
> ++		/* Ensure the filter was called and changed the value */
> ++
> ++		TEST_NE (my_filter2_called, 0);
> ++		TEST_EQ (watch_data, 0);
> ++
> ++		nih_free (watch);
> ++	}
> ++
> + 	strcpy (filename, dirname);
> + 	strcat (filename, "/bar");
> + 	chmod (filename, 0755);
> +@@ -946,13 +1006,82 @@
> + 	nih_error_init ();
> + 
> + 	TEST_FILENAME (dirname);
> +-	mkdir (dirname, 0755);
> ++	TEST_EQ (mkdir (dirname, 0755), 0);
> + 
> +-	watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
> +-			       my_create_handler, my_modify_handler,
> ++	TEST_FEATURE ("with watched file");
> ++	strcpy (filename, dirname);
> ++	strcat (filename, "/foo");
> ++
> ++	/* Create file first since we don't set a create handler on the
> ++	 * watch.
> ++	 */
> ++	fd = fopen (filename, "w");
> ++	fprintf (fd, "bar\n");
> ++	fclose (fd);
> ++
> ++	create_called = 0;
> ++	modify_called = 0;
> ++	delete_called = 0;
> ++	logger_called = 0;
> ++	last_path  = NULL;
> ++	last_watch = NULL;
> ++	last_data  = NULL;
> ++
> ++	watch = nih_watch_new (NULL, filename, FALSE, FALSE, NULL,
> ++			       NULL, my_modify_handler,
> + 			       my_delete_handler, &watch);
> ++	TEST_NE_P (watch, NULL);
> ++
> ++	/* Now, modify the existing file to trigger the modify handler. */
> ++	fd = fopen (filename, "a+");
> ++	fprintf (fd, "baz\n");
> ++	fclose (fd);
> ++
> ++	nfds = 0;
> ++	FD_ZERO (&readfds);
> ++	FD_ZERO (&writefds);
> ++	FD_ZERO (&exceptfds);
> ++
> ++	nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
> ++	select (nfds, &readfds, &writefds, &exceptfds, NULL);
> ++	nih_io_handle_fds (&readfds, &writefds, &exceptfds);
> ++
> ++	TEST_EQ_STR (watch->path, filename);
> ++
> ++	/* Ensure no regression to old behaviour (LP:#777097) */
> ++	TEST_NE (last_path[ strlen(last_path) - 1 ], '/');
> ++
> ++	TEST_EQ_STR (last_path, filename);
> ++	TEST_EQ (modify_called, 1);
> ++
> ++	unlink (filename);
> ++
> ++	nfds = 0;
> ++	FD_ZERO (&readfds);
> ++	FD_ZERO (&writefds);
> ++	FD_ZERO (&exceptfds);
> ++
> ++	nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
> ++	select (nfds, &readfds, &writefds, &exceptfds, NULL);
> ++	nih_io_handle_fds (&readfds, &writefds, &exceptfds);
> + 
> ++	TEST_EQ (delete_called, 1);
> + 
> ++	rmdir (filename);
> ++	nih_free (last_path);
> ++
> ++	create_called = 0;
> ++	modify_called = 0;
> ++	delete_called = 0;
> ++	logger_called = 0;
> ++	last_path  = NULL;
> ++	last_watch = NULL;
> ++	last_data  = NULL;
> ++
> ++
> ++	watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
> ++			       my_create_handler, my_modify_handler,
> ++			       my_delete_handler, &watch);
> + 	/* Check that creating a file within the directory being watched
> + 	 * results in the create handler being called, and passed the full
> + 	 * path of the created file to it.
> +--- libnih-1.0.3.orig/nih/tests/test_string.c
> ++++ libnih-1.0.3/nih/tests/test_string.c
> +@@ -619,6 +619,215 @@
> + 		nih_free (array);
> + 	}
> + 
> ++	TEST_FEATURE ("with no repeat and multiple identical delimiter "
> ++			"characters at string start");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "\t\tthis is a test", " \t", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> ++		for (i = 0; i < 6; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "");
> ++		TEST_EQ_STR (array[1], "");
> ++		TEST_EQ_STR (array[2], "this");
> ++		TEST_EQ_STR (array[3], "is");
> ++		TEST_EQ_STR (array[4], "a");
> ++		TEST_EQ_STR (array[5], "test");
> ++		TEST_EQ_P (array[6], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple different delimiter "
> ++			"characters at string start");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, " \tthis is a test", " \t", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> ++		for (i = 0; i < 6; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "");
> ++		TEST_EQ_STR (array[1], "");
> ++		TEST_EQ_STR (array[2], "this");
> ++		TEST_EQ_STR (array[3], "is");
> ++		TEST_EQ_STR (array[4], "a");
> ++		TEST_EQ_STR (array[5], "test");
> ++		TEST_EQ_P (array[6], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple identical delimiter "
> ++			"characters within string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "this is   a\t\ttest", " \t", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 8);
> ++		for (i = 0; i < 7; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "this");
> ++		TEST_EQ_STR (array[1], "is");
> ++		TEST_EQ_STR (array[2], "");
> ++		TEST_EQ_STR (array[3], "");
> ++		TEST_EQ_STR (array[4], "a");
> ++		TEST_EQ_STR (array[5], "");
> ++		TEST_EQ_STR (array[6], "test");
> ++		TEST_EQ_P (array[7], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple different delimiter "
> ++			"characters within string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "this is \n\ta\ttest", " \t\n", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> ++		for (i = 0; i < 6; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "this");
> ++		TEST_EQ_STR (array[1], "is");
> ++		TEST_EQ_STR (array[2], "");
> ++		TEST_EQ_STR (array[3], "");
> ++		TEST_EQ_STR (array[4], "a");
> ++		TEST_EQ_STR (array[5], "test");
> ++		TEST_EQ_P (array[6], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple identical delimiter "
> ++			"characters at string end");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "this is a test  ", " \t", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
> ++		for (i = 0; i < 5; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "this");
> ++		TEST_EQ_STR (array[1], "is");
> ++		TEST_EQ_STR (array[2], "a");
> ++		TEST_EQ_STR (array[3], "test");
> ++		TEST_EQ_STR (array[4], "");
> ++		TEST_EQ_P (array[5], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple different delimiter "
> ++			"characters at string end");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "this is a test \t", " \t", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
> ++		for (i = 0; i < 5; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "this");
> ++		TEST_EQ_STR (array[1], "is");
> ++		TEST_EQ_STR (array[2], "a");
> ++		TEST_EQ_STR (array[3], "test");
> ++		TEST_EQ_STR (array[4], "");
> ++		TEST_EQ_P (array[5], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple identical delimiter "
> ++			"characters at beginning, middle and end of string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "   this is\n\n\na test\t\t\t", " \t\n", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 12);
> ++		for (i = 0; i < 11; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "");
> ++		TEST_EQ_STR (array[1], "");
> ++		TEST_EQ_STR (array[2], "");
> ++		TEST_EQ_STR (array[3], "this");
> ++		TEST_EQ_STR (array[4], "is");
> ++		TEST_EQ_STR (array[5], "");
> ++		TEST_EQ_STR (array[6], "");
> ++		TEST_EQ_STR (array[7], "a");
> ++		TEST_EQ_STR (array[8], "test");
> ++		TEST_EQ_STR (array[9], "");
> ++		TEST_EQ_STR (array[10], "");
> ++		TEST_EQ_P (array[11], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with no repeat and multiple different delimiter "
> ++			"characters at beginning, middle and end of string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, ": \nthis is\t \n:a test:\n ", "\n :\t", FALSE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 13);
> ++		for (i = 0; i < 12; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "");
> ++		TEST_EQ_STR (array[1], "");
> ++		TEST_EQ_STR (array[2], "");
> ++		TEST_EQ_STR (array[3], "this");
> ++		TEST_EQ_STR (array[4], "is");
> ++		TEST_EQ_STR (array[5], "");
> ++		TEST_EQ_STR (array[6], "");
> ++		TEST_EQ_STR (array[7], "");
> ++		TEST_EQ_STR (array[8], "a");
> ++		TEST_EQ_STR (array[9], "test");
> ++		TEST_EQ_STR (array[10], "");
> ++		TEST_EQ_STR (array[11], "");
> ++		TEST_EQ_P (array[12], NULL);
> ++
> ++		nih_free (array);
> ++	}
> + 
> + 	/* Check that we can split a string treating multiple consecutive
> + 	 * matching characters as a single separator to be skipped.
> +@@ -645,6 +854,177 @@
> + 		nih_free (array);
> + 	}
> + 
> ++	/* Check that we can split a string containing multiple
> ++	 * occurences of one of the delimiter characters at the
> ++	 * beginning of the string.
> ++	 */
> ++	TEST_FEATURE ("with repeat and multiple identical adjacent delimiter characters at string start");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "\n\nhello", " \t\r\n", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> ++		for (i = 0; i < 1; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_P (array[1], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple different adjacent delimiter characters at string start");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "\n\r hello", " \t\r\n", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> ++		for (i = 0; i < 1; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_P (array[1], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> ++			"characters within string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "hello\n\rworld", " \t\n\r", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
> ++		for (i = 0; i < 2; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_STR (array[1], "world");
> ++		TEST_EQ_P (array[2], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> ++			"characters within string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "hello\n\r\tworld", " \t\n\r", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
> ++		for (i = 0; i < 2; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_STR (array[1], "world");
> ++		TEST_EQ_P (array[2], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> ++			"characters at string end");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "hello\n\n\n\n\n\n\n", " \t\r\n", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> ++		for (i = 0; i < 1; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_P (array[1], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> ++			"characters at string end");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL, "hello \r\t\r\t\n ", " \t\r\n", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> ++		for (i = 0; i < 1; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_P (array[1], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> ++			"characters at beginning, middle and end of string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL,
> ++				"        hello\n\n\n,  world\n\n\n",
> ++				"\r\t\n ", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
> ++		for (i = 0; i < 3; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_STR (array[1], ",");
> ++		TEST_EQ_STR (array[2], "world");
> ++		TEST_EQ_P (array[3], NULL);
> ++
> ++		nih_free (array);
> ++	}
> ++
> ++	TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> ++			"characters at beginning, middle and end of string");
> ++	TEST_ALLOC_FAIL {
> ++		array = nih_str_split (NULL,
> ++				"\n    \r\thello\n\n\r , \n\t\rworld\t \r\n \n",
> ++				" \t\n\r", TRUE);
> ++
> ++		if (test_alloc_failed) {
> ++			TEST_EQ_P (array, NULL);
> ++			continue;
> ++		}
> ++
> ++		TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
> ++		for (i = 0; i < 3; i++)
> ++			TEST_ALLOC_PARENT (array[i], array);
> ++
> ++		TEST_EQ_STR (array[0], "hello");
> ++		TEST_EQ_STR (array[1], ",");
> ++		TEST_EQ_STR (array[2], "world");
> ++		TEST_EQ_P (array[3], NULL);
> ++
> ++		nih_free (array);
> ++	}
> + 
> + 	/* Check that we can give an empty string, and end up with a
> + 	 * one-element array that only contains a NULL pointer.
> +--- libnih-1.0.3.orig/nih/tests/test_file.c
> ++++ libnih-1.0.3/nih/tests/test_file.c
> +@@ -724,6 +724,25 @@
> + 	return FALSE;
> + }
> + 
> ++/* find only frodo files */
> ++static int
> ++my_filter_frodo_file (void       *data,
> ++	   const char *path,
> ++	   int         is_dir)
> ++{
> ++	char *slash;
> ++
> ++	if (is_dir)
> ++		return FALSE;
> ++
> ++	slash = strrchr (path, '/');
> ++	if (strcmp (slash, "/frodo"))
> ++		return TRUE;
> ++
> ++	return FALSE;
> ++}
> ++
> ++
> + static int logger_called = 0;
> + 
> + static int
> +@@ -905,6 +924,48 @@
> + 		TEST_EQ_STR (v->path, filename);
> + 
> + 		nih_free (visited);
> ++
> ++				/* Try also inverse filter */
> ++		TEST_ALLOC_SAFE {
> ++			visitor_called = 0;
> ++			visited = nih_list_new (NULL);
> ++		}
> ++
> ++		ret = nih_dir_walk (dirname, my_filter_frodo_file,
> ++				    my_visitor, NULL, &ret);
> ++
> ++		TEST_EQ (ret, 0);
> ++		TEST_EQ (visitor_called, 4);
> ++
> ++		v = (Visited *)visited->next;
> ++		TEST_EQ (v->data, &ret);
> ++		TEST_EQ_STR (v->dirname, dirname);
> ++		strcpy (filename, dirname);
> ++		strcat (filename, "/bar");
> ++		TEST_EQ_STR (v->path, filename);
> ++
> ++		v = (Visited *)v->entry.next;
> ++		TEST_EQ (v->data, &ret);
> ++		TEST_EQ_STR (v->dirname, dirname);
> ++		strcpy (filename, dirname);
> ++		strcat (filename, "/bar/frodo");
> ++		TEST_EQ_STR (v->path, filename);
> ++
> ++		v = (Visited *)v->entry.next;
> ++		TEST_EQ (v->data, &ret);
> ++		TEST_EQ_STR (v->dirname, dirname);
> ++		strcpy (filename, dirname);
> ++		strcat (filename, "/baz");
> ++		TEST_EQ_STR (v->path, filename);
> ++
> ++		v = (Visited *)v->entry.next;
> ++		TEST_EQ (v->data, &ret);
> ++		TEST_EQ_STR (v->dirname, dirname);
> ++		strcpy (filename, dirname);
> ++		strcat (filename, "/frodo");
> ++		TEST_EQ_STR (v->path, filename);
> ++
> ++		nih_free (visited);
> + 	}
> + 
> + 
> +--- libnih-1.0.3.orig/debian/control
> ++++ libnih-1.0.3/debian/control
> +@@ -0,0 +1,81 @@
> ++Source: libnih
> ++Section: libs
> ++Priority: required
> ++Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
> ++XSBC-Original-Maintainer: Scott James Remnant <scott at netsplit.com>
> ++Standards-Version: 3.9.4
> ++Build-Depends: debhelper (>= 9), pkg-config (>= 0.22), libdbus-1-dev (>= 1.4), libexpat1-dev (>= 2.0.0), dbus (>= 1.4), libc6-dev (>= 2.15~) | libc6.1-dev (>= 2.15~),
> ++               dh-autoreconf, autopoint, dpkg-dev (>= 1.16.1~)
> ++# To cross build this package also needs: libdbus-1-dev:native (>= 1.4), libexpat1-dev:native (>= 2.0.0)
> ++# But :native build-deps are not supported yet, so instead one can do
> ++# $ apt-get build-dep libnih
> ++# $ apt-get build-dep libnih -aarmhf
> ++# instead to get all required build-deps
> ++Vcs-Bzr: lp:ubuntu/libnih
> ++XSC-Debian-Vcs-Git: git://git.debian.org/git/collab-maint/libnih.git
> ++XSC-Debian-Vcs-Browser: http://git.debian.org/?p=collab-maint/libnih.git;a=summary
> ++Homepage: https://launchpad.net/libnih
> ++
> ++Package: libnih1
> ++Architecture: any
> ++Pre-Depends: ${misc:Pre-Depends}, ${shlibs:Depends}, ${misc:Depends}
> ++Multi-Arch: same
> ++Description: NIH Utility Library
> ++ libnih is a light-weight "standard library" of C functions to ease the
> ++ development of other libraries and applications, especially those
> ++ normally found in /lib.
> ++ .
> ++ This package contains the shared library.
> ++
> ++Package: libnih-dev
> ++Priority: optional
> ++Section: libdevel
> ++Architecture: any
> ++Multi-Arch: same
> ++Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> ++Description: NIH Utility Library (development files)
> ++ libnih is a light-weight "standard library" of C functions to ease the
> ++ development of other libraries and applications, especially those
> ++ normally found in /lib.
> ++ .
> ++ This package contains the static library and C header files which are
> ++ needed for developing software using libnih.
> ++
> ++Package: libnih-dbus1
> ++Architecture: any
> ++Pre-Depends: ${misc:Pre-Depends}
> ++Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> ++Multi-Arch: same
> ++Description: NIH D-Bus Bindings Library
> ++ libnih-dbus is a D-Bus bindings library that integrates with the main
> ++ loop provided by libnih.
> ++ .
> ++ This package contains the shared library.
> ++
> ++Package: libnih-dbus-dev
> ++Priority: optional
> ++Section: libdevel
> ++Architecture: any
> ++Multi-Arch: same
> ++Depends: libnih-dbus1 (= ${binary:Version}), libnih-dev (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> ++Recommends: nih-dbus-tool (= ${binary:Version})
> ++Description: NIH D-Bus Bindings Library (development files)
> ++ libnih-dbus is a D-Bus bindings library that integrates with the main
> ++ loop provided by libnih.
> ++ .
> ++ This package contains the static library and C header files which are
> ++ needed for developing software using libnih-dbus.
> ++
> ++Package: nih-dbus-tool
> ++Section: devel
> ++Architecture: any
> ++Multi-Arch: foreign
> ++Depends: ${shlibs:Depends}, ${misc:Depends}
> ++Recommends: libnih-dbus-dev (= ${binary:Version})
> ++Description: NIH D-Bus Binding Tool
> ++ nih-dbus-tool generates C source code from the D-Bus Introspection XML
> ++ data provided by most services; either to make implementing the
> ++ described objects in C programs or to make proxying to the described
> ++ remote objects easier.
> ++ .
> ++ The generated code requires libnih-dbus-dev to be compiled.
> +--- libnih-1.0.3.orig/debian/libnih-dev.install
> ++++ libnih-1.0.3/debian/libnih-dev.install
> +@@ -0,0 +1,6 @@
> ++lib/*/libnih.a
> ++lib/*/libnih.so
> ++usr/include/libnih.h
> ++usr/include/nih
> ++usr/lib/*/pkgconfig/libnih.pc
> ++usr/share/aclocal/libnih.m4
> +--- libnih-1.0.3.orig/debian/libnih1.docs
> ++++ libnih-1.0.3/debian/libnih1.docs
> +@@ -0,0 +1,3 @@
> ++AUTHORS
> ++NEWS
> ++README
> +--- libnih-1.0.3.orig/debian/libnih-dbus1.install
> ++++ libnih-1.0.3/debian/libnih-dbus1.install
> +@@ -0,0 +1 @@
> ++lib/*/libnih-dbus.so.*
> +--- libnih-1.0.3.orig/debian/libnih1.install
> ++++ libnih-1.0.3/debian/libnih1.install
> +@@ -0,0 +1 @@
> ++lib/*/libnih.so.*
> +--- libnih-1.0.3.orig/debian/rules
> ++++ libnih-1.0.3/debian/rules
> +@@ -0,0 +1,54 @@
> ++#!/usr/bin/make -f
> ++
> ++include /usr/share/dpkg/architecture.mk
> ++
> ++%:
> ++	dh $@ --with autoreconf
> ++
> ++
> ++CFLAGS := -Wall -fstack-protector -fPIE $(shell dpkg-buildflags --get CFLAGS)
> ++LDFLAGS := -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -pie $(shell dpkg-buildflags --get LDFLAGS)
> ++
> ++override_dh_auto_configure:
> ++ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
> ++	dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> ++		--libdir=/lib/$(DEB_HOST_MULTIARCH)
> ++else
> ++	dh_auto_configure -B build-dbus-tool/ -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> ++		--libdir=/lib/$(DEB_BUILD_MULTIARCH) \
> ++		--host=$(DEB_BUILD_GNU_TYPE)
> ++	dh_auto_build -B build-dbus-tool/ --parallel
> ++	dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> ++		NIH_DBUS_TOOL=$(CURDIR)/build-dbus-tool/nih-dbus-tool/nih-dbus-tool \
> ++		--libdir=/lib/$(DEB_HOST_MULTIARCH)
> ++endif
> ++
> ++override_dh_auto_build:
> ++	dh_auto_build --parallel
> ++
> ++override_dh_auto_test:
> ++ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
> ++	dh_auto_test --parallel
> ++endif
> ++
> ++override_dh_auto_install:
> ++	dh_auto_install -- pkgconfigdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
> ++
> ++override_dh_makeshlibs:
> ++	dh_makeshlibs -plibnih1 -V 'libnih1 (>= 1.0.0)'
> ++	dh_makeshlibs -plibnih-dbus1 -V 'libnih-dbus1 (>= 1.0.0)'
> ++	dh_makeshlibs -Nlibnih1 -Nlibnih-dbus1
> ++
> ++override_dh_shlibdeps:
> ++	dh_shlibdeps
> ++	sed -i 's/2\.14/2.15/' debian/*.substvars
> ++	sed -i 's/>= 2.15)/>= 2.15~)/g' debian/*.substvars
> ++
> ++
> ++# Symlink /usr/share/doc directories together
> ++override_dh_installdocs:
> ++	dh_installdocs --link-doc=libnih1
> ++
> ++override_dh_clean:
> ++	rm -rf build-dbus-tool/
> ++	dh_clean
> +--- libnih-1.0.3.orig/debian/compat
> ++++ libnih-1.0.3/debian/compat
> +@@ -0,0 +1 @@
> ++9
> +--- libnih-1.0.3.orig/debian/nih-dbus-tool.install
> ++++ libnih-1.0.3/debian/nih-dbus-tool.install
> +@@ -0,0 +1,2 @@
> ++usr/bin/nih-dbus-tool
> ++usr/share/man/man1/nih-dbus-tool.1
> +--- libnih-1.0.3.orig/debian/copyright
> ++++ libnih-1.0.3/debian/copyright
> +@@ -0,0 +1,18 @@
> ++This is the Ubuntu package of libnih, the NIH Utility Library.
> ++
> ++Copyright © 2009 Canonical Ltd.
> ++Copyright © 2009 Scott James Remnant <scott at netsplit.com>
> ++
> ++Licence:
> ++
> ++This program is free software; you can redistribute it and/or modify
> ++it under the terms of the GNU General Public License version 2, as
> ++published by the Free Software Foundation.
> ++
> ++This program is distributed in the hope that it will be useful, but
> ++WITHOUT ANY WARRANTY; without even the implied warranty of
> ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> ++General Public License for more details.
> ++
> ++On Ubuntu systems, the complete text of the GNU General Public License
> ++can be found in ‘/usr/share/common-licenses/GPL-2’.
> +--- libnih-1.0.3.orig/debian/libnih-dbus1.postinst
> ++++ libnih-1.0.3/debian/libnih-dbus1.postinst
> +@@ -0,0 +1,53 @@
> ++#!/bin/sh
> ++
> ++set -e
> ++
> ++if [ "$1" = configure ]; then
> ++    # A dependent library of Upstart has changed, so restart Upstart
> ++    # such that it can safely unmount the root filesystem (LP: #740390)
> ++
> ++    # Query running version of Upstart, but only when we know
> ++    # that initctl will work.
> ++    #
> ++    # The calculated version string may be the null string if
> ++    # Upstart is not running (where for example an alternative
> ++    # init is running outside a chroot environment) or if the
> ++    # query failed for some reason. However, the version check
> ++    # below handles a null version string correctly.
> ++    UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
> ++        awk '{print $3}'|tr -d ')' || :)
> ++
> ++    if ischroot; then
> ++        # Do not honour re-exec when requested from within a
> ++        # chroot since:
> ++        #
> ++        # (a) The version of Upstart outside might not support it.
> ++        # (b) An isolated environment such as a chroot should
> ++        #     not be able to modify its containing environment.
> ++        #
> ++        # A sufficiently new Upstart will actually handle a re-exec
> ++        # request coming from telinit within a chroot correctly (by
> ++        # doing nothing) but it's simple enough to perform the check
> ++        # here and save Upstart the effort.
> ++        :
> ++    elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
> ++        # We are not running inside a chroot and the running version
> ++        # of Upstart supports stateful re-exec, so we can
> ++        # restart immediately.
> ++        #
> ++        # XXX: Note that the check on the running version must
> ++        # remain *indefinitely* since it's the only safe way to
> ++        # know if stateful re-exec is supported: simply checking
> ++        # packaged version numbers is not sufficient since
> ++        # the package could be upgraded multiple times without a
> ++        # reboot.
> ++        telinit u || :
> ++    else
> ++        # Before we shutdown or reboot, we need to re-exec so that we
> ++        # can safely remount the root filesystem; we can't just do that
> ++        # here because we lose state.
> ++        touch /var/run/init.upgraded || :
> ++    fi
> ++fi
> ++
> ++#DEBHELPER#
> +--- libnih-1.0.3.orig/debian/changelog.DEBIAN
> ++++ libnih-1.0.3/debian/changelog.DEBIAN
> +@@ -0,0 +1,118 @@
> ++libnih (1.0.3-4) unstable; urgency=low
> ++
> ++  * Rebuild for new libc to update versioned dependency; this comes from
> ++    the __abort_msg dependency, dpkg-shlibs needs overriding since this is
> ++    actually a weak link, but this rebuild fixes things for now.
> ++    Closes: #625257.
> ++
> ++ -- Scott James Remnant <scott at netsplit.com>  Mon, 02 May 2011 15:08:33 -0700
> ++
> ++libnih (1.0.3-3) unstable; urgency=low
> ++
> ++  * New maintainer.  Closes: #624442.
> ++
> ++ -- Scott James Remnant <scott at netsplit.com>  Thu, 28 Apr 2011 14:26:05 -0700
> ++
> ++libnih (1.0.3-2) unstable; urgency=low
> ++
> ++  * Bump build dependency on libdbus-1-dev and dbus to (>= 1.4) for Unix file
> ++    descriptor passing support.
> ++
> ++ -- Michael Biebl <biebl at debian.org>  Thu, 10 Feb 2011 20:25:18 +0100
> ++
> ++libnih (1.0.3-1ubuntu1) natty; urgency=low
> ++
> ++  * Rebuild with libc6-dev (>= 2.13~).
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Fri, 18 Feb 2011 12:09:29 +0100
> ++
> ++libnih (1.0.3-1) unstable; urgency=low
> ++
> ++  * New upstream release.
> ++  * Bump debhelper compatibility level to 8 and update build dependency
> ++    accordingly.
> ++
> ++ -- Michael Biebl <biebl at debian.org>  Mon, 07 Feb 2011 22:19:13 +0100
> ++
> ++libnih (1.0.2-2) unstable; urgency=low
> ++
> ++  * Install library development files to /usr/lib and not /lib.
> ++  * Remove libtool *.la files as there are no reverse dependencies referencing
> ++    them.
> ++  * Bump Standards-Version to 3.9.1. No further changes.
> ++
> ++ -- Michael Biebl <biebl at debian.org>  Sun, 02 Jan 2011 21:09:40 +0100
> ++
> ++libnih (1.0.2-1ubuntu3) natty; urgency=low
> ++
> ++  * Disable some tests on ppc64 to build an initial package.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Thu, 18 Nov 2010 10:59:38 +0100
> ++
> ++libnih (1.0.2-1ubuntu2) maverick; urgency=low
> ++
> ++  * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
> ++    current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
> ++
> ++ -- Loïc Minier <loic.minier at linaro.org>  Mon, 23 Aug 2010 10:25:31 +0200
> ++
> ++libnih (1.0.2-1ubuntu1) maverick; urgency=low
> ++
> ++  * Rebuild with libc6-dev (>= 2.12~), after checking that
> ++    __abort_msg is available with the same signature in eglibc 2.12.
> ++  * Don't build the testsuite with -fPIE on armel; LP: #398403.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Sun, 30 May 2010 02:54:56 +0200
> ++
> ++libnih (1.0.2-1) unstable; urgency=low
> ++
> ++  * Initial upload to Debian. Closes: #585071
> ++  * Based on the Ubuntu package for Lucid done by Scott James Remnant with the
> ++    following changes:
> ++    - Switch packages to priority optional.
> ++    - Use binary:Version instead of Source-Version.
> ++    - Bump Standards-Version to 3.8.4.
> ++    - Add Homepage and Vcs-* fields.
> ++    - Don't symlink /usr/share/doc directories.
> ++    - Refer to versioned /usr/share/common-licenses/GPL-2 file in
> ++      debian/copyright.
> ++    - List all symbols explicitly instead of using a wildcard and add symbols
> ++      introduced in 1.0.1.
> ++    - Use the symbols files to create the correct version info instead of
> ++      specifying it manually via shlibs.
> ++    - Switch to source format 3.0 (quilt).
> ++    - Add watch file to track new upstream releases.
> ++
> ++ -- Michael Biebl <biebl at debian.org>  Sun, 13 Jun 2010 23:36:52 +0200
> ++
> ++libnih (1.0.1-1) lucid; urgency=low
> ++
> ++  * New upstream release:
> ++    - Add missing __nih_* symbols to linker version script so that we
> ++      can link Upstart's test suite.
> ++    - Glibc __abort_msg symbol now only linked as a weak symbol.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Thu, 04 Feb 2010 14:53:26 -0800
> ++
> ++libnih (1.0.0-2build1) lucid; urgency=low
> ++
> ++  * Rebuild to pick up relaxed dependency on libc6, after checking that
> ++    __abort_msg is available with the same signature in eglibc 2.11.
> ++    LP: #508702.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Mon, 18 Jan 2010 16:09:13 +0100
> ++
> ++libnih (1.0.0-2) lucid; urgency=low
> ++
> ++  * debian/control: Add build-dependency on dbus so the test suite can
> ++    pass on the buildds.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Sat, 28 Nov 2009 23:28:27 +0000
> ++
> ++libnih (1.0.0-1) lucid; urgency=low
> ++
> ++  * First upstream release.  Previously this code was included in the
> ++    upstart, mountall and ureadahead source packages.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Sat, 28 Nov 2009 21:14:00 +0000
> ++
> +--- libnih-1.0.3.orig/debian/libnih1.symbols
> ++++ libnih-1.0.3/debian/libnih1.symbols
> +@@ -0,0 +1,2 @@
> ++libnih.so.1 libnih1 #MINVER#
> ++ *@LIBNIH_1_0 1.0.0
> +--- libnih-1.0.3.orig/debian/libnih-dbus-dev.install
> ++++ libnih-1.0.3/debian/libnih-dbus-dev.install
> +@@ -0,0 +1,5 @@
> ++lib/*/libnih-dbus.a
> ++lib/*/libnih-dbus.so
> ++usr/include/libnih-dbus.h
> ++usr/include/nih-dbus
> ++usr/lib/*/pkgconfig/libnih-dbus.pc
> +--- libnih-1.0.3.orig/debian/libnih1.postinst
> ++++ libnih-1.0.3/debian/libnih1.postinst
> +@@ -0,0 +1,53 @@
> ++#!/bin/sh
> ++
> ++set -e
> ++
> ++if [ "$1" = configure ]; then
> ++    # A dependent library of Upstart has changed, so restart Upstart
> ++    # such that it can safely unmount the root filesystem (LP: #740390)
> ++
> ++    # Query running version of Upstart, but only when we know
> ++    # that initctl will work.
> ++    #
> ++    # The calculated version string may be the null string if
> ++    # Upstart is not running (where for example an alternative
> ++    # init is running outside a chroot environment) or if the
> ++    # query failed for some reason. However, the version check
> ++    # below handles a null version string correctly.
> ++    UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
> ++        awk '{print $3}'|tr -d ')' || :)
> ++
> ++    if ischroot; then
> ++        # Do not honour re-exec when requested from within a
> ++        # chroot since:
> ++        #
> ++        # (a) The version of Upstart outside might not support it.
> ++        # (b) An isolated environment such as a chroot should
> ++        #     not be able to modify its containing environment.
> ++        #
> ++        # A sufficiently new Upstart will actually handle a re-exec
> ++        # request coming from telinit within a chroot correctly (by
> ++        # doing nothing) but it's simple enough to perform the check
> ++        # here and save Upstart the effort.
> ++        :
> ++    elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
> ++        # We are not running inside a chroot and the running version
> ++        # of Upstart supports stateful re-exec, so we can
> ++        # restart immediately.
> ++        #
> ++        # XXX: Note that the check on the running version must
> ++        # remain *indefinitely* since it's the only safe way to
> ++        # know if stateful re-exec is supported: simply checking
> ++        # packaged version numbers is not sufficient since
> ++        # the package could be upgraded multiple times without a
> ++        # reboot.
> ++        telinit u || :
> ++    else
> ++        # Before we shutdown or reboot, we need to re-exec so that we
> ++        # can safely remount the root filesystem; we can't just do that
> ++        # here because we lose state.
> ++        touch /var/run/init.upgraded || :
> ++    fi
> ++fi
> ++
> ++#DEBHELPER#
> +--- libnih-1.0.3.orig/debian/libnih-dbus1.symbols
> ++++ libnih-1.0.3/debian/libnih-dbus1.symbols
> +@@ -0,0 +1,2 @@
> ++libnih-dbus.so.1 libnih-dbus1 #MINVER#
> ++ *@LIBNIH_DBUS_1_0 1.0.0
> +--- libnih-1.0.3.orig/debian/changelog
> ++++ libnih-1.0.3/debian/changelog
> +@@ -0,0 +1,213 @@
> ++libnih (1.0.3-4ubuntu16) raring; urgency=low
> ++
> ++  * debian/{libnih1.postinst,libnih-dbus1.postinst}: Force an upgrade to
> ++    restart Upstart (to pick up new package version) if the running
> ++    instance supports it.
> ++  * Merge of important fixes from lp:~upstart-devel/libnih/nih
> ++    (LP: #776532, LP: #777097, LP: #834813, LP: #1123588).
> ++
> ++ -- James Hunt <james.hunt at ubuntu.com>  Thu, 14 Mar 2013 09:14:22 +0000
> ++
> ++libnih (1.0.3-4ubuntu15) raring; urgency=low
> ++
> ++  * Enable cross-building, sans adding :native build-dependencies.
> ++    See comments in debian/control.
> ++  * Lintian fixes.
> ++
> ++ -- Dmitrijs Ledkovs <dmitrij.ledkov at ubuntu.com>  Tue, 08 Jan 2013 15:38:58 +0000
> ++
> ++libnih (1.0.3-4ubuntu14) raring; urgency=low
> ++
> ++  * Update dbus code generator to allow for empty lists for type 'as'.
> ++    This drops the != NULL check for NULL terminated arrays and moves the
> ++    iteration loop inside an 'if' statement.
> ++
> ++ -- Stéphane Graber <stgraber at ubuntu.com>  Thu, 13 Dec 2012 10:00:27 -0500
> ++
> ++libnih (1.0.3-4ubuntu13) raring; urgency=low
> ++
> ++  [ Petr Lautrbach <plautrba at redhat.com>, Dmitrijs Ledkovs ]
> ++  * Fallback to lstat, if dirent.d_type is not available (not portable)
> ++    (LP: #672643) (Closes: #695604)
> ++
> ++ -- Dmitrijs Ledkovs <dmitrij.ledkov at ubuntu.com>  Tue, 11 Dec 2012 17:26:52 +0000
> ++
> ++libnih (1.0.3-4ubuntu12) raring; urgency=low
> ++
> ++  * nih/logging.c: Use our own __nih_abort_msg rather than the (e)glibc
> ++    private symbol __abort_msg to avoid upgrade issues (LP: #997359).
> ++  * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
> ++
> ++ -- James Hunt <james.hunt at ubuntu.com>  Thu, 25 Oct 2012 10:57:30 +0100
> ++
> ++libnih (1.0.3-4ubuntu11) quantal; urgency=low
> ++
> ++  * Addition of debian/libnih-dbus1.postinst and
> ++    debian/libnih1.postinst to force Upstart re-exec on shutdown
> ++    to avoid unmounting disks uncleanly (LP: #740390).
> ++
> ++ -- James Hunt <james.hunt at ubuntu.com>  Wed, 03 Oct 2012 16:49:40 +0100
> ++
> ++libnih (1.0.3-4ubuntu10) quantal; urgency=low
> ++
> ++  * Update config.guess,sub for aarch64
> ++
> ++ -- Wookey <wookey at wookware.org>  Mon, 01 Oct 2012 12:57:05 +0100
> ++
> ++libnih (1.0.3-4ubuntu9) precise; urgency=low
> ++
> ++  * Mark the nih-dbus-tool package Multi-Arch: foreign so it can be used as
> ++    a build-dependency of upstart when cross-building.
> ++
> ++ -- Steve Langasek <steve.langasek at ubuntu.com>  Wed, 15 Feb 2012 22:57:50 -0800
> ++
> ++libnih (1.0.3-4ubuntu8) precise; urgency=low
> ++
> ++  * libnih1 needs a versioned Pre-Depend on libc6 instead of just a Depend,
> ++    because libc6 itself uses runlevel from the upstart package in its
> ++    preinst, which in turn uses libnih1, which needs to be loadable (i.e.,
> ++    its symbol references resolve).  We therefore need to ensure that
> ++    libnih1's dependencies are always unpacked before libnih1 itself is
> ++    unpacked.  While having something further up the stack (such as upstart,
> ++    or something on top of upstart) being marked Essential: yes and with the
> ++    necessary pre-depends would let apt handle this for us with its
> ++    "immediate configuration" support, but for various reasons we don't want
> ++    to make upstart essential.  LP: #508083.
> ++
> ++ -- Steve Langasek <steve.langasek at ubuntu.com>  Fri, 10 Feb 2012 12:13:25 -0800
> ++
> ++libnih (1.0.3-4ubuntu7) precise; urgency=low
> ++
> ++  * Relax dependency on libc6.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Wed, 08 Feb 2012 23:43:21 +0100
> ++
> ++libnih (1.0.3-4ubuntu6) precise; urgency=low
> ++
> ++  * Rebuild with libc6-dev (>= 2.15~).
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Wed, 08 Feb 2012 21:48:57 +0100
> ++
> ++libnih (1.0.3-4ubuntu5) precise; urgency=low
> ++
> ++  * Mark libnih-dev and libnih-dbus-dev Multi-Arch: same as well.
> ++
> ++ -- Steve Langasek <steve.langasek at ubuntu.com>  Sun, 06 Nov 2011 14:45:07 -0800
> ++
> ++libnih (1.0.3-4ubuntu4) precise; urgency=low
> ++
> ++  * Make libnih1 and libnih-dbus1 installable using multi-arch.
> ++
> ++ -- James Hunt <james.hunt at ubuntu.com>  Tue, 01 Nov 2011 14:25:09 -0400
> ++
> ++libnih (1.0.3-4ubuntu3) precise; urgency=low
> ++
> ++  * Build to install with eglibc-2.15.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Fri, 14 Oct 2011 14:05:03 +0200
> ++
> ++libnih (1.0.3-4ubuntu2) oneiric; urgency=low
> ++
> ++  * Use dpkg-buildflags to get the build flags.
> ++  * Build with the default build flags, don't hard-code -Os. LP: #791315.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Wed, 15 Jun 2011 16:45:42 +0200
> ++
> ++libnih (1.0.3-4ubuntu1) oneiric; urgency=low
> ++
> ++  * Merge from debian unstable. Retained Ubuntu Build-Depends and Priority.
> ++
> ++ -- James Hunt <james.hunt at ubuntu.com>  Mon, 23 May 2011 19:28:19 +0100
> ++
> ++libnih (1.0.3-1ubuntu1) natty; urgency=low
> ++
> ++  * Rebuild with libc6-dev (>= 2.13~).
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Fri, 18 Feb 2011 12:09:29 +0100
> ++
> ++libnih (1.0.3-1) natty; urgency=low
> ++
> ++  * New upstream release:
> ++    - Added support for passing file descriptors over D-Bus to nih-dbus-tool
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Thu, 23 Dec 2010 22:28:24 +0000
> ++
> ++libnih (1.0.2-2) natty; urgency=low
> ++
> ++  * Revert the previous upload.  It is never acceptable to simply disable
> ++    tests, especially when it turns out that the test that was disabled
> ++    was failing because there was a serious bug that could cause kernel
> ++    panics for people on boot.
> ++
> ++    Test suites are here for a reason.
> ++
> ++  * Bumped libdbus Build-Dependency to the version with the bug fix that
> ++    caused the test suite to fail.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Wed, 08 Dec 2010 19:40:15 +0000
> ++
> ++libnih (1.0.2-1ubuntu3) natty; urgency=low
> ++
> ++  * Disable some tests on ppc64 to build an initial package.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Thu, 18 Nov 2010 10:59:38 +0100
> ++
> ++libnih (1.0.2-1ubuntu2) maverick; urgency=low
> ++
> ++  * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
> ++    current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
> ++
> ++ -- Loïc Minier <loic.minier at linaro.org>  Mon, 23 Aug 2010 10:25:31 +0200
> ++
> ++libnih (1.0.2-1ubuntu1) maverick; urgency=low
> ++
> ++  * Rebuild with libc6-dev (>= 2.12~), after checking that
> ++    __abort_msg is available with the same signature in eglibc 2.12.
> ++  * Don't build the testsuite with -fPIE on armel; LP: #398403.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Sun, 30 May 2010 02:54:56 +0200
> ++
> ++libnih (1.0.2-1) maverick; urgency=low
> ++
> ++  * New upstream release:
> ++    - Rename AC_COPYRIGHT to NIH_COPYRIGHT to avoid conflict with other
> ++      packages.
> ++    - Add serial to libnih.m4
> ++    - Add NIH_WITH_LOCAL_LIBNIH macro.
> ++
> ++  * Fix use of ${Source-Version} to be ${binary:Version}
> ++  * Add debian/source/format with "1.0" to be future compatible.
> ++  * Bump standards version.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Tue, 27 Apr 2010 10:49:55 -0700
> ++
> ++libnih (1.0.1-1) lucid; urgency=low
> ++
> ++  * New upstream release:
> ++    - Add missing __nih_* symbols to linker version script so that we
> ++      can link Upstart's test suite.
> ++    - Glibc __abort_msg symbol now only linked as a weak symbol.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Thu, 04 Feb 2010 14:53:26 -0800
> ++
> ++libnih (1.0.0-2build1) lucid; urgency=low
> ++
> ++  * Rebuild to pick up relaxed dependency on libc6, after checking that
> ++    __abort_msg is available with the same signature in eglibc 2.11.
> ++    LP: #508702.
> ++
> ++ -- Matthias Klose <doko at ubuntu.com>  Mon, 18 Jan 2010 16:09:13 +0100
> ++
> ++libnih (1.0.0-2) lucid; urgency=low
> ++
> ++  * debian/control: Add build-dependency on dbus so the test suite can
> ++    pass on the buildds.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Sat, 28 Nov 2009 23:28:27 +0000
> ++
> ++libnih (1.0.0-1) lucid; urgency=low
> ++
> ++  * First upstream release.  Previously this code was included in the
> ++    upstart, mountall and ureadahead source packages.
> ++
> ++ -- Scott James Remnant <scott at ubuntu.com>  Sat, 28 Nov 2009 21:14:00 +0000
> +--- libnih-1.0.3.orig/debian/source/format
> ++++ libnih-1.0.3/debian/source/format
> +@@ -0,0 +1 @@
> ++1.0
> +--- libnih-1.0.3.orig/nih-dbus/dbus_proxy.h
> ++++ libnih-1.0.3/nih-dbus/dbus_proxy.h
> +@@ -146,14 +146,14 @@
> + 					    const char *name, const char *path,
> + 					    NihDBusLostHandler lost_handler,
> + 					    void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NihDBusProxySignal *nih_dbus_proxy_connect (NihDBusProxy *proxy,
> + 					    const NihDBusInterface *interface,
> + 					    const char *name,
> + 					    NihDBusSignalHandler handler,
> + 					    void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus/dbus_object.h
> ++++ libnih-1.0.3/nih-dbus/dbus_object.h
> +@@ -61,8 +61,7 @@
> + 				    DBusConnection *connection,
> + 				    const char *path,
> + 				    const NihDBusInterface **interfaces,
> +-				    void *data)
> +-	__attribute__ ((malloc));
> ++				    void *data);
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus/dbus_util.h
> ++++ libnih-1.0.3/nih-dbus/dbus_util.h
> +@@ -26,7 +26,7 @@
> + NIH_BEGIN_EXTERN
> + 
> + char *nih_dbus_path (const void *parent, const char *root, ...)
> +-	__attribute__ ((sentinel, warn_unused_result, malloc));
> ++	__attribute__ ((sentinel, warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus/dbus_pending_data.h
> ++++ libnih-1.0.3/nih-dbus/dbus_pending_data.h
> +@@ -104,7 +104,7 @@
> + 					       NihDBusReplyHandler handler,
> + 					       NihDBusErrorHandler error_handler,
> + 					       void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus/dbus_proxy.c
> ++++ libnih-1.0.3/nih-dbus/dbus_proxy.c
> +@@ -46,11 +46,11 @@
> + 	__attribute__ ((warn_unused_result));
> + static char *nih_dbus_proxy_name_rule         (const void *parent,
> + 					       NihDBusProxy *proxy)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + static int   nih_dbus_proxy_signal_destroy    (NihDBusProxySignal *proxied);
> + static char *nih_dbus_proxy_signal_rule       (const void *parent,
> + 					       NihDBusProxySignal *proxied)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + /* Prototypes for handler functions */
> + static DBusHandlerResult nih_dbus_proxy_name_owner_changed (DBusConnection *connection,
> +--- libnih-1.0.3.orig/nih-dbus-tool/symbol.c
> ++++ libnih-1.0.3/nih-dbus-tool/symbol.c
> +@@ -40,10 +40,10 @@
> + /* Prototypes for static functions */
> + static char *symbol_strcat_interface (char **str, const void *parent,
> + 				      const char *format, ...)
> +-	__attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> ++	__attribute__ ((format (printf, 3, 4), warn_unused_result));
> + static char *symbol_strcat_title     (char **str, const void *parent,
> + 				      const char *format, ...)
> +-	__attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> ++	__attribute__ ((format (printf, 3, 4), warn_unused_result));
> + 
> + 
> + /**
> +--- libnih-1.0.3.orig/nih-dbus-tool/demarshal.h
> ++++ libnih-1.0.3/nih-dbus-tool/demarshal.h
> +@@ -37,7 +37,7 @@
> + 		 const char *prefix, const char *interface_symbol,
> + 		 const char *member_symbol, const char *symbol,
> + 		 NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/symbol.h
> ++++ libnih-1.0.3/nih-dbus-tool/symbol.h
> +@@ -28,22 +28,22 @@
> + int   symbol_valid     (const char *symbol);
> + 
> + char *symbol_from_name (const void *parent, const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *symbol_impl      (const void *parent, const char *prefix,
> + 			const char *interface_name, const char *name,
> + 			const char *postfix)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *symbol_extern    (const void *parent, const char *prefix,
> + 			const char *interface_symbol, const char *midfix,
> + 			const char *symbol, const char *postfix)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *symbol_typedef   (const void *parent, const char *prefix,
> + 			const char *interface_symbol, const char *midfix,
> + 			const char *symbol, const char *postfix)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/output.h
> ++++ libnih-1.0.3/nih-dbus-tool/output.h
> +@@ -35,9 +35,9 @@
> + 	__attribute__ ((warn_unused_result));
> + 
> + char *output_preamble (const void *parent, const char *path)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *output_sentinel (const void *parent, const char *path)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/parse.h
> ++++ libnih-1.0.3/nih-dbus-tool/parse.h
> +@@ -95,7 +95,7 @@
> + 
> + ParseStack *parse_stack_push (const void *parent, NihList *stack,
> + 			      ParseStackType type, void *data)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + ParseStack *parse_stack_top  (NihList *stack);
> + 
> + void        parse_start_tag  (XML_Parser xmlp, const char *tag,
> +@@ -103,7 +103,7 @@
> + void        parse_end_tag    (XML_Parser xmlp, const char *tag);
> + 
> + Node *      parse_xml        (const void *parent, int fd, const char *filename)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/type.h
> ++++ libnih-1.0.3/nih-dbus-tool/type.h
> +@@ -94,43 +94,43 @@
> + 
> + char *      type_of               (const void * parent,
> + 				   DBusSignatureIter *iter)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + TypeVar *   type_var_new          (const void *parent, const char *type,
> + 				   const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_var_to_string    (const void *parent, TypeVar *var)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_var_layout       (const void *parent, NihList *vars)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + TypeFunc *  type_func_new         (const void *parent, const char *type,
> + 				   const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_func_to_string   (const void *parent, TypeFunc *func)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_func_to_typedef  (const void *parent, TypeFunc *func)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_func_layout      (const void *parent, NihList *funcs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + TypeStruct *type_struct_new       (const void *parent, const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_struct_to_string (const void *parent, TypeStruct *structure)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *      type_to_const         (char **type, const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_to_pointer       (char **type, const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_to_static        (char **type, const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *      type_to_extern        (char **type, const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *      type_strcat_assert    (char **block, const void *parent,
> + 				   TypeVar *var, TypeVar *prev, TypeVar *next)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/argument.h
> ++++ libnih-1.0.3/nih-dbus-tool/argument.h
> +@@ -61,7 +61,7 @@
> + 
> + Argument *argument_new        (const void *parent, const char *name,
> + 			       const char *type, NihDBusArgDir direction)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int       argument_start_tag  (XML_Parser xmlp, const char *tag,
> + 			       char * const *attr)
> +--- libnih-1.0.3.orig/nih-dbus-tool/indent.h
> ++++ libnih-1.0.3/nih-dbus-tool/indent.h
> +@@ -26,9 +26,9 @@
> + NIH_BEGIN_EXTERN
> + 
> + char *indent  (char **str, const void *parent, int level)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *comment (char **str, const void *parent)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/main.c
> ++++ libnih-1.0.3/nih-dbus-tool/main.c
> +@@ -52,10 +52,10 @@
> + /* Prototypes for local functions */
> + char *source_file_path (const void *parent, const char *output_path,
> + 			const char *filename)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *header_file_path (const void *parent, const char *output_path,
> + 			const char *filename)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + 
> + /**
> +--- libnih-1.0.3.orig/nih-dbus-tool/signal.h
> ++++ libnih-1.0.3/nih-dbus-tool/signal.h
> +@@ -58,7 +58,7 @@
> + int       signal_name_valid      (const char *name);
> + 
> + Signal *  signal_new             (const void *parent, const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int       signal_start_tag       (XML_Parser xmlp, const char *tag,
> + 				  char * const *attr)
> +@@ -76,18 +76,18 @@
> + char *    signal_object_function (const void *parent, const char *prefix,
> + 				  Interface *interface, Signal *signal,
> + 				  NihList *prototypes, NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    signal_proxy_function  (const void *parent, const char *prefix,
> + 				  Interface *interface, Signal *signal,
> + 				  NihList *prototypes, NihList *typedefs,
> + 				  NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    signal_args_array      (const void *parent, const char *prefix,
> + 				  Interface *interface, Signal *signal,
> + 				  NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
> ++++ libnih-1.0.3/nih-dbus-tool/marshal.c
> +@@ -49,7 +49,7 @@
> + 			     const char *prefix, const char *interface_symbol,
> + 			     const char *member_symbol, const char *symbol,
> + 			     NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + static char *marshal_array  (const void *parent,
> + 			     DBusSignatureIter *iter,
> + 			     const char *iter_name, const char *name,
> +@@ -58,7 +58,7 @@
> + 			     const char *prefix, const char *interface_symbol,
> + 			     const char *member_symbol, const char *symbol,
> + 			     NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + static char *marshal_struct (const void *parent,
> + 			     DBusSignatureIter *iter,
> + 			     const char *iter_name, const char *name,
> +@@ -67,7 +67,7 @@
> + 			     const char *prefix, const char *interface_symbol,
> + 			     const char *member_symbol, const char *symbol,
> + 			     NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + 
> + /**
> +@@ -364,6 +364,7 @@
> + 	nih_local TypeVar *element_len_var = NULL;
> + 	nih_local char *   block = NULL;
> + 	nih_local char *   vars_block = NULL;
> ++	nih_local char *   loop_block = NULL;
> + 
> + 	nih_assert (iter != NULL);
> + 	nih_assert (iter_name != NULL);
> +@@ -448,7 +449,7 @@
> + 	nih_list_add (locals, &array_iter_var->entry);
> + 
> + 	if (dbus_type_is_fixed (element_type)) {
> +-		if (! nih_strcat_sprintf (&code, parent,
> ++		if (! nih_strcat_sprintf (&loop_block, parent,
> + 					  "for (size_t %s = 0; %s < %s; %s++) {\n",
> + 					  loop_name, loop_name, len_name, loop_name)) {
> + 			nih_free (code);
> +@@ -456,6 +457,12 @@
> + 		}
> + 	} else {
> + 		if (! nih_strcat_sprintf (&code, parent,
> ++					  "if (%s) {\n",
> ++					  name)) {
> ++			nih_free (code);
> ++			return NULL;
> ++		}
> ++		if (! nih_strcat_sprintf (&loop_block, parent,
> + 					  "for (size_t %s = 0; %s[%s]; %s++) {\n",
> + 					  loop_name, name, loop_name, loop_name)) {
> + 			nih_free (code);
> +@@ -576,7 +583,7 @@
> + 	}
> + 
> + 
> +-	if (! nih_strcat_sprintf (&code, parent,
> ++	if (! nih_strcat_sprintf (&loop_block, parent,
> + 			   "%s"
> + 			   "\n"
> + 			   "%s"
> +@@ -590,9 +597,34 @@
> + 	}
> + 
> + 	/* Close the container again */
> ++	if (! nih_strcat_sprintf (&loop_block, parent,
> ++				  "}\n")) {
> ++		nih_free (code);
> ++		return NULL;
> ++	}
> ++
> ++	if (dbus_type_is_fixed (element_type)) {
> ++		if (! nih_strcat_sprintf (&code, parent,
> ++				 "%s\n", loop_block)) {
> ++			nih_free (code);
> ++			return NULL;
> ++		}
> ++	}
> ++	else {
> ++		if (! indent (&loop_block, NULL, 1)) {
> ++			nih_free (code);
> ++			return NULL;
> ++		}
> ++
> ++		if (! nih_strcat_sprintf (&code, parent,
> ++				 "%s"
> ++				 "}\n\n", loop_block)) {
> ++			nih_free (code);
> ++			return NULL;
> ++		}
> ++	}
> ++
> + 	if (! nih_strcat_sprintf (&code, parent,
> +-				  "}\n"
> +-				  "\n"
> + 				  "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
> + 				  "%s"
> + 				  "}\n",
> +--- libnih-1.0.3.orig/nih-dbus-tool/demarshal.c
> ++++ libnih-1.0.3/nih-dbus-tool/demarshal.c
> +@@ -51,7 +51,7 @@
> + 			       const char *prefix, const char *interface_symbol,
> + 			       const char *member_symbol, const char *symbol,
> + 			       NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + static char *demarshal_array  (const void *parent,
> + 			       DBusSignatureIter *iter,
> + 			       const char *parent_name,
> +@@ -62,7 +62,7 @@
> + 			       const char *prefix, const char *interface_symbol,
> + 			       const char *member_symbol, const char *symbol,
> + 			       NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + static char *demarshal_struct (const void *parent,
> + 			       DBusSignatureIter *iter,
> + 			       const char *parent_name,
> +@@ -73,7 +73,7 @@
> + 			       const char *prefix, const char *interface_symbol,
> + 			       const char *member_symbol, const char *symbol,
> + 			       NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + 
> + /**
> +--- libnih-1.0.3.orig/nih-dbus-tool/interface.h
> ++++ libnih-1.0.3/nih-dbus-tool/interface.h
> +@@ -61,7 +61,7 @@
> + 
> + Interface *interface_new                           (const void *parent,
> + 						    const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int        interface_start_tag                     (XML_Parser xmlp,
> + 						    const char *tag,
> +@@ -81,26 +81,26 @@
> + 						    Interface *interface,
> + 						    int with_handlers,
> + 						    NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *     interface_signals_array                 (const void *parent,
> + 						    const char *prefix,
> + 						    Interface *interface,
> + 						    int with_filters,
> + 						    NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *     interface_properties_array              (const void *parent,
> + 						    const char *prefix,
> + 						    Interface *interface,
> + 						    int with_handlers,
> + 						    NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *     interface_struct                        (const void *parent,
> + 						    const char *prefix,
> + 						    Interface *interface,
> + 						    int object,
> + 						    NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + 
> + char *     interface_proxy_get_all_function        (const void *parent,
> +@@ -108,7 +108,7 @@
> + 						    Interface *interface,
> + 						    NihList *prototypes,
> + 						    NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *     interface_proxy_get_all_notify_function (const void *parent,
> + 						    const char *prefix,
> +@@ -116,14 +116,14 @@
> + 						    NihList *prototypes,
> + 						    NihList *typedefs,
> + 						    NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *     interface_proxy_get_all_sync_function   (const void *parent,
> + 						    const char *prefix,
> + 						    Interface *interface,
> + 						    NihList *prototypes,
> + 						    NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/method.h
> ++++ libnih-1.0.3/nih-dbus-tool/method.h
> +@@ -62,7 +62,7 @@
> + int       method_name_valid            (const char *name);
> + 
> + Method *  method_new                   (const void *parent, const char *name)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int       method_start_tag             (XML_Parser xmlp, const char *tag,
> + 					char * const *attr)
> +@@ -82,33 +82,33 @@
> + 					Interface *interface, Method *method,
> + 					NihList *prototypes, NihList *handlers,
> + 					NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    method_reply_function        (const void *parent, const char *prefix,
> + 					Interface *interface, Method *method,
> + 					NihList *prototypes, NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    method_proxy_function        (const void *parent, const char *prefix,
> + 					Interface *interface, Method *method,
> + 					NihList *prototypes, NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    method_proxy_notify_function (const void *parent, const char *prefix,
> + 					Interface *interface, Method *method,
> + 					NihList *prototypes, NihList *typedefs,
> + 					NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    method_proxy_sync_function   (const void *parent, const char *prefix,
> + 					Interface *interface, Method *method,
> + 					NihList *prototypes, NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    method_args_array            (const void *parent, const char *prefix,
> + 					Interface *interface, Method *method,
> + 					NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/node.h
> ++++ libnih-1.0.3/nih-dbus-tool/node.h
> +@@ -47,7 +47,7 @@
> + int        node_path_valid       (const char *name);
> + 
> + Node *     node_new              (const void *parent, const char *path)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int        node_start_tag        (XML_Parser xmlp, const char *tag,
> + 				  char * const *attr)
> +@@ -59,18 +59,18 @@
> + 
> + char *     node_interfaces_array (const void *parent, const char *prefix,
> + 				  Node *node, int object, NihList *prototypes)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *     node_object_functions (const void *parent, const char *prefix,
> + 				  Node *node,
> + 				  NihList *prototypes, NihList *handlers,
> + 				  NihList *structs, NihList *externs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *     node_proxy_functions  (const void *parent, const char *prefix,
> + 				  Node *node,
> + 				  NihList *prototypes, NihList *structs,
> + 				  NihList *typedefs, NihList *externs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/marshal.h
> ++++ libnih-1.0.3/nih-dbus-tool/marshal.h
> +@@ -35,7 +35,7 @@
> + 	       const char *prefix, const char *interface_symbol,
> + 	       const char *member_symbol, const char *symbol,
> + 	       NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/type.c
> ++++ libnih-1.0.3/nih-dbus-tool/type.c
> +@@ -1101,7 +1101,7 @@
> + 	nih_assert (block != NULL);
> + 	nih_assert (var != NULL);
> + 
> +-	if (! strchr (var->type, '*'))
> ++	if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
> + 		return *block;
> + 
> + 	if (next && (! strcmp (next->type, "size_t"))) {
> +--- libnih-1.0.3.orig/nih-dbus-tool/property.h
> ++++ libnih-1.0.3/nih-dbus-tool/property.h
> +@@ -65,7 +65,7 @@
> + 					      const char *name,
> + 					      const char *type,
> + 					      NihDBusAccess access)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + int       property_start_tag                 (XML_Parser xmlp, const char *tag,
> + 					      char * const *attr)
> +@@ -88,7 +88,7 @@
> + 					      NihList *prototypes,
> + 					      NihList *handlers,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *    property_object_set_function       (const void *parent,
> + 					      const char *prefix,
> + 					      Interface *interface,
> +@@ -96,7 +96,7 @@
> + 					      NihList *prototypes,
> + 					      NihList *handlers,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    property_proxy_get_function        (const void *parent,
> + 					      const char *prefix,
> +@@ -104,7 +104,7 @@
> + 					      Property *property,
> + 					      NihList *prototypes,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *    property_proxy_get_notify_function (const void *parent,
> + 					      const char *prefix,
> + 					      Interface *interface,
> +@@ -112,7 +112,7 @@
> + 					      NihList *prototypes,
> + 					      NihList *typedefs,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    property_proxy_set_function        (const void *parent,
> + 					      const char *prefix,
> +@@ -120,7 +120,7 @@
> + 					      Property *property,
> + 					      NihList *prototypes,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *    property_proxy_set_notify_function (const void *parent,
> + 					      const char *prefix,
> + 					      Interface *interface,
> +@@ -128,7 +128,7 @@
> + 					      NihList *prototypes,
> + 					      NihList *typedefs,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + char *    property_proxy_get_sync_function   (const void *parent,
> + 					      const char *prefix,
> +@@ -136,14 +136,14 @@
> + 					      Property *property,
> + 					      NihList *prototypes,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + char *    property_proxy_set_sync_function   (const void *parent,
> + 					      const char *prefix,
> + 					      Interface *interface,
> + 					      Property *property,
> + 					      NihList *prototypes,
> + 					      NihList *structs)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + NIH_END_EXTERN
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_main.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/test_main.c
> +@@ -100,10 +100,10 @@
> + 
> + extern char *source_file_path (const void *parent, const char *output_path,
> + 			       const char *filename)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + extern char *header_file_path (const void *parent, const char *output_path,
> + 			       const char *filename)
> +-	__attribute__ ((warn_unused_result, malloc));
> ++	__attribute__ ((warn_unused_result));
> + 
> + void
> + test_source_file_path (void)
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> +@@ -12524,6 +12524,7 @@
> + 		dbus_message_iter_init (reply, &iter);
> + 
> + 		dbus_message_iter_get_basic (&iter, &str_value);
> ++		TEST_NE (str_value[0], '\0');
> + 		TEST_TRUE (strchr ("0123456789", str_value[0]));
> + 
> + 		dbus_message_unref (reply);
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
> +@@ -1479,39 +1479,41 @@
> + 				   "\treturn -1;\n"
> + 				   "}\n"
> + 				   "\n"
> +-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> +-				   "\tDBusMessageIter value_element_iter;\n"
> +-				   "\tconst int16_t * value_element;\n"
> +-				   "\tsize_t          value_element_len;\n"
> ++				   "if (value) {\n"
> ++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> ++				   "\t\tDBusMessageIter value_element_iter;\n"
> ++				   "\t\tconst int16_t * value_element;\n"
> ++				   "\t\tsize_t          value_element_len;\n"
> + 				   "\n"
> +-				   "\tvalue_element = value[value_i];\n"
> +-				   "\tvalue_element_len = value_len[value_i];\n"
> ++				   "\t\tvalue_element = value[value_i];\n"
> ++				   "\t\tvalue_element_len = value_len[value_i];\n"
> + 				   "\n"
> + 
> +-				   "\t/* Marshal an array onto the message */\n"
> +-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal an array onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
> +-				   "\t\tint16_t value_element_element;\n"
> ++				   "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
> ++				   "\t\t\tint16_t value_element_element;\n"
> + 				   "\n"
> +-				   "\t\tvalue_element_element = value_element[value_element_i];\n"
> ++				   "\t\t\tvalue_element_element = value_element[value_element_i];\n"
> + 				   "\n"
> +-				   "\t\t/* Marshal a int16_t onto the message */\n"
> +-				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
> +-				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\t/* Marshal a int16_t onto the message */\n"
> ++				   "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
> ++				   "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\t\treturn -1;\n"
> ++				   "\t\t\t}\n"
> ++				   "\t\t}\n"
> ++				   "\n"
> ++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> + 				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> + 				   "\t\t\treturn -1;\n"
> + 				   "\t\t}\n"
> +-				   "\t}\n"
> +-				   "\n"
> +-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> + 
> ++				   "\t}\n"
> + 				   "}\n"
> + 				   "\n"
> + 				   "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
> +@@ -1766,15 +1768,17 @@
> + 				   "\treturn -1;\n"
> + 				   "}\n"
> + 				   "\n"
> +-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> +-				   "\tconst char *value_element;\n"
> ++				   "if (value) {\n"
> ++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> ++				   "\t\tconst char *value_element;\n"
> + 				   "\n"
> +-				   "\tvalue_element = value[value_i];\n"
> ++				   "\t\tvalue_element = value[value_i];\n"
> + 				   "\n"
> +-				   "\t/* Marshal a char * onto the message */\n"
> +-				   "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> ++				   "\t\t/* Marshal a char * onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\t}\n"
> + 				   "}\n"
> + 				   "\n"
> +@@ -1933,35 +1937,39 @@
> + 				   "\treturn -1;\n"
> + 				   "}\n"
> + 				   "\n"
> +-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> +-				   "\tDBusMessageIter value_element_iter;\n"
> +-				   "\tchar * const *  value_element;\n"
> ++				   "if (value) {\n"
> ++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> ++				   "\t\tDBusMessageIter value_element_iter;\n"
> ++				   "\t\tchar * const *  value_element;\n"
> + 				   "\n"
> +-				   "\tvalue_element = value[value_i];\n"
> ++				   "\t\tvalue_element = value[value_i];\n"
> + 				   "\n"
> +-				   "\t/* Marshal an array onto the message */\n"
> +-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> +-				   "\n"
> +-				   "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
> +-				   "\t\tconst char *value_element_element;\n"
> ++				   "\t\t/* Marshal an array onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\t\tvalue_element_element = value_element[value_element_i];\n"
> ++				   "\t\tif (value_element) {\n"
> ++				   "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
> ++				   "\t\t\t\tconst char *value_element_element;\n"
> ++				   "\n"
> ++				   "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
> ++				   "\n"
> ++				   "\t\t\t\t/* Marshal a char * onto the message */\n"
> ++				   "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
> ++				   "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\t\t\treturn -1;\n"
> ++				   "\t\t\t\t}\n"
> ++				   "\t\t\t}\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\t\t/* Marshal a char * onto the message */\n"
> +-				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
> +-				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> + 				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> + 				   "\t\t\treturn -1;\n"
> + 				   "\t\t}\n"
> + 				   "\t}\n"
> +-				   "\n"
> +-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> + 				   "}\n"
> + 				   "\n"
> + 				   "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
> +@@ -2194,16 +2202,18 @@
> + 				   "\treturn -1;\n"
> + 				   "}\n"
> + 				   "\n"
> +-				   "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
> +-				   "\tconst char *value_item2_element;\n"
> ++				   "if (value_item2) {\n"
> ++				   "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
> ++				   "\t\tconst char *value_item2_element;\n"
> + 				   "\n"
> +-				   "\tvalue_item2_element = value_item2[value_item2_i];\n"
> ++				   "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
> + 				   "\n"
> +-				   "\t/* Marshal a char * onto the message */\n"
> +-				   "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> ++				   "\t\t/* Marshal a char * onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\t}\n"
> + 				   "}\n"
> + 				   "\n"
> +@@ -2642,41 +2652,43 @@
> + 				   "\treturn -1;\n"
> + 				   "}\n"
> + 				   "\n"
> +-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> +-				   "\tDBusMessageIter                  value_element_iter;\n"
> +-				   "\tconst char *                     value_element_item0;\n"
> +-				   "\tuint32_t                         value_element_item1;\n"
> +-				   "\tconst MyStructArrayValueElement *value_element;\n"
> ++				   "if (value) {\n"
> ++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> ++				   "\t\tDBusMessageIter                  value_element_iter;\n"
> ++				   "\t\tconst char *                     value_element_item0;\n"
> ++				   "\t\tuint32_t                         value_element_item1;\n"
> ++				   "\t\tconst MyStructArrayValueElement *value_element;\n"
> + 				   "\n"
> +-				   "\tvalue_element = value[value_i];\n"
> ++				   "\t\tvalue_element = value[value_i];\n"
> + 				   "\n"
> +-				   "\t/* Marshal a structure onto the message */\n"
> +-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal a structure onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tvalue_element_item0 = value_element->item0;\n"
> ++				   "\t\tvalue_element_item0 = value_element->item0;\n"
> + 				   "\n"
> +-				   "\t/* Marshal a char * onto the message */\n"
> +-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal a char * onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tvalue_element_item1 = value_element->item1;\n"
> ++				   "\t\tvalue_element_item1 = value_element->item1;\n"
> + 				   "\n"
> +-				   "\t/* Marshal a uint32_t onto the message */\n"
> +-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal a uint32_t onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> ++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\t}\n"
> + 				   "}\n"
> + 				   "\n"
> +@@ -2912,41 +2924,43 @@
> + 				   "\treturn -1;\n"
> + 				   "}\n"
> + 				   "\n"
> +-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> +-				   "\tDBusMessageIter                     value_element_iter;\n"
> +-				   "\tconst char *                        value_element_item0;\n"
> +-				   "\tuint32_t                            value_element_item1;\n"
> +-				   "\tconst MyDictEntryArrayValueElement *value_element;\n"
> ++				   "if (value) {\n"
> ++				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> ++				   "\t\tDBusMessageIter                     value_element_iter;\n"
> ++				   "\t\tconst char *                        value_element_item0;\n"
> ++				   "\t\tuint32_t                            value_element_item1;\n"
> ++				   "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
> + 				   "\n"
> +-				   "\tvalue_element = value[value_i];\n"
> ++				   "\t\tvalue_element = value[value_i];\n"
> + 				   "\n"
> +-				   "\t/* Marshal a structure onto the message */\n"
> +-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal a structure onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tvalue_element_item0 = value_element->item0;\n"
> ++				   "\t\tvalue_element_item0 = value_element->item0;\n"
> + 				   "\n"
> +-				   "\t/* Marshal a char * onto the message */\n"
> +-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal a char * onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tvalue_element_item1 = value_element->item1;\n"
> ++				   "\t\tvalue_element_item1 = value_element->item1;\n"
> + 				   "\n"
> +-				   "\t/* Marshal a uint32_t onto the message */\n"
> +-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> +-				   "\t}\n"
> ++				   "\t\t/* Marshal a uint32_t onto the message */\n"
> ++				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\n"
> +-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> +-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> +-				   "\t\treturn -1;\n"
> ++				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> ++				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> ++				   "\t\t\treturn -1;\n"
> ++				   "\t\t}\n"
> + 				   "\t}\n"
> + 				   "}\n"
> + 				   "\n"
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> +@@ -27359,6 +27359,7 @@
> + 		TEST_TRUE (unix_fd_to_str_replied);
> + 
> + 		TEST_EQ_P (last_data, parent);
> ++		TEST_NE (last_str_value[0], '\0');
> + 		TEST_TRUE (strchr ("0123456789", last_str_value[0]));
> + 		TEST_ALLOC_PARENT (last_str_value, parent);
> + 
> +@@ -27673,6 +27674,7 @@
> + 
> + 		TEST_EQ (ret, 0);
> + 
> ++		TEST_NE (str_value[0], '\0');
> + 		TEST_TRUE (strchr ("0123456789", str_value[0]));
> + 		TEST_ALLOC_PARENT (str_value, parent);
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_property.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/test_property.c
> +@@ -8733,7 +8733,7 @@
> + 	TypeVar *       var;
> + 	NihListEntry *  attrib;
> + 	NihDBusProxy *  proxy = NULL;
> +-	void *          parent = NULL;
> ++	void *          parent __attribute__((unused)) = NULL;
> + 	pid_t           pid = -1;
> + 	int             status;
> + 	DBusMessage *   method_call;
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
> +@@ -136,17 +136,19 @@
> + 			goto enomem;
> + 		}
> + 
> +-		for (size_t output_i = 0; output[output_i]; output_i++) {
> +-			const char *output_element;
> ++		if (output) {
> ++			for (size_t output_i = 0; output[output_i]; output_i++) {
> ++				const char *output_element;
> + 
> +-			output_element = output[output_i];
> ++				output_element = output[output_i];
> + 
> +-			/* Marshal a char * onto the message */
> +-			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> +-				dbus_message_iter_abandon_container (&iter, &output_iter);
> +-				dbus_message_unref (reply);
> +-				reply = NULL;
> +-				goto enomem;
> ++				/* Marshal a char * onto the message */
> ++				if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> ++					dbus_message_iter_abandon_container (&iter, &output_iter);
> ++					dbus_message_unref (reply);
> ++					reply = NULL;
> ++					goto enomem;
> ++				}
> + 			}
> + 		}
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
> +@@ -7,7 +7,6 @@
> + 	DBusMessageIter output_iter;
> + 
> + 	nih_assert (message != NULL);
> +-	nih_assert (output != NULL);
> + 
> + 	/* If the sender doesn't care about a reply, don't bother wasting
> + 	 * effort constructing and sending one.
> +@@ -28,16 +27,18 @@
> + 		return -1;
> + 	}
> + 
> +-	for (size_t output_i = 0; output[output_i]; output_i++) {
> +-		const char *output_element;
> +-
> +-		output_element = output[output_i];
> +-
> +-		/* Marshal a char * onto the message */
> +-		if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> +-			dbus_message_iter_abandon_container (&iter, &output_iter);
> +-			dbus_message_unref (reply);
> +-			return -1;
> ++	if (output) {
> ++		for (size_t output_i = 0; output[output_i]; output_i++) {
> ++			const char *output_element;
> ++
> ++			output_element = output[output_i];
> ++
> ++			/* Marshal a char * onto the message */
> ++			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> ++				dbus_message_iter_abandon_container (&iter, &output_iter);
> ++				dbus_message_unref (reply);
> ++				return -1;
> ++			}
> + 		}
> + 	}
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
> +@@ -7,7 +7,6 @@
> + 	DBusMessageIter output_iter;
> + 
> + 	nih_assert (message != NULL);
> +-	nih_assert (output != NULL);
> + 
> + 	/* If the sender doesn't care about a reply, don't bother wasting
> + 	 * effort constructing and sending one.
> +@@ -28,16 +27,18 @@
> + 		return -1;
> + 	}
> + 
> +-	for (size_t output_i = 0; output[output_i]; output_i++) {
> +-		const char *output_element;
> +-
> +-		output_element = output[output_i];
> +-
> +-		/* Marshal a char * onto the message */
> +-		if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> +-			dbus_message_iter_abandon_container (&iter, &output_iter);
> +-			dbus_message_unref (reply);
> +-			return -1;
> ++	if (output) {
> ++		for (size_t output_i = 0; output[output_i]; output_i++) {
> ++			const char *output_element;
> ++
> ++			output_element = output[output_i];
> ++
> ++			/* Marshal a char * onto the message */
> ++			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> ++				dbus_message_iter_abandon_container (&iter, &output_iter);
> ++				dbus_message_unref (reply);
> ++				return -1;
> ++			}
> + 		}
> + 	}
> + 
> +--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
> ++++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
> +@@ -88,17 +88,19 @@
> + 			goto enomem;
> + 		}
> + 
> +-		for (size_t output_i = 0; output[output_i]; output_i++) {
> +-			const char *output_element;
> ++		if (output) {
> ++			for (size_t output_i = 0; output[output_i]; output_i++) {
> ++				const char *output_element;
> + 
> +-			output_element = output[output_i];
> ++				output_element = output[output_i];
> + 
> +-			/* Marshal a char * onto the message */
> +-			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> +-				dbus_message_iter_abandon_container (&iter, &output_iter);
> +-				dbus_message_unref (reply);
> +-				reply = NULL;
> +-				goto enomem;
> ++				/* Marshal a char * onto the message */
> ++				if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> ++					dbus_message_iter_abandon_container (&iter, &output_iter);
> ++					dbus_message_unref (reply);
> ++					reply = NULL;
> ++					goto enomem;
> ++				}
> + 			}
> + 		}
> + 
> diff --git a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> new file mode 100644
> index 0000000..b5e5e12
> --- /dev/null
> +++ b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> @@ -0,0 +1,40 @@
> +# Copyright (c) 2013  LG Electronics, Inc.
> +
> +SUMMARY = "libnih library"
> +DESCRIPTION = "libnih is a small library for C application development \
> +    containing functions that, despite its name, are not implemented \
> +    elsewhere in the standard library set. \
> +    \
> +    libnih is roughly equivalent to other C libraries such as glib, \
> +    except that its focus is on a small size and intended for \
> +    applications that sit very low in the software stack, especially \
> +    outside of /usr. \
> +    \
> +    It expressly does not reimplement functions that already exist in \
> +    libraries ordinarily shipped in /lib such libc6, and does not do \
> +    foolish things like invent arbitrary typedefs for perfectly good C types."
> +
> +SECTION = "libs"
> +
> +LICENSE = "GPL-2.0"
> +LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
> +
> +DEPENDS = "dbus libnih-native"
> +DEPENDS_class-native = "dbus-native"
> +
> +PR = "r0"
> +
> +SRC_URI = "https://launchpad.net/${BPN}/1.0/${PV}/+download/${BP}.tar.gz;name=tarball"
> +SRC_URI += "file://libnih_1.0.3-4ubuntu16.patch;name=patch"
> +
> +SRC_URI[tarball.md5sum] = "db7990ce55e01daffe19006524a1ccb0"
> +SRC_URI[tarball.sha256sum] = "897572df7565c0a90a81532671e23c63f99b4efde2eecbbf11e7857fbc61f405"
> +
> +SRC_URI[patch.md5sum] = ""
> +SRC_URI[patch.sha256sum] = ""
> +
> +inherit autotools
> +inherit gettext
> +
> +# target libnih requires native nih-dbus-tool
> +BBCLASSEXTEND = "native"
> -- 
> 1.8.4.2
> 
> 
> 

> -- 
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel


-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa at gmail.com




More information about the Openembedded-devel mailing list