16fdccb80SAxel Dörfler /*=--------------------------------------------------------------------------=* 26fdccb80SAxel Dörfler * NetDebug.cpp -- Implementation of the BNetDebug class. 36fdccb80SAxel Dörfler * 46fdccb80SAxel Dörfler * Written by S.T. Mansfield (thephantom@mac.com) 56fdccb80SAxel Dörfler * 66fdccb80SAxel Dörfler * Remarks: 76fdccb80SAxel Dörfler * * Although this would more properly be implemented as a namespace... 86fdccb80SAxel Dörfler * * Do not burn the candle at both ends as it leads to the life of a 96fdccb80SAxel Dörfler * hairdresser. 106fdccb80SAxel Dörfler *=--------------------------------------------------------------------------=* 116fdccb80SAxel Dörfler * Copyright (c) 2002, The OpenBeOS project. 126fdccb80SAxel Dörfler * 136fdccb80SAxel Dörfler * Permission is hereby granted, free of charge, to any person obtaining a 146fdccb80SAxel Dörfler * copy of this software and associated documentation files (the "Software"), 156fdccb80SAxel Dörfler * to deal in the Software without restriction, including without limitation 166fdccb80SAxel Dörfler * the rights to use, copy, modify, merge, publish, distribute, sublicense, 176fdccb80SAxel Dörfler * and/or sell copies of the Software, and to permit persons to whom the 186fdccb80SAxel Dörfler * Software is furnished to do so, subject to the following conditions: 196fdccb80SAxel Dörfler * 206fdccb80SAxel Dörfler * The above copyright notice and this permission notice shall be included in 216fdccb80SAxel Dörfler * all copies or substantial portions of the Software. 226fdccb80SAxel Dörfler * 236fdccb80SAxel Dörfler * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 246fdccb80SAxel Dörfler * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 256fdccb80SAxel Dörfler * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 266fdccb80SAxel Dörfler * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 276fdccb80SAxel Dörfler * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 286fdccb80SAxel Dörfler * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 296fdccb80SAxel Dörfler * DEALINGS IN THE SOFTWARE. 306fdccb80SAxel Dörfler *=--------------------------------------------------------------------------=* 316fdccb80SAxel Dörfler */ 326fdccb80SAxel Dörfler 336fdccb80SAxel Dörfler 346fdccb80SAxel Dörfler #include <ctype.h> 356fdccb80SAxel Dörfler #include <stdio.h> 366fdccb80SAxel Dörfler #include <string.h> 376fdccb80SAxel Dörfler 386fdccb80SAxel Dörfler #include <NetDebug.h> 396fdccb80SAxel Dörfler #include <SupportDefs.h> 406fdccb80SAxel Dörfler 416fdccb80SAxel Dörfler 426fdccb80SAxel Dörfler // Off by default cuz the BeBook sez so. 436fdccb80SAxel Dörfler static bool g_NetDebugEnabled = false; 446fdccb80SAxel Dörfler 456fdccb80SAxel Dörfler 466fdccb80SAxel Dörfler /* Enable 476fdccb80SAxel Dörfler *=--------------------------------------------------------------------------=* 486fdccb80SAxel Dörfler * Purpose: 496fdccb80SAxel Dörfler * Enable/disable debug message capability for your app. 506fdccb80SAxel Dörfler * 516fdccb80SAxel Dörfler * Input parameter: 526fdccb80SAxel Dörfler * Enable : True/False to enable/disable debug message output. 536fdccb80SAxel Dörfler * 546fdccb80SAxel Dörfler * Remarks: 556fdccb80SAxel Dörfler * This flag/setting is a per application basis, and not a per-instance 566fdccb80SAxel Dörfler * occurrence as one would expect when instantiating an instance of 576fdccb80SAxel Dörfler * this class. This is by design as /everything/ is static. Caveat 586fdccb80SAxel Dörfler * Emptor. Needs to be dealt with in G.E. 596fdccb80SAxel Dörfler */ 606fdccb80SAxel Dörfler void BNetDebug::Enable( bool Enable ) 616fdccb80SAxel Dörfler { 626fdccb80SAxel Dörfler g_NetDebugEnabled = Enable; 636fdccb80SAxel Dörfler } 646fdccb80SAxel Dörfler 656fdccb80SAxel Dörfler 666fdccb80SAxel Dörfler /* IsEnabled 676fdccb80SAxel Dörfler *=--------------------------------------------------------------------------=* 686fdccb80SAxel Dörfler * Purpose: 696fdccb80SAxel Dörfler * Quiz the enable/disable status. 706fdccb80SAxel Dörfler * 716fdccb80SAxel Dörfler * Returns: 726fdccb80SAxel Dörfler * True/false if enabled/disabled. 736fdccb80SAxel Dörfler */ 746fdccb80SAxel Dörfler bool BNetDebug::IsEnabled( void ) 756fdccb80SAxel Dörfler { 766fdccb80SAxel Dörfler return g_NetDebugEnabled; 776fdccb80SAxel Dörfler } 786fdccb80SAxel Dörfler 796fdccb80SAxel Dörfler 806fdccb80SAxel Dörfler /* Print 816fdccb80SAxel Dörfler *=--------------------------------------------------------------------------=* 826fdccb80SAxel Dörfler * Purpose: 836fdccb80SAxel Dörfler * If enabled, spew forth a debug message. 846fdccb80SAxel Dörfler * 856fdccb80SAxel Dörfler * Input parameter: 866fdccb80SAxel Dörfler * msg : The message to print. 876fdccb80SAxel Dörfler * 886fdccb80SAxel Dörfler * Remarks: 896fdccb80SAxel Dörfler * * Basically a no-op if not enabled. 906fdccb80SAxel Dörfler * * We're inheriting R5 (and Nettle's) behavior, so... 916fdccb80SAxel Dörfler * * The output is always "debug: msg\n" Yes, kids, you read it right; 926fdccb80SAxel Dörfler * you get a newline whether you want it or not! 936fdccb80SAxel Dörfler * * If msg is empty, you get "debug: \n" 946fdccb80SAxel Dörfler * * Message is always printed on stderr. Redirect accordingly. 956fdccb80SAxel Dörfler */ 966fdccb80SAxel Dörfler void BNetDebug::Print( const char* msg ) 976fdccb80SAxel Dörfler { 986fdccb80SAxel Dörfler if ( !g_NetDebugEnabled ) 996fdccb80SAxel Dörfler return; 1006fdccb80SAxel Dörfler 1016fdccb80SAxel Dörfler if (msg == NULL) 1026fdccb80SAxel Dörfler msg = "(null)"; 1036fdccb80SAxel Dörfler 1046fdccb80SAxel Dörfler fprintf( stderr, "debug: %s\n", msg ); 1056fdccb80SAxel Dörfler } 1066fdccb80SAxel Dörfler 1076fdccb80SAxel Dörfler 1086fdccb80SAxel Dörfler /* Dump 1096fdccb80SAxel Dörfler *=--------------------------------------------------------------------------=* 1106fdccb80SAxel Dörfler * Purpose: 1116fdccb80SAxel Dörfler * If enabled, spew forth a combination hex/ASCII dump of raw data. 1126fdccb80SAxel Dörfler * 1136fdccb80SAxel Dörfler * Input parameters: 1146fdccb80SAxel Dörfler * data : Data to dump. 1156fdccb80SAxel Dörfler * size : How many bytes of data to dump. 1166fdccb80SAxel Dörfler * title : Title to display in message header. 1176fdccb80SAxel Dörfler * 1186fdccb80SAxel Dörfler * Remarks: 1196fdccb80SAxel Dörfler * * Basically a no-op if not enabled. 1206fdccb80SAxel Dörfler * * We're inheriting R5 (and Nettle's) behavior, so... 1216fdccb80SAxel Dörfler * * The output is always "debug: msg\n" Yes, kids, you read it right; 1226fdccb80SAxel Dörfler * you get a newline whether you want it or not! 1236fdccb80SAxel Dörfler * * If msg is empty, you get "debug: \n" 1246fdccb80SAxel Dörfler * * Behavior is undefined if data or title is NULL. This is a 1256fdccb80SAxel Dörfler * possible design flaw in Nettle/R5. 1266fdccb80SAxel Dörfler * * Do not expect an output like this: 1276fdccb80SAxel Dörfler * 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop 1286fdccb80SAxel Dörfler * 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop 1296fdccb80SAxel Dörfler * 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop 1306fdccb80SAxel Dörfler * 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop 1316fdccb80SAxel Dörfler * because you ain't gettin' it. You will get a complete hex dump, 1326fdccb80SAxel Dörfler * /followed/ by an ASCII dump. More Glass Elevator stuff. 1336fdccb80SAxel Dörfler * * Nettle dumps to stdOUT, the BeBook says all output goes to stdERR, so 1346fdccb80SAxel Dörfler * the author chose to... 1356fdccb80SAxel Dörfler * * always print to stdERR. Redirect accordingly. 1366fdccb80SAxel Dörfler * * stderr is flushed after the dump is complete to keep things 1376fdccb80SAxel Dörfler * reasonably cohesive in appearance. This might be an expensive 1386fdccb80SAxel Dörfler * operation so use judiciously. 1396fdccb80SAxel Dörfler */ 1406fdccb80SAxel Dörfler void BNetDebug::Dump(const char* data, size_t size, const char* title) 1416fdccb80SAxel Dörfler { 1426fdccb80SAxel Dörfler 1436fdccb80SAxel Dörfler if ( ! g_NetDebugEnabled) 1446fdccb80SAxel Dörfler return; 1456fdccb80SAxel Dörfler 1466fdccb80SAxel Dörfler fprintf( stderr, "----------\n%s\n(dumping %ld bytes)\n", 1476fdccb80SAxel Dörfler title ? title : "(untitled)", size ); 1486fdccb80SAxel Dörfler 1496fdccb80SAxel Dörfler if (! data) 1506fdccb80SAxel Dörfler fprintf(stderr, "NULL data!\n"); 1516fdccb80SAxel Dörfler else { 1526fdccb80SAxel Dörfler uint32 i,j; 1536fdccb80SAxel Dörfler char text[96]; // only 3*16 + 3 + 16 max by line needed 1546fdccb80SAxel Dörfler uint8 *byte = (uint8 *) data; 1556fdccb80SAxel Dörfler char *ptr; 1566fdccb80SAxel Dörfler 1576fdccb80SAxel Dörfler for ( i = 0; i < size; i += 16 ) { 1586fdccb80SAxel Dörfler ptr = text; 1596fdccb80SAxel Dörfler 1606fdccb80SAxel Dörfler for ( j = i; j < i + 16 ; j++ ) { 1616fdccb80SAxel Dörfler if ( j < size ) 1626fdccb80SAxel Dörfler sprintf(ptr, "%02x ", byte[j]); 1636fdccb80SAxel Dörfler else 1646fdccb80SAxel Dörfler sprintf(ptr, " "); 1656fdccb80SAxel Dörfler ptr += 3; 1666fdccb80SAxel Dörfler }; 1676fdccb80SAxel Dörfler 1686fdccb80SAxel Dörfler strcat(ptr, "| "); 1696fdccb80SAxel Dörfler ptr += 2; 1706fdccb80SAxel Dörfler 1716fdccb80SAxel Dörfler for (j = i; j < size && j < i + 16;j++) { 1726fdccb80SAxel Dörfler if ( byte[j] >= 0x20 && byte[j] < 0x7e ) 1736fdccb80SAxel Dörfler *ptr = byte[j]; 1746fdccb80SAxel Dörfler else 1756fdccb80SAxel Dörfler *ptr = '.'; 1766fdccb80SAxel Dörfler ptr++; 1776fdccb80SAxel Dörfler }; 1786fdccb80SAxel Dörfler 1796fdccb80SAxel Dörfler ptr[0] = '\n'; 1806fdccb80SAxel Dörfler ptr[1] = '\0'; 181*9a76b18fSColdfirex fputs(text, stderr); 1826fdccb80SAxel Dörfler }; 1836fdccb80SAxel Dörfler }; 184*9a76b18fSColdfirex fputs("----------\n", stderr); 1856fdccb80SAxel Dörfler fflush( stderr ); 1866fdccb80SAxel Dörfler } 1876fdccb80SAxel Dörfler 1886fdccb80SAxel Dörfler 1896fdccb80SAxel Dörfler /*=------------------------------------------------------------------- End -=*/ 190