summaryrefslogtreecommitdiffstats
path: root/tools/atree
diff options
context:
space:
mode:
authorRaphael Moll <ralf@android.com>2012-06-06 19:33:31 -0700
committerRaphael Moll <ralf@android.com>2012-06-06 23:39:47 -0700
commitec5fe91ead27bf4bfb4e728222ac6d475f04a18b (patch)
tree232115d14068019bd80f32ca16351ca0dc79be87 /tools/atree
parent47450542a3d07eb79c80035c701638b1f07eb1c0 (diff)
downloadreplicant_build-ec5fe91ead27bf4bfb4e728222ac6d475f04a18b.zip
replicant_build-ec5fe91ead27bf4bfb4e728222ac6d475f04a18b.tar.gz
replicant_build-ec5fe91ead27bf4bfb4e728222ac6d475f04a18b.tar.bz2
SDK: Use "strip -x" for atree.
Also fixes atree to accept an alternate command via the env var ATREE_STRIP and correctly splits it for execvp if it contains arguments. Change-Id: I8691bdc569bea3dddfde6249217dc305b6ef19f7
Diffstat (limited to 'tools/atree')
-rw-r--r--tools/atree/fs.cpp51
1 files changed, 48 insertions, 3 deletions
diff --git a/tools/atree/fs.cpp b/tools/atree/fs.cpp
index b648394..9468cfd 100644
--- a/tools/atree/fs.cpp
+++ b/tools/atree/fs.cpp
@@ -152,8 +152,8 @@ copy_file(const string& src, const string& dst)
int
strip_file(const string& path)
{
- // Default strip command to run is "strip" unless overridden by the STRIP env var.
- const char* strip_cmd = getenv("STRIP");
+ // Default strip command to run is "strip" unless overridden by the ATREE_STRIP env var.
+ const char* strip_cmd = getenv("ATREE_STRIP");
if (!strip_cmd || !strip_cmd[0]) {
strip_cmd = "strip";
}
@@ -163,7 +163,52 @@ strip_file(const string& path)
return -1;
} else if (pid == 0) {
// Exec in the child. Only returns if execve failed.
- return execlp(strip_cmd, strip_cmd, path.c_str(), (char *)NULL);
+
+ int num_args = 0;
+ const char *s = strip_cmd;
+ while (*s) {
+ while (*s == ' ') ++s;
+ if (*s && *s != ' ') {
+ ++num_args;
+ while (*s && *s != ' ') ++s;
+ }
+ }
+
+ if (num_args <= 0) {
+ fprintf(stderr, "Invalid ATREE_STRIP command '%s'\n", strip_cmd);
+ return 1;
+
+ } else if (num_args == 1) {
+ return execlp(strip_cmd, strip_cmd, path.c_str(), (char *)NULL);
+
+ } else {
+ // Split the arguments if more than 1
+ char* cmd = strdup(strip_cmd);
+ const char** args = (const char**) malloc(sizeof(const char*) * (num_args + 2));
+
+ const char** curr = args;
+ char* s = cmd;
+ while (*s) {
+ while (*s == ' ') ++s;
+ if (*s && *s != ' ') {
+ *curr = s;
+ ++curr;
+ while (*s && *s != ' ') ++s;
+ if (*s) {
+ *s = '\0';
+ ++s;
+ }
+ }
+ }
+
+ args[num_args] = path.c_str();
+ args[num_args + 1] = NULL;
+
+ int ret = execvp(args[0], (char* const*)args);
+ free(args);
+ free(cmd);
+ return ret;
+ }
} else {
// Wait for child pid and return its exit code.
int status;