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

来源:互联网 发布:汽车防盗芯片编程器 编辑:程序博客网 时间:2024/04/27 23:15
/**********************************************************************************2012.12.29 -->> Linux下用Socket检测设备的挂载(实现设备的自动挂载) 关于Wifi网络名称和密码配置:  方案一:  在硬盘的根目录下新建一个文件:wifi_cfg.txt.内容(模板)如下:WLAN_NAME=TEST WLanWLAN_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;}elsegoto ret_error;}elsegoto 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 1if(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 2048int 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");} }}}

原创粉丝点击