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

📄 fltedit.c

📁 一个很好用的linux 下的流量监控软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/***fltedit.c	- the filter editing FacilityCopyright (c) Gerard Paul Java 1999, 2002This 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 <string.h>#include <ctype.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <time.h>#include <menurt.h>#include <winops.h>#include <labels.h>#include <msgboxes.h>#include "fltdefs.h"#include "fltmgr.h"#include "ipfilter.h"#include "dirs.h"#include "getpath.h"#include "attrs.h"#include "deskman.h"#include "error.h"#include "cidr.h"extern int daemonized;void init_filter_table(struct filterlist *fl){    fl->head = fl->tail = NULL;}/* * Loads the filter from the filter file */int loadfilter(char *filename, struct filterlist *fl, int resolve){    struct filterent *fe;    int pfd;    unsigned int idx = 0;    int br;    int resolv_err = 0;    char err_msg[80];    init_filter_table(fl);    pfd = open(filename, O_RDONLY);    if (pfd < 0) {        memset(err_msg, 0, 80);        snprintf(err_msg, 80, "Error opening IP filter data file");        write_error(err_msg, daemonized);        fl->head = NULL;        return 1;    }    do {        fe = malloc(sizeof(struct filterent));        br = read(pfd, &(fe->hp), sizeof(struct hostparams));        if (br > 0) {            fe->index = idx;            if (resolve) {                fe->saddr = nametoaddr(fe->hp.s_fqdn, &resolv_err);                fe->daddr = nametoaddr(fe->hp.d_fqdn, &resolv_err);                if (resolv_err) {                    free(fe);                    continue;                }                fe->smask = inet_addr(fe->hp.s_mask);                fe->dmask = inet_addr(fe->hp.d_mask);            }            if (fl->head == NULL) {                fl->head = fe;                fe->prev_entry = NULL;            } else {                fl->tail->next_entry = fe;                fe->prev_entry = fl->tail;            }            fe->next_entry = NULL;            fl->tail = fe;            idx++;        } else {            free(fe);        }    } while (br > 0);    if (br == 0)        close(pfd);    return 0;}void savefilter(char *filename, struct filterlist *fl){    struct filterent *fe = fl->head;    int pfd;    int bw;    int resp;    pfd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);    while (fe != NULL) {        bw = write(pfd, &(fe->hp), sizeof(struct hostparams));        if (bw < 0) {            tx_errbox("Unable to save filter changes", ANYKEY_MSG, &resp);            clear_flt_tag();            return;        }        fe = fe->next_entry;    }    close(pfd);}void print_hostparam_line(struct filterent *fe, int idx,                          WINDOW * win, int attr){    struct in_addr binmask;    wattrset(win, attr);    scrollok(win, 0);    mvwprintw(win, idx, 0, "%78c", ' ');    mvwaddnstr(win, idx, 1, fe->hp.s_fqdn, 20);    if (inet_aton(fe->hp.s_mask, &binmask) == 0)        inet_aton("255.255.255.255", &binmask);    wprintw(win, "/%u", cidr_get_maskbits(binmask.s_addr));    if (fe->hp.sport2 == 0)        wprintw(win, ":%u", fe->hp.sport1);    else        wprintw(win, ":%u-%u", fe->hp.sport1, fe->hp.sport2);    wmove(win, idx, 34);    if (fe->hp.match_opposite != 'Y')        wprintw(win, "-->");    else        wprintw(win, "<->");    mvwaddnstr(win, idx, 38, fe->hp.d_fqdn, 15);    if (inet_aton(fe->hp.d_mask, &binmask) == 0)        inet_aton("255.255.255.255", &binmask);    wprintw(win, "/%u", cidr_get_maskbits(binmask.s_addr));    if (fe->hp.dport2 == 0)        wprintw(win, ":%u", fe->hp.dport1);    else        wprintw(win, ":%u-%u", fe->hp.dport1, fe->hp.dport2);    mvwprintw(win, idx, 76, "%c", toupper(fe->hp.reverse));    wmove(win, idx, 0);}void update_hp_screen(struct filterlist *fl,                      struct filterent *firstvisible, WINDOW * win){    struct filterent *ftmp = firstvisible;    int i;    wattrset(win, STDATTR);    if (firstvisible == NULL) {        mvwprintw(win, 0, 0, "%78c", ' ');        wmove(win, 0, 0);        return;    }    scrollok(win, 0);    for (i = 0; i <= 12; i++) {        if (ftmp != NULL) {            print_hostparam_line(ftmp, i, win, STDATTR);            ftmp = ftmp->next_entry;        } else {            mvwprintw(win, i, 0, "%78c", ' ');            wmove(win, i, 0);        }    }    scrollok(win, 1);}int new_hp_entry(struct filterent **ftemp){    int resp;    *ftemp = malloc(sizeof(struct filterent));    if (*ftemp == NULL) {        tx_errbox("No memory for new filter entry", ANYKEY_MSG, &resp);        return 0;    }    memset(*ftemp, 0, sizeof(struct filterent));    return 1;}void modify_host_parameters(struct filterlist *fl){    WINDOW *bwin;    PANEL *bpanel;    WINDOW *win;    PANEL *panel;    struct filterent *fe;    struct filterent *ftemp;    struct filterent *firstvisible = NULL;    unsigned int idx = 0;    int endloop_local = 0;    int ch;    int gh_aborted = 0;    char s_portstr1[8];    char d_portstr1[8];    char s_portstr2[8];    char d_portstr2[8];    char inexstr[2];    char matchop[2];    bwin = newwin(15, 80, (LINES - 15) / 2, (COLS - 80) / 2);    bpanel = new_panel(bwin);    win = newwin(13, 78, (LINES - 13) / 2, (COLS - 78) / 2);    panel = new_panel(win);    wattrset(bwin, BOXATTR);    tx_box(bwin, ACS_VLINE, ACS_HLINE);    mvwprintw(bwin, 0, 2, " Source ");    mvwprintw(bwin, 0, 38, " Destination ");    mvwprintw(bwin, 0, 74, " I/E ");    mvwprintw(bwin, 14, 1, " Filter Data ");    tx_stdwinset(win);    scrollok(win, 0);    wattrset(win, STDATTR);    tx_colorwin(win);    move(LINES - 1, 1);    tx_printkeyhelp("Up/Down", "-move ptr ", stdscr, HIGHATTR,                    STATUSBARATTR);    tx_printkeyhelp("I", "-insert ", stdscr, HIGHATTR, STATUSBARATTR);    tx_printkeyhelp("A", "-add to list ", stdscr, HIGHATTR, STATUSBARATTR);    tx_printkeyhelp("D", "-delete ", stdscr, HIGHATTR, STATUSBARATTR);    tx_printkeyhelp("Enter", "-edit ", stdscr, HIGHATTR, STATUSBARATTR);    tx_printkeyhelp("X/Ctrl+X", "-exit", stdscr, HIGHATTR, STATUSBARATTR);    update_panels();    doupdate();    firstvisible = fl->head;    update_hp_screen(fl, firstvisible, win);    idx = 0;    fe = firstvisible;    update_panels();    doupdate();    do {        if (fe != NULL) {            print_hostparam_line(fe, idx, win, BARSTDATTR);        }        ch = wgetch(win);        if (fe != NULL)            print_hostparam_line(fe, idx, win, STDATTR);        switch (ch) {        case KEY_UP:            if (fl->head != NULL) {                if (fe->prev_entry != NULL) {                    if (idx > 0)                        idx--;                    else {                        scrollok(win, 1);                        wscrl(win, -1);                        firstvisible = firstvisible->prev_entry;                    }                    fe = fe->prev_entry;                }            }            break;        case KEY_DOWN:            if (fl->head != NULL) {                if (fe->next_entry != NULL) {                    if (idx < 12)                        idx++;                    else {                        scrollok(win, 1);                        wscrl(win, 1);                        firstvisible = firstvisible->next_entry;                    }                    fe = fe->next_entry;                }            }            break;        case 'i':        case 'I':        case KEY_IC:            if (!new_hp_entry(&ftemp))                break;            gethostparams(&(ftemp->hp), "", "", "", "",                          "", "", "", "", "I", "N", &gh_aborted);            if (gh_aborted) {                free(ftemp);                continue;            }            if (fl->head == NULL) {                ftemp->next_entry = ftemp->prev_entry = NULL;                fl->head = fl->tail = ftemp;                firstvisible = fl->head;                idx = 0;            } else {

⌨️ 快捷键说明

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