python/samba/tests/krb5: Allow PkInitTests.test_pkinit_ntlm_from_pac_must_change_now...
[samba.git] / lib / util / dprintf.c
index c7c701bcfadfd1379f953f50b1bd04f0d4d3e8b9..9d1573f671f71f3928f79c2a5d73d6e3a851aa77 100644 (file)
   conversion
 */
 
-#include "includes.h"
+#include "replace.h"
 #include "system/locale.h"
-#include "param/param.h"
+#include "lib/util/samba_util.h"
 
-static smb_iconv_t display_cd = (smb_iconv_t)-1;
-
-void d_set_iconv(smb_iconv_t cd)
-{
-       if (display_cd != (smb_iconv_t)-1)
-               talloc_free(display_cd);
-
-       display_cd = cd;
-}
+static int d_vfprintf(FILE *f, const char *format, va_list ap)
+                     PRINTF_ATTRIBUTE(2,0);
 
 static int d_vfprintf(FILE *f, const char *format, va_list ap) 
 {
-       char *p, *p2;
-       int ret, clen;
-       va_list ap2;
-
-       /* If there's nothing to convert, take a shortcut */
-       if (display_cd == (smb_iconv_t)-1) {
-               return vfprintf(f, format, ap);
-       }
-
-       /* do any message translations */
-       va_copy(ap2, ap);
-       ret = vasprintf(&p, format, ap2);
-       va_end(ap2);
-
-       if (ret <= 0) return ret;
-
-       clen = iconv_talloc(NULL, display_cd, p, ret, (void **)&p2);
-        if (clen == -1) {
-               /* the string can't be converted - do the best we can,
-                  filling in non-printing chars with '?' */
-               int i;
-               for (i=0;i<ret;i++) {
-                       if (isprint(p[i]) || isspace(p[i])) {
-                               fwrite(p+i, 1, 1, f);
-                       } else {
-                               fwrite("?", 1, 1, f);
-                       }
-               }
-               SAFE_FREE(p);
-               return ret;
-        }
-
-       /* good, its converted OK */
-       SAFE_FREE(p);
-       ret = fwrite(p2, 1, clen, f);
-       talloc_free(p2);
-
-       return ret;
+       return vfprintf(f, format, ap);
 }
 
 
@@ -100,15 +56,25 @@ _PUBLIC_ int d_fprintf(FILE *f, const char *format, ...)
        return ret;
 }
 
-_PUBLIC_ int d_printf(const char *format, ...)
+static FILE *outfile;
+
+_PUBLIC_  int d_printf(const char *format, ...)
 {
        int ret;
-       va_list ap;
-
-       va_start(ap, format);
-       ret = d_vfprintf(stdout, format, ap);
-       va_end(ap);
-
-       return ret;
+       va_list ap;
+       
+       if (!outfile) outfile = stdout;
+       
+       va_start(ap, format);
+       ret = d_vfprintf(outfile, format, ap);
+       va_end(ap);
+       
+       return ret;
 }
 
+/* interactive programs need a way of tell d_*() to write to stderr instead
+   of stdout */
+void display_set_stderr(void)
+{
+       outfile = stderr;
+}