This commit is contained in:
chris
2002-03-24 17:27:12 +00:00
parent 3004ea063c
commit 1388f3adf6
10 changed files with 253 additions and 47 deletions

140
Makefile
View File

@@ -2,7 +2,7 @@
#CC = gcc #CC = gcc
CFLAGS += -g -Wall -I/usr/local/include CFLAGS += -g -Wall -I/usr/include/pcap
LDFLAGS += -g LDFLAGS += -g
LDLIBS += -L/usr/local/lib -lpcap -lpthread -lcurses LDLIBS += -L/usr/local/lib -lpcap -lpthread -lcurses
@@ -13,6 +13,7 @@ SRCS = iftop.c \
ns_hash.c \ ns_hash.c \
resolver.c \ resolver.c \
ui.c \ ui.c \
util.c \
sorted_list.c sorted_list.c
OBJS = $(SRCS:.c=.o) OBJS = $(SRCS:.c=.o)
@@ -43,4 +44,139 @@ nodepend:
# DO NOT DELETE # DO NOT DELETE
iftop.o: /usr/include/stdio.h /usr/include/features.h
iftop.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
iftop.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
iftop.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
iftop.o: /usr/include/bits/types.h /usr/include/libio.h
iftop.o: /usr/include/_G_config.h /usr/include/bits/stdio_lim.h
iftop.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
iftop.o: /usr/include/endian.h /usr/include/bits/endian.h
iftop.o: /usr/include/sys/select.h /usr/include/bits/select.h
iftop.o: /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h
iftop.o: /usr/include/alloca.h /usr/include/net/ethernet.h
iftop.o: /usr/include/linux/if_ether.h /usr/include/netinet/ip.h
iftop.o: /usr/include/netinet/in.h /usr/include/limits.h
iftop.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h
iftop.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h
iftop.o: /usr/include/stdint.h /usr/include/bits/wordsize.h
iftop.o: /usr/include/bits/socket.h /usr/include/bits/sockaddr.h
iftop.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h
iftop.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h
iftop.o: /usr/include/pthread.h /usr/include/sched.h
iftop.o: /usr/include/bits/sched.h /usr/include/signal.h
iftop.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sigthread.h
iftop.o: /usr/include/curses.h /usr/include/ncurses/unctrl.h
iftop.o: /usr/include/ncurses/curses.h /usr/include/string.h iftop.h
iftop.o: addr_hash.h /usr/include/sys/socket.h /usr/include/arpa/inet.h
iftop.o: hash.h resolver.h ui.h
addr_hash.o: /usr/include/stdio.h /usr/include/features.h
addr_hash.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
addr_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
addr_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
addr_hash.o: /usr/include/bits/types.h /usr/include/libio.h
addr_hash.o: /usr/include/_G_config.h /usr/include/bits/stdio_lim.h
addr_hash.o: /usr/include/stdlib.h /usr/include/sys/types.h
addr_hash.o: /usr/include/time.h /usr/include/endian.h
addr_hash.o: /usr/include/bits/endian.h /usr/include/sys/select.h
addr_hash.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
addr_hash.o: /usr/include/sys/sysmacros.h /usr/include/alloca.h addr_hash.h
addr_hash.o: /usr/include/sys/socket.h /usr/include/bits/socket.h
addr_hash.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
addr_hash.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
addr_hash.o: /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h
addr_hash.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h
addr_hash.o: /usr/include/netinet/in.h /usr/include/stdint.h
addr_hash.o: /usr/include/bits/wordsize.h /usr/include/bits/in.h
addr_hash.o: /usr/include/bits/byteswap.h /usr/include/arpa/inet.h hash.h
hash.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
hash.o: /usr/include/gnu/stubs.h
hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
hash.o: /usr/include/bits/types.h /usr/include/libio.h
hash.o: /usr/include/_G_config.h /usr/include/bits/stdio_lim.h
hash.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
hash.o: /usr/include/endian.h /usr/include/bits/endian.h
hash.o: /usr/include/sys/select.h /usr/include/bits/select.h
hash.o: /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h
hash.o: /usr/include/alloca.h hash.h
ns_hash.o: /usr/include/stdio.h /usr/include/features.h
ns_hash.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
ns_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
ns_hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
ns_hash.o: /usr/include/bits/types.h /usr/include/libio.h
ns_hash.o: /usr/include/_G_config.h /usr/include/bits/stdio_lim.h
ns_hash.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
ns_hash.o: /usr/include/endian.h /usr/include/bits/endian.h
ns_hash.o: /usr/include/sys/select.h /usr/include/bits/select.h
ns_hash.o: /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h
ns_hash.o: /usr/include/alloca.h /usr/include/sys/socket.h
ns_hash.o: /usr/include/bits/socket.h /usr/include/limits.h
ns_hash.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h
ns_hash.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h
ns_hash.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h
ns_hash.o: /usr/include/asm/sockios.h /usr/include/netinet/in.h
ns_hash.o: /usr/include/stdint.h /usr/include/bits/wordsize.h
ns_hash.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h
ns_hash.o: /usr/include/arpa/inet.h ns_hash.h hash.h
resolver.o: /usr/include/netinet/in.h /usr/include/features.h
resolver.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
resolver.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
resolver.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
resolver.o: /usr/include/bits/posix2_lim.h /usr/include/stdint.h
resolver.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
resolver.o: /usr/include/bits/wordsize.h /usr/include/sys/types.h
resolver.o: /usr/include/bits/types.h /usr/include/time.h
resolver.o: /usr/include/endian.h /usr/include/bits/endian.h
resolver.o: /usr/include/sys/select.h /usr/include/bits/select.h
resolver.o: /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h
resolver.o: /usr/include/bits/socket.h /usr/include/bits/sockaddr.h
resolver.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h
resolver.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h
resolver.o: /usr/include/sys/socket.h /usr/include/arpa/inet.h
resolver.o: /usr/include/pthread.h /usr/include/sched.h
resolver.o: /usr/include/bits/sched.h /usr/include/signal.h
resolver.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sigthread.h
resolver.o: /usr/include/stdio.h
resolver.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
resolver.o: /usr/include/libio.h /usr/include/_G_config.h
resolver.o: /usr/include/bits/stdio_lim.h /usr/include/stdlib.h
resolver.o: /usr/include/alloca.h /usr/include/netdb.h
resolver.o: /usr/include/rpc/netdb.h /usr/include/errno.h
resolver.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
resolver.o: /usr/include/asm/errno.h /usr/include/string.h ns_hash.h hash.h
ui.o: /usr/include/curses.h /usr/include/stdio.h /usr/include/features.h
ui.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
ui.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
ui.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
ui.o: /usr/include/bits/types.h /usr/include/libio.h /usr/include/_G_config.h
ui.o: /usr/include/bits/stdio_lim.h /usr/include/ncurses/unctrl.h
ui.o: /usr/include/ncurses/curses.h /usr/include/string.h
ui.o: /usr/include/pthread.h /usr/include/sched.h /usr/include/time.h
ui.o: /usr/include/bits/sched.h /usr/include/signal.h
ui.o: /usr/include/bits/sigset.h /usr/include/bits/pthreadtypes.h
ui.o: /usr/include/bits/sigthread.h /usr/include/stdlib.h
ui.o: /usr/include/sys/types.h /usr/include/endian.h
ui.o: /usr/include/bits/endian.h /usr/include/sys/select.h
ui.o: /usr/include/bits/select.h /usr/include/sys/sysmacros.h
ui.o: /usr/include/alloca.h addr_hash.h /usr/include/sys/socket.h
ui.o: /usr/include/bits/socket.h /usr/include/limits.h
ui.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h
ui.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h
ui.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h
ui.o: /usr/include/asm/sockios.h /usr/include/netinet/in.h
ui.o: /usr/include/stdint.h /usr/include/bits/wordsize.h
ui.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h
ui.o: /usr/include/arpa/inet.h hash.h iftop.h resolver.h sorted_list.h
sorted_list.o: /usr/include/stdlib.h /usr/include/features.h
sorted_list.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
sorted_list.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
sorted_list.o: /usr/include/sys/types.h /usr/include/bits/types.h
sorted_list.o: /usr/include/time.h /usr/include/endian.h
sorted_list.o: /usr/include/bits/endian.h /usr/include/sys/select.h
sorted_list.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
sorted_list.o: /usr/include/sys/sysmacros.h /usr/include/alloca.h
sorted_list.o: /usr/include/stdio.h
sorted_list.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h
sorted_list.o: /usr/include/libio.h /usr/include/_G_config.h
sorted_list.o: /usr/include/bits/stdio_lim.h sorted_list.h

