File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mtr / split.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Nov 1 09:33:48 2016 UTC (7 years, 7 months ago) by misho
Branches: mtr, elwix, MAIN
CVS tags: v0_86, HEAD
mtr 0.86

    1: /*
    2:     mtr  --  a network diagnostic tool
    3:     Copyright (C) 1997  Matt Kimball
    4: 
    5:     split.c -- raw output (for inclusion in KDE Network Utilities or others
    6:                          GUI based tools)
    7:     Copyright (C) 1998  Bertrand Leconte <B.Leconte@mail.dotcom.fr>
    8: 
    9:     This program is free software; you can redistribute it and/or modify
   10:     it under the terms of the GNU General Public License version 2 as 
   11:     published by the Free Software Foundation.
   12: 
   13:     This program is distributed in the hope that it will be useful,
   14:     but WITHOUT ANY WARRANTY; without even the implied warranty of
   15:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16:     GNU General Public License for more details.
   17: 
   18:     You should have received a copy of the GNU General Public License
   19:     along with this program; if not, write to the Free Software
   20:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   21: */
   22: 
   23: #include "config.h"
   24: 
   25: #include <ctype.h>
   26: #include <stdlib.h>
   27: #include <stdio.h>
   28: #include <string.h>
   29: #include <sys/types.h>
   30: 
   31: #include "mtr.h"
   32: #include "display.h"
   33: #include "dns.h"
   34: 
   35: #include "net.h"
   36: #include "split.h"
   37: 
   38: #ifdef NO_CURSES
   39: #include <sys/time.h>
   40: #include <sys/types.h>
   41: #include <unistd.h>
   42: #else
   43: /* Use the curses variant */
   44: 
   45: #if defined(HAVE_NCURSES_H)
   46: #  include <ncurses.h>
   47: #elif defined(HAVE_NCURSES_CURSES_H)
   48: #  include <ncurses/curses.h>
   49: #elif defined(HAVE_CURSES_H)
   50: #  include <curses.h>
   51: #else
   52: #  error No curses header file available
   53: #endif
   54: 
   55: #endif
   56: 
   57: 
   58: extern char *Hostname;
   59: extern int WaitTime;
   60: extern int af;
   61: 
   62: /* There is 256 hops max in the IP header (coded with a byte) */
   63: #define MAX_LINE_COUNT 256
   64: #define MAX_LINE_SIZE  256
   65: 
   66: char Lines[MAX_LINE_COUNT][MAX_LINE_SIZE];
   67: int  LineCount;
   68: 
   69: 
   70: #define DEBUG 0
   71: 
   72: 
   73: void split_redraw(void) 
   74: {
   75:   int   max;
   76:   int   at;
   77:   ip_t *addr;
   78:   char  newLine[MAX_LINE_SIZE];
   79:   int   i;
   80: 
   81: #if DEBUG
   82:   fprintf(stderr, "split_redraw()\n"); 
   83: #endif
   84: 
   85:   /* 
   86:    * If there is less lines than last time, we delete them
   87:    * TEST THIS PLEASE
   88:    */
   89:   max = net_max();
   90:   for (i=LineCount; i>max; i--) {
   91:     printf("-%d\n", i);
   92:     LineCount--;
   93:   }
   94: 
   95:   /*
   96:    * For each line, we compute the new one and we compare it to the old one
   97:    */
   98:   for(at = 0; at < max; at++) {
   99:     addr = net_addr(at);
  100:     if(addrcmp((void*)addr, (void*)&unspec_addr, af)) {
  101:       char str[256], *name;
  102:       if (!(name = dns_lookup(addr)))
  103:         name = strlongip(addr);
  104:       if (show_ips) {
  105:         snprintf(str, sizeof(str), "%s %s", name, strlongip(addr));
  106:         name = str;
  107:       }
  108:       /* May be we should test name's length */
  109:       snprintf(newLine, sizeof(newLine), "%s %d %d %d %d %d %d", name,
  110:                net_loss(at),
  111:                net_returned(at), net_xmit(at),
  112:                net_best(at) /1000, net_avg(at)/1000,
  113:                net_worst(at)/1000);
  114:     } else {
  115:       sprintf(newLine, "???");
  116:     }
  117: 
  118:     if (strcmp(newLine, Lines[at]) == 0) {
  119:       /* The same, so do nothing */
  120: #if DEBUG
  121:       printf("SAME LINE\n");
  122: #endif
  123:     } else {
  124:       printf("%d %s\n", at+1, newLine);
  125:       fflush(stdout);
  126:       strcpy(Lines[at], newLine);
  127:       if (LineCount < (at+1)) {
  128: 	LineCount = at+1;
  129:       }
  130:     }
  131:   }
  132: }
  133: 
  134: 
  135: void split_open(void)
  136: {
  137:   int i;
  138: #if DEBUG
  139:   printf("split_open()\n");
  140: #endif
  141:   LineCount = -1;
  142:   for (i=0; i<MAX_LINE_COUNT; i++) {
  143:     strcpy(Lines[i], "???");
  144:   }
  145: }
  146: 
  147: 
  148: void split_close(void)
  149: {
  150: #if DEBUG
  151:   printf("split_close()\n");
  152: #endif
  153: }
  154: 
  155: 
  156: int split_keyaction(void) 
  157: {
  158: #ifdef NO_CURSES
  159:   fd_set readfds;
  160:   struct timeval tv;
  161:   char c;
  162: 
  163:   FD_ZERO (&readfds);
  164:   FD_SET (0, &readfds);
  165:   tv.tv_sec = 0;
  166:   tv.tv_usec = 0;
  167: 
  168:   if (select (1, &readfds, NULL, NULL, &tv) > 0) {
  169:     read (0, &c, 1);
  170:   } else 
  171:     return 0;
  172: #else
  173:   char c = getch();
  174: #endif
  175: 
  176: #if DEBUG
  177:   printf("split_keyaction()\n");
  178: #endif
  179:   if(tolower(c) == 'q')
  180:     return ActionQuit;
  181:   if(c==3)
  182:     return ActionQuit;
  183:   if(tolower(c) == 'r')
  184:     return ActionReset;
  185:   
  186:   return 0;
  187: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>