/* * 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; }
/* * daemon argument parsing */ static int parse_args(int argc, char **argv) { int c, ret = 0; static struct option long_options[] = { { "consumerd-cmd-sock", 1, 0, 'c' }, { "consumerd-err-sock", 1, 0, 'e' }, { "daemonize", 0, 0, 'd' }, { "group", 1, 0, 'g' }, { "help", 0, 0, 'h' }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "version", 0, 0, 'V' }, { "kernel", 0, 0, 'k' }, #ifdef HAVE_LIBLTTNG_UST_CTL { "ust", 0, 0, 'u' }, #endif { NULL, 0, 0, 0 } }; while (1) { int option_index = 0; c = getopt_long(argc, argv, "dhqvVku" "c:e:g:", long_options, &option_index); if (c == -1) { break; } switch (c) { case 0: fprintf(stderr, "option %s", long_options[option_index].name); if (optarg) { fprintf(stderr, " with arg %s\n", optarg); ret = -1; goto end; } break; case 'c': if (lttng_is_setuid_setgid()) { WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.", "-c, --consumerd-cmd-sock"); } else { snprintf(command_sock_path, PATH_MAX, "%s", optarg); } break; case 'e': if (lttng_is_setuid_setgid()) { WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.", "-e, --consumerd-err-sock"); } else { snprintf(error_sock_path, PATH_MAX, "%s", optarg); } break; case 'd': opt_daemon = 1; break; case 'g': if (lttng_is_setuid_setgid()) { WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.", "-g, --group"); } else { tracing_group_name = optarg; } break; case 'h': usage(stdout); exit(EXIT_SUCCESS); case 'q': lttng_opt_quiet = 1; break; case 'v': lttng_opt_verbose = 1; break; case 'V': fprintf(stdout, "%s\n", VERSION); exit(EXIT_SUCCESS); case 'k': opt_type = LTTNG_CONSUMER_KERNEL; break; #ifdef HAVE_LIBLTTNG_UST_CTL case 'u': # if (CAA_BITS_PER_LONG == 64) opt_type = LTTNG_CONSUMER64_UST; # elif (CAA_BITS_PER_LONG == 32) opt_type = LTTNG_CONSUMER32_UST; # else # error "Unknown bitness" # endif break; #endif default: usage(stderr); ret = -1; goto end; } } end: return ret; }