⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auto_cp.c

📁 自动侦测插入的存贮设备(U盘/移动硬盘等)
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "auto_cp.h"//#include "common.h"#include <pthread.h>#include "link_list.c"int machine_type;pid_t tmppid=0;pthread_t ID_beep_thread;char log_tmp[128];//for beepint usb_be_removed; //=1,声音结束int fail_or_success; //控制声音的频次int my_system(const char* pCmd, char* pResult, int size);  void waitchild(int signal) {	int state;		wait3(&state, WNOHANG, NULL);	}int parse_usb(char *result){	char *p;        	int ret=0;			//printf("[parse_usb]: result=%s.\n",result);	if ((p=strstr(result,"USB Mass Storage device found"))!= 0)		{			printf("[parse_usb]:USB INSERT\n");			ret = INSERT;		}else if ((p=strstr(result,"USB disconnect on device"))!= 0)		{		  printf("[parse_usb]:USB REMOVE\n");			ret = REMOVE;						}else if (((p=strstr(result,"> sda: ")) != 0) && (strlen(result) == 14))		{			//printf("[parse_usb]:USB FIND strlen=%d\n",strlen(result));			sprintf(result,"/dev/%s",p+7);						printf("[parse_usb]:USB FIND sda: %s\n",result);					  			ret = FINDDISK;						}else if (((p=strstr(result,"> sdb: "))!= 0) && (strlen(result) == 14))		{			sprintf(result,"/dev/%s",p+7);		  printf("[parse_usb]:USB FIND sdb: %s\n",result);			ret = FINDDISK;									}						return ret;	}int parse_usb_df(char *result,int usb_stat_old){	char *p;        	int ret=0;			//printf("[parse_usb_df]: result=%s.\n",result);	if ((p=strstr(result,"USB Mass Storage device found"))!= 0)		{			printf("[parse_usb_df]:USB INSERT\n");			ret = INSERT;		}else if ((strlen(result) == 0) && (usb_stat_old == FINDDISK))		{		  printf("[parse_usb_df]:USB REMOVE\n");			ret = REMOVE;						}else if (((p=strstr(result,"/dev/sd")) != 0) && (usb_stat_old != FINDDISK))		{			//printf("[parse_usb_df]:USB FIND strlen=%d\n",strlen(result));						printf("[parse_usb_df]:USB FIND sd: %s\n",result);			ret = FINDDISK;						}						return ret;	}void * beep_thread(void *Param){	time_t star_time = time(0);  		while ((!usb_be_removed)&&(time(0) - star_time < 900))	{	 if (fail_or_success == USB_HANDLE_FAIL)	     {	     	 printf("[beep_thread]:fail......\n");	       usleep(100000);	     }	  else if (fail_or_success == USB_HANDLE_SUCCESS)	  	{	  		printf("[beep_thread]:success......\n");	  	  sleep(1);	  	}	  else if (fail_or_success == USB_HANDLE_START)	  	 {	  	 	  printf("[beep_thread]:start......\n");	  	  	sleep(4);	  	}	  	 	  	 printf("\a");	 printf("\007");	 fprintf(stderr,"%s","\007");	 fprintf(stderr,"%s","\a");	 	} printf("[beep_thread]:beep end: [%d][2-START|1-SUCCESS|0-FAIL]\n",fail_or_success);	}beep_usb_handle_end(beep_mode){  int retval;	      if (ID_beep_thread != 0)   	{     pthread_cancel(ID_beep_thread);     pthread_join(ID_beep_thread, NULL);   }   usb_be_removed = 1;   sleep(2);   usb_be_removed = 0;   fail_or_success = beep_mode;    if((retval = pthread_create(&ID_beep_thread, NULL, beep_thread, NULL)) != 0)     {        	printf("[beep_usb_handle_end]: Create beep_thread failed.\n");	     }else      {     		printf("[beep_usb_handle_end]: beep begin :[%d][2-START|1-SUCCESS|0-FAIL]\n",fail_or_success);     }     		}int get_usb_status_df(){	FILE *fp;	char result[156];	char cmd_tmp[256];	int r_msgid;  int usb_stat,usb_stat_old=0;	//	char buf[256];//	struct recv_msg msgbuf;	struct msgqueue r_msgbuf;			if((r_msgid = msgget(MSGKEY_RECVTOMANG/*发给主进程auto_cp的MSG*/, 0)) == -1) 			{	     	perror("[get_usb_status_df]:r_msgid: msgget()");	    	return   -1 ;	   }		if(0)	{		printf("[get_usb_status_df]:\n!");		return -1;	}	else	{  	  	while(1)  	 {  	      sleep(2);  	      sprintf(cmd_tmp,"mount /dev/sda10 /mnt/usb >/dev/null 2>&1");  	      system(cmd_tmp);  	      sleep(2);  	      sprintf(cmd_tmp,"fdisk -l | grep -A 0  /dev/sd |grep -v Disk |head -n 1| awk '{print $1}'");  	      my_system( cmd_tmp,result,56);  	      sleep(1);  	    	  	    	if (0)  	    	{  	    		  	    		printf("[get_usb_status_df]:not find usb\n");  	      	    	    	}else  	    	{   	    			        	    			      usleep(1000);  	      	      	usb_stat=parse_usb_df(result,usb_stat_old);  	      	      	r_msgbuf.type=1;			  	        	 printf("[get_usb_status_df]:fgets :%s,[%d][REMOVE=2|FINDDISK=3]\n",result,usb_stat);	  	      	    		if (usb_stat == INSERT)  	      	    		 {//Send msg to Mount process  	      	    		 	      	      	    		 	    r_msgbuf.body=INSERT;  	      	    		 	     	      	    		 	    if(msgsnd(r_msgid, (struct msg *)&r_msgbuf, sizeof(struct msgqueue),1) == -1)			  	                 {			  	                	  perror("[get_usb_status_df]:sndmsg: INSERT fail\n");			  	                	  return  -1;			  	                 }  	      	    		 	  	      	    		 	  usleep(500000);  	      	    		      	      	    		 }else if (usb_stat == REMOVE)  	      	    		 {//Send msg to Umount process   	      	    		 	    usb_stat_old = REMOVE;  	      	    		 	    r_msgbuf.body=REMOVE;  	      	    		 	     	      	    		 	    if(msgsnd(r_msgid, (struct msg *)&r_msgbuf, sizeof(struct msgqueue),1) == -1)			  	                 {			  	                	  printf("[get_usb_status_df]:sndmsg: REMOVE fail\n");			  	                	  return  -1;			  	                 } 	      	    		   	      	    		 		    	      	    		 		    	      	    		 		sleep(5);  	      	    		 }else if (usb_stat == FINDDISK)  	      	    		 {//Send msg to Umount process   	      	    		 	    usb_stat_old = FINDDISK;  	      	    		 	    r_msgbuf.body=FINDDISK;  	      	    		 	    trim(result);  	      	    		 	    sprintf(r_msgbuf.dev,"%s",result);  	      	    		 	      	      	    		 	    if(msgsnd(r_msgid, (struct msg *)&r_msgbuf, sizeof(struct msgqueue),1) == -1)			  	                 {			  	                	  printf("[get_usb_status_df]:sndmsg: FINDDISK fail\n");			  	                	  return  -1;			  	                 } 	      	    		   	      	    		 		    	      	    		 		    	      	    		 		sleep(5);  	      	    		 }  	      			   	      			  	      		}    	}			}		return 0;	}int get_usb_status_kmsg(){	FILE *fp;	char result[512];	int r_msgid;  int usb_stat;	//	char buf[256];//	struct recv_msg msgbuf;	struct msgqueue r_msgbuf;			if((r_msgid = msgget(MSGKEY_RECVTOMANG/*发给主进程auto_cp的MSG*/, 0)) == -1) 			{	     	perror("[get_usb_status_kmsg]:r_msgid: msgget()");	    	return   -1 ;	   }		if((fp=fopen("/proc/kmsg","r"))==NULL)	{		printf("[get_usb_status_kmsg]: open /proc/kmsg fail\n!");		return -1;	}	else	{  	// while(!feof(fp))  	while(1)  	 {  	      //usleep(20000);  	    	if(fgets(result,128,fp) == NULL)  	    	{  	    		 printf("[get_usb_status_kmsg]:fgets error ,fp=%d\n",fp);  	      	    	    	}else  	    	{   	    			      printf("[get_usb_status_kmsg]:fgets :%s\n",result);  	    			      //usleep(1000);  	      	      	usb_stat=parse_usb(result);  	      	      	r_msgbuf.type=1;			  	        		  	      	    		if (usb_stat == INSERT)  	      	    		 {//Send msg to Mount process  	      	    		 	    printf("[get_usb_status_kmsg]:sndmsg: INSERT \n");  	      	    		 	    r_msgbuf.body=INSERT;  	      	    		 	     	      	    		 	    if(msgsnd(r_msgid, (struct msg *)&r_msgbuf, sizeof(struct msgqueue),1) == -1)			  	                 {			  	                	  perror("[get_usb_status_kmsg]:sndmsg: INSERT fail\n");			  	                	  return  -1;			  	                 }  	      	    		 	  	      	    		 	 // usleep(500000);  	      	    		      	      	    		 }else if (usb_stat == REMOVE)  	      	    		 {//Send msg to Umount process   	      	    		 	     	      	    		 	    r_msgbuf.body=REMOVE;  	      	    		 	    printf("[get_usb_status_kmsg]:sndmsg: REMOVE \n");  	      	    		 	    if(msgsnd(r_msgid, (struct msg *)&r_msgbuf, sizeof(struct msgqueue),1) == -1)			  	                 {			  	                	  printf("[get_usb_status_kmsg]:sndmsg: REMOVE fail\n");			  	                	  return  -1;			  	                 } 	      	    		   	      	    		 		    	      	    		 		    	      	    		 		//usleep(100000);  	      	    		 }else if (usb_stat == FINDDISK)  	      	    		 {//Send msg to Umount process   	      	    		 	     	      	    		 	    r_msgbuf.body=FINDDISK;  	      	    		 	    sprintf(r_msgbuf.dev,"%s",result);  	      	    		 	    printf("[get_usb_status_kmsg]:sndmsg: FINDDISK \n");  	      	    		 	    if(msgsnd(r_msgid, (struct msg *)&r_msgbuf, sizeof(struct msgqueue),1) == -1)			  	                 {			  	                	  printf("[get_usb_status_kmsg]:sndmsg: FINDDISK fail\n");			  	                	  return  -1;			  	                 } 	      	    		   	      	    		 		    	      	    		 		    	      	    		 		//usleep(100000);  	      	    		 }else{//Other msg,do nothing  	      	    		 	  	  	      	    		 	  	//printf("[get_usb_status_kmsg]:do not sndmsg: OTHER \n");  	      	    		 	      	      	    		 	  	  	      	    		 }  	      			   	      			  	      		}    	}	 fclose(fp);		}	fclose(fp);	return 0;	}int mount_usb(char *usb_dev){	char tmp[128];	char result[128];	int i=0;	  umount_usb(usb_dev);		sleep(2);//	if (machine_type==1/*decode client*/)//	  sprintf(tmp,"mount  %s /mnt/usb  2>&1 ",usb_dev);//	else //		{//			sprintf(tmp,"fdisk -l | grep -A 0  /dev/sd |grep -v Disk | awk '{print $7}'");//  	  my_system( tmp,result,128);//			 if ((strstr(result,"W95")>0)|| (strstr(result,"FAT32")>0))//	       sprintf(tmp,"mount  -t msdos %s /mnt/usb  2>&1 ",usb_dev);//	     else  sprintf(tmp,"mount  %s /mnt/usb  2>&1 ",usb_dev);//	       	//	  }  sprintf(tmp,"mount  %s /mnt/usb  2>&1 ",usb_dev);	printf("[mount_usb]: CMD=%s\n",tmp);	while(1)	{		i++;	   my_system(tmp,result,128);	   //printf("[mount_usb]:my_system: result=%s\n",result);	  if ((strlen(result) == 0) || (i>3))	  {	  		//printf("[mount_usb]:break: i=%d\n",i);		    break;		}	  sleep(1);	}			if (strlen(result) == 0)		{			printf("[mount_usb]:mount success: i=%d\n",i);	    return 0;	    	 }	else 		{			printf("[mount_usb]:mount fail: i=%d\n",i);			perror("[mount_usb]");			return -1;					}}int umount_usb()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -