diff --git a/omvs_main.c b/omvs_main.c index fe3fac1..b5488c9 100644 --- a/omvs_main.c +++ b/omvs_main.c @@ -8,6 +8,7 @@ static gchar *_omvs_output = "omvs_out.txt"; static gint _omvs_jobs = 1; static gint _omvs_sleep = 1000; static gint _omvs_timeout = 10000; +static gboolean _omvs_verbose; static GOptionEntry _omvs_entries[] = { @@ -21,6 +22,8 @@ static GOptionEntry _omvs_entries[] = "Sleep time(milliseconds) between scans", "ms" }, { "timeout", 't', 0, G_OPTION_ARG_INT, &_omvs_timeout, "Timeout time(milliseconds) in each scan", "ms" }, + { "verbose", 'v', 0, G_OPTION_ARG_NONE, &_omvs_verbose, + "Be verbose", NULL }, { NULL } }; @@ -45,14 +48,74 @@ static gpointer _omvs_start_scan_job(gpointer data); static gpointer _omvs_start_scan_job(gpointer data) { OMVSScanner *scanner; + GError *error; + GSocket *socket; + GSocketAddress *socket_address; + GInetAddress *inet_address; gint i; scanner = (OMVSScanner *)data; - for (i = 0; i < scanner->num_ipaddrs; i++) { - g_print("%p %08x\n", (void *)g_thread_self(), scanner->ipaddrs[i].addr); + socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, + G_SOCKET_PROTOCOL_DEFAULT, &error); + if (!socket) { + g_printerr("[%p] can't create socket: %s\n", (void *)g_thread_self(), + error->message); + goto finish_return1; } + inet_address = g_inet_address_new_any(G_SOCKET_FAMILY_IPV4); + socket_address = g_inet_socket_address_new(inet_address, 0xffff); + g_object_unref(inet_address); + if (!g_socket_bind(socket, socket_address, TRUE, &error)) { + g_printerr("[%p] can't bind socket: %s\n", (void *)g_thread_self(), + error->message); + goto finish_return2; + } + + for (i = 0; i < scanner->num_ipaddrs; i++) { + guint8 addr[4]; + gchar *addr_str; + GInetAddress *group_address; + + addr[0] = (guint8)((scanner->ipaddrs[i].addr >> 24) & 0xff); + addr[1] = (guint8)((scanner->ipaddrs[i].addr >> 16) & 0xff); + addr[2] = (guint8)((scanner->ipaddrs[i].addr >> 8) & 0xff); + addr[3] = (guint8)((scanner->ipaddrs[i].addr >> 0) & 0xff); + + addr_str = + g_strdup_printf("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); + + if (_omvs_verbose) { + g_print("[%p] start scanning %s\n", (void *)g_thread_self(), addr_str); + } + group_address = g_inet_address_new_from_string(addr_str); + if (!g_socket_join_multicast_group( + socket, group_address, FALSE, _omvs_net_dev, &error)) { + g_printerr("[%p] can't join %s: %s\n", (void *)g_thread_self(), + addr_str, error->message); + } + + g_usleep(_omvs_timeout * 1000); + + if (_omvs_verbose) { + g_print("[%p] finish scanning %s\n", (void *)g_thread_self(), addr_str); + } + if (!g_socket_leave_multicast_group( + socket, group_address, FALSE, _omvs_net_dev, &error)) { + g_printerr("[%p] can't leave %s: %s\n", (void *)g_thread_self(), + addr_str, error->message); + } + g_object_unref(group_address); + g_free(addr_str); + + g_usleep(_omvs_sleep * 1000); + } + +finish_return2: + g_object_unref(socket_address); + g_object_unref(socket); +finish_return1: return NULL; }