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

📄 termtool.c

📁 linux unix 终端编程的实际例子
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <curses.h>#include <panel.h>#include <termio.h>#include <fcntl.h>#include <sys/file.h>#include <sys/ipc.h>#include <sys/shm.h>#include <signal.h>#include "srcc.h"WINDOW *nowwin,*filewin;char tmpname[20];struct termio newdes,olddes;int my_debug;FILE *fp;TermEnable(){ char ttyname[15]; char tmpname[15]; int i,j;  DrawInput("input tty",ttyname,7); memset(tmpname,0,sizeof(tmpname)); sprintf(tmpname,"/dev/%s\0",ttyname); strcpy(ttyname,tmpname); AddTerm(ttyname,'X',' ');  }TermDisable(){ char ttyname[15]; char tmpname[15]; int i,j;  DrawInput("input tty",ttyname,7); memset(tmpname,0,sizeof(tmpname)); sprintf(tmpname,"/dev/%s\0",ttyname); strcpy(ttyname,tmpname); sprintf(shm,"%s\0",ttyname); sleep(1); sprintf(shm,"/dev/ttyxxx\0"); return; } DrawInput(Help,Input,length) char *Help,*Input; int length; {    WINDOW *termw,*inputw;	PANEL *pPanel1,*pPanel2;    char chartmp;    char tmpname[255];	int wsize;	int keyid;	wsize=strlen(Help);	if ( wsize < length )		wsize=length;    termw=newwin(5,wsize+6,8,(85-wsize-8)/2);	pPanel1=new_panel(termw);	if ( pPanel1 == NULL ) {    	delwin(termw);		doupdate();		return ERROR;		}    nowwin=termw;    boo(termw);    mvwaddstr(termw,0,((*termw)._maxx-strlen(Help))/2,Help);    wrefresh(termw);    inputw=newwin(2,length+1,9,(80-length)/2);	pPanel2=new_panel(inputw);	if ( pPanel2 == NULL ) {		del_panel(pPanel1);    	delwin(termw);		update_panels();    	delwin(inputw);		doupdate();		return ERROR;		}    wmove(inputw,1,1);    wattron(inputw,A_REVERSE);    PutSpace(inputw,length);    wmove(inputw,1,1);    wrefresh(inputw);    memset(tmpname,0x0,sizeof(tmpname));    while ((chartmp=mgetch(&keyid))!=13 ) {	   if (chartmp==BACKSPACE) {		    tmpname[strlen(tmpname)-1]='\0';            PutSpace(inputw,sizeof(tmpname));		    }	   else            sprintf(tmpname,"%s%c\0",tmpname,chartmp);       if (strlen(tmpname) == length) break;       mvwaddstr(inputw,1,1,tmpname);	   wrefresh(inputw);    }    wrefresh(inputw);    sprintf(Input,"%s\0",tmpname);    delwin(inputw);	del_panel(pPanel1);	update_panels();	doupdate();    wrefresh(inputw);    delwin(termw);	del_panel(pPanel2);    wrefresh(termw);	update_panels();	doupdate();} PutSpace(win,number)WINDOW *win;int number;{ int i;	for (i=0;i<=number;i++)      waddch(win,' ');}AddTerm(ttyname,speed,prgcode)char *ttyname;char speed;char prgcode;{ int termid;  int pid1,pid2;  long pgrp;  int tin,tout,terr;  speed=toupper(speed);  sprintf(shm,"/dev/ttyxxx\0");  memset(tmpname,0,sizeof(tmpname));  strcpy(tmpname,ttyname,strlen(ttyname));    if ((pid1=fork(1))<0) {			printf("ERROR to start a child process\n");			return(0);			}  if (pid1==0) {			int ppid;			int stat;			int ret;			pgrp=getpid();			setpgrp(pgrp);				alarm(SLEEP);			signal(SIGALRM,KillTty);	        termid=open(ttyname,O_RDWR);	        if (termid<0) {				struct msg_stru msg;				memset(msg,0,sizeof(msg));				basename(ttyname,msg.msg);					msg.fun=0;				msgsnd(msgid,&msg,sizeof(msg),0);				exit(127);				}	        dup2(termid,0);	        dup2(termid,1);	        dup2(termid,2);	        ioctl(termid,TCGETA,&olddes);	        ioctl(termid,TCGETA,&newdes);	        newdes.c_cflag|=(CS8|CREAD|HUPCL|IXON|IXOFF);			switch (speed) {				case 'O' :	newdes.c_cflag|=B38400;							break;				case 'M' :	newdes.c_cflag|=B9600;							break;				default  :	newdes.c_cflag|=B9600;							break;				}            newdes.c_lflag=XCLUDE;	        ioctl(termid,TCSETA,&newdes);		    if ((ppid=fork()) < 0 ) {			     perror("error for child process\n");			     exit(0);			     }			if ( my_debug ) {				fprintf(fp,"begin Main\n");				fflush(fp);				}		    if (ppid==0) {				int pid3;				int stat;				while ( 1 ) {					if ( (pid3=fork()) == 0 ) {			   			signal(SIGINT,SIG_IGN);			   			signal(SIGQUIT,SIG_IGN);				switch(prgcode) {					case 'o':					     			execlp("/bin/su","su","-","las","-c","lxbs osys1",NULL);						break;					default :			     			execlp("/bin/su","su","-","las","-c","lxbs cccbmain",NULL);						break;					}						}					while( wait(&stat) != pid3 ) ;				 }			     exit(0);			     }					while( wait(&stat) != ppid ) ;             }		    return(1);              }CancelTerm(ttyname)char *ttyname;{int termid; int pgrp; int chpid; if ((termid=open(ttyname,O_RDWR)) < 0) {	return(-1);	}	pgrp=0;	pgrp=getpgrp();    close(termid);    return(0);}CheckTty(){  return(0);} KillTty(){		FILE *zy;  alarm(SLEEP);  signal(SIGALRM,KillTty);  if ( !strcmp(shm,tmpname) )  {		sprintf(shm,"/dev/ttyxxx\0");		kill(0,9);		exit(0); 		}		  return 0;}

⌨️ 快捷键说明

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