📄 main.c
字号:
exit_code = -1; goto pcap_out_close; } device = found_device; /* Open the first adapter. */ if ((adhandle = pcap_open_live(device->name, // name of the device 65536, // captures entire packet. daemon_parameters->promisc, // promiscuous mode 1, // read timeout errbuf // error buffer )) == NULL) { co_terminal_print("conet-bridged-daemon: unable to open the adapter.\n"); exit_code = -1; goto pcap_out_close; } /* Check the link layer. We support only Ethernet because coLinux * only talks 802.3 so far. */ if (pcap_datalink(adhandle) != DLT_EN10MB) { co_terminal_print("conet-bridged-daemon: this program works only on 802.3 Ethernet networks.\n"); exit_code = -1; goto pcap_out_close; } if (device->addresses != NULL) { /* Retrieve the mask of the first address of the interface */ netmask = ((struct sockaddr_in *) (device->addresses->netmask))->sin_addr. S_un.S_addr; } else { /* If the interface is without addresses we suppose to be in a C * class network */ netmask = 0xffffff; } //compile the filter if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0) { co_terminal_print("conet-bridged-daemon: unable to compile the packet filter. Check the syntax.\n"); exit_code = -1; goto pcap_out_close; } //set the filter if (pcap_setfilter(adhandle, &fcode) < 0) { co_terminal_print("conet-bridged-daemon: error setting the filter.\n"); exit_code = -1; goto pcap_out_close; } co_terminal_print("conet-bridged-daemon: listening on: %s...\n", device->description); co_terminal_print("conet-bridged-daemon: listening for: %s\n", packet_filter); if (daemon_parameters->promisc == 0) // promiscuous mode? co_terminal_print("conet-bridged-daemon: Promiscuous mode disabled\n"); pcap_packet.adhandle = adhandle; pcap_out_close: // At this point, we don't need any more the device list. Free it pcap_freealldevs(alldevs); pcap_out: return exit_code;}/******************************************************************************** * parameters */void co_net_syntax(){ co_terminal_print("Cooperative Linux Bridged Network Daemon\n"); co_terminal_print("Alejandro R. Sedeno, 2004 (c)\n"); co_terminal_print("Dan Aloni, 2003-2004 (c)\n"); co_terminal_print("\n"); co_terminal_print("syntax: \n"); co_terminal_print("\n"); co_terminal_print(" colinux-bridged-net-daemon -i pid -u unit [-h] [-n 'adapter name'] [-mac xx:xx:xx:xx:xx:xx] [-p promiscuous]\n"); co_terminal_print("\n"); co_terminal_print(" -h Show this help text\n"); co_terminal_print(" -i pid coLinux instance ID to connect to\n"); co_terminal_print(" -u unit Network device index number (0 for eth0, 1 for\n"); co_terminal_print(" eth1, etc.)\n"); co_terminal_print(" -n 'adapter name' The name of the network adapter to attach to\n"); co_terminal_print(" Without this option, the daemon tries to\n"); co_terminal_print(" guess which interface to use\n"); co_terminal_print(" -mac xx:xx:xx:xx:xx:xx MAC address for the bridged interface\n"); co_terminal_print(" -p mode Promiscuous mode can disable with mode 0, if\n"); co_terminal_print(" have problems. It's 1 (enabled) by default\n");}static co_rc_t handle_parameters(start_parameters_t *start_parameters, int argc, char *argv[]){ char **param_scan = argv; const char *option; /* Default settings */ start_parameters->index = -1; start_parameters->instance = -1; start_parameters->show_help = PFALSE; start_parameters->mac_specified = PFALSE; start_parameters->name_specified = PFALSE; start_parameters->promisc = 1; /* Parse command line */ while (*param_scan) { option = "-mac"; if (strcmp(*param_scan, option) == 0) { param_scan++; if (!(*param_scan)) { co_terminal_print("conet-bridged-daemon: parameter of command line option %s not specified\n", option); return CO_RC(ERROR); } co_snprintf(start_parameters->mac_address, sizeof(start_parameters->mac_address), "%s", *param_scan); start_parameters->mac_specified = PTRUE; param_scan++; continue; } option = "-u"; if (strcmp(*param_scan, option) == 0) { param_scan++; if (!(*param_scan)) { co_terminal_print("conet-bridged-daemon: parameter of command line option %s not specified\n", option); return CO_RC(ERROR); } start_parameters->index = atoi(*param_scan); param_scan++; continue; } option = "-i"; if (strcmp(*param_scan, option) == 0) { param_scan++; if (!(*param_scan)) { co_terminal_print("conet-bridged-daemon: parameter of command line option %s not specified\n", option); return CO_RC(ERROR); } start_parameters->instance = (co_id_t) atoi(*param_scan); param_scan++; continue; } option = "-n"; if (strcmp(*param_scan, option) == 0) { param_scan++; if (!(*param_scan)) { co_terminal_print("conet-bridged-daemon: parameter of command line option %s not specified\n", option); return CO_RC(ERROR); } co_snprintf(start_parameters->interface_name, sizeof(start_parameters->interface_name), "%s", *param_scan); start_parameters->name_specified = PTRUE; param_scan++; continue; } option = "-p"; if (strcmp(*param_scan, option) == 0) { param_scan++; if (!(*param_scan)) { co_terminal_print("conet-bridged-daemon: parameter of command line option %s not specified\n", option); return CO_RC(ERROR); } start_parameters->promisc = atoi(*param_scan); param_scan++; continue; } option = "-h"; if (strcmp(*param_scan, option) == 0) { start_parameters->show_help = PTRUE; return CO_RC(OK); } param_scan++; } if (start_parameters->index == -1) { co_terminal_print("conet-bridged-daemon: device index not specified\n"); return CO_RC(ERROR); } if ((start_parameters->index < 0) || (start_parameters->index >= CO_MODULE_MAX_CONET)) { co_terminal_print("conet-bridged-daemon: invalid index: %d\n", start_parameters->index); return CO_RC(ERROR); } if (start_parameters->instance == -1) { co_terminal_print("conet-bridged-daemon: coLinux instance not specificed\n"); return CO_RC(ERROR); } if (!start_parameters->mac_specified) { co_terminal_print("conet-bridged-daemon: error, MAC address not specified\n"); return CO_RC(ERROR); } return CO_RC(OK); }intconet_bridged_main(int argc, char *argv[]){ HANDLE pcap_thread; co_rc_t rc; start_parameters_t start_parameters; co_module_t modules[] = {CO_MODULE_CONET0, }; int exit_code = 0; rc = handle_parameters(&start_parameters, argc, argv); if (!CO_OK(rc)) return -1; if (start_parameters.show_help) { co_net_syntax(); return 0; } daemon_parameters = &start_parameters; exit_code = pcap_init(); if (exit_code) { co_terminal_print("conet-bridged-daemon: error initializing winPCap\n"); goto out; } rc = co_reactor_create(&g_reactor); if (!CO_OK(rc)) { exit_code = -1; goto out; } modules[0] += start_parameters.index; rc = co_user_monitor_open(g_reactor, monitor_receive, start_parameters.instance, modules, sizeof(modules)/sizeof(co_module_t), &g_monitor_handle); if (!CO_OK(rc)) { exit_code = -1; goto out; } pcap_thread = CreateThread(NULL, 0, pcap2Daemon, NULL, 0, NULL); if (pcap_thread == NULL) { co_terminal_print("conet-bridged-daemon: failed to spawn pcap_thread\n"); goto out; } while (1) { rc = co_reactor_select(g_reactor, -1); if (!CO_OK(rc)) break; }out: ExitProcess(exit_code); return exit_code;}/******************************************************************************** * main... */intmain(int argc, char *argv[]){ int ret; co_debug_start(); co_process_high_priority_set(); ret = conet_bridged_main(argc, argv); co_debug_end(); return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -