I'm trying to pass odp-check on that series. If yesterday it hang on odp-ring test rolling forever on patch 9.
Now I have error: ERROR: files left in build directory after distclean: ./platform/linux-generic/test/0] don't know whish exactly patch does that. Maxim. On 19 May 2016 at 19:26, Christophe Milard <[email protected]> wrote: > A function (odph_merge_getopt_options()) to merge command line arguments > is added. This function can be called by intermediate clients > (e.g c_unit_common) before calling odph_parse_options(). > The new function, odph_parse_options() is also added > to parse options meant for the helpers out of a the command line. This > parse function picks up options altering the behaviour of the helpers out > of the command line, and also checks for unknown options (i.e. options not > belonging to the caller set of options or to the helpers.) > No helper options are definied (yet). > > Signed-off-by: Christophe Milard <[email protected]> > --- > helper/include/odp/helper/linux.h | 71 ++++++++++++++++++++++ > helper/linux.c | 123 > ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 194 insertions(+) > > diff --git a/helper/include/odp/helper/linux.h > b/helper/include/odp/helper/linux.h > index e2dca35..d47abef 100644 > --- a/helper/include/odp/helper/linux.h > +++ b/helper/include/odp/helper/linux.h > @@ -25,6 +25,7 @@ extern "C" { > #include <odp_api.h> > > #include <pthread.h> > +#include <getopt.h> > #include <sys/types.h> > > /** @addtogroup odph_linux ODPH LINUX > @@ -134,6 +135,76 @@ int odph_linux_process_fork_n(odph_linux_process_t > *proc_tbl, > int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num); > > /** > + * Merge getopt options > + * > + * Given two sets of getopt options (each containing possibly both short > + * options -a string- and long options -a option array-) this function > + * return a single set (i.e. a string for short and an array for long) > + * being the concatenation of the two given sets. > + * Due to the fact that the size of these arrays is unknown at compilation > + * time, this function actually mallocs the the resulting arrays. > + * The fourth and fith parameters are actually pointers where these > malloc'ed > + * areas are returned. > + * This means that the caller of this function has to free the two > returned > + * areas! > + * > + * @param shortopts1 first set of short options (a string) > + * @param shortopts2 second set of short options (a string) > + * @param longopts1 first set of long options (a getopt option array) > + * @param longopts2 second set of long options (a getopt option array) > + * @param shortopts a pointer where the address of the short options list > + * (a string) is returned. It contains the concatenation > of > + * the two given short option strings. > + * @param longopts a pointer where the address of the long options list > + * (a getopt option array) is returned. > + * It contains the concatenation of the two given long > + * option arrays. > + * if any of shortopts1, shortopts2, longopts1, longopts2 is NULL, the > + * corresponding list as assumed to be empty. > + * if any of shortopts, longopts is NULL, the corresponding malloc is not > + * performed. > + * > + * @return On success: 0 : both shortopts and longopts are returned > (assuming > + * the given pointer where not null), possibly > + * pointing to an empty string or an empty option > array. > + * On success, the caller is due to free these > areas. > + * On failure: -1: Nothing is malloc'ed. > + */ > +int odph_merge_getopt_options(const char *shortopts1, > + const char *shortopts2, > + const struct option *longopts1, > + const struct option *longopts2, > + char **shortopts, > + struct option **longopts); > + > +/** > + * Parse linux helper options > + * > + * Parse the command line options. Pick up options meant for the helper > itself. > + * If the caller is also having a set of option to parse, it should > include > + * their description here (shortopts desribes the short options and > longopts > + * describes the long options, as for getopt_long()). > + * This function will issue errors on unknown arguments, so callers > failing > + * to pass their own command line options description here will see their > + * options rejected. > + * (the caller wants to set opterr to zero when parsing its own stuff > + * with getopts to avoid reacting on helper's options). > + * > + * @param argc argument count > + * @param argv argument values > + * @param caller_shortopts caller's set of short options (string). or > NULL. > + * @param caller_longopts caller's set of long options (getopt option > array). > + * or NULL. > + * > + * @return On success: 0 > + * On failure: -1 failure occurs if a value passed for a helper > + * option is invalid, or on meeting unknown options. > + */ > +int odph_parse_options(int argc, char *argv[], > + const char *caller_shortopts, > + const struct option *caller_longopts); > + > +/** > * @} > */ > > diff --git a/helper/linux.c b/helper/linux.c > index 24e243b..ef435bd 100644 > --- a/helper/linux.c > +++ b/helper/linux.c > @@ -236,3 +236,126 @@ int odph_linux_process_wait_n(odph_linux_process_t > *proc_tbl, int num) > > return 0; > } > + > +/* > + * return the number of elements in an array of getopt options, excluding > the > + * terminating {0,0,0,0} > + */ > +static int get_getopt_options_length(const struct option *longopts) > +{ > + int l = 0; > + > + if (!longopts) > + return 0; > + > + while (longopts[l].name) > + l++; > + > + return l; > +} > + > +/* Merge getopt options */ > +int odph_merge_getopt_options(const char *shortopts1, > + const char *shortopts2, > + const struct option *longopts1, > + const struct option *longopts2, > + char **shortopts, > + struct option **longopts) > +{ > + int shortopts1_len; > + int shortopts2_len; > + int longopts1_len; > + int longopts2_len; > + int index; > + int res_index = 0; > + struct option termination = {0, 0, 0, 0}; > + > + /* merge short options: */ > + if (shortopts) { > + shortopts1_len = (shortopts1) ? strlen(shortopts1) : 0; > + shortopts2_len = (shortopts2) ? strlen(shortopts2) : 0; > + *shortopts = malloc(shortopts1_len + shortopts2_len + 1); > + if (!*shortopts) > + return -1; > + > + (*shortopts)[0] = 0; > + > + if (shortopts1) > + strcpy((*shortopts), shortopts1); > + if (shortopts2) > + strcat((*shortopts), shortopts2); > + } > + > + /* merge long options */ > + if (!longopts) > + return 0; > + > + longopts1_len = get_getopt_options_length(longopts1); > + longopts2_len = get_getopt_options_length(longopts2); > + *longopts = malloc(sizeof(struct option) * > + (longopts1_len + longopts2_len + > 1)); > + if (!*longopts) { > + if (shortopts) > + free(*shortopts); > + return -1; > + } > + > + for (index = 0; (longopts1) && (longopts1[index].name); index++) > + (*longopts)[res_index++] = longopts1[index]; > + > + for (index = 0; (longopts2) && (longopts2[index].name); index++) > + (*longopts)[res_index++] = longopts2[index]; > + > + (*longopts)[res_index] = termination; > + > + return 0; > +} > + > +/* > + * Parse command line options to extract options affecting helpers. > + */ > +int odph_parse_options(int argc, char *argv[], > + const char *caller_shortopts, > + const struct option *caller_longopts) > +{ > + int c; > + char *shortopts; > + struct option *longopts; > + int res = 0; > + > + static struct option helper_long_options[] = { > + /* These options set a flag. */ > + {0, 0, 0, 0} > + }; > + > + static char *helper_short_options = ""; > + > + /* merge caller's command line options descriptions with helper's: > */ > + if (odph_merge_getopt_options(caller_shortopts, > helper_short_options, > + caller_longopts, helper_long_options, > + &shortopts, &longopts) < 0) > + return -1; > + > + while (1) { > + /* getopt_long stores the option index here. */ > + int option_index = 0; > + > + c = getopt_long (argc, argv, > + shortopts, longopts, &option_index); > + > + /* Detect the end of the options. */ > + if (c == -1) > + break; > + > + /* check for unknown options or missing arguments */ > + if (c == '?' || c == ':') > + res = -1; > + } > + > + optind = 0; /* caller expects this to be zero if it parses too*/ > + > + free(shortopts); > + free(longopts); > + > + return res; > +} > -- > 2.5.0 > > _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
