Add multicast ip address parser.

This commit is contained in:
Taeho Oh 2016-01-05 14:40:04 +09:00 committed by Taeho Oh
parent e2927aac55
commit bee33bf997
2 changed files with 88 additions and 3 deletions

View File

@ -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)\"

View File

@ -1,4 +1,6 @@
#include <string.h>
#include <pcap.h>
#include <gio/gio.h>
#include <gst/gst.h>
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("<multicast ip address or net ... [#N]>");
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);