summaryrefslogtreecommitdiff
path: root/ovsdb/ovsdb-client.c
diff options
context:
space:
mode:
authorAlin Gabriel Serdean <aserdean@ovn.org>2018-03-12 15:17:42 +0200
committerAlin Gabriel Serdean <aserdean@ovn.org>2018-03-15 02:07:49 +0200
commitcb8cbbbe97b56401c399fa261b9670eb1698bf14 (patch)
tree26acbeb3ee85d59ad3b7dc6a964c1fca4418bb44 /ovsdb/ovsdb-client.c
parentefde188622aea5c2137e931f4a446c511676ba32 (diff)
downloadopenvswitch-cb8cbbbe97b56401c399fa261b9670eb1698bf14.tar.gz
ovsdb-client: Set binary mode when doing backup/restore
Add some needed consistency on Windows for STD_IN/OUT file descriptors when doing backup and restore. Reported-at:https://mail.openvswitch.org/pipermail/ovs-dev/2018-January/343518.html Suggested-by: Ben Pfaff <blp@ovn.org> Co-authored-by: Ben Pfaff <blp@ovn.org> Signed-off-by: Ben Pfaff <blp@ovn.org> Signed-off-by: Alin Gabriel Serdean <aserdean@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ovsdb/ovsdb-client.c')
-rw-r--r--ovsdb/ovsdb-client.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
index 222bd6ca8..3dfe543a3 100644
--- a/ovsdb/ovsdb-client.c
+++ b/ovsdb/ovsdb-client.c
@@ -18,6 +18,7 @@
#include <ctype.h>
#include <errno.h>
+#include <fcntl.h>
#include <getopt.h>
#include <limits.h>
#include <signal.h>
@@ -1476,6 +1477,20 @@ print_and_free_log_record(struct json *record)
}
static void
+set_binary_mode(FILE *stream OVS_UNUSED)
+{
+#ifdef _WIN32
+ fflush(stream);
+ /* On Windows set binary mode on the file descriptor to avoid
+ * translation (i.e. CRLF line endings). */
+ if (_setmode(_fileno(stream), O_BINARY) == -1) {
+ ovs_fatal(errno, "could not set binary mode on fd %d",
+ _fileno(stream));
+ }
+#endif
+}
+
+static void
do_backup(struct jsonrpc *rpc, const char *database,
int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
@@ -1483,6 +1498,7 @@ do_backup(struct jsonrpc *rpc, const char *database,
ovs_fatal(0, "not writing backup to a terminal; "
"please redirect stdout to a file");
}
+ set_binary_mode(stdout);
/* Get schema. */
struct ovsdb_schema *schema = fetch_schema(rpc, database);
@@ -1599,6 +1615,7 @@ do_restore(struct jsonrpc *rpc, const char *database,
ovs_fatal(0, "not reading backup from a terminal; "
"please redirect stdin from a file");
}
+ set_binary_mode(stdin);
struct ovsdb *backup;
check_ovsdb_error(ovsdb_file_open("/dev/stdin", true, &backup, NULL));