diff --git a/test/Makefile.am b/test/Makefile.am
index f9f21e4a2..76d23738a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -84,7 +84,8 @@ TESTS = \
ostep-strings.test \
ostep-comments.test \
ostep-invalid-types.test \
- xml_behavior.test
+ xml_behavior.test \
+ plistutil-streams.test
EXTRA_DIST = \
$(TESTS) \
@@ -136,7 +137,8 @@ EXTRA_DIST = \
data/o1.ostep \
data/o2.ostep \
data/o3.ostep \
- data/test.strings
+ data/test.strings \
+ data/streams.plist
TESTS_ENVIRONMENT = \
top_srcdir=$(top_srcdir) \
diff --git a/test/data/streams.plist b/test/data/streams.plist
new file mode 100644
index 000000000..b46a4af0d
--- /dev/null
+++ b/test/data/streams.plist
@@ -0,0 +1,5 @@
+
+
+
+DQoa
+
diff --git a/test/plistutil-streams.test b/test/plistutil-streams.test
new file mode 100755
index 000000000..ce3c516bf
--- /dev/null
+++ b/test/plistutil-streams.test
@@ -0,0 +1,34 @@
+## -*- sh -*-
+set -e
+
+DATASRC=$top_srcdir/test/data
+DATAOUT=$top_builddir/test/data
+PLISTUTIL=$top_builddir/tools/plistutil
+TESTFILE=$DATAOUT/plistutil-streams.test
+
+mkdir -p "$DATAOUT"
+
+# The data contains CR, LF and Ctrl-Z, which Windows text streams translate.
+"$PLISTUTIL" -i "$DATASRC/streams.plist" -f bin -o "$TESTFILE.bin"
+"$PLISTUTIL" -i "$TESTFILE.bin" -f xml -o "$TESTFILE.xml"
+
+echo "Checking binary stdout"
+"$PLISTUTIL" -i "$DATASRC/streams.plist" -f bin > "$TESTFILE.stdout.out"
+cmp "$TESTFILE.bin" "$TESTFILE.stdout.out"
+"$PLISTUTIL" -i "$DATASRC/streams.plist" -f bin -o - > "$TESTFILE.stdout.out"
+cmp "$TESTFILE.bin" "$TESTFILE.stdout.out"
+
+echo "Checking binary stdin"
+"$PLISTUTIL" -f xml -o "$TESTFILE.stdin.out" < "$TESTFILE.bin"
+cmp "$TESTFILE.xml" "$TESTFILE.stdin.out"
+cat "$TESTFILE.bin" | "$PLISTUTIL" -i - -f xml -o "$TESTFILE.stdin.out"
+cmp "$TESTFILE.xml" "$TESTFILE.stdin.out"
+
+echo "Checking binary stdin in print mode"
+"$PLISTUTIL" -p "$TESTFILE.bin" > "$TESTFILE.print.out"
+cat "$TESTFILE.bin" | "$PLISTUTIL" -p - > "$TESTFILE.stdin.out"
+cmp "$TESTFILE.print.out" "$TESTFILE.stdin.out"
+
+echo "Checking XML stdout"
+"$PLISTUTIL" -i "$TESTFILE.bin" -f xml > "$TESTFILE.stdout.out"
+cmp "$TESTFILE.xml" "$TESTFILE.stdout.out"
diff --git a/tools/plistutil.c b/tools/plistutil.c
index 37bb04442..70d557fae 100644
--- a/tools/plistutil.c
+++ b/tools/plistutil.c
@@ -33,6 +33,10 @@
#include
#include
#include
+#ifdef _WIN32
+#include
+#include
+#endif
#ifndef _MSC_VER
#include
#endif
@@ -263,6 +267,9 @@ int main(int argc, char *argv[])
if (!options->in_file || !strcmp(options->in_file, "-"))
{
+#ifdef _WIN32
+ _setmode(_fileno(stdin), _O_BINARY);
+#endif
read_size = 0;
plist_entire = malloc(sizeof(char) * read_capacity);
if(plist_entire == NULL)
@@ -472,8 +479,12 @@ int main(int argc, char *argv[])
fclose(oplist);
}
// if no output file specified, write to stdout
- else
+ else {
+#ifdef _WIN32
+ _setmode(_fileno(stdout), _O_BINARY);
+#endif
fwrite(plist_out, size, sizeof(char), stdout);
+ }
free(plist_out);
}