Diff between 4f7fc59cfc63616b6ad45b37bd4136344d4ccafc and 806c263bc3943abc1d64511a9c5e33c62dc6df12

Changed Files

File Additions Deletions Status
tools/hcidump.c +89 -35 modified

Full Patch

diff --git a/tools/hcidump.c b/tools/hcidump.c
index 9fb282b..8e6e6b6 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;
 }