diff --git a/Makefile b/Makefile index 5680393..ee45db4 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ OBJS = \ CC = gcc LD = gcc RM = rm -rf -PKGS = gstreamer-1.0 +PKGS = gstreamer-1.0 gio-2.0 CFLAGS = -I. `pkg-config --cflags $(PKGS)` `pcap-config --cflags` CFLAGS += -std=gnu99 -W -Wall -Wno-unused-result -pedantic CFLAGS += -DOMVS_VERSION=\"$(OMVS_VERSION)\" diff --git a/omvs_main.c b/omvs_main.c index 6a07d24..090d281 100644 --- a/omvs_main.c +++ b/omvs_main.c @@ -1,4 +1,6 @@ +#include #include +#include #include static gchar *_omvs_net_dev; @@ -36,14 +38,26 @@ typedef struct _OMVSIPAddr { typedef struct _OMVSScanner { OMVSIPAddr *ipaddrs; gint num_ipaddrs; - gint scan_ipaddr_idx; - gint scan_port_idx; } OMVSScanner; +static gint _omvs_start_scan(OMVSScanner *scanner); + +static gint _omvs_start_scan(OMVSScanner *scanner) { + gint i; + for (i = 0; i < scanner->num_ipaddrs; i++) { + g_print("%08x\n", scanner->ipaddrs[i].addr); + } + return 0; +} + int main(int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; int ret = 0; + gint i; + gint num_ipaddrs; + gint idx_ipaddr; + OMVSScanner omvs_scanner; context = g_option_context_new(""); g_option_context_set_summary(context, @@ -70,6 +84,77 @@ int main(int argc, char *argv[]) { goto finish_return; } + num_ipaddrs = 0; + for (i = 1; i < argc; i++) { + GInetAddressMask *mask; + GInetAddress *addr; + guint len; + mask = g_inet_address_mask_new_from_string(argv[i], &error); + if (!mask) { + g_print("%s parsing failed: %s\n", argv[i], error->message); + ret = -3; + goto finish_return; + } + if (g_inet_address_mask_get_family(mask) != G_SOCKET_FAMILY_IPV4) { + g_print("%s is not ipv4 ip address\n", argv[i]); + g_object_unref(mask); + ret = -4; + goto finish_return; + } + addr = g_inet_address_mask_get_address(mask); + if (!g_inet_address_get_is_multicast(addr)) { + g_print("%s is not multicast ip address\n", argv[i]); + g_object_unref(mask); + ret = -4; + goto finish_return; + } + len = g_inet_address_mask_get_length(mask); + if (len) { + num_ipaddrs += (1 << (32 - len)); + } else { + num_ipaddrs++; + } + g_object_unref(mask); + } + + memset(&omvs_scanner, 0, sizeof(OMVSScanner)); + omvs_scanner.ipaddrs = g_malloc0(num_ipaddrs * sizeof(OMVSIPAddr)); + omvs_scanner.num_ipaddrs = num_ipaddrs; + + idx_ipaddr = 0; + for (i = 1; i < argc; i++) { + GInetAddressMask *mask; + GInetAddress *addr; + guint len; + guint32 start_ipaddr; + const guint8 *addr_bytes; + mask = g_inet_address_mask_new_from_string(argv[i], &error); + addr = g_inet_address_mask_get_address(mask); + len = g_inet_address_mask_get_length(mask); + addr_bytes = g_inet_address_to_bytes(addr); + start_ipaddr = + (((guint32)addr_bytes[0]) << 24) | + (((guint32)addr_bytes[1]) << 16) | + (((guint32)addr_bytes[2]) << 8) | + (((guint32)addr_bytes[3]) << 0); + if (len) { + guint n; + guint j; + n = (1 << (32 - len)); + for (j = 0; j < n; j++) { + omvs_scanner.ipaddrs[idx_ipaddr].addr = start_ipaddr; + idx_ipaddr++; + start_ipaddr++; + } + } else { + omvs_scanner.ipaddrs[idx_ipaddr].addr = start_ipaddr; + idx_ipaddr++; + } + } + + _omvs_start_scan(&omvs_scanner); + g_free(omvs_scanner.ipaddrs); + finish_return: g_option_context_free(context);