static void follow_arg_range(const char **opt_argp, cli_follow_info_t* cli_follow_info) { int len; if (**opt_argp == 0) { cli_follow_info->chunkMin = 1; cli_follow_info->chunkMax = G_MAXUINT32; } else { if (sscanf(*opt_argp, ",%u-%u%n", &cli_follow_info->chunkMin, &cli_follow_info->chunkMax, &len) == 2) { *opt_argp += len; } else if (sscanf(*opt_argp, ",%u%n", &cli_follow_info->chunkMin, &len) == 1) { cli_follow_info->chunkMax = cli_follow_info->chunkMin; *opt_argp += len; } else { follow_exit("Invalid range."); } if (cli_follow_info->chunkMin < 1 || cli_follow_info->chunkMin > cli_follow_info->chunkMax) { follow_exit("Invalid range value."); } } }
static void follow_stream(const char *opt_argp, void *userdata) { follow_info_t *follow_info; cli_follow_info_t* cli_follow_info; GString *errp; register_follow_t* follower = (register_follow_t*)userdata; follow_index_filter_func index_filter; follow_address_filter_func address_filter; opt_argp += strlen(STR_FOLLOW); opt_argp += strlen(proto_get_protocol_filter_name(get_follow_proto_id(follower))); cli_follow_info = g_new0(cli_follow_info_t, 1); follow_info = g_new0(follow_info_t, 1); follow_info->gui_data = cli_follow_info; cli_follow_info->follower = follower; follow_arg_mode(&opt_argp, follow_info); follow_arg_filter(&opt_argp, follow_info); follow_arg_range(&opt_argp, cli_follow_info); follow_arg_done(opt_argp); if (cli_follow_info->stream_index >= 0) { index_filter = get_follow_index_func(follower); follow_info->filter_out_filter = index_filter(cli_follow_info->stream_index); if (follow_info->filter_out_filter == NULL) { follow_exit("Error creating filter for this stream."); } } else { address_filter = get_follow_address_func(follower); follow_info->filter_out_filter = address_filter(&cli_follow_info->addr[0], &cli_follow_info->addr[1], cli_follow_info->port[0], cli_follow_info->port[1]); if (follow_info->filter_out_filter == NULL) { follow_exit("Error creating filter for this address/port pair.\n"); } } errp = register_tap_listener(get_follow_tap_string(follower), follow_info, follow_info->filter_out_filter, 0, NULL, get_follow_tap_handler(follower), follow_draw); if (errp != NULL) { follow_free(follow_info); g_string_free(errp, TRUE); follow_exit("Error registering tap listener."); } }
static void follow_arg_filter(const char **opt_argp, follow_info_t *follow_info) { int len; unsigned int ii; char addr[ADDR_LEN]; cli_follow_info_t* cli_follow_info = (cli_follow_info_t*)follow_info->gui_data; if (sscanf(*opt_argp, ",%u%n", &cli_follow_info->stream_index, &len) == 1 && ((*opt_argp)[len] == 0 || (*opt_argp)[len] == ',')) { *opt_argp += len; } else { for (ii = 0; ii < sizeof cli_follow_info->addr/sizeof *cli_follow_info->addr; ii++) { if ((sscanf(*opt_argp, ADDRv6_FMT, addr, &cli_follow_info->port[ii], &len) != 2 && sscanf(*opt_argp, ADDRv4_FMT, addr, &cli_follow_info->port[ii], &len) != 2) || cli_follow_info->port[ii] <= 0 || cli_follow_info->port[ii] > G_MAXUINT16) { follow_exit("Invalid address:port pair."); } if (strcmp("ip6", host_ip_af(addr)) == 0) { if (!get_host_ipaddr6(addr, (struct e_in6_addr *)cli_follow_info->addrBuf[ii])) { follow_exit("Can't get IPv6 address"); } set_address(&cli_follow_info->addr[ii], AT_IPv6, 16, cli_follow_info->addrBuf[ii]); } else { if (!get_host_ipaddr(addr, (guint32 *)cli_follow_info->addrBuf[ii])) { follow_exit("Can't get IPv4 address"); } set_address(&cli_follow_info->addr[ii], AT_IPv4, 4, cli_follow_info->addrBuf[ii]); } *opt_argp += len; } if (cli_follow_info->addr[0].type != cli_follow_info->addr[1].type) { follow_exit("Mismatched IP address types."); } cli_follow_info->stream_index = -1; } }
static void follow_arg_mode(const char **opt_argp, follow_info_t *follow_info) { cli_follow_info_t* cli_follow_info = (cli_follow_info_t*)follow_info->gui_data; if (follow_arg_strncmp(opt_argp, STR_HEX)) { cli_follow_info->show_type = SHOW_HEXDUMP; } else if (follow_arg_strncmp(opt_argp, STR_ASCII)) { cli_follow_info->show_type = SHOW_ASCII; } else if (follow_arg_strncmp(opt_argp, STR_EBCDIC)) { cli_follow_info->show_type = SHOW_EBCDIC; } else if (follow_arg_strncmp(opt_argp, STR_RAW)) { cli_follow_info->show_type = SHOW_RAW; } else { follow_exit("Invalid display mode."); } }
static void follow_arg_done(const char *opt_argp) { if (*opt_argp != 0) { follow_exit("Invalid parameter."); } }
static void follow_arg_filter(const char **opt_argp, follow_info_t *follow_info) { int len; unsigned int ii; char addr[ADDR_LEN]; cli_follow_info_t* cli_follow_info = (cli_follow_info_t*)follow_info->gui_data; gboolean is_ipv6; if (sscanf(*opt_argp, ",%d%n", &cli_follow_info->stream_index, &len) == 1 && ((*opt_argp)[len] == 0 || (*opt_argp)[len] == ',')) { *opt_argp += len; } else { for (ii = 0; ii < sizeof cli_follow_info->addr/sizeof *cli_follow_info->addr; ii++) { if (sscanf(*opt_argp, ADDRv6_FMT, addr, &cli_follow_info->port[ii], &len) == 2) { is_ipv6 = TRUE; } else if (sscanf(*opt_argp, ADDRv4_FMT, addr, &cli_follow_info->port[ii], &len) == 2) { is_ipv6 = FALSE; } else { follow_exit("Invalid address."); } if (cli_follow_info->port[ii] <= 0 || cli_follow_info->port[ii] > G_MAXUINT16) { follow_exit("Invalid port."); } if (is_ipv6) { if (!get_host_ipaddr6(addr, &cli_follow_info->addrBuf[ii].addrBuf_v6)) { follow_exit("Can't get IPv6 address"); } set_address(&cli_follow_info->addr[ii], AT_IPv6, 16, (void *)&cli_follow_info->addrBuf[ii].addrBuf_v6); } else { if (!get_host_ipaddr(addr, &cli_follow_info->addrBuf[ii].addrBuf_v4)) { follow_exit("Can't get IPv4 address"); } set_address(&cli_follow_info->addr[ii], AT_IPv4, 4, (void *)&cli_follow_info->addrBuf[ii].addrBuf_v4); } *opt_argp += len; } if (cli_follow_info->addr[0].type != cli_follow_info->addr[1].type) { follow_exit("Mismatched IP address types."); } cli_follow_info->stream_index = -1; } }