From 57a3538555acc2523703b4afb8c2f88981d62f88 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Sat, 24 Jul 2010 13:33:03 +0000 Subject: [PATCH] Add new set_binary feature to estream --- common/ChangeLog | 4 ++++ common/estream.c | 33 +++++++++++++++++++++++++++++++++ common/estream.h | 4 ++++ dirmngr/ChangeLog | 5 +++++ dirmngr/dirmngr_ldap.c | 13 ++++++------- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/common/ChangeLog b/common/ChangeLog index 6c3c1f4d0..aa597f135 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -1,3 +1,7 @@ +2010-07-24 Werner Koch + + * estream.c (es_set_binary): New. + 2010-07-19 Werner Koch * utf8conv.c (utf8_to_wchar): s/malloc/jnlib_malloc/. diff --git a/common/estream.c b/common/estream.c index 3ab68b5ff..fcc2850b8 100644 --- a/common/estream.c +++ b/common/estream.c @@ -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) { diff --git a/common/estream.h b/common/estream.h index 6eb986fd6..8f45cce03 100644 --- a/common/estream.h +++ b/common/estream.h @@ -125,6 +125,7 @@ #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); diff --git a/dirmngr/ChangeLog b/dirmngr/ChangeLog index 8af2f3047..8e898685e 100644 --- a/dirmngr/ChangeLog +++ b/dirmngr/ChangeLog @@ -1,3 +1,8 @@ +2010-07-24 Werner Koch + + * dirmngr_ldap.c (main): Init common subsystems. Call + es_set_binary. + 2010-07-19 Werner Koch * dirmngr.c: Include ldap-wrapper.h. diff --git a/dirmngr/dirmngr_ldap.c b/dirmngr/dirmngr_ldap.c index fccbc58d1..3a90accde 100644 --- a/dirmngr/dirmngr_ldap.c +++ b/dirmngr/dirmngr_ldap.c @@ -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;