View File

@@ -4,6 +4,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "addr_hash.h" #include "addr_hash.h"
#include "hash.h" #include "hash.h"
#include "iftop.h"
#define hash_table_size 256 #define hash_table_size 256
@@ -36,11 +37,8 @@ int hash(void* key) {
} }
void* copy_key(void* orig) { void* copy_key(void* orig) {
addr_pair* copy = malloc(sizeof(addr_pair)); addr_pair* copy;
if(copy == NULL) { copy = xmalloc(sizeof *copy);
printf("Out of memory\n");
exit(1);
}
*copy = *(addr_pair*)orig; *copy = *(addr_pair*)orig;
return copy; return copy;
} }
@@ -54,10 +52,7 @@ void delete_key(void* key) {
*/ */
hash_type* addr_hash_create() { hash_type* addr_hash_create() {
hash_type* hash_table; hash_type* hash_table;
if ((hash_table = calloc(hash_table_size, sizeof(hash_type*))) == 0) { hash_table = xcalloc(hash_table_size, sizeof *hash_table);
fprintf (stderr, "out of memory (hashTable)\n");
exit(1);
}
hash_table->size = hash_table_size; hash_table->size = hash_table_size;
hash_table->compare = &compare; hash_table->compare = &compare;
hash_table->hash = &hash; hash_table->hash = &hash;

9
hash.c
View File

@@ -3,6 +3,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "hash.h" #include "hash.h"
#include "iftop.h"
hash_status_enum hash_insert(hash_type* hash_table, void* key, void* rec) { hash_status_enum hash_insert(hash_type* hash_table, void* key, void* rec) {
hash_node_type *p, *p0; hash_node_type *p, *p0;
@@ -15,8 +16,7 @@ hash_status_enum hash_insert(hash_type* hash_table, void* key, void* rec) {
/* insert node at beginning of list */ /* insert node at beginning of list */
bucket = hash_table->hash(key); bucket = hash_table->hash(key);
if ((p = malloc(sizeof(hash_node_type))) == 0) p = xmalloc(sizeof *p);
return HASH_STATUS_MEM_EXHAUSTED;
p0 = hash_table->table[bucket]; p0 = hash_table->table[bucket];
hash_table->table[bucket] = p; hash_table->table[bucket] = p;
p->next = p0; p->next = p0;
@@ -98,10 +98,7 @@ hash_status_enum hash_next_item(hash_type* hash_table, hash_node_type** ppnode)
* Allocate and return a hash * Allocate and return a hash
*/ */
hash_status_enum hash_initialise(hash_type* hash_table) { hash_status_enum hash_initialise(hash_type* hash_table) {
if ((hash_table->table = calloc(hash_table->size, sizeof(hash_node_type *))) == 0) { hash_table->table = xcalloc(hash_table->size, sizeof *hash_table->table);
fprintf (stderr, "out of memory (hash_table)\n");
return HASH_STATUS_MEM_EXHAUSTED;
}
return HASH_STATUS_OK; return HASH_STATUS_OK;
} }

29
iftop.c
View File

@@ -38,10 +38,7 @@ void init_history() {
history_type* history_create() { history_type* history_create() {
history_type* h; history_type* h;
if ((h = calloc(1, sizeof(history_type))) == 0) { h = xcalloc(1, sizeof *h);
fprintf (stderr, "out of memory (history_type)\n");
exit(1);
}
return h; return h;
} }
@@ -135,6 +132,7 @@ void packet_loop(void* ptr) {
char errbuf[PCAP_ERRBUF_SIZE]; char errbuf[PCAP_ERRBUF_SIZE];
char* device; char* device;
pcap_t* pd; pcap_t* pd;
struct bpf_program F;
resolver_initialise(); resolver_initialise();
@@ -142,7 +140,15 @@ void packet_loop(void* ptr) {
printf("Device: %s\n",device); printf("Device: %s\n",device);
pd = pcap_open_live(device,CAPTURE_LENGTH,1,1000,errbuf); pd = pcap_open_live(device,CAPTURE_LENGTH,1,1000,errbuf);
if(pd == NULL) { if(pd == NULL) {
printf("pcap_open_live(): %s\n",errbuf); fprintf(stderr, "pcap_open_live(): %s\n",errbuf);
exit(1);
}
if (pcap_compile(pd, &F, "ip", 1, 0) == -1) {
fprintf(stderr, "pcap_compile: %s\n", pcap_geterr(pd));
exit(1);
}
if (pcap_setfilter(pd, &F) == -1) {
fprintf(stderr, "pcap_setfilter: %s\n", pcap_geterr(pd));
exit(1); exit(1);
} }
printf("Begin loop\n"); printf("Begin loop\n");
@@ -151,16 +157,19 @@ void packet_loop(void* ptr) {
printf("end loop\n"); printf("end loop\n");
} }
sig_atomic_t foad;
static void finish(int sig) static void finish(int sig)
{ {
ui_finish(); foad = sig;
exit(0);
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
pthread_t thread; pthread_t thread;
struct sigaction sa = {0};
sa.sa_handler = finish;
(void) signal(SIGINT, finish); /* arrange interrupts to terminate */ sigaction(SIGINT, &sa, NULL);
pthread_mutex_init(&tick_mutex, NULL); pthread_mutex_init(&tick_mutex, NULL);
@@ -168,5 +177,9 @@ int main(int argc, char **argv) {
ui_loop(); ui_loop();
pthread_cancel(thread);
ui_finish();
return 0; return 0;
} }

View File

@@ -18,4 +18,10 @@ typedef struct {
void tick(); void tick();
void *xmalloc(size_t n);
void *xcalloc(size_t n, size_t m);
void *xrealloc(void *w, size_t n);
char *xstrdup(const char *s);
void xfree(void *v);
#endif /* __IFTOP_H_ */ #endif /* __IFTOP_H_ */

View File

@@ -7,6 +7,7 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include "ns_hash.h" #include "ns_hash.h"
#include "hash.h" #include "hash.h"
#include "iftop.h"
#define hash_table_size 256 #define hash_table_size 256
@@ -31,11 +32,8 @@ int ns_hash_hash(void* key) {
} }
void* ns_hash_copy_key(void* orig) { void* ns_hash_copy_key(void* orig) {
struct in_addr* copy = malloc(sizeof(struct in_addr)); struct in_addr* copy;
if(copy == NULL) { copy = xmalloc(sizeof *copy);
printf("Out of memory\n");
exit(1);
}
*copy = *(struct in_addr*)orig; *copy = *(struct in_addr*)orig;
return copy; return copy;
} }
@@ -49,10 +47,7 @@ void ns_hash_delete_key(void* key) {
*/ */
hash_type* ns_hash_create() { hash_type* ns_hash_create() {
hash_type* hash_table; hash_type* hash_table;
if ((hash_table = calloc(hash_table_size, sizeof(hash_type*))) == 0) { hash_table = xcalloc(hash_table_size, sizeof *hash_table);
fprintf (stderr, "out of memory (hashTable)\n");
exit(1);
}
hash_table->size = hash_table_size; hash_table->size = hash_table_size;
hash_table->compare = &ns_hash_compare; hash_table->compare = &ns_hash_compare;
hash_table->hash = &ns_hash_hash; hash_table->hash = &ns_hash_hash;

View File

@@ -14,6 +14,7 @@
#include <string.h> #include <string.h>
#include "ns_hash.h" #include "ns_hash.h"
#include "iftop.h"
#define RESOLVE_QUEUE_LENGTH 20 #define RESOLVE_QUEUE_LENGTH 20
@@ -57,7 +58,7 @@ void resolver_worker(void* ptr) {
hstbuflen = 1024; hstbuflen = 1024;
/* Allocate buffer, remember to free it to avoid memory leakage. */ /* Allocate buffer, remember to free it to avoid memory leakage. */
tmphstbuf = malloc (hstbuflen); tmphstbuf = xmalloc (hstbuflen);
while ((res = gethostbyaddr_r (&addr, sizeof(addr), AF_INET, while ((res = gethostbyaddr_r (&addr, sizeof(addr), AF_INET,
&hostbuf, tmphstbuf, hstbuflen, &hostbuf, tmphstbuf, hstbuflen,
@@ -84,7 +85,7 @@ void resolver_worker(void* ptr) {
//printf("[ Resolved: %s ]\n", hp->h_name); //printf("[ Resolved: %s ]\n", hp->h_name);
if(hash_find(ns_hash, &addr, (void**)&hostname) == HASH_STATUS_OK) { if(hash_find(ns_hash, &addr, (void**)&hostname) == HASH_STATUS_OK) {
hash_delete(ns_hash, &addr); hash_delete(ns_hash, &addr);
free(hostname); xfree(hostname);
} }
else { else {
//printf("[ Warning: Could not find hash entry for key: %s ]\n", inet_ntoa(addr)); //printf("[ Warning: Could not find hash entry for key: %s ]\n", inet_ntoa(addr));
@@ -93,7 +94,7 @@ void resolver_worker(void* ptr) {
hash_insert(ns_hash, &addr, (void*)hostname); hash_insert(ns_hash, &addr, (void*)hostname);
} }
free(tmphstbuf); xfree(tmphstbuf);
} }
pthread_mutex_unlock(&resolver_queue_access_mutex); pthread_mutex_unlock(&resolver_queue_access_mutex);
} }

View File

@@ -6,6 +6,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "sorted_list.h" #include "sorted_list.h"
#include "iftop.h"
void sorted_list_insert(sorted_list_type* list, void* item) { void sorted_list_insert(sorted_list_type* list, void* item) {
@@ -17,11 +18,7 @@ void sorted_list_insert(sorted_list_type* list, void* item) {
p = p->next; p = p->next;
} }
node = (sorted_list_node*)malloc(sizeof(sorted_list_node)); node = xmalloc(sizeof *node);
if(node == NULL) {
fprintf(stderr,"Out of memory\n");
exit(1);
}
node->next = p->next; node->next = p->next;
node->data = item; node->data = item;

13
ui.c
View File

@@ -6,7 +6,9 @@
#include <curses.h> #include <curses.h>
#include <string.h> #include <string.h>
#include <pthread.h> #include <pthread.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include "addr_hash.h" #include "addr_hash.h"
#include "iftop.h" #include "iftop.h"
#include "resolver.h" #include "resolver.h"
@@ -30,6 +32,8 @@ extern hash_type* history;
extern int history_pos; extern int history_pos;
extern int history_len; extern int history_len;
void ui_finish();
int screen_line_compare(void* a, void* b) { int screen_line_compare(void* a, void* b) {
host_pair_line* aa = (host_pair_line*)a; host_pair_line* aa = (host_pair_line*)a;
host_pair_line* bb = (host_pair_line*)b; host_pair_line* bb = (host_pair_line*)b;
@@ -66,7 +70,7 @@ void ui_print() {
host_pair_line* screen_line; host_pair_line* screen_line;
int i; int i;
screen_line = (host_pair_line*)calloc(1,sizeof(host_pair_line)); screen_line = xcalloc(1, sizeof *screen_line);
screen_line->ap = (addr_pair*)n->key; screen_line->ap = (addr_pair*)n->key;
for(i = 0; i < HISTORY_LENGTH; i++) { for(i = 0; i < HISTORY_LENGTH; i++) {
@@ -125,7 +129,7 @@ void ui_print() {
void ui_loop() { void ui_loop() {
pthread_mutex_t tick_wait_mutex; pthread_mutex_t tick_wait_mutex;
pthread_cond_t tick_wait_cond; pthread_cond_t tick_wait_cond;
extern sig_atomic_t foad;
(void) initscr(); /* initialize the curses library */ (void) initscr(); /* initialize the curses library */
keypad(stdscr, TRUE); /* enable keyboard mapping */ keypad(stdscr, TRUE); /* enable keyboard mapping */
@@ -133,11 +137,11 @@ void ui_loop() {
(void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) cbreak(); /* take input chars one at a time, no wait for \n */
(void) noecho(); /* don't echo input */ (void) noecho(); /* don't echo input */
pthread_mutex_init(&tick_wait_mutex, NULL); pthread_mutex_init(&tick_wait_mutex, NULL);
pthread_cond_init(&tick_wait_cond, NULL); pthread_cond_init(&tick_wait_cond, NULL);
while(1) { while(foad == 0) {
struct timespec t; struct timespec t;
int i;
t.tv_sec = time(NULL) + 1; t.tv_sec = time(NULL) + 1;
t.tv_nsec = 0; t.tv_nsec = 0;
@@ -145,7 +149,6 @@ void ui_loop() {
//fprintf(stderr,"timeout tick\n"); //fprintf(stderr,"timeout tick\n");
tick(); tick();
} }
} }
void ui_finish() { void ui_finish() {

63
util.c Normal file
View File

@@ -0,0 +1,63 @@
/*
* util.c:
* Various utility functions.
*
* Copyright (c) 2002 Chris Lightfoot. All rights reserved.
* Email: chris@ex-parrot.com; WWW: http://www.ex-parrot.com/~chris/
*
*/
static const char rcsid[] = "$Id$";
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "iftop.h"
/* xmalloc:
* Malloc, and abort if malloc fails. */
void *xmalloc(size_t n) {
void *v;
v = malloc(n);
if (!v) abort();
return v;
}
/* xcalloc:
* As above. */
void *xcalloc(size_t n, size_t m) {
void *v;
v = calloc(n, m);
if (!v) abort();
return v;
}
/* xrealloc:
* As above. */
void *xrealloc(void *w, size_t n) {
void *v;
v = realloc(w, n);
if (n != 0 && !v) abort();
return v;
}
/* xstrdup:
* As above. */
char *xstrdup(const char *s) {
char *t;
t = strdup(s);
if (!t) abort();
return t;
}
/* xfree:
* Free, ignoring a passed NULL value. */
void xfree(void *v) {
if (v) free(v);
}