📄 eibdrv_comm.c
字号:
exit(2); while(1) pause();}void write_sigchld_handler(){ /* SIGCHLD wird bei jeder Beendigung des Write-idle- Prozesses an den main-Prozess gesendet. Wenn die Beendigung des Prozesses jedoch durch den SIGTERM-Handler des main-Prozesses erfolgt ist, wird aufgrund der Nichtunterbrechbarkeit des SIGTERM-Handlers durch andere Signale mit anschliessender Programmbeendigung der SIGCHLD-Handler nicht mehr aufgerufen. */ int exit_status; pid_t exit_pid; exit_pid=wait(&exit_status); comm->cleanup_code=6; if (WIFSIGNALED(exit_status)) fl_ext_panel1(comm->Panels+6,comm,cleanup); else { switch(WEXITSTATUS(exit_status)) { case 1: // receive SIGTERM case 2: // fail sigaction for SIGTERM-handler // fail sigaction for SIGUSR1-handler // fail shmat for write_shm fl_ext_panel1(comm->Panels+6,comm,cleanup); break; } } }void write_sigterm_handler(){ /* Das Hauptform ist bereits aufgebaut, wenn der Handler installiert wird. Ein hide ist daher auch bei abgeblendetem Form ungefaehrlich, das free wirkt jedenfalls auf ein bestehendes Form. */ fl_hide_form(comm->Form->VisForm); fl_free_form(comm->Form->VisForm); if (write_pid!=0) { kill(write_pid,SIGTERM); waitpid(write_pid,NULL,0); } semctl(write_shm_sem_id,0,IPC_RMID,(int)0); shmdt(write_shm); shmctl(write_shm_id,IPC_RMID,(int)0); close(comm->eib_fd); returnEib_bcu2_comm(comm); fl_finish(); exit(0);}void write_sigusr1_handler(){ /* SIGUSR1 wird vom write-idle process an den communicator im write mode gesendet, wenn er dieser die das Ergebnis des write Systemaufrufs erhalten hat, gesendet. */ char browsertext[EIB_BUF_ELEMENT_SIZE*3+12+27]; int i; time_t log_time; FL_OBJECT *browser=comm->Form->SentMsgBrowser; if (comm->state==EIBDRV_COMM_STATE_WAITWRITE) { comm->state=EIBDRV_COMM_STATE_READY; time(&log_time); P(write_shm_sem_id); strcpy(&browsertext[0],"@f"); strcpy(&browsertext[2],ctime(&log_time)); strcpy(&browsertext[26]," "); for (i=0;i<write_shm->len;i++) sprintf(&browsertext[29+3*i],"%02X ",write_shm->msg[i]); for (i=write_shm->len;i<EIB_BUF_ELEMENT_SIZE;i++) strcpy(&browsertext[29+3*i],"-- "); if (write_shm->n_written<write_shm->len) sprintf(&browsertext[29+3*i],"(%3i)",write_shm->n_written); else sprintf(&browsertext[29+3*i],"(%3i) OK",write_shm->n_written); browsertext[38+3*i]='\0'; V(write_shm_sem_id); if (fl_get_browser_maxline(browser)+1==EIBDRV_COMM_BROWSERMAXLINE) { for (i=0;i<EIBDRV_COMM_BROWSERDELLINE-1;i++) fl_delete_browser_line(browser,1); fl_replace_browser_line(browser,1,"lines have been deleted ..."); } fl_add_browser_line(browser,&browsertext[0]); fl_set_browser_topline(browser,fl_get_browser_maxline(browser)- fl_get_browser_screenlines(browser)+1); }}void eibdrv_comm_write(char *device){ /* Communicator in Write Mode */ int result,mode; struct sigaction write_sigterm; struct sigaction write_sigchld; struct sigaction write_sigusr1; comm->comm_mode=EIBDRV_COMM_MODE_WRITE; comm->cleanup_code=1; if ((comm->eib_fd=open(device,O_RDWR))<0) { switch(result=errno) { case ENOENT: fl_ext_panel1(comm->Panels,comm,cleanup); break; case EBUSY: fl_ext_panel1(comm->Panels+1,comm,cleanup); break; case ENOBUFS: fl_ext_panel1(comm->Panels+2,comm,cleanup); break; default: fl_ext_panel1(comm->Panels+3,comm,cleanup); break; } fl_do_forms(); } comm->cleanup_code=2; if ((mode=ioctl(comm->eib_fd,FT_GET_MODE))<0) { switch(result=errno) { case EBUSY: fl_ext_panel1(comm->Panels+4,comm,cleanup); break; } fl_do_forms(); } comm->Form=create_form_VisForm(comm); fl_show_form(comm->Form->VisForm,FL_PLACE_CENTER,FL_TRANSIENT,"eibdrv_comm_write"); comm->cleanup_code=3; fl_set_object_label(comm->Form->DeviceText,device); switch(mode) { case FT_STANDARDMODE: fl_set_object_label(comm->Form->ModeText,"Standard Mode"); fl_ext_panel1(comm->Panels+5,comm,panel_cb); break; case FT_SERVERMODE: fl_set_object_label(comm->Form->ModeText,"Server Mode"); if (ioctl(comm->eib_fd,FT_SET_WRITE_MODE,FT_WRITE_ACKNOWLEDGED)<0) { switch(result=errno) { case EBUSY: fl_ext_panel1(comm->Panels+4,comm,cleanup); break; case ENOPROC: // should not occur } fl_do_forms(); } break; } write_sigterm.sa_handler=write_sigterm_handler; sigfillset(&write_sigterm.sa_mask); write_sigterm.sa_flags=0; if (sigaction(SIGTERM,&write_sigterm,NULL)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } write_sigchld.sa_handler=write_sigchld_handler; sigfillset(&write_sigchld.sa_mask); write_sigchld.sa_flags=0; if (sigaction(SIGCHLD,&write_sigchld,NULL)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } write_sigusr1.sa_handler=write_sigusr1_handler; sigfillset(&write_sigusr1.sa_mask); write_sigusr1.sa_flags=0; if (sigaction(SIGUSR1,&write_sigusr1,NULL)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } if ((write_shm_id=shmget(IPC_PRIVATE,sizeof(write_shm_struct),0600|IPC_CREAT|IPC_EXCL))==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } comm->cleanup_code=4; if ((write_shm=(write_shm_struct *)shmat(write_shm_id,NULL,0))==(void *)-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } comm->cleanup_code=5; if ((write_shm_sem_id=semget(IPC_PRIVATE,1,0600|IPC_CREAT|IPC_EXCL))==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } comm->cleanup_code=6; if (semctl(write_shm_sem_id,0,SETVAL,(int)1)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } switch(write_pid=fork()) { case -1: fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); case 0: eibdrv_comm_write_idle(); } comm->state=EIBDRV_COMM_STATE_READY; fl_do_forms();}/* --------------------------------------------------------------------------- Funktionen fuer Read Mode. --------------------------------------------------------------------------- */void read_sigterm_handler(){ time_t end_time; char line[96]; int i; if (comm->log_fd!=NULL) { time(&end_time); for (i=0;i<95;i++) line[i]='='; line[95]='\0'; fprintf(comm->log_fd,"%s\nEnd: %s%s",line,ctime(&end_time),line); fclose(comm->log_fd); } fl_hide_form(comm->Form->VisForm); fl_free_form(comm->Form->VisForm); close(comm->eib_fd); returnEib_bcu2_comm(comm); fl_finish(); exit(0);}void read_sigio_handler(){ unsigned char msg[EIB_BUF_ELEMENT_SIZE]; char browsertext[EIB_BUF_ELEMENT_SIZE*3+3+27]; int i; int n_read; time_t log_time; FL_OBJECT *browser=comm->Form->ReceivedMsgBrowser; while ((n_read=read(comm->eib_fd,&msg[0],EIB_BUF_ELEMENT_SIZE))>0) { time(&log_time); strcpy(&browsertext[0],"@f"); strcpy(&browsertext[2],ctime(&log_time)); strcpy(&browsertext[26]," "); for (i=0;i<n_read;i++) sprintf(&browsertext[29+3*i],"%02X ",msg[i]); for (i=n_read;i<EIB_BUF_ELEMENT_SIZE;i++) strcpy(&browsertext[29+3*i],"-- "); if (fl_get_browser_maxline(browser)+1==EIBDRV_COMM_BROWSERMAXLINE) { for (i=0;i<EIBDRV_COMM_BROWSERDELLINE-1;i++) fl_delete_browser_line(browser,1); fl_replace_browser_line(browser,1,"lines have been deleted ..."); } fl_add_browser_line(browser,&browsertext[0]); fl_set_browser_topline(browser,fl_get_browser_maxline(browser)- fl_get_browser_screenlines(browser)+1); fprintf(comm->log_fd,"%s\n",&browsertext[2]); }} void eibdrv_comm_read(char *device){ /* Communicator in Read Mode */ int result,mode,i; struct sigaction read_sigio; struct sigaction read_sigterm; unsigned long flags; time_t start_time; char line[96]; comm->comm_mode=EIBDRV_COMM_MODE_READ; comm->cleanup_code=1; if ((comm->eib_fd=open(device,O_RDWR|O_NONBLOCK))<0) { switch(result=errno) { case ENOENT: fl_ext_panel1(comm->Panels,comm,cleanup); break; case EBUSY: fl_ext_panel1(comm->Panels+1,comm,cleanup); break; case ENOBUFS: fl_ext_panel1(comm->Panels+2,comm,cleanup); break; default: fl_ext_panel1(comm->Panels+3,comm,cleanup); break; } fl_do_forms(); } comm->cleanup_code=2; if ((mode=ioctl(comm->eib_fd,FT_GET_MODE))<0) { switch(result=errno) { case EBUSY: fl_ext_panel1(comm->Panels+4,comm,cleanup); break; } fl_do_forms(); } if (fcntl(comm->eib_fd,F_SETOWN,getpid())==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } if ((flags=fcntl(comm->eib_fd,F_GETFL))==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } if (fcntl(comm->eib_fd,F_SETFL,flags|FASYNC)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } comm->Form=create_form_VisForm(comm); fl_show_form(comm->Form->VisForm,FL_PLACE_CENTER,FL_TRANSIENT,"eibdrv_comm_read"); comm->cleanup_code=3; fl_set_object_label(comm->Form->DeviceText,device); switch(mode) { case FT_STANDARDMODE: fl_set_object_label(comm->Form->ModeText,"Standard Mode"); fl_ext_panel1(comm->Panels+5,comm,panel_cb); fl_ext_deactivate_object(comm->Form->StatusBtn); break; case FT_SERVERMODE: fl_set_object_label(comm->Form->ModeText,"Server Mode"); break; } read_sigio.sa_handler=read_sigio_handler; sigfillset(&read_sigio.sa_mask); read_sigio.sa_flags=0; if (sigaction(SIGIO,&read_sigio,NULL)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } read_sigterm.sa_handler=read_sigterm_handler; sigfillset(&read_sigterm.sa_mask); read_sigterm.sa_flags=0; if (sigaction(SIGTERM,&read_sigterm,NULL)==-1) { fl_ext_panel1(comm->Panels+6,comm,cleanup); fl_do_forms(); } if ((comm->log_fd=fopen(EIBDRV_COMM_LOGFILE,"w"))==NULL) fl_ext_panel1(comm->Panels+9,comm,panel_cb); else { time(&start_time); for (i=0;i<95;i++) line[i]='='; line[95]='\0'; fprintf(comm->log_fd,"%s\nLOG for: %s\nFile: %s\nStart: %s%s\n", line,"eibdrv_comm (Read Mode)","eibdrv_comm.log", ctime(&start_time),line); fprintf(comm->log_fd,"\n\nCONFIGURATION:\n\nDevice: %s\nMode: %s\n%s\n\n", device,(mode==FT_STANDARDMODE ? "Standard Mode" : "Server Mode"),line); } fl_do_forms();} int main(int argc, char *argv[]){ comm=getEib_bcu2_comm(); if (read_PanelContentA(EIBDRV_COMM_PANELFILE,&comm->Panels)!=EIBDRV_COMM_PANELFILESIZE) { printf("eibdrv_comm: Panelfile %s not found!\n",EIBDRV_COMM_PANELFILE); exit(2); } if (argc!=3) { printf("usage: eibdrv_comm r|w device\n"); exit(1); } fl_set_icm_color(FL_INACTIVE_COL,200,200,200); fl_initialize(&argc,argv,"eibdrv_comm",0,0); fl_set_border_width(2); if (strcmp(argv[1],"w")==0) eibdrv_comm_write(argv[2]); else if (strcmp(argv[1],"r")==0) eibdrv_comm_read(argv[2]); else { printf("usage: eibdrv_comm r|w device\n"); exit(1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -