/********************************************************************************** 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"); } } } }