/* Function which parses command options; returns true if it ate an option */ static int parse(int c, char **argv, int invert, unsigned int *flags, const struct ipt_entry *entry, unsigned int *nfcache, struct ipt_entry_match **match) { struct ipt_string_info *stringinfo = (struct ipt_string_info *)(*match)->data; switch (c) { case '1': if (*flags & FROM) exit_error(PARAMETER_PROBLEM, "Can't specify multiple --from"); stringinfo->from_offset = atoi(optarg); *flags |= FROM; break; case '2': if (*flags & TO) exit_error(PARAMETER_PROBLEM, "Can't specify multiple --to"); stringinfo->to_offset = atoi(optarg); *flags |= TO; break; case '3': if (*flags & ALGO) exit_error(PARAMETER_PROBLEM, "Can't specify multiple --algo"); parse_algo(optarg, stringinfo); *flags |= ALGO; break; case '4': if (*flags & STRING) exit_error(PARAMETER_PROBLEM, "Can't specify multiple --string"); check_inverse(optarg, &invert, &optind, 0); parse_string(argv[optind-1], stringinfo); if (invert) stringinfo->invert = 1; stringinfo->patlen=strlen((char *)&stringinfo->pattern); *flags |= STRING; break; case '5': if (*flags & STRING) exit_error(PARAMETER_PROBLEM, "Can't specify multiple --hex-string"); check_inverse(optarg, &invert, &optind, 0); parse_hex_string(argv[optind-1], stringinfo); /* sets length */ if (invert) stringinfo->invert = 1; *flags |= STRING; break; default: return 0; } return 1; }
algolist_t parse_algolist(void) { algolist_t algolist = empty_algolist(); while (lookahead[0]->type == ALGORITHM) { list_push_back(algolist, parse_algo()); } return algolist; }
static gboolean parse_key_data (gchar *line, SeahorseSSHKeyData *data) { gchar* space; guchar *bytes; gboolean ret; gsize len; /* Get the type */ space = strchr (line, ' '); if (space == NULL) return FALSE; *space = '\0'; data->algo = parse_algo (line); *space = ' '; if (data->algo == SSH_ALGO_UNK) return FALSE; line = space + 1; if (!*line) return FALSE; /* Prepare for decoding */ g_strchug (line); space = strchr (line, ' '); if (space) *space = 0; g_strchomp (line); /* Decode it, and parse binary stuff */ bytes = g_base64_decode (line, &len); ret = parse_key_blob (bytes, len, data); g_free (bytes); if (!ret) return FALSE; /* The number of bits */ data->length = calc_bits (data->algo, len); /* And the rest is the comment */ if (space) { *space = ' '; ++space; /* If not utf8 valid, assume latin 1 */ if (!g_utf8_validate (space, -1, NULL)) data->comment = g_convert (space, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); else data->comment = g_strdup (space); } return TRUE; }