Linux下用Socket检测设备的挂载(实现设备的自动挂载)

/**********************************************************************************
	2012.12.29 -->> Linux下用Socket检测设备的挂载(实现设备的自动挂载) 

	关于Wifi网络名称和密码配置:
	
	  方案一:	  
		在硬盘的根目录下新建一个文件:wifi_cfg.txt.
		内容(模板)如下:
		WLAN_NAME=TEST WLan
		WLAN_PASSWORD=23456789
		其中"TEST WLan"可以替换为其他的名称作为“Wifi网络名”。
		"23456789"为连接本网络的密码。
		系统在检测到USB Wifi之后,就会去探测这个文件,如果有,并且数据有效,
		就会按照本配置来设置网络,否则系统使用方案二。
		
		  
	方案二:
	
	  如果在硬盘的根目录下没有找到文件:wifi_cfg.txt.
	  则系统会使用一个默认的Wifi网络名和密码.
	  默认的网络名称为:HACK WLan
	  默认的网络密码为:12345678
	  (本默认网络名和密码,你们可以提出更改为其他名称 作为默认)
	  
	注意:
		1.在系统中,我限制了网络名称为64个字节以内。
		2.设置网络密码时,如果位数小于8位,视为无效密码,则系统使用默认配置。

***********************************************************************************/

#define TMP_BUF_LEN	(64)
#define WifiConfigName	"/mnt/hd1/wifi_cfg.txt"

char pFixedUSBWifiName[TMP_BUF_LEN]={0};
char pFixedUSBWifiPassWord[TMP_BUF_LEN]={0};

static void CheckStringNULL(char *pInputString,int len)
{
	int i=0;
	for(i=0;i<len;++i)
	{
		if(pInputString[i]=='\r')
			pInputString[i]='\0';
		if(pInputString[i]=='\n')
			pInputString[i]='\0';
	}
	pInputString[len]='\0';
}

static int get_file_line(char *pInputName, char *pOutputBuf,int bufferLen, int line_idx)
{
	FILE * fp;
	int i=0;
	char *p;
	char * line = NULL;
	size_t len = 0;
	ssize_t read;
	
	fp = fopen(pInputName, "r");
	if (fp == NULL)
		return -1;
	
	if(pOutputBuf && (line_idx<=0))
	{
		fclose(fp);
		return -2;
	}
	
	while ((read = getline(&line, &len, fp)) != -1) {
		//printf("line ==== %s \n",line);
		p=line;
		if(line[0]=='#')
			continue;
		++i;		
		if(pOutputBuf && (i>=line_idx))
			break;
	}
	if(pOutputBuf && (i==line_idx))
	{
		int length=strlen(line)>bufferLen?bufferLen:strlen(line);
		memcpy(pOutputBuf,line,length);
	}else
	{
		i=-1;
	}

	if (line != NULL)	free(line);
	if (fp   != NULL)	fclose(fp);

	return i;
}

/*
	return :
	-1 : name or password is invalid.
	 0 : name and password are valid.
*/
static int GetWifiNameAndPassword()
{
	
	char *p=NULL;
	char *pTempBuffer=NULL;
	
	
	if ( access(WifiConfigName, F_OK ) == 0 )
	{
		memset(pFixedUSBWifiName,0,TMP_BUF_LEN);
		memset(pFixedUSBWifiPassWord,0,TMP_BUF_LEN);
		
		if( (1==get_file_line(WifiConfigName,pFixedUSBWifiName,TMP_BUF_LEN,1))
			&& (2==get_file_line(WifiConfigName,pFixedUSBWifiPassWord,TMP_BUF_LEN,2)) )
		{	// name and password exist.
			if(NULL!=(pTempBuffer=malloc(sizeof(char)*TMP_BUF_LEN)))
			{
				memcpy(pTempBuffer,pFixedUSBWifiName,TMP_BUF_LEN);
				memset(pFixedUSBWifiName,0,TMP_BUF_LEN);
				p=strchr(pTempBuffer,'=');
				if(NULL!=p)	memcpy(pFixedUSBWifiName,p+1,pTempBuffer+TMP_BUF_LEN-p);
				else 
					goto ret_error;
				
				CheckStringNULL(pFixedUSBWifiName,pTempBuffer+TMP_BUF_LEN-p);
				//printf("000 pFixedUSBWifiName === [%s] \n",pFixedUSBWifiName);
				
				
				memcpy(pTempBuffer,pFixedUSBWifiPassWord,TMP_BUF_LEN);
				memset(pFixedUSBWifiPassWord,0,TMP_BUF_LEN);
				p=strchr(pTempBuffer,'=');
				if(NULL!=p)	memcpy(pFixedUSBWifiPassWord,p+1,pTempBuffer+TMP_BUF_LEN-p);
				else 
					goto ret_error;
				//pFixedUSBWifiPassWord[pTempBuffer+TMP_BUF_LEN-p]="\0";
				CheckStringNULL(pFixedUSBWifiPassWord,pTempBuffer+TMP_BUF_LEN-p);
				//printf("000 pFixedUSBWifiPassWord === [%s] [%d]\n",pFixedUSBWifiPassWord,strlen(pFixedUSBWifiPassWord));	
				if(strlen(pFixedUSBWifiPassWord)<8)	goto ret_error;
				
				if(NULL!=pTempBuffer)	free(pTempBuffer);
				return 0;
				
			}else
				goto ret_error;
		}else
			goto ret_error;
	}else 
	{	// donot exist wifi config file.
		goto ret_error;
	}
	
ret_error:
	//printf("111 pFixedUSBWifiName === [%s] \n",pFixedUSBWifiName);
	//printf("111 pFixedUSBWifiPassWord === [%s] \n",pFixedUSBWifiPassWord);
	if(NULL!=pTempBuffer)	free(pTempBuffer);
	return -1;
}

