From 806c263bc3943abc1d64511a9c5e33c62dc6df12 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Thu, 16 Aug 2001 00:45:16 +0000 Subject: [PATCH] hcidump: Initial support for read/writing dump files. --- tools/hcidump.c | 124 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 89 insertions(+), 35 deletions(-) diff --git a/tools/hcidump.c b/tools/hcidump.c index 9fb282b69..8e6e6b614 100644 --- a/tools/hcidump.c +++ b/tools/hcidump.c @@ -43,9 +43,17 @@ #include "parser.h" +/* Modes */ +enum { + DUMP, + READ, + WRITE, +}; + /* Default options */ #define SNAP_LEN (1 + HCI_ACL_HDR_SIZE + L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + 60) int snap_len = SNAP_LEN; +int mode = DUMP; void usage(void) { @@ -112,41 +120,27 @@ void process_frames(int dev, int fd) } } -int main(int argc, char *argv[]) +int open_file(char *file, int mode) { - extern int optind, opterr, optopt; - extern char *optarg; - struct sockaddr_hci addr; - struct hci_filter flt; - int s, opt, dev; - long flags; + int fi, flags; - dev = 0; - flags = 0; - - while ((opt=getopt(argc, argv,"i:s:ha")) != EOF) { - switch (opt) { - case 'i': - dev = atoi(optarg+3); - break; + if (mode == WRITE) + flags = O_WRONLY | O_CREATE | O_APPEND; + else + flags = O_RDONLY; - case 'h': - flags |= DUMP_HEX; - break; - - case 'a': - flags |= DUMP_ASCII; - break; - - case 's': - snap_len = atoi(optarg); - break; - - default: - usage(); - exit(1); - } + if ((f = open(file, flags) < 0) { + perror("Can't open output file"); + exit(1); } + return f; +} + +int open_socket(int dev) +{ + struct sockaddr_hci addr; + struct hci_filter flt; + int s, opt; /* Create HCI socket */ if ((s=socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { @@ -177,12 +171,72 @@ int main(int argc, char *argv[]) dev, strerror(errno), errno); exit(1); } + return s; +} - printf("HCIDump - HCI packet analyzer ver %s.\n", VERSION); +int main(int argc, char *argv[]) +{ + extern int optind, opterr, optopt; + extern char *optarg; + int s, f, dev; + long flags; + + dev = 0; + flags = 0; + + while ((opt=getopt(argc, argv,"i:s:haw:r:")) != EOF) { + switch(opt) { + case 'i': + dev = atoi(optarg+3); + break; + + case 'h': + flags |= DUMP_HEX; + break; + + case 'a': + flags |= DUMP_ASCII; + break; + + case 's': + snap_len = atoi(optarg); + break; + + case 'w': + mode = WRITE; + file = strdup(optarg); + break; + + case 'r': + mode = READ; + file = strdup(optarg); + break; - init_parser(flags); - process_frames(dev, s); + default: + usage(); + exit(1); + } + } + + printf("HCIDump - HCI packet analyzer ver %s.\n", VERSION); - close(s); + switch (mode) { + case DUMP: + s = open_socket(dev); + init_parser(flags); + process_frames(dev, s); + break; + + case WRITE: + s = open_socket(dev); + f = open_file(file, mode); + write_frames(s, f); + break; + + case READ: + f = open_file(file, mode); + read_frames(f); + break; + } return 0; } -- 2.47.3