home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / telecomm / nhclb120 / trace.c < prev    next >
C/C++ Source or Header  |  1993-09-26  |  5KB  |  239 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "config.h"
  5. #include "mbuf.h"
  6. #include "iface.h"
  7. #include "trace.h"
  8. #include "session.h"
  9. #ifdef    UNIX
  10. #include <memory.h>
  11. #endif
  12.  
  13. static void ctohex();
  14.  
  15.  
  16. /* Redefined here so that programs calling dump in the library won't pull
  17.  * in the rest of the package
  18.  */
  19. static char nospace[] = "No space!!\n";
  20. static char nullpak[] = "empty packet!!\n";
  21. static char if_tr_i[] = "%s recv: [%s]\n";
  22. static char if_tr_o[] = "%s sent: [%s]\n";
  23.  
  24. FILE *trfp = stdout;            /* file pointer used for tracing */
  25. int trcount = 0;                /* used to close file for flushing */
  26. char trname[40];                /* name if not stdout */
  27. int notraceall;            /* 0 = trace all, 1 = only in cmd mode */
  28. extern int mode;        /* command mode or not */
  29.  
  30. dump(interface,direction,type,bp)
  31. register struct interface *interface;
  32. int direction;
  33. unsigned type;
  34. struct mbuf *bp;
  35. {
  36.     struct mbuf *tbp;
  37.     void ascii_dump(),hex_dump();
  38.     int ax25_dump(),ether_dump(),ip_dump(),at_dump(),slfp_dump();
  39.     int (*func)();
  40.     char *cp;
  41.     long t, time();
  42.     int16 size;
  43.  
  44.     if((interface->trace & direction) == 0)
  45.         return;    /* Nothing to trace */
  46.  
  47.     if (notraceall && mode != CMD_MODE)
  48.         return; /* No trace while in session, if mode */
  49.  
  50.     if(bp == NULLBUF || (size = len_mbuf(bp)) == 0)
  51.         return;
  52.  
  53. #ifdef SCREEN
  54.     (void)outscreen(1);        /* DG2KK: switch to trace screen */
  55. #endif
  56.     time(&t);            /* DG2KK: get time */
  57.     cp = ctime(&t);
  58.     rip(cp);
  59.  
  60.     switch(direction){
  61.     case IF_TRACE_IN:
  62.         fprintf(trfp,if_tr_i,interface->name,cp);
  63.         break;
  64.     case IF_TRACE_OUT:
  65.         fprintf(trfp,if_tr_o,interface->name,cp);
  66.         break;
  67.     }
  68.     if(bp == NULLBUF || (size = len_mbuf(bp)) == 0){
  69.         fprintf(trfp,nullpak);
  70.         goto trdone;
  71.     }
  72.     if(type < NTRACE)
  73.         func = tracef[type];
  74.     else
  75.         func = NULLFP;
  76.  
  77.     dup_p(&tbp,bp,0,size);
  78.     if(tbp == NULLBUF){
  79.         fprintf(trfp,nospace);
  80.         if (trfp != stdout)
  81.           printf(nospace);
  82.         goto trdone;
  83.     }
  84.     if(func != NULLFP)
  85.         (*func)(&tbp,1);
  86.     if(interface->trace & IF_TRACE_ASCII){
  87.         /* Dump only data portion of packet in ascii */
  88.         ascii_dump(&tbp);
  89.     } else if(interface->trace & IF_TRACE_HEX){
  90.         /* Dump entire packet in hex/ascii */
  91.         free_p(tbp);
  92.         dup_p(&tbp,bp,0,len_mbuf(bp));
  93.         if(tbp != NULLBUF)
  94.             hex_dump(&tbp);
  95.         else {
  96.             fprintf(trfp,nospace);
  97.             if (trfp != stdout)
  98.               printf(nospace);
  99.             }
  100.     }
  101.     free_p(tbp);
  102.  
  103. #ifdef SCREEN
  104.     (void)outscreen(0);        /* switch back to main screen */
  105. #endif
  106.  
  107.       trdone:
  108.     if(trfp != stdout) {
  109. #ifndef ATARI_ST
  110.       fflush(trfp);
  111. #endif
  112. #if (defined(MSDOS) || defined(ATARI_ST))
  113.       if (++trcount > 25) {
  114.         fclose(trfp);
  115.         trfp = fopen(trname,"a");
  116.         trcount = 0;
  117.       }
  118. #endif
  119.       if (trfp == NULLFILE || ferror(trfp)) {
  120.         printf("Error on %s - trace to console\n",trname);
  121.         if (trfp != NULLFILE && trfp != stdout)
  122.           fclose(trfp);
  123.         trfp = stdout;
  124.       }
  125.     }
  126.     fflush(stdout);
  127. }
  128.  
  129. /* Dump an mbuf in hex */
  130. void
  131. hex_dump(bpp)
  132. register struct mbuf **bpp;
  133. {
  134.     int16 n;
  135.     int16 address;
  136.     void fmtline();
  137.     char buf[16];
  138.  
  139.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  140.         return;
  141.  
  142.     address = 0;
  143.     while((n = pullup(bpp,buf,sizeof(buf))) != 0){
  144.         fmtline(address,buf,n);
  145.         address += n;
  146.     }
  147. }
  148. /* Dump an mbuf in ascii */
  149. void
  150. ascii_dump(bpp)
  151. register struct mbuf **bpp;
  152. {
  153.     char c;
  154.     register int16 tot;
  155.  
  156.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  157.         return;
  158.  
  159.     tot = 0;
  160.     while(pullup(bpp,&c,1) == 1){
  161.         if((tot % 64) == 0) {
  162.             fprintf(trfp,"%04x  ",tot);
  163.         }
  164. #ifdef PC9801
  165.         if ((c >= 0x20) || (c < 0)) {
  166. #else
  167.         if(isprint(c)) {
  168. #endif
  169.             putchar(c);
  170.         } else {
  171.             putchar('.');
  172.         }
  173.         tot++;
  174.         if((tot % 64) == 0) {
  175. #ifdef PC9801
  176.             fprintf(trfp," \n");
  177. #else
  178.             fprintf(trfp,"\n");
  179. #endif
  180.         }
  181.     }
  182.     if((tot % 64) != 0) {
  183. #ifdef PC9801
  184.         fprintf(trfp," \n");
  185. #else
  186.         fprintf(trfp,"\n");
  187. #endif
  188.     }
  189. }
  190.  
  191. /* Print a buffer up to 16 bytes long in formatted hex with ascii
  192.  * translation, e.g.,
  193.  * 0000: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f  0123456789:;<=>?
  194.  */
  195. void
  196. fmtline(addr,buf,len)
  197. int16 addr;
  198. char *buf;
  199. int16 len;
  200. {
  201.     char line[80];
  202.     register char *aptr,*cptr;
  203.     register int16 c;
  204.     void ctohex();
  205.  
  206.     memset(line,' ',sizeof(line));
  207.     ctohex(line,(int16)hibyte(addr));
  208.     ctohex(line+2,(int16)lobyte(addr));
  209.     aptr = &line[6];
  210.     cptr = &line[55];
  211.     while(len-- != 0){
  212.         c = *buf++ & 0xff;
  213.         ctohex(aptr,c);
  214.         aptr += 3;
  215.         c &= 0x7f;
  216.         *cptr++ = isprint(c) ? c : '.';
  217.     }
  218. #ifdef PC9801
  219.     *cptr++ = ' ';
  220. #endif
  221.     *cptr++ = '\r';
  222.     *cptr++ = '\n';
  223.     fwrite(line,1,(unsigned)(cptr-line),stdout);
  224.     /* added */
  225. }
  226. /* Convert byte to two ascii-hex characters */
  227. static
  228. void
  229. ctohex(buf,c)
  230. register char *buf;
  231. register int16 c;
  232. {
  233.     static char hex[] = "0123456789abcdef";
  234.  
  235.     buf[0] = hex[hinibble(c)];
  236.     buf[1] = hex[lonibble(c)];
  237. }
  238.  
  239.