void parse_args(int argc, char *argv[]) { int opt; int opt_index = 0; while ((opt = getopt_long(argc, argv, paramstr, longopts, &opt_index)) != -1) { switch (opt) { default: if (opt == '?') exit(EXIT_FAILURE); else outputstd("opt:%c\n", opt); return; case 'b': init_bdev_list(); process_bdev_param(optarg); dump_bdev_list(); outputstd("--bdev doesn't do anything useful yet.\n"); exit(EXIT_SUCCESS); case 'c': /* syscalls are all disabled at this point. enable the syscall we care about. */ do_specific_syscall = TRUE; toggle_syscall(optarg, TRUE); break; case 'a': /* One of the architectures selected*/ do_32_arch = FALSE; do_64_arch = FALSE; if (strcmp(optarg, "64") == 0) { do_32_arch = FALSE; do_64_arch = TRUE; } else if (strcmp(optarg, "32") == 0) { do_32_arch = TRUE; do_64_arch = FALSE; } else { outputstd("can't parse %s\n", optarg); exit(EXIT_FAILURE); } break; case 'C': user_specified_children = strtoll(optarg, NULL, 10); max_children = user_specified_children; if (max_children == 0) { outputerr("zero children ? WAT?\n"); exit(EXIT_FAILURE); } break; case 'd': dangerous = TRUE; break; case 'D': set_debug = TRUE; break; case 'g': if (!strcmp(optarg, "vm")) desired_group = GROUP_VM; if (!strcmp(optarg, "vfs")) desired_group = GROUP_VFS; break; /* Show help */ case 'h': usage(); exit(EXIT_SUCCESS); case 'I': show_ioctl_list = TRUE; break; case 'l': if (!strcmp(optarg, "off")) logging = FALSE; break; case 'L': show_syscall_list = TRUE; break; case 'm': monochrome = TRUE; memset(&ANSI_RED, 0, 1); memset(&ANSI_GREEN, 0, 1); memset(&ANSI_YELLOW, 0, 1); memset(&ANSI_BLUE, 0, 1); memset(&ANSI_MAGENTA, 0, 1); memset(&ANSI_CYAN, 0, 1); memset(&ANSI_WHITE, 0, 1); memset(&ANSI_RESET, 0, 1); break; /* Set number of syscalls to do */ case 'N': syscalls_todo = strtoll(optarg, NULL, 10); break; /* Pause after each syscall */ case 'p': dopause = TRUE; break; case 'P': do_specific_domain = TRUE; specific_domain = strtol(optarg, NULL, 10); specific_domain_optarg = optarg; break; case 'E': parse_exclude_domains(optarg); break; case 'q': quiet_level++; break; case 'r': if (do_exclude_syscall == TRUE) { outputerr("-r needs to be before any -x options.\n"); exit(EXIT_FAILURE); } random_selection = TRUE; random_selection_num = strtol(optarg, NULL, 10); break; case 'R': if(fuzz_device_driver(optarg) == FALSE) { outputerr("Unable to open the device driver!\n"); exit(EXIT_FAILURE); } use_specific_dev_fd = TRUE; break; /* Set seed */ case 's': seed = strtol(optarg, NULL, 10); user_set_seed = TRUE; break; case 'S': do_syslog = TRUE; break; case 'T': //Load mask for kernel taint flags. process_taint_arg(optarg); if (kernel_taint_mask != 0xFFFFFFFF) outputstd("Custom kernel taint mask has been specified: 0x%08x (%d).\n", kernel_taint_mask, kernel_taint_mask); break; case 'v': verbose = TRUE; break; case 'V': if (victim_path == NULL) { victim_path = strdup(optarg); break; } else { outputstd("Sorry, only one victim path right now.\n"); exit(EXIT_FAILURE); } //FIXME: Later, allow for multiple victim files break; case 'x': do_exclude_syscall = TRUE; toggle_syscall(optarg, FALSE); break; case 'X': dropprivs = TRUE; break; case 0: /* * FIXME: It's really hard to find two reasonable short * names since S s P p all have been used. Use long * options before we fix this issue. */ if (strcmp("server_addr", longopts[opt_index].name) == 0) { unsigned int optarglen = strlen(optarg); unsigned int len = min((unsigned int)sizeof(server_addr), optarglen); strncpy(server_addr, optarg, len); } if (strcmp("server_port", longopts[opt_index].name) == 0) server_port = atoi(optarg); if (strcmp("disable-fds", longopts[opt_index].name) == 0) process_fds_param(optarg, FALSE); if (strcmp("enable-fds", longopts[opt_index].name) == 0) process_fds_param(optarg, TRUE); break; } } if (quiet_level > MAX_LOGLEVEL) quiet_level = MAX_LOGLEVEL; quiet_level = MAX_LOGLEVEL - quiet_level; output(1, "Done parsing arguments.\n"); }
void parse_args(int argc, char *argv[]) { int opt; while ((opt = getopt_long(argc, argv, paramstr, longopts, NULL)) != -1) { switch (opt) { default: if (opt == '?') exit(EXIT_FAILURE); else outputstd("opt:%c\n", opt); return; case '\0': return; case 'c': /* syscalls are all disabled at this point. enable the syscall we care about. */ do_specific_syscall = TRUE; toggle_syscall(optarg, TRUE); break; case 'a': /* One of the architectures selected*/ do_32_arch = FALSE; do_64_arch = FALSE; if (strcmp(optarg, "64") == 0) { do_32_arch = FALSE; do_64_arch = TRUE; } else if (strcmp(optarg, "32") == 0) { do_32_arch = TRUE; do_64_arch = FALSE; } else { outputstd("can't parse %s\n", optarg); exit(EXIT_FAILURE); } break; case 'C': user_specified_children = strtoll(optarg, NULL, 10); max_children = user_specified_children; if (max_children == 0) { outputerr("zero children ? WAT?\n"); exit(EXIT_FAILURE); } break; case 'd': dangerous = TRUE; break; case 'D': debug = TRUE; break; case 'g': if (!strcmp(optarg, "vm")) desired_group = GROUP_VM; if (!strcmp(optarg, "vfs")) desired_group = GROUP_VFS; break; /* Show help */ case 'h': usage(); exit(EXIT_SUCCESS); case 'I': show_ioctl_list = TRUE; break; case 'l': if (!strcmp(optarg, "off")) logging = FALSE; break; case 'L': show_syscall_list = TRUE; break; case 'm': monochrome = TRUE; memset(&ANSI_RED, 0, 1); memset(&ANSI_GREEN, 0, 1); memset(&ANSI_YELLOW, 0, 1); memset(&ANSI_BLUE, 0, 1); memset(&ANSI_MAGENTA, 0, 1); memset(&ANSI_CYAN, 0, 1); memset(&ANSI_WHITE, 0, 1); memset(&ANSI_RESET, 0, 1); break; case 'n': no_files = TRUE; break; /* Set number of syscalls to do */ case 'N': syscalls_todo = strtoll(optarg, NULL, 10); break; /* Pause after each syscall */ case 'p': dopause = TRUE; break; case 'P': do_specific_proto = TRUE; specific_proto = strtol(optarg, NULL, 10); specific_proto_optarg = optarg; break; case 'E': parse_exclude_protos(optarg); break; case 'q': quiet_level++; break; case 'r': if (do_exclude_syscall == TRUE) { outputerr("-r needs to be before any -x options.\n"); exit(EXIT_FAILURE); } random_selection = TRUE; random_selection_num = strtol(optarg, NULL, 10); break; /* Set seed */ case 's': seed = strtol(optarg, NULL, 10); user_set_seed = TRUE; break; case 'S': do_syslog = TRUE; break; case 'T': //Load mask for kernel taint flags. process_taint_arg(optarg); if (kernel_taint_mask != 0xFFFFFFFF) outputstd("Custom kernel taint mask has been specified: 0x%08x (%d).\n", kernel_taint_mask, kernel_taint_mask); break; case 'v': verbose = TRUE; break; case 'V': if (victim_path == NULL) { victim_path = strdup(optarg); break; } else { outputstd("Sorry, only one victim path right now.\n"); exit(EXIT_FAILURE); } //FIXME: Later, allow for multiple victim files break; case 'x': do_exclude_syscall = TRUE; toggle_syscall(optarg, FALSE); break; case 'X': dropprivs = TRUE; break; } } if (quiet_level > MAX_LOGLEVEL) quiet_level = MAX_LOGLEVEL; quiet_level = MAX_LOGLEVEL - quiet_level; output(1, "Done parsing arguments.\n"); }