* (no subject) @ 2010-10-08 12:24 Sascha Hauer 2010-10-08 12:24 ` [PATCH 1/3] hush: pass context around in shell Sascha Hauer ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Sascha Hauer @ 2010-10-08 12:24 UTC (permalink / raw) To: barebox Hi, Here are some hush related fixes/improvements: Sascha Hauer (3): hush: pass context around in shell hush: fix nasty memory leak in hush hush: implement getopt builtin common/hush.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 88 insertions(+), 10 deletions(-) _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] hush: pass context around in shell 2010-10-08 12:24 Sascha Hauer @ 2010-10-08 12:24 ` Sascha Hauer 2010-10-08 12:24 ` [PATCH 2/3] hush: fix nasty memory leak in hush Sascha Hauer 2010-10-08 12:24 ` [PATCH 3/3] hush: implement getopt builtin Sascha Hauer 2 siblings, 0 replies; 8+ messages in thread From: Sascha Hauer @ 2010-10-08 12:24 UTC (permalink / raw) To: barebox Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- common/hush.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/common/hush.c b/common/hush.c index 19e35f5..f22eca6 100644 --- a/common/hush.c +++ b/common/hush.c @@ -267,8 +267,8 @@ static void setup_string_in_str(struct in_str *i, const char *s); static int free_pipe_list(struct pipe *head, int indent); static int free_pipe(struct pipe *pi, int indent); /* really run the final data structures: */ -static int run_list_real(struct pipe *pi); -static int run_pipe_real(struct pipe *pi); +static int run_list_real(struct p_context *ctx, struct pipe *pi); +static int run_pipe_real(struct p_context *ctx, struct pipe *pi); /* extended glob support: */ /* variable assignment: */ static int is_assignment(const char *s); @@ -515,7 +515,7 @@ static void setup_string_in_str(struct in_str *i, const char *s) * now has its stdout directed to the input of the appropriate pipe, * so this routine is noticeably simpler. */ -static int run_pipe_real(struct pipe *pi) +static int run_pipe_real(struct p_context *ctx, struct pipe *pi) { int i; int nextin; @@ -541,7 +541,7 @@ static int run_pipe_real(struct pipe *pi) if (pi->num_progs == 1 && child->group) { int rcode; debug("non-subshell grouping\n"); - rcode = run_list_real(child->group); + rcode = run_list_real(ctx, child->group); return rcode; } else if (pi->num_progs == 1 && pi->progs[0].argv != NULL) { for (i=0; is_assignment(child->argv[i]); i++) { /* nothing */ } @@ -601,7 +601,7 @@ static int run_pipe_real(struct pipe *pi) return -1; } -static int run_list_real(struct pipe *pi) +static int run_list_real(struct p_context *ctx, struct pipe *pi) { char *save_name = NULL; char **list = NULL; @@ -699,7 +699,7 @@ static int run_list_real(struct pipe *pi) } if (pi->num_progs == 0) continue; - rcode = run_pipe_real(pi); + rcode = run_pipe_real(ctx, pi); debug("run_pipe_real returned %d\n",rcode); if (rcode < -1) { last_return_code = -rcode - 2; @@ -853,11 +853,11 @@ static int xglob(o_string *dest, int flags, glob_t *pglob) } /* Select which version we will use */ -static int run_list(struct pipe *pi) +static int run_list(struct p_context *ctx, struct pipe *pi) { int rcode = 0; - rcode = run_list_real(pi); + rcode = run_list_real(ctx, pi); /* free_pipe_list has the side effect of clearing memory * In the long run that function can be merged with run_list_real, @@ -1371,7 +1371,7 @@ static int parse_stream_outer(struct p_context *ctx, struct in_str *inp, int fla done_word(&temp, ctx); done_pipe(ctx,PIPE_SEQ); if (ctx->list_head->num_progs) { - code = run_list(ctx->list_head); + code = run_list(ctx, ctx->list_head); } else { free_pipe_list(ctx->list_head, 0); continue; -- 1.7.2.3 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] hush: fix nasty memory leak in hush 2010-10-08 12:24 Sascha Hauer 2010-10-08 12:24 ` [PATCH 1/3] hush: pass context around in shell Sascha Hauer @ 2010-10-08 12:24 ` Sascha Hauer 2010-10-08 12:24 ` [PATCH 3/3] hush: implement getopt builtin Sascha Hauer 2 siblings, 0 replies; 8+ messages in thread From: Sascha Hauer @ 2010-10-08 12:24 UTC (permalink / raw) To: barebox Fix memory leak in globbing part of hush. a simple '[' on the command line was enough to trigger it. We must call globfree() before setting the glob structure to zero. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- common/hush.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/common/hush.c b/common/hush.c index f22eca6..1b5cd99 100644 --- a/common/hush.c +++ b/common/hush.c @@ -790,6 +790,7 @@ static int globhack(const char *src, int flags, glob_t *pglob) } dest = xmalloc(cnt); if (!(flags & GLOB_APPEND)) { + globfree(pglob); pglob->gl_pathv = NULL; pglob->gl_pathc = 0; pglob->gl_offs = 0; -- 1.7.2.3 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] hush: implement getopt builtin 2010-10-08 12:24 Sascha Hauer 2010-10-08 12:24 ` [PATCH 1/3] hush: pass context around in shell Sascha Hauer 2010-10-08 12:24 ` [PATCH 2/3] hush: fix nasty memory leak in hush Sascha Hauer @ 2010-10-08 12:24 ` Sascha Hauer 2010-10-08 12:36 ` Jean-Christophe PLAGNIOL-VILLARD 2010-10-08 13:31 ` [PATCH 3/3 v2] " Sascha Hauer 2 siblings, 2 replies; 8+ messages in thread From: Sascha Hauer @ 2010-10-08 12:24 UTC (permalink / raw) To: barebox Positional parameters are not nice, so implement a getopt function. This has to be done as a builtin because otherwise we have no access to the parents argc/argv. getopt works as expected, here is a little example: while getopt "hs:" OPT do if [ $OPT = h ]; then echo "usage" exit 1 else echo "scr: opt: $OPT optarg: $OPTARG" fi done Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- common/hush.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 78 insertions(+), 1 deletions(-) diff --git a/common/hush.c b/common/hush.c index 1b5cd99..d16783c 100644 --- a/common/hush.c +++ b/common/hush.c @@ -120,6 +120,8 @@ #include <fs.h> #include <libbb.h> #include <glob.h> +#include <getopt.h> +#include <linux/list.h> /*cmd_boot.c*/ extern int do_bootd(struct command *cmdtp, int flag, int argc, char *argv[]); /* do_bootd */ @@ -174,6 +176,12 @@ typedef enum { #define FLAG_PARSE_SEMICOLON (1 << 1) /* symbol ';' is special for parser */ #define FLAG_REPARSING (1 << 2) /* >=2nd pass */ +struct option { + struct list_head list; + char opt; + char *optarg; +}; + /* This holds pointers to the various results of parsing */ struct p_context { struct child_prog *child; @@ -187,6 +195,9 @@ struct p_context { char **global_argv; unsigned int global_argc; + + int options_parsed; + struct list_head options; }; @@ -274,6 +285,7 @@ static int run_pipe_real(struct p_context *ctx, struct pipe *pi); static int is_assignment(const char *s); /* data structure manipulation: */ static void initialize_context(struct p_context *ctx); +static void release_context(struct p_context *ctx); static int done_word(o_string *dest, struct p_context *ctx); static int done_command(struct p_context *ctx); static int done_pipe(struct p_context *ctx, pipe_style type); @@ -498,6 +510,48 @@ static void setup_string_in_str(struct in_str *i, const char *s) i->p = s; } +static int builtin_getopt(struct p_context *ctx, struct child_prog *child) +{ + char *optstring, *var; + int opt; + char opta[2]; + struct option *o; + + if (child->argc != 3) + return -1; + + optstring = child->argv[1]; + var = child->argv[2]; + + getopt_reset(); + + if (!ctx->options_parsed) { + while((opt = getopt(ctx->global_argc, ctx->global_argv, optstring)) > 0) { + o = xzalloc(sizeof(*o)); + o->opt = opt; + o->optarg = xstrdup(optarg); + list_add_tail(&o->list, &ctx->options); + } + } + + ctx->options_parsed = 1; + + if (list_empty(&ctx->options)) + return -1; + + o = list_first_entry(&ctx->options, struct option, list); + + opta[0] = o->opt; + opta[1] = 0; + setenv(var, opta); + setenv("OPTARG", o->optarg); + + free(o->optarg); + list_del(&o->list); + free(o); + + return 0; +} /* run_pipe_real() starts all the jobs, but doesn't wait for anything * to finish. See checkjobs(). @@ -583,10 +637,14 @@ static int run_pipe_real(struct p_context *ctx, struct pipe *pi) struct p_context ctx; str = make_string((child->argv + i)); parse_string_outer(&ctx, str, FLAG_EXIT_FROM_LOOP | FLAG_REPARSING); + release_context(&ctx); free(str); return last_return_code; } + if (!strcmp(child->argv[i], "getopt")) + return builtin_getopt(ctx, child); + if (strchr(child->argv[i], '/')) { return execute_script(child->argv[i], child->argc-i, &child->argv[i]); } @@ -929,9 +987,21 @@ static void initialize_context(struct p_context *ctx) ctx->w=RES_NONE; ctx->stack=NULL; ctx->old_flag=0; + ctx->options_parsed = 0; + INIT_LIST_HEAD(&ctx->options); done_command(ctx); /* creates the memory for working child */ } +static void release_context(struct p_context *ctx) +{ + struct option *opt, *tmp; + + list_for_each_entry_safe(opt, tmp, &ctx->options, list) { + free(opt->optarg); + free(opt); + } +} + /* normal return is 0 * if a reserved word is found, and processed, return 1 * should handle if, then, elif, else, fi, for, while, until, do, done. @@ -1534,7 +1604,12 @@ static char * make_string(char ** inp) int run_command (const char *cmd, int flag) { struct p_context ctx; - return parse_string_outer(&ctx, cmd, FLAG_PARSE_SEMICOLON); + int ret; + + ret = parse_string_outer(&ctx, cmd, FLAG_PARSE_SEMICOLON); + release_context(&ctx); + + return ret; } static int execute_script(const char *path, int argc, char *argv[]) @@ -1565,6 +1640,7 @@ static int source_script(const char *path, int argc, char *argv[]) ret = parse_string_outer(&ctx, script, FLAG_PARSE_SEMICOLON); + release_context(&ctx); free(script); return ret; @@ -1578,6 +1654,7 @@ int run_shell(void) setup_file_in_str(&input); rcode = parse_stream_outer(&ctx, &input, FLAG_PARSE_SEMICOLON); + release_context(&ctx); return rcode; } -- 1.7.2.3 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] hush: implement getopt builtin 2010-10-08 12:24 ` [PATCH 3/3] hush: implement getopt builtin Sascha Hauer @ 2010-10-08 12:36 ` Jean-Christophe PLAGNIOL-VILLARD 2010-10-08 12:45 ` Sascha Hauer 2010-10-08 13:31 ` [PATCH 3/3 v2] " Sascha Hauer 1 sibling, 1 reply; 8+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-10-08 12:36 UTC (permalink / raw) To: Sascha Hauer; +Cc: barebox On 14:24 Fri 08 Oct , Sascha Hauer wrote: > Positional parameters are not nice, so implement a getopt > function. This has to be done as a builtin because otherwise > we have no access to the parents argc/argv. > > getopt works as expected, here is a little example: > > while getopt "hs:" OPT > do > if [ $OPT = h ]; then > echo "usage" > exit 1 > else > echo "scr: opt: $OPT optarg: $OPTARG" > fi > done > > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> how about make it optional? Best Regards, J. _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] hush: implement getopt builtin 2010-10-08 12:36 ` Jean-Christophe PLAGNIOL-VILLARD @ 2010-10-08 12:45 ` Sascha Hauer 2010-10-11 5:08 ` Jean-Christophe PLAGNIOL-VILLARD 0 siblings, 1 reply; 8+ messages in thread From: Sascha Hauer @ 2010-10-08 12:45 UTC (permalink / raw) To: Jean-Christophe PLAGNIOL-VILLARD; +Cc: barebox On Fri, Oct 08, 2010 at 02:36:27PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote: > On 14:24 Fri 08 Oct , Sascha Hauer wrote: > > Positional parameters are not nice, so implement a getopt > > function. This has to be done as a builtin because otherwise > > we have no access to the parents argc/argv. > > > > getopt works as expected, here is a little example: > > > > while getopt "hs:" OPT > > do > > if [ $OPT = h ]; then > > echo "usage" > > exit 1 > > else > > echo "scr: opt: $OPT optarg: $OPTARG" > > fi > > done > > > > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> > how about make it optional? Probably a good idea. I just had in mind that we need to adjust the defconfigs then to still have a working defaultenv. How about making it optional and combined with your defaultenv-Kconfig patch we could do a select HUSH select HUSH_GETOPT to make sure all commands needed by the defaultenv are in place. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] hush: implement getopt builtin 2010-10-08 12:45 ` Sascha Hauer @ 2010-10-11 5:08 ` Jean-Christophe PLAGNIOL-VILLARD 0 siblings, 0 replies; 8+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2010-10-11 5:08 UTC (permalink / raw) To: Sascha Hauer; +Cc: barebox On 14:45 Fri 08 Oct , Sascha Hauer wrote: > On Fri, Oct 08, 2010 at 02:36:27PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote: > > On 14:24 Fri 08 Oct , Sascha Hauer wrote: > > > Positional parameters are not nice, so implement a getopt > > > function. This has to be done as a builtin because otherwise > > > we have no access to the parents argc/argv. > > > > > > getopt works as expected, here is a little example: > > > > > > while getopt "hs:" OPT > > > do > > > if [ $OPT = h ]; then > > > echo "usage" > > > exit 1 > > > else > > > echo "scr: opt: $OPT optarg: $OPTARG" > > > fi > > > done > > > > > > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> > > how about make it optional? > > Probably a good idea. I just had in mind that we need to adjust > the defconfigs then to still have a working defaultenv. > > How about making it optional and combined with your defaultenv-Kconfig > patch we could do a > > select HUSH > select HUSH_GETOPT > > to make sure all commands needed by the defaultenv are in place. that's why I move the defaultenv to Kconfig, I'm still in vacation. I'll send the patch tomorrow Best Regards, J. _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3 v2] hush: implement getopt builtin 2010-10-08 12:24 ` [PATCH 3/3] hush: implement getopt builtin Sascha Hauer 2010-10-08 12:36 ` Jean-Christophe PLAGNIOL-VILLARD @ 2010-10-08 13:31 ` Sascha Hauer 1 sibling, 0 replies; 8+ messages in thread From: Sascha Hauer @ 2010-10-08 13:31 UTC (permalink / raw) To: barebox Positional parameters are not nice, so implement a getopt function. This has to be done as a builtin because otherwise we have no access to the parents argc/argv. getopt works as expected, here is a little example: while getopt "hs:" OPT do if [ $OPT = h ]; then echo "usage" exit 1 else echo "scr: opt: $OPT optarg: $OPTARG" fi done Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- v2: make getopt optional, add help text. common/Kconfig | 7 ++++ common/hush.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 115 insertions(+), 2 deletions(-) diff --git a/common/Kconfig b/common/Kconfig index ad70cde..123d070 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -248,6 +248,13 @@ config HUSH_FANCY_PROMPT Allow to set PS1 from the command line. PS1 can have several escaped commands like \h for CONFIG_BOARDINFO or \w for the current working directory. +config HUSH_GETOPT + bool + depends on SHELL_HUSH + prompt "enable builtin getopt" + help + This enables a getopt function builtin to hush. + config CMDLINE_EDITING bool prompt "Enable command line editing" diff --git a/common/hush.c b/common/hush.c index 1b5cd99..3359f37 100644 --- a/common/hush.c +++ b/common/hush.c @@ -120,6 +120,8 @@ #include <fs.h> #include <libbb.h> #include <glob.h> +#include <getopt.h> +#include <linux/list.h> /*cmd_boot.c*/ extern int do_bootd(struct command *cmdtp, int flag, int argc, char *argv[]); /* do_bootd */ @@ -174,6 +176,12 @@ typedef enum { #define FLAG_PARSE_SEMICOLON (1 << 1) /* symbol ';' is special for parser */ #define FLAG_REPARSING (1 << 2) /* >=2nd pass */ +struct option { + struct list_head list; + char opt; + char *optarg; +}; + /* This holds pointers to the various results of parsing */ struct p_context { struct child_prog *child; @@ -187,6 +195,9 @@ struct p_context { char **global_argv; unsigned int global_argc; + + int options_parsed; + struct list_head options; }; @@ -274,6 +285,7 @@ static int run_pipe_real(struct p_context *ctx, struct pipe *pi); static int is_assignment(const char *s); /* data structure manipulation: */ static void initialize_context(struct p_context *ctx); +static void release_context(struct p_context *ctx); static int done_word(o_string *dest, struct p_context *ctx); static int done_command(struct p_context *ctx); static int done_pipe(struct p_context *ctx, pipe_style type); @@ -498,6 +510,50 @@ static void setup_string_in_str(struct in_str *i, const char *s) i->p = s; } +#ifdef CONFIG_HUSH_GETOPT +static int builtin_getopt(struct p_context *ctx, struct child_prog *child) +{ + char *optstring, *var; + int opt; + char opta[2]; + struct option *o; + + if (child->argc != 3) + return -2 - 1; + + optstring = child->argv[1]; + var = child->argv[2]; + + getopt_reset(); + + if (!ctx->options_parsed) { + while((opt = getopt(ctx->global_argc, ctx->global_argv, optstring)) > 0) { + o = xzalloc(sizeof(*o)); + o->opt = opt; + o->optarg = xstrdup(optarg); + list_add_tail(&o->list, &ctx->options); + } + } + + ctx->options_parsed = 1; + + if (list_empty(&ctx->options)) + return -1; + + o = list_first_entry(&ctx->options, struct option, list); + + opta[0] = o->opt; + opta[1] = 0; + setenv(var, opta); + setenv("OPTARG", o->optarg); + + free(o->optarg); + list_del(&o->list); + free(o); + + return 0; +} +#endif /* run_pipe_real() starts all the jobs, but doesn't wait for anything * to finish. See checkjobs(). @@ -583,10 +639,14 @@ static int run_pipe_real(struct p_context *ctx, struct pipe *pi) struct p_context ctx; str = make_string((child->argv + i)); parse_string_outer(&ctx, str, FLAG_EXIT_FROM_LOOP | FLAG_REPARSING); + release_context(&ctx); free(str); return last_return_code; } - +#ifdef CONFIG_HUSH_GETOPT + if (!strcmp(child->argv[i], "getopt")) + return builtin_getopt(ctx, child); +#endif if (strchr(child->argv[i], '/')) { return execute_script(child->argv[i], child->argc-i, &child->argv[i]); } @@ -929,9 +989,23 @@ static void initialize_context(struct p_context *ctx) ctx->w=RES_NONE; ctx->stack=NULL; ctx->old_flag=0; + ctx->options_parsed = 0; + INIT_LIST_HEAD(&ctx->options); done_command(ctx); /* creates the memory for working child */ } +static void release_context(struct p_context *ctx) +{ +#ifdef CONFIG_HUSH_GETOPT + struct option *opt, *tmp; + + list_for_each_entry_safe(opt, tmp, &ctx->options, list) { + free(opt->optarg); + free(opt); + } +#endif +} + /* normal return is 0 * if a reserved word is found, and processed, return 1 * should handle if, then, elif, else, fi, for, while, until, do, done. @@ -1534,7 +1608,12 @@ static char * make_string(char ** inp) int run_command (const char *cmd, int flag) { struct p_context ctx; - return parse_string_outer(&ctx, cmd, FLAG_PARSE_SEMICOLON); + int ret; + + ret = parse_string_outer(&ctx, cmd, FLAG_PARSE_SEMICOLON); + release_context(&ctx); + + return ret; } static int execute_script(const char *path, int argc, char *argv[]) @@ -1565,6 +1644,7 @@ static int source_script(const char *path, int argc, char *argv[]) ret = parse_string_outer(&ctx, script, FLAG_PARSE_SEMICOLON); + release_context(&ctx); free(script); return ret; @@ -1578,6 +1658,7 @@ int run_shell(void) setup_file_in_str(&input); rcode = parse_stream_outer(&ctx, &input, FLAG_PARSE_SEMICOLON); + release_context(&ctx); return rcode; } @@ -1628,6 +1709,31 @@ BAREBOX_CMD_START(source) BAREBOX_CMD_HELP(cmd_source_help) BAREBOX_CMD_END +#ifdef CONFIG_HUSH_GETOPT +static int do_getopt(struct command *cmdtp, int argc, char *argv[]) +{ + /* + * This function is never reached. The 'getopt' command is + * only here to provide a help text for the getopt builtin. + */ + return 0; +} + +static const __maybe_unused char cmd_getopt_help[] = +"Usage: getopt <optstring> <var>\n" +"\n" +"hush option parser. <optstring> is a string with valid options. Add\n" +"a colon to an options if this option has a required argument or two\n" +"colons for an optional argument. The current option is saved in <var>,\n" +"arguments are saved in OPTARG.\n"; + +BAREBOX_CMD_START(getopt) + .cmd = do_getopt, + .usage = "getopt <optstring> <var>", + BAREBOX_CMD_HELP(cmd_getopt_help) +BAREBOX_CMD_END +#endif + /** * @file * @brief A prototype Bourne shell grammar parser -- 1.7.2.3 -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2010-10-11 5:10 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-10-08 12:24 Sascha Hauer 2010-10-08 12:24 ` [PATCH 1/3] hush: pass context around in shell Sascha Hauer 2010-10-08 12:24 ` [PATCH 2/3] hush: fix nasty memory leak in hush Sascha Hauer 2010-10-08 12:24 ` [PATCH 3/3] hush: implement getopt builtin Sascha Hauer 2010-10-08 12:36 ` Jean-Christophe PLAGNIOL-VILLARD 2010-10-08 12:45 ` Sascha Hauer 2010-10-11 5:08 ` Jean-Christophe PLAGNIOL-VILLARD 2010-10-08 13:31 ` [PATCH 3/3 v2] " Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox