diff options
| author | 2026-09-08 01:12:20 +0400 | |
|---|---|---|
| committer | 2026-09-29 17:00:18 +0200 | |
| commit | fba74cf8bd9696b9b7f42a8cbb9e16dd065b0a83 (patch) | |
| tree | 89ebb7b5a8ca5dfaa2e0e57887ae846ac147712a | |
| parent | 2b0754dee5c5b9c4b3d5114359436e7b737a57f4 (diff) | |
| download | libplist-fba74cf8bd9696b9b7f42a8cbb9e16dd065b0a83.tar.gz libplist-fba74cf8bd9696b9b7f42a8cbb9e16dd065b0a83.tar.bz2 | |
plistutil: preserve binary data on Windows standard streams
| -rw-r--r-- | test/Makefile.am | 6 | ||||
| -rw-r--r-- | test/data/streams.plist | 5 | ||||
| -rwxr-xr-x | test/plistutil-streams.test | 34 | ||||
| -rw-r--r-- | tools/plistutil.c | 13 |
4 files changed, 55 insertions, 3 deletions
diff --git a/test/Makefile.am b/test/Makefile.am index f9f21e4..76d2373 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 0000000..b46a4af --- /dev/null +++ b/test/data/streams.plist @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<data>DQoa</data> +</plist> diff --git a/test/plistutil-streams.test b/test/plistutil-streams.test new file mode 100755 index 0000000..ce3c516 --- /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 e2ea286..8a341d0 100644 --- a/tools/plistutil.c +++ b/tools/plistutil.c @@ -33,6 +33,10 @@ #include <sys/stat.h> #include <getopt.h> #include <errno.h> +#ifdef _WIN32 +#include <fcntl.h> +#include <io.h> +#endif #ifndef _MSC_VER #include <unistd.h> #endif @@ -266,6 +270,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) @@ -475,8 +482,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); } |
