示例#1
0
/*  trafvol_section_init

    This function creates the trafvol section window and the fields inside it.
    
    Returncodes:
         0: ok
        -1: error
*/
static int
trafvol_section_init(const int debuglvl, int height, int width, int startx,
            int starty, unsigned int ifac_num)
{
    size_t          i = 0;
    int             rows = 0,
                    cols = 0;
    int             max_height = 0,
                    max_width = 0,
                    toprow = 0,
                    num_rows = (int)ifac_num;
    unsigned int    ifacs = 0,
                    ifac_fields = 0,
                    ifac_start = 4;

    /* get and check the screen dimentions */
    getmaxyx(stdscr, max_height, max_width);
    if(width > max_width)
        return(-1);

    /* set the number of fields: 
    
        interfacename,
        today in, today out,
        yesterday in, yesterday out,
        7 days in, 7 days out,
        this month in, this month out,
        last month in, last month out
    */
    TrafVolSection.n_fields = 11 * (size_t)ifac_num;
    
    /* alloc the needed memory */
    if(!(TrafVolSection.fields = (FIELD **)calloc(TrafVolSection.n_fields + 1, sizeof(FIELD *))))
    {
        (void)vrprint.error(-1, VR_ERR, gettext("calloc failed: %s (in: %s:%d)."),
                                strerror(errno),
                                __FUNC__, __LINE__);
        return(-1);
    }

    /* create iface stats fields */
    for(ifacs = 0, ifac_fields = 0; ifacs < ifac_num; ifacs++)
    {
        toprow = (int)(ifac_start+ifacs);

        /* interface name */
        TrafVolSection.fields[ifac_fields] = new_field(1, 15, toprow, 0, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "ifacname");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 16, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-in");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 22, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-ou");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 28, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "y-in");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 34, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "y-ou");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 40, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "7-in");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 46, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "7-ou");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 52, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-in");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 58, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-ou");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 64, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "l-in");
        ifac_fields++;

        TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 70, 0, 1);
        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "l-ou");
        ifac_fields++;
    }

    /* terminate the field array */
    TrafVolSection.fields[TrafVolSection.n_fields] = NULL;

    /* create the window and the panel */
    if(!(TrafVolSection.win = create_newwin(height, width, startx, starty,
            gettext("Traffic Volume Section"), vccnf.color_win)))
    {
        (void)vrprint.error(-1, VR_ERR, gettext("creating window failed."));
        return(-1);
    }

    if(!(TrafVolSection.panel[0] = new_panel(TrafVolSection.win)))
    {
        (void)vrprint.error(-1, VR_ERR, gettext("creating panel failed."));
        return(-1);
    }

    /* field options */
    for(i = 0; i < TrafVolSection.n_fields; i++)
    {
        if(debuglvl >= LOW)
            set_field_back(TrafVolSection.fields[i],
                    vccnf.color_win);
        else
            set_field_back(TrafVolSection.fields[i],
                    vccnf.color_win);

        field_opts_off(TrafVolSection.fields[i], O_AUTOSKIP);
        /* set status to false */
        set_field_status(TrafVolSection.fields[i], FALSE);
    }

    /* Create the form and post it */
    if(!(TrafVolSection.form = new_form(TrafVolSection.fields)))
    {
        (void)vrprint.error(-1, VR_ERR, gettext("creating form failed."));
        return(-1);
    }
    /* Calculate the area required for the form */
    scale_form(TrafVolSection.form, &rows, &cols);
    keypad(TrafVolSection.win, TRUE);
    /* Set main window and sub window */
    set_form_win(TrafVolSection.form, TrafVolSection.win);
    set_form_sub(TrafVolSection.form, derwin(TrafVolSection.win, rows, cols, 1, 2));

    if(post_form(TrafVolSection.form) != E_OK)
    {
        (void)vrprint.error(-1, VR_ERR, gettext("posting the form failed."));
        return(-1);
    }

    mvwprintw(TrafVolSection.win, 3, 2,  gettext("Interface"));
    mvwprintw(TrafVolSection.win, 2, 18, gettext("Today"));
    mvwprintw(TrafVolSection.win, 3, 18, gettext("In"));
    mvwprintw(TrafVolSection.win, 3, 24, gettext("Out"));
    mvwprintw(TrafVolSection.win, 2, 30, gettext("Yesterday"));
    mvwprintw(TrafVolSection.win, 3, 30, gettext("In"));
    mvwprintw(TrafVolSection.win, 3, 36, gettext("Out"));
    mvwprintw(TrafVolSection.win, 2, 42, gettext("7-days"));
    mvwprintw(TrafVolSection.win, 3, 42, gettext("In"));
    mvwprintw(TrafVolSection.win, 3, 48, gettext("Out"));
    mvwprintw(TrafVolSection.win, 2, 54, gettext("This month"));
    mvwprintw(TrafVolSection.win, 3, 54, gettext("In"));
    mvwprintw(TrafVolSection.win, 3, 60, gettext("Out"));
    mvwprintw(TrafVolSection.win, 2, 66, gettext("Last month"));
    mvwprintw(TrafVolSection.win, 3, 66, gettext("In"));
    mvwprintw(TrafVolSection.win, 3, 72, gettext("Out"));
    mvwhline(TrafVolSection.win,  4, 1,  ACS_HLINE, 76);
    mvwaddch(TrafVolSection.win,  4, 0,  ACS_LTEE);
    mvwaddch(TrafVolSection.win,  4, 77, ACS_RTEE);

    mvwvline(TrafVolSection.win,  5, 17, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 17, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 23, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 23, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 29, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 29, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 35, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 35, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 41, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 41, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 47, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 47, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 53, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 53, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 59, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 59, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 65, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 65, ACS_TTEE);
    mvwvline(TrafVolSection.win,  5, 71, ACS_VLINE, num_rows);
    mvwaddch(TrafVolSection.win,  4, 71, ACS_TTEE);

    /* don't print this line if it overlaps with the window border */
    if(5 + num_rows + 1 < height)
    {
        mvwhline(TrafVolSection.win,  5 + num_rows, 1,  ACS_HLINE, 76);
        mvwaddch(TrafVolSection.win,  5 + num_rows, 0,  ACS_LTEE);
        mvwaddch(TrafVolSection.win,  5 + num_rows, 77, ACS_RTEE);
    }

    mvwaddch(TrafVolSection.win,  5 + num_rows, 17, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 23, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 29, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 35, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 41, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 47, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 53, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 59, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 65, ACS_BTEE);
    mvwaddch(TrafVolSection.win,  5 + num_rows, 71, ACS_BTEE);

    return(0);
}
示例#2
0
/*  trafvol_section

    This section shows bandwidth usage of the system.
    
    Returncodes:
        0: ok
        -1: error
*/
int
trafvol_section(const int debuglvl, Zones *zones, Interfaces *interfaces,
            Services *services)
{
    int                     retval = 0;
    int                     quit = 0,
                            ch;

    int                     max_onscreen = 0,
                            max_height = 0,
                            max_width = 0;
    unsigned int            i = 0;
    unsigned int            ifac_num = 0;
    struct InterfaceData_   *iface_ptr=NULL;

    d_list_node             *d_node = NULL,
                            *bw_d_node = NULL;
    struct TrafVol_         *bw_ptr = NULL;
    d_list                  bw_list;

    int                     year = 0,
                            month = 0;

    time_t                  cur_time,
                            yesterday_time,
                            lastweek_time;
    struct tm               cur_tm,
                            yesterday_tm,
                            lastweek_tm;

    char                    bw_str[6] = "";

    int                     result=0;

    int                     update_interval = 10000000; /* weird, in pratice this seems to be twenty sec */
    int                     slept_so_far    = 10000000; /* time slept since last update */

    /* top menu */
    char                    *key_choices[] = {  "F12",
                                                "F10"};
    int                     key_choices_n = 2;
    char                    *cmd_choices[] = {  gettext("help"),
                                                gettext("back")};
    int                     cmd_choices_n = 2;

    if(interfaces->list.len == 0)
    {
        (void)vrprint.warning(VR_WARN, gettext("no interfaces found. Please define an interface first."));
        return(0);
    }

    if(strcmp(vccnf.iptrafvol_location, "") == 0)
    {
        (void)vrprint.error(-1, VR_ERR, gettext("please set the location of the iptrafvol.pl command in the Settings."));
        return(-1);
    }

    getmaxyx(stdscr, max_height, max_width);
    max_onscreen = max_height - 6 - 6;

    /* count the number of non virtual interfaces */
    for(ifac_num = 0, d_node = interfaces->list.top; d_node; d_node = d_node->next)
    {
        if(!(iface_ptr = d_node->data))
        {
            (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
            return(-1);
        }

        if(iface_ptr->device_virtual == FALSE)
        {
            ifac_num++;
        }
    }

    if(ifac_num > (unsigned int)max_onscreen)
        ifac_num = (unsigned int)max_onscreen;

    /* init */
    if(trafvol_section_init(debuglvl, max_height - 6, 78, 3, 1, ifac_num) < 0)
        return(-1);

    /* make sure wgetch doesn't block */
    nodelay(TrafVolSection.win, TRUE);
    keypad(TrafVolSection.win, TRUE);

    draw_top_menu(debuglvl, top_win, gettext("Traffic Volume"), key_choices_n, key_choices, cmd_choices_n, cmd_choices);

    update_panels();
    doupdate();

    /* the main loop */
    while(quit == 0 && retval == 0)
    {
        if(debuglvl >= LOW)
            (void)vrprint.debug(__FUNC__, "slept_so_far: %d, update_interval: %d.", slept_so_far, update_interval);

        /* check if we have slept long enough */
        if(slept_so_far >= update_interval)
        {
            
            if(debuglvl >= HIGH)
                (void)vrprint.debug(__FUNC__, "slept_so_far: %d -> now print.", slept_so_far);

            slept_so_far = 0;

            /* get the time */
            cur_time = time(NULL);
            if(cur_time == -1)
            {
                (void)vrprint.error(-1, VR_INTERR, "getting current time failed (in: %s:%d).", __FUNC__, __LINE__);
                return(-1);
            }
            yesterday_time = cur_time - 86400;
            lastweek_time = cur_time - (86400 * 7);

            if(localtime_r(&cur_time, &cur_tm) == NULL)
            {
                (void)vrprint.error(-1, VR_INTERR, "converting current time failed (in: %s:%d).", __FUNC__, __LINE__);
                return(-1);
            }

            if(localtime_r(&yesterday_time, &yesterday_tm) == NULL)
            {
                (void)vrprint.error(-1, VR_INTERR, "converting yesterday's time failed (in: %s:%d).", __FUNC__, __LINE__);
                return(-1);
            }

            if(localtime_r(&lastweek_time, &lastweek_tm) == NULL)
            {
                (void)vrprint.error(-1, VR_INTERR, "converting lastweeks's time failed (in: %s:%d).", __FUNC__, __LINE__);
                return(-1);
            }

            /* update data here */
            for(d_node = interfaces->list.top, i = 0; d_node && i < ifac_num; d_node = d_node->next)
            {
                if(!(iface_ptr = d_node->data))
                {
                    (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
                    return(-1);
                }

                if(iface_ptr->device_virtual == FALSE)
                {
                    /* interface name */
                    set_field_buffer_wrap(debuglvl, TrafVolSection.fields[11 * i], 0, iface_ptr->name);

                    /* get the bw for today */
                    result = bandwidth_get_iface(debuglvl, iface_ptr->device, cur_tm.tm_year + 1900, cur_tm.tm_mon + 1, cur_tm.tm_mday, 1, 1, &bw_list);
                    if(result == 1)
                    {
                        for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next)
                        {
                            if(!(bw_ptr = bw_d_node->data))
                            {
                                (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
                                return(-1);
                            }
                            //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : "");

                            create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[1 + (11 * i)], 0, bw_str);

                            create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[2 + (11 * i)], 0, bw_str);
                        }
                        d_list_cleanup(debuglvl, &bw_list);
                    }
                    else if(result == 0)
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[1 + (11 * i)], 0, "  -  ");
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[2 + (11 * i)], 0, "  -  ");
                    }
                    else
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[1 + (11 * i)], 0, gettext("error"));
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[2 + (11 * i)], 0, gettext("error"));
                    }

                    /* get the bw for yesterday */
                    result = bandwidth_get_iface(debuglvl, iface_ptr->device, yesterday_tm.tm_year + 1900, yesterday_tm.tm_mon + 1, yesterday_tm.tm_mday, 1, 1, &bw_list);
                    if(result == 1)
                    {
                        for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next)
                        {
                            if(!(bw_ptr = bw_d_node->data))
                            {
                                (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
                                return(-1);
                            }
                            //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : "");

                            create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[3 + (11 * i)], 0, bw_str);

                            create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[4 + (11 * i)], 0, bw_str);
                        }
                        d_list_cleanup(debuglvl, &bw_list);
                    }
                    else if(result == 0)
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[3 + (11 * i)], 0, "  -  ");
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[4 + (11 * i)], 0, "  -  ");
                    }
                    else
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[3 + (11 * i)], 0, gettext("error"));
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[4 + (11 * i)], 0, gettext("error"));
                    }

                    /* get the bw for past 7 days */
                    result = bandwidth_get_iface(debuglvl, iface_ptr->device, lastweek_tm.tm_year + 1900, lastweek_tm.tm_mon + 1, lastweek_tm.tm_mday, 7, 1, &bw_list);
                    if(result == 1)
                    {
                        for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next)
                        {
                            if(!(bw_ptr = bw_d_node->data))
                            {
                                (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
                                return(-1);
                            }
                            //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : "");

                            create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[5 + (11 * i)], 0, bw_str);

                            create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[6 + (11 * i)], 0, bw_str);
                        }
                        d_list_cleanup(debuglvl, &bw_list);
                    }
                    else if(result == 0)
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[5 + (11 * i)], 0, "  -  ");
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[6 + (11 * i)], 0, "  -  ");
                    }
                    else
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[5 + (11 * i)], 0, gettext("error"));
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[6 + (11 * i)], 0, gettext("error"));
                    }

                    /* get the bw for the current month */
                    result = bandwidth_get_iface(debuglvl, iface_ptr->device, cur_tm.tm_year + 1900, cur_tm.tm_mon + 1, 1, 0, 1, &bw_list);
                    if(result == 1)
                    {
                        for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next)
                        {
                            if(!(bw_ptr = bw_d_node->data))
                            {
                                (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
                                return(-1);
                            }
                            //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : "");

                            create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[7 + (11 * i)], 0, bw_str);

                            create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[8 + (11 * i)], 0, bw_str);
                        }
                        d_list_cleanup(debuglvl, &bw_list);
                    }
                    else if(result == 0)
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[7 + (11 * i)], 0, "  -  ");
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[8 + (11 * i)], 0, "  -  ");
                    }
                    else
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[7 + (11 * i)], 0, gettext("error"));
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[8 + (11 * i)], 0, gettext("error"));
                    }

            
                    /* get the bw for the last month */
                    year = cur_tm.tm_year + 1900;
                    /* get prev month (by not adding +1) */
                    month = cur_tm.tm_mon;

                    /*  if month = 0 (Jan), set it to 12
                        (Dec) and subtract one of the
                        year.
                    */
                    if(month == 0)
                    {
                        month = 12;
                        year = year - 1;
                    }

                    result = bandwidth_get_iface(debuglvl, iface_ptr->device, year, month, 1, 0, 1, &bw_list);
                    if(result == 1)
                    {
                        for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next)
                        {
                            if(!(bw_ptr = bw_d_node->data))
                            {
                                (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__);
                                return(-1);
                            }
                            //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : "");

                            create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[9 + (11 * i)], 0, bw_str);

                            create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str));
                            set_field_buffer_wrap(debuglvl, TrafVolSection.fields[10 + (11 * i)], 0, bw_str);
                        }
                        d_list_cleanup(debuglvl, &bw_list);
                    }
                    else if(result == 0)
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[9  + (11 * i)], 0, "  -  ");
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[10 + (11 * i)], 0, "  -  ");
                    }
                    else
                    {
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[9  + (11 * i)], 0, gettext("error"));
                        set_field_buffer_wrap(debuglvl, TrafVolSection.fields[10 + (11 * i)], 0, gettext("error"));
                    }

                    /* finally draw the screen */
                    wrefresh(TrafVolSection.win);

                    /* update the line */
                    i++;
                }
            }
        }

        /* finally draw the screen */
        wrefresh(TrafVolSection.win);

        /* process the keyboard input */
        ch = wgetch(TrafVolSection.win);
        switch(ch)
        {
            /* quit */
            case 27:
            case 'q':
            case 'Q':
            case KEY_F(10):
                quit = 1;
                break;

            case KEY_F(12):
            case 'h':
            case 'H':
            case '?':
                print_help(debuglvl, ":[VUURMUUR:TRAFVOL]:");
                break;
        }

        if(quit == 0)
        {
            usleep(10000);
            slept_so_far = slept_so_far + 10000;

            if(debuglvl >= HIGH)
                (void)vrprint.debug(__FUNC__, "just slept: slept_so_far '%d'.", slept_so_far);
        }
    }

    /* EXIT: cleanup */
    nodelay(TrafVolSection.win, FALSE);

    /* destroy the window and form */
    trafvol_section_destroy();
    
    update_panels();
    doupdate();

    return(retval);
}
示例#3
0
文件: filter.c 项目: ewf75/vuurmuur
int
filter_input_box(const int debuglvl, struct vrmr_filter *filter)
{
    WINDOW  *ib_win = NULL;
    PANEL   *my_panels[1];
    FIELD   *cur = NULL,
            *prev = NULL;
    FORM    *my_form = NULL;
    int     height = 0,
            width = 0,
            startx = 0,
            starty = 0,
            max_height = 0,
            max_width = 0,
            ch = 0,
            rows = 0,
            cols = 0,
            quit = 0;
    size_t  i = 0;
    char    not_defined = FALSE;

    /* init fields */
    memset(&FiFi, 0, sizeof(struct FilterFields_));

    /* set the window size */
    getmaxyx(stdscr, max_height, max_width);
    height = 9;
    width = 48;

    /* print on the center of the screen */
    starty = (max_height - height) / 2;
    startx = (max_width - width) / 2;

    /* create window */
    ib_win = create_newwin(height, width, starty, startx, gettext("Filter"), vccnf.color_win);
    if(ib_win == NULL)
    {
        vrmr_error(-1, VR_ERR, gettext("creating window failed."));
        return(-1);
    }

    my_panels[0] = new_panel(ib_win);
    if(my_panels[0] == NULL)
    {
        vrmr_error(-1, VR_ERR, gettext("creating panel failed."));
        return(-1);
    }

    FiFi.n_fields = 2;

    FiFi.fields = (FIELD **)calloc(FiFi.n_fields + 1, sizeof(FIELD *));
    if(FiFi.fields == NULL)
    {
        vrmr_error(-1, VR_ERR, gettext("calloc failed: %s (in: %s:%d)."),
                                strerror(errno), __FUNC__, __LINE__);
        return(-1);
    }

    FiFi.string_fld = (FiFi.fields[0] = new_field(1, 31, 3,  4, 0, 0));
    FiFi.check_fld = (FiFi.fields[1]  = new_field(1,  1, 5,  5, 0, 0));

    set_field_back(FiFi.string_fld, vccnf.color_win_rev);
    field_opts_off(FiFi.string_fld, O_AUTOSKIP);
    set_field_status(FiFi.string_fld, FALSE);
    set_field_buffer_wrap(debuglvl, FiFi.string_fld, 0, filter->str);


    set_field_back(FiFi.check_fld, vccnf.color_win);
    field_opts_off(FiFi.check_fld, O_AUTOSKIP);
    set_field_status(FiFi.check_fld, FALSE);
    set_field_buffer_wrap(debuglvl, FiFi.check_fld, 0, filter->neg ? "X" : " ");

    my_form = new_form(FiFi.fields);
    scale_form(my_form, &rows, &cols);
    keypad(ib_win, TRUE);
    set_form_win(my_form, ib_win);
    set_form_sub(my_form, derwin(ib_win, rows, cols, 1, 2));
    post_form(my_form);

    /* XXX: we really should have a wrapper function to just print
     * in the middle of a window to prevent hacks like this. */
    char *s = gettext("Enter filter (leave empty for no filter)");
    mvwprintw(ib_win, 2, (width - StrLen(s))/2, s);
    mvwprintw(ib_win, 6, 6, "[");
    mvwprintw(ib_win, 6, 8, "]");
    mvwprintw(ib_win, 6, 11, gettext("show lines that don't match"));

    update_panels();
    doupdate();

    if(!(cur = current_field(my_form)))
    {
        vrmr_error(-1, VR_INTERR, "NULL pointer (in: %s:%d).",
                                __FUNC__, __LINE__);
        return(-1);
    }

    while(quit == 0)
    {
        /* draw nice markers */
        draw_field_active_mark(cur, prev, ib_win, my_form, vccnf.color_win_mark|A_BOLD);

        not_defined = 0;

        /* get user input */
        ch = wgetch(ib_win);

        if(cur == FiFi.check_fld)
        {
            if(nav_field_toggleX(debuglvl, my_form, ch) < 0)
                not_defined = 1;
        }
        else if(cur == FiFi.string_fld)
        {
            if(nav_field_simpletext(debuglvl, my_form, ch) < 0)
                not_defined = 1;
        }
        else
        {
            not_defined = 1;
        }

        /* the rest is handled here */
        if(not_defined)
        {
            switch(ch)
            {
                case KEY_UP:

                    form_driver(my_form, REQ_PREV_FIELD);
                    form_driver(my_form, REQ_END_LINE);
                    break;

                case KEY_DOWN:
                case 9: // tab

                    form_driver(my_form, REQ_NEXT_FIELD);
                    form_driver(my_form, REQ_END_LINE);
                    break;

                case 10: // enter

                    if(cur == FiFi.check_fld)
                    {
                        quit = 1;
                    }
                    else
                    {
                        form_driver(my_form, REQ_NEXT_FIELD);
                        form_driver(my_form, REQ_END_LINE);
                    }
                    break;

                case 27:
                case KEY_F(10):
                case 'q':
                case 'Q':

                    quit = 1;
                    break;
            }
        }

        /* before we get the new 'cur', store cur in prev */
        prev = cur;
        if(!(cur = current_field(my_form)))
        {
            vrmr_error(-1, VR_INTERR, "NULL pointer (in: %s).", __FUNC__);
            return(-1);
        }

        /* draw and set cursor */
        wrefresh(ib_win);
        pos_form_cursor(my_form);
    }

    /* save here */
    if(filter_save(debuglvl, filter) < 0)
    {
        vrmr_error(-1, VR_ERR, gettext("setting filter failed."));
    }

    unpost_form(my_form);
    free_form(my_form);

    for(i=0; i < FiFi.n_fields; i++)
    {
        free_field(FiFi.fields[i]);
    }
    free(FiFi.fields);

    del_panel(my_panels[0]);
    destroy_win(ib_win);

    update_panels();
    doupdate();

    return(0);
}