|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
mtr -- a network diagnostic tool
|
|
Packit |
b802ec |
Copyright (C) 1997 Matt Kimball
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
split.c -- raw output (for inclusion in KDE Network Utilities or others
|
|
Packit |
b802ec |
GUI based tools)
|
|
Packit |
b802ec |
Copyright (C) 1998 Bertrand Leconte <B.Leconte@mail.dotcom.fr>
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
b802ec |
it under the terms of the GNU General Public License version 2 as
|
|
Packit |
b802ec |
published by the Free Software Foundation.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
This program is distributed in the hope that it will be useful,
|
|
Packit |
b802ec |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b802ec |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
b802ec |
GNU General Public License for more details.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
You should have received a copy of the GNU General Public License
|
|
Packit |
b802ec |
along with this program; if not, write to the Free Software
|
|
Packit |
b802ec |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include "config.h"
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include <ctype.h>
|
|
Packit |
b802ec |
#include <stdlib.h>
|
|
Packit |
b802ec |
#include <stdio.h>
|
|
Packit |
b802ec |
#include <string.h>
|
|
Packit |
b802ec |
#include <sys/types.h>
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include "mtr.h"
|
|
Packit |
b802ec |
#include "display.h"
|
|
Packit |
b802ec |
#include "dns.h"
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include "net.h"
|
|
Packit |
b802ec |
#include "split.h"
|
|
Packit |
b802ec |
#include "utils.h"
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#ifdef HAVE_CURSES
|
|
Packit |
b802ec |
#if defined(HAVE_NCURSES_H)
|
|
Packit |
b802ec |
#include <ncurses.h>
|
|
Packit |
b802ec |
#elif defined(HAVE_NCURSES_CURSES_H)
|
|
Packit |
b802ec |
#include <ncurses/curses.h>
|
|
Packit |
b802ec |
#elif defined(HAVE_CURSES_H)
|
|
Packit |
b802ec |
#include <curses.h>
|
|
Packit |
b802ec |
#else
|
|
Packit |
b802ec |
#error No curses header file available
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
#else
|
|
Packit |
b802ec |
#include <sys/time.h>
|
|
Packit |
b802ec |
#include <sys/types.h>
|
|
Packit |
b802ec |
#include <unistd.h>
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* There is 256 hops max in the IP header (coded with a byte) */
|
|
Packit |
b802ec |
#define MAX_LINE_COUNT 256
|
|
Packit |
b802ec |
#define MAX_LINE_SIZE 256
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
static char Lines[MAX_LINE_COUNT][MAX_LINE_SIZE];
|
|
Packit |
b802ec |
static int LineCount;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#define DEBUG 0
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void split_redraw(
|
|
Packit |
b802ec |
struct mtr_ctl *ctl)
|
|
Packit |
b802ec |
{
|
|
Packit |
b802ec |
int max;
|
|
Packit |
b802ec |
int at;
|
|
Packit |
b802ec |
ip_t *addr;
|
|
Packit |
b802ec |
char newLine[MAX_LINE_SIZE];
|
|
Packit |
b802ec |
int i;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#if DEBUG
|
|
Packit |
b802ec |
fprintf(stderr, "split_redraw()\n");
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
* If there is less lines than last time, we delete them
|
|
Packit |
b802ec |
* TEST THIS PLEASE
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
max = net_max(ctl);
|
|
Packit |
b802ec |
for (i = LineCount; i > max; i--) {
|
|
Packit |
b802ec |
printf("-%d\n", i);
|
|
Packit |
b802ec |
LineCount--;
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
* For each line, we compute the new one and we compare it to the old one
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
for (at = 0; at < max; at++) {
|
|
Packit |
b802ec |
addr = net_addr(at);
|
|
Packit |
b802ec |
if (addrcmp((void *) addr, (void *) &ctl->unspec_addr, ctl->af)) {
|
|
Packit |
b802ec |
char str[256], *name;
|
|
Packit |
b802ec |
if (!(name = dns_lookup(ctl, addr)))
|
|
Packit |
b802ec |
name = strlongip(ctl, addr);
|
|
Packit |
b802ec |
if (ctl->show_ips) {
|
|
Packit |
b802ec |
snprintf(str, sizeof(str), "%s %s", name,
|
|
Packit |
b802ec |
strlongip(ctl, addr));
|
|
Packit |
b802ec |
name = str;
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
/* May be we should test name's length */
|
|
Packit |
b802ec |
snprintf(newLine, sizeof(newLine), "%s %d %d %d %d %d %d",
|
|
Packit |
b802ec |
name, net_loss(at), net_returned(at), net_xmit(at),
|
|
Packit |
b802ec |
net_best(at) / 1000, net_avg(at) / 1000,
|
|
Packit |
b802ec |
net_worst(at) / 1000);
|
|
Packit |
b802ec |
} else {
|
|
Packit |
b802ec |
snprintf(newLine, sizeof(newLine), "???");
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
if (strcmp(newLine, Lines[at]) == 0) {
|
|
Packit |
b802ec |
/* The same, so do nothing */
|
|
Packit |
b802ec |
#if DEBUG
|
|
Packit |
b802ec |
printf("SAME LINE\n");
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
} else {
|
|
Packit |
b802ec |
printf("%d %s\n", at + 1, newLine);
|
|
Packit |
b802ec |
fflush(stdout);
|
|
Packit |
b802ec |
xstrncpy(Lines[at], newLine, MAX_LINE_SIZE);
|
|
Packit |
b802ec |
if (LineCount < (at + 1)) {
|
|
Packit |
b802ec |
LineCount = at + 1;
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void split_open(
|
|
Packit |
b802ec |
void)
|
|
Packit |
b802ec |
{
|
|
Packit |
b802ec |
int i;
|
|
Packit |
b802ec |
#if DEBUG
|
|
Packit |
b802ec |
printf("split_open()\n");
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
LineCount = -1;
|
|
Packit |
b802ec |
for (i = 0; i < MAX_LINE_COUNT; i++) {
|
|
Packit |
b802ec |
xstrncpy(Lines[i], "???", MAX_LINE_SIZE);
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void split_close(
|
|
Packit |
b802ec |
void)
|
|
Packit |
b802ec |
{
|
|
Packit |
b802ec |
#if DEBUG
|
|
Packit |
b802ec |
printf("split_close()\n");
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
}
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
int split_keyaction(
|
|
Packit |
b802ec |
void)
|
|
Packit |
b802ec |
{
|
|
Packit |
b802ec |
#ifdef HAVE_CURSES
|
|
Packit |
b802ec |
unsigned char c = getch();
|
|
Packit |
b802ec |
#else
|
|
Packit |
b802ec |
fd_set readfds;
|
|
Packit |
b802ec |
struct timeval tv;
|
|
Packit |
b802ec |
char c;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
FD_ZERO(&readfds);
|
|
Packit |
b802ec |
FD_SET(0, &readfds);
|
|
Packit |
b802ec |
tv.tv_sec = 0;
|
|
Packit |
b802ec |
tv.tv_usec = 0;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
if (select(1, &readfds, NULL, NULL, &tv) > 0) {
|
|
Packit |
b802ec |
read(0, &c, 1);
|
|
Packit |
b802ec |
} else
|
|
Packit |
b802ec |
return 0;
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#if DEBUG
|
|
Packit |
b802ec |
printf("split_keyaction()\n");
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
if (tolower(c) == 'q')
|
|
Packit |
b802ec |
return ActionQuit;
|
|
Packit |
b802ec |
if (c == 3)
|
|
Packit |
b802ec |
return ActionQuit;
|
|
Packit |
b802ec |
if (tolower(c) == 'r')
|
|
Packit |
b802ec |
return ActionReset;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
return 0;
|
|
Packit |
b802ec |
}
|