static error_t parse_opt(int key, char *arg, struct argp_state *state) { struct args *args = state->input; long l; switch (key) { case 's': l = arg_to_long(state, arg); if (l <= 0) argp_error(state, "NUM must be greater than zero"); args->start_at = l - 1; break; case 'e': l = arg_to_long(state, arg); if (l <= 0) argp_error(state, "NUM must be greater than zero"); args->end_at = l - 1; break; case 'p': args->show_progress = !!arg_to_long(state, arg); break; case ARGP_KEY_INIT: args->dev_path = NULL; break; case ARGP_KEY_ARG: if (args->dev_path) argp_error(state, "Wrong number of arguments; only one is allowed"); args->dev_path = arg; break; case ARGP_KEY_END: if (!args->dev_path) argp_error(state, "The disk path was not specified"); if (args->start_at > args->end_at) argp_error(state, "Option --start-at must be less or equal to option --end-at"); break; default: return ARGP_ERR_UNKNOWN; } return 0; }
static error_t parse_opt(int key, char *arg, struct argp_state *state) { struct args *args = state->input; switch (key) { case 's': args->stack = arg; if (strcmp(arg, "ip") && strcmp(arg, "xia")) argp_error(state, "Stack must be either 'ip', or 'xia'"); break; case 'r': args->add_rules = 1; assert(!arg); break; case 'e': args->ebtables = arg; break; case 't': args->sleep = arg_to_long(state, arg); if (args->sleep < 1) argp_error(state, "Sleep period must be >= 1"); break; case 'p': args->parents = 1; assert(!arg); break; case 'd': args->daemon = 1; assert(!arg); break; case 'f': args->file = arg; break; case ARGP_KEY_INIT: break; case ARGP_KEY_ARG: if (!if_nametoindex(arg)) argp_error(state, "Invalid interface `%s'", arg); make_space(args); args->ifs[args->count++] = arg; break; case ARGP_KEY_END: if (args->add_rules && args->count < 1) argp_error(state, "There must be at least one " "inteface to add"); break; default: return ARGP_ERR_UNKNOWN; } return 0; }
static error_t parse_opt(int key, char *arg, struct argp_state *state) { struct args *args = state->input; switch (key) { case 'p': args->prefix_filename = arg; break; case 'x': args->prefix_limit = arg_to_long(state, arg); if (args->prefix_limit < 1) argp_error(state, "Prefix limit must be >= 1"); break; case 'z': { char *end; args->s = strtod(arg, &end); if (!*arg || *end) argp_error(state, "'%s' is not a float", arg); if (args->s < 0 || args->s == NAN || args->s == INFINITY) argp_error(state,"Zipf must be >= 0"); break; } case 's': args->stack = arg; if (strcmp(arg, "ip") && strcmp(arg, "xia")) argp_error(state, "Stack must be either 'ip', or 'xia'"); break; case 'i': args->ifname = arg; break; case 'm': args->dst_mac_len = lladdr_pton(arg, args->dst_mac, sizeof(args->dst_mac)); if (args->dst_mac_len < 1) argp_error(state, "'%s' is not a valid Ethernet address", arg); break; case 't': args->dst_addr_type = arg; if (strcmp(arg, "ip") && strcmp(arg, "fb0") && strcmp(arg, "fb1") && strcmp(arg, "fb2") && strcmp(arg, "fb3") && strcmp(arg, "via")) argp_error(state, "'%s' is not a valid type", arg); break; case 'l': args->packet_len = arg_to_long(state, arg); if (args->packet_len < 1) argp_error(state, "Packet lenght must be >= 1"); break; case 'n': args->nnodes = arg_to_long(state, arg); if (args->nnodes < 2) argp_error(state, "Number of nodes must be >= 2"); break; case 'd': args->node_id = arg_to_long(state, arg); if (args->node_id < 1) argp_error(state, "Node ID must be >= 1"); break; case 'r': args->run = arg_to_long(state, arg); if (args->run < 1) argp_error(state,"Run must be >= 1"); break; case 'v': args->interactive = 1; break; default: return ARGP_ERR_UNKNOWN; } return 0; }