summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--disasm/ndisasm.c4
-rw-r--r--include/nasmlib.h2
-rw-r--r--nasmlib/file.c5
-rw-r--r--nasmlib/file.h22
4 files changed, 32 insertions, 1 deletions
diff --git a/disasm/ndisasm.c b/disasm/ndisasm.c
index f3c23b00..01e0c557 100644
--- a/disasm/ndisasm.c
+++ b/disasm/ndisasm.c
@@ -280,8 +280,10 @@ int main(int argc, char **argv)
pname, filename, strerror(errno));
return 1;
}
- } else
+ } else {
+ nasm_set_binary_mode(stdin);
fp = stdin;
+ }
if (initskip > 0)
skip(initskip, fp);
diff --git a/include/nasmlib.h b/include/nasmlib.h
index 940f1cb7..c4b4ac4c 100644
--- a/include/nasmlib.h
+++ b/include/nasmlib.h
@@ -365,6 +365,8 @@ enum file_flags {
FILE *nasm_open_read(const char *filename, enum file_flags flags);
FILE *nasm_open_write(const char *filename, enum file_flags flags);
+void nasm_set_binary_mode(FILE *f);
+
/* Probe for existence of a file */
bool nasm_file_exists(const char *filename);
diff --git a/nasmlib/file.c b/nasmlib/file.c
index a8cd3057..62b854de 100644
--- a/nasmlib/file.c
+++ b/nasmlib/file.c
@@ -148,6 +148,11 @@ os_filename os_mangle_filename(const char *filename)
#endif
+void nasm_set_binary_mode(FILE *f)
+{
+ os_set_binary_mode(f);
+}
+
FILE *nasm_open_read(const char *filename, enum file_flags flags)
{
FILE *f = NULL;
diff --git a/nasmlib/file.h b/nasmlib/file.h
index 4f0420ec..fc8f893d 100644
--- a/nasmlib/file.h
+++ b/nasmlib/file.h
@@ -103,6 +103,24 @@ typedef struct _stati64 os_struct_stat;
# define os_stat _wstati64
# define os_fstat _fstati64
+/*
+ * On Win32/64, freopen() and _wfreopen() fails when the mode string
+ * is with the letter 'b' that represents to set binary mode. On
+ * POSIX operating systems, the 'b' is ignored, without failure.
+ */
+
+#include <io.h>
+#include <fcntl.h>
+
+static inline void os_set_binary_mode(FILE *f) {
+ int ret = _setmode(_fileno(f), _O_BINARY);
+
+ if (ret == -1) {
+ nasm_fatalf(ERR_NOFILE, "unable to open file: %s",
+ strerror(errno));
+ }
+}
+
#else /* not _WIN32 */
typedef const char *os_filename;
@@ -117,6 +135,10 @@ static inline void os_free_filename(os_filename filename)
(void)filename; /* Nothing to do */
}
+static inline void os_set_binary_mode(FILE *f) {
+ (void)f;
+}
+
# define os_fopen fopen
#if defined(HAVE_FACCESSAT) && defined(AT_EACCESS)