Blame ui/split.c

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
}