summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Nyström <daniel.nystrom@timeterminal.se>2011-06-21 21:54:27 +0200
committerPeter Korsgaard <jacmet@sunsite.dk>2011-06-22 00:20:41 +0200
commite8c46b118b011c766511c44fa9232e074ad6bcbc (patch)
treee40d3228dd376a8066df99471df446b07cc0369f
parentda7d572897b82b8ae2044e64835895233844f66c (diff)
ext-toolchain-wrapper.c: Handle an arbitrary amount of arguments
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>
-rw-r--r--toolchain/toolchain-external/ext-toolchain-wrapper.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c
index a485e740d..3e2306161 100644
--- a/toolchain/toolchain-external/ext-toolchain-wrapper.c
+++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c
@@ -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
@@ -14,12 +15,11 @@
#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;
}