Prepare the script arguments when we process adhocify's arguments.

This way all children don't have to do the same work all and over again.
They only need to replace {}.
This commit is contained in:
Albert S. 2014-10-21 23:41:53 +02:00
부모 9c29c163c1
커밋 a8db2df993
1개의 변경된 파일29개의 추가작업 그리고 18개의 파일을 삭제

파일 보기

@ -236,26 +236,16 @@ bool run_prog(const char *eventfile, uint32_t eventmask)
putenv(envvar);
}
char *arguments[n_script_arguments + 2]; //2 = argv0 and terminating NULL
const char *argv0 = memrchr(prog, '/', strlen(prog));
argv0 = ( argv0 == NULL ) ? prog : argv0+1;
arguments[0] = argv0;
const int begin_offset = 1;
for(int i = 0; i < n_script_arguments; i++)
//This can be thrown away, if in create_script_args we create pointer to the pointer pointing to the SCRIPT_PLACE_SPECIFIER string.
//Then all what we have to do here is to set the pointer to eventfile. However, we can have multiple of those, probably not worth it as we shouldn't have tons of arguments
for(unsigned int i = 0; i < n_script_arguments; i++)
{
char *argument = script_arguments[i];
if(STREQ(argument, SCRIPT_PLACE_SPECIFIER))
arguments[i+begin_offset] = eventfile;
else
arguments[i+begin_offset] = argument;
if(argument && STREQ(argument, SCRIPT_PLACE_SPECIFIER))
script_arguments[i] = eventfile;
}
arguments[n_script_arguments+begin_offset] = NULL;
execv(prog, arguments);
execv(prog, script_arguments);
perror("execlp");
@ -430,6 +420,28 @@ static struct option long_options[] =
{ "help", no_argument, 0, 'h' }
};
//fills global n_script_arguments and script_arguments var
void fill_script_arguments(size_t n_args, char *args[])
{
n_script_arguments = n_args + 2; //2 = argv0 and terminating NULL
char **arguments = xmalloc( n_script_arguments * sizeof(char *) );
const char *argv0 = memrchr(prog, '/', strlen(prog));
argv0 = ( argv0 == NULL ) ? prog : argv0+1;
arguments[0] = argv0;
const int begin_offset = 1;
for(unsigned int i = 0; i < n_args; i++)
{
char *argument = args[i];
arguments[i+begin_offset] = strdup(argument);
}
arguments[n_args+begin_offset] = NULL;
script_arguments = arguments;
}
void parse_options(int argc, char **argv)
{
@ -491,8 +503,7 @@ void parse_options(int argc, char **argv)
prog = argv[optind++];
if(optind < argc)
{
script_arguments = &argv[optind];
n_script_arguments = argc - optind;
fill_script_arguments(argc - optind, &argv[optind]);
}
}