forked from RepoMirrors/bemenu
Tokenize launch arguments.
This commit is contained in:
parent
c5debe04b0
commit
8d08365645
@ -144,6 +144,38 @@ read_items_to_menu_from_path(struct bm_menu *menu)
|
|||||||
read_items_to_menu_from_dir(menu, path);
|
read_items_to_menu_from_dir(menu, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
tokenize_args(const char *buf, char **out_copy, char ***out_list)
|
||||||
|
{
|
||||||
|
assert(buf && out_copy && out_list);
|
||||||
|
*out_copy = NULL;
|
||||||
|
*out_list = NULL;
|
||||||
|
|
||||||
|
char *copy;
|
||||||
|
if (!(copy = c_strdup(buf)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
size_t pos, count = 0;
|
||||||
|
for (const char *s = copy; *s && (pos = strcspn(s, " ")) != 0; s += pos + 1)
|
||||||
|
++count;
|
||||||
|
|
||||||
|
char **list;
|
||||||
|
if (!(list = calloc(count + 1, sizeof(char*)))) {
|
||||||
|
free(copy);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
for (char *s = copy; *s && (pos = strcspn(s, " ")) != 0; s += pos + 1, ++count) {
|
||||||
|
s[pos] = 0;
|
||||||
|
list[count] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_copy = copy;
|
||||||
|
*out_list = list;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
launch(const char *bin)
|
launch(const char *bin)
|
||||||
{
|
{
|
||||||
@ -154,7 +186,14 @@ launch(const char *bin)
|
|||||||
setsid();
|
setsid();
|
||||||
freopen("/dev/null", "w", stdout);
|
freopen("/dev/null", "w", stdout);
|
||||||
freopen("/dev/null", "w", stderr);
|
freopen("/dev/null", "w", stderr);
|
||||||
execlp(bin, bin, NULL);
|
|
||||||
|
char *first, **args;
|
||||||
|
if (!tokenize_args(bin, &first, &args))
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
execvp(first, args);
|
||||||
|
free(first);
|
||||||
|
free(args);
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user