Annotation of embedaddon/mtr/split.c, revision 1.1.1.1

1.1       misho       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: #include <ctype.h>
                     25: #include <stdlib.h>
                     26: #include <stdio.h>
                     27: #include <string.h>
                     28: #include <sys/types.h>
                     29: 
                     30: #include "mtr.h"
                     31: #include "display.h"
                     32: #include "dns.h"
                     33: 
                     34: #include "net.h"
                     35: #include "split.h"
                     36: 
                     37: #ifdef NO_CURSES
                     38: #include <sys/time.h>
                     39: #include <sys/types.h>
                     40: #include <unistd.h>
                     41: #else
                     42: /* Use the curses variant */
                     43: 
                     44: #if defined(HAVE_NCURSES_H)
                     45: #  include <ncurses.h>
                     46: #elif defined(HAVE_NCURSES_CURSES_H)
                     47: #  include <ncurses/curses.h>
                     48: #elif defined(HAVE_CURSES_H)
                     49: #  include <curses.h>
                     50: #else
                     51: #  error No curses header file available
                     52: #endif
                     53: 
                     54: #endif
                     55: 
                     56: 
                     57: extern char *Hostname;
                     58: extern int WaitTime;
                     59: extern int af;
                     60: 
                     61: /* There is 256 hops max in the IP header (coded with a byte) */
                     62: #define MAX_LINE_COUNT 256
                     63: #define MAX_LINE_SIZE  256
                     64: 
                     65: char Lines[MAX_LINE_COUNT][MAX_LINE_SIZE];
                     66: int  LineCount;
                     67: 
                     68: 
                     69: #define DEBUG 0
                     70: 
                     71: 
                     72: void split_redraw(void) 
                     73: {
                     74:   int   max;
                     75:   int   at;
                     76:   ip_t *addr;
                     77:   char  newLine[MAX_LINE_SIZE];
                     78:   int   i;
                     79: 
                     80: #if DEBUG
                     81:   fprintf(stderr, "split_redraw()\n"); 
                     82: #endif
                     83: 
                     84:   /* 
                     85:    * If there is less lines than last time, we delete them
                     86:    * TEST THIS PLEASE
                     87:    */
                     88:   max = net_max();
                     89:   for (i=LineCount; i>max; i--) {
                     90:     printf("-%d\n", i);
                     91:     LineCount--;
                     92:   }
                     93: 
                     94:   /*
                     95:    * For each line, we compute the new one and we compare it to the old one
                     96:    */
                     97:   for(at = 0; at < max; at++) {
                     98:     addr = net_addr(at);
                     99:     if(addrcmp((void*)addr, (void*)&unspec_addr, af)) {
                    100:       char str[256], *name;
                    101:       if (!(name = dns_lookup(addr)))
                    102:         name = strlongip(addr);
                    103:       if (show_ips) {
                    104:         snprintf(str, sizeof(str), "%s %s", name, strlongip(addr));
                    105:         name = str;
                    106:       }
                    107:       /* May be we should test name's length */
                    108:       snprintf(newLine, sizeof(newLine), "%s %d %d %d %d %d %d", name,
                    109:                net_loss(at),
                    110:                net_returned(at), net_xmit(at),
                    111:                net_best(at) /1000, net_avg(at)/1000,
                    112:                net_worst(at)/1000);
                    113:     } else {
                    114:       sprintf(newLine, "???");
                    115:     }
                    116: 
                    117:     if (strcmp(newLine, Lines[at]) == 0) {
                    118:       /* The same, so do nothing */
                    119: #if DEBUG
                    120:       printf("SAME LINE\n");
                    121: #endif
                    122:     } else {
                    123:       printf("%d %s\n", at+1, newLine);
                    124:       fflush(stdout);
                    125:       strcpy(Lines[at], newLine);
                    126:       if (LineCount < (at+1)) {
                    127:        LineCount = at+1;
                    128:       }
                    129:     }
                    130:   }
                    131: }
                    132: 
                    133: 
                    134: void split_open(void)
                    135: {
                    136:   int i;
                    137: #if DEBUG
                    138:   printf("split_open()\n");
                    139: #endif
                    140:   LineCount = -1;
                    141:   for (i=0; i<MAX_LINE_COUNT; i++) {
                    142:     strcpy(Lines[i], "???");
                    143:   }
                    144: }
                    145: 
                    146: 
                    147: void split_close(void)
                    148: {
                    149: #if DEBUG
                    150:   printf("split_close()\n");
                    151: #endif
                    152: }
                    153: 
                    154: 
                    155: int split_keyaction(void) 
                    156: {
                    157: #ifdef NO_CURSES
                    158:   fd_set readfds;
                    159:   struct timeval tv;
                    160:   char c;
                    161: 
                    162:   FD_ZERO (&readfds);
                    163:   FD_SET (0, &readfds);
                    164:   tv.tv_sec = 0;
                    165:   tv.tv_usec = 0;
                    166: 
                    167:   if (select (1, &readfds, NULL, NULL, &tv) > 0) {
                    168:     read (0, &c, 1);
                    169:   } else 
                    170:     return 0;
                    171: #else
                    172:   char c = getch();
                    173: #endif
                    174: 
                    175: #if DEBUG
                    176:   printf("split_keyaction()\n");
                    177: #endif
                    178:   if(tolower(c) == 'q')
                    179:     return ActionQuit;
                    180:   if(c==3)
                    181:     return ActionQuit;
                    182:   if(tolower(c) == 'r')
                    183:     return ActionReset;
                    184:   
                    185:   return 0;
                    186: }

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