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 *=--------------------------------------------------------------------------=*
11*2ca13760SColdfirex * Copyright (c) 2002, The Haiku 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 */
Enable(bool Enable)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 */
IsEnabled(void)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 */
Print(const char * msg)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 */
Dump(const char * data,size_t size,const char * title)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';
1819a76b18fSColdfirex fputs(text, stderr);
1826fdccb80SAxel Dörfler };
1836fdccb80SAxel Dörfler };
1849a76b18fSColdfirex fputs("----------\n", stderr);
1856fdccb80SAxel Dörfler fflush( stderr );
1866fdccb80SAxel Dörfler }
1876fdccb80SAxel Dörfler
1886fdccb80SAxel Dörfler
1896fdccb80SAxel Dörfler /*=------------------------------------------------------------------- End -=*/
190