ext-toolchain-wrapper.c: Handle an arbitrary amount of arguments
authorDaniel Nyström <daniel.nystrom@timeterminal.se>
Tue, 21 Jun 2011 19:54:27 +0000 (21:54 +0200)
committerPeter Korsgaard <jacmet@sunsite.dk>
Tue, 21 Jun 2011 22:20:41 +0000 (00:20 +0200)
Even though MAXARGS 1000 seems large, it wasn't enough for at least
QtWebKit package. This new version does not have any predefined limits.

Closes #3907

Many thanks to Thomas for tracing the source of the build error.

[Peter: Return rather than abort()]
Signed-off-by: Daniel Nyström <daniel.nystrom@timeterminal.se>
Reported-by: Thomas Björk <thomas.bjork@home.se>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
toolchain/toolchain-external/ext-toolchain-wrapper.c

index a485e740d0991b3a97f35112c6bc41fc43371190..3e230616101196b6441b354e5210497da1dee599 100644 (file)
@@ -4,6 +4,7 @@
  * to ensure the external toolchain uses the correct configuration.
  *
  * (C) 2011 Peter Korsgaard <jacmet@sunsite.dk>
+ * (C) 2011 Daniel Nyström <daniel.nystrom@timeterminal.se>
  *
  * This file is licensed under the terms of the GNU General Public License
  * version 2.  This program is licensed "as is" without any warranty of any
 #include <string.h>
 #include <limits.h>
 #include <unistd.h>
-
-#define MAXARGS 1000
+#include <stdlib.h>
 
 static char path[PATH_MAX] = BR_CROSS_PATH;
 
-static char *args[MAXARGS] = {
+static char *predef_args[] = {
        path,
        "--sysroot", BR_SYSROOT,
 #ifdef BR_ARCH
@@ -54,22 +54,31 @@ static const char *get_basename(const char *name)
 
 int main(int argc, char **argv)
 {
-       int i;
-
-       for (i=0; args[i]; i++);
+       char **args, **cur;
 
-       if ((argc+i) >= MAXARGS) {
-               fputs("Too many arguments\n", stderr);
-               return 1;
+       cur = args = malloc(sizeof(predef_args) + (sizeof(char *) * argc));
+       if (args == NULL) {
+               perror(__FILE__ ": malloc");
+               return 2;
        }
 
-       /* forward args */
-       memcpy(&args[i], &argv[1], sizeof(argv[0]) * (argc - 1));
+       /* start with predefined args */
+       memcpy(cur, predef_args, sizeof(predef_args));
+       cur += sizeof(predef_args) / sizeof(predef_args[0]);
+
+       /* append forward args */
+       memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
+       cur += argc - 1;
+
+       /* finish with NULL termination */
+       *cur = NULL;
 
        strcat(path, get_basename(argv[0]));
 
        if (execv(path, args))
                perror(path);
 
+       free(args);
+
        return 2;
 }