From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lb0-f177.google.com ([209.85.217.177]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TBNrt-0001I3-3R for barebox@lists.infradead.org; Tue, 11 Sep 2012 10:38:58 +0000 Received: by lbbgf7 with SMTP id gf7so268831lbb.36 for ; Tue, 11 Sep 2012 03:38:54 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <20120911073138.GE18243@pengutronix.de> References: <1347341518-2779-1-git-send-email-alex.aring@gmail.com> <1347341518-2779-2-git-send-email-alex.aring@gmail.com> <20120911073138.GE18243@pengutronix.de> Date: Tue, 11 Sep 2012 12:38:53 +0200 Message-ID: From: Alexander Aring List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: multipart/mixed; boundary="===============7651641085330596690==" Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: Re: [PATCH 2/2] complete: abstract path complete To: Sascha Hauer Cc: barebox@lists.infradead.org --===============7651641085330596690== Content-Type: multipart/alternative; boundary=f46d042f92ec3d6d7404c96aae6e --f46d042f92ec3d6d7404c96aae6e Content-Type: text/plain; charset=UTF-8 Hi, I prefer this implementation than the older one, because it check on executable(Maybe we add a attribute for that or check on shebang) file and call found with the full path. I was thinking about to put this as RFC..., because I don't have really a usecase for this. Some commands can do a autocompletion for files that are in $PATH, when this is needed. The naming things, I don't like the name, too. I was doing the naming like the others functions. I will send a v2 with a better name and functionheader Regards Alexander Aring 2012/9/11 Sascha Hauer > On Tue, Sep 11, 2012 at 07:31:58AM +0200, Alexander Aring wrote: > > Rewritten path complete, to use it maybe > > in another functions. > > Do you have a usecase for this? > > > > > Signed-off-by: Alexander Aring > > --- > > common/complete.c | 73 > +++++++++++++------------------------------------------ > > include/libbb.h | 2 ++ > > lib/libbb.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++- > > 3 files changed, 82 insertions(+), 57 deletions(-) > > > > diff --git a/common/complete.c b/common/complete.c > > index 6a871ef..a06c070 100644 > > --- a/common/complete.c > > +++ b/common/complete.c > > @@ -25,6 +25,8 @@ > > #include > > #include > > #include > > +#include > > +#include > > > > static int file_complete(struct string_list *sl, char *instr, int exec) > > { > > @@ -70,65 +72,24 @@ out: > > return 0; > > } > > > > -static int path_command_complete(struct string_list *sl, char *instr) > > +static int path_command_complete(char *name, void *priv) > > { > > - struct stat s; > > - DIR *dir; > > - struct dirent *d; > > - char tmp[PATH_MAX]; > > - char *path, *p, *n; > > - > > - p = path = strdup(getenv("PATH")); > > - > > - if (!path) > > - return -1; > > - > > - while (p) { > > - n = strchr(p, ':'); > > - if (n) > > - *n++ = '\0'; > > - if (*p == '\0') { > > - p = n; > > - continue; > > - } > > - dir = opendir(p); > > + struct string_list *sl = priv; > > + char *filename; > > > > - /* We need to check all PATH dirs, so if one failed, > > - * try next */ > > - if (!dir) { > > - p = n; > > - continue; > > - } > > + filename = strrchr(name, '/') + 1; > > + if (!filename) > > + return -EINVAL; > > > > - while ((d = readdir(dir))) { > > - if (!strcmp(d->d_name, ".") || > > - !strcmp(d->d_name, "..")) > > - continue; > > + strcat(filename, " "); > > > > - if (!strncmp(instr, d->d_name, strlen(instr))) { > > - strcpy(tmp, d->d_name); > > - if (!stat(tmp, &s) && > > - S_ISDIR(s.st_mode)) > > - continue; > > - else > > - strcat(tmp, " "); > > - > > - /* This function is called > > - * after command_complete, > > - * so we check if a double > > - * entry exist */ > > - if (string_list_contains > > - (sl, tmp) == 0) { > > - string_list_add_sorted(sl, tmp); > > - } > > - } > > - } > > - > > - closedir(dir); > > - p = n; > > - } > > - > > - free(path); > > + /* This function is called > > + * after command_complete, > > + * so we check if a double > > + * entry exist */ > > + if (!string_list_contains > > + (sl, filename)) > > + string_list_add_sorted(sl, filename); > > > > return 0; > > } > > @@ -334,7 +295,7 @@ int complete(char *instr, char **outstr) > > instr = t; > > } else { > > command_complete(&sl, instr); > > - path_command_complete(&sl, instr); > > + find_execable_like(path_command_complete, instr, > &sl); > > env_param_complete(&sl, instr, 0); > > } > > if (*instr == '$') > > diff --git a/include/libbb.h b/include/libbb.h > > index 47b2e08..0ef702b 100644 > > --- a/include/libbb.h > > +++ b/include/libbb.h > > @@ -11,6 +11,8 @@ char *concat_subpath_file(const char *path, const char > *f); > > int execable_file(const char *name); > > char *find_execable(const char *filename); > > char* last_char_is(const char *s, int c); > > +int find_execable_like(int found(char *name, void *priv), > > + const char *likelyname, void *priv); > > > > enum { > > ACTION_RECURSE = (1 << 0), > > diff --git a/lib/libbb.c b/lib/libbb.c > > index e0d7481..daf77c7 100644 > > --- a/lib/libbb.c > > +++ b/lib/libbb.c > > @@ -14,6 +14,7 @@ > > #include > > #include > > #include > > +#include > > > > /* concatenate path and file name to new allocation buffer, > > * not adding '/' if path name already has '/' > > @@ -60,7 +61,6 @@ int execable_file(const char *name) > > } > > EXPORT_SYMBOL(execable_file); > > > > - > > /* search $PATH for an executable file; > > * return allocated string containing full path if found; > > * return NULL otherwise; > > @@ -89,6 +89,68 @@ char *find_execable(const char *filename) > > } > > EXPORT_SYMBOL(find_execable); > > > > +/* search $PATH for an executable file which is > > + * like the filename specified in likelyname; > > + * A likelyname on match will call the found function; > > + * Caller need to duplicate the name string in > > + * found functionpointer, if he want to save it; > > + * return 0 on success and <0 on error; > > + */ > > +int find_execable_like(int found(char *name, void *priv), > > + const char *likelyname, void *priv) > > I don't like the name very much. Can we name it execable_complete? > Also I would use the likelyname argument as first argument, because > then it would read "on 'name' do call 'found'" > > (I always stumble over 'execable', it should rather be 'executable', but > we have the former everywhere, so either change them all keep it here > aswell) > > 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 | > --f46d042f92ec3d6d7404c96aae6e Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi,

I prefer this implementation than the older one, because it chec= k on executable(Maybe we add a attribute for that or check on shebang) file= and call found with the full path.
I was thinking about to put this as = RFC..., because I don't have really a usecase for this.
Some commands can do a autocompletion for files that are in $PATH, when thi= s is needed.

The naming things, I don't like the name, too. I wa= s doing the naming like the others functions.
I will send a v2 with a be= tter name and functionheader

Regards
Alexander Aring

2012/9/11 = Sascha Hauer <s.hauer@pengutronix.de>
On Tue, Sep 11, 2012 at 07:31:58AM +0200, Alexander Aring= wrote:
> Rewritten path complete, to use it maybe
> in another functions.

Do you have a usecase for this?

>
> Signed-off-by: Alexander Aring <alex.aring@gmail.com>
> ---
> =C2=A0common/complete.c | 73 +++++++++++++----------------------------= --------------
> =C2=A0include/libbb.h =C2=A0 | =C2=A02 ++
> =C2=A0lib/libbb.c =C2=A0 =C2=A0 =C2=A0 | 64 ++++++++++++++++++++++++++= +++++++++++++++++++++-
> =C2=A03 files changed, 82 insertions(+), 57 deletions(-)
>
> diff --git a/common/complete.c b/common/complete.c
> index 6a871ef..a06c070 100644
> --- a/common/complete.c
> +++ b/common/complete.c
> @@ -25,6 +25,8 @@
> =C2=A0#include <libgen.h>
> =C2=A0#include <command.h>
> =C2=A0#include <environment.h>
> +#include <errno.h>
> +#include <libbb.h>
>
> =C2=A0static int file_complete(struct string_list *sl, char *instr, in= t exec)
> =C2=A0{
> @@ -70,65 +72,24 @@ out:
> =C2=A0 =C2=A0 =C2=A0 return 0;
> =C2=A0}
>
> -static int path_command_complete(struct string_list *sl, char *instr)=
> +static int path_command_complete(char *name, void *priv)
> =C2=A0{
> - =C2=A0 =C2=A0 struct stat s;
> - =C2=A0 =C2=A0 DIR *dir;
> - =C2=A0 =C2=A0 struct dirent *d;
> - =C2=A0 =C2=A0 char tmp[PATH_MAX];
> - =C2=A0 =C2=A0 char *path, *p, *n;
> -
> - =C2=A0 =C2=A0 p =3D path =3D strdup(getenv("PATH"));
> -
> - =C2=A0 =C2=A0 if (!path)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return -1;
> -
> - =C2=A0 =C2=A0 while (p) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 n =3D strchr(p, ':'= ;);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (n)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 *n++ =3D '\0';
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (*p =3D=3D '\0'= ) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 p =3D n;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 continue;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dir =3D opendir(p);
> + =C2=A0 =C2=A0 struct string_list *sl =3D priv;
> + =C2=A0 =C2=A0 char *filename;
>
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* We need to check all PA= TH dirs, so if one failed,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* try next */
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!dir) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 p =3D n;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 continue;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> + =C2=A0 =C2=A0 filename =3D strrchr(name, '/') + 1;
> + =C2=A0 =C2=A0 if (!filename)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return -EINVAL;
>
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 while ((d =3D readdir(dir)= )) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 if (!strcmp(d->d_name, ".") ||
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 !strcmp(d->d= _name, ".."))
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue;
> + =C2=A0 =C2=A0 strcat(filename, " ");
>
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 if (!strncmp(instr, d->d_name, strlen(instr))) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 strcpy(tmp, d->d_name);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!stat(tmp, &s) &&
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 S_ISDIR(s.st_mode))
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 strcat(tmp, &qu= ot; ");
> -
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* This function is called
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* after command_complete,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* so we check if a double
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* entry exist */
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (string_list_contains
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 (sl, tmp) =3D=3D 0) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 string_list_add= _sorted(sl, tmp);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 }
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> -
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 closedir(dir);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 p =3D n;
> - =C2=A0 =C2=A0 }
> -
> - =C2=A0 =C2=A0 free(path);
> + =C2=A0 =C2=A0 /* This function is called
> + =C2=A0 =C2=A0 =C2=A0* after command_complete,
> + =C2=A0 =C2=A0 =C2=A0* so we check if a double
> + =C2=A0 =C2=A0 =C2=A0* entry exist */
> + =C2=A0 =C2=A0 if (!string_list_contains
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (sl, filename))
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 string_list_add_sorted(sl,= filename);
>
> =C2=A0 =C2=A0 =C2=A0 return 0;
> =C2=A0}
> @@ -334,7 +295,7 @@ int complete(char *instr, char **outstr)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 instr =3D t;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 command_complete(&sl, instr);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 path_command_complete(&sl, instr);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 find_execable_like(path_command_complete, instr, &sl);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 env_param_complete(&sl, instr, 0);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (*instr =3D=3D = 9;$')
> diff --git a/include/libbb.h b/include/libbb.h
> index 47b2e08..0ef702b 100644
> --- a/include/libbb.h
> +++ b/include/libbb.h
> @@ -11,6 +11,8 @@ char *concat_subpath_file(const char *path, const ch= ar *f);
> =C2=A0int execable_file(const char *name);
> =C2=A0char *find_execable(const char *filename);
> =C2=A0char* last_char_is(const char *s, int c);
> +int find_execable_like(int found(char *name, void *priv),
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const char *likelyname, vo= id *priv);
>
> =C2=A0enum {
> =C2=A0 =C2=A0 =C2=A0 ACTION_RECURSE =C2=A0 =C2=A0 =3D (1 << 0),<= br> > diff --git a/lib/libbb.c b/lib/libbb.c
> index e0d7481..daf77c7 100644
> --- a/lib/libbb.c
> +++ b/lib/libbb.c
> @@ -14,6 +14,7 @@
> =C2=A0#include <xfuncs.h>
> =C2=A0#include <malloc.h>
> =C2=A0#include <environment.h>
> +#include <errno.h>
>
> =C2=A0/* concatenate path and file name to new allocation buffer,
> =C2=A0 * not adding '/' if path name already has '/' > @@ -60,7 +61,6 @@ int execable_file(const char *name)
> =C2=A0}
> =C2=A0EXPORT_SYMBOL(execable_file);
>
> -
> =C2=A0/* search $PATH for an executable file;
> =C2=A0 * return allocated string containing full path if found;
> =C2=A0 * return NULL otherwise;
> @@ -89,6 +89,68 @@ char *find_execable(const char *filename)
> =C2=A0}
> =C2=A0EXPORT_SYMBOL(find_execable);
>
> +/* search $PATH for an executable file which is
> + * like the filename specified in likelyname;
> + * A likelyname on match will call the found function;
> + * Caller need to duplicate the name string in
> + * found functionpointer, if he want to save it;
> + * return 0 on success and <0 on error;
> + */
> +int find_execable_like(int found(char *name, void *priv),
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const char *likelyname, vo= id *priv)

I don't like the name very much. Can we name it execable_co= mplete?
Also I would use the likelyname argument as first argument, because
then it would read "on 'name' do call 'found'"
(I always stumble over 'execable', it should rather be 'executa= ble', but
we have the former everywhere, so either change them all keep it here
aswell)

Sascha

--
Pengutronix e.K. =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |
Industrial Linux Solutions =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 | http://w= ww.pengutronix.de/ =C2=A0|
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 =C2=A0 =C2=A0|<= br> Amtsgericht Hildesheim, HRA 2686 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | Fax: = =C2=A0 += 49-5121-206917-5555 |

--f46d042f92ec3d6d7404c96aae6e-- --===============7651641085330596690== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox --===============7651641085330596690==--