xref: /haiku/src/kits/network/libnetapi/NetDebug.cpp (revision 9a76b18fb638fcfd9c00c2ec49857815ddf6df8f)
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