荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: bstone (Live my life!), 信区: Linux
标  题: Faint 0.1 文件 loadbbs.c
发信站: BBS 荔园晨风站 (Wed Feb 23 14:04:59 2000), 站内信件

发信人: 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)
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(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, "
               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);
               }
            }
         }
      }
   }
}

--
要是不能说糊话, 还不如死了算了
               fflush(stdout);

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.21.92]

--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: bbs@192.168.28.23]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店