xref: /haiku/src/kits/network/libnetapi/NetDebug.cpp (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*=--------------------------------------------------------------------------=*
2  * NetDebug.cpp -- Implementation of the BNetDebug class.
3  *
4  * Written by S.T. Mansfield (thephantom@mac.com)
5  *
6  * Remarks:
7  *   * Although this would more properly be implemented as a namespace...
8  *   * Do not burn the candle at both ends as it leads to the life of a
9  *     hairdresser.
10  *=--------------------------------------------------------------------------=*
11  * Copyright (c) 2002, The OpenBeOS project.
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a
14  * copy of this software and associated documentation files (the "Software"),
15  * to deal in the Software without restriction, including without limitation
16  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17  * and/or sell copies of the Software, and to permit persons to whom the
18  * Software is furnished to do so, subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included in
21  * all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29  * DEALINGS IN THE SOFTWARE.
30  *=--------------------------------------------------------------------------=*
31  */
32 
33 
34 #include <ctype.h>
35 #include <stdio.h>
36 #include <string.h>
37 
38 #include <NetDebug.h>
39 #include <SupportDefs.h>
40 
41 
42 // Off by default cuz the BeBook sez so.
43 static bool g_NetDebugEnabled = false;
44 
45 
46 /* Enable
47  *=--------------------------------------------------------------------------=*
48  * Purpose:
49  *     Enable/disable debug message capability for your app.
50  *
51  * Input parameter:
52  *     Enable       : True/False to enable/disable debug message output.
53  *
54  * Remarks:
55  *     This flag/setting is a per application basis, and not a per-instance
56  *     occurrence as one would expect when instantiating an instance of
57  *     this class.  This is by design as /everything/ is static.  Caveat
58  *     Emptor.  Needs to be dealt with in G.E.
59  */
60 void BNetDebug::Enable( bool Enable )
61 {
62     g_NetDebugEnabled = Enable;
63 }
64 
65 
66 /* IsEnabled
67  *=--------------------------------------------------------------------------=*
68  * Purpose:
69  *     Quiz the enable/disable status.
70  *
71  * Returns:
72  *     True/false if enabled/disabled.
73  */
74 bool BNetDebug::IsEnabled( void )
75 {
76     return g_NetDebugEnabled;
77 }
78 
79 
80 /* Print
81  *=--------------------------------------------------------------------------=*
82  * Purpose:
83  *     If enabled, spew forth a debug message.
84  *
85  * Input parameter:
86  *     msg          : The message to print.
87  *
88  * Remarks:
89  *     * Basically a no-op if not enabled.
90  *     * We're inheriting R5 (and Nettle's) behavior, so...
91  *       * The output is always "debug: msg\n"  Yes, kids, you read it right;
92  *         you get a newline whether you want it or not!
93  *       * If msg is empty, you get "debug: \n"
94  *       * Message is always printed on stderr.  Redirect accordingly.
95  */
96 void BNetDebug::Print( const char* msg )
97 {
98 	if ( !g_NetDebugEnabled )
99     	return;
100 
101 	if (msg == NULL)
102 		msg = "(null)";
103 
104 	fprintf( stderr, "debug: %s\n", msg );
105 }
106 
107 
108 /* Dump
109  *=--------------------------------------------------------------------------=*
110  * Purpose:
111  *     If enabled, spew forth a combination hex/ASCII dump of raw data.
112  *
113  * Input parameters:
114  *     data         : Data to dump.
115  *     size         : How many bytes of data to dump.
116  *     title        : Title to display in message header.
117  *
118  * Remarks:
119  *     * Basically a no-op if not enabled.
120  *     * We're inheriting R5 (and Nettle's) behavior, so...
121  *       * The output is always "debug: msg\n"  Yes, kids, you read it right;
122  *         you get a newline whether you want it or not!
123  *       * If msg is empty, you get "debug: \n"
124  *       * Behavior is undefined if data or title is NULL.  This is a
125  *         possible design flaw in Nettle/R5.
126  *       * Do not expect an output like this:
127  *          00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop
128  *          00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop
129  *          00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop
130  *          00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | abcdefghijklmnop
131  *         because you ain't gettin' it.  You will get a complete hex dump,
132  *         /followed/ by an ASCII dump.  More Glass Elevator stuff.
133  *     * Nettle dumps to stdOUT, the BeBook says all output goes to stdERR, so
134  *       the author chose to...
135  *     * always print to stdERR.  Redirect accordingly.
136  *     * stderr is flushed after the dump is complete to keep things
137  *       reasonably cohesive in appearance.  This might be an expensive
138  *       operation so use judiciously.
139  */
140 void BNetDebug::Dump(const char* data, size_t size, const char* title)
141 {
142 
143     if ( ! g_NetDebugEnabled)
144         return;
145 
146     fprintf( stderr, "----------\n%s\n(dumping %ld bytes)\n",
147     	title ? title : "(untitled)", size );
148 
149     if (! data)
150     	fprintf(stderr, "NULL data!\n");
151     else {
152 		uint32	i,j;
153 	  	char text[96];	// only 3*16 + 3 + 16 max by line needed
154 		uint8 *byte = (uint8 *) data;
155 		char *ptr;
156 
157 		for ( i = 0; i < size; i += 16 )	{
158 			ptr = text;
159 
160 	      	for ( j = i; j < i + 16 ; j++ ) {
161 				if ( j < size )
162 					sprintf(ptr, "%02x ", byte[j]);
163 				else
164 					sprintf(ptr, "   ");
165 				ptr += 3;
166 			};
167 
168 			strcat(ptr, "| ");
169 			ptr += 2;
170 
171 			for (j = i; j < size && j < i + 16;j++) {
172 				if ( byte[j] >= 0x20 && byte[j] < 0x7e )
173 					*ptr = byte[j];
174 				else
175 					*ptr = '.';
176 				ptr++;
177 			};
178 
179 			ptr[0] = '\n';
180 			ptr[1] = '\0';
181 			fputs(text, stderr);
182 		};
183 	};
184     fputs("----------\n", stderr);
185     fflush( stderr );
186 }
187 
188 
189 /*=------------------------------------------------------------------- End -=*/
190