[ovs-dev] [PATCH v2] ovsdb-client: Set binary on FDs when doing backup/restore
Alin Gabriel Serdean
aserdean at ovn.org
Thu Mar 8 18:32:03 UTC 2018
Add some needed consitentcy 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 at ovn.org>
Signed-off-by: Alin Gabriel Serdean <aserdean at ovn.org>
---
ovsdb/ovsdb-client.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
index 222bd6ca8..3a0cb3d63 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>
@@ -1475,11 +1476,32 @@ print_and_free_log_record(struct json *record)
json_destroy(record);
}
+/* Wrapper to verify if the file descriptor `fd` refers to a terminal.
+ * On Windows also set binary mode on the file descriptor to avoid
+ * translation (i.e. CRLF line endings). */
+static bool
+check_and_set_stdout(int fd)
+{
+ if (isatty(fd)) {
+ return false;
+ }
+#ifdef _WIN32
+ if (fd == STDOUT_FILENO) {
+ fflush(stdout);
+ }
+ int result = _setmode(fd, O_BINARY);
+ if (result == -1) {
+ ovs_fatal(0, "could not _setmode O_BINARY on fd");
+ }
+#endif
+ return true;
+}
+
static void
do_backup(struct jsonrpc *rpc, const char *database,
int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
- if (isatty(STDOUT_FILENO)) {
+ if (!check_and_set_stdout(STDOUT_FILENO)) {
ovs_fatal(0, "not writing backup to a terminal; "
"please redirect stdout to a file");
}
@@ -1595,7 +1617,7 @@ static void
do_restore(struct jsonrpc *rpc, const char *database,
int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
- if (isatty(STDIN_FILENO)) {
+ if (!check_and_set_stdout(STDIN_FILENO)) {
ovs_fatal(0, "not reading backup from a terminal; "
"please redirect stdin from a file");
}
--
2.16.1.windows.1
More information about the dev
mailing list