+/*
+ * Print stuff
+ */
+static void
+ber_error_print( char *data )
+{
+ assert( data != NULL );
+
+ fputs( data, stderr );
+ fflush( stderr );
+}
+
+BER_LOG_PRINT_FN ber_pvt_log_print = ber_error_print;
+
+/*
+ * lber log
+ */
+
+static int ber_log_check( int errlvl, int loglvl )
+{
+ return errlvl & loglvl ? 1 : 0;
+}
+
+int ber_pvt_log_printf
+#ifdef HAVE_STDARG
+ (int errlvl, int loglvl, const char *fmt, ...)
+#else
+ ( va_alist )
+va_dcl
+#endif
+{
+ char buf[ 1024 ];
+ va_list ap;
+
+#ifdef HAVE_STDARG
+ va_start( ap, fmt );
+#else
+ int errlvl, loglvl;
+ char *fmt;
+
+ va_start( ap );
+
+ errlvl = va_arg( ap, int );
+ loglvl = va_arg( ap, int );
+ fmt = va_arg( ap, char * );
+#endif
+
+ assert( fmt != NULL );
+
+ if ( !ber_log_check( errlvl, loglvl )) {
+ return 0;
+ }
+
+#ifdef HAVE_VSNPRINTF
+ buf[sizeof(buf) - 1] = '\0';
+ vsnprintf( buf, sizeof(buf)-1, fmt, ap );
+#elif HAVE_VSPRINTF
+ vsprintf( buf, fmt, ap ); /* hope it's not too long */
+#else
+ /* use doprnt() */
+#error "vsprintf() required."
+#endif
+
+ va_end(ap);
+
+ (*ber_pvt_log_print)( buf );
+ return 1;
+}
+
+static int ber_log_puts(int errlvl, int loglvl, char *buf)
+{
+ assert( buf != NULL );
+
+ if ( !ber_log_check( errlvl, loglvl )) {
+ return 0;
+ }
+
+ (*ber_pvt_log_print)( buf );
+ return 1;
+}
+