⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fltselect.c

📁 一个网络流量分析的完整的程序
💻 C
字号:
/*** fltselect.c - a menu-based module that allows selection of	other protocols to displayWritten by Gerard Paul JavaCopyright (c) Gerard Paul Java 1997, 1998This software is open source; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License in the included COPYING file fordetails.			***/#include <curses.h>#include <panel.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <sys/stat.h>#include <netinet/udp.h>#include <netinet/in.h>#include <linux/if_ether.h>#include <winops.h>#include <menurt.h>#include <msgboxes.h>#include "addproto.h"#include "dirs.h"#include "fltdefs.h"#include "fltselect.h"#include "utfilter.h"#include "fltedit.h"#include "fltmgr.h"#include "deskman.h"#include "attrs.h"#include "instances.h"void setfilters(struct filterstate *filter, unsigned int row){    int aborted;    switch (row) {    case 1:        tcpfilterselect(&(filter->tfl), &(filter->tfiltercode),                        filter->tfilename, &aborted);        break;    case 2:	udpfilterselect(&(filter->ufl), &(filter->ufiltercode),			filter->ufilename, &aborted);	break;    case 3:        othip_filter_select(&(filter->ofl), filter->ofilename, &(filter->ofiltercode));	break;    case 4:	filter->arp = ~(filter->arp);	break;    case 5:	filter->rarp = ~(filter->rarp);	break;    case 6:	filter->nonip = ~(filter->nonip);	break;    }}void toggleprotodisplay(WINDOW * win, struct filterstate *filter,			unsigned int row){    wmove(win, row, 2);    switch (row) {    case 1:        if (filter->tfiltercode == 0)            wprintw(win, "No TCP filter applied");        else if (filter->tfiltercode == 1)            wprintw(win, "TCP filter applied   ");        break;    case 2:        if (filter->ufiltercode == 0)            wprintw(win, "No UDP packets visible");        else if (filter->ufiltercode == 1)            wprintw(win, "All UDP visible       ");        else if (filter->ufiltercode == 2)            wprintw(win, "UDP filter applied    ");        break;    case 3:        if (filter->ofiltercode == 0)            wprintw(win, "No misc IP filter applied");        else if (filter->ofiltercode == 1)            wprintw(win, "Misc IP filter applied   ");        break;    case 4:	if (filter->arp)	    wprintw(win, "ARP visible    ");	else	    wprintw(win, "ARP not visible");	break;    case 5:	if (filter->rarp)	    wprintw(win, "RARP visible    ");	else	    wprintw(win, "RARP not visible");	break;    case 6:	if (filter->nonip)	    wprintw(win, "Non-IP visible    ");	else	    wprintw(win, "Non-IP not visible");	break;    }}int othfilterok(struct filterstate *filter, unsigned int protocol,		unsigned long saddr, unsigned long daddr,		unsigned int sport, unsigned int dport){    int result = 0;    switch (protocol) {    case IPPROTO_UDP:	if (filter->ufiltercode == 0)	    result = 0;	else if (filter->ufiltercode == 1)	    result = 1;	else if (filter->ufiltercode == 2)	    if (utfilter		(&(filter->ufl), saddr, daddr, sport, dport,		 IPPROTO_UDP))	        result = 1;	break;    case ETH_P_ARP:	result = filter->arp;	break;    case ETH_P_RARP:	result = filter->rarp;	break;    case 0:	result = filter->nonip;	break;    default:        if (filter->ofiltercode == 0)            result = 1;        else            result = othip_filter(saddr, daddr, protocol, &(filter->ofl));        break;    }    return result;}void config_filters(struct filterstate *filter){    struct MENU menu;    WINDOW *statwin;    PANEL *statpanel;    WINDOW *infowin;    PANEL *infopanel;    int row;    int aborted;    statwin = newwin(8, 30, (LINES - 8) / 2, (COLS - 15) / 2 + 10);    statpanel = new_panel(statwin);    wattrset(statwin, BOXATTR);    tx_colorwin(statwin);    box(statwin, ACS_VLINE, ACS_HLINE);    tx_stdwinset(statwin);    wmove(statwin, 0, 1);    wprintw(statwin, " Filter Status ");    wattrset(statwin, STDATTR);    infowin = newwin(2, COLS, LINES - 4, 0);    infopanel = new_panel(infowin);    wattrset(infowin, DESKTEXTATTR);    tx_colorwin(infowin);    mvwprintw(infowin, 0, 0, " Filters affect the IP traffic monitor, interface statistics, and TCP/UDP");    mvwprintw(infowin, 1, 0, " protocol breakdown.  The packet size breakdown and LAN monitor are unaffected.");    update_panels();    doupdate();    for (row = 1; row <= 11; row++)	toggleprotodisplay(statwin, filter, row);    makemainfiltermenu(&menu);    row = 1;    do {	tx_showmenu(&menu);	tx_operatemenu(&menu, &row, &aborted);	if (row <= 6) {	    setfilters(filter, row);	    toggleprotodisplay(statwin, filter, row);	}    } while (row != 8);    tx_destroymenu(&menu);    del_panel(statpanel);    delwin(statwin);    del_panel(infopanel);    delwin(infowin);    update_panels();    doupdate();}void setodefaults(struct filterstate *filter){    bzero(filter, sizeof(struct filterstate));    filter->ufiltercode = 1;}void loadfilters(struct filterstate *filter){    int pfd;    int br;    pfd = open(FLTSTATEFILE, O_RDONLY);	/* open filter state file */    if (pfd < 0) {	setodefaults(filter);	return;    }    br = read(pfd, filter, sizeof(struct filterstate));    if (br < 0)	setodefaults(filter);    close(pfd);    /*     * Reload TCP filter if one was previously applied     */         if (filter->tfiltercode != 0)        loadfilter(F_TCP, filter->tfilename, &(filter->tfl), FLT_RESOLVE);        /*      * Reload custom UDP filter if one was previously set     */    if (filter->ufiltercode == 2)	loadfilter(F_UDP, filter->ufilename, &(filter->ufl), FLT_RESOLVE);	    /*     * Reload filter for other IP protocols if one was previously applied     */         if (filter->ofiltercode != 0)        loadfilter(F_OTHERIP, filter->ofilename, &(filter->ofl), FLT_RESOLVE);}void savefilters(struct filterstate *filter){    int pfd;    int bw;    int resp;    if (!facility_active(OTHFLTIDFILE, ""))	mark_facility(OTHFLTIDFILE, "Filter configuration change", "");    else {	tx_errbox("Filter state file currently in use; try again later",	       ANYKEY_MSG, &resp);	return;    }    pfd = open(FLTSTATEFILE, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);    bw = write(pfd, filter, sizeof(struct filterstate));    if (bw < 1)	tx_errbox("Unable to write filter state information", ANYKEY_MSG, &resp);    close(pfd);    unmark_facility(OTHFLTIDFILE, "");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -