1 /* $NetBSD: bprint.c,v 1.1.1.2 2010/03/08 02:14:20 lukem Exp $ */ 2 3 /* OpenLDAP: pkg/ldap/libraries/liblber/bprint.c,v 1.57.2.5 2009/08/02 21:06:33 quanah Exp */ 4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 5 * 6 * Copyright 1998-2009 The OpenLDAP Foundation. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted only as authorized by the OpenLDAP 11 * Public License. 12 * 13 * A copy of this license is available in the file LICENSE in the 14 * top-level directory of the distribution or, alternatively, at 15 * <http://www.OpenLDAP.org/license.html>. 16 */ 17 /* 18 * Copyright (c) 1991 Regents of the University of Michigan. 19 * All rights reserved. 20 * 21 * Redistribution and use in source and binary forms are permitted 22 * provided that this notice is preserved and that due credit is given 23 * to the University of Michigan at Ann Arbor. The name of the University 24 * may not be used to endorse or promote products derived from this 25 * software without specific prior written permission. This software 26 * is provided ``as is'' without express or implied warranty. 27 */ 28 /* ACKNOWLEDGEMENTS: 29 * This work was originally developed by the University of Michigan 30 * (as part of U-MICH LDAP). 31 */ 32 33 #include "portable.h" 34 35 #include <stdio.h> 36 37 #include <ac/ctype.h> 38 #include <ac/stdarg.h> 39 #include <ac/string.h> 40 41 #include "lber-int.h" 42 43 #define ber_log_check(errlvl, loglvl) ((errlvl) & (loglvl)) 44 45 BER_LOG_FN ber_int_log_proc = NULL; 46 47 /* 48 * We don't just set ber_pvt_err_file to stderr here, because in NT, 49 * stderr is a symbol imported from a DLL. As such, the compiler 50 * doesn't recognize the symbol as having a constant address. Thus 51 * we set ber_pvt_err_file to stderr later, when it first gets 52 * referenced. 53 */ 54 FILE *ber_pvt_err_file = NULL; 55 56 /* 57 * ber errno 58 */ 59 BER_ERRNO_FN ber_int_errno_fn = NULL; 60 61 int * ber_errno_addr(void) 62 { 63 static int ber_int_errno = LBER_ERROR_NONE; 64 65 if( ber_int_errno_fn ) { 66 return (*ber_int_errno_fn)(); 67 } 68 69 return &ber_int_errno; 70 } 71 72 /* 73 * Print stuff 74 */ 75 void ber_error_print( LDAP_CONST char *data ) 76 { 77 assert( data != NULL ); 78 79 if (!ber_pvt_err_file) ber_pvt_err_file = stderr; 80 81 fputs( data, ber_pvt_err_file ); 82 83 /* Print to both streams */ 84 if (ber_pvt_err_file != stderr) { 85 fputs( data, stderr ); 86 fflush( stderr ); 87 } 88 89 fflush( ber_pvt_err_file ); 90 } 91 92 BER_LOG_PRINT_FN ber_pvt_log_print = ber_error_print; 93 94 /* 95 * lber log 96 */ 97 98 int ber_pvt_log_output( 99 const char *subsystem, 100 int level, 101 const char *fmt, 102 ... ) 103 { 104 char buf[1024]; 105 va_list vl; 106 va_start( vl, fmt ); 107 108 if ( ber_int_log_proc != NULL ) { 109 ber_int_log_proc( ber_pvt_err_file, subsystem, level, fmt, vl ); 110 111 } else { 112 int level; 113 ber_get_option( NULL, LBER_OPT_BER_DEBUG, &level ); 114 buf[sizeof(buf) - 1] = '\0'; 115 vsnprintf( buf, sizeof(buf)-1, fmt, vl ); 116 if ( ber_log_check( LDAP_DEBUG_BER, level ) ) { 117 (*ber_pvt_log_print)( buf ); 118 } 119 } 120 121 va_end(vl); 122 return 1; 123 } 124 125 int ber_pvt_log_printf( int errlvl, int loglvl, const char *fmt, ... ) 126 { 127 char buf[1024]; 128 va_list ap; 129 130 assert( fmt != NULL ); 131 132 if ( !ber_log_check( errlvl, loglvl )) { 133 return 0; 134 } 135 136 va_start( ap, fmt ); 137 138 buf[sizeof(buf) - 1] = '\0'; 139 vsnprintf( buf, sizeof(buf)-1, fmt, ap ); 140 141 va_end(ap); 142 143 (*ber_pvt_log_print)( buf ); 144 return 1; 145 } 146 147 #if 0 148 static int ber_log_puts(int errlvl, int loglvl, char *buf) 149 { 150 assert( buf != NULL ); 151 152 if ( !ber_log_check( errlvl, loglvl )) { 153 return 0; 154 } 155 156 (*ber_pvt_log_print)( buf ); 157 return 1; 158 } 159 #endif 160 161 /* 162 * Print arbitrary stuff, for debugging. 163 */ 164 165 int 166 ber_log_bprint(int errlvl, 167 int loglvl, 168 const char *data, 169 ber_len_t len ) 170 { 171 assert( data != NULL ); 172 173 if ( !ber_log_check( errlvl, loglvl )) { 174 return 0; 175 } 176 177 ber_bprint(data, len); 178 return 1; 179 } 180 181 void 182 ber_bprint( 183 LDAP_CONST char *data, 184 ber_len_t len ) 185 { 186 static const char hexdig[] = "0123456789abcdef"; 187 #define BP_OFFSET 9 188 #define BP_GRAPH 60 189 #define BP_LEN 80 190 char line[BP_LEN]; 191 ber_len_t i; 192 193 assert( data != NULL ); 194 195 /* in case len is zero */ 196 line[0] = '\n'; 197 line[1] = '\0'; 198 199 for ( i = 0 ; i < len ; i++ ) { 200 int n = i % 16; 201 unsigned off; 202 203 if( !n ) { 204 if( i ) (*ber_pvt_log_print)( line ); 205 memset( line, ' ', sizeof(line)-2 ); 206 line[sizeof(line)-2] = '\n'; 207 line[sizeof(line)-1] = '\0'; 208 209 off = i % 0x0ffffU; 210 211 line[2] = hexdig[0x0f & (off >> 12)]; 212 line[3] = hexdig[0x0f & (off >> 8)]; 213 line[4] = hexdig[0x0f & (off >> 4)]; 214 line[5] = hexdig[0x0f & off]; 215 line[6] = ':'; 216 } 217 218 off = BP_OFFSET + n*3 + ((n >= 8)?1:0); 219 line[off] = hexdig[0x0f & ( data[i] >> 4 )]; 220 line[off+1] = hexdig[0x0f & data[i]]; 221 222 off = BP_GRAPH + n + ((n >= 8)?1:0); 223 224 if ( isprint( (unsigned char) data[i] )) { 225 line[BP_GRAPH + n] = data[i]; 226 } else { 227 line[BP_GRAPH + n] = '.'; 228 } 229 } 230 231 (*ber_pvt_log_print)( line ); 232 } 233 234 235 int 236 ber_log_dump( 237 int errlvl, 238 int loglvl, 239 BerElement *ber, 240 int inout ) 241 { 242 assert( ber != NULL ); 243 assert( LBER_VALID( ber ) ); 244 245 if ( !ber_log_check( errlvl, loglvl )) { 246 return 0; 247 } 248 249 ber_dump(ber, inout); 250 return 1; 251 } 252 253 void 254 ber_dump( 255 BerElement *ber, 256 int inout ) 257 { 258 char buf[132]; 259 ber_len_t len; 260 261 assert( ber != NULL ); 262 assert( LBER_VALID( ber ) ); 263 264 if ( inout == 1 ) { 265 len = ber_pvt_ber_remaining(ber); 266 } else { 267 len = ber_pvt_ber_write(ber); 268 } 269 270 sprintf( buf, "ber_dump: buf=%p ptr=%p end=%p len=%ld\n", 271 ber->ber_buf, 272 ber->ber_ptr, 273 ber->ber_end, 274 (long) len ); 275 276 (void) (*ber_pvt_log_print)( buf ); 277 278 ber_bprint( ber->ber_ptr, len ); 279 } 280 281 typedef struct seqorset Seqorset; 282 283 /* Exists for binary compatibility with OpenLDAP 2.4.17-- */ 284 int 285 ber_log_sos_dump( 286 int errlvl, 287 int loglvl, 288 Seqorset *sos ) 289 { 290 return 0; 291 } 292 293 /* Exists for binary compatibility with OpenLDAP 2.4.17-- */ 294 void 295 ber_sos_dump( 296 Seqorset *sos ) 297 { 298 } 299