On (19/10/14 22:36), Dmitri Pal wrote: > Firstly, I would like to appologize for late review.
>On top of the original 6+1 patches which I did not touch and squash (I just >changed the order of them as suggested by Lukas plus put 7th patch right >after the change to module ini_augment.c) >I added 3 patches: >- 0006-Fixing-the-main.path - addresses all feedback provided above. I Hope I >did not miss anything. I did not squash it so it is easy to see that things >have been fixed. >- 0008-Cleaning-Unit-test.patch - does some cleaning of the code in the unit >test and also makes it not fail in your case by sorting the results before >comparison. See the not in the patch >- 0010-Correction-to-make-file.patch - corrects the make file and fixes >symbols file as Lukas proposed. The only thing that is not addressed is the >recommendation for linking ref_array explicitly. I am not sure I get it. The >library libini_config_la already includes everything needed see below (line >261 Makefile.am): There are distributions which have disabled link_all_dep_libs (debian) It means that linker will not use dependencies from your libraries. And it will cause linker errors. CCLD ini_augment_ut /usr/bin/ld: ini/ini_augment_ut.o: undefined reference to symbol 'make_normalized_absolute_path@@PATH_UTILS_0.2.1' .libs/libpath_utils.so.1: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status Makefile:1140: recipe for target 'ini_augment_ut' failed make[1]: *** [ini_augment_ut] Error 1 and after linking with libpath_utils, there is an another error. /usr/bin/ld: ini/ini_augment_ut.o: undefined reference to symbol 'ref_array_get@@REF_ARRAY_0.1.1' .libs/libref_array.so.1: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status Makefile:1140: recipe for target 'ini_augment_ut' failed make[1]: *** [ini_augment_ut] Error 1 make[1]: *** Waiting for unfinished jobs.... make[1]: Leaving directory '/dev/shm/ding-libs_build' You need to link unit tests with libraries which are used in unit test: Here is a prrof of used functions in ini_augment_ut. (weak symbols and glibc functions are filtered out). sh-4.3$ objdump -T .libs/ini_augment_ut | grep -v GLIBC | grep -v " w " .libs/ini_augment_ut: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: 0000000000000000 DF *UND* 0000000000000000 INI_CONFIG_1.1.0 ini_config_augment 0000000000000000 DF *UND* 0000000000000000 INI_CONFIG_1.1.0 ini_config_destroy 0000000000000000 DF *UND* 0000000000000000 INI_CONFIG_1.1.0 ini_config_create 0000000000000000 DF *UND* 0000000000000000 REF_ARRAY_0.1.1 ref_array_destroy 0000000000000000 DF *UND* 0000000000000000 REF_ARRAY_0.1.1 ref_array_get 0000000000000000 DF *UND* 0000000000000000 PATH_UTILS_0.2.1 make_normalized_absolute_path 0000000000000000 DF *UND* 0000000000000000 COLLECTION_0.6.2 col_debug_collection ^^^^^^^^^^^^^^^^ BTW: This is a benefit of version symbol files. > >libini_config_la_LIBADD = \ > libcollection.la \ > libpath_utils.la \ > libref_array.la \ > libbasicobjects.la > >Also I did not merge the proposed sorting function patch. I had to address >de-referencing issue to I blended it in first and then add additional cleanup >on top. > >Once reviewed the patches 4-5-6, 7-8, 9-10 can be squashed respectfully >before pushing. > It is not problem to see changes between two patches with utility interdiff I would prefer to squash changes; then it's easier to review patches. >Thanks for review! > >-- >Thank you, >Dmitri Pal > >Sr. Engineering Manager IdM portfolio >Red Hat, Inc. > >From c443d984a19df8fbbdb7337563ea4ec0ea2d693d Mon Sep 17 00:00:00 2001 >From: Dmitri Pal <d...@dpal.csb> >Date: Sun, 7 Sep 2014 22:55:02 +0200 >Subject: [PATCH 09/10] [INI] Make the merge function build > >--- > Makefile.am | 15 +++++- > ini/ini_configobj.h | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ > ini/libini_config.sym | 1 + > 3 files changed, 128 insertions(+), 3 deletions(-) > >diff --git a/Makefile.am b/Makefile.am >index 32fcfae..7f38e50 100644 >--- a/Makefile.am //snip > >+ini_augment_ut_SOURCES = ini/ini_augment_ut.c >+ini_augment_ut_LDADD = libini_config.la libcollection.la libbasicobjects.la >+ libraries should be fixed as I explained few lines above. >From 9bad4d86ab68b1af1c0afd06ae826dd27aed4ef3 Mon Sep 17 00:00:00 2001 >From: Dmitri Pal <d...@dpal.csb> >Date: Sun, 7 Sep 2014 16:42:00 +0200 >Subject: [PATCH 04/10] [INI] New function to merge snippets > >The patch includes the implementation of the function >and the unit test >--- > ini/ini_augment.c | 924 ++++++++++++++++++++++++++++++++++++++++++++++++++ > ini/ini_augment_ut.c | 353 +++++++++++++++++++ > 2 files changed, 1277 insertions(+), 0 deletions(-) > create mode 100644 ini/ini_augment.c > create mode 100644 ini/ini_augment_ut.c > >diff --git a/ini/ini_augment.c b/ini/ini_augment.c >new file mode 100644 >index 0000000..7f59d38 >--- /dev/null >+++ b/ini/ini_augment.c >@@ -0,0 +1,924 @@ >+/* >+ INI LIBRARY >+ >+ Module represents part of the INI interface. >+ The main function in this module allows to merge >+ snippets of different config files. >+ >+ Copyright (C) Dmitri Pal <d...@redhat.com> 2014 >+ >+ INI Library is free software: you can redistribute it and/or modify >+ it under the terms of the GNU Lesser General Public License as published >by >+ the Free Software Foundation, either version 3 of the License, or >+ (at your option) any later version. >+ >+ INI Library 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 Lesser General Public License for more details. >+ >+ You should have received a copy of the GNU Lesser General Public License >+ along with INI Library. If not, see <http://www.gnu.org/licenses/>. >+*/ >+ >+#define _GNU_SOURCE ^^^^^^^^^^^ Which function requires this defined macro? I didn't have a problem after removing this macro. It would be good to add comment (at least) or remove it. >+#include "config.h" >+#include <errno.h> >+#include <stdarg.h> >+#include <dirent.h> >+#include <stdio.h> >+#include <string.h> >+#include <limits.h> >+#include <sys/types.h> >+#include <regex.h> >+#include "trace.h" >+#include "collection.h" >+#include "collection_tools.h" >+#include "ini_configobj.h" >+#include "ini_config_priv.h" >+#include "ini_defines.h" >+#include "path_utils.h" >+ >+/* Constants to match */ >+#define INI_CURRENT_DIR "." >+#define INI_PARENT_DIR ".." >+ >+/* Size of incremental growth for ref of the array of strings */ >+#define INI_AUG_ARR_SIZE_INC 50 >+ >+ //snip >+ >+/* Prepare array of regular expressions */ >+static int ini_aug_regex_prepare(const char **patterns, >+ struct ref_array *ra_err, >+ struct ref_array **ra_regex) >+{ >+ int error = EOK; >+ int reg_err = 0; >+ char **pat = NULL; >+ struct ref_array *ra = NULL; >+ regex_t *preg = NULL; >+ size_t buf_size = 0; >+ char *err_str = NULL; >+ >+ TRACE_FLOW_ENTRY(); >+ >+ if (patterns) { >+ >+ /* Create array to mark bad patterns */ >+ error = ref_array_create(&ra, >+ sizeof(regex_t *), >+ INI_AUG_ARR_SIZE_INC, >+ regex_cleanup, >+ NULL); >+ if (error) { >+ TRACE_ERROR_NUMBER("Failed to create array.", error); >+ return error; >+ } >+ >+ memcpy(&pat, &patterns, sizeof(char **)); You are assigning pointer "patterns" to pointer "pat" with memcpy. >+ >+ /* Run through the list and save precompiled patterns */ >+ while (*pat) { ^^^^^^^^^^^^^^ the for loop will improve readability of this section and remove incrementing of "pat" on two places. Something like this: char *pattern; size_t i; for (i = 0; patterns[i] != NULL; i++) { pattern = patterns[i]; // or to use pointer arithmetics // and we needn't use temporary variable "pat" here // we can directly use function argument "patterns" for (; *patterns != NULL; patterns++) { pattern = *patterns; >+ TRACE_INFO_STRING("Pattern:", *pat); >+ >+ preg = calloc(1, sizeof(regex_t)); >+ if (preg == NULL) { >+ TRACE_ERROR_NUMBER("Failed to create array.", ENOMEM); >+ ref_array_destroy(ra); >+ return ENOMEM; >+ } >+ if (reg_err) { >+ /* Get size, allocate buffer, record error... */ >+ buf_size = regerror(reg_err, preg, NULL, 0); >+ err_str = malloc (buf_size); >+ if (err_str == NULL) { >+ TRACE_ERROR_NUMBER("Failed to create array.", ENOMEM); >+ ref_array_destroy(ra); >+ free(preg); >+ return ENOMEM; >+ } >+ regerror(reg_err, preg, err_str, buf_size); >+ free(preg); >+ ini_aug_add_string(ra_err, >+ "Failed to process expression: %s." >+ " Compilation returned error: %s", >+ *pat, err_str); >+ >+ /* All error processing is done - advance to next pattern */ >+ pat++; >+ continue; >+ } >+ /* In case of no error add compiled expression into the buffer */ >+ error = ref_array_append(ra, (void *)&preg); >+ if (error) { >+ TRACE_ERROR_NUMBER("Failed to add element to array.", error); >+ ref_array_destroy(ra); >+ free(preg); >+ return error; >+ } >+ /* Advance */ >+ pat++; >+ } >+ } >+ >+ *ra_regex = ra; >+ /* ref_array_debug(*ra_regex, 1); */ >+ >+ TRACE_FLOW_EXIT(); >+ return EOK; >+} >+/* Check if this is a file and validate permission */ >+static bool ini_check_file_perm(char *name, >+ struct access_check *check_perm, >+ struct ref_array *ra_err) >+{ >+ bool ret = false; >+ int error = EOK; >+ struct stat file_info; >+ >+ TRACE_FLOW_ENTRY(); >+ >+ errno = 0; >+ if (stat(name, &file_info) == -1) { >+ error = errno; >+ TRACE_ERROR_NUMBER("Failed to get file stats", error); >+ ini_aug_add_string(ra_err, >+ "Failed to read metadata for file %s." >+ " Skipping.", >+ name); >+ return false; >+ } >+ >+ if (!S_ISREG(file_info.st_mode)) { >+ ini_aug_add_string(ra_err, >+ "File %s is not a regular file. Skipping.", >+ name); >+ return false; >+ } >+ >+ if ((check_perm) && (check_perm->flags)) { >+ error = access_check_int(&file_info, >+ check_perm->flags, >+ check_perm->uid, >+ check_perm->gid, >+ check_perm->mode, >+ check_perm->mask); >+ if(error) { >+ TRACE_ERROR_NUMBER("Access check returned", error); >+ ini_aug_add_string(ra_err, >+ "File %s did not pass access check. Skipping.", >+ name); >+ return false; >+ } >+ } >+ >+ ret = true; >+ >+ TRACE_INFO_STRING("Returning", (ret ? "true" : "false")); ^^^^ ret will be always true here. Did you plan to have label "done" and to use got done instead of return false? >+ TRACE_FLOW_EXIT(); >+ >+ return ret; >+} >+/* Function to merge additional snippets of the config file >+ * from a provided directory. >+ */ >+int ini_config_augment(struct ini_cfgobj *base_cfg, >+ const char *path, >+ const char **patterns, >+ const char **sections, ^^^^^^^^^^^^^^^^^^^^^ It would be good to change type of arguments "patterns" and "sections" "const char **" -> "const char * var_name[]" It will be clear that we expect array of constant strings and they aren't output arguments. After this change, you need't use explicit casting in unit tests. LS _______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/sssd-devel