diff options
Diffstat (limited to 'mDNSResponder/mDNSMacOSX/BonjourTop/source/main.cpp')
-rw-r--r-- | mDNSResponder/mDNSMacOSX/BonjourTop/source/main.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/mDNSResponder/mDNSMacOSX/BonjourTop/source/main.cpp b/mDNSResponder/mDNSMacOSX/BonjourTop/source/main.cpp new file mode 100644 index 00000000..52107bbe --- /dev/null +++ b/mDNSResponder/mDNSMacOSX/BonjourTop/source/main.cpp @@ -0,0 +1,179 @@ +// +// main.cpp +// BonjourTop +// +// Created by Terrin Eager on 4/24/13. +// Copyright (c) 2013-2014 Apple Inc. All rights reserved. +// + +#include <stdio.h> +#include <curses.h> + +#include "bjtypes.h" +#include "BonjourTop.h" + +#include <signal.h> +#include <getopt.h> +#include <stdlib.h> +#include <sys/types.h> + + +#define BJ_VERSION_MAJOR 0 +#define BJ_VERSION_MINOR 23 +CBonjourTop BjTop; + +static void +usage() +{ + printf("bonjourtop usage: bonjourTop (Version: %d.%d)\n",BJ_VERSION_MAJOR,BJ_VERSION_MINOR); + printf("\t\t\t [-t tcptrace_filename ]\n"); + printf("\t\t\t [-i interfaceName]\n"); + printf("\t\t\t [-m ipaddress/subnetmask] ie 17.255.45.12/17\n"); + printf("\t\t\t [-e export_filename] \n"); + printf("\t\t\t [-x seconds] 'Snapshot export every x seconds'\n"); + printf("\t\t\t [-s] 'service information'\n"); + printf("\t\t\t [-v] 'report the version number' \n"); + printf("\t\t\t [-d] filename 'export device map. Adds timestamp and csv extension to the filename' \n"); + printf("\t\t\t [-f application] 'filter application for device map (only available with -t -d options)' \n"); + printf("While running the follow keys may be used:\n"); + printf("\t b - sort by Bytes\n"); + printf("\t p - sort by Packets (default)\n"); + printf("\t n - sort by Name\n"); + printf("\t a - Display Application Names (default) \n"); + printf("\t s - Display Services Names \n"); + printf("\t t - Display 24 hour packet per min \n"); + + printf("\t o - flip sort order\n"); + printf("\t e - export to BonjourTop.csv\n"); + printf("\t q - quit\n\n"); +} + +static void +handle_window_change(int signal) { + switch (signal) { + case SIGWINCH: + BjTop.WindowSizeChanged(); + break; + default: + break; + } +} + +int main(int argc, char * const *argv) +{ + + sigset_t sset, oldsset; + int c; + + static struct option longopts[] = { + { "trace", required_argument, NULL, 't' }, + { "interface", required_argument, NULL, 'i' }, + { "ipaddr_subnet", required_argument, NULL, 'm' }, + { "export", required_argument, NULL, 'e' }, + { "snapshot", required_argument, NULL, 'x' }, + { "service", no_argument, NULL, 's' }, + { "version", no_argument, NULL, 'v' }, + { "devicemap", required_argument, NULL, 'd' }, + { "filter", required_argument, NULL, 'f' }, + { NULL, 0, NULL, 0 } + }; + + sigemptyset(&sset); + + /* Block SIGWINCH signals while we are in a relayout. */ + if(-1 == sigprocmask(SIG_BLOCK, &sset, &oldsset)) { + perror("sigprocmask"); + exit(EXIT_FAILURE); + } + + BJ_COLLECTBY_TYPE TypeList[] = {CBT_SERVICE,CBT_REQUEST_RESPONDS,CBT_SAME_DIFF_SUBNET,CBT_IP_ADDRESS_TYPE,CBT_PACKET}; + BJString sTemp; + + bool bLiveCapture = true; + bool bExport = false; + + while ((c = getopt_long(argc, argv, "t:i:m:e:x:svd:f:phb", longopts, NULL)) != -1) { + switch (c) { + case 't': + BjTop.m_pTcpDumpFileName = optarg; // TCP Dump Filename + bLiveCapture = false; + BjTop.m_bCursers = false; + break; + case 'p': + BjTop.m_bCursers = false; + break; + case 'e': + bExport = true; + BjTop.m_pExportFileName = optarg; // Export filename + break; + case 'i': + BjTop.interfaceName = optarg; // Interface name + break; + case 'm': + BjTop.SetIPAddr(optarg); // TODO: verify that the argument is an ip address + break; + case 'x': + sTemp = optarg; // time in seconds for snapshots + BjTop.m_SnapshotSeconds = sTemp.GetUINT32(); + break; + case 'd': + BjTop.m_bImportExportDeviceMap = true; + BjTop.m_DeviceFileName = optarg; + break; + case 'f': + BjTop.filterApplicationName = optarg; + break; + case 's': + BjTop.m_CurrentDisplay = CBonjourTop::BJ_DISPLAY_SERVICE; + break; + case 'v': + printf("\nbonjourtop Version: %d.%d\n\n",BJ_VERSION_MAJOR,BJ_VERSION_MINOR); + exit(0); + break; + case 'b': + BjTop.m_Collection.Init(TypeList); + bExport = true; + break; + case 'h': + usage(); + exit(0); + break; + default: + usage(); + break; + } + } + + if (BjTop.m_bCursers) + { + signal(SIGWINCH, handle_window_change); + initscr(); + timeout(0); + BjTop.PrintResults(1,false); + } + + if (bLiveCapture) + BjTop.LiveCapture(); + else + BjTop.CaptureFile(); + + + if (bExport) + { + BjTop.ExportResults(); + return 0; + } + + if (BjTop.m_bCursers) + endwin(); + + if (BjTop.m_bImportExportDeviceMap) + { + BjTop.WriteDeviceFile(); + BjTop.WriteVendorFile(); + } + + return 0; +} + + |