From 2900f3b83a1c8b8876f27e30ec5f312499d73f3a Mon Sep 17 00:00:00 2001 From: Chengwei Yang Date: Sun, 23 Jun 2013 14:31:47 +0800 Subject: [PATCH 5/5] dbus-launch: fix syntax usage In current implementation, syntax could be one of sh, csh, auto, binary. However, it doesn't do any conflict check, say more than one syntax specified although in fact only one will be taken. This will confuse user. This patch check syntax conflicts and do the right thing as specified from user option, add an option "--syntax" and also keep old options for backwards compatibility. Signed-off-by: Chengwei Yang --- doc/dbus-launch.1.xml.in | 8 +++ tools/dbus-launch.c | 163 +++++++++++++++++++++++++++++----------------- 2 files changed, 113 insertions(+), 58 deletions(-) diff --git a/doc/dbus-launch.1.xml.in b/doc/dbus-launch.1.xml.in index 31dd6ea..ce234da 100644 --- a/doc/dbus-launch.1.xml.in +++ b/doc/dbus-launch.1.xml.in @@ -27,6 +27,7 @@ --csh-syntax --auto-syntax --binary-syntax + --syntax=SYNTAX --close-stderr --exit-with-session --autolaunch=MACHINEID @@ -192,6 +193,13 @@ byte order, not network byte order or any other canonical byte order. + + +specify which syntax will be used, SYNTAX could be one of +csh, sh, auto and binary. + + + Close the standard error output stream before starting the D-Bus diff --git a/tools/dbus-launch.c b/tools/dbus-launch.c index 7e562b5..1562266 100644 --- a/tools/dbus-launch.c +++ b/tools/dbus-launch.c @@ -84,6 +84,14 @@ extern Display *xdisplay; * for the "dbus-launch a test suite in an isolated session" use-case. */ +enum { + SYNTAX_UNKNOWN, + SYNTAX_CSH, + SYNTAX_SH, + SYNTAX_AUTO, + SYNTAX_BINARY +}; + static char* machine_uuid = NULL; const char* @@ -192,7 +200,8 @@ static void usage (int ecode) { fprintf (stderr, "dbus-launch [--version] [--help] [--sh-syntax]" - " [--csh-syntax] [--auto-syntax] [--binary-syntax] [--close-stderr]" + " [--csh-syntax] [--auto-syntax] [--binary-syntax]" + " [--syntax=] [--close-stderr]" " [--exit-with-session] [--autolaunch=MACHINEID]" " [--config-file=FILENAME] [PROGRAM] [ARGS...]\n"); exit (ecode); @@ -413,41 +422,38 @@ kill_bus_and_exit (int exitcode) } static void -print_variables (const char *bus_address, pid_t bus_pid, long bus_wid, - int c_shell_syntax, int bourne_shell_syntax, - int binary_syntax) +print_variables (const char *bus_address, pid_t bus_pid, + long bus_wid, int syntax) { - if (binary_syntax) - { - do_write (1, bus_address, strlen (bus_address) + 1); - do_write (1, &bus_pid, sizeof bus_pid); - do_write (1, &bus_wid, sizeof bus_wid); - return; - } - else if (c_shell_syntax) - { - printf ("setenv DBUS_SESSION_BUS_ADDRESS '%s';\n", bus_address); - printf ("set DBUS_SESSION_BUS_PID=%ld;\n", (long) bus_pid); - if (bus_wid) - printf ("set DBUS_SESSION_BUS_WINDOWID=%ld;\n", (long) bus_wid); - fflush (stdout); - } - else if (bourne_shell_syntax) - { - printf ("DBUS_SESSION_BUS_ADDRESS='%s';\n", bus_address); - printf ("export DBUS_SESSION_BUS_ADDRESS;\n"); - printf ("DBUS_SESSION_BUS_PID=%ld;\n", (long) bus_pid); - if (bus_wid) - printf ("DBUS_SESSION_BUS_WINDOWID=%ld;\n", (long) bus_wid); - fflush (stdout); - } - else + switch (syntax) { - printf ("DBUS_SESSION_BUS_ADDRESS=%s\n", bus_address); - printf ("DBUS_SESSION_BUS_PID=%ld\n", (long) bus_pid); - if (bus_wid) - printf ("DBUS_SESSION_BUS_WINDOWID=%ld\n", (long) bus_wid); - fflush (stdout); + case SYNTAX_BINARY: + do_write (1, bus_address, strlen (bus_address) + 1); + do_write (1, &bus_pid, sizeof bus_pid); + do_write (1, &bus_wid, sizeof bus_wid); + return; + case SYNTAX_CSH: + printf ("setenv DBUS_SESSION_BUS_ADDRESS '%s';\n", bus_address); + printf ("set DBUS_SESSION_BUS_PID=%ld;\n", (long) bus_pid); + if (bus_wid) + printf ("set DBUS_SESSION_BUS_WINDOWID=%ld;\n", (long) bus_wid); + fflush (stdout); + return; + case SYNTAX_SH: + printf ("DBUS_SESSION_BUS_ADDRESS='%s';\n", bus_address); + printf ("export DBUS_SESSION_BUS_ADDRESS;\n"); + printf ("DBUS_SESSION_BUS_PID=%ld;\n", (long) bus_pid); + if (bus_wid) + printf ("DBUS_SESSION_BUS_WINDOWID=%ld;\n", (long) bus_wid); + fflush (stdout); + return; + default: + printf ("DBUS_SESSION_BUS_ADDRESS=%s\n", bus_address); + printf ("DBUS_SESSION_BUS_PID=%ld\n", (long) bus_pid); + if (bus_wid) + printf ("DBUS_SESSION_BUS_WINDOWID=%ld\n", (long) bus_wid); + fflush (stdout); + return; } } @@ -752,9 +758,7 @@ do_close_stderr (void) static void pass_info (const char *runprog, const char *bus_address, pid_t bus_pid, - long bus_wid, int c_shell_syntax, int bourne_shell_syntax, - int binary_syntax, - int argc, char **argv, int remaining_args) + long bus_wid, int syntax, int argc, char **argv, int remaining_args) { char *envvar = NULL; char **args = NULL; @@ -796,8 +800,7 @@ pass_info (const char *runprog, const char *bus_address, pid_t bus_pid, } else { - print_variables (bus_address, bus_pid, bus_wid, c_shell_syntax, - bourne_shell_syntax, binary_syntax); + print_variables (bus_address, bus_pid, bus_wid, syntax); } verbose ("dbus-launch exiting\n"); @@ -828,10 +831,7 @@ main (int argc, char **argv) const char *runprog = NULL; int remaining_args = 0; int exit_with_session; - int binary_syntax = FALSE; - int c_shell_syntax = FALSE; - int bourne_shell_syntax = FALSE; - int auto_shell_syntax = FALSE; + int syntax = SYNTAX_UNKNOWN; int autolaunch = FALSE; int requires_arg = FALSE; int close_stderr = FALSE; @@ -849,22 +849,72 @@ main (int argc, char **argv) i = 1; while (i < argc) { +#define set_syntax(new_syntax) do \ + { \ + if (syntax != SYNTAX_UNKNOWN) \ + { \ + fprintf (stderr, "syntax given twice\n"); \ + usage (1); \ + } \ + syntax = new_syntax; \ + } while (0) + +#define option_syntax(arg) do \ + { \ + if (strcmp (arg, "auto") == 0) \ + { \ + set_syntax (SYNTAX_AUTO); \ + } \ + else if (strcmp (arg, "csh") == 0) \ + { \ + set_syntax (SYNTAX_CSH); \ + } \ + else if (strcmp (arg, "sh") == 0) \ + { \ + set_syntax (SYNTAX_SH); \ + } \ + else if (strcmp (arg, "binary") == 0) \ + { \ + set_syntax (SYNTAX_BINARY); \ + } \ + else \ + { \ + fprintf (stderr, "invalid argument for \"--syntax=\"\n"); \ + usage (1); \ + } \ + } while (0) + const char *arg = argv[i]; if (strcmp (arg, "--help") == 0 || strcmp (arg, "-h") == 0 || strcmp (arg, "-?") == 0) usage (0); + else if (strcmp (arg, "--syntax=") == 0) + { + const char *s = strchr (arg, '='); + ++s; + + if (*s == '\0') + { + fprintf (stderr, "needs an argument for \"--syntax=\"\n"); + usage (1); + } + option_syntax (s); + } + else if (prev_arg && + strcmp (prev_arg, "--syntax") == 0) + option_syntax (arg); else if (strcmp (arg, "--auto-syntax") == 0) - auto_shell_syntax = TRUE; + set_syntax (SYNTAX_AUTO); else if (strcmp (arg, "-c") == 0 || strcmp (arg, "--csh-syntax") == 0) - c_shell_syntax = TRUE; + set_syntax (SYNTAX_CSH); else if (strcmp (arg, "-s") == 0 || strcmp (arg, "--sh-syntax") == 0) - bourne_shell_syntax = TRUE; + set_syntax (SYNTAX_SH); else if (strcmp (arg, "--binary-syntax") == 0) - binary_syntax = TRUE; + set_syntax (SYNTAX_BINARY); else if (strcmp (arg, "--version") == 0) version (); else if (strcmp (arg, "--exit-with-session") == 0) @@ -964,17 +1014,14 @@ main (int argc, char **argv) exit (1); } - if (auto_shell_syntax) + if (syntax == SYNTAX_AUTO) { + syntax = SYNTAX_SH; if ((shname = getenv ("SHELL")) != NULL) - { - if (!strncmp (shname + strlen (shname) - 3, "csh", 3)) - c_shell_syntax = TRUE; - else - bourne_shell_syntax = TRUE; - } - else - bourne_shell_syntax = TRUE; + { + if (!strncmp (shname + strlen (shname) - 3, "csh", 3)) + syntax = SYNTAX_CSH; + } } if (exit_with_session) @@ -1290,8 +1337,8 @@ main (int argc, char **argv) write_pid (bus_pid_to_babysitter_pipe[WRITE_END], bus_pid); close (bus_pid_to_babysitter_pipe[WRITE_END]); - pass_info (runprog, bus_address, bus_pid, wid, c_shell_syntax, - bourne_shell_syntax, binary_syntax, argc, argv, remaining_args); + pass_info (runprog, bus_address, bus_pid, wid, syntax, + argc, argv, remaining_args); } return 0; -- 1.7.9.5