Add new set_binary feature to estream
authorWerner Koch <wk@gnupg.org>
Sat, 24 Jul 2010 13:33:03 +0000 (13:33 +0000)
committerWerner Koch <wk@gnupg.org>
Sat, 24 Jul 2010 13:33:03 +0000 (13:33 +0000)
common/ChangeLog
common/estream.c
common/estream.h
dirmngr/ChangeLog
dirmngr/dirmngr_ldap.c

index 6c3c1f4..aa597f1 100644 (file)
@@ -1,3 +1,7 @@
+2010-07-24  Werner Koch  <wk@g10code.com>
+
+       * estream.c (es_set_binary): New.
+
 2010-07-19  Werner Koch  <wk@g10code.com>
 
        * utf8conv.c (utf8_to_wchar): s/malloc/jnlib_malloc/.
index 3ab68b5..fcc2850 100644 (file)
@@ -3399,6 +3399,39 @@ es_setbuf (estream_t ES__RESTRICT stream, char *ES__RESTRICT buf)
   ESTREAM_UNLOCK (stream);
 }
 
+
+/* Put a stream into binary mode.  This is only needed for the
+   standard streams if they are to be used in a binary way.  On Unix
+   systems it is never needed but MSDOS based systems require such a
+   call.  It needs to be called before any I/O is done on STREAM.  */
+void
+es_set_binary (estream_t stream)
+{
+  ESTREAM_LOCK (stream);
+  if (!(stream->intern->modeflags & O_BINARY))
+    {
+      stream->intern->modeflags |= O_BINARY;
+#ifdef HAVE_DOSISH_SYSTEM
+      if (stream->intern->func_dest.func_read == es_func_fd_read)
+        {
+          estream_cookie_fd_t fd_cookie;
+
+          if (!IS_INVALID_FD (fd_cookie->fd))
+            setmode (fd, O_BINARY);
+        }
+      else if (stream->intern->func_dest.func_read == es_func_fp_read)
+        {
+          estream_cookie_fp_t fp_cookie;
+
+          if (fp_cookie->fd)
+            setmode (fileno (fp_cookie->fp), O_BINARY);
+        }
+#endif
+    }
+  ESTREAM_UNLOCK (stream);
+}
+
+
 void
 es_opaque_set (estream_t stream, void *opaque)
 {
index 6eb986f..8f45cce 100644 (file)
 #define es_vfprintf_unlocked  _ESTREAM_PREFIX(es_vfprint_unlocked)
 #define es_setvbuf            _ESTREAM_PREFIX(es_setvbuf)
 #define es_setbuf             _ESTREAM_PREFIX(es_setbuf)
+#define es_set_binary         _ESTREAM_PREFIX(es_set_binary)
 #define es_tmpfile            _ESTREAM_PREFIX(es_tmpfile)
 #define es_opaque_set         _ESTREAM_PREFIX(es_opaque_set)
 #define es_opaque_get         _ESTREAM_PREFIX(es_opaque_get)
@@ -355,6 +356,9 @@ int es_setvbuf (estream_t ES__RESTRICT stream,
                char *ES__RESTRICT buf, int mode, size_t size);
 void es_setbuf (estream_t ES__RESTRICT stream, char *ES__RESTRICT buf);
 
+void es_set_binary (estream_t stream);
+
+
 estream_t es_tmpfile (void);
 
 void es_opaque_set (estream_t ES__RESTRICT stream, void *ES__RESTRICT opaque);
index 8af2f30..8e89868 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-24  Werner Koch  <wk@g10code.com>
+
+       * dirmngr_ldap.c (main): Init common subsystems.  Call
+       es_set_binary.
+
 2010-07-19  Werner Koch  <wk@g10code.com>
 
        * dirmngr.c: Include ldap-wrapper.h.
index fccbc58..3a90acc 100644 (file)
@@ -171,18 +171,17 @@ main (int argc, char **argv )
   char *p;
   int only_search_timeout = 0;
 
-#ifdef HAVE_W32_SYSTEM
-  /* Yeah, right.  Sigh.  */
-#error  FIXME
-  _setmode (_fileno (stdout), _O_BINARY);
-#endif
-
   set_strusage (my_strusage);
   log_set_prefix ("dirmngr_ldap", JNLIB_LOG_WITH_PREFIX); 
   
-  /* Setup I18N. */
+  /* Setup I18N and common subsystems. */
   i18n_init();
 
+  init_common_subsystems (&argc, &argv);
+
+  es_set_binary (es_stdout);
+
+
   /* LDAP defaults */
   opt.timeout.tv_sec = DEFAULT_LDAP_TIMEOUT;
   opt.timeout.tv_usec = 0;