/* A wrapper function to ouput an array of user agents for each host. */ static void process_host_agents (GJSON * json, GHolderItem * item, int iisp) { GAgents *agents = new_gagents (); int i, n = 0, iiisp = 0; /* use tabs to prettify output */ if (conf.json_pretty_print) iiisp = iisp + 1; if (set_host_agents (item->metrics->data, load_host_agents, agents) == 1) return; pjson (json, ",%.*s%.*s\"items\": [%.*s", nlines, NL, iisp, TAB, nlines, NL); n = agents->size > 10 ? 10 : agents->size; for (i = 0; i < n; ++i) { pjson (json, "%.*s\"", iiisp, TAB); escape_json_output (json, agents->items[i].agent); if (i == n - 1) pjson (json, "\""); else pjson (json, "\",%.*s", nlines, NL); } pclose_arr (json, iisp, 1); /* clean stuff up */ free_agents_array (agents); }
/* render a list of agents if available */ void load_agent_list (WINDOW * main_win, char *addr) { GMenu *menu; WINDOW *win; char buf[256]; int c, quit = 1, i; int y, x, list_h, list_w, menu_w, menu_h; if (!conf.list_agents) return; getmaxyx (stdscr, y, x); list_h = y / 2; /* list window - height */ list_w = x - 4; /* list window - width */ menu_h = list_h - AGENTS_MENU_Y - 1; /* menu window - height */ menu_w = list_w - AGENTS_MENU_X - AGENTS_MENU_X; /* menu window - width */ win = newwin (list_h, list_w, (y - list_h) / 2, (x - list_w) / 2); keypad (win, TRUE); wborder (win, '|', '|', '-', '-', '+', '+', '+', '+'); /* create a new instance of GMenu and make it selectable */ menu = new_gmenu (win, menu_h, menu_w, AGENTS_MENU_Y, AGENTS_MENU_X); if (set_host_agents (addr, load_host_agents_gmenu, menu) == 1) goto out; post_gmenu (menu); snprintf (buf, sizeof buf, "User Agents for %s", addr); draw_header (win, buf, " %s", 1, 1, list_w - 2, color_panel_header); mvwprintw (win, 2, 2, "[UP/DOWN] to scroll - [q] to close window"); wrefresh (win); while (quit) { c = wgetch (stdscr); switch (c) { case KEY_DOWN: gmenu_driver (menu, REQ_DOWN); break; case KEY_UP: gmenu_driver (menu, REQ_UP); break; case KEY_RESIZE: case 'q': quit = 0; break; } wrefresh (win); } touchwin (main_win); close_win (win); wrefresh (main_win); out: /* clean stuff up */ for (i = 0; i < menu->size; ++i) free (menu->items[i].name); if (menu->items) free (menu->items); free (menu); }