home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit 2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / atap.c / tapmon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-04  |  2.6 KB  |  168 lines

  1. /*
  2.  * read/write /dev/tapc* utility
  3.  */
  4. #include <stdio.h>
  5. /* #include <ctype.h> */
  6. #include <sys/types.h>
  7. /* #include <sys/time.h> */
  8. #include <fcntl.h>
  9. #include <sys/filio.h>
  10. #include <sys/termios.h>
  11.  
  12. #define STDIN    0
  13. #define STDOUT    1
  14.  
  15. #define NAME    "/dev/tapc%d"
  16. #define CLONENAME "/dev/tapcx"
  17.  
  18. #define ESCAPE    31    /* CTRL-_ */
  19.  
  20. #ifndef lint
  21. static    char sccsid[] = "@(#)tapmon.c    1.25 5/8/93";
  22. #endif
  23.  
  24. char *myname;
  25.  
  26. int viatty;
  27. struct termios old,new;
  28.  
  29. usage()
  30. {
  31.     (void)fprintf(stderr,"Usage: %s [-r] <tap-id>\n",myname);
  32.     (void)fprintf(stderr,"       tap-id: 0-255|x\n");
  33.     exit(1);
  34. }
  35.  
  36. main(argc,argv)
  37. int argc;
  38. char *argv[];
  39. {
  40.     unsigned long id;
  41.     int f,r;
  42.     char name[sizeof(NAME)+3];
  43.     char *ptr;
  44.     int c,errflg=0,reverse=0;
  45.     extern char *optarg;
  46.     extern int optind;
  47.  
  48.     myname=argv[0];
  49.  
  50.  
  51.     while ((c = getopt(argc, argv, "r")) != -1){
  52.         switch (c) {
  53.         case 'r':
  54.             reverse++;
  55.             break;
  56.         case '?':
  57.         default:
  58.             errflg++;
  59.         }
  60.     }
  61.     if (errflg||(optind+1)!=argc) {
  62.         usage();
  63.     }
  64.  
  65.     if(!strcmp(argv[optind],"x"))
  66.         sprintf(name,CLONENAME);
  67.     else {
  68.         id=strtol(argv[optind],&ptr,0);
  69.         if(id>255||*ptr!='\0')
  70.             usage();
  71.         sprintf(name,NAME,id);
  72.     }
  73.  
  74.     if((f=open(name,O_RDWR|(reverse?O_NDELAY:0)))<0){
  75.         perror(name);
  76.         exit(1);
  77.     }
  78.  
  79.     ttyset(name);
  80.     r=connect(f);
  81.     close(f);
  82.     ttyreset();
  83.     return(r);
  84. }
  85.  
  86. ttyset(name)
  87. char *name;
  88. {
  89.     if(isatty(STDIN)){
  90.         viatty=1;
  91.         fprintf(stderr,"CONNECTED TO %s\n",name);
  92.         fprintf(stderr,"ESCAPE CHARACTER IS CTRL-%c\n",ESCAPE+'@');
  93.         if(ioctl(STDIN,TCGETS,&old)==(-1)){
  94.             perror("TCGETS");
  95.             exit(1);
  96.         }
  97.         new=old;
  98.         new.c_iflag = 0;
  99.         /* new.c_oflag = 0;*/
  100.         new.c_lflag = 0;
  101.         if(ioctl(STDIN,TCSETS,&new)==(-1)){
  102.             perror("TCSETS");
  103.             exit(1);
  104.         }
  105.     }
  106. }
  107.  
  108. ttyreset()
  109. {
  110.     if(viatty){
  111.         if(ioctl(STDIN,TCSETS,&old)==(-1)){
  112.             perror("TCSETS");
  113.             exit(1);
  114.         }
  115.         fprintf(stderr,"\nCONNECTION CLOSED\n");
  116.     }
  117. }
  118.  
  119. connect(f)
  120. {
  121.     register int n,s;
  122.     int x,w;
  123.     fd_set fdset;
  124.     char buf[512];
  125.  
  126.     s=sizeof(buf);
  127.     w=f+1;
  128.     FD_ZERO(&fdset);
  129.     FD_SET(STDIN,&fdset);
  130.     FD_SET(f,&fdset);
  131.  
  132.     while((x=select(w,&fdset,NULL,NULL,NULL))){
  133.         if( FD_ISSET (f, &fdset)){
  134.             if(ioctl(f,FIONREAD,&n)==(-1)){
  135.                 perror(myname);
  136.                 return(10);
  137.             }
  138.             if(!n)
  139.                 break;
  140.             n = (n<s)?n:s;
  141.             if(read(f,buf,n)!=n){
  142.                 perror(myname);
  143.                 return(11);
  144.             }
  145.             (void)write(STDOUT,buf,n);
  146.         }
  147.         if( FD_ISSET (STDIN, &fdset)){
  148.             if(ioctl(STDIN,FIONREAD,&n)==(-1)){
  149.                 perror(myname);
  150.                 return(12);
  151.             }
  152.             if(!n)
  153.                 break;
  154.             n = (n<s)?n:s;
  155.             if(read(STDIN,buf,n)!=n){
  156.                 perror(myname);
  157.                 return(13);
  158.             }
  159.             if(viatty&&buf[0]==ESCAPE)
  160.                 break;    
  161.             (void)write(f,buf,n);
  162.         }
  163.         FD_SET(STDIN,&fdset); /* again and again */
  164.         FD_SET(f,&fdset);
  165.     }
  166.     return(0);
  167. }
  168.