use temp file to pass env on unix as well

the linux command line can be 32k long ... which might still be not
enough. well, in fact, it just makes the 'ps' output unreadable.
This commit is contained in:
Oswald Buddenhagen
2009-04-09 19:13:40 +02:00
parent 9ec1737db1
commit c8c183f6b4
3 changed files with 67 additions and 13 deletions

View File

@@ -73,18 +73,19 @@ enum {
ArgSocket,
ArgMsg,
ArgDir,
ArgEnv
ArgEnv,
ArgExe
};
/* syntax: $0 {"run"|"debug"} <pid-socket> <continuation-msg> <workdir> <env...> "" <exe> <args...> */
/* syntax: $0 {"run"|"debug"} <pid-socket> <continuation-msg> <workdir> <env-file> <exe> <args...> */
/* exit codes: 0 = ok, 1 = invocation error, 3 = internal error */
int main(int argc, char *argv[])
{
int envIdx = ArgEnv;
int errNo;
int chldPid;
int chldStatus;
int chldPipe[2];
char **env = 0;
struct sockaddr_un sau;
if (argc < ArgEnv) {
@@ -111,6 +112,35 @@ int main(int argc, char *argv[])
return 1;
}
if (*argv[ArgEnv]) {
FILE *envFd;
char *envdata, *edp;
long size;
int count;
if (!(envFd = fopen(argv[ArgEnv], "r"))) {
fprintf(stderr, "Cannot read creator env file %s: %s\n",
argv[ArgEnv], strerror(errno));
doExit(1);
}
fseek(envFd, 0, SEEK_END);
size = ftell(envFd);
rewind(envFd);
envdata = malloc(size);
if (fread(envdata, 1, size, envFd) != (size_t)size) {
perror("Failed to read env file");
doExit(1);
}
fclose(envFd);
for (count = 0, edp = envdata; edp < envdata + size; ++count)
edp += strlen(edp) + 1;
env = malloc((count + 1) * sizeof(char *));
for (count = 0, edp = envdata; edp < envdata + size; ++count) {
env[count] = edp;
edp += strlen(edp) + 1;
}
env[count] = 0;
}
/* Create execution result notification pipe. */
if (pipe(chldPipe)) {
perror("Cannot create status pipe");
@@ -142,14 +172,10 @@ int main(int argc, char *argv[])
ptrace(PT_TRACE_ME, 0, 0, 0);
#endif
for (envIdx = ArgEnv; *argv[envIdx]; ++envIdx) ;
if (envIdx != ArgEnv) {
argv[envIdx] = 0;
environ = argv + ArgEnv;
}
++envIdx;
if (env)
environ = env;
execvp(argv[envIdx], argv + envIdx);
execvp(argv[ArgExe], argv + ArgExe);
/* Only expected error: no such file or direcotry, i.e. executable not found */
errNo = errno;
write(chldPipe[1], &errNo, sizeof(errNo)); /* Only realistic error case is SIGPIPE */