📄 auto_cp.c
字号:
#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 + -