From 7d60b07d1515a2d7f3732f2620689000ed110535 Mon Sep 17 00:00:00 2001 From: Aleksey Manevich Date: Fri, 23 Sep 2016 16:41:18 +0300 Subject: join-or-start option --- src/firejail/main.c | 35 +++++++++++++++++++++++++++++++++++ src/firejail/profile.c | 24 ++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/firejail/main.c b/src/firejail/main.c index 3afecbe62..03ffab788 100644 --- a/src/firejail/main.c +++ b/src/firejail/main.c @@ -634,6 +634,30 @@ static void run_cmd_and_exit(int i, int argc, char **argv) { exit(0); } + else if (strncmp(argv[i], "--join-or-start=", 16) == 0) { + // NOTE: this is first part of option handler, + // sandbox name is set in other part + logargs(argc, argv); + + if (arg_shell_none) { + if (argc <= (i+1)) { + fprintf(stderr, "Error: --shell=none set, but no command specified\n"); + exit(1); + } + cfg.original_program_index = i + 1; + } + + // try to join by name only + pid_t pid; + if (!name2pid(argv[i] + 16, &pid)) { + if (!cfg.shell && !arg_shell_none) + cfg.shell = guess_shell(); + + join(pid, argc, argv, i + 1); + exit(0); + } + // if there no such sandbox continue argument processing + } #ifdef HAVE_NETWORK else if (strncmp(argv[i], "--join-network=", 15) == 0) { if (checkcfg(CFG_NETWORK)) { @@ -2157,6 +2181,17 @@ int main(int argc, char **argv) { else if (strcmp(argv[i], "--x11=block") == 0) { arg_x11_block = 1; } + else if (strncmp(argv[i], "--join-or-start=", 16) == 0) { + // NOTE: this is second part of option handler, + // atempt to find and join sandbox is done in other one + + // set sandbox name and start normally + cfg.name = argv[i] + 16; + if (strlen(cfg.name) == 0) { + fprintf(stderr, "Error: please provide a name for sandbox\n"); + return 1; + } + } else if (strcmp(argv[i], "--") == 0) { // double dash - positional params to follow arg_doubledash = 1; diff --git a/src/firejail/profile.c b/src/firejail/profile.c index 00301037f..73b655379 100644 --- a/src/firejail/profile.c +++ b/src/firejail/profile.c @@ -803,6 +803,30 @@ int profile_check_line(char *ptr, int lineno, const char *fname) { return 0; } + if (strncmp(ptr, "join-or-start ", 14) == 0) { + // try to join by name only + pid_t pid; + if (!name2pid(ptr + 14, &pid)) { + if (!cfg.shell && !arg_shell_none) + cfg.shell = guess_shell(); + + // find first non-option arg + int i; + for (i = 1; i < cfg.original_argc && strncmp(cfg.original_argv[i], "--", 2) != 0; i++); + + join(pid, cfg.original_argc,cfg.original_argv, i + 1); + exit(0); + } + + // set sandbox name and start normally + cfg.name = ptr + 14; + if (strlen(cfg.name) == 0) { + fprintf(stderr, "Error: invalid sandbox name\n"); + exit(1); + } + return 0; + } + // rest of filesystem if (strncmp(ptr, "blacklist ", 10) == 0) ptr += 10; -- cgit v1.2.3-70-g09d2