Index: Makefile
===================================================================
--- Makefile (nonexistent)
+++ Makefile (revision 5)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../build-system/constants.mk
+
+
+url = $(DOWNLOAD_SERVER)/sources/packages/n/iftop
+
+versions = 1.0pre4
+pkgname = iftop
+suffix = tar.gz
+
+tarballs = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s = $(addsuffix .sha1sum, $(tarballs))
+
+patches = $(CURDIR)/patches/iftop-1.0pre4-extern.patch
+
+.NOTPARALLEL: $(patches)
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s) $(patches)
+
+
+include ../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+ @echo -e "\n======= Downloading source tarballs =======" ; \
+ for tarball in $(tarballs) ; do \
+ echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+ done ; wait
+
+$(sha1s): $(tarballs)
+ @for sha in $@ ; do \
+ echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+ echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+ touch $$sha ; \
+ echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+ sha1sum --check $$sha ; ret="$$?" ; \
+ if [ "$$ret" == "1" ]; then \
+ echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+ exit 1 ; \
+ fi ; \
+ done
+
+$(patches): $(sha1s)
+ @echo -e "\n======= Create Patches =======\n" ; \
+ ( cd create-1.0pre4-extern-patch ; ./create.patch.sh ) ; \
+ echo -e "\n"
+
+download_clean:
+ @rm -f $(tarballs) $(sha1s) $(patches)
Index: create-1.0pre4-extern-patch/create.patch.sh
===================================================================
--- create-1.0pre4-extern-patch/create.patch.sh (nonexistent)
+++ create-1.0pre4-extern-patch/create.patch.sh (revision 5)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+VERSION=1.0pre4
+
+tar --files-from=file.list -xzvf ../iftop-$VERSION.tar.gz
+mv iftop-$VERSION iftop-$VERSION-orig
+
+cp -rf ./iftop-$VERSION-new ./iftop-$VERSION
+
+diff --unified -Nr iftop-$VERSION-orig iftop-$VERSION > iftop-$VERSION-extern.patch
+
+mv iftop-$VERSION-extern.patch ../patches
+
+rm -rf ./iftop-$VERSION
+rm -rf ./iftop-$VERSION-orig
Property changes on: create-1.0pre4-extern-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: create-1.0pre4-extern-patch/file.list
===================================================================
--- create-1.0pre4-extern-patch/file.list (nonexistent)
+++ create-1.0pre4-extern-patch/file.list (revision 5)
@@ -0,0 +1,2 @@
+iftop-1.0pre4/ui_common.c
+iftop-1.0pre4/ui_common.h
Index: create-1.0pre4-extern-patch/iftop-1.0pre4-new/ui_common.c
===================================================================
--- create-1.0pre4-extern-patch/iftop-1.0pre4-new/ui_common.c (nonexistent)
+++ create-1.0pre4-extern-patch/iftop-1.0pre4-new/ui_common.c (revision 5)
@@ -0,0 +1,382 @@
+/*
+ * ui_common.c
+ *
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "addr_hash.h"
+#include "serv_hash.h"
+#include "iftop.h"
+#include "resolver.h"
+#include "sorted_list.h"
+#include "options.h"
+
+#include "ui_common.h"
+
+/* 2, 10 and 40 seconds */
+int history_divs[HISTORY_DIVISIONS] = {1, 5, 20};
+
+#define UNIT_DIVISIONS 4
+char* unit_bits[UNIT_DIVISIONS] = { "b", "Kb", "Mb", "Gb"};
+char* unit_bytes[UNIT_DIVISIONS] = { "B", "KB", "MB", "GB"};
+
+extern hash_type* history;
+extern int history_pos;
+extern int history_len;
+
+sorted_list_type screen_list;
+host_pair_line totals;
+int peaksent, peakrecv, peaktotal;
+hash_type* screen_hash;
+hash_type* service_hash;
+
+/*
+ * Compare two screen lines based on bandwidth. Start comparing from the
+ * specified column
+ */
+int screen_line_bandwidth_compare(host_pair_line* aa, host_pair_line* bb, int start_div) {
+ int i;
+ switch(options.linedisplay) {
+ case OPTION_LINEDISPLAY_ONE_LINE_SENT:
+ for(i = start_div; i < HISTORY_DIVISIONS; i++) {
+ if(aa->sent[i] != bb->sent[i]) {
+ return(aa->sent[i] < bb->sent[i]);
+ }
+ }
+ break;
+ case OPTION_LINEDISPLAY_ONE_LINE_RECV:
+ for(i = start_div; i < HISTORY_DIVISIONS; i++) {
+ if(aa->recv[i] != bb->recv[i]) {
+ return(aa->recv[i] < bb->recv[i]);
+ }
+ }
+ break;
+ case OPTION_LINEDISPLAY_TWO_LINE:
+ case OPTION_LINEDISPLAY_ONE_LINE_BOTH:
+ /* fallback to the combined sent+recv that also act as fallback for sent/recv */
+ break;
+ }
+ for(i = start_div; i < HISTORY_DIVISIONS; i++) {
+ if(aa->recv[i] + aa->sent[i] != bb->recv[i] + bb->sent[i]) {
+ return(aa->recv[i] + aa->sent[i] < bb->recv[i] + bb->sent[i]);
+ }
+ }
+ return 1;
+}
+
+/*
+ * Compare two screen lines based on hostname / IP. Fall over to compare by
+ * bandwidth.
+ */
+int screen_line_host_compare(void* a, void* b, host_pair_line* aa, host_pair_line* bb) {
+ char hosta[HOSTNAME_LENGTH], hostb[HOSTNAME_LENGTH];
+ int r;
+
+ /* This isn't overly efficient because we resolve again before
+ display. */
+ if (options.dnsresolution) {
+ resolve(aa->ap.af, a, hosta, HOSTNAME_LENGTH);
+ resolve(bb->ap.af, b, hostb, HOSTNAME_LENGTH);
+ }
+ else {
+ inet_ntop(aa->ap.af, a, hosta, sizeof(hosta));
+ inet_ntop(bb->ap.af, b, hostb, sizeof(hostb));
+ }
+
+ r = strcmp(hosta, hostb);
+
+ if(r == 0) {
+ return screen_line_bandwidth_compare(aa, bb, 2);
+ }
+ else {
+ return (r > 0);
+ }
+
+
+}
+
+/*
+ * Compare two screen lines based on the sorting options selected.
+ */
+int screen_line_compare(void* a, void* b) {
+ host_pair_line* aa = (host_pair_line*)a;
+ host_pair_line* bb = (host_pair_line*)b;
+ if(options.sort == OPTION_SORT_DIV1) {
+ return screen_line_bandwidth_compare(aa, bb, 0);
+ }
+ else if(options.sort == OPTION_SORT_DIV2) {
+ return screen_line_bandwidth_compare(aa, bb, 1);
+ }
+ else if(options.sort == OPTION_SORT_DIV3) {
+ return screen_line_bandwidth_compare(aa, bb, 2);
+ }
+ else if(options.sort == OPTION_SORT_SRC) {
+ return screen_line_host_compare(&(aa->ap.src6), &(bb->ap.src6), aa, bb);
+ }
+ else if(options.sort == OPTION_SORT_DEST) {
+ return screen_line_host_compare(&(aa->ap.dst6), &(bb->ap.dst6), aa, bb);
+ }
+
+ return 1;
+}
+
+/*
+ * Format a data size in human-readable format
+ */
+void readable_size(float n, char* buf, int bsize, int ksize, int bytes) {
+
+ int i = 0;
+ float size = 1;
+
+ /* Convert to bits? */
+ if(bytes == 0) {
+ n *= 8;
+ }
+
+ while(1) {
+ if(n < size * 1000 || i >= UNIT_DIVISIONS - 1) {
+ snprintf(buf, bsize, " %4.0f%s", n / size, bytes ? unit_bytes[i] : unit_bits[i]);
+ break;
+ }
+ i++;
+ size *= ksize;
+ if(n < size * 10) {
+ snprintf(buf, bsize, " %4.2f%s", n / size, bytes ? unit_bytes[i] : unit_bits[i]);
+ break;
+ }
+ else if(n < size * 100) {
+ snprintf(buf, bsize, " %4.1f%s", n / size, bytes ? unit_bytes[i] : unit_bits[i]);
+ break;
+ }
+ }
+}
+
+int history_length(const int d) {
+ if (history_len < history_divs[d])
+ return history_len * RESOLUTION;
+ else
+ return history_divs[d] * RESOLUTION;
+}
+
+void screen_list_init() {
+ screen_list.compare = &screen_line_compare;
+ sorted_list_initialise(&screen_list);
+}
+
+void screen_list_clear() {
+ sorted_list_node* nn = NULL;
+ peaksent = peakrecv = peaktotal = 0;
+ while((nn = sorted_list_next_item(&screen_list, nn)) != NULL) {
+ free(nn->data);
+ }
+ sorted_list_destroy(&screen_list);
+}
+
+/*
+ * Calculate peaks and totals
+ */
+void calculate_totals() {
+ int i;
+
+ for(i = 0; i < HISTORY_LENGTH; i++) {
+ int j;
+ int ii = (HISTORY_LENGTH + history_pos - i) % HISTORY_LENGTH;
+
+ for(j = 0; j < HISTORY_DIVISIONS; j++) {
+ if(i < history_divs[j]) {
+ totals.recv[j] += history_totals.recv[ii];
+ totals.sent[j] += history_totals.sent[ii];
+ }
+ }
+
+ if(history_totals.recv[i] > peakrecv) {
+ peakrecv = history_totals.recv[i];
+ }
+ if(history_totals.sent[i] > peaksent) {
+ peaksent = history_totals.sent[i];
+ }
+ if(history_totals.recv[i] + history_totals.sent[i] > peaktotal) {
+ peaktotal = history_totals.recv[i] + history_totals.sent[i];
+ }
+ }
+ for(i = 0; i < HISTORY_DIVISIONS; i++) {
+ int t = history_length(i);
+ totals.recv[i] /= t;
+ totals.sent[i] /= t;
+ }
+}
+
+void make_screen_list() {
+ hash_node_type* n = NULL;
+ while(hash_next_item(screen_hash, &n) == HASH_STATUS_OK) {
+ host_pair_line* line = (host_pair_line*)n->rec;
+ int i;
+ for(i = 0; i < HISTORY_DIVISIONS; i++) {
+ line->recv[i] /= history_length(i);
+ line->sent[i] /= history_length(i);
+ }
+
+ /* Don't make a new, sorted screen list if order is frozen
+ */
+ if(!options.freezeorder) {
+ sorted_list_insert(&screen_list, line);
+ }
+
+ }
+}
+
+/*
+ * Zeros all data in the screen hash, but does not remove items.
+ */
+void screen_hash_clear() {
+ hash_node_type* n = NULL;
+ while(hash_next_item(screen_hash, &n) == HASH_STATUS_OK) {
+ host_pair_line* hpl = (host_pair_line*)n->rec;
+ hpl->total_recv = hpl->total_sent = 0;
+ memset(hpl->recv, 0, sizeof(hpl->recv));
+ memset(hpl->sent, 0, sizeof(hpl->sent));
+ }
+}
+
+void analyse_data() {
+ hash_node_type* n = NULL;
+
+ if(options.paused == 1) {
+ return;
+ }
+
+ // Zero totals
+ memset(&totals, 0, sizeof totals);
+
+ if(options.freezeorder) {
+ screen_hash_clear();
+ }
+ else {
+ screen_list_clear();
+ hash_delete_all(screen_hash);
+ }
+
+ while(hash_next_item(history, &n) == HASH_STATUS_OK) {
+ history_type* d = (history_type*)n->rec;
+ host_pair_line* screen_line;
+ union {
+ host_pair_line **h_p_l_pp;
+ void **void_pp;
+ } u_screen_line = { &screen_line };
+ addr_pair ap;
+ int i;
+ int tsent, trecv;
+ tsent = trecv = 0;
+
+
+ ap = *(addr_pair*)n->key;
+
+ /* Aggregate hosts, if required */
+ if(options.aggregate_src) {
+ memset(&ap.src6, '\0', sizeof(ap.src6));
+ }
+ if(options.aggregate_dest) {
+ memset(&ap.dst6, '\0', sizeof(ap.dst6));
+ }
+
+ /* Aggregate ports, if required */
+ if(options.showports == OPTION_PORTS_DEST || options.showports == OPTION_PORTS_OFF) {
+ ap.src_port = 0;
+ }
+ if(options.showports == OPTION_PORTS_SRC || options.showports == OPTION_PORTS_OFF) {
+ ap.dst_port = 0;
+ }
+ if(options.showports == OPTION_PORTS_OFF) {
+ ap.protocol = 0;
+ }
+
+
+ if(hash_find(screen_hash, &ap, u_screen_line.void_pp) == HASH_STATUS_KEY_NOT_FOUND) {
+ screen_line = xcalloc(1, sizeof *screen_line);
+ hash_insert(screen_hash, &ap, screen_line);
+ screen_line->ap = ap;
+ }
+
+ screen_line->total_sent += d->total_sent;
+ screen_line->total_recv += d->total_recv;
+
+ for(i = 0; i < HISTORY_LENGTH; i++) {
+ int j;
+ int ii = (HISTORY_LENGTH + history_pos - i) % HISTORY_LENGTH;
+
+ for(j = 0; j < HISTORY_DIVISIONS; j++) {
+ if(i < history_divs[j]) {
+ screen_line->recv[j] += d->recv[ii];
+ screen_line->sent[j] += d->sent[ii];
+ }
+ }
+ }
+
+ }
+
+ make_screen_list();
+
+
+ calculate_totals();
+
+}
+
+void sprint_host(char * line, int af, struct in6_addr* addr, unsigned int port, unsigned int protocol, int L, int unspecified_as_star) {
+ char hostname[HOSTNAME_LENGTH];
+ char service[HOSTNAME_LENGTH];
+ char* s_name;
+ union {
+ char **ch_pp;
+ void **void_pp;
+ } u_s_name = { &s_name };
+
+ ip_service skey;
+ int left;
+
+ if(IN6_IS_ADDR_UNSPECIFIED(addr) && unspecified_as_star) {
+ sprintf(hostname, " * ");
+ }
+ else {
+ if (options.dnsresolution)
+ resolve(af, addr, hostname, L);
+ else
+ inet_ntop(af, addr, hostname, sizeof(hostname));
+ }
+ left = strlen(hostname);
+
+ if(port != 0) {
+ skey.port = port;
+ skey.protocol = protocol;
+ if(options.portresolution && hash_find(service_hash, &skey, u_s_name.void_pp) == HASH_STATUS_OK) {
+ snprintf(service, HOSTNAME_LENGTH, ":%s", s_name);
+ }
+ else {
+ snprintf(service, HOSTNAME_LENGTH, ":%d", port);
+ }
+ }
+ else {
+ service[0] = '\0';
+ }
+
+ /* If we're showing IPv6 addresses with a port number, put them in square
+ * brackets. */
+ if(port == 0 || af == AF_INET || L < 2) {
+ sprintf(line, "%-*s", L, hostname);
+ }
+ else {
+ sprintf(line, "[%-.*s]", L-2, hostname);
+ left += 2;
+ }
+ if(left > (L - strlen(service))) {
+ left = L - strlen(service);
+ if(left < 0) {
+ left = 0;
+ }
+ }
+ sprintf(line + left, "%-*s", L-left, service);
+}
+
Index: create-1.0pre4-extern-patch/iftop-1.0pre4-new/ui_common.h
===================================================================
--- create-1.0pre4-extern-patch/iftop-1.0pre4-new/ui_common.h (nonexistent)
+++ create-1.0pre4-extern-patch/iftop-1.0pre4-new/ui_common.h (revision 5)
@@ -0,0 +1,48 @@
+/*
+ * ui_common.h
+ *
+ *
+ */
+
+#ifndef __UI_COMMON_H_ /* include guard */
+#define __UI_COMMON_H_
+
+#include <string.h>
+#include <stdio.h>
+
+#include "addr_hash.h"
+#include "serv_hash.h"
+#include "iftop.h"
+#include "resolver.h"
+#include "sorted_list.h"
+#include "options.h"
+
+#define HISTORY_DIVISIONS 3
+
+#define UNIT_DIVISIONS 4
+
+#define HOSTNAME_LENGTH 256
+
+typedef struct host_pair_line_tag {
+ addr_pair ap;
+ double long total_recv;
+ double long total_sent;
+ double long recv[HISTORY_DIVISIONS];
+ double long sent[HISTORY_DIVISIONS];
+} host_pair_line;
+
+extern options_t options;
+
+extern sorted_list_type screen_list;
+extern host_pair_line totals;
+extern int peaksent, peakrecv, peaktotal;
+extern history_type history_totals;
+extern hash_type* screen_hash;
+extern hash_type* service_hash;
+
+void analyse_data(void);
+void screen_list_init(void);
+void sprint_host(char * line, int af, struct in6_addr* addr, unsigned int port, unsigned int protocol, int L, int unspecified_as_star);
+void readable_size(float, char*, int, int, int);
+
+#endif /* __UI_COMMON_H_ */
Index: create-1.0pre4-extern-patch/iftop-1.0pre4-new
===================================================================
--- create-1.0pre4-extern-patch/iftop-1.0pre4-new (nonexistent)
+++ create-1.0pre4-extern-patch/iftop-1.0pre4-new (revision 5)
Property changes on: create-1.0pre4-extern-patch/iftop-1.0pre4-new
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: create-1.0pre4-extern-patch
===================================================================
--- create-1.0pre4-extern-patch (nonexistent)
+++ create-1.0pre4-extern-patch (revision 5)
Property changes on: create-1.0pre4-extern-patch
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: patches/README
===================================================================
--- patches/README (nonexistent)
+++ patches/README (revision 5)
@@ -0,0 +1,6 @@
+
+/* begin *
+
+ TODO: Leave some comment here.
+
+ * end */
Index: patches
===================================================================
--- patches (nonexistent)
+++ patches (revision 5)
Property changes on: patches
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: .
===================================================================
--- . (nonexistent)
+++ . (revision 5)
Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~