|
|
|
|
@ -53,11 +53,16 @@
|
|
|
|
|
#define BOOSTER_SESSION "silica-session"
|
|
|
|
|
#define BOOSTER_GENERIC "generic"
|
|
|
|
|
|
|
|
|
|
/* Placeholder value used for regular boosters (that are not
|
|
|
|
|
* sandboxed application boosters).
|
|
|
|
|
*/
|
|
|
|
|
#define UNDEFINED_APPLICATION "default"
|
|
|
|
|
|
|
|
|
|
/* Setting VERBOSE_SIGNALS to non-zero value logs receiving of
|
|
|
|
|
* async-signals - which is useful only when actively debugging
|
|
|
|
|
* booster / invoker interoperation.
|
|
|
|
|
*/
|
|
|
|
|
#define VERBOSE_SIGNALS 01
|
|
|
|
|
#define VERBOSE_SIGNALS 0
|
|
|
|
|
|
|
|
|
|
// Utility functions
|
|
|
|
|
static char *strip(char *str)
|
|
|
|
|
@ -569,18 +574,26 @@ static void invoker_send_end(int fd)
|
|
|
|
|
// Prints the usage and exits with given status
|
|
|
|
|
static void usage(int status)
|
|
|
|
|
{
|
|
|
|
|
printf("\nUsage: %s [options] [--type=TYPE] [file] [args]\n\n"
|
|
|
|
|
printf("\n"
|
|
|
|
|
"Usage: %s [options] [--type=TYPE] [file] [args]\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Launch applications compiled as a shared library (-shared) or\n"
|
|
|
|
|
"a position independent executable (-pie) through mapplauncherd.\n\n"
|
|
|
|
|
"a position independent executable (-pie) through mapplauncherd.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"TYPE chooses the type of booster used. Qt-booster may be used to\n"
|
|
|
|
|
"launch anything. Possible values for TYPE:\n"
|
|
|
|
|
" qt5 Launch a Qt 5 application.\n"
|
|
|
|
|
" qtquick2 Launch a Qt Quick 2 (QML) application.\n"
|
|
|
|
|
" silica-qt5 Launch a Sailfish Silica application.\n"
|
|
|
|
|
" generic Launch any application, even if it's not a library.\n\n"
|
|
|
|
|
" generic Launch any application, even if it's not a library.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"The TYPE may also be a comma delimited list of boosters to try. The first available\n"
|
|
|
|
|
"booster will be used.\n\n"
|
|
|
|
|
"booster will be used.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Options:\n"
|
|
|
|
|
" -t, --type TYPE Define booster type\n"
|
|
|
|
|
" -a, --application APP Define application booster name\n"
|
|
|
|
|
" -A, --auto-application Get application booster name from binary\n"
|
|
|
|
|
" -d, --delay SECS After invoking sleep for SECS seconds\n"
|
|
|
|
|
" (default %d).\n"
|
|
|
|
|
" -r, --respawn SECS After invoking respawn new booster after SECS seconds\n"
|
|
|
|
|
@ -590,6 +603,7 @@ static void usage(int status)
|
|
|
|
|
" -G, --global-syms Places symbols in the application binary and its\n"
|
|
|
|
|
" libraries to the global scope.\n"
|
|
|
|
|
" See RTLD_GLOBAL in the dlopen manual page.\n"
|
|
|
|
|
" -D, --deep-syms (TBD)"
|
|
|
|
|
" -s, --single-instance Launch the application as a single instance.\n"
|
|
|
|
|
" The existing application window will be activated\n"
|
|
|
|
|
" if already launched.\n"
|
|
|
|
|
@ -597,8 +611,11 @@ static void usage(int status)
|
|
|
|
|
" from the booster. The score is reset to 0 normally.\n"
|
|
|
|
|
" -T, --test-mode Invoker test mode. Also control file in root home should be in place.\n"
|
|
|
|
|
" -F, --desktop-file Desktop file of the application to notify lipstick of launching app.\n"
|
|
|
|
|
" -h, --help Print this help.\n\n"
|
|
|
|
|
"Example: %s --type=qt5 /usr/bin/helloworld\n\n",
|
|
|
|
|
" -h, --help Print this help.\n"
|
|
|
|
|
" -v, --verbose Make invoker more verbose. Can be given several times.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Example: %s --type=qt5 /usr/bin/helloworld\n"
|
|
|
|
|
"\n",
|
|
|
|
|
PROG_NAME_INVOKER, EXIT_DELAY, RESPAWN_DELAY, MAX_RESPAWN_DELAY, PROG_NAME_INVOKER);
|
|
|
|
|
|
|
|
|
|
exit(status);
|
|
|
|
|
@ -763,7 +780,7 @@ typedef struct InvokeArgs {
|
|
|
|
|
.prog_argv = NULL,\
|
|
|
|
|
.prog_name = NULL,\
|
|
|
|
|
.app_type = NULL,\
|
|
|
|
|
.app_name = "default",\
|
|
|
|
|
.app_name = UNDEFINED_APPLICATION,\
|
|
|
|
|
.magic_options = INVOKER_MSG_MAGIC_OPTION_WAIT,\
|
|
|
|
|
.wait_term = true,\
|
|
|
|
|
.respawn_delay = RESPAWN_DELAY,\
|
|
|
|
|
@ -875,7 +892,7 @@ static int invoke(InvokeArgs *args)
|
|
|
|
|
|
|
|
|
|
/* Application aware boosters
|
|
|
|
|
* - have fallback strategy, but it
|
|
|
|
|
* - must not cross application vs "default" boundary
|
|
|
|
|
* - must not cross application vs UNDEFINED_APPLICATION boundary
|
|
|
|
|
*/
|
|
|
|
|
if (fd == -1 && !tried_session) {
|
|
|
|
|
bool tried_generic = false;
|
|
|
|
|
@ -894,7 +911,7 @@ static int invoke(InvokeArgs *args)
|
|
|
|
|
fd = -1;
|
|
|
|
|
} else if (tried_session) {
|
|
|
|
|
warning("Launch failed, session booster is not available.\n");
|
|
|
|
|
} else if (strcmp(args->app_name, "default")) {
|
|
|
|
|
} else if (strcmp(args->app_name, UNDEFINED_APPLICATION)) {
|
|
|
|
|
/* Boosters that deal explicitly with one application only
|
|
|
|
|
* must be assumed to run within sandbox -> skipping boosting
|
|
|
|
|
* would also skip sandboxing -> no direct launch fallback
|
|
|
|
|
@ -918,7 +935,7 @@ static int invoke(InvokeArgs *args)
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
InvokeArgs args = INVOKE_ARGS_INIT;
|
|
|
|
|
|
|
|
|
|
bool auto_application = false;
|
|
|
|
|
// Called with a different name (old way of using invoker) ?
|
|
|
|
|
if (!strstr(argv[0], PROG_NAME_INVOKER) )
|
|
|
|
|
{
|
|
|
|
|
@ -940,10 +957,11 @@ int main(int argc, char *argv[])
|
|
|
|
|
{"test-mode", no_argument, NULL, 'T'},
|
|
|
|
|
{"type", required_argument, NULL, 't'},
|
|
|
|
|
{"application", required_argument, NULL, 'a'},
|
|
|
|
|
{"auto-application", no_argument, NULL, 'A'},
|
|
|
|
|
{"delay", required_argument, NULL, 'd'},
|
|
|
|
|
{"respawn", required_argument, NULL, 'r'},
|
|
|
|
|
{"splash", required_argument, NULL, 'S'},
|
|
|
|
|
{"splash-landscape", required_argument, NULL, 'L'},
|
|
|
|
|
{"splash", required_argument, NULL, 'S'}, // Legacy, ignored
|
|
|
|
|
{"splash-landscape", required_argument, NULL, 'L'}, // Legacy, ignored
|
|
|
|
|
{"desktop-file", required_argument, NULL, 'F'},
|
|
|
|
|
{"verbose", no_argument, NULL, 'v'},
|
|
|
|
|
{0, 0, 0, 0}
|
|
|
|
|
@ -953,7 +971,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
// The use of + for POSIXLY_CORRECT behavior is a GNU extension, but avoids polluting
|
|
|
|
|
// the environment
|
|
|
|
|
int opt;
|
|
|
|
|
while ((opt = getopt_long(argc, argv, "+hvcwnGDsoTd:t:a:r:S:L:F:", longopts, NULL)) != -1)
|
|
|
|
|
while ((opt = getopt_long(argc, argv, "+hvcwnGDsoTd:t:a:Ar:S:L:F:", longopts, NULL)) != -1)
|
|
|
|
|
{
|
|
|
|
|
switch(opt)
|
|
|
|
|
{
|
|
|
|
|
@ -996,6 +1014,11 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
|
|
|
|
case 'a':
|
|
|
|
|
args.app_name = optarg;
|
|
|
|
|
auto_application = false;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'A':
|
|
|
|
|
auto_application = true;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'd':
|
|
|
|
|
@ -1067,6 +1090,9 @@ int main(int argc, char *argv[])
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (auto_application)
|
|
|
|
|
args.app_name = basename(args.prog_argv[0]);
|
|
|
|
|
|
|
|
|
|
if (!args.app_type) {
|
|
|
|
|
report(report_error, "Application type must be specified with --type.\n");
|
|
|
|
|
usage(1);
|
|
|
|
|
@ -1089,9 +1115,14 @@ int main(int argc, char *argv[])
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Application specific boosters are running in sandbox and can
|
|
|
|
|
// thus launch only sandboxed processes, otherwise
|
|
|
|
|
// If arguments don't define sailjail and sailjaild says the app must be sandboxed,
|
|
|
|
|
// we force sandboxing here
|
|
|
|
|
if (strcmp(args.prog_name, SAILJAIL_PATH) && ask_for_sandboxing(args.prog_name)) {
|
|
|
|
|
if (!strcmp(args.app_name, UNDEFINED_APPLICATION) &&
|
|
|
|
|
strcmp(args.prog_name, SAILJAIL_PATH) &&
|
|
|
|
|
ask_for_sandboxing(args.prog_name)) {
|
|
|
|
|
warning("enforcing sandboxing for '%s'", args.prog_name);
|
|
|
|
|
// We must use generic booster here as nothing else would work
|
|
|
|
|
// to run sailjail which is not compiled for launching via booster
|
|
|
|
|
args.app_type = BOOSTER_GENERIC;
|
|
|
|
|
|