static void MountUSBWiFi(void)
{
	char *pTempCmdString=NULL;
	
	system("killall dhcpd");
	system("ifconfig ra0 192.168.0.1 netmask 255.255.255.0");
	system("/etc/Wireless/RT2870AP/iwpriv ra0 set AuthMode=WPA2PSK");
	system("/etc/Wireless/RT2870AP/iwpriv ra0 set EncrypType=TKIP");
	
#if 1		
	
	if(0==GetWifiNameAndPassword())
	{	// use fixed name and password.
		if(NULL!=(pTempCmdString=malloc(sizeof(char)*TMP_BUF_LEN*2)))
		{
			memset(pTempCmdString,0,TMP_BUF_LEN*2);
			sprintf(pTempCmdString,"/etc/Wireless/RT2870AP/iwpriv ra0 set SSID=\"%s\"",pFixedUSBWifiName);
			
			//printf(" pTempCmdString ========== [%s] \n",pTempCmdString);
			system(pTempCmdString);
			
			memset(pTempCmdString,0,TMP_BUF_LEN*2);
			sprintf(pTempCmdString,"/etc/Wireless/RT2870AP/iwpriv ra0 set WPAPSK=%s",pFixedUSBWifiPassWord);
			
			//printf(" pTempCmdString ========== [%s] \n",pTempCmdString);
			system(pTempCmdString);
			
			memset(pTempCmdString,0,TMP_BUF_LEN*2);
			sprintf(pTempCmdString,"/etc/Wireless/RT2870AP/iwpriv ra0 set SSID=\"%s\"",pFixedUSBWifiName);
			//printf(" pTempCmdString ========== [%s] \n",pTempCmdString);
			system(pTempCmdString);
			
			free(pTempCmdString);
			pTempCmdString=NULL;
		}
	}
	else
#endif			
	{	// use default name and password.
		system("/etc/Wireless/RT2870AP/iwpriv ra0 set SSID=\"HACK WLan\"");
		system("/etc/Wireless/RT2870AP/iwpriv ra0 set WPAPSK=12345678");
		system("/etc/Wireless/RT2870AP/iwpriv ra0 set SSID=\"HACK WLan\"");
	}

	system("/etc/Wireless/RT2870AP/dhcpd &");

	return 0;
}

static int InitHotplugSock(void)
{
	
    struct sockaddr_nl snl;
    const int buffersize = 16 * 1024;
    int retval;
	
    memset(&snl, 0x00, sizeof(struct sockaddr_nl));
    snl.nl_family = AF_NETLINK;
    snl.nl_pid = getpid();
    snl.nl_groups = 1;
	
    int hotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
    if (hotplug_sock == -1) {
        printf("error getting socket: %s", strerror(errno));
        return -1;
    }
	
    /* set receive buffersize */
    setsockopt(hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
    retval = bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
	
    if (retval < 0) {
        printf("bind failed: %s", strerror(errno));
        close(hotplug_sock);
        hotplug_sock = -1;
        return -1;
    }
	
    return hotplug_sock;
}

void CheackUSBWiFi(void)
{
#define UEVENT_BUFFER_SIZE 2048
	int hotplug_sock;
	char buf_cache[UEVENT_BUFFER_SIZE],*pTempSeekPt,*pTempSeek2;
	int tTempNum,tMntValue;
	int tMntFlag;
	int tRemoveFlag = 0;
	
	hotplug_sock = InitHotplugSock();
	
	memset(buf_cache, 0 ,sizeof(buf_cache));
	
	while(1)
	{
		tTempNum=recv(hotplug_sock,buf_cache, sizeof(buf_cache), 0);
		if( tTempNum<0  )
		{
			printf("======usb hot plug error!!!=======\n");
			break;
		}
		if( tTempNum!=0 )
		{
			buf_cache[tTempNum]=0;
			//printf("buf_cache (pinggle print): %s \n", buf_cache);
			
			if( NULL!=strstr(buf_cache,"add@/devices/virtual/net/ra0") )
			{	
				printf("usb ==== ADD pinggle print \n");
				MountUSBWiFi();
			}
			if( NULL!=strstr(buf_cache,"remove@/devices/virtual/net/ra0") )
			{	
				printf("usb ==== Remove pinggle print \n");
			} 				
		}
	}
}

你可能感兴趣的:(linux,linux,linux,socket,socket,socket,wifi,wifi,wifi,串口,dev,dev)