diff options
author | Dai Caiyun <daicy.fnst@cn.fujitsu.com> | 2016-04-20 06:24:02 +0300 |
---|---|---|
committer | Martin Jansa <Martin.Jansa@gmail.com> | 2016-07-29 11:01:01 +0200 |
commit | a720b93af53f31476c169d222cb47669ffce5dea (patch) | |
tree | e683d42b393bba6b59c46d39f75e3ef0e8d61ed8 /meta-oe/recipes-support/libnih | |
parent | 26fbc9bf45d3cd28dc7a7e7dc013908a61631749 (diff) | |
download | meta-openembedded-contrib-a720b93af53f31476c169d222cb47669ffce5dea.tar.gz |
libnih: add new recipe to meta-oe
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.
Signed-off-by: Dai Caiyun <daicy.fnst@cn.fujitsu.com>
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
Diffstat (limited to 'meta-oe/recipes-support/libnih')
-rw-r--r-- | meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch | 3593 | ||||
-rw-r--r-- | meta-oe/recipes-support/libnih/libnih_1.0.3.bb | 38 |
2 files changed, 3631 insertions, 0 deletions
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 0000000000..5d125c8514 --- /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@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@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@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@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@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@redhat.com> ++ ++ * nih/tests/test_file.c: don't use dirent.d_type (not portable) ++ ++2012-10-25 James Hunt <james.hunt@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@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@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@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@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@netsplit.com>. +- * Copyright © 2009 Canonical Ltd. ++ * Copyright © 2011 Scott James Remnant <scott@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 _@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@netsplit.com>. +- * Copyright © 2009 Canonical Ltd. ++ * Copyright © 2011 Scott James Remnant <scott@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@netsplit.com>. +- * Copyright © 2009 Canonical Ltd. ++ * Copyright © 2011 Scott James Remnant <scott@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@netsplit.com>. +- * Copyright © 2009 Canonical Ltd. ++ * Copyright © 2011 Scott James Remnant <scott@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@netsplit.com>. +- * Copyright © 2009 Canonical Ltd. ++ * Copyright © 2011 Scott James Remnant <scott@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@netsplit.com>. +- * Copyright © 2009 Canonical Ltd. ++ * Copyright © 2011 Scott James Remnant <scott@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@lists.ubuntu.com> ++XSBC-Original-Maintainer: Scott James Remnant <scott@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@ubuntu.com> Thu, 13 Dec 2012 10:00:27 -0500 ++ ++libnih (1.0.3-4ubuntu13) raring; urgency=low ++ ++ [ Petr Lautrbach <plautrba@redhat.com>, Dmitrijs Ledkovs ] ++ * Fallback to lstat, if dirent.d_type is not available (not portable) ++ (LP: #672643) (Closes: #695604) ++ ++ -- Dmitrijs Ledkovs <dmitrij.ledkov@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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 0000000000..97385a1c0a --- /dev/null +++ b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb @@ -0,0 +1,38 @@ +# 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 \ + file://libnih_1.0.3-4ubuntu16.patch \ +" + +SRC_URI[md5sum] = "db7990ce55e01daffe19006524a1ccb0" +SRC_URI[sha256sum] = "897572df7565c0a90a81532671e23c63f99b4efde2eecbbf11e7857fbc61f405" + +inherit autotools +inherit gettext + +# target libnih requires native nih-dbus-tool +BBCLASSEXTEND = "native" |