diff --git a/Makefile.tools b/Makefile.tools
index 07eeeac..a2c9d9e 100644
--- a/Makefile.tools
+++ b/Makefile.tools
tools_btmgmt_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@
monitor_btmon_SOURCES = monitor/main.c monitor/bt.h \
- monitor/pager.h monitor/pager.c \
monitor/mainloop.h monitor/mainloop.c \
+ monitor/display.h monitor/display.c \
monitor/hcidump.h monitor/hcidump.c \
monitor/btsnoop.h monitor/btsnoop.c \
monitor/control.h monitor/control.c \
diff --git a/monitor/control.c b/monitor/control.c
index 638d173..95582a4 100644
--- a/monitor/control.c
+++ b/monitor/control.c
#include <bluetooth/mgmt.h>
#include "mainloop.h"
-#include "pager.h"
+#include "display.h"
#include "packet.h"
#include "btsnoop.h"
#include "control.h"
if (btsnoop_open(path) < 0)
return;
- pager_open();
+ open_pager();
while (1) {
if (btsnoop_read(&tv, &index, &opcode, buf, &pktlen) < 0)
packet_monitor(&tv, index, opcode, buf, pktlen);
}
- pager_close();
+ close_pager();
btsnoop_close();
}
diff --git a/monitor/pager.c b/monitor/display.c
similarity index 88%
rename from monitor/pager.c
rename to monitor/display.c
index f24eca7..7b6fc98 100644
--- a/monitor/pager.c
+++ b/monitor/display.c
#include <signal.h>
#include <sys/wait.h>
#include <sys/prctl.h>
+#include <sys/ioctl.h>
-#include "pager.h"
+#include "display.h"
static pid_t pager_pid = 0;
+bool use_color(void)
+{
+ static int cached_use_color = -1;
+
+ if (__builtin_expect(!!(cached_use_color < 0), 0))
+ cached_use_color = isatty(STDOUT_FILENO) > 0 || pager_pid > 0;
+
+ return cached_use_color;
+}
+
+int num_columns(void)
+{
+ static int cached_num_columns = -1;
+
+ if (__builtin_expect(!!(cached_num_columns < 0), 0)) {
+ struct winsize ws;
+
+ if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0)
+ return -1;
+
+ if (ws.ws_col > 0)
+ cached_num_columns = ws.ws_col;
+ }
+
+ return cached_num_columns;
+}
+
static void close_pipe(int p[])
{
if (p[0] >= 0)
}
}
-void pager_open(void)
+void open_pager(void)
{
const char *pager;
pid_t parent_pid;
if (!(isatty(STDOUT_FILENO) > 0))
return;
+ num_columns();
+
if (pipe(fd) < 0) {
perror("Failed to create pager pipe");
return;
close_pipe(fd);
}
-void pager_close(void)
+void close_pager(void)
{
if (pager_pid <= 0)
return;
wait_for_terminate(pager_pid);
pager_pid = 0;
}
-
-bool pager_have(void)
-{
- return pager_pid > 0;
-}
diff --git a/monitor/pager.h b/monitor/display.h
similarity index 87%
rename from monitor/pager.h
rename to monitor/display.h
index 041eb74..2740f76 100644
--- a/monitor/pager.h
+++ b/monitor/display.h
#include <stdbool.h>
-void pager_open(void);
-void pager_close(void);
-bool pager_have(void);
+bool use_color(void);
+int num_columns(void);
+
+void open_pager(void);
+void close_pager(void);
diff --git a/monitor/packet.c b/monitor/packet.c
index fd9e663..8daa153 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
-#include "pager.h"
+#include "display.h"
#include "bt.h"
#include "l2cap.h"
#include "control.h"
#define COLOR_HCI_ACLDATA COLOR_CYAN
#define COLOR_HCI_SCODATA COLOR_YELLOW
-static bool use_color(void)
-{
- static int cached_use_color = -1;
-
- if (__builtin_expect(!!(cached_use_color < 0), 0))
- cached_use_color = isatty(STDOUT_FILENO) > 0 || pager_have();
-
- return cached_use_color;
-}
-
#define print_text(color, fmt, args...) do { \
printf("%s" fmt "%s", \
use_color() ? color : "", ## args, \