Beispiel #1
0
QList<DMXInterface *> FTD2XXInterface::interfaces(QList<DMXInterface *> discoveredList)
{
    QList <DMXInterface*> interfacesList;
    int id = 0;

    /* Find out the number of FTDI devices present */
    DWORD num = 0;
    FT_STATUS status = FT_CreateDeviceInfoList(&num);
    if (status != FT_OK || num <= 0)
    {
        qWarning() << Q_FUNC_INFO << "[FTD2XXInterface] Error in FT_CreateDeviceInfoList:" << status;
        return interfacesList;
    }

    // Allocate storage for list based on numDevices
    FT_DEVICE_LIST_INFO_NODE* devInfo = new FT_DEVICE_LIST_INFO_NODE[num];

    // Get the device information list
    if (FT_GetDeviceInfoList(devInfo, &num) == FT_OK)
    {
        for (DWORD i = 0; i < num; i++)
        {
            QString vendor, name, serial;
            quint16 VID, PID;
            FT_STATUS s = get_interface_info(i, vendor, name, serial, VID, PID);
            if (s != FT_OK || name.isEmpty() || serial.isEmpty())
            {
				// Seems that some otherwise working devices don't provide
                // FT_PROGRAM_DATA struct used by get_interface_info().
                name = QString(devInfo[i].Description);
				serial = QString(devInfo[i].SerialNumber);
				vendor = QString();
			}

            qDebug() << "serial: " << serial << "name:" << name << "vendor:" << vendor;

            bool found = false;
            for (int c = 0; c < discoveredList.count(); c++)
            {
                if (discoveredList.at(c)->checkInfo(serial, name, vendor) == true)
                {
                    found = true;
                    break;
                }
            }
            if (found == false)
            {
                FTD2XXInterface *iface = new FTD2XXInterface(serial, name, vendor, VID, PID, id);
                interfacesList << iface;
            }

            id++;
        }
    }

    delete [] devInfo;
    return interfacesList;
}
u32 cw_cfg_dynamic_update_init()
{
	s32 ret = CWLAN_OK;
	/* 获取套接字描述符 */
	g_ap_udp_sock.sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if (-1 == g_ap_udp_sock.sockfd)
	{
		printf("socket: %d %s\n", errno, strerror(errno));
		return CWLAN_FAIL;
	}

    /* 设置服务器端基本配置信息 */
	g_ap_udp_sock.server_addr.sin_family =AF_INET;
	g_ap_udp_sock.server_addr.sin_port = htons(g_ap_com_cfg.ac_com_port);
	g_ap_udp_sock.server_addr.sin_addr.s_addr = htonl(g_ap_com_cfg.ac_com_addr);
	bzero(&(g_ap_udp_sock.server_addr.sin_zero), 8);

	/*获得本地出口地址和端口*/
	get_interface_info(g_ap_com_cfg.ap_com_eth, &g_ap_udp_sock.client_ip, g_ap_udp_sock.client_mac);
	g_ap_udp_sock.client_port = 22223;

    /* 设置客户机端基本配置信息 */
    g_ap_udp_sock.client_addr.sin_family =AF_INET;
	g_ap_udp_sock.client_addr.sin_port = htons(g_ap_udp_sock.client_port);
	g_ap_udp_sock.client_addr.sin_addr.s_addr = 0;//htonl(g_ap_udp_sock.client_ip);
	bzero(&(g_ap_udp_sock.client_addr.sin_zero), 8);

    
    /* 显示通信连接基本信息 */
    printf("\n========== INFOMATION ===========\n");
    printf("Server:sockfd = %d\n",g_ap_udp_sock.sockfd);
    printf("Server:server IP   : %s\n",inet_ntoa(g_ap_udp_sock.server_addr.sin_addr));
    printf("Server:server PORT : %d\n",ntohs(g_ap_udp_sock.server_addr.sin_port));
    printf("Server:client IP   : %s\n",inet_ntoa(g_ap_udp_sock.client_addr.sin_addr));
    printf("Server:client PORT : %d\n",ntohs(g_ap_udp_sock.client_addr.sin_port));
	printf("Server:client MAC  : %02x:%02x:%02x:%02x:%02x:%02x\n", 
			(u8)g_ap_udp_sock.client_mac[0],(u8)g_ap_udp_sock.client_mac[1],
			(u8)g_ap_udp_sock.client_mac[2],(u8)g_ap_udp_sock.client_mac[3],
			(u8)g_ap_udp_sock.client_mac[4],(u8)g_ap_udp_sock.client_mac[5]
		);

    printf("-----------------------------------\n");
    
    /* 指定一个套接字使用的端口 */
	if (-1 == bind (g_ap_udp_sock.sockfd, (struct sockaddr *)&g_ap_udp_sock.client_addr, sizeof(struct sockaddr)))
	{
		printf("bind: %d %s\n", errno, strerror(errno));
		return CWLAN_FAIL;
	}

	ret = cw_dispose_pthread_cfg_init();
	return ret;
	
}
static int init_network(struct config *conf) {
	int sd;
	int ret;
	struct sockaddr_ieee802154 a;

	sd = socket(PF_IEEE802154, SOCK_DGRAM, 0);
	if (sd < 0) {
		perror("socket");
		return 1;
	}

	get_interface_info(conf);

	a.family = AF_IEEE802154;
	a.addr.addr_type = IEEE802154_ADDR_SHORT;
	a.addr.pan_id = conf->pan_id;

	/* Bind socket on this side */
	a.addr.short_addr = conf->short_addr;
	ret = bind(sd, (struct sockaddr *)&a, sizeof(a));
	if (ret) {
		perror("bind");
		return 1;
	}

	/* Connect to other side */
	a.addr.short_addr = conf->dst_addr;
	ret = connect(sd, (struct sockaddr *)&a, sizeof(a));
	if (ret) {
		perror("connect");
		return 1;
	}

	if (conf->server)
		init_server(conf, sd);

	measure_roundtrip(conf, sd);

	shutdown(sd, SHUT_RDWR);
	close(sd);
	return 0;
}
s32 cw_ap_recv_ac_update_url_wl(dcma_udp_skb_info_t *buff)
{
	ac_udp_white_list_t *node = (ac_udp_white_list_t *)buff->data;
	dns_white_list_t dns_white_list = {0,{0}};

	s8 *url;
	u32 i;
	u32 ip;
	u32 maxnumber = buff->number<CLOUD_WLAN_WHITE_LIST_MAX_U?buff->number:CLOUD_WLAN_WHITE_LIST_MAX_U;

	/*需要删除数据库中所有重定向表中的数据*/
	snprintf(g_cw_sql, G_CW_SQL_BUF_LEN, "delete from %s;",CWLAN_AP_WHITE_TABLE);
	sqlite3_exec_unres(g_cw_db, g_cw_sql);

	memset(&dns_white_list, 0, sizeof(dns_white_list));
	
	get_interface_info("br-lan", &ip, NULL);
	dns_white_list.list[dns_white_list.number++] = ip;
	
	for(i=0; i<maxnumber; i++)
	{
		url = (s8 *)node->data;
		if(url != NULL)
		{
			/*更新数据库中所有重定向表中的数据*/
			snprintf(g_cw_sql, G_CW_SQL_BUF_LEN, 
				"INSERT INTO %s (url) VALUES('%s');",
				CWLAN_AP_WHITE_TABLE, url);
			sqlite3_exec_unres(g_cw_db, g_cw_sql);
			
			cw_get_url_dns(url, &dns_white_list);
		}
		node = (ac_udp_white_list_t *)(url + node->len);
	}
	
	cloud_wlan_sendto_kmod(CW_NLMSG_UPDATE_WHITE_LIST, (s8 *)&dns_white_list, sizeof(dns_white_list));
    return CWLAN_OK;
}
static ssh_dns_resolver_get_2k(SshDNSResolver resolver)
{
  HMODULE  module;
  p_get_interface_info get_interface_info;
  p_get_per_adapter_info get_per_adapter_info;
  IP_INTERFACE_INFO *interface_info;
  IP_ADAPTER_INDEX_MAP *adapter_map;
  IP_PER_ADAPTER_INFO  *adapter_info;
  IP_ADDR_STRING  *addr_string;
  SshInt32 count;
  SshUInt32 result;
  SshUInt32 info_len = 0;
  Boolean added = FALSE;
  SshIpAddrStruct address[1];

  module = LoadLibrary(TEXT("iphlpapi"));
  if (module == NULL)
    {
      SSH_DEBUG(SSH_D_FAIL, ("Unable to load iphelper library"));
      return FALSE;
    }

  get_interface_info 
    = (p_get_interface_info)GetProcAddress(module,
                                           TEXT("GetInterfaceInfo"));
  get_per_adapter_info 
    = (p_get_per_adapter_info)GetProcAddress(module,
                                             TEXT("GetPerAdapterInfo"));
  if (get_interface_info == NULL ||
           get_per_adapter_info == NULL)
    {
      SSH_DEBUG(SSH_D_FAIL, ("Could not find necessary"
                             " functions in the library"));
      goto exit_function;
    }

  result = get_interface_info(NULL, &info_len);
  if (ERROR_INSUFFICIENT_BUFFER != result)
    {
      SSH_DEBUG(SSH_D_FAIL,
                ("Unable to get the size of Interface info. Error is %d",
                 result));
      goto exit_function;
    }
  
  interface_info = ssh_calloc(1, info_len);
  if (NULL == interface_info)
    {
      SSH_DEBUG(SSH_D_FAIL, ("Unable to allocate memory"));
      goto exit_function;
    }
  result = get_interface_info(interface_info, &info_len); 
  if (NO_ERROR != result)
    {
      SSH_DEBUG(SSH_D_FAIL,
                ("Failed to Get Interface information. Error is %d", result));
      goto exit_function;
    }

  for (count = 0; count < interface_info->NumAdapters; count++)
    {
      adapter_map = (IP_ADAPTER_INDEX_MAP *)&(interface_info->Adapter[count]);
      info_len = 0;

      result = get_per_adapter_info(adapter_map->Index, NULL, &info_len);
      if (ERROR_BUFFER_OVERFLOW == result)
        {
          adapter_info = ssh_calloc(1, info_len);
          if (NULL == adapter_info)
            {
              SSH_DEBUG(SSH_D_FAIL, ("Unable to allocate memory"));
              break; 
            }

          result = get_per_adapter_info(adapter_map->Index,
                                        adapter_info,
                                        &info_len);
          if (NO_ERROR == result)
            {
              addr_string = &(adapter_info->DnsServerList);
              while (addr_string !=NULL)
                {
                  if (ssh_ipaddr_parse(address, 
                                       addr_string->IpAddress.String))
                    {
                      ssh_dns_resolver_safety_belt_add(resolver, 1, address);

                      added = TRUE;

                      SSH_DEBUG(SSH_D_NICETOKNOW, ("Added DNS server %@",
                                                   ssh_ipaddr_render,
                                                   address));
                    }
                            
                  addr_string = addr_string->Next;
                }
            }
          else
            {
              /* Failed for this adapter. Lets continue for other adapters */
              SSH_DEBUG(SSH_D_FAIL, 
                        ("Failed to get adapter info for index %d. "
                         "Error is %d", count, result));
            }
          
          ssh_free(adapter_info);
        }
       else
         {
           SSH_DEBUG(SSH_D_FAIL, 
                     ("Failed to get adapter info len for index %d. "
                      "Error is %d", count, result)); 
         }
    }
exit_function:    
  ssh_free(interface_info);
  FreeLibrary(module);
  return added;
}
void *cw_ap_local_cfg_dynamic_update(void *param)
{
	u32 i, ret;
	time_t cw_network = 0;
	s8 *url = NULL;
	u32 ip = 0;
	s8 cmd[128]={0};
	s8 logname[64]={0};
	struct in_addr tmp_ip;
	//sqlite3_res res;
	dns_white_list_t dns_white_list = {0,{0}};
	struct stat filestat;

	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	/*以下为系统默认方式*/
	//pthread_setcanceltype(PTHREAD_CANCEL_DEFFERED, NULL);

	
	while(1)
	{
	
		pthread_testcancel();
/*这个需要系统功能支持*/
		stat(DNS_CONFIG_FILE, &filestat);
		if(cw_network < filestat.st_ctime)
		{
			cw_network = filestat.st_ctime;
			memset(&dns_white_list, 0, sizeof(dns_white_list));
/*优先更新本地,要不管理web页面都上不去*/
			get_interface_info("br-lan", &ip, NULL);
			dns_white_list.list[dns_white_list.number++] = ip;
			cloud_wlan_sendto_kmod(CW_NLMSG_UPDATE_WHITE_LIST, (s8 *)&dns_white_list, sizeof(dns_white_list_t));
			
			while(1)
			{
				get_interface_info(g_ap_com_cfg.ap_com_eth, &ip, NULL);
				if(ip != 0)
				{
					break;
				}
			}

			/*更新portal的url*/
			cw_ap_local_update_portal_wl();

			cw_ap_local_update_url_wl(&dns_white_list);

		}
		stat(CW_AP_LOG_FILE, &filestat);
		if( filestat.st_size> CW_AP_LOG_MAX)
		{
			system(">cw_ap.log");
		}
		 
		stat(CW_AP_KLOG_FILE, &filestat);
		if( filestat.st_size> CW_AP_KLOG_MAX)
		{

			snprintf(logname, 64, "%02x%02x%02x%02x%02x%02x.%s.%d", 
				(u8)g_ap_udp_sock.client_mac[0],(u8)g_ap_udp_sock.client_mac[1],
				(u8)g_ap_udp_sock.client_mac[2],(u8)g_ap_udp_sock.client_mac[3],
				(u8)g_ap_udp_sock.client_mac[4],(u8)g_ap_udp_sock.client_mac[5],
				CW_AP_KLOG_FILE,filestat.st_mtime
				);
			
			CW_DEBUG_U("Turn on the log: %s\n",logname);
			
			tmp_ip.s_addr = g_ap_com_cfg.ac_com_addr;
			snprintf(cmd, 128, "mv %s %s; tftp -p -l %s %s; rm %s",
				CW_AP_KLOG_FILE, logname, logname, inet_ntoa(tmp_ip), logname);
			system(cmd);
		}
		/*
		stat(CLIENTS_FILE_PATH, &filestat);
		if(clients < filestat.st_ctime)
		{
			clients = filestat.st_ctime;
			CW_DEBUG_U("call clients config update\n");
		}
		*/
		pthread_testcancel();
		sleep(3);
	};
}