BBS水木清华站∶精华区

发信人: ylsdd (1245), 信区: Linux        
标  题: Faint 0.1 文件 loadbbs.c 
发信站: BBS 水木清华站 (Wed Feb 23 07:10:30 2000) 
 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 
#include <fcntl.h> 
#include <termios.h> 
#include <sys/types.h> 
#define CTRL_l 12 
struct termios tsave; 
void scan_mode() 
{  struct termios tbuf; 
   if(!isatty(0)) exit(1); 
   if(tcgetattr(0,&tbuf)==-1) exit(1); 
   tsave=tbuf; 
   tbuf.c_lflag&=~(ECHO|ICANON|ISIG); 
   tbuf.c_cc[VMIN]=tbuf.c_cc[VTIME] =0; 
   if(tcsetattr(0,TCSANOW,&tbuf)==-1) exit(1); 

void restore_mode(int i) 
{  tcsetattr(0,TCSANOW,&tsave); 
   if(i>=0) exit(1); 

main(int argn, char **argv) 
{  int i, mode=0; 
   char buf[1024], inputch; 
   char fnw[40], fnr[40], fnlock[40]; 
   int fdw, fdr, fdlock; 
   fd_set rdfds; 
    
   if(argn<2) return -1; 
   if(sscanf(argv[1],"%d",&i)!=1) return -1; 
   sprintf(fnlock, "ctrl/%02dloadbbs.lock",i); 
   sprintf(fnw, "ctrl/%02din.fifo",i); 
   sprintf(fnr, "ctrl/%02dout.fifo",i); 
   if(argn>2) switch(fork()) 
   {  case -1: return -1; 
      case 0: execvp("./cover", &argv[0]); printf("error"); return -1; 
      default: break; 
   } 
   fdlock=open(fnlock,O_CREAT|O_RDONLY,S_IRUSR|S_IWUSR); 
   if(fdlock<0) exit(1); 
   if(flock(fdlock,LOCK_EX|LOCK_NB)<0) exit(1); 
   fdr=open(fnr,O_RDONLY|O_NDELAY); 
   fdw=open(fnw,O_WRONLY); 
   scan_mode(); 
   signal(SIGPIPE, restore_mode); 
   inputch=CTRL_l; 
   write(fdw,&inputch,1); 
   while(1) 
   {  FD_ZERO(&rdfds); 
      FD_SET(0,&rdfds); 
      FD_SET(fdr,&rdfds); 
      if(select(fdr+1,&rdfds,NULL,NULL,NULL)) 
      {   
         if(FD_ISSET(fdr,&rdfds)) 
         {  i=read(fdr,buf,1024); 
            if(i>0) write(1,buf,i); 
         } 
         if(FD_ISSET(0,&rdfds)) 
         {  i=read(0,&inputch,1); 
            if(i==1&&mode==0&&inputch==29) 
            {  
               printf("\n\033[1;4m<loadbbs: press 'c' to abort, " 
                      "press any key else to continue>:\033[0m"); 
               fflush(stdout); 
               mode=1; 
            } 
            else if(i==1&&mode==0) write(fdw,&inputch,1); 
            else if(i==1&&mode==1) 
            {  switch(inputch) 
               {  case 'c': printf("\033[2J\033[1;1H"); 
                            restore_mode(0); 
                  default:  
                           mode=0; 
                           inputch=CTRL_l; 
                           write(fdw,&inputch,1);  
               } 
            } 
         } 
      } 
   } 

 
-- 
要是不能说糊话, 还不如死了算了 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.21.92] 

BBS水木清华站∶精华区