/* * Parse command line arguments. * * Return 0 if OK, else -1 */ static int parse_args(int argc, char **argv) { int opt, ret; if (lttng_is_setuid_setgid()) { ERR("'%s' is not allowed to be executed as a setuid/setgid binary for security reasons. Aborting.", argv[0]); clean_exit(EXIT_FAILURE); } if (argc < 2) { show_basic_help(); clean_exit(EXIT_FAILURE); } while ((opt = getopt_long(argc, argv, "+Vhnvqg:m:", long_options, NULL)) != -1) { switch (opt) { case 'V': version(stdout); ret = 0; goto end; case 'h': ret = utils_show_man_page(1, "lttng"); if (ret) { ERR("Cannot view man page lttng(1)"); perror("exec"); } goto end; case 'v': /* There is only 3 possible level of verbosity. (-vvv) */ if (lttng_opt_verbose < 3) { lttng_opt_verbose += 1; } break; case 'q': lttng_opt_quiet = 1; break; case 'm': lttng_opt_mi = mi_output_type(optarg); if (lttng_opt_mi < 0) { ret = lttng_opt_mi; goto error; } break; case 'g': lttng_set_tracing_group(optarg); break; case 'n': opt_no_sessiond = 1; break; case OPT_SESSION_PATH: free(opt_sessiond_path); opt_sessiond_path = strdup(optarg); if (!opt_sessiond_path) { ret = -1; goto error; } break; case OPT_RELAYD_PATH: free(opt_relayd_path); opt_relayd_path = strdup(optarg); if (!opt_relayd_path) { ret = -1; goto error; } break; case OPT_DUMP_OPTIONS: list_options(stdout); ret = 0; goto end; case OPT_DUMP_COMMANDS: list_commands(commands, stdout); ret = 0; goto end; default: ret = 1; goto error; } } /* If both options are specified, quiet wins */ if (lttng_opt_verbose && lttng_opt_quiet) { lttng_opt_verbose = 0; } /* No leftovers, quit */ if ((argc - optind) == 0) { ret = 1; goto error; } /* * Handle leftovers which is a first level command with the trailing * options. */ ret = handle_command(argc - optind, argv + optind); switch (ret) { case CMD_WARNING: WARN("Some command(s) went wrong"); break; case CMD_ERROR: ERR("Command error"); break; case CMD_UNDEFINED: ERR("Undefined command or invalid arguments"); break; case CMD_FATAL: ERR("Fatal error"); break; case CMD_UNSUPPORTED: ERR("Unsupported command"); break; case -1: ret = 1; break; case 0: break; default: if (ret < 0) { ret = -ret; } break; } end: error: return ret; }
/* * Parse command line arguments. * * Return 0 if OK, else -1 */ static int parse_args(int argc, char **argv) { int opt, ret; char *user; if (argc < 2) { usage(stderr); clean_exit(EXIT_FAILURE); } while ((opt = getopt_long(argc, argv, "+Vhnvqg:m:", long_options, NULL)) != -1) { switch (opt) { case 'V': version(stdout); ret = 0; goto end; case 'h': usage(stdout); ret = 0; goto end; case 'v': /* There is only 3 possible level of verbosity. (-vvv) */ if (lttng_opt_verbose < 3) { lttng_opt_verbose += 1; } break; case 'q': lttng_opt_quiet = 1; break; case 'm': lttng_opt_mi = mi_output_type(optarg); if (lttng_opt_mi < 0) { ret = lttng_opt_mi; goto error; } break; case 'g': lttng_set_tracing_group(optarg); break; case 'n': opt_no_sessiond = 1; break; case OPT_SESSION_PATH: opt_sessiond_path = strdup(optarg); break; case OPT_RELAYD_PATH: opt_relayd_path = strdup(optarg); break; case OPT_DUMP_OPTIONS: list_options(stdout); ret = 0; goto end; case OPT_DUMP_COMMANDS: list_commands(commands, stdout); ret = 0; goto end; default: usage(stderr); ret = 1; goto error; } } /* If both options are specified, quiet wins */ if (lttng_opt_verbose && lttng_opt_quiet) { lttng_opt_verbose = 0; } /* Spawn session daemon if needed */ if (opt_no_sessiond == 0 && check_args_no_sessiond(argc, argv) == 0 && (check_sessiond() < 0)) { ret = 1; goto error; } /* No leftovers, print usage and quit */ if ((argc - optind) == 0) { usage(stderr); ret = 1; goto error; } /* For Mathieu Desnoyers a.k.a. Dr. Tracing */ user = getenv("USER"); if (user != NULL && ((strncmp(progname, "drtrace", 7) == 0 || strncmp("compudj", user, 7) == 0))) { MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n", 27,1,33,27,0); } /* Thanks Mathieu */ /* * Handle leftovers which is a first level command with the trailing * options. */ ret = handle_command(argc - optind, argv + optind); switch (ret) { case CMD_WARNING: WARN("Some command(s) went wrong"); break; case CMD_ERROR: ERR("Command error"); break; case CMD_UNDEFINED: ERR("Undefined command"); break; case CMD_FATAL: ERR("Fatal error"); break; case CMD_UNSUPPORTED: ERR("Unsupported command"); break; case -1: usage(stderr); ret = 1; break; case 0: break; default: if (ret < 0) { ret = -ret; } break; } end: error: return ret; }