--- libnih-1.0.3.orig/configure.ac +++ libnih-1.0.3/configure.ac @@ -9,6 +9,8 @@ AC_GNU_SOURCE AM_INIT_AUTOMAKE([1.11 gnu nostdinc check-news color-tests silent-rules]) +AC_REQUIRE_AUX_FILE([tap-driver.sh]) +AC_PROG_AWK AM_SILENT_RULES([yes]) AM_MAINTAINER_MODE([enable]) --- libnih-1.0.3.orig/ChangeLog +++ libnih-1.0.3/ChangeLog @@ -1,3 +1,84 @@ +2013-03-13 Steve Langasek + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * nih/tests/test_file.c: don't use dirent.d_type (not portable) + +2012-10-25 James Hunt + + * 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 + + * 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 + + * 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 + + * 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 * NEWS: Release 1.0.3 --- 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/Makefile.am +++ libnih-1.0.3/nih/Makefile.am @@ -78,6 +78,7 @@ EXTRA_DIST = libnih.ver libnih.supp libnih.pc.in +LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/tap-driver.sh TESTS = \ test_alloc \ test_string \ --- 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 . - * Copyright © 2009 Canonical Ltd. + * Copyright © 2011 Scott James Remnant . + * 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/test_output.h +++ libnih-1.0.3/nih/test_output.h @@ -26,27 +26,84 @@ #include #include +#include +#include +#include +#include + +#include + +static char *TEST_BLOCK_NAME; +static char *TEST_FEATURE_NAME; +static size_t TEST_COUNT = 0; +static int TEST_PLAN_CALLED = FALSE; +static inline void print_last ( void ); +/** + * TEST_PLAN: + * @_num: number of planned tests to run + * + * Output the number of tests expected to be executed. This can be + * declared only once, at the beginning or the end of the test output. + * + * If not called, an exit plan with total number of executed tests + * will be printed. + **/ +#define TEST_PLAN(_num) \ + printf ("1..%d\n", _num); TEST_PLAN_CALLED = TRUE /** - * TEST_GROUP: - * @_name: name of group being tested. + * TEST_PLAN_END: * - * Output a message indicating that a group of tests testing @_name are - * being performed. + * Output the number of tests that got executed. **/ -#define TEST_GROUP(_name) \ - printf ("Testing %s\n", _name) +#define TEST_PLAN_END() \ + if (! TEST_PLAN_CALLED) printf ("1..%zu\n", TEST_COUNT) /** - * TEST_FUNCTION: - * @_func: name of function being tested. + * TEST_PRINT_RESULT(_ok) + * @_ok: test result * - * Output a message indicating that tests of the function named @_func are + * Output result of last run function if any. + **/ +#define TEST_PRINT_RESULT() \ + if (TEST_COUNT) \ + printf ("%s %zu - %s %s\n", "ok", TEST_COUNT, TEST_BLOCK_NAME, TEST_FEATURE_NAME); \ + else { \ + static char TEST_EXIT_LOCK[30] = ""; \ + sprintf (TEST_EXIT_LOCK, "%d", getpid() ); \ + setenv ("TEST_EXIT_LOCK", TEST_EXIT_LOCK, 1); \ + atexit (print_last); \ + } \ + +/** + * print_last: + * + * atexit handler to print the last test result, and exit plan if needed. + **/ +static inline void +print_last ( void ) +{ + if ( atoi (getenv ("TEST_EXIT_LOCK")) == getpid ()) { + TEST_PRINT_RESULT (); + TEST_PLAN_END(); + } +} + + +/** + * TEST_GROUP: + * @_name: name of group being tested. + * + * Output a message indicating that a group of tests testing @_name are * being performed. **/ -#define TEST_FUNCTION(_func) \ - printf ("Testing %s()\n", _func) +#define TEST_GROUP(_name) TEST_PRINT_RESULT (); TEST_COUNT++; TEST_BLOCK_NAME=_name; TEST_FEATURE_NAME="" + + +#define BRACE () +#define STR(s) #s +#define XSTR(s) STR(s) /** * TEST_FUNCTION_FEATURE: @@ -56,18 +113,25 @@ * Output a message indicating that tests of the function named @_func are * being performed, specifically of the @_feat feature. **/ -#define TEST_FUNCTION_FEATURE(_func, _feat) \ - printf ("Testing %s() %s\n", _func, _feat) +#define TEST_FUNCTION_FEATURE(_func, _feat) TEST_GROUP(_func XSTR(BRACE)); TEST_FEATURE_NAME=_feat + +/** + * TEST_FUNCTION: + * @_func: name of function being tested. + * + * Output a message indicating that tests of the function named @_func are + * being performed. + **/ +#define TEST_FUNCTION(_func) TEST_GROUP(_func XSTR(BRACE)) /** * 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); +#define TEST_FEATURE(_feat) TEST_PRINT_RESULT (); TEST_COUNT++; TEST_FEATURE_NAME=_feat /** * TEST_FAILED: @@ -76,11 +140,11 @@ * Output a formatted message indicating that a test has failed, including * the file, line number and function where the failure happened. **/ -#define TEST_FAILED(_fmt, ...) \ - do { \ - printf ("BAD: " _fmt "\n\tat %s:%d (%s).\n", \ +#define TEST_FAILED(_fmt, ...) \ + { \ + printf ("Bail out! " _fmt "\tat %s:%d (%s).\n", \ ##__VA_ARGS__, __FILE__, __LINE__, __FUNCTION__); \ - abort (); \ - } while (0) + abort(); \ + } #endif /* NIH_TEST_OUTPUT_H */ --- 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/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/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/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.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/test_files.h +++ libnih-1.0.3/nih/test_files.h @@ -1,7 +1,7 @@ /* libnih * - * Copyright © 2009 Scott James Remnant . - * Copyright © 2009 Canonical Ltd. + * Copyright © 2011 Scott James Remnant . + * 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/error.h +++ libnih-1.0.3/nih/error.h @@ -1,7 +1,7 @@ /* libnih * - * Copyright © 2009 Scott James Remnant . - * Copyright © 2009 Canonical Ltd. + * Copyright © 2011 Scott James Remnant . + * 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/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/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/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/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/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/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/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/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 . - * Copyright © 2009 Canonical Ltd. + * Copyright © 2011 Scott James Remnant . + * 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/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/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/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/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/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/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 . - * Copyright © 2009 Canonical Ltd. + * Copyright © 2011 Scott James Remnant . + * 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/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/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/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_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 . - * Copyright © 2009 Canonical Ltd. + * Copyright © 2011 Scott James Remnant . + * 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 #include +/* 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_logging.c +++ libnih-1.0.3/nih/tests/test_logging.c @@ -31,7 +31,7 @@ #include -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_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-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/Makefile.am +++ libnih-1.0.3/nih-dbus/Makefile.am @@ -56,6 +56,7 @@ EXTRA_DIST = libnih-dbus.ver libnih-dbus.supp libnih-dbus.pc.in +LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/tap-driver.sh TESTS = \ test_dbus_error \ test_dbus_connection \ --- 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_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_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/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-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/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/Makefile.am +++ libnih-1.0.3/nih-dbus-tool/Makefile.am @@ -41,6 +41,7 @@ $(DBUS_LIBS) +LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/tap-driver.sh TESTS = \ test_main \ test_symbol \ --- 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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_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_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/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; + } } } --- 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_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_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/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/changelog +++ libnih-1.0.3/debian/changelog @@ -0,0 +1,232 @@ +libnih (1.0.3-4ubuntu19) trusty; urgency=low + + * Fix TEST_FUNCTION_FEATURE formatting. + + -- Dmitrijs Ledkovs Thu, 07 Nov 2013 04:01:12 +0000 + +libnih (1.0.3-4ubuntu18) trusty; urgency=low + + * Optimise TAP compatible test-suite, generated out of range conditional + branches on arm*, but not any other platforms. + + -- Dmitrijs Ledkovs Thu, 07 Nov 2013 00:18:03 +0000 + +libnih (1.0.3-4ubuntu17) trusty; urgency=low + + * Apply patch to generate TAP compatible test-suite output. + + -- Dmitrijs Ledkovs Wed, 06 Nov 2013 17:37:27 +0000 + +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 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 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 Thu, 13 Dec 2012 10:00:27 -0500 + +libnih (1.0.3-4ubuntu13) raring; urgency=low + + [ Petr Lautrbach , Dmitrijs Ledkovs ] + * Fallback to lstat, if dirent.d_type is not available (not portable) + (LP: #672643) (Closes: #695604) + + -- Dmitrijs Ledkovs 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 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 Wed, 03 Oct 2012 16:49:40 +0100 + +libnih (1.0.3-4ubuntu10) quantal; urgency=low + + * Update config.guess,sub for aarch64 + + -- Wookey 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 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 Fri, 10 Feb 2012 12:13:25 -0800 + +libnih (1.0.3-4ubuntu7) precise; urgency=low + + * Relax dependency on libc6. + + -- Matthias Klose Wed, 08 Feb 2012 23:43:21 +0100 + +libnih (1.0.3-4ubuntu6) precise; urgency=low + + * Rebuild with libc6-dev (>= 2.15~). + + -- Matthias Klose 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 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 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 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 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 Mon, 23 May 2011 19:28:19 +0100 + +libnih (1.0.3-1ubuntu1) natty; urgency=low + + * Rebuild with libc6-dev (>= 2.13~). + + -- Matthias Klose 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 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 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 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 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 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 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 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 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 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 Sat, 28 Nov 2009 21:14:00 +0000 --- 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.install +++ libnih-1.0.3/debian/libnih1.install @@ -0,0 +1 @@ +lib/*/libnih.so.* --- 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/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 + +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/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/libnih1.docs +++ libnih-1.0.3/debian/libnih1.docs @@ -0,0 +1,3 @@ +AUTHORS +NEWS +README --- 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-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/control +++ libnih-1.0.3/debian/control @@ -0,0 +1,81 @@ +Source: libnih +Section: libs +Priority: required +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Scott James Remnant +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/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 Mon, 02 May 2011 15:08:33 -0700 + +libnih (1.0.3-3) unstable; urgency=low + + * New maintainer. Closes: #624442. + + -- Scott James Remnant 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 Thu, 10 Feb 2011 20:25:18 +0100 + +libnih (1.0.3-1ubuntu1) natty; urgency=low + + * Rebuild with libc6-dev (>= 2.13~). + + -- Matthias Klose 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 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 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 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 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 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 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 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 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 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 Sat, 28 Nov 2009 21:14:00 +0000 + --- 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/libnih-dbus1.install +++ libnih-1.0.3/debian/libnih-dbus1.install @@ -0,0 +1 @@ +lib/*/libnih-dbus.so.* --- libnih-1.0.3.orig/debian/source/format +++ libnih-1.0.3/debian/source/format @@ -0,0 +1 @@ +1.0