mirror of
				https://bitbucket.org/ohhara/ohmulticastvideoscanner.git
				synced 2025-10-31 02:17:13 +00:00 
			
		
		
		
	Add network interface device list and selection.
This commit is contained in:
		
							parent
							
								
									9c0494a903
								
							
						
					
					
						commit
						b0d6263589
					
				
							
								
								
									
										88
									
								
								omvs_main.c
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								omvs_main.c
									
									
									
									
									
								
							| @ -3,17 +3,24 @@ | |||||||
| #include <gio/gio.h> | #include <gio/gio.h> | ||||||
| #include <gst/gst.h> | #include <gst/gst.h> | ||||||
| 
 | 
 | ||||||
| static gchar *_omvs_net_dev; | static gint _omvs_net_dev_idx; | ||||||
|  | static gboolean _omvs_list_devs; | ||||||
| static gchar *_omvs_output = "omvs_out.txt"; | static gchar *_omvs_output = "omvs_out.txt"; | ||||||
| static gint _omvs_jobs = 1; | static gint _omvs_jobs = 1; | ||||||
| static gint _omvs_sleep = 1000; | static gint _omvs_sleep = 1000; | ||||||
| static gint _omvs_timeout = 10000; | static gint _omvs_timeout = 10000; | ||||||
| static gboolean _omvs_verbose; | static gboolean _omvs_verbose; | ||||||
| 
 | 
 | ||||||
|  | static gchar **_omvs_net_dev_names; | ||||||
|  | static gchar **_omvs_net_dev_descs; | ||||||
|  | static gint _omvs_num_net_devs; | ||||||
|  | 
 | ||||||
| static GOptionEntry _omvs_entries[] = | static GOptionEntry _omvs_entries[] = | ||||||
| { | { | ||||||
|   { "interface", 'i', 0, G_OPTION_ARG_STRING, &_omvs_net_dev, |   { "interface", 'i', 0, G_OPTION_ARG_INT, &_omvs_net_dev_idx, | ||||||
|     "Network device interface", "dev" }, |     "Network device interface index", "dev_idx" }, | ||||||
|  |   { "list-inteface", 'l', 0, G_OPTION_ARG_NONE, &_omvs_list_devs, | ||||||
|  |     "List network device interfaces", NULL }, | ||||||
|   { "jobs", 'j', 0, G_OPTION_ARG_INT, &_omvs_jobs, |   { "jobs", 'j', 0, G_OPTION_ARG_INT, &_omvs_jobs, | ||||||
|     "Number of jobs", "jobs" }, |     "Number of jobs", "jobs" }, | ||||||
|   { "output", 'o', 0, G_OPTION_ARG_FILENAME, &_omvs_output, |   { "output", 'o', 0, G_OPTION_ARG_FILENAME, &_omvs_output, | ||||||
| @ -43,9 +50,63 @@ typedef struct _OMVSScanner { | |||||||
|   gint num_ipaddrs; |   gint num_ipaddrs; | ||||||
| } OMVSScanner; | } OMVSScanner; | ||||||
| 
 | 
 | ||||||
|  | static gint _omvs_init_net_devs_info(void); | ||||||
|  | static gint _omvs_print_net_devs_info(void); | ||||||
|  | static gint _omvs_deinit_net_devs_info(void); | ||||||
| static gint _omvs_start_scan(OMVSScanner *scanner); | static gint _omvs_start_scan(OMVSScanner *scanner); | ||||||
| static gpointer _omvs_start_scan_job(gpointer data); | static gpointer _omvs_start_scan_job(gpointer data); | ||||||
| 
 | 
 | ||||||
|  | static gint _omvs_init_net_devs_info(void) { | ||||||
|  |   gchar errbuf[PCAP_ERRBUF_SIZE]; | ||||||
|  |   pcap_if_t *alldevs; | ||||||
|  |   pcap_if_t *dev; | ||||||
|  |   gint i; | ||||||
|  | 
 | ||||||
|  |   if (pcap_findalldevs(&alldevs, errbuf) != 0) { | ||||||
|  |     g_print("pcap_findalldevs() fail: %s", errbuf); | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |   dev = alldevs; | ||||||
|  |   while (dev) { | ||||||
|  |     _omvs_num_net_devs++; | ||||||
|  |     dev = dev->next; | ||||||
|  |   } | ||||||
|  |   _omvs_net_dev_names = g_malloc(sizeof(gchar *) * _omvs_num_net_devs); | ||||||
|  |   _omvs_net_dev_descs = g_malloc(sizeof(gchar *) * _omvs_num_net_devs); | ||||||
|  | 
 | ||||||
|  |   for (i = 0, dev = alldevs; dev; i++, dev = dev->next) { | ||||||
|  |     _omvs_net_dev_names[i] = g_strdup(dev->name); | ||||||
|  |     _omvs_net_dev_descs[i] = g_strdup(dev->description); | ||||||
|  |   } | ||||||
|  |   pcap_freealldevs(alldevs); | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static gint _omvs_print_net_devs_info(void) { | ||||||
|  |   gint i; | ||||||
|  | 
 | ||||||
|  |   for (i = 0; i < _omvs_num_net_devs; i++) { | ||||||
|  |     g_print("dev_idx(%d) dev_name(%s) dev_desc(%s)\n", | ||||||
|  |       i, _omvs_net_dev_names[i], _omvs_net_dev_descs[i]); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static gint _omvs_deinit_net_devs_info(void) { | ||||||
|  |   gint i; | ||||||
|  | 
 | ||||||
|  |   for (i = 0; i < _omvs_num_net_devs; i++) { | ||||||
|  |     g_free(_omvs_net_dev_names[i]); | ||||||
|  |     g_free(_omvs_net_dev_descs[i]); | ||||||
|  |   } | ||||||
|  |   g_free(_omvs_net_dev_names); | ||||||
|  |   g_free(_omvs_net_dev_descs); | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static gpointer _omvs_start_scan_job(gpointer data) { | static gpointer _omvs_start_scan_job(gpointer data) { | ||||||
|   OMVSScanner *scanner; |   OMVSScanner *scanner; | ||||||
|   GError *error; |   GError *error; | ||||||
| @ -90,8 +151,8 @@ static gpointer _omvs_start_scan_job(gpointer data) { | |||||||
|       g_print("[%p] start scanning %s\n", (void *)g_thread_self(), addr_str); |       g_print("[%p] start scanning %s\n", (void *)g_thread_self(), addr_str); | ||||||
|     } |     } | ||||||
|     group_address = g_inet_address_new_from_string(addr_str); |     group_address = g_inet_address_new_from_string(addr_str); | ||||||
|     if (!g_socket_join_multicast_group( |     if (!g_socket_join_multicast_group(socket, group_address, FALSE, | ||||||
|       socket, group_address, FALSE, _omvs_net_dev, &error)) { |       _omvs_net_dev_names[_omvs_net_dev_idx], &error)) { | ||||||
|       g_printerr("[%p] can't join %s: %s\n", (void *)g_thread_self(), |       g_printerr("[%p] can't join %s: %s\n", (void *)g_thread_self(), | ||||||
|         addr_str, error->message); |         addr_str, error->message); | ||||||
|     } |     } | ||||||
| @ -101,8 +162,8 @@ static gpointer _omvs_start_scan_job(gpointer data) { | |||||||
|     if (_omvs_verbose) { |     if (_omvs_verbose) { | ||||||
|       g_print("[%p] finish scanning %s\n", (void *)g_thread_self(), addr_str); |       g_print("[%p] finish scanning %s\n", (void *)g_thread_self(), addr_str); | ||||||
|     } |     } | ||||||
|     if (!g_socket_leave_multicast_group( |     if (!g_socket_leave_multicast_group(socket, group_address, FALSE, | ||||||
|       socket, group_address, FALSE, _omvs_net_dev, &error)) { |       _omvs_net_dev_names[_omvs_net_dev_idx], &error)) { | ||||||
|       g_printerr("[%p] can't leave %s: %s\n", (void *)g_thread_self(), |       g_printerr("[%p] can't leave %s: %s\n", (void *)g_thread_self(), | ||||||
|         addr_str, error->message); |         addr_str, error->message); | ||||||
|     } |     } | ||||||
| @ -163,6 +224,11 @@ int main(int argc, char *argv[]) { | |||||||
|   gint idx_ipaddr; |   gint idx_ipaddr; | ||||||
|   OMVSScanner omvs_scanner; |   OMVSScanner omvs_scanner; | ||||||
| 
 | 
 | ||||||
|  |   if (_omvs_init_net_devs_info() != 0) { | ||||||
|  |     ret = -5; | ||||||
|  |     goto finish_return2; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   context = g_option_context_new("<multicast ip address or net ... [#N]>"); |   context = g_option_context_new("<multicast ip address or net ... [#N]>"); | ||||||
|   g_option_context_set_summary(context, |   g_option_context_set_summary(context, | ||||||
|     "omvs scans to find free video streaming multicast ip addresses." |     "omvs scans to find free video streaming multicast ip addresses." | ||||||
| @ -180,6 +246,12 @@ int main(int argc, char *argv[]) { | |||||||
|     goto finish_return; |     goto finish_return; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   if (_omvs_list_devs) { | ||||||
|  |     _omvs_print_net_devs_info(); | ||||||
|  |     ret = 0; | ||||||
|  |     goto finish_return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   if (argc < 2) { |   if (argc < 2) { | ||||||
|     gchar *help_msg; |     gchar *help_msg; | ||||||
|     help_msg = g_option_context_get_help(context, TRUE, NULL); |     help_msg = g_option_context_get_help(context, TRUE, NULL); | ||||||
| @ -263,6 +335,8 @@ int main(int argc, char *argv[]) { | |||||||
| 
 | 
 | ||||||
| finish_return: | finish_return: | ||||||
|   g_option_context_free(context); |   g_option_context_free(context); | ||||||
|  |   _omvs_deinit_net_devs_info(); | ||||||
|  | finish_return2: | ||||||
| 
 | 
 | ||